Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Repo info
Activity
  • Apr 25 07:10
    emilfolino commented #12
  • Apr 09 08:41
    AndreasArne commented #12
  • Mar 28 13:03
    AndreasArne commented #12
  • Mar 28 10:13
    AndreasArne commented #12
  • Mar 28 08:20
    AndreasArne commented #12
  • Mar 28 08:18
    AndreasArne commented #12
  • Mar 27 08:38
    AndreasArne commented #12
  • Mar 26 14:31
    AndreasArne commented #12
  • Mar 26 10:16
    AndreasArne commented #12
  • Mar 18 10:24
    AndreasArne commented #12
  • Mar 18 10:03
    AndreasArne commented #12
  • Mar 13 10:21
    AndreasArne commented #12
  • Mar 11 14:55
    AndreasArne commented #12
  • Mar 11 08:34
    AndreasArne closed #6
  • Mar 11 08:34
    AndreasArne commented #6
  • Mar 11 08:34
    AndreasArne commented #8
  • Mar 11 08:31
    AndreasArne closed #7
  • Mar 11 08:31
    AndreasArne commented #7
  • Mar 11 08:30
    AndreasArne closed #5
  • Mar 11 08:30
    AndreasArne closed #4
ingolager
@ingolager
Nu fick jag remove() att funka igen. Men det är genom att låta get() returnera node i stället för node.value, och då failar get() i test.py. Det var lite lurigt det här.
Deel18
@Deel18
Tjena, sitter och fixar unittests for custom exceptions i Kmom04. Är det menat att när man kastar en exception i koden att den ska avbryta hela loopen eller ska programmet bara ge ett fel meddelande och köra på?
För jag satte upp det så att den exempelvis bara skrev ut "Index out of bounds" och sen kör loopen på. Problemet är då att när jag försöker testa assertRaises så säger den att exception inte blev raised
ingolager
@ingolager
@Deel18 Hur menar du? Var har du lagt dina raise och except?
Jag låter loopen gå på. Det är väl en av poängerna att programmet inte stängs ner bara för att man råkar skriva fel?
Deel18
@Deel18
try:
      if self.head is not None:
                new_node = Node(data)
                current_node = self.head
                counter = 0
                while current_node.next is not None and counter < index:
                    current_node = current_node.next
                    counter += 1
                if counter == index:
                    new_node.next = current_node.next
                    current_node.next = new_node
                else:
                    raise ThrowIndexError
            else:
                raise ThrowIndexError
except ThrowIndexError:
            print("Index out of bounds")
indent blev lite fel haha
@ingolager Jo det jag tänkte också. Men när jag ska testa denna så säger unittestet att ThrowIndexError not raised
Däremot när jag gör om det så att hela loopen avbryts och det kraschar så funkar unittestet
Okej, tror jag kommit på felet. Ska testa och återkommer :P
ingolager
@ingolager
@Deel18 Prova att flytta try/except över till main.py, till respektive menyalternativ. Ha kvar raise-delen där den ligger nu.
Så bra, återkom annars.
Har för mig att Andreas skrev att man skulle göra så, så som jag skriver.
Deel18
@Deel18
Yes verkar funka för en. Ska testa resten nu. Tack för hjälp!
ingolager
@ingolager
Finemang
ingolager
@ingolager
Kmom06 remove. Har fått remove() att fungera utom i ett specialfall, som gör att den failar i testen. För att det ska faila krävs att samtliga följande krav är uppfyllda, exakt som jag skriver.
  1. Målnoden har två barn.
  2. Målnodens högerbarn har ett högerbarn men inget vänsterbarn.
  3. remove() måste anropas två gånger i följd. Det första anropet tar bort målnodens högerbarn, varpå dess högerbarn blir successor. Det andra anropet tar bort målnoden, varpå successorn tar ytterligare ett steg upp till vänster och ersätter målnoden.
    Alla borttagningar funkar som det ska. Kruxet är att det också skapas en kopia av successorn. Var i trädet denna kopia hamnar har jag inte lyckats utröna. Hur förhindrar jag att denna kopia skapas. Denna kopia skapas alltså ENBART om samtliga tre krav är uppfyllda.
