https://github.com/CodeEn...23/blob/main/days/Day9.go
"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
Creepy schreef op zaterdag 9 december 2023 @ 11:10:
Vandaag viel weer mee idd.
https://github.com/CodeEn...23/blob/main/days/Day9.go
spoiler:Voor deel 2 een paar dingetjes moeten omdraaien (first index ipv last pakken en een - ipv een +) maar dat was dan ook alles
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Dag 9 in Java.
Ik haal in Python 250 ms. Met NumPy zou het waarschijnlijk nog een stuk sneller kunnen.Soultaker schreef op zaterdag 9 december 2023 @ 09:02:
Okee, omdat hij vandaag zo makkelijk was, hier een iets grotere invoer: aoc-2023-day-09-challenge-1.zip
Ik heb een Python-oplossing die dit in 500 ms uitrekent.
[ Voor 20% gewijzigd door Friits op 09-12-2023 12:34 ]
Dag 9
Numpy doet geen bigints voor zover ik weet?Friits schreef op zaterdag 9 december 2023 @ 12:32:
Ik haal in Python 250 ms. Met NumPy zou het waarschijnlijk nog een stuk sneller kunnen.
Nice! Dat had ik ook bedacht/ontdekt.spoiler:Pre-computed driehoek van Pascal
nCr(n, k) = n! / k! / (n - k)!
nCr(n, k) / nCr(n, k - 1)
= n! / k! / (n - k)! / (n! / (k - 1)! / (n - (k - 1))!)
= (k - 1)! × (n - (k - 1))! / k! / (n - k)!
= (n - k + 1) / k
→ nCr(n, k) = nCr(n, k - 1) × (n - k + 1) / k
Dan kom je uiteindelijk op een O(N) oplossing uit, wat optimaal is (Python code).
Oh ja... Waarschijnlijk alleen een probleem voor de som aan het einde, maar je krijgt het toch niet meer zo elegant.Soultaker schreef op zaterdag 9 december 2023 @ 12:48:
Numpy doet geen bigints voor zover ik weet?
Klopt, maar ik had aangenomen dat ik de meeste wel een paar keer nodig zou hebben. Jouw code wordt ook wat sneller met een simpele @cache daar.spoiler:Je hoeft niet eens te precomputen; je kunt de binomiaalcoëfficienten iteratief genereren
Wel met dtype='O' en er gewoon Python ints in stoppen. Snel/efficient is het niet, maar het werkt wel.Soultaker schreef op zaterdag 9 december 2023 @ 12:48:
[...]
Numpy doet geen bigints voor zover ik weet?
Verandert z'n sig te weinig.
Begin eindelijk het licht te zien met de nom/winnow parser.
In javascript, 5.8ms
Raar... Is zo gek nog niet
nom was niet eens nodig. Een split_whitespace() en str.parse::<i64>() waren genoeg.vDorst schreef op zaterdag 9 december 2023 @ 15:49:
Vandaag was erg makkelijk. Part 2 was ook zo gebeurt.
Begin eindelijk het licht te zien met de nom/winnow parser.
Dan een stack vullen en bij het legen de gevraagde waardes berekenen.
Dus uiteindelijk maar geen aparte methodes voor deel 2 gemaakt.
let the past be the past.
When life gives you lemons, start a battery factory
Een polynoom zie ik niet direct, maarKabouterSuper schreef op zaterdag 9 december 2023 @ 19:18:
Iemand nog bedacht dat je een polynoom kunt maken van een reeks?
Daarmee ga je van O(N2) naar O(N) qua complexiteit.
Deze werkt voor inputs lengte 21. Voor de voorbeeld-data moet je n=21 even vervangen door n=6.
Waarom moet je met floats gaan werken? Je evalueert altijd op integer posities, en de coefficienten zijn ook altijd integers.KabouterSuper schreef op zaterdag 9 december 2023 @ 19:18:
Iemand nog bedacht dat je een polynoom kunt maken van een reeks? Dan hoef je alleen de coefficienten te berekenen. En dat kan recursief als je je polynoom handig kiest. Ik denk alleen dat je wat afrondingsverschillen gaat krijgen omdat je met floats moet gaan werken.
[ Voor 4% gewijzigd door .oisyn op 09-12-2023 22:13 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
De voorbeelden zijn deze polynomen:
1/2x^2 + 3/2x + 1
1/3x^3 - x^2 + 11/3x + 10
edit:
Is dus niet waar. Zie mijn voorbeelden hierboven. Volgens mij zijn de coefficienten wel altijd in Q. Je kan rekenen met breuken en dan op het exacte getal uitkomen zonder afrondingsfouten..oisyn schreef op zaterdag 9 december 2023 @ 22:13:
de coefficienten zijn ook altijd integers.
[ Voor 40% gewijzigd door Daos op 09-12-2023 23:43 ]
[ Voor 95% gewijzigd door .oisyn op 10-12-2023 03:31 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Nou, dan hoop ik dat je weer vroeg bent opgestaan, want vandaag is het een forse uitdaging.gedonie schreef op zaterdag 9 december 2023 @ 11:33:
Na de lastige puzzel van gisteren wilde ik vandaag er eens goed voor gaan zitten, blijkt de opdracht maar een paar minuten werk te zijn.
Voor deel 2 ben ik langs de pijplijn gaan lopen en houd ik een set bij van punten die aan de linker of rechterkant van de pijplijn liggen. Dat doe ik door voor elke verbinding de richtingsvector naar links en rechts te roteren en de punten waar deze naar wijst (vanuit beide punten in de verbinding, dus je checkt 4 punten per verbinding) toe te voegen aan desbetreffende sets mits deze punten niet in de pijplijn liggen.
Daarna doe ik een floodfill voor beide sets met initial queue van de punten in die set en met boundaries op ([0, max x in pijplijn], [0, max y in pijplijn]). Degene die niet overflowt is de goede set en daarvan pak je de lengte!
Python code: https://github.com/arjand...oc_2023/day10/solution.py
/edit: je zou natuurlijk ook al een keer er door heen kunnen lopen om te checken hoeveel hoeken naar rechts en hoeveel naar links gaan zodat je al weet naar welke kant van de pijplijn je moet kijken!
[ Voor 16% gewijzigd door MrHaas op 10-12-2023 09:04 ]
Inderdaad, net deel 1 gedaan en die was goed te doen.Soultaker schreef op zondag 10 december 2023 @ 06:50:
[...]
Nou, dan hoop ik dat je weer vroeg bent opgestaan, want vandaag is het een forse uitdaging.
Ik open net deel 2 en dat gaat wel even duren denk ik.
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Fuuu... Ik heb deel 1 veel te ingewikkeld gemaakt.MrHaas schreef op zondag 10 december 2023 @ 08:47:
spoiler:Deel 1 was redelijk evident, gewoon de pijplijn volgen.
Stom van me dat ik niet eerst gecheckt heb of de eenvoudige aanpak werkt. Dat had me heel veel tijd bespaard.
Slim bedacht (en netjes geïmplementeerd ook!). Interssant dat er zoveel verschillende mogelijkheden zijn. Ik had een andere aanpak:Voor deel 2spoiler:ben ik langs de pijplijn gaan lopen en houd ik een set bij van punten die aan de linker of rechterkant van de pijplijn liggen.
Bijvoorbeeld als je langs "--" of "L-" komt, steek je een muur over, maar als je langs "||" of "JF" komt niet, want dan kun je “tussendoor” glippen. Als het aantal muren dat je zo tegenkomt oneven is, zit je aan de binnenkant van de curve. Python code
En een derde mogelijkheid die ik pas later bedacht had is
Op het resultaat kun je simpelweg 1 flood fill uitvoeren (vanaf linksboven b.v.) om alle vakjes die aan de buitenkant liggen te identificeren. Wat overblijft is dan de binnenkant. Wel oppassen dat je alleen de oorspronkelijke coördinaten telt.
Misschien is dat nog wel het makkelijkste om te bedenken.
dictionary van pijpelement -> output directions gemaakt, en functie die checkt of een pijpelement compatibel is met de inkomende stroom.
Deel 2 moest ik even goed voor gaan zitten. Uiteindelijk het volgende gedaan:
- achterhalen wat het startpunt voor pijpelement is door de dictionary van pijpelement naar uitgangen van hiervoor te inverteren.
- array met visited uit deel 1 met factor 3 opblazen, en dan de verder uit detailleren met welk pijpelement er in zat. Bijvoorbeeld "F" word [[0,0,0],[0,1,1],[0,1,0]].
- Daarna floodfill vanaf (0,0) in de grote array
- Door oorspronkelijke visited array lopen (voor de floodfill), als deze niet bezocht is checken of het centrale element daarvan in de flood-fill array (3x3 groter dus) ook niet bezocht is, dat is dan een interior.
[ Voor 3% gewijzigd door FCA op 10-12-2023 09:50 ]
Verandert z'n sig te weinig.
Straks maar verder kijken
Roses are red, violets are blue, unexpected '{' on line 32.
Uiteindelijk heb ik deel 1 met DFS opgelost, waarbij ik bijhoudt welke nodes ik al bezocht heb en de parents van nodes. Op een gegeven moment kom je een node die je al bezocht hebt, dat is dan de verste node en dan kun je het pad teruggeven mbt de parents mapping.
Voor deel 2 heb je het hele pad nodig, dus moet mijn deel 1 omschrijven zodat ik dat terugkrijg.
[ Voor 16% gewijzigd door MatHack op 10-12-2023 11:37 ]
There's no place like 127.0.0.1
intersection = '|' or 'L-- ... --7' or 'F-- ... --J'.
code in python
Dit schrijvende besef ik me dat het nog makkelijker is om een schuine lijn te trekken (x+1)(y+1). Dan heb je helemaal geen parallelle paden

Soultaker schreef op zondag 10 december 2023 @ 09:45:
spoiler:Ik heb het geïmplementeerd met de even-odd rule: vanuit elk punt dat niet op de loop ligt scan je naar boven, en tel je hoeveel muren je tegenkomt. Je moet dan paren van karakters bekijken.
Bijvoorbeeld als je langs "--" of "L-" komt, steek je een muur over, maar als je langs "||" of "JF" komt niet, want dan kun je “tussendoor” glippen. Als het aantal muren dat je zo tegenkomt oneven is, zit je aan de binnenkant van de curve. Python code
Dat heeft wel wat klooien gekost, maar is heul snel als je de punten di eop de lijn liggen uit deel 1 hergebruikt
Ik had netjes een ceil(loop.size / 2) voor deel 1 en dat werkt correct. Alleen nu blijft 1 van de voorbeelden voor deel 2 hangen in oneindige loop, gloeiende gloeiende.
Werken in een taal die ik voor AoC nog niet eerder had gebruikt en het feit dat ik in de 20 jaar sinds m'n studietijd eigenlijk geen serieus algoritmisch werk meer heb gedaan nekt me vandaag wel.
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Dit had ik ook even overwogen, maar het werkte niet precies zoals gehoopt. Achteraf realiseerde ik me dat het werkt als jebakkerjangert schreef op zondag 10 december 2023 @ 10:33:
spoiler:Dit schrijvende besef ik me dat het nog makkelijker is om een schuine lijn te trekken (x+1)(y+1). Dan heb je helemaal geen parallelle paden.
Soultaker schreef op zondag 10 december 2023 @ 10:59:
[...]
Dit had ik ook even overwogen, maar het werkte niet precies zoals gehoopt. Achteraf realiseerde ik me dat het werkt als jespoiler:'|', '-', 'J', en 'F' als muren beschouwd, maar 'L' en '7' niet.
../ ../
.F .J.
/.. /.. raken de lijn, maar snijden niet en moet je dus niet mee tellen. Analoog voor andere richtingen.
spoiler:raken de lijn, maar snijden niet en moet je dus niet mee tellen.
Als je parallel aan de hoofddiagonaal naar linksboven loopt en je komt een L-tegel tegen, dan kun je ofwel links ofwel rechts om het hoekpunt lopen. In het eerste geval doorkruis je 0 muren, in het tweede geval 2 muren (eerst de horizontale en dan de verticale); hoe dan ook is het aantal even dus dat maakt voor de pariteit van het totaal aantal muren niet uit, vandaar dat je dat karakter kunt negeren.
Omgekeerd als je b.v. een F-tegel tegenkomt, dan kun je ofwel linksom door de vertikale muur, ofwel rechtsom door de horizontale muur. In elk geval doorkruis je 1 muur.
[ Voor 5% gewijzigd door Soultaker op 10-12-2023 11:48 ]
"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
Die map had ik inderdaad ook zo geparsed, maar er overheen gelezen dat het om een loop ging. Dus heel veel ingewikkelds gedaan zonder resultaat. Na de lunch maar een nieuwe poging.Creepy schreef op zondag 10 december 2023 @ 11:55:
Ik ben nu al helemaal klaar met het schrijven van een parser(en pas net begonnen....)
Ik had de loop gepakt en daarvan een bounding box gemaakt.
Vervolgens gezocht naar potentiële nesten (lees: aaneengesloten vakjes die geen onderdeel zijn van de loop) in die bounding box
Van elk potentieel nest de buitenste randen gepakt.
Stond nog open hoe ik kon bepalen of ik vanuit 1 van die vakjes van zo'n buitenste rand kon ontsnappen.
Daar was ik echt even de draad kwijt, dus ik heb hier even schaamteloos inspiratie opgedaan. Het idee om het aantal muren (van de loop) te tellen dat je doorkruist als je diagonaal naar linksboven of linksonder gaat gebruikt en dat werkt prima.
[ Voor 3% gewijzigd door Mugwump op 10-12-2023 14:42 ]
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Ik zoek vanaf het startpunt eerst een hoekpunt uit, en dan markeer ik de linkerzijde van de looprichting als "buiten" en ga ik de route lopen tot ik rond ben. Tijdens het lopen markeer ik alle punten aan de linkerzijde als "buiten".
Na het lopen veeg ik de route nog even schoon, zodat de routepunten alleen als routepunt aangemerkt zijn, en niet meer als buitenpunt.
Daarna pak ik alle overgebleven buitenpunten, en vanaf daar doe ik een floodfill.
Daarna tel ik alle buitenpunten en binnenpunten, en ik geef de laagste van de 2 terug. Hier doe ik dus wel een aanname dat er meer punten buiten de loop dan erbinnen liggen.
Aanschouw mijn zonde hier.
[ Voor 9% gewijzigd door Remcoder op 10-12-2023 15:18 ]
... en gaat over tot de orde van de dag
Bij deel 2 kwam ik er wel achter dat het wellicht een goed idee was geweest om het node-type van de S-node vast te leggen. In de uitgebreidere voorbeelden kwam ik erachter dat de data iets minder schoon was doordat er mee dan 2 aangrenzende nodes aan de start-node, dus dat vereiste nog even wat extra checks om de juiste twee buren te kiezen.
Daarna de loop-doorbrekingen tellen om te weten of het ingesloten is of niet.
Code kan nog wel wat netter, maar heb nog meer te doen vandaag
Dag 10 - Kotlin
[ Voor 6% gewijzigd door MadEgg op 10-12-2023 15:39 ]
Tja
Dat werkt wel, behalve dat de cycle-lengtes soms gelijk zijn maar de offsets niet.
En dan is ie niet oplosbaar...
gelukkig duurde dit maar een halve dag klooien om beter te leren lezen


Not just an innocent bystander
Deel 2 ben ik nu druk aan het scannen op buizen waar je tussendoor kan kruipen, maar ergens zit nog een foutje......
"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
Van iedere node die niet op de route ligt, heb ik berekend hoe vaak de route op dezelfde x-positie aan de linkerkant verticaal doorkruist en aan de rechterkant vertikaal doorkruist. Ditzelfde heb ik gedaan om te kijken hoe vaak de route op dezelfde y-positie aan de bovenkant en onderkant doorkruist.
Een node valt binnen de route indien het aantal doorkruiste lijnen aan iedere zijde van de node een oneven getal is.
De dubbele gelinkte nodes kwamen van pas om het doorkruisen te bereken, ook omdat er meerdere achtereen volgende nodes op dezelfde lijn kunnen liggen als de lijn waarop je het aantal doorkruisingen wilt testen.
Code komt hopelijk later nog, nadat ik de spaghetti en dubbelingen heb weggerefactord
/edit
[ Voor 11% gewijzigd door JeroenTheStig op 10-12-2023 20:39 ]
https://github.com/CodeEn...3/blob/main/days/Day10.go
[ Voor 16% gewijzigd door Creepy op 10-12-2023 21:21 ]
"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
Dat was een leuke
Time spent: 493.3µs
Relatief simpel op te lossen.
Vervolgens schrijf ik die lijst met offsets om naar een lijst met borders. Dat is ofwel een verticale border (|), ofwel een span van gelijke richting (F..7 of L..J), ofwel een span met omgekeerde richting (F..J of L..7).
Dan loop ik over de borders. Als ik een span van gelijke richting vind, dan voeg ik de lengte toe aan de area. Vind ik daarentegen een verticale border of een span met omgekeerde richting, dan zoek ik een tweede border, waarbij ik spans met gelijke richting negeer. Wat ik dan in totaal bij de area optel is de lengte van linker-offset van de eerste borde t/m de rechter-offset van de rechter border.
Dit geeft de totale area van de hele polygoon. Dan trek ik daar de lengte van het pad van af (die je al nodig had voor deel 1), en dan hou je over alle binnenste tiles.
Het idee achter de borders is als volgt. Elke keer dat je over een rand stapt, ga je van buiten het pad naar binnen het de polygoon en vice versa. Het type borders dat een gebied afsluiten is altijd een verticale border of een span met ongelijke richting. Immers, als je eerst niet in de polygoon zit, en dan een border met gelijke richting tegenkomt, dan zit je daarna nog steeds niet in de polygoon. Alleen de span zelf is dan onderdeel van de polygoon. Zit je al ín de polygoon, dan kun je alle spans met gelijke richting negeren, want je treedt dan niet buiten de polygoon.
Verder werk ik met offsets omdat je nooit een span zal hebben die een begint op de ene regel en eindigt op de volgende regel.
[ Voor 22% gewijzigd door .oisyn op 11-12-2023 01:04 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Of gewoon de opdracht goed had gelezen, dan had je geweten dat er niet eens tekens zijn gedefinieerd voor T-splitsingen. en dat er staat:Soultaker schreef op zondag 10 december 2023 @ 09:45:
Stom van me dat ik niet eerst gecheckt heb of de eenvoudige aanpak werkt. Dat had me heel veel tijd bespaard.
Based on the acoustics of the animal's scurrying, you're confident the pipe that contains the animal is one large, continuous loop.
[ Voor 18% gewijzigd door .oisyn op 11-12-2023 01:14 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Dag 11 in Swift
Goed punt, had ik me letterlijk nog niet gerealiseerd.oisyn schreef op maandag 11 december 2023 @ 01:06:
Of gewoon de opdracht goed had gelezen, dan had je geweten dat er niet eens tekens zijn gedefinieerd voor T-splitsingen

Dag 11 vandaag was niet al te moeilijk.
Case in point: ik heb 10 minuten over deel 1 gedaan (maar daar moet je ook het lezen van het probleem bij meetellen), en daarna minder dan 6 minuten over deel 2, terwijl ik m'n code bijna helemaal moest herschrijven.
Enfin, uiteindelijk is het niet zo ingewikkeld. Oplossing in Python. De Python accumulate functie komt hier goed van pas (al kun je 'm natuurlijk ook eenvoudig zelf implementeren).
Ik denk dat @Friits zich weer kan uitleven door de code te minimaliseren. Daar leent de logica zich wel voor.
Verandert z'n sig te weinig.
FCA schreef op maandag 11 december 2023 @ 07:29:
spoiler:same here, deel 1 met wat gepruts opgelost op een brute force manier. Toen deel 2 dat niet mogelijk bleek, even een minuutje nagedacht, en een simpelere, elegante algemene oplossing (gewoon bijhouden welke rijen/kolommen leeg zijn, en dan over de oorspronkelijke melkwegposities lopen, en bij de posities optellen hoeveel rijen/kolommen er leeg zijn tot die positie). Als ik dat direct had gedaan was.ik waarschijnlijk eerder klaar geweest, zowel met deel 1 als deel 2, i.p.v. lopen hannesen met numpy append, arrays met grootte 0 x iets, reshapen, de hele rataplan.
Dacht in deel twee simpelweg beide intersect counts met de expansionfactor kunnen te vermenigvuldigen, maar dat levert nog niet het gewenste resultaat. In de trein maar even kijken of ik de oorzaak kan vinden zo.
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Je weet dat dit een praktisch onmogelijk probleem is?Mschamp schreef op maandag 11 december 2023 @ 07:34:
spoiler:ik was voorbereid op de kortse afstand om alle galaxies te bezoeken. Viel op zich nog mee vandaag
Waar ik van baal is dat ik een bug introduceerde met mijn expansionrate, die voor deel 1 natuurlijk niet 1 was, maar 2

En je bent al boilerplate aan het schrijven om ergens komende week het halting problem op te lossen?Mschamp schreef op maandag 11 december 2023 @ 07:34:
spoiler:fout ingeschat wat deel 2 ging zijn: ik was voorbereid op de kortse afstand om alle galaxies te bezoeken. Viel op zich nog mee vandaag
[ Voor 38% gewijzigd door Dido op 11-12-2023 07:40 ]
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Zie de edit hier, van dik een week geledenMugwump schreef op maandag 11 december 2023 @ 07:40:
spoiler:hmm ergens een off by 1 en het helpt ook wel om Longs ipv Ints te gebruiken. Ook goeiemorgen.
Dido in "Advent of Code 2023"
Bijna les 1 van AoC, maar niet getreurd, ik denk dat iedereen er wel eens in is getrapt. Sommigen ieder jaar opnieuw

[ Voor 16% gewijzigd door Dido op 11-12-2023 07:45 ]
Yep!Soultaker schreef op maandag 11 december 2023 @ 06:44:
Ik denk dat @Friits zich weer kan uitleven door de code te minimaliseren.
Eigenlijk gelijk aan jouw implementatie, modulo een klein dimensioneel handigheidje.
[ Voor 6% gewijzigd door Friits op 11-12-2023 07:51 ]
aoc-2023-day-11-challenge-1.in: ...77330 ...13428 aoc-2023-day-11-challenge-2.in: ...58190 ...20490 aoc-2023-day-11-challenge-3.in: ...72698 ...83738
Hint: voor de grootste invoerbestanden heb je een efficiënte oplossing nodig. Als mensen interesse hebben kan ik (later) uitleggen hoe dat moet, voor wie er zelf niet uitkomt, want het is een techniek die wel vaker van pas komt, en dus nuttig is om te leren.
edit:
Uitleg hier: snel-met-uitleg.py (spoilers!)
[ Voor 10% gewijzigd door Soultaker op 11-12-2023 20:21 . Reden: Uitleg toegevoegd ]
Dido schreef op maandag 11 december 2023 @ 07:44:
[...]
Zie de edit hier, van dik een week geleden
Dido in "Advent of Code 2023"
Bijna les 1 van AoC, maar niet getreurd, ik denk dat iedereen er wel eens in is getrapt. Sommigen ieder jaar opnieuw
De off-by komt natuurlijk omdat je de eerste lege rij al meetelt in je afstand, dus de vermenigvuldiging is emptyrows (expansionfactor - 1) en de expansionfactor voor part 1 is eigenlijk 2.
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
En dan moet je goed nadenken dat vervangen met 1.000.000 regels natuurlijk betekent dat je 999.999 regels erbij doet...
https://github.com/realma...de.Y2023/Solvers/Day11.cs
There's no place like 127.0.0.1
MatHack schreef op maandag 11 december 2023 @ 08:08:
spoiler:En dan moet je goed nadenken dat vervangen met 1.000.000 regels natuurlijk betekent dat je 999.999 regels erbij doet...
Of je bedenkt dat 1 regel toevoegen hetzelfde is als een regel vervangen door 2 regels.
Die 10, 100, 1000000 uit deel 2 komen dan overeen een 2, en niet een 1 in deel 1
Ja, maar dan moest ik meer in mijn code aanpassen dan ergens een -1
There's no place like 127.0.0.1
MatHack schreef op maandag 11 december 2023 @ 08:18:
[...]
Ja, maar dan moest ik meer in mijn code aanpassen dan ergens een -1
Voor deel 1 geef ik solve(2) mee, voor deel 2 solve(1000000)
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Ik vond het een leuke opdracht!
Nu door met dag 11.
When life gives you lemons, start a battery factory
Nice! Als performance minder belangrijk is kun je 'm zo nog aanzienlijk korter maken, en heb je ook de imports niet meer nodig.Friits schreef op maandag 11 december 2023 @ 07:47:
Yep!
Eigenlijk gelijk aan jouw implementatie, modulo een klein dimensioneel handigheidje.
uiteindelijk wel die matrix gehouden om de lege rijen/kolommen bij te houden en dan de nieuwe posities mee uit te rekenen voor deel 2.
Ook ik heb even lopen kijken waar die one off nou vandaan kwam.

There's no place like 127.0.0.1
Je bent de enige nietMatHack schreef op maandag 11 december 2023 @ 13:11:
Ik kijk nog eens met een frisse blik naar de opdracht van gisteren (dag 10) en zie nu pas dat:
spoiler:Voor het bepalen van een pad ik veels te moeilijk heb gedacht, er zijn helemaal geen aftakkingen in dat pad, zelfs niet vanaf de S... Dan is het vinden van de loop simpel, ik dacht weer veel te moeilijk aan T of + splitsingen...
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Heeft die geen only-path algoritme bedacht dan?.oisyn schreef op maandag 11 december 2023 @ 13:39:
The amount of Dijkstra mentions in this topic is TOO DAMN HIGH.
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Soultaker schreef op maandag 11 december 2023 @ 10:54:
[...]
Nice! Als performance minder belangrijk is kun je 'm zo nog aanzienlijk korter maken, en heb je ook de imports niet meer nodig.
Zelf had ik nog dit idee, maar ik vind die van jou mooier!
Hoe snel draait ie?Friits schreef op maandag 11 december 2023 @ 15:50:
[...]
Zelf had ik nog dit idee, maar ik vind die van jou mooier!
Wie du mir, so ich dir.
Bumpje. Heeft iemand deze data nog geprobeerd op te lossen?Soultaker schreef op maandag 11 december 2023 @ 07:59:
Extra uitdaging voor dag 11: aoc-2023-day-11-challenge-3.zip.
IkSoultaker schreef op maandag 11 december 2023 @ 17:17:
[...]
Bumpje. Heeft iemand deze data nog geprobeerd op te lossen?
[ Voor 3% gewijzigd door MadEgg op 11-12-2023 17:22 ]
Tja
Bij deel 2 was het natuurlijk te verwachten dat dit niet houdbaar was, dus daarna de inhoud van de matrix omgeschreven naar een struct zodat ik bij kon houden of ze onderdeel waren van een lege rij. Het uitrekenen van de lengte is daarna simpel. Ik heb voor deel 2 vooral wat extra moeite gestoken om de tweedimensionale vector om te schrijven naar een ArrayVec, zodat ik de empty cell lookups tenminste in constante tijd kon doen.
Runtime is 175ms. Heb het idee dat het nog wel een stuk efficiënter kan, maar ik vind het wel goed zo.
PS5 PSN: UnrealKazu
Ik gebruik bij dit soort problemen altijd gewoon eenKazu schreef op maandag 11 december 2023 @ 17:25:
Leuke puzzel vandaag! Oplossing in Rust.
spoiler:Deel 1 was zo gedaan. Aangezien ik geen zin had om moeilijk te doen heb ik gewoon de map benaderd als matrix, dus bij het inlezen al meteen de lege rij gedubbeld, daarna getransponeerd en nog een keer de lege rijen gedubbeld.
Bij deel 2 was het natuurlijk te verwachten dat dit niet houdbaar was, dus daarna de inhoud van de matrix omgeschreven naar een struct zodat ik bij kon houden of ze onderdeel waren van een lege rij. Het uitrekenen van de lengte is daarna simpel. Ik heb voor deel 2 vooral wat extra moeite gestoken om de tweedimensionale vector om te schrijven naar een ArrayVec, zodat ik de empty cell lookups tenminste in constante tijd kon doen.
Runtime is 175ms. Heb het idee dat het nog wel een stuk efficiënter kan, maar ik vind het wel goed zo.
[ Voor 3% gewijzigd door DataGhost op 11-12-2023 17:40 ]
Ja, zelfde uitkomst als @MadEgg (daarna moest ik weer voor studie bezig), ik ben wel benieuwd naar je uitleg voor een betere/snellere oplossing.Soultaker schreef op maandag 11 december 2023 @ 17:17:
[...]
Bumpje. Heeft iemand deze data nog geprobeerd op te lossen?
[ Voor 6% gewijzigd door MatHack op 11-12-2023 17:34 ]
There's no place like 127.0.0.1
En replacement voor S hardcoded erin geknalt, geen zin meer om daar een functie voor te schrijven.
Het even-odd principe ook proberen toe te passen maar om een of andere reden kwam daar bij mij geen correct uitwoord uit. Waarschijnlijk deed ik iets heel doms fout.
https://github.com/Werner.../blob/main/day10/day10.ts
Nu eens naar dag 11 kijken.
[ Voor 21% gewijzigd door WernerL op 11-12-2023 17:48 ]
Roses are red, violets are blue, unexpected '{' on line 32.
codeSoultaker schreef op maandag 11 december 2023 @ 07:59:
Extra uitdaging voor dag 11: aoc-2023-day-11-challenge-3.zip. Laatste vijf cijfers van de antwoorden:
aoc-2023-day-11-challenge-1.in: ...77330 ...13428 aoc-2023-day-11-challenge-2.in: ...58190 ...20490 aoc-2023-day-11-challenge-3.in: ...72698 ...83738
Hint: voor de grootste invoerbestanden heb je een efficiënte oplossing nodig. Als mensen interesse hebben kan ik (later) uitleggen hoe dat moet, voor wie er zelf niet uitkomt, want het is een techniek die wel vaker van pas komt, en dus nuttig is om te leren.
Hmm... ben wel benieuwd wat er bij deel 3 nog efficienter kan. Heb nu een O(n log n) algoritme volgens mij (met n het aantal galaxies) algoritme, zie wel een mogelijkheid om er een O(n) algoritme van te maken, maar heel veel zou dat niet mogen schelen?
challenge 1: 0.233s (deel 1+2 samen)
challenge 2: 2.721s (deel 1+2 samen)
challenge 3: deel 1 alleen 1m6.781s. Deel 2 geeft een integer overflow, in Python
challenge 3: deel 2 alleen 1m7.378s
Integer overflow kwam omdat ik de parsing in numpy deed, en hij dus de locaties van de galaxies dus nog numpy integers gebruikte, i.p.v. python integers.
1
| [s]solution_a.py:56: RuntimeWarning: overflow encountered in scalar add[/s] |
update na wat benchmarking: De sortering die ik nodig heb is inderdaad de "bottleneck". Ik zie wel hoe het anders kan, maar dan moet ik de parsen veranderen, en daar heb ik nu even geen zin in

Maar leuke uitdaging, even goed nadenken over hoe het nog efficienter kan
[ Voor 18% gewijzigd door FCA op 11-12-2023 20:11 ]
Verandert z'n sig te weinig.
Leuke uitdaging. Ik heb mijn programmaatje nog wat verder geoptimaliseerd en krijg het antwoord op de derde opgave in ongeveer 0,3 seconde met Rust.Soultaker schreef op maandag 11 december 2023 @ 07:59:
Extra uitdaging voor dag 11: aoc-2023-day-11-challenge-3.zip. Laatste vijf cijfers van de antwoorden:
aoc-2023-day-11-challenge-1.in: ...77330 ...13428 aoc-2023-day-11-challenge-2.in: ...58190 ...20490 aoc-2023-day-11-challenge-3.in: ...72698 ...83738
Hint: voor de grootste invoerbestanden heb je een efficiënte oplossing nodig. Als mensen interesse hebben kan ik (later) uitleggen hoe dat moet, voor wie er zelf niet uitkomt, want het is een techniek die wel vaker van pas komt, en dus nuttig is om te leren.
Hier een O(N) oplossing met (veel) uitleg: snel-met-uitleg.py (spoilers, obviously).MatHack schreef op maandag 11 december 2023 @ 17:34:
Ja, zelfde uitkomst als @MadEgg (daarna moest ik weer voor studie bezig), ik ben wel benieuwd naar je uitleg voor een betere/snellere oplossing.
14 regels code, 114 regels commentaar
Ik heb een O(N) algoritme geïmplementeerd. De gewone versie draait in ongeveer 1.5 seconde, maar dat is >90% parsen. Ik heb een versie die parsen in numpy doet (maar de berekening niet, vanwege integer overlow, zoals je opmerkte) en die doet deel 3 in ~250 ms. Er valt dus nog wel wat te optimaliserenFCA schreef op maandag 11 december 2023 @ 19:39:
Hmm... ben wel benieuwd wat er bij deel 3 nog efficienter kan.
De logica van de drie data sets was:
- Deel 1 is nog te brute forcen.
- Deel 2 vereist een efficiënte oplossing, maar 64-bit integers volstaan (b.v. NumPy of Java zonder BigInts).
- Deel 3 is groter dan deel 2 en vereist bigints of tenminste 128-bit integers.
Denk er nog even over na, dan kom je er waarschijnlijk wel uit! Zoniet, zie dan de link hierboven.Maar leuke uitdaging, even goed nadenken over hoe het nog efficienter kan
Heel goed! De eerste echt efficiënte oplossing denk ik.arnold_m schreef op maandag 11 december 2023 @ 20:08:
Leuke uitdaging. Ik heb mijn programmaatje nog wat verder geoptimaliseerd en krijg het antwoord op de derde opgave in ongeveer 0,3 seconde met Rust.
Het kan nog optimaler door slimmer bij te houden wat er moet expanderen maar dit was al goed genoeg
"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
Bedankt, goed uitgelegd, ik snap het helemaal, maar ik was hier zelf niet opgekomen. Ik heb de meeste van deze zaken wel tijdens een van mijn studies gehad (deels zelfs recentelijk), maar doe in de praktijk hier nauwelijks iets mee, en dan zakt het weg. En zeker het combineren van een aantal zaken was ik niet opgekomen. Dat is deels ook waarom ik AoC zo leuk vind, heb je toch nog een keer wat aan de kennis, en je leert toch nog steeds iets bijSoultaker schreef op maandag 11 december 2023 @ 20:20:
[...]
Hier een O(N) oplossing met (veel) uitleg: snel-met-uitleg.py (spoilers, obviously).
14 regels code, 114 regels commentaarIk hoop dat het duidelijk is hoe het werkt; als er nog vragen zijn, laat dan maar weten.
spoiler:De twee technieken die vaker bruikbaar zijn, zijn het opsplitsen van de berekening in x- en y-coördinaten apart, en het berekenen van de afstanden tussen alle paren van coördinaten in lineaire i.p.v. kwadratische tijd.
There's no place like 127.0.0.1
Grappig, ik had een net iets andere aanpak bedacht:Soultaker schreef op maandag 11 december 2023 @ 20:20:
[...]
Hier een O(N) oplossing met (veel) uitleg: snel-met-uitleg.py (spoilers, obviously).
14 regels code, 114 regels commentaarIk hoop dat het duidelijk is hoe het werkt; als er nog vragen zijn, laat dan maar weten.
spoiler:De twee technieken die vaker bruikbaar zijn, zijn het opsplitsen van de berekening in x- en y-coördinaten apart, en het berekenen van de afstanden tussen alle paren van coördinaten in lineaire i.p.v. kwadratische tijd.
[...]
Ik heb een O(N) algoritme geïmplementeerd. De gewone versie draait in ongeveer 1.5 seconde, maar dat is >90% parsen. Ik heb een versie die parsen in numpy doet (maar de berekening niet, vanwege integer overlow, zoals je opmerkte) en die doet deel 3 in ~250 ms. Er valt dus nog wel wat te optimaliseren
Verandert z'n sig te weinig.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Nice! Ik heb 'm in Kotlin geimplementeerd. Maar voor de grootste dataset moet ik wel uitwijken naar BigIntegers, dat komt de performance alsnog niet ten goede. Doet er alsnog 5.6 seconde over, maar stuk beter dan de urenlange versie eerder waar nog niet eens een antwoord uitkwamSoultaker schreef op maandag 11 december 2023 @ 20:20:
[...]
Hier een O(N) oplossing met (veel) uitleg: snel-met-uitleg.py (spoilers, obviously).
14 regels code, 114 regels commentaarIk hoop dat het duidelijk is hoe het werkt; als er nog vragen zijn, laat dan maar weten.
spoiler:De twee technieken die vaker bruikbaar zijn, zijn het opsplitsen van de berekening in x- en y-coördinaten apart, en het berekenen van de afstanden tussen alle paren van coördinaten in lineaire i.p.v. kwadratische tijd.
Ik denk niet dat ik snel tot deze oplossing was gekomen. Misschien als ervoor betaald werd
[ Voor 4% gewijzigd door MadEgg op 11-12-2023 22:36 ]
Tja
Na initieel de voor de hand liggende aanpak kwam ik ook op zoiets uit.Soultaker schreef op maandag 11 december 2023 @ 20:20:
[...]
Hier een O(N) oplossing met (veel) uitleg: snel-met-uitleg.py (spoilers, obviously).
14 regels code, 114 regels commentaarIk hoop dat het duidelijk is hoe het werkt; als er nog vragen zijn, laat dan maar weten.
spoiler:De twee technieken die vaker bruikbaar zijn, zijn het opsplitsen van de berekening in x- en y-coördinaten apart, en het berekenen van de afstanden tussen alle paren van coördinaten in lineaire i.p.v. kwadratische tijd.
[...]
Ik heb een O(N) algoritme geïmplementeerd. De gewone versie draait in ongeveer 1.5 seconde, maar dat is >90% parsen. Ik heb een versie die parsen in numpy doet (maar de berekening niet, vanwege integer overlow, zoals je opmerkte) en die doet deel 3 in ~250 ms. Er valt dus nog wel wat te optimaliseren
De logica van de drie data sets was:[...]
- Deel 1 is nog te brute forcen.
- Deel 2 vereist een efficiënte oplossing, maar 64-bit integers volstaan (b.v. NumPy of Java zonder BigInts).
- Deel 3 is groter dan deel 2 en vereist bigints of tenminste 128-bit integers.
Denk er nog even over na, dan kom je er waarschijnlijk wel uit! Zoniet, zie dan de link hierboven.
[...]
Heel goed! De eerste echt efficiënte oplossing denk ik.
if steps > 0: distance = (steps - 1) * expansion * path_count + path_count
Dat zijn nogal wat loops in jouw versie die daarvoor nodig zijn, mijn versie is een factor 3 sneller met de challenge 3 file.
resp. 394µs, 7,1ms en 171,5msSoultaker schreef op maandag 11 december 2023 @ 07:59:
Extra uitdaging voor dag 11: aoc-2023-day-11-challenge-3.zip. Laatste vijf cijfers van de antwoorden:
aoc-2023-day-11-challenge-1.in: ...77330 ...13428 aoc-2023-day-11-challenge-2.in: ...58190 ...20490 aoc-2023-day-11-challenge-3.in: ...72698 ...83738
Hint: voor de grootste invoerbestanden heb je een efficiënte oplossing nodig. Als mensen interesse hebben kan ik (later) uitleggen hoe dat moet, voor wie er zelf niet uitkomt, want het is een techniek die wel vaker van pas komt, en dus nuttig is om te leren.
edit:
Uitleg hier: snel-met-uitleg.py (spoilers!)
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Alle oplossingen die door iedereen worden gedeeld kunnen anderen helpen om betere programmeurs te worden, maar dit soort dingen steken er imo wel met kop en schouders bovenuit. Ook al is het python...
Anyone who gets in between me and my morning coffee should be insecure.
.edit: oh wacht ik keek verkeerd, de uitleg is pas 's avonds gepost. Dan heb ik niets gezegd
[ Voor 22% gewijzigd door .oisyn op 12-12-2023 01:48 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Goed man! Ik heb ellendig lang zitten klooien met het bitfucking voor deel A. Nachtjes overslaan doet de concentratie geen goed.Soultaker schreef op dinsdag 12 december 2023 @ 06:13:
Woei! Nummer 8 op het leaderboard van vandaag!
Siditamentis astuentis pactum.
Tweede oplossing (werkend voor testset) is door te bepalen hoeveel # en . ik moet zetten op de plekken van de ? en vervolgens alle permutaties van deze set van ? en . bepalen. Voor elke permutatie vervang ik vervolgens de Xde ? met Xde teken uit de permutatie en test hierna of dit een valide oplossing is voor de gegeven cijfers.
Ik snap dat je # en . ook als 1 en 0 kunt zien en dat dus als binaire getallen gezien kunnen worden, maar ik zie nog niet in hoe me dit kan helpen bij de oplossing.
There's no place like 127.0.0.1
Netjes!Soultaker schreef op dinsdag 12 december 2023 @ 06:13:
Woei! Nummer 8 op het leaderboard van vandaag!
spoiler:Deze keer hielp het om gelijk de efficiënte oplossing te implementeren onder de aanname dat deel 2 hetzelfde zou zijn als deel 1, alleen dan met grotere invoer.
https://github.com/arjand...oc_2023/day12/solution.py
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra

Time spent: 35920.6µs
Good enough
MatHack schreef op dinsdag 12 december 2023 @ 08:41:
Pff... mijn tijd voor vanochtend is op, maar ik ben nog niet eens voorbij deel 1 van vandaagIk heb wel een oplossing die werkt voor de testset (in 300 ms, wat naar mijn mening al te veel is), maar de performance met de echte set is om te huilen.
spoiler:Eerste oplossing was door de groepen te vinden die corrupt waren en dan matching te doen met de gegeven cijfers, maar naar een deel van deze oplossing geschreven te hebben liep ik tegen problemen aan met de herkenning van welke groep wat is, etc.
Tweede oplossing (werkend voor testset) is door te bepalen hoeveel # en . ik moet zetten op de plekken van de ? en vervolgens alle permutaties van deze set van ? en . bepalen. Voor elke permutatie vervang ik vervolgens de Xde ? met Xde teken uit de permutatie en test hierna of dit een valide oplossing is voor de gegeven cijfers.
Ik snap dat je # en . ook als 1 en 0 kunt zien en dat dus als binaire getallen gezien kunnen worden, maar ik zie nog niet in hoe me dit kan helpen bij de oplossing.
[ Voor 6% gewijzigd door .oisyn op 12-12-2023 12:27 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Nog een nabrander van dag 10. In totaal drie of vier keer helemaal herschreven, maar uiteindelijk gehaald dankzij een tip van een collega.
[dag 11]
Bij deel 1 had ik al een vermoeden waar deel 2 heen zou gaan (sleutelwoord: galaxy) dus ik had daar maar een wat nette richting gekozen. Goede keuze, want deel 2 was toen een fluitje van een cent.
[dag 12]
tijd is op.....
... en gaat over tot de orde van de dag
Oh dit is eigenlijk een heel goede observatie! Dat ik had ik me helemaal niet geraliseerd. Je kunt inderdaad het volgende doen:FCA schreef op maandag 11 december 2023 @ 21:40:
[...]
spoiler:Volgens is er trouwens ook een relatie tussen de oplossing van deel 1 en deel 2, waarmee je deel 2 direct zou kunnen berekenen als je deel 1 weet.
y = antwoord met expansion van 1 naar 2 (deel 1 van het probleem)
z = antwoord met expansion van 1 naar 1000000 (deel 2 van het probleem)
Dan geldt: z = x + (y - x)*999999
Dus als je deel 1 hebt opgelost (zelfs met brute force) kun je het antwoord voor deel 2 eenvoudig berekenen, zonder een regel nieuwe code te hoeven schrijven!
Er zijn een aantal variaties op het thema mogelijk. De code die ik postte was vooral ontworpen om zo eenvoudig mogelijk te begrijpen te zijn, niet per se het snelste om uit te voeren.DizzyVacation schreef op maandag 11 december 2023 @ 22:56:
Na initieel de voor de hand liggende aanpak kwam ik ook op zoiets uit.
spoiler:Alleen transleer ik geen coördinaten maar bereken ze aan de hand van de afstand tussen 2 opeenvolgende galaxy coördinaten.
if steps > 0: distance = (steps - 1) * expansion * path_count + path_count
Dat zijn nogal wat loops in jouw versie die daarvoor nodig zijn, mijn versie is een factor 3 sneller met de challenge 3 file.
De eerste versie die ik schreef is deze: fast.py. Die berekent eerst het aantal sterrenstelsels per rij en kolom. De daadwerkelijke berekening in SolveAxis() combineert het vertalen van coördinaten met het sommeren van afstanden, en loopt in O(N), dus O(H + W) voor de rijen én kolommen. Maar omdat het parsen van de invoer noodzakelijkerwijs O(HW) kost, domineert dat de rekentijd voor grote invoer.
Ik heb ook nog een versie die het parsen (het O(HW) deel) met numpy doet wat het geheel behoorlijk sneller maakt: fast-numpy.py.
Bedankt! Fijn om te horen dat het gewaardeerd wordt! Al heb ik dit jaar niet zoveel custom inputs gepost als vorig jaar. (Ik merkte dat mensen afhaken wanneer ze té ingewikkeld worden.)MueR schreef op dinsdag 12 december 2023 @ 00:03:
Eigenlijk vind ik dat we @Soultaker wel een applausje mogen geven voor zijn dagelijkse extra inputs om het moeilijker te maken danwel onze oplossingen te testen, maar ook voor dit soort dingen.
HEE! Dat is wel onze nationale programmeertaal hè!Ook al is het python...
[ Voor 16% gewijzigd door Soultaker op 12-12-2023 12:23 ]
Ik denk dat een hoop mensen dit probleem lastig zullen vinden.
Ik heb in essentie hetzelfde gedaan. (Python code). Voor mensen die zich afvragen hoe dit werkt:MrHaas schreef op dinsdag 12 december 2023 @ 08:42:
spoiler:Ik heb het zelf vandaag met dynamic programming opgelost wat ook direct werkte op deel 2, maar er zijn ws wel betere/snellere methodes:
https://github.com/arjand...oc_2023/day12/solution.py
Er is één randgeval: aan het eind van de string hoef je geen punt toe te voegen (je kunt eindigen met "###", het hoeft niet "###." te zijn). Ik heb dat opgelost door simpelweg een '.' aan het einde van het patroon toe te voegen, wat voor voor het aantal oplossingen niet uit maakt.
Op elk moment heb je twee opties om tussen te kiezen ("." of "###."). Daardoor draait het algoritme in O(N + M + 2Q) tijd per regel, waarbij N de lengte van het patroon is, M het aantal getallen, en Q het aantal vraagtekens in het patroon. Dit werkt goed genoeg voor deel 1, aangezien het maximaal aantal vraagtekens in een patroon 18 is (218 = 262.144, wat niet enorm veel is voor een computer).
Voor deel 2 is de factor 2Q problematisch (18×5 = 90, 290 = 1.237.940.039.285.380.274.899.124.224 wat ietsje pietsje groter is dan je redelijkerwijs kunt bruteforcen). Maar dat is eenvoudig op te lossen met memoization, wat is wat de @cache decorator in Python doet. De Calc() functie heeft twee argumenten: i, de positie in het patroon, en j, de positie in de lijst met getallen, en retourneert het aantal mogelijkheden om het patroon vanaf positie i in te vullen met de getallen vanaf positie j. Het aantal unieke aanroepen is dus hooguit NM, ongeacht het aantal vraagtekens (Q).
De werkelijke complexiteit is iets hoger dan O(NM) omdat de implementatie zelf niet in constante tijd loopt, maar close enough voor de officiële testdata die niet belachelijk groot is.
[ Voor 5% gewijzigd door Soultaker op 12-12-2023 12:58 ]
Day 9 in Python
Dacht hier eerst veel te moeilijk over
Day 10 in Python
Leuke puzzel, had voor deel 2 wel de hint nodig
Day 11 in Python
Ben wel blij dat ik deze gelijk op de juiste manier (
Day 12 in Python
Het kan vast mooier, beter, sneller etc maar deel 2 runt in onder 400ms, dus ik ben tevreden voor nu. Ik blijf dit topic wel in de gaten houden voor wat de rest er van maakt