Send me your gameboys
Ik doe iets soortelijk, maar dan leesbaarder.BernardV schreef op donderdag 7 december 2023 @ 15:54:
spoiler:Ik geef de hands geen flags als threeOfAKind, FullHouse, pair etc.
Als je de occurrences hebt, deze vermenigvuldigd met zichzelf en dan de som van de hand pakt kun je goed sorteren.
8822A -> 2 2 1 -> 2*2 2*2 1*1 -> 4 4 1 -> 9
18222 -> 1 1 3 -> 1*1 1*1 3*3 -> 1 1 9 -> 11
etc..
5 dezelfde is 10000000000,
4 dezelfde is 00100000000,
full house is 00000101000, etc.
Voor de ties zet ik alle volgnummers van de kaarten achter elkaar, dus AA245 wordt 14020405 (eigenlijk doe ik weer een 100^).
Dit samen geeft een getal (of string) die ik sorteer.
Strikt gezien kan de eerste helft in base 3 (want max twee pairs) en de tweede helft in base 14 (want 14 kaarten). Maar in base honderd kan je zien wat er gebeurt.
When life gives you lemons, start a battery factory
KabouterSuper schreef op donderdag 7 december 2023 @ 17:06:
[...]
Ik doe iets soortelijk, maar dan leesbaarder.
spoiler:Ik tel per kaart het aantal occurrences. Dan loop ik over deze set en sommeer 100^(occurrences). Dus
5 dezelfde is 10000000000,
4 dezelfde is 00100000000,
full house is 00000101000, etc.
Voor de ties zet ik alle volgnummers van de kaarten achter elkaar, dus AA245 wordt 14020405 (eigenlijk doe ik weer een 100^).
Dit samen geeft een getal (of string) die ik sorteer.
Strikt gezien kan de eerste helft in base 3 (want max twee pairs) en de tweede helft in base 14 (want 14 kaarten). Maar in base honderd kan je zien wat er gebeurt.
Nog een manier om de categorie vast te stellen in c#:
https://controlc.com/f2f8...toolbar=true&linenum=true
Wie du mir, so ich dir.
Ik had eerst 154 regels Java. Dit heb ik teruggeddrongen naar 97 door een handige representatie van een set kaarten te maken, die gewoon alfabetisch te sorteren is. Er zijn dan geen ifjes meer nodig om aantallen paren te tellen en dat soort dingen.P_Tingen schreef op donderdag 7 december 2023 @ 10:10:
Pff, heel wat regels nodig gehad (~200) waarmee het eigenlijk een beetje te veel op werk gaat lijken. Maar goed, toch weer opgelost en eigenlijk ook best elegant. Al kijk ik met verbazing (en afgunst) naar Python oplossingen met 10-20 regels. Hoe dan??
[ Voor 4% gewijzigd door Varienaja op 07-12-2023 18:05 ]
Siditamentis astuentis pactum.
Met alle respect, dat is veul meer code dan ik heb (en het kan nog korter, mooier, pythonischer en sneller)eheijnen schreef op donderdag 7 december 2023 @ 17:40:
@TrailBlazer @KabouterSuper @BernardV
Nog een manier om de categorie vast te stellen in c#:
https://controlc.com/f2f8...toolbar=true&linenum=true
C=Counter(list(cards))
if part2:
C=processJ(C)
rank=990*100**5
for c in C:
rank+=100**C[c]
rank=(rank*100+99)*(100**5)
for i,c in enumerate(list(cards)[::-1]):
rank+=(100**i)*card2num(c,part2)
return rank
[ Voor 3% gewijzigd door KabouterSuper op 07-12-2023 18:28 ]
When life gives you lemons, start a battery factory
https://github.com/WernerLDev/AOC2023/blob/main/day7/day7.ts
Voor deel 2 kon ik niet echt een elegante oplossing bedenken behalve met een rits if-else statements iedere mogelijkheid gaan checken. Vast dat iemand hier daar wel iets beters op gevonden heeft dus zometeen maar eens andere oplossingen bekijken.
Roses are red, violets are blue, unexpected '{' on line 32.
Die array van 13 counts heb ik nog steeds, maar daarnaast heb ik nog een totale rankcounter. Elke keer als ik een van de counts ophoog, dan tel ik de waarde van die count bij de rankcounter.
In pseudo-code:
for c in cards {
rank += ++counts[c];
}
Bij 5-of-a-kind krijg je 1+2+3+4+5 = 15
Bij 4-of-a-kind krijg je 1+2+3+4+1 = 11
Full house: 1+2+3+1+2 = 9
3-of-a-kind: 1+2+3+1+1 = 8
Two pair: 1+2+1+2+1 = 7
Pair: 1+2+1+1+1 = 6
High card: 1+1+1+1+1 = 5
En net als voorheen vermenigvuldig ik de rank met 135 en dat tel ik bij de waarde van de hand op, wat feitelijk een base-13 representatie van de hand is.
In het geval van jokers hou ik daarnaast nog bij wat de maximale count is voor een niet-joker. Dan vermenigvuldig ik het aantal jokers met de maximale count en tel ik dat bij de rank op. Dan krijg je uiteindelijk dezelfde resultaten als hierboven.
Bijvoorbeeld: 333JJ
1+2+3+1+2 = 9
2 jokers, 3 max count, dus 9+2*3 = 15: 5 of a kind
2JJJ7
1+1+2+3+1 = 8
3 jokers, 1 max count, dus 8+1*3 = 11: 4 of a kind
[ Voor 17% gewijzigd door .oisyn op 07-12-2023 21:54 ]
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.
Gezien de opmerkingen in de thread zijn er nog allerlei optimalisaties te doen, maar het draait prima binnen ene paar milliseconden, dus ik laat de code voor wat het is.
https://github.com/realma...de.Y2023/Solvers/Day07.cs
There's no place like 127.0.0.1
En als ik wel even tijd heb, geldt vooral het volgende:
:fill(white):strip_exif()/f/image/F41rjNJodRkcPRQD2amWKWIY.png?f=user_large)
herkenbaar?
lekker laten lopen/loopen en ondertussen koffie halen
Voor nu goed genoeg. Deel 2 is "traag" (lees 2 x keer traag als deel 1, maar 1ms is prima wat mij betreft).
"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
Dan per getal n*n zodat ik een getal heb waarmee ik de eerste sortering kan doen.
Pas bij gelijke waardes ga ik de kaarten los af.
Er zit namelijk ook geen verschil in tussen de waardes van de kaarten waarmee je wint. Een Pair K is niet groter dan een Pair 4.
Ik kan dat doen wanneer ik de Hand aanmaak, maar dat zit nu in de compare functie.
Dus die wordt bij elke vergelijking uitgevoerd ipv eenmalig.
Soit. Het is niet bedrijfskritisch.
[ Voor 14% gewijzigd door SPee op 07-12-2023 23:43 ]
let the past be the past.
[ Voor 9% gewijzigd door CrossProd op 08-12-2023 09:16 ]
Siditamentis astuentis pactum.
Ik had geen deja vu, daarom duurde het bij mij iets langer. Maar een keer dat ik hem doorhad ging het ook vrij vlotjes.Varienaja schreef op vrijdag 8 december 2023 @ 06:56:
Daardoor ben ik vlug op het goede idee gekomen.
Ik had niet eerst 10 minuten moeten wachten om te kijken of brute-force misschien per ongeluk in een enigszins acceptabele tijd een antwoord gaf
* Dido zou beter moeten weten bij AoC
Brute force even aangezet, vaatwasser gaan uitruimen, koffie gepakt en toen ik terugkwam maar besloten dat dit waarschijnlijk niet ging werken.Dido schreef op vrijdag 8 december 2023 @ 07:11:
[...]
Ik had geen deja vu, daarom duurde het bij mij iets langer. Maar een keer dat ik hem doorhad ging het ook vrij vlotjes.
Ik had niet eerst 10 minuten moeten wachten om te kijken of brute-force misschien per ongeluk in een enigszins acceptabele tijd een antwoord gaf
* Dido zou beter moeten weten bij AoC
This Kotlin code defines a class called Instruction which represents an instruction set of some kind. It appears to be related to navigating a network of nodes, as represented by the Node data class which includes a key and references to a left and right node. The Instruction class itself has a directions string, and a map representing the network of nodes.
The Instruction class contains a companion object called Factory which provides two key methods for creating an Instruction object:
The create method takes a list of Strings as input and constructs an Instruction object from it. It uses the first String (trimmed of whitespace) as the directions string and then constructs a nodes network from the remaining strings in the list.
The getNode method, which is a helper method used by create. It takes a String and splits it into parts to create a Node object.
The Instruction class also includes several methods to solve certain problems:
The solve1 method navigates the nodes network starting from a node labeled "AAA". It keeps going left or right depending on the current step and the directions string until it hits a node labeled "ZZZ". It then returns the number of steps it took to reach the target node.
The solve2 method calculates the least common multiple (LCM) of steps needed to reach node from any starting node that ends with 'A' to any target node that ends with 'Z'. The lowestCommonMultiplier overloads facilitate this calculation.
The getStepsForNode is a common helper function used in both solve1 and solve2 to move through the nodes and reach the target based on the provided lambda function.
Als je wilt mierenneuken dan wordt de lambda functie parameter in getStepsForNode niet gebruikt om het doel te bereiken, maar om te bepalen of het doel bereikt is. Maar goed, een kniesoor die daar op let.
Dag 8 in Kotlin
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Yep, dat had ik ook gelijk door.Varienaja schreef op vrijdag 8 december 2023 @ 06:56:
Dag 8 deed me denken aan dag 12 van 2019 :-P
Daardoor ben ik vlug op het goede idee gekomen.
Ghost 1 begint in 11A en gaat in 1 stap naar 11Z
Ghost 2 begint in 22A en gaat in 2 stappen naar 11Z (via 22B oid)
11Z gaat naar 11B, naar 11C, naar 11D, naar 22Z, naar 22B naar 11Z
Omdat ze achter elkaar aanlopen, gaat dit sowieso fout. Maar zelfs als dat niet zo was, duurt het even voordat de ghosts in de loop zitten (11A, 22A en 22B zitten niet in de loop).
En tenslotte komen de ghosts om en om na 2 en 4 stappen op een Z.
When life gives you lemons, start a battery factory
De eerlijkheid gebied te zeggen dat Welsh ook wel zo ongeveer leest als deze set aan nodes.
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Wel eerst even brute force geprobeerd in de ijdele hoop dat dat snel een oplossing zou geven.
https://github.com/realma...de.Y2023/Solvers/Day08.cs
There's no place like 127.0.0.1
Ik had hem niet herkend en zat al te wachten tot hij klaar was met rekenen. Toen het na een seconde of 10 nog niet klaar was had ik al het vermoeden dat brute force niet de weg te gaan was.Varienaja schreef op vrijdag 8 december 2023 @ 06:56:
Dag 8 deed me denken aan dag 12 van 2019 :-P
Daardoor ben ik vlug op het goede idee gekomen.
Nu kon ik mijn gcd en lcm functies van 2019 weer hergebruiken en is hij in 400 ms klaar
Code in Progress 4GL:
https://github.com/patric...ter/2023/Day-08/day-08b.p
... en gaat over tot de orde van de dag
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.
ja..oisyn schreef op vrijdag 8 december 2023 @ 09:56:
Even voor mijn eigen sanity, maar als je voor stap 2 slechts een enkele node volgt (ipv alles wat eindigt op A tegelijk), dan zou je toch wel binnen een redelijke tijd een eindpunt moeten vinden, toch?
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Ja dat was mijn gedachte ook. Dus ik heb een bug maar ik zie 'm niet
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.
Voor jouw beeld, in Kotlin heb ik de gehele oplossing in 32.9ms..oisyn schreef op vrijdag 8 december 2023 @ 09:58:
[...]
Ja dat was mijn gedachte ook. Dus ik heb een bug maar ik zie 'm niet
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
.oisyn schreef op vrijdag 8 december 2023 @ 09:56:
spoiler:Even voor mijn eigen sanity, maar als je voor stap 2 slechts een enkele node volgt (ipv alles wat eindigt op A tegelijk), dan zou je toch wel binnen een redelijke tijd een eindpunt moeten vinden, toch?
.oisyn schreef op vrijdag 8 december 2023 @ 09:58:
Ja dat was mijn gedachte ook. Dus ik heb een bug maar ik zie 'm niet
Hoe bedoel je dat precies? Je hoeft niet alle nodes tegelijkertijd te doorlopen, maar je moet wel alle A-nodes doorlopen. Het netwerk zou wel eens kunnen bestaan uit twee separate grafen..oisyn schreef op vrijdag 8 december 2023 @ 09:56:
Even voor mijn eigen sanity, maar als je voor stap 2 slechts een enkele node volgt (ipv alles wat eindigt op A tegelijk), dan zou je toch wel binnen een redelijke tijd een eindpunt moeten vinden, toch?
When life gives you lemons, start a battery factory
Ja, maar momenteel pak ik als test gewoon even de eerste node die op A eindigt, en dan blijft ie al oneindig lang doorgaanSoultaker schreef op vrijdag 8 december 2023 @ 10:03:
spoiler:Begin je alleen bij nodes die op 'A' eindigen? Als je de lengte van het pad van élk beginpunt probeert te vinden kun je in een oneindige lus terecht komen. Bijvoorbeeld XXX -> (XXX, XXX) is perfect geldig in de invoer.
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.
.oisyn schreef op vrijdag 8 december 2023 @ 10:04:
[...]
Ja, maar momenteel pak ik als test gewoon even de eerste node die op A eindigt, en dan blijft ie al oneindig lang doorgaan
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.
Ik kan alleen bedenken dat je iets heel lulligs doet als per ongeluk case sensitive checks op de 'z' ofzo..oisyn schreef op vrijdag 8 december 2023 @ 10:04:
[...]
Ja, maar momenteel pak ik als test gewoon even de eerste node die op A eindigt, en dan blijft ie al oneindig lang doorgaan. Zo lijkt het althans.
[ Voor 16% gewijzigd door Mugwump op 08-12-2023 10:06 ]
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Voor part 2 gekeken hoeveel J's ik heb in een hand, en de counter voor de meest voorkomende kaart (niet J) daarmee aangevuld. Voor de sort key moet dan de J naar het eind van de reeks, kun je de rest hetzelfde houden.
Werkt het stuk code wat je hebt wel voor AAA?.oisyn schreef op vrijdag 8 december 2023 @ 10:05:
Dat laatste
[ Voor 26% gewijzigd door .oisyn op 08-12-2023 10:11 ]
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.
Zeker niet onoplosbaar, maar ik vraag me af of ik nu niet gewoon veel te ingewikkeld denk.
Vanavond maar mee aan de slag, nu eerst aan het werk.
[ Voor 15% gewijzigd door .oisyn op 08-12-2023 10:56 ]
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.
.oisyn schreef op vrijdag 8 december 2023 @ 10:21:
Het kan aan mij liggen maar dit probleem lijkt me extreem veel complexer dan dat we tot nu toe hebben gezien
[ Voor 43% gewijzigd door Friits op 08-12-2023 10:24 ]
Voorbeeld van hoe het ingewikkelder kan:
Wat ik dan wel weer leuk vond is om uit te vogelen hoe de invoer precies geconstrueerd is. Het is helemaal niet zo eenvoudig om met de relatief kleine invoer een grote uitvoer te garanderen. Hier is hoe het werkt:
De invoergraaf bestaat uit verschillende componenten: precies één voor elk begin- en eindpunt. De component bestaat uit een cykel van paren van vertices. Hier een illustratie:

(Je moet er wraparound bij denken: de uitgaande edges aan de rechterkant zijn verbonden aan de edges aan de linkerkant.)
Een paar saillante details:
- Voor een component met een cykellengte n heb je precies 2n+1 vertices nodig (de vertices aan de rechterkant kun je copy-pasten naar behoeven).
- De begin- en eindvertex hebben dezelfde uitgaande edges. Daardoor werkt de lcm() truc: als je het eerste eindpunt vindt op tijdstip t, dan vind je het ook weer op 2t, 3t, 4t, etc. (@KabouterSuper merkte al op dat dat niet per se zo hoeft te zijn.)
- Vlak voor het einde zit een R-detectie sequence! Dit is wat er voor zorgt dat de lengte van de cykel wordt vermenigvuldigd met de lengte van de instructies: je kunt alleen op ZZZ terecht komen als de laatste vier instructies RRRR waren, wat alleen het geval is aan het einde van de instructies.
Friits schreef op vrijdag 8 december 2023 @ 10:23:
[...]
spoiler:Het algemene probleem is inderdaad een stuk complexer, maar de input heeft een paar eigenschappen waardoor alles eenvoudig wordt.
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.
.oisyn schreef op vrijdag 8 december 2023 @ 10:21:
Het kan aan mij liggen maar dit probleem lijkt me extreem veel complexer dan dat we tot nu toe hebben gezien
spoiler:Ja, ggd/kgv is ook het eerste waar ik aan dacht, maar het probleem van cycles is niet zo simpel. Je zit niet alleen met nodes, maar ook met een herhalende set aan richtingen. Voor een enkele cycle heb je dus een mogelijk unieke aanloop, waar je mogelijk al langs een Z-node komt, dan kom je in de lus met mogelijk meerdere (en zelfs dezelfde) Z-nodes. En dit hele verhaal dus meerdere keren, dus je moet op zoek naar het moment dat ze allemaal tegelijk bij een Z-node aankomen.
Zeker niet onoplosbaar, maar ik vraag me af of ik nu niet gewoon veel te ingewikkeld denk.
Vanavond maar mee aan de slag, nu eerst aan het werk.
Met cycli e.d. zou ik verwachten dat je iets doet als:
- Bereken eerst voor elke beginnode de minimale steps berekent.
- Pak de node met het max van het aantal steps uit dat lijstje. Voor elke andere node bereken je nu een lijstje met opties waarbij steps < steps van de node met het langste pad
- Vervolgens zoek je het minimum van de LCM van alle combinaties van opties
Of denk ik dan te simpel?
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Ik heb hiervoor een check gedaan, zodat ik verder ook geen aannames over de input hoefde te maken..oisyn schreef op vrijdag 8 december 2023 @ 10:30:
[...]
spoiler:Ah ja, ik zie het al. Geen aanloop, je zit meteen in de lus, en de Z-node zit altijd als laatste node in de lus.
DataGhost schreef op vrijdag 8 december 2023 @ 11:08:
[...]
Ik heb hiervoor een check gedaan, zodat ik verder ook geen aannames over de input hoefde te maken.
spoiler:Mijn loop-functie heeft een argument "times" waarmee ik bijv. kan doorlopen totdat ik twee keer een eindnode heb gezien. Als de eerste en tweede loop een verschillend aantal steps hebben gooi ik een exception. Aangezien dat niet gebeurd is, bevestigt dat dat alle routes direct in de loop beginnen zonder aanloop en daarom kan je veilig lcm gebruiken.
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.
Als aanvulling daarop.oisyn schreef op vrijdag 8 december 2023 @ 11:14:
[...]
spoiler:Die assumptie klopt niet. Je kunt op stap N en op stap 2N een eindnode tegenkomen, terwijl je lus mogelijk nog niet eens begonnen is
Dit is precies wat ik doebakkerjangert schreef op vrijdag 8 december 2023 @ 11:21:
spoiler:zelfs als je al 2x dezelfde eind node hebt gevonden op 2N zou je ook nog moeten checken of je op dezelfde positie in de instructie zit. Het zou zomaar kunnen dat je al 2x de eind node hebt gevonden voor het einde van de instructies en dat ie daarna een ander pad gaat volgen.
Idd, dat merkte ik hier ook al opbakkerjangert schreef op vrijdag 8 december 2023 @ 11:21:
[...]
Als aanvulling daarop
spoiler:zelfs als je al 2x dezelfde eind node hebt gevonden op 2N zou je ook nog moeten checken of je op dezelfde positie in de instructie zit. Het zou zomaar kunnen dat je al 2x de eind node hebt gevonden voor het einde van de instructies en dat ie daarna een ander pad gaat volgen.
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.
In Go: https://github.com/mbe81/advent-of-code/tree/main/2023/day08
Mugwump schreef op vrijdag 8 december 2023 @ 10:42:
[...]
spoiler:De data is ook hier inderdaad erg schoon.
Met cycli e.d. zou ik verwachten dat je iets doet als:
- Bereken eerst voor elke beginnode de minimale steps berekent.
- Pak de node met het max van het aantal steps uit dat lijstje. Voor elke andere node bereken je nu een lijstje met opties waarbij steps < steps van de node met het langste pad
- Vervolgens zoek je het minimum van de LCM van alle combinaties van opties
Of denk ik dan te simpel?
Voor elke startnode kun je een lijstje bepalen met het aantal tussenstappen tot elke eindnode op de weg tot aan de eerste eindnode in de lus. Vanaf dan heb je een lijstje met tussenstappen tot elke eindnode binnen de lus. Als je dit gedaan hebt, heb je de graaf zelf niet meer nodig.
Vervolgens kun je deze allemaal nalopen totdat je voor allemaal in de lus zit.
Een relatief naïeve implementatie zal steeds het minimaal aantal stappen tot een van de paden bij de volgende eindnode uitkomt, en dan kijken of alle paden op een eindnode zitten. Een efficiente implementatie moet denk ik de lussen gaan combineren. Twee lussen A en B kunnen worden omgezet in een grotere lus AB, met als tussenstappen elk moment dat zowel A en B op een startnode uitkomen. Deze lus heeft dan maximaal de lengte van de LCM van A en B. Voor het bepalen van de tussenstappen kun je kijken hoeveel stappen lus B opschuift als je voor lus A een volledige lus afloopt. Op basis daarvan kun je bepalen hoe vaak een eindnode van B valt op een eindnode van A.
Met deze grotere lus AB kun je het zelfde doen icm C om een nog grotere lus ABC te maken, net zolang tot je alle lussen met elkaar gecombineerd hebt.
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.
🤣🤣 I was de thread terug aan het lezen... this did not age well 🤣🤣P_Tingen schreef op donderdag 30 november 2023 @ 08:14:
Pff, gelukkig zijn de eerste AoC opgaven wat simpeler om er "in" te komen.....
.oisyn schreef op vrijdag 8 december 2023 @ 11:53:
[...]
spoiler:Ik denk dat je te simpel denkt.
Voor elke startnode kun je een lijstje bepalen met het aantal tussenstappen tot elke eindnode op de weg tot aan de eerste eindnode in de lus. Vanaf dan heb je een lijstje met tussenstappen tot elke eindnode binnen de lus. Als je dit gedaan hebt, heb je de graaf zelf niet meer nodig.
Vervolgens kun je deze allemaal nalopen totdat je voor allemaal in de lus zit.
Een relatief naïeve implementatie zal steeds het minimaal aantal stappen tot een van de paden bij de volgende eindnode uitkomt, en dan kijken of alle paden op een eindnode zitten. Een efficiente implementatie moet denk ik de lussen gaan combineren. Twee lussen A en B kunnen worden omgezet in een grotere lus AB, met als tussenstappen elk moment dat zowel A en B op een startnode uitkomen. Deze lus heeft dan maximaal de lengte van de LCM van A en B. Voor het bepalen van de tussenstappen kun je kijken hoeveel stappen lus B opschuift als je voor lus A een volledige lus afloopt. Op basis daarvan kun je bepalen hoe vaak een eindnode van B valt op een eindnode van A.
Met deze grotere lus AB kun je het zelfde doen icm C om een nog grotere lus ABC te maken, net zolang tot je alle lussen met elkaar gecombineerd hebt.
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Beetje wiskunde ophalen en toen ging het wel weer.
Dag 8 - Kotlin
Tja
Er knaagde ook van alles aan me toen ik de "simpele" oplossing zat te implementeren, inderdaad..oisyn schreef op vrijdag 8 december 2023 @ 10:21:
Het kan aan mij liggen maar dit probleem lijkt me extreem veel complexer dan dat we tot nu toe hebben gezien
Had het gevoel dat het feit dat ik het juiste antwoord bleek te hebben gevonden meer geluk dan wijsheid was.
Maar is dus waarschijnlijk by design. En da's dan wel jammer, aangezien je dus eigenlijk impliciet heel belangrijke aannames moet doen om een sterk vereenvoudigde versie op te lossen van het daadwerkelijk geschetste probleem. Alsof we over een paar dagen een gecompliceerd lulverhaal over de betekenis van het leven, het universum en alles krijgen, met de vraag om het travelling-salesmanprobleem op te lossen. En dat dan het antwoord gewoon 42 is omdat de input daarop is ingericht
Eens. Maar voor hetzelfde geld komt er een vervolg op de vraag waar het wel belangrijk is dat je het netjes geïmplementeerd hebt. De intcode-opdrachten zijn meestal ook verdeeld over meerdere dagen.Dido schreef op vrijdag 8 december 2023 @ 12:18:
[...]
Er knaagde ook van alles aan me toen ik de "simpele" oplossing zat te implementeren, inderdaad.
Had het gevoel dat het feit dat ik het juiste antwoord bleek te hebben gevonden meer geluk dan wijsheid was.
Maar is dus waarschijnlijk by design. En da's dan wel jammer, aangezien je dus eigenlijk impliciet heel belangrijke aannames moet doen om een sterk vereenvoudigde versie op te lossen van het daadwerkelijk geschetste probleem. Alsof we over een paar dagen een gecompliceerd lulverhaal over de betekenis van het leven, het universum en alles krijgen, met de vraag om het travelling-salesmanprobleem op te lossen. En dat dan het antwoord gewoon 42 is omdat de input daarop is ingericht
When life gives you lemons, start a battery factory
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.
... en gaat over tot de orde van de dag
Klopt, ik beklaag me daar hier ook over, maar dat doe ik eigenlijk elk jaar; het hoort een beetje bij Advent of Code.Dido schreef op vrijdag 8 december 2023 @ 12:18:
En da's dan wel jammer, aangezien je dus eigenlijk impliciet heel belangrijke aannames moet doen om een sterk vereenvoudigde versie op te lossen van het daadwerkelijk geschetste probleem.
Overigens kon je een deel van de constraints wel uit de invoer aflezen, bijvoorbeeld:
ZZZ = (VMM, MPF)
Dan zie je dat het begin- en eindpunt dezelfde uitgangspunten hebben, dus dan kun je als hypothese opstellen dat het eindpunt aan het einde van de lus ligt. Dan kijk je verder:
MPF = (MNK, LTH)
VMM = (MNK, LTH)
Hm, die hebben weer dezelfde uitgangspunten. Dan kun je gaan beredeneren dat de graaf bestaat uit een cykel van paren van nodes etc.
Ik zie niet direct hoe dit worst case beter is. Je zegt zelf al dat de gecombineerde lengte worst case gelijk is aan het kleinste gemene veelvoud van de lengte van de invoerlussen. Dan creëer je worst case dus een lus van de lengte die gelijk is aan het antwoord, maar dan had je net zo goed kunnen simuleren..oisyn schreef op vrijdag 8 december 2023 @ 11:53:
Een efficiente implementatie moet denk ik de lussen gaan combineren.
Voor het specifieke geval waarin elke lus afzonderlijk precies 1 eindpunt heeft (maar in tegenstelling tot de opgave, niet per se aan het eind van de lus) dan kun je de Chinese reststelling gebruiken om efficiënt een oplossing te bepalen (wat ook al niet heel eenvoudig is). Maar ik zie niet zo 1-2-3 hoe je een efficiënte oplossing genereert als meerdere geldige eindposities binnen een lus mogelijk zijn.
Dit is ook mijn strategie. Zo snel mogelijk deel 1 eruit rammen, maakt niet uit hoe lelijk het is, en dan eventueel opschonen voor deel 2 als dat nuttig lijkt. En pas nadat ik beide oplossingen correct heb probeer ik ze te integreren in één script.P_Tingen schreef op vrijdag 8 december 2023 @ 12:26:
Ik ben opgehouden met vooruitdenken; deel 2 is toch negen van de tien keer anders dan wat ik denk dat het gaat worden en de kans is groot dat die "nette" oplossing niet nodig is.
[ Voor 12% gewijzigd door Soultaker op 08-12-2023 12:36 ]
Tsja, 's ochtends ga ik voor zo snel mogelijk twee sterren, hoe lelijk, brute force of langzaam (binnen bepaalde grenzen!) het ook is. Daarna gaat de hond naar buiten en ga ik werken. Later maak ik het wel mooi en optimaliseer ik wel.KabouterSuper schreef op vrijdag 8 december 2023 @ 12:22:
Eens. Maar voor hetzelfde geld komt er een vervolg op de vraag waar het wel belangrijk is dat je het netjes geïmplementeerd hebt. De intcode-opdrachten zijn meestal ook verdeeld over meerdere dagen.
Vooruitdenken naar deel 2 tijdens deel 1 doe ik eigenlijk juist door "naief" te coden. Dan hoef ik tenminste niet een half uur later een Linq-expressie van 6 regels te reverse-engineeren omdat ik er op twee plekken een aanpassing in moet maken voor deel 2
Ik denk dat zeker bij degenen die binnen 10 minuten beiden delen afhadden, bijna niemand bewust die aannames gemaakt heeft. Die zien cijfers, (mogelijke) cycles, "iets" gemeenschappelijks en trekken de bibliotheek open..oisyn schreef op vrijdag 8 december 2023 @ 12:23:
@Dido Idd. En daarbij vraag ik me af hoeveel mensen met een oplossing die aanname bewust hebben gemaakt.
Dat zijn vaak ook niet degenen die het beste kunnen uitleggen wat hun software nou precies doet en waarom - maar ze zijn wel snel
Dit!P_Tingen schreef op vrijdag 8 december 2023 @ 12:26:
Ik ben opgehouden met vooruitdenken; deel 2 is toch negen van de tien keer anders dan wat ik denk dat het gaat worden en de kans is groot dat die "nette" oplossing niet nodig is. Ik probeer het wel netjes te doen in de zin van dat het leesbare code moet opleveren, maar ik probeer niet vooruit te plannen, oftewel de First Rule Of Program Optimization
Ik besteed hooguit wat meer tijd aan mooi maken en herbruikbaar maken als ik vrij hoge verwachtingen heb dat wat ik net geschreven heb in volgende dagen weer de kop opsteekt . Dat is ook waarom ik ooit (zoals velen?) begonnen ben met unit tests op alle opdrachten, om te voorkomen dat mijn intcode-interpeter de opdracht van vandaag wel goed uitvoert, maar die van eergisteren opeens verkloot
Ik heb de hoop ook opgegeven dat ik kan voorspellen wat men wil.P_Tingen schreef op vrijdag 8 december 2023 @ 12:26:
Ik ben opgehouden met vooruitdenken; deel 2 is toch negen van de tien keer anders dan wat ik denk dat het gaat worden en de kans is groot dat die "nette" oplossing niet nodig is. Ik probeer het wel netjes te doen in de zin van dat het leesbare code moet opleveren, maar ik probeer niet vooruit te plannen, oftewel de First Rule Of Program Optimization
Al moet ik zeggen dat ik deze keer een redelijk herbruikbare oplossing had uit deel 1.
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Aaaaah, talk me not from de IntCode interpreter. Ik kreeg ergens op de tweede dag of zo in dat ding iets niet goed waardoor de uitkomst van niet alleen die dag niet goed was, maar ik ook met de volgende dagen niet verder kon. Bijzonder frustrerendDido schreef op vrijdag 8 december 2023 @ 12:37:
[...]
Ik besteed hooguit wat meer tijd aan mooi maken en herbruikbaar maken als ik vrij hoge verwachtingen heb dat wat ik net geschreven heb in volgende dagen weer de kop opsteekt . Dat is ook waarom ik ooit (zoals velen?) begonnen ben met unit tests op alle opdrachten, om te voorkomen dat mijn intcode-interpeter de opdracht van vandaag wel goed uitvoert, maar die van eergisteren opeens verkloot
... en gaat over tot de orde van de dag
Ik heb met graphviz een svg gemaakt van transities. (groen = start, rood = end, blauw = r, paars = l)
There's no place like 127.0.0.1
Spoiler voor eerdere jaren:Soultaker schreef op vrijdag 8 december 2023 @ 12:29:
[...]
dan kun je de Chinese reststelling gebruiken om efficiënt een oplossing te bepalen
[ Voor 9% gewijzigd door Lisper op 08-12-2023 13:29 ]
Dat had ik dus ook, en even daar spieken bleek wel een handige zet. Het is niet 1 op 1 hetzelfde probleem vanwege de eigenschappen van de input (die van 2020d3 mocht je iets in vergeten wat nu wel nodig was).
Voor de rest dan weer ruim te lang over deel 2 gedaan omdat ik een typfoutje had gemaakt in
Nice! Hoe heb je dat voor elkaar gekregen met GraphViz? Ik probeerde 'm ook te visualiseren maar de graaf was te groot om te layouten met dot. Heb je een andere tool gebruikt of specifieke opties?Lisper schreef op vrijdag 8 december 2023 @ 13:23:
Voor wie vast zit met day 8 is hier een een hint:
spoiler:het kan helpen om de input to visualizeren.
Ik heb met graphviz een svg gemaakt van transities. (groen = start, rood = end, blauw = r, paars = l)
[Afbeelding]
(Je ziet wel mooi de structuur die ik hier beschrijf.)
Hoewel ik het nu niet zo makkelijk kan testen;
Misschien begrijp ik je verkeerd, maar volgens mij is dat is niet waar? De simulatie kan veel meer stappen bevatten dan het in 1x combineren van de lus met idd de Chinese reststelling*.Soultaker schreef op vrijdag 8 december 2023 @ 12:29:
Ik zie niet direct hoe dit worst case beter is. Je zegt zelf al dat de gecombineerde lengte worst case gelijk is aan het kleinste gemene veelvoud van de lengte van de invoerlussen. Dan creëer je worst case dus een lus van de lengte die gelijk is aan het antwoord, maar dan had je net zo goed kunnen simuleren.
Bijvoorbeeld: lus A heeft 100 stappen, met een oplossing op stap 1. Lus B heeft 101 stappen, met een oplossing op stap 50. Dan kun je dus ofwel 98 keer itereren om een oplossing te vinden, of je rekent gewoon uit dat na 49 lussen van B, de oplossingen van A en B overlappen. En dat dat zich herhaalt na LCM(100,101) stappen. Dus AB is een nieuwe lus met 10100 stappen, en een oplossing na 4999 stappen.
Bij m oplossingen in A en n oplossingen in B heb je maximaal nm overlappende oplossingen in AB. Dus voor elke oplossing in A reken je uit hoeveel stappen het kost om te overlappen met elke oplossing in B, waar mogelijk.
*edit: Wacht, is het wel de Chinese reststelling? Volgens mij wil je het omgekeerde. De oplossingen ai van A kun je schrijven als
n = ai (mod |A|)
En de oplossingen bj van B als
n = bj (mod |B|)
Dan dan zoek je alle nij die voldoen voor elke combinatie van ai en bj
edit2: Ah, brainfart, dat is precies de Chinese reststelling, maar die geldt alleen als gcd(|A|, |B|) = 1, wat geen gegeven is. Maar goed, een stelsel van lineaire congruenties is natuurlijk ook oplosbaar als gcd(|A|, |B|) ≠ 1
[ Voor 31% gewijzigd door .oisyn op 09-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.
Ben ik dan echt de enige die een zeer uitgebreide library heeft?MatHack schreef op vrijdag 8 december 2023 @ 13:25:
Ik steek vooral moeite in het net parsen van de data, over het algemeen heb je die in beide delen nodig. En een beetje copy-paste van deel 1 naar deel 2 ben ik ook niet vies van voor de initiële oplossing.
Ik heb zelfs ooit de moeite genomen om een zeer rudimentaire OCR in te bouwen omdat we ook vaak een tekstwaarde moeten lezen op basis van pixels die aan of uit staan.
Of een Grid waar ik met behulp van een Coordinate heel makkelijk waardes kan ophalen. Waarbij de Coordinate dan ook weer een zwik methodes bevat om neighbours te bepalen.
Of een generieke Dijkstra implementatie waar ik alleen maar een Node implementatie aan mee hoef te geven voor het vinden van een korste pad.
Nee dat denk ik niet. Zelf probeer ik ook zoveel mogelijk in een tools framework te zetten. Grootste uitdaging is elke december weer herinneren wat er al allemaal in zit.Remcoder schreef op vrijdag 8 december 2023 @ 14:58:
[...]
Ben ik dan echt de enige die een zeer uitgebreide library heeft?
Ik heb (lang) niet zoveel als jij. Alleen wat dingen, die serieus tijdbesparend zijn. Het komt erop neer, dat ik eigenlijk alleen een Point class heb. Dat ding wordt steeds weer gebruikt bij AoC. Tot nu toe waren bijvoorbeeld de Dijkstra-implementaties steeds zo verschillend, dat ik nog geen nut heb gezien om het kleine beetje overlap eruit te refactoren.Remcoder schreef op vrijdag 8 december 2023 @ 14:58:
Ben ik dan echt de enige die een zeer uitgebreide library heeft?
Siditamentis astuentis pactum.
Ja, maar in z'n algemeenheid kan er in die lus meer dan 1 toestand een eindtoestand zijn. Super simpel voorbeeld:.oisyn schreef op vrijdag 8 december 2023 @ 14:03:
Bijvoorbeeld: lus A heeft 100 stappen, met een oplossing op stap 1. Lus B heeft 101 stappen, met een oplossing op stap 50. Dan kun je dus ofwel 98 keer itereren om een oplossing te vinden, of je rekent gewoon uit dat na 49 lussen van B, de oplossingen van A en B overlappen. En dat dat zich herhaalt na LCM(100,101) stappen. Dus AB is een nieuwe lus met 10100 stappen, en een oplossing na 4999 stappen.
RLRRLRR AAA -> AAA, ZZZ ZZZ -> AAA, ZZZ
De cykel beginnend met AAA heeft periode 7 en is in de eindtoestand wanneer t=1, 3, 4, 6, 7 (mod 7).
Als je dan twee cykels hebt met meerdere eindtoestanden en de lengtes zijn copriem, dan is de lengte van de gecombineerde cykel het product van de twee cykels, en het aantal eindtoestanden het product van het aantal eindtoestanden van de twee cykels.
En je kunt niet simpelweg alleen de eerste waarde behouden. Bijvoorbeeld als je bovenstaande cykel combineert met een cykel met periode 2 en eindtoestand op t=2, dan is de eerste tijd dat ze beiden in een eindtoestand zijn op t=4; als je alleen t=1 had behouden kom je op t=8 (8 = 1 mod 7 en 8 = 2 mod 2).
Je kunt het probleem reduceren naar het volgende: gegeven N bitstrings s1, s2, .., sN van verschillende lengte, wat is de laagste index i zodat 1 == s1[i % len(s1)] == s2[i % len(s2)] == .. == sN[i % len(sN)]? Dit is algemener dan de AoC probleemstelling, maar ik zie ook niet zo 1-2-3 hoe de AoC versie het probleem fundamenteel eenvoudiger maakt.
Ik heb ook een Coords class, want die wordt in zoveel opgaven gebruikt. En daarnaast nog wat parse helpers oa voor splitten in secties (2 newlines) en lines en daarom nog wat boilerplate classes. Heb nog wel zitten nadenken of ik nog iets voor grafen wil bouwen (Node/Edge classes oid) en daar dan evt. bovenop algoritmes (Dijkstra/AStar/etc.). Wie weet dat ik na deze ronde wel weer eens kijk of ik nog meer wil abstraheren (ook uit oudere opgaves).Remcoder schreef op vrijdag 8 december 2023 @ 14:58:
[...]
Ben ik dan echt de enige die een zeer uitgebreide library heeft?
There's no place like 127.0.0.1
Dat zei ik toch al in mijn vorige post?Soultaker schreef op vrijdag 8 december 2023 @ 15:15:
Als je dan twee cykels hebt met meerdere eindtoestanden en de lengtes zijn copriem, dan is de lengte van de gecombineerde cykel het product van de twee cykels, en het aantal eindtoestanden het product van het aantal eindtoestanden van de twee cykels.
Bij m oplossingen in A en n oplossingen in B heb je maximaal nm overlappende oplossingen in AB. Dus voor elke oplossing in A reken je uit hoeveel stappen het kost om te overlappen met elke oplossing in B, waar mogelijk.
Je moet dus nm oplossingen berekenen. Maar jij stelt dat dat niet slechter is dan simulaties doen. Waarbij ik simuleren zie als het springen naar de eerstvolgende oplossing, en dan kijken of dat punt ook een oplossing is voor de andere lus, misschien dat jij daar andere gedachten over hebt.
De mogelijke oplossingen zijn dan (met |A|<|B| en |AB| = lcm(|A|,|B|):
nij = (bj - ai) / gcd(|A|,|B|) * |B| + bj) (mod |AB|)
Waarbij er geen oplossing is als (bj - ai) ≠ 0 (mod gcd(|A|,|B|))
Nvm, dit klopt niet.
[ Voor 26% gewijzigd door .oisyn op 08-12-2023 16:28 ]
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.
Okee, daar zijn we het dus over eens..oisyn schreef op vrijdag 8 december 2023 @ 15:20:
Dat zei ik toch al in mijn vorige post?
Bij m oplossingen in A en n oplossingen in B heb je maximaal nm overlappende oplossingen in AB. Dus voor elke oplossing in A reken je uit hoeveel stappen het kost om te overlappen met elke oplossing in B, waar mogelijk.
Misschien verschillen we over wat we verstaan onder “efficiënte oplossing”?Maar jij stelt dat dat niet slechter is dan simulaties doen. Waarbij ik simuleren zie als het springen naar de eerstvolgende oplossing, en dan kijken of dat punt ook een oplossing is voor de andere lus, misschien dat jij daar andere gedachten over hebt.
Vergeleken met simpelweg simuleren is het samenvoegen van cykels inderdaad sneller. De simulatie doet er ongeveer O(N × antwoord) over, waarbij antwoord worst case lcm(|A|,|B|,|C|, ...) is. Stel dat in een slechte case ongeveer de helft van alle posities eindposities zijn. Dan reduceert de methode die je beschrijft de complexiteit tot iets als O(antwoord / 2N). Dat is aanzienlijk beter: een speedup van een factor 2N×N. Maar bedenk dat N klein is (N=6 in de officiële testinvoer) dus dan praat je over een speedup van ongeveer 400 (constante factoren negerend).
Dan kun je aan de ene kant zeggen: dat bijna 400 keer zo snel! Aan de andere kant, het is nog steeds niet heel efficient. In de officiële testinvoer was het antwoord ruim 20.000 miljard; als je dat deelt door een factor 400 dan is het nog steeds 50 miljard.
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.
Ik stopte overigens na de eerste Z. Na die getallen in een online LCM calculator te stoppen kreeg ik dat antwoord. Dat werd berekende een priemgetal van 283 en adhv 43, 47, 53, 59, 61, 67, 283.
Vorig jaar heb ik het grootste deel gemaakt met Java en enkele met Rust.Remcoder schreef op vrijdag 8 december 2023 @ 14:58:
[...]
Ben ik dan echt de enige die een zeer uitgebreide library heeft?
Nu ben ik vanaf het begin bezig in Rust. Dus ik heb nog geen library opgebouwd.
let the past be the past.
Oplossing: https://github.com/WernerLDev/AOC2023/blob/main/day8/day8.ts
Ik hoop niet dat dit het niveau gaat zijn vanaf nu want denk niet dat ik het dan tot dag 25 ga halen..
[ Voor 11% gewijzigd door WernerL op 08-12-2023 19:18 ]
Roses are red, violets are blue, unexpected '{' on line 32.
Uiteindelijk met neato plus wat opties, zie: https://github.com/ChrisB...023/day08.clj#L104-L121C7Soultaker schreef op vrijdag 8 december 2023 @ 13:54:
[...]
Nice! Hoe heb je dat voor elkaar gekregen met GraphViz? Ik probeerde 'm ook te visualiseren maar de graaf was te groot om te layouten met dot. Heb je een andere tool gebruikt of specifieke opties?
(Je ziet wel mooi de structuur die ik hier beschrijf.)
Meestal probeer ik grote grafen eerst met sfdp, daar is dot te langzaam voor.
Deel 1 was snel gefixt.
"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
Ik had ook iets verwacht in de trend van "hoeveel mogelijke paden zijn er" of zo, maar deze deel 2 leek uiteindelijk ook bedrieglijk eenvoudigTrailBlazer schreef op vrijdag 8 december 2023 @ 17:23:
Ben ik de enige die licht teleurgesteld was dat deel 2 niet een klassiek pathfinding ding was.
spoiler:Geen idee hoe je een lcm uitrekent maae even googlen gaf me de oplossing zo
... en gaat over tot de orde van de dag
Don't worry, we krijgen vast nog wel een Dijkstra/DFS/BFSTrailBlazer schreef op vrijdag 8 december 2023 @ 17:23:
Ben ik de enige die licht teleurgesteld was dat deel 2 niet een klassiek pathfinding ding was.
spoiler:Geen idee hoe je een lcm uitrekent maae even googlen gaf me de oplossing zo
Time spent: 326.8µs
day8 in Rust
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.
Ik probeer eigenlijk er een sport van te maken alles vanaf 0 te maken elk jaar. Dit jaar ook een andere taal (go ipv java) gepakt. Het zijn leuke opdrachten en je leert er weer van. Ja ik heb zojuist echt niet voor het eerstRemcoder schreef op vrijdag 8 december 2023 @ 14:58:
[...]
Ben ik dan echt de enige die een zeer uitgebreide library heeft?![]()
Ik heb zelfs ooit de moeite genomen om een zeer rudimentaire OCR in te bouwen omdat we ook vaak een tekstwaarde moeten lezen op basis van pixels die aan of uit staan.
Of een ....
Of een generieke ...
"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
Dag 9 in Swift
[ Voor 26% gewijzigd door CrossProd op 09-12-2023 06:41 ]
There's no place like 127.0.0.1
Aah oplossing al op reddit gevonden stom van me
samengevat ik ben een enorme prutser die eerste kolom is gewoon een meetwaarde geen idee waarom ik dacht dat het een speciaal ding was.
[ Voor 51% gewijzigd door TrailBlazer op 09-12-2023 13:25 ]
Mijn oplossing: https://github.com/WernerLDev/AOC2023/blob/main/day9/day9.ts
En heb bij deze mijn persoonlijk record verbroken. Ik heb nu één ster meer dan de vorige keer dat ik mee deed aan Advent of code.
[ Voor 39% gewijzigd door WernerL op 09-12-2023 08:51 ]
Roses are red, violets are blue, unexpected '{' on line 32.
Maar nee, gewoon dom brute forcen is ook nog steeds een kwestie van milliseconden.
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Ik heb een Python-oplossing die dit in 500 ms uitrekent. De correcte antwoorden zijn van de vorm: 37557...60469 en 10610...69740 respectievelijk.
Let op: de antwoorden zijn grote getallen. Als je een taal gebruikt zonder BigInt library of iets dergelijks, maak ik de uitdaging iets anders: bereken alleen de laatste 9 cijfers van elk antwoord. Als straf vermenigvuldig ik je oplossingstijd dan mentaal met 10
Ik had niet gelijk verwacht dat dit zou werken, maar gewoon geprobeerd en het was het juiste antwoord
Honda CB750 Hornet :: Yamaha Fazer FZ6 SA (2011 - 2023) | F1Pool.net
Voor dag 9 deel 2 bestond de helft van de tijd de beschrijving nog een paar keer lezen, op zoek naar het addertje onder het gras wat er niet zat
Geen goede score, want in het weekend sta ik niet om 6 uur hiervoor op
Verandert z'n sig te weinig.
Deze voldoet strikt genomen niet aan de omschrijving van de puzzel volgens mij: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. De correcte antwoorden zijn van de vorm: 37557...60469 en 10610...69740 respectievelijk.
Let op: de antwoorden zijn grote getallen. Als je een taal gebruikt zonder BigInt library of iets dergelijks, maak ik de uitdaging iets anders: bereken alleen de laatste 9 cijfers van elk antwoord. Als straf vermenigvuldig ik je oplossingstijd dan mentaal met 10
en de eerste regel heeft niet genoeg elementen om alles tot 0 te reduceren als ik het goed heb (je houd 1 niet-0 element over aan het einde).If that sequence is not all zeroes, repeat this process
Voor wat het waard is: mijn numpy implementatie krijgt de correcte antwoorden als ik afbreek bij lengte 1 (met "int objects" in de array, zodat we arbitrary length integers hebben) en doet 10.8 sec over deze input.
[ Voor 9% gewijzigd door FCA op 09-12-2023 10:48 ]
Verandert z'n sig te weinig.
Haha, briljant.torx schreef op zaterdag 9 december 2023 @ 09:23:
Ik heb de code voor deel 2spoiler:niet bijgewerkt, maar gewoon de invoerwaarden omgedraaid voor elke regel.
Ik had niet gelijk verwacht dat dit zou werken, maar gewoon geprobeerd en het was het juiste antwoord
When life gives you lemons, start a battery factory
:strip_exif()/f/image/XhGVlAInKFsOhB1cw22o2WTx.jpg?f=fotoalbum_large)