ingolager
@ingolager
bild.png
Låter det krångligt? Här är en bild på vad jag menar. Jag tar först bort 4 och sedan 3. Successor är 5 i båda fallen. Det skapas också en kopia av 5. Om 5 inte är där från början och jag tar bort 3, då är 4 successor, allt blir rätt och ingen kopia av 4 skapas.
Nämnas bör också att 5 måste vara ett högerbarn för att det ska skapas en kopia.
Här är den kod som är in action då detta sker:
elif node.has_both_children():
            successor = BinarySearchTree._search_successor(node.right)
            node.key = successor.key
            node.value = successor.value
            if successor.is_left_child():
                successor.parent.left = successor.right
            else:
                successor.parent.right = successor.right
ingolager
@ingolager
Ovan är ju det som tar bort 3. När jag tar bort 4 som bara har högerbarn är det denna kod
elif node.has_right_child():
            if node.has_parent():
                if node.is_left_child():
                    node.parent.left = node.right
                else:
                    node.parent.right = node.right
            else:
                self.root = node.left
ingolager
@ingolager

Och som sagt, remove() funkar i alla kombinationer jag har testat på trädet i ovanstående bild utom just

bst.remove(4)
bst.remove(3)

i den ordningen efter varandra. Någon som har ett förslag?

ingolager
@ingolager
När jag skriver ut alla node-objekt på listan ser jag att den ena after-remove 5 har samma minnesplats som before-remove 3. Den andra after-remove 5 har samma minnesplats som before-remove 5. Det tyder väl på att 5 blir kvar på sin ursprungliga plats och ersätter 3 på samma gång?
ingolager
@ingolager
Finns det något sätt att få bort den ena femman? Om jag sätter successor till None blir den None i utskriften, men printar jag trädet är det fortfarande två femmor kvar, och på samma minnesplatser, även den som var None är kvar på samma minnesplats och med samma key/value som tidigare.
Gunvor Nilsson
@guni12
Kanske inte så många som är aktiva i chatten nu på sommaren. Jag kommer inte att gå så djupt in i din kod heller, men jag funderade på en sak: om noden är ett vänster-barn så blir nodens vänstra förälder en höger förälder?
Jag minns att jag satt jättemycket med papper och penna och ritade som du också gjort. Och höll reda på vilken nyckel och vilket värde.
Gunvor Nilsson
@guni12
Jag gjorde en stor mängd utskrifter så att jag kunde se vad som hände i varje steg och jämföra med mitt papper, min teckning.
ingolager
@ingolager
Jag har prints överallt :) Men tog bort dem i koden ovan. Noden 4 har högerbarn, har förälder och är högerbarn. Kör jag remove(4) gäller node.parent.right (4) = node.right(5). Det blir sen i nästa steg när nod 3 med två barn ska bort det hakar upp sig. 5 är successor, och ersätter 3. Men 5 blir också kvar på sin gamla plats. Det lustiga är att om jag inte kör insert på 5, och gör remove på 3 direkt (som ersätts av 4) så verkar det fungera. Det man skulle önska är att man kan se en utskrift av trädet varje gång man gör något, även om listan ser rätt ut vet man inte om trädet är riktigt.Jag tror inte att if-satsen du kommenterade nånsin kan användas i detta träd ser jag, det finns inget högerbarn med endast vänsterbarn. Ska prova. Jag vet att utsikterna att få svar är små nu i juli, men du svarade ju @guni12 :)
Inget vänsterbarn med endast högerbarn menade jag. Snurrigt värre det här :)
ingolager
@ingolager
Men det fungerade. node.parent.left pekar väl på sig själv om man är vänsterbarn, inte på en vänsterförälder, nån sån finns väl inte?
ingolager
@ingolager
Jag ger upp. Jag har suttit 12 timmar med detta specialfall utan att ha kommit en centimeter längre.
Gunvor Nilsson
@guni12
Jag känner med dig. Håller själv på att söka jobb och håller på att lära mig en massa ramverk plus C# och Visual Studio. Det blir ofta tjockt i hjärnan.
Men genom att fortsätta försöka brukar det ge sig till slut.
Jag gjorde lite annorlunda än du, så är det ju tänkt, att det finns många rätta svar.
Jag minns att jag missade att hålla reda på root-noden ganska länge och det gav mig konsekvenser.
Gunvor Nilsson
@guni12
Men det blir ju en kedja av hur man byggt själva nod-klassen. Vilka svar man kan få från den om "vem" man är. Och vad man därmed kan printa ut.
ingolager
@ingolager
Ja, alla printar som jag gör från remove-metoden är de förväntade, och allt jag vill radera raderas. När jag kör 3,4-removen har 5 efter att jag raderat 3 inte något högerbarn, sen när jag raderat 4 har den plötsligt högerbarn fast den inte borde ha det. Jag raderar då högerbarnet och noden blir None. Sen när jag printar ut listan så är det en femma på samma minnesplats som den nod jag just raderade. Det finns då alltså två femmor med samma key/value men med referens till olika minnesplatser, varav den ena går till den som 3 hade och den andra till den som den gamla 5 hade. Det är möjligt att det har med Node-klassen att göra, jag har inte ägnat den så mycket uppmärksamhet, men jag vet inte vad kan göra mer faktiskt.
ingolager
@ingolager

