https://niels.nu
https://github.com/Cranza.../2021/day8/python/day8.py
Code is verre van modulair en behoeft een goede cleanup, ware het niet dat ik daar geen tijd voor over heb.
| Overlap met | 1 | 4 | 7 | 8 (=len(signal)) | som | 
| 0 | 2 | 3 | 3 | 6 | 14 | 
| 2 | 1 | 2 | 2 | 5 | 10 | 
| 3 | 2 | 3 | 3 | 5 | 13 | 
| 5 | 1 | 3 | 2 | 5 | 11 | 
| 6 | 1 | 3 | 2 | 6 | 12 | 
| 9 | 2 | 4 | 3 | 6 | 15 | 
Het eerste wat ik doe is dus een dictionary "digitMap" aanmaken met daarin de characters van 1, 4, 7, 8. Vervolgens hoef ik alleen maar een enkel getal te bepalen waarmee ik elk missende getal kan identificeren.
Eerste versie Dag 8 in Python
Na wat iteraties en de gedachte dat deel 1 best in 1 regel kan is het dit geworden.
Dag 8 in Python
Daarvoor is het een voor een identificeren welk streepje welke letter is, ondertussen kan je alvast wat nummers identificeren. Uiteindelijk hield ik met mijn proces 6, 3 en 5 over, daar de key overheen gelegd en ik had mn set van welk nummer welke letters bevat. Vervolgens is het een simpele kwestie van de output checken adhv de set van nummers.
Oplossing is waarschijnlijk erg omslachtig, maar laat m.i. wel netjes alle deductie stappen zien
[ Voor 5% gewijzigd door FrankMennink op 08-12-2021 14:51 ]
Deze vond ik inderdaad ook pittig. Ik had wel een hint nodig om de goede oplossingsrichting in te slaan, eerlijk is eerlijk, maar toen was het nog lastig.DevWouter schreef op woensdag 8 december 2021 @ 12:09:
(dag 9)
spoiler:Maar ik had ook niet in de gaten dat de input alle mogelijke waardes bevatten in een willekeurige volgorde. Dus ik was bezig om elke segment te bepalen ook in de situatie wanneer een bepaalde numeriek representatie afwezig was.
Dag 8b in Progress 4GL:
https://github.com/patric...ter/2021/Day-08/day-08b.p
... en gaat over tot de orde van de dag
1 4 7 8 zijn makkelijk
9 bepaald door 4 over alles met 6 segmenten ( 0 6 en 9) te xor’en degen die 2 segmenten overhoudt is de 9
3 bepaald met 1 door te xor’en met alles met 5 segmenten.
Enzovoort
Misschien zijn de regels generiek te maken weet niet of ik daar de moed voor heb.
Leuke opdracht!
// 0 = abcefg -> length = 6
// 1 = cf -> length = 2
// 2 = acdeg -> length = 5
// 3 = acdfg -> length = 5
// 4 = bcdf -> length = 4
// 5 = abdfg -> length = 5
// 6 = abdefg -> length = 6
// 7 = acf -> length = 3
// 8 = abcdefg -> length = 7
// 9 = abcdfg -> length = 6
// occurance in number
// a = 0; 2; 3; 5; 6; 7; 8; 9 -> 8x
// b = 0; 4; 5; 6; 8; 9 -> 6x
// c = 0; 1; 2; 3; 4; 7; 8; 9 -> 8x
// d = 2; 3; 4; 5; 6; 8; 9 -> 7x
// e = 0; 2; 6; 8 -> 4x
// f = 0; 1; 3; 4; 5; 6; 7; 8; 9-> 9x
// g = 0; 2; 3; 5; 6; 8; 9 -> 7x
// a = 7 - 1
// b,e,f = numberOfTimes = 6, numberOfTimes = 4,numberOfTimes = 9
// c = 1 - f
// d = 4 - bcf
// g = (numberOfTimes = 7) - d
[ Voor 4% gewijzigd door Gilotto op 08-12-2021 15:48 ]
TrailBlazer schreef op woensdag 8 december 2021 @ 15:40:
spoiler:Wat een draak van een opdracht
1 4 7 8 zijn makkelijk
9 bepaald door 4 over alles met 6 segmenten ( 0 6 en 9) te xor’en degen die 2 segmenten overhoudt is de 9
3 bepaald met 1 door te xor’en met alles met 5 segmenten.
Enzovoort
Misschien zijn de regels generiek te maken weet niet of ik daar de moed voor heb.
DataGhost schreef op woensdag 8 december 2021 @ 15:52:
[...]
spoiler:Waarom xor?
spoiler:Waarom niet and/or?
| Lengte | Overlap met 1 | Overlap met 4 | Cijfer | 
| 2 | 1 | ||
| 3 | 7 | ||
| 4 | 4 | ||
| 5 | 1 | 2 | 2 | 
| 5 | 2 | 3 | 3 | 
| 5 | 1 | 3 | 5 | 
| 6 | 2 | 3 | 0 | 
| 6 | 1 | 3 | 6 | 
| 6 | 2 | 4 | 9 | 
| 7 | 8 | 
Dat vervolgens in rust in een match statement (tuple van lengte, overlap met 1, overlap met 4) gestopt, en voila.
Toen was er ineens wel tijd voor een rewrite (misschien wel mijn mooiste dag-uitvoering tot nu toeCranzai schreef op woensdag 8 december 2021 @ 14:40:
Poeh was me een bevalling, ging eerst de verkeerde kant op doordat ik de instructies verkeerd gelezen had (meende dat je over alle lines een soort generieke map kon maken, bleek dus dat elke line een display was....).
https://github.com/Cranza.../2021/day8/python/day8.py
Code is verre van modulair en behoeft een goede cleanup, ware het niet dat ik daar geen tijd voor over heb.![]()
spoiler:Net zoals velen hier heb ik ook gebruik gemaakt van de overlap van de onbekende cijfers met de bekende, met alleen een kleine twist.
Overlap met 1 4 7 8 (=len(signal)) som 0 2 3 3 6 14 2 1 2 2 5 10 3 2 3 3 5 13 5 1 3 2 5 11 6 1 3 2 6 12 9 2 4 3 6 15 
Het eerste wat ik doe is dus een dictionary "digitMap" aanmaken met daarin de characters van 1, 4, 7, 8. Vervolgens hoef ik alleen maar een enkel getal te bepalen waarmee ik elk missende getal kan identificeren.
https://github.com/Cranza.../day8/python/day8class.py
edit: kleine update om wat dubbele meuk te verwijderen (overbodige if statements)
Het is behoorlijk wat puzzelwerk om het in een schema te krijgen, zeker als je het met de hand doet. Maar het is gelukt....kan ik eindelijk weer verder met mijn leven (tot morgen 5:59).Glewellyn schreef op woensdag 8 december 2021 @ 13:40:
[...]
Voor alle inputs met dezelfde naam mag je bedenken dat die aan elkaar verbonden zijn. Dus INPUT 0 in blokje 0 is fysiek hetzelfde draadje als INPUT 0 in blokje 1.
Hetzelfde geldt voor de OR poorten, OR(segment1) in blokje 0 is dezelfde OR poort als OR(segment1) in blokje 2. Maar als dat allemaal in 1 schema moet is het niet te overzien.
Code dump:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 | from collections import defaultdict
bin_array=defaultdict()
bin_array[0]='1101'
bin_array[8]='1111'
bin_array[2]='1010'
bin_array[6]='1011'
bin_array[7]='0001'
bin_array[1]='0000'
bin_array[9]='0111'
bin_array[4]='0110'
bin_array[3]='0011'
bin_array[5]='0010'  
print('x:abcdefg')
for binid in bin_array:
    bin=bin_array[binid]
    b1,b2,b3,b4=bool(int(bin[0])),bool(int(bin[1])),bool(int(bin[2])),bool(int(bin[3]))
    #segmenten:
    a=b1 or (not(b1) and ((not(b3) and b4) or (b3 and ((b2 and b4) or (not(b2) )))))
    b=(b1 and (b2 or b4)) or (not(b1) and ( (b3 and (b2 or (not(b2) and not(b4))))))
    c=(b1 and (b2 or not(b4))) or (not(b1) and ((b3 and (b2 or b4)) or (not(b3))))
    d=b3
    e=b1 
    f=not(b1) or (b1 and b4)
    g=b1 or (not(b1) and (b3 and ((b2 and b4) or not(b2))))
    print(str(binid)+':'+str(int(a))+str(int(b))+str(int(c))+str(int(d))+str(int(e))+str(int(f))+str(int(g))) | 
When life gives you lemons, start a battery factory
Dat was wel even puzzelen zeg...
Het zal vast nog eenvoudiger kunnen, maar ik vond het wel mooi geweest...
Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...
Without nipples, boobs are pointless - 365 project - In mijn hoofd is het alle dagen Kerstmis - What type of bees make milk? Boobies! - What type of bees are scary? BoooOOOOOooobeees! - Cactusliefhebster
Qua code is mijn oplossing behoorlijk recht-toe-recht-aan geprogrammeerd.
Mijn logica om tot een oplossing te komen:
-De combinatie met een lengte van drie letter bevat de A, de combinatie met een lengte van twee letters niet.
-De combinatie met een lengte van twee letters bevat C en F. F is al bekend, dus de andere is C.
-De combinatie met een lengte van vier letter bevat de BCDF. Deze zijn allemaal reeds bekend behalve de D.
-Er is nu nog een onbekende. Dit is de G.
Soms gaat het niet zoals het moet, maar moet het maar zoals het gaat
Zie mijn oplossing in Clojure.
| 0 | "467889" | 
| 1 | "89" | 
| 2 | "47788" | 
| 3 | "77889" | 
| 4 | "6789" | 
| 5 | "67789" | 
| 6 | "467789" | 
| 7 | "889" | 
| 8 | "4677889" | 
| 9 | "677889" | 
Het maakt niet uit hoe de letters geshuffled zijn, na deze vertaalslag zal elk signal pattern altijd vertaald zijn naar één van bovenstaande strings. Zet die in een hashmap en je kunt elk signal pattern naar een getal vertalen.
Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...
Van deze techniek zag ik ook al een extreem gegolfde versie langskomen in een Python discord:Dricus schreef op woensdag 8 december 2021 @ 21:05:
Grappig, ik heb nog een andere oplossing voor dag 8 gevonden, die ik hier volgens mij nog niet voorbij heb zien komen.
Zie mijn oplossing in Clojure.
spoiler:Je kunt elk signal pattern en elke output value vertalen naar een string, waarbij elke letter in het pattern vertaalt wordt naar een getal dat aangeeft hoe vaak die letter in totaal in alle patterns voorkomt. De getallen in die string moeten wel gesorteerd worden. Elk getal dat in de display getoond kan worden, krijgt dan een unieke string:
0 "467889" 1 "89" 2 "47788" 3 "77889" 4 "6789" 5 "67789" 6 "467789" 7 "889" 8 "4677889" 9 "677889" 
Het maakt niet uit hoe de letters geshuffled zijn, na deze vertaalslag zal elk signal pattern altijd vertaald zijn naar één van bovenstaande strings. Zet die in een hashmap en je kunt elk signal pattern naar een getal vertalen.
[ Voor 0% gewijzigd door iThinkSo op 08-12-2021 21:52 . Reden: variant -> techniek ]
Daos schreef op woensdag 8 december 2021 @ 21:35:
Ik heb een brute-force aanpak gekozen voor deel 2. Is in een seconde of 2-3 klaar in c#.
spoiler:Het aantal mogelijke mappings/permutaties is maar 7! = 5040. Dat kan je makkelijk allemaal proberen en dat heb ik dus gedaan.
Man man man, dit soort oplossingeniThinkSo schreef op woensdag 8 december 2021 @ 21:46:
[...]
Van deze variant zag ik ook al een extreem gegolfde versie langskomen in een Python discord:
spoiler:print(sum(int(''.join('4725360918'[sum(map(x[:60].count,r))//2%15%11]for r in x[60:].split()))for x in open(0)))
Dat heeft toch niets meer met programmeren te maken, totaal niet leesbaar/te begrijpen
Edit:
Beter verwoord, one-liners schrijven is een sport maar verre van praktisch.
[ Voor 8% gewijzigd door Cranzai op 08-12-2021 21:54 ]
Zie het als normale sport: een bal in een goal trappen is ook niet praktisch maar je houdt er wel conditie en training aan overCranzai schreef op woensdag 8 december 2021 @ 21:49:
[...]
Beter verwoord, one-liners schrijven is een sport maar verre van praktisch.
Op dezelfde manier leer je door een oplossing zo kort mogelijk te maken ook vaak nieuwe dingen over je taal en stdlib die je goed kunt gebruiken in praktische problemen.
Siditamentis astuentis pactum.
En geen arrays van int8 maken (want input is toch tussen 0 en 9) om vervolgens die array te misbruiken door er allemaal andere getallen in te stoppen. Dat kostte mj een kwartier extra.Varienaja schreef op donderdag 9 december 2021 @ 06:40:
Dag 9. Zoals altijd moet je de beschrijving weer goed lezen. :-D
spoiler:Risiko is 1 plus de diepteAlleen de 3 grootse basins bij elkaar rekenen.
When life gives you lemons, start a battery factory
| 8 | 8 | 8 | 
| 8 | 7 | 8 | 
| 8 | 7 | 8 | 
| 8 | 8 | 8 | 
[ Voor 37% gewijzigd door Janoz op 09-12-2021 07:55 ]
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post: 
'You are not expected to understand this'
Haha, inderdaad,Varienaja schreef op donderdag 9 december 2021 @ 06:40:
Dag 9. Zoals altijd moet je de beschrijving weer goed lezen. :-D
spoiler:Risiko is 1 plus de diepteAlleen de 3 grootse basins bij elkaar rekenen.
Oké fuck part 2. De kennis die je op doet over het proleem bij deel 1 is absoluut niet nodig bij deel 2.
Zie onderstaande afbeelding: Alles wat rood is hoort ook bij je basin. Makkelijkste is als je in het plaatje op zoek gaat naar het kleinste bassin
:fill(white):strip_exif()/f/image/vwjjHvkkaFNhwatdFW4teip3.png?f=user_large)
"Doubt—the concern that my views may not be entirely correct—is the true friend of wisdom and (along with empathy, to which it’s related) the greatest enemy of polarization." -- Václav Havel
Janoz schreef op donderdag 9 december 2021 @ 07:53:
spoiler:Ik heb zelf nog even een tijdje nagedacht over een vervelende cornercase, maar uit de beschijving bleek deze niet voor te kunnen komen. Testsets van @DataGhost die dat geval wel hebben accepteer ik dan ook niet
Nee, zie de spoiler in DevWouter in "Advent of Code 2021"MrHaas schreef op donderdag 9 december 2021 @ 08:17:
[...]
spoiler:Je moet alleen basins bereken van de lowest points zoals gedefinieerd in deel 1 toch?
"Doubt—the concern that my views may not be entirely correct—is the true friend of wisdom and (along with empathy, to which it’s related) the greatest enemy of polarization." -- Václav Havel
De corner case gaat over deel 1.MrHaas schreef op donderdag 9 december 2021 @ 08:17:
[...]
spoiler:Je moet alleen basins bereken van de lowest points zoals gedefinieerd in deel 1 toch?
Oh? Bij mij welDevWouter schreef op donderdag 9 december 2021 @ 08:17:
(dag 9)
Oké fuck part 2. De kennis die je op doet over het proleem bij deel 1 is absoluut niet nodig bij deel 2.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post: 
'You are not expected to understand this'
Deel 1 ging redelijk vlot.
Deel 2 toch een tijdje mee bezig geweest.
Veel te lang over deel 1 gedaan vanwege een off-by-one error. En het ergste is dat ik niet weet hoe het komt. Ik heb gewoon Cmd+A, Del gedaan en ben opnieuw begonnen en toen was ie in 1x goed. Mijn testinput was wel goed
Deel 2 in 1x goed.
[ Voor 28% gewijzigd door armageddon_2k1 op 09-12-2021 08:43 ]
Engineering is like Tetris. Succes disappears and errors accumulate.
Ik denk het niet.... Jouw code lijkt gewoon correct.bakkerjangert schreef op donderdag 9 december 2021 @ 08:43:
Opgelsot in Python.
spoiler:Bij mij werkt deel 2 wel met de laagste punten als berekend in deel 1. Wellicht mazzel met mijn puzzel input?
Mocht je het willen testen tegen mijn input: https://github.com/DevWouter/AdventOfCode/tree/main/2021/d09
Code is een puinhoop omdat ik een paar extra checks in had voor potentiele edge cases die mogelijk in de oude situatie van toepassing waren.
Part 1: 572
Part 2: 847044
"Doubt—the concern that my views may not be entirely correct—is the true friend of wisdom and (along with empathy, to which it’s related) the greatest enemy of polarization." -- Václav Havel
Sure?DevWouter schreef op donderdag 9 december 2021 @ 08:18:
[...]
Nee, zie de spoiler in DevWouter in "Advent of Code 2021"
A basin is all locations that eventually flow downward to a single low point.
Ik heb dit geinterpreteerd as "je mag de low points als startpunten gebruiken".
Daarbij
all other locations will always be part of exactly one basin,
Mijn interpretatie: als punten niet gescheiden zijn door negens, horen ze bij hetzelfde basin.
Mijn oplossing was een flooding loop:
Maak een array die leeg is. Vul de lowpoints met een volgnummer (dus elk lowpoint zijn eigen id)
Markeer alle velden met een 9
Zolang de array nog niet helemaal gevuld is:
1) Loop over de lowpoints van deel 1
als een buur<>9 al een volgnummer heeft, neem dit over
2) tel per volgnummer hoeveel velden dit volgnummer hebben
When life gives you lemons, start a battery factory
Janoz schreef op donderdag 9 december 2021 @ 08:25:
Oh? Bij mij wel
spoiler:Voor deel 2 gebruik ik een soort floodfill algoritme waarbij ik het antwoord van part 1 gebruik als startpunten waardoor ik het linerair op kan lossen.
Naast dat is mijn floodfill wel een beetje brak. Ik werk een stack door om het basin te vullen, en vanaf het huidige punt zet ik altijd de buren die nog niet in het basin zitten op de stack. Daarmee kunnen punten dus wel meermaals in de stack zitten, want die was ik even vergeten te controleren bij het toevoegen
Met 15ms voor deel 1 en 0.34ms voor deel 2 (inclusief deel 1 voor de laagste punten), is het waarschijnlijk niet de snelste oplossing maar voor mij prima.
KabouterSuper schreef op donderdag 9 december 2021 @ 09:33:
[...]
Sure?
spoiler:Mijn interpretatie: als punten niet gescheiden zijn door negens, horen ze bij hetzelfde basin.
"Je moet alleen ..." vs "Je kan..."KabouterSuper schreef op donderdag 9 december 2021 @ 09:33:
[...]
Sure?
spoiler:Er staat:
A basin is all locations that eventually flow downward to a single low point.
Ik heb dit geinterpreteerd as "je mag de low points als startpunten gebruiken".
Daarbij
all other locations will always be part of exactly one basin,
Mijn interpretatie: als punten niet gescheiden zijn door negens, horen ze bij hetzelfde basin.
Mijn oplossing was een flooding loop:
Maak een array die leeg is. Vul de lowpoints met een volgnummer (dus elk lowpoint zijn eigen id)
Markeer alle velden met een 9
Zolang de array nog niet helemaal gevuld is:
1) Loop over de lowpoints van deel 1
als een buur<>9 al een volgnummer heeft, neem dit over
2) tel per volgnummer hoeveel velden dit volgnummer hebben
De methode die je beschrijft was degene die ik ook zou gebruiken. Overigens kan je die ook zonder het antwoord van deel 1 doen.
"Doubt—the concern that my views may not be entirely correct—is the true friend of wisdom and (along with empathy, to which it’s related) the greatest enemy of polarization." -- Václav Havel
Maar ik moet @DevWouter ook gelijkgeven dat er er edge case zou kunnen bestaan die een probleem oplevert:iThinkSo schreef op donderdag 9 december 2021 @ 09:36:
[...]
spoiler:Dat is inderdaad een erg logische afleiding, en eentje die ik niet had gemaakt. Ik was ervanuit gegaan dat je vanuit een punt naar de laagste buur moest, dus heb geen flood fill gedaan maar een (cached) walk
9 6 6 8 7 7 7 9
9 6 1 8 7 1 7 9
9 6 6 8 7 7 7 9
9 9 9 9 9 9 9 9
Er zijn twee low points (de enen), maar toch maar 1 basin (alles behalve de negens). Blijkbaar komt dit niet voor in de datasets, want er wordt duidelijk gezegd dat all points!=9 in maximaal 1 basin zitten. In mijn geval zouden de achten in twee basins kunnen zitten.
Maar dit is een specifiek probleem dat ik niet in het plaatje van @DevWouter terugzie.
When life gives you lemons, start a battery factory
Ik was er blind vanuit gegaan dat de maker deel 1 zo had geconstrueerd dat het handig was om de oplossing daarvan te gebruiken. Maar je hebt helemaal gelijk dat dat natuurlijk niet hoeft.DevWouter schreef op donderdag 9 december 2021 @ 09:44:
[...]
"Je moet alleen ..." vs "Je kan..."
De methode die je beschrijft was degene die ik ook zou gebruiken. Overigens kan je die ook zonder het antwoord van deel 1 doen.
[ Voor 4% gewijzigd door KabouterSuper op 09-12-2021 09:58 ]
When life gives you lemons, start a battery factory
DevWouter schreef op donderdag 9 december 2021 @ 08:17:
(dag 9)
Oké fuck part 2. De kennis die je op doet over het proleem bij deel 1 is absoluut niet nodig bij deel 2.
https://niels.nu
Ja, maar dat is dus helemaal niet nodig. Zie mijn implementatie.Janoz schreef op donderdag 9 december 2021 @ 08:25:
spoiler:Voor deel 2 gebruik ik een soort floodfill algoritme waarbij ik het antwoord van part 1 gebruik als startpunten waardoor ik het linerair op kan lossen.
[ Voor 15% gewijzigd door Hydra op 09-12-2021 09:57 ]
https://niels.nu
Een basin is namelijk opgemaakt uit alle punten die uiteindelijk naar een enkel low point 'stromen' en elk punt (geen 9s) is onderdeel van maar 1 basin.
dcm360 schreef op donderdag 9 december 2021 @ 10:04:
spoiler:Volgens mij kunnen er volgens de beschrijving ook punten zijn die geen onderdeel zijn van een basin, omdat ze geen low point hebben om naar af te lopen. Dat lijkt echter ook niet voor de komen in de datasets. Meest eenvoudige voorbeeld hiervoor zou iets als '11' zijn: geen low point, dus geen basin.
[ Voor 9% gewijzigd door coop op 09-12-2021 10:11 ]
coop schreef op donderdag 9 december 2021 @ 10:07:
[...]
spoiler:Ik denk dus dat dit niet kan en '11' geen mogelijke input van deze puzzel kan zijn, aangezien er specifiek staat dat elk punt niet gelijk aan 9 altijd onderdeel is van precies 1 basin. En een basin heeft altijd 1 enkel low point. Een veld met alleen 9's zou dus technisch gezien wel kunnen, maar dan is het antwoord op deel 1 en 2 altijd 0 (geen low point en geen basins)
Het werkt ook gewoon met meerdere punten in hetzelfde basin. Vandaar dat ik er ook voor gekozen had. Had alleen even gemist dat er niet meer in een basin konden liggendcm360 schreef op donderdag 9 december 2021 @ 09:33:
[...]
spoiler:Volgens mij zou een floodfill ook per definitie het juiste antwoord moeten geven. Een basin heeft altijd 1 low point, en wordt enkel begrensd door de rand en negens. Ik zat nog te denken of ik ergens moest kijken of er 'overlappende' basins zouden kunnen zijn met een floodfill vanaf een low point, maar dat lijkt volgens de uitleg niet mogelijk te zijn.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post: 
'You are not expected to understand this'
Diderikdm schreef op donderdag 9 december 2021 @ 10:21:
spoiler:Volgens de omschrijving van part 2 is elk punt welke lager is dan 9 automatisch een "low" point (omdat er geen waardes hoger dan 9 bestaan in deze puzzel). Om deze reden kan je er vanuit gaan dat elk punt (<9) een "low" point is. Je hoeft alleen de punten binnen de negens op te tellen. In principe maakt het dus ook niet uit of je op het laagste punt begint, of een 8. Deze vallen allemaal binnen dezelfde groep 9's
Overigens, ik vind dat je altijd mooie python code schrijft, mijn complimenten!
When life gives you lemons, start a battery factory
Veel te lang over deel 1 gedaan want ik had te snel gelezen
Edit: o wacht, met een minimale aanpassing boeit die corner case ook niet. En done.
[ Voor 10% gewijzigd door Creepy op 09-12-2021 11:13 ]
"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney
https://github.com/FransB.../src/AoC2021.Code/Day9.cs
Marking van cellen helpt, en het zien dat 9 de grens is maakte puzzle 2 simpel. Maar als je dat niet ziet wordt het lastig...
Heb niet de punten uit puzzle 1 gebruikt voor 2, gewoon het hele array doorzoeken in 2, want je moet toch alle cellen bekijken, dus eerst alle cellen bekijken voor de laagste punten is redundant. Ik doe in feite een flood fill, met de randen en 9's als grens voor de area.
[ Voor 26% gewijzigd door EfBe op 09-12-2021 11:28 ]
Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com
KabouterSuper schreef op donderdag 9 december 2021 @ 10:46:
[...]
spoiler:Bij mijn oplossing geef ik elk (echt) low point een identifier en verspreid ik die identifier door die bij de buren in te vullen als dat geen 9 is (waarna ik een count doe per identifier). Daarbij ga ik er wel hard van uit dat een getal<9 maar bij één low point hoort, omdat een veld anders meerdere identifiers kan krijgen (en door het algoritme krijg ik dan de eerste). Je zou het kunnen zien dat ik elk low point zijn eigen kleur geef en door te percoleren kijk welke punten die kleur krijgen. Je wilt voorkomen dat kleuren gaan mengen.
Overigens, ik vind dat je altijd mooie python code schrijft, mijn complimenten!
Was wel heel erg in m'n nopjes met hoe het ging vanochtend!
Ik ben van origine niet goed in dit soort dingen, dus ik ben wel blij met mezelf
Famous last words natuurlijk, ik vermoed dat de komende twee zaterdagen m'n butt weer gaan kicken
https://niels.nu
Nah, ik denk dat de maker heel goed heeft nagedacht over dit probleem. Als ik dit in een training (lab gedeelte) zou verwerken dan zou het ook een soort gelijke aanpak zijn.KabouterSuper schreef op donderdag 9 december 2021 @ 09:53:
[...]
Ik was er blind vanuit gegaan dat de maker deel 1 zo had geconstrueerd dat het handig was om de oplossing daarvan te gebruiken. Maar je hebt helemaal gelijk dat dat natuurlijk niet hoeft.
spoiler:De fysische variant van het probleem is denk ik om het landschap met regen onder water te zetten tot hoogte 8.5 en dan de basins te tellen. Blijkbaar heeft de maker het probleem iets versimpeld door te zorgen dat er bij elke waterhoogte alleen basins ontstaan bij low points (dus de regen blijft niet staan in het linker basin in mijn voorbeeld). Had niet gehoeven, maar het wel gemakkelijker.
Die kan je allemaal stapsgewijs oppakken waardoor de trainee telkens de fundamenten van het vorige deel kan leren.
Daarom ook mijn grote middelvinger. Een gedeelte van de logica (max-slope) wordt niet hergebruikt.
Het was toen ik het ging visualiseren toen ik zag dat er een cellur noise generator gebruikt was en ik 1+1 ging doen en snapte waarom de max-slope opeens geen requirement meer kon zijn.
"Doubt—the concern that my views may not be entirely correct—is the true friend of wisdom and (along with empathy, to which it’s related) the greatest enemy of polarization." -- Václav Havel
Ik kijk altijd uit naar jouw submission omdat je dingen iedere keer net iets anders aanpakt en ik toch vaak kleine kotlin dingetjes leer
Kan je wel aanraden een Point class te implementeren. Die gebruik ik zoveel dat er eelt op zit zolangzamerhand.
[ Voor 12% gewijzigd door Hydra op 09-12-2021 11:50 ]
https://niels.nu
Edit: makkelijke oneline-testcase voor kwadratische algoritmes toegevoegd: Up 4, bzipped.
[ Voor 14% gewijzigd door DataGhost op 09-12-2021 21:05 ]
Ik begon te twijfelen toen ik het visualiseerde en een paar artifacts bij de 9 zag die ik niet kon verklaren. Dus toen nog een keer gevisualiseerd dit keer met gradients en dat leek niet op cell noise zoals ik het kende
"Doubt—the concern that my views may not be entirely correct—is the true friend of wisdom and (along with empathy, to which it’s related) the greatest enemy of polarization." -- Václav Havel
*zucht*
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post: 
'You are not expected to understand this'
Anyone who gets in between me and my morning coffee should be insecure.
Ha, leuk om te horen. Dat heb ik ook bij jou. Heb zeker 2020 heel veel geleerd van jouw cleane code. En leer ook elke keer weer wat.Hydra schreef op donderdag 9 december 2021 @ 11:46:
[...]
Ik kijk altijd uit naar jouw submission omdat je dingen iedere keer net iets anders aanpakt en ik toch vaak kleine kotlin dingetjes leer
Kan je wel aanraden een Point class te implementeren. Die gebruik ik zoveel dat er eelt op zit zolangzamerhand.
Wat betreft de Point class heb je gelijk. Ik had namelijk een Board (voor een grid) en een Point class en die gebruik ik vaker en daar had ik een off-by-1 error....En dus had ik meer tijd verloren met het hoe en waarom dan de implementatie.
Ik ga het nog opschonen in ieder geval en kijken waar die off-by-1 vandaan kwam.
P.s. Ik gebruik vaak Complexe getallen als positie, omdat je dan rotaties gratis krijgt :-) En dat is nog wel eens een dingetje met AoC.
[ Voor 14% gewijzigd door armageddon_2k1 op 09-12-2021 13:15 ]
Engineering is like Tetris. Succes disappears and errors accumulate.
De code kan nog iets netter, maar al met al ben ik best tevreden. Bij puur functioneel programmeren moet je echt helemaal van de imperatieve mindset af en dat is toch nog steeds af en toe best lastig. Ik word er steeds beter in om een oplossing op te hakken in een serie van transformaties vanuit een startpunt. Volgens mij is dat de beste manier om dit soort problemen in een puur functionele programmeertaal zoals Clojure op te lossen. En het leidt ook nog eens tot code waarin die transformaties goed terug te lezen zijn.
Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...
Ah, well, uiteindelijk wel een elegante oplossing van gemaakt.
https://github.com/patric...e/tree/master/2021/Day-09
... en gaat over tot de orde van de dag
Dat is me dit jaar nog lang niet altijd gelukt. (Alleen dag 1,2,3,5,9)
[ Voor 3% gewijzigd door Varienaja op 09-12-2021 14:27 ]
Siditamentis astuentis pactum.
Met halfbakken recursion
Mijn "isValley" en "bassinInspect" functies kunnen misschien nog wel gemergd worden maar voor nu vind ik het prima.
https://github.com/Cranza.../2021/day9/python/day9.py
edit:
Overigens wel echt haat dat een:
3 2 2 3
2 1 1 3
3 2 2 3
Niet als valley gerekend wordt.
[ Voor 59% gewijzigd door Cranzai op 09-12-2021 15:02 ]
Oh! Da's ook wel een goeie inderdaad. Ik heb wel een aantal classes (zoals Point) rotaties al ingebouwd, maar kwam er dus onlangs achter dat in een van die methodes gewoon een fout zat. Oopsarmageddon_2k1 schreef op donderdag 9 december 2021 @ 13:07:
P.s. Ik gebruik vaak Complexe getallen als positie, omdat je dan rotaties gratis krijgt :-) En dat is nog wel eens een dingetje met AoC.
https://niels.nu
Nice, Clojure is mijn favoriete taal, ik ben groot fan van tranformaties aan elkaar lussen met -> en ->>Dricus schreef op donderdag 9 december 2021 @ 13:20:
Dag 9 in Clojure
De code kan nog iets netter, maar al met al ben ik best tevreden. Bij puur functioneel programmeren moet je echt helemaal van de imperatieve mindset af en dat is toch nog steeds af en toe best lastig. Ik word er steeds beter in om een oplossing op te hakken in een serie van transformaties vanuit een startpunt. Volgens mij is dat de beste manier om dit soort problemen in een puur functionele programmeertaal zoals Clojure op te lossen. En het leidt ook nog eens tot code waarin die transformaties goed terug te lezen zijn.
Je oplossing ziet er kwa structuur goed uit. Als je de performance wil verbeteren raad ik je aan om vectors te gebruiken,
dan kun je nth (die is (O(n)) vervangen door get (O(log32(n)). Dat is voor deze dag nog niet nodig, maar in mijn ervaring worden dit soort optimalisaties belangrijker in de latere opdrachen.
Verder is die lazy-seq op regel 46 overbodig
Vandaar ook je nickname?Lisper schreef op donderdag 9 december 2021 @ 15:22:
Nice, Clojure is mijn favoriete taal, ik ben groot fan van tranformaties aan elkaar lussen met -> en ->>
Thanks!Je oplossing ziet er kwa structuur goed uit.
Ja, mee eens. Ik moet me nog wat bewuster worden van welk soort collection (seq, vec) ik waar precies gebruik.Als je de performance wil verbeteren raad ik je aan om vectors te gebruiken,
dan kun je nth (die is (O(n)) vervangen door get (O(log32(n)). Dat is voor deze dag nog niet nodig, maar in mijn ervaring worden dit soort optimalisaties belangrijker in de latere opdrachen.
Dat vermoeden had ik al.Verder is die lazy-seq op regel 46 overbodig
Dankjewel voor je feedback!
Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...
Intrigerend. Vorig jaar had ik op 24 van de 25 dagen voor deel 2 een hogere ranking dan voor deel 1 (alleen dag 19 niet).Varienaja schreef op donderdag 9 december 2021 @ 14:26:
Ik vind de persoonlijke statistieken nog best interessant. Mijn stiekeme doel is om bij deel 2 een betere Rank te hebben dan bij deel 1.
Dat is me dit jaar nog lang niet altijd gelukt. (Alleen dag 1,2,3,5,9)
Ik ben echt niet bijzonder snel met deel twee (bij de latere opdrachten vaak meer dan een uur na deel 1) en zelden bij de eerste 5000 personen. Ik vraag me dus af hoe dit ranking effect kan ontstaan.
[ Voor 4% gewijzigd door joppybt op 09-12-2021 17:27 ]
Voor mij alleen dag 7 niet.Varienaja schreef op donderdag 9 december 2021 @ 14:26:
Ik vind de persoonlijke statistieken nog best interessant. Mijn stiekeme doel is om bij deel 2 een betere Rank te hebben dan bij deel 1.
Dat is me dit jaar nog lang niet altijd gelukt. (Alleen dag 1,2,3,5,9)
Anyone who gets in between me and my morning coffee should be insecure.
Voor mij alleen dag 5 niet, maar dat was omdat ik toen supervroeg wakker was, dus in de global top ~1000 zat voor beide delenVarienaja schreef op donderdag 9 december 2021 @ 14:26:
Ik vind de persoonlijke statistieken nog best interessant. Mijn stiekeme doel is om bij deel 2 een betere Rank te hebben dan bij deel 1.
Dat is me dit jaar nog lang niet altijd gelukt. (Alleen dag 1,2,3,5,9)
(Niet als plaatje want spoiler)
https://niels.nu
https://github.com/rogier...er/AOC2021/Day09/Day09.fs
Damn, nice!Hydra schreef op donderdag 9 december 2021 @ 19:06:
Omdat het er best sexy uitziet heb ik even een animatie van m'n algorithme gemaakt: https://i.imgur.com/Q22O5Eo.gifv
(Niet als plaatje want spoiler)
Ben nu heel benieuwd hoe mijn algoritme er uit zou zien. Hoe heb je dit zo gemaakt?
Hier is de code.Cranzai schreef op donderdag 9 december 2021 @ 19:23:
Ben nu heel benieuwd hoe mijn algoritme er uit zou zien. Hoe heb je dit zo gemaakt?
Heb m'n oplossing voor Dag 9 gekopieerd en van elke tussenstap wordt een image getekend. Die voeg ik dan samen met een kleine utility class tot een animated gif.
Edit: Alternatief. Deze werkt van laag naar hoog ipv gewoon de rij af te gaan: https://imgur.com/a/652z2Fd
[ Voor 7% gewijzigd door Hydra op 09-12-2021 19:41 ]
https://niels.nu
Vervolgens nog 15 minuten verspild met het debuggen van m'n code, omdat de test input wel de juiste uitkomst gaf, maar de puzzel input niet. Kwam ik erachter dat ik twee keer de enalaatste (gesorteerde) basin size pakte om te vermenigvuldigen, wat bij de test input precies goed uit kwam (want twee keer 9). Lekker scherp weer
Al met al deel 2 in 0.95ms. Kan nog wel wat sneller, maar vind het wel goed zo.
PS5 PSN: UnrealKazu
Chill eens ff kijken of ik dat kan implementeren.Hydra schreef op donderdag 9 december 2021 @ 19:33:
[...]
Hier is de code.
Heb m'n oplossing voor Dag 9 gekopieerd en van elke tussenstap wordt een image getekend. Die voeg ik dan samen met een kleine utility class tot een animated gif.
Edit: Alternatief. Deze werkt van laag naar hoog ipv gewoon de rij af te gaan: https://imgur.com/a/652z2Fd
Waarschijnlijk ziet mijn oplossing er uit zoals jouw alternatief.
Goede manier van flaggen!Kazu schreef op donderdag 9 december 2021 @ 19:43:
Vandaag was leuk om te doen, inderdaadZo'n beetje dezelfde oplossing bedacht als velen hier, zo te zien.
spoiler:Ik ging qua code complexiteit in een mooie curveIk wilde voor deel 2 voorkomen dat ik punten meerdere keren zou bezoeken, dus was een map van bezochte punten aan het bijhouden. Hierna bedacht ik me dat het veel makkelijker kon door gewoon in-place de heatmap aan te passen zodat er überhaupt geen aparte map nodig is.
Vervolgens nog 15 minuten verspild met het debuggen van m'n code, omdat de test input wel de juiste uitkomst gaf, maar de puzzel input niet. Kwam ik erachter dat ik twee keer de enalaatste (gesorteerde) basin size pakte om te vermenigvuldigen, wat bij de test input precies goed uit kwam (want twee keer 9). Lekker scherp weerOh well, daardoor wel nog wat code kunnen strippen, dus mag niet klagen.
***members only***
Al met al deel 2 in 0.95ms. Kan nog wel wat sneller, maar vind het wel goed zo.
In een lus zoeken naar de eerste in de tabel waarbij het bassin nr nog nul is. Dan roep ik een recursieve procedure aan met de coördinaten van die locatie en het bassin-nr (in eerste instantie 1). Die procedure kijkt of het punt in kwestie al ingedeeld is bij een bassin. Zo ja: terug, zo nee, jezelf aanroepen voor de locaties links, rechts, boven en onder. Als er niks meer zonder bassin nr is, de lus verlaten.
Daarna wat zoeken, sorteren en sommeren en klaar!
https://github.com/patric...ter/2021/Day-09/day-09b.p
... en gaat over tot de orde van de dag
https://github.com/varien...tofcode2021/Puzzle09.java
Siditamentis astuentis pactum.
Dat kan natuurlijk ook, maar in redelijk wat talen moet je alsnog door een hoepeltje springen om vergelijkingen (groter/kleiner) te doen dus dan kan je er net zo goed een int van maken. En in deel 1 weet je natuurlijk nog niet wat deel 2 gaat zijn, terwijl de kans op wiskunde behoorlijk groot is dus dat kan je beter direct al goed doen. In ieder geval maakt het voor de looptijd niks uit, je kan namelijk in O(n) alles omzetten naar ints en diezelfde O(n) heb je sowieso al nodig voor het inlezen alleen al. Algoritmisch gezien wordt het er dus niet slechter van. Het verkeerde algoritme kiezen voor het daadwerkelijke uitrekenen is juist hetgene wat enige impact gaat hebben.Varienaja schreef op donderdag 9 december 2021 @ 20:07:
Grappig dat iedereen de strings van de invoer ombouwt tot tweedimensionale int arrays. Ik reken direct met lines.get(y).charAt(x) Dat gaat net zo goed toch?![]()
https://github.com/varien...tofcode2021/Puzzle09.java
Sterker nog: op sommige architecturen kan het juist sneller zijn met een array van ints die memory-aligned zijn, in tegenstelling tot het ophalen van een bepaalde byte in een string, wat bijvoorbeeld een 32-bits of 64-bits read is waarna nog een shift en een and moet gebeuren om daar die ene byte uit te halen. Maar op het moment dat je naar dat soort optimalisaties gaat kijken zijn er al heftige dingen aan de hand. En ook dit doet algoritmisch gezien niks aan de looptijd, nog steeds O(n).
Edit: nou moet ik wel zeggen dat jouw algoritme stiekem kwadratisch lijkt, maar daarbij ook vermelden dat ik nauwelijks ervaring heb met java (dus de library niet ken).
Edit2: nu ik 'm draai lijkt het nog meer kwadratisch
Edit3: probeer maar met Up 4, bzipped. Antwoorden 2 en 958429
[ Voor 27% gewijzigd door DataGhost op 09-12-2021 21:06 ]
Voor deel 1 heb ik dat wel zo gedaan inderdaad (met equivalente functies dan). Voor deel 2 werd dat te traag. Progress 4GL is relatief traag met intensief gebruik van functies en voor deel twee moest ik dan wel heel veel functies aan elkaar knopen. Nu maakt de tijd niet zoveel uit voor deze opgave, maar het werd er ook niet leesbaarder van. Overigens is deel 2 in Progress 4GL nu op mijn pc in 1120 ms klaar (1,1 sec)Varienaja schreef op donderdag 9 december 2021 @ 20:07:
Grappig dat iedereen de strings van de invoer ombouwt tot tweedimensionale int arrays. Ik reken direct met lines.get(y).charAt(x) Dat gaat net zo goed toch?![]()
https://github.com/varien...tofcode2021/Puzzle09.java
... en gaat over tot de orde van de dag
Ik had exact hetzelfde voorKazu schreef op donderdag 9 december 2021 @ 19:43:
spoiler:Vervolgens nog 15 minuten verspild met het debuggen van m'n code, omdat de test input wel de juiste uitkomst gaf, maar de puzzel input niet. Kwam ik erachter dat ik twee keer de enalaatste (gesorteerde) basin size pakte om te vermenigvuldigen, wat bij de test input precies goed uit kwam (want twee keer 9). Lekker scherp weer
Without nipples, boobs are pointless - 365 project - In mijn hoofd is het alle dagen Kerstmis - What type of bees make milk? Boobies! - What type of bees are scary? BoooOOOOOooobeees! - Cactusliefhebster
Die oplossingen met cell voor cell de basins vullen zou ik nooit opgekomen zijn.😅
Verwijderd
yep, gereproduceerd met jouw input.DevWouter schreef op donderdag 9 december 2021 @ 08:55:
[...]
Ik denk het niet.... Jouw code lijkt gewoon correct.
spoiler:In jouw code zie ik geen verwijzing naar het gebruik van deltas.
Mocht je het willen testen tegen mijn input: https://github.com/DevWouter/AdventOfCode/tree/main/2021/d09
Code is een puinhoop omdat ik een paar extra checks in had voor potentiele edge cases die mogelijk in de oude situatie van toepassing waren.
Part 1: 572
Part 2: 847044
Ik heb het denk ik anders gedaan als wat hier tot nu toe staat:
https://github.com/gercob...dventOfCode2021/src/day09
https://github.com/varien...tofcode2021/Puzzle10.java
[ Voor 34% gewijzigd door Varienaja op 10-12-2021 08:23 ]
Siditamentis astuentis pactum.
Afhankelijk van je aanpak bij deel 1 zou je deel 2 heel snel af moeten kunnen hebben, mits je goed leestVarienaja schreef op vrijdag 10 december 2021 @ 06:59:
Weer een eitje vandaag. Maar toch had ik voor het tweede deel een slechtere ranking als voor het eerste.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post: 
'You are not expected to understand this'
Without nipples, boobs are pointless - 365 project - In mijn hoofd is het alle dagen Kerstmis - What type of bees make milk? Boobies! - What type of bees are scary? BoooOOOOOooobeees! - Cactusliefhebster
Was lekker simpel
Ga het nog iets opschonen wellicht, maar vind het ook wel prima zo.
EDIT: en opgeschoond en wel
[ Voor 6% gewijzigd door armageddon_2k1 op 10-12-2021 09:17 ]
Engineering is like Tetris. Succes disappears and errors accumulate.
Geen moeilijke en een herhaling van eerdere challenges, maar ik vond deze wel weer erg leuk!
https://niels.nu
Deel twee was wel ff nadenken hoe dit te doen qua programmeren, maar ik denk wel een mooie oplossing gevonden te hebben. Alleen voor het zoeken naar naastgelegen posities moet ik nog een iets mooiers maken.
En aan het einde het resultaat berekenen heeft denk ik niet de schoonheidsprijs.
Vanavond maar eens naar dag 10 kijken.
Soms gaat het niet zoals het moet, maar moet het maar zoals het gaat