Herregud! Jag tror inte mina ögon:

Ran 6 tests in 0.003s

OK

Allt som saknades hela tiden var

else:
                if successor.is_leaf():
                    successor = None
Gunvor Nilsson
@guni12
Grattis! Alltså - aldrig ge upp. Till slut ser man det. :-)
ingolager
@ingolager
Tydligen gör man det 😀
ingolager
@ingolager

Jag försöker validera och lämna in, men det går inte så bra just nu, jag får bara felmeddelanden.

find: ‘me’: No such file or directory
FAILED Directory 'dbwebb-kurser/oopython/me/kmom10' is not a valid directory.

När jag försöker öppna min befintliga me-flask-sida på studentservern möts jag av Internal Server Error. Felen verkar bara uppstå här på oopython, när jag testar att validera oophp och webapp-grejer så funkar det.

daBack
@daBack
Jag tror att du kan ha lyckats ta bort mapp sturkturen på servern?
Testa köra dbwebb init
ingolager
@ingolager
Ingvar@LAPTOP-8T96T9CK ~/dbwebb-kurser/oopython
$ dbwebb init
FAILED Could not find file '.dbwebb.course', this is not a valid course repo.
This command must be executed within a valid course repo.
Jag kan öppna flask-applikationerna vid gjorde i kmom01 och 02.
daBack
@daBack
testa döpa om mappen oopython till ex "oopython-old". Sen kör du en ny dbwebb clone oopython. Efter de så kopierar du över innehåller i old till den nya.
Kika på denna :) Mos förklarar ganska bra: https://dbwebb.se/forum/viewtopic.php?f=23&t=4676
ingolager
@ingolager
@daBack Ja det funkade på så sätt att jag nu kunde göra en dbwebb publish me, och då validerades och publicerades allt, och alla mina flask-applikationer fungerar igen. Däremot går det inte att köra dbwebb validate på något alls och inte dbwebb publish på något annat än hela me-mappen. Men alla kmom ska ju validera vid inlämning av projektet står det i specen, så jag får väl köra så här. Tack för hjälpen!
daBack
@daBack
hmm, tror det är något med dbwebb init som strular fortfarande, men då fungerar det ju tillfälligt iaf även om det är lite omständigt :) Kör hårt! @ingolager
ingolager
@ingolager
@daBack Det gick bra. Allt är inlämnat nu 😊