Me think, why waste time say lot word, when few word do trick.
YoToP schreef op maandag 5 december 2022 @ 08:49:
Mijn Python codespoiler:kan totaal niet omgaan met andere hoogtes of ander aantal stacks. Vanavond maar even afkijkenleren hoe dat gemakkelijk dynamisch kan.
Daarnaast heb je de functie startswith hiermee kan je kijken of een string begint met een bepaald karakter/string. Gebruik dit om te bepalen of een regel info over een move bevat of iets anders bijvoorbeeld.
[ Voor 15% gewijzigd door TrailBlazer op 05-12-2022 09:16 ]
Ik was vrijwel alle tijd kwijt met het parsen van de stacks, het moven daarna was gewoon gebruik maken van de features van Stack.
Uiteindelijk wel een vrij schone, dynamische oplossing gevonden waarmee ik maar 1x over de input heen loop.
Daarnaast ruzie gehad met IntelliJ die het nodig vond om de trailing whitespace automatisch te trimmen.
Leuke puzzel... Baal er wel van dat ik de startpositie van de kratten over moest tikken omdat ik zo snel geen geautomatiseerde manier kon bedenken om die characters in te lezen.
hah.. wij hebben (volgens mij, ik kan/ken geen python) exact dezelfde oplossing gekozen.. geinigbakkerjangert schreef op maandag 5 december 2022 @ 08:29:
Leuke opdracht vandaag. Omdat ik enkele zaken handmatig invul had ik vandaag het meeste moeite met de switch tussen de test input en de echte input. Part 2 was een eitje gezien mijn opzet voor part 1.
Code in python
[ Voor 3% gewijzigd door breew op 05-12-2022 10:01 ]
https://github.com/osxy/A.../AoC2022/AoC/Days/Day5.cs
Code kan nog wel wat netter maar moest aan werkdag beginnen.
"Divine Shields and Hearthstones do not make a hero heroic."
Ja, klopt, vooral omdat het wat langer duurde om de input te parsen 😅.Osxy schreef op maandag 5 december 2022 @ 10:11:
Dag 5 deel 1 was stuk lastiger dan de vorige dagen, deel 2 daarentegen was 2min doordat mijn gebouwde oplossing voor part 1 met 1 minimale aanpassing direct voor deel 2 werkte.
Heb zoals voorgaande dagen het oplossen weer gelivestreamed.
Code & link naar stream zoals altijd in de Mega Solutions Thread
Kan waarschijnlijk stuk korter maar zat teveel in de knoop met de borrow checker van Rust. Mss mezelf daar toch eens wat beter in inlezen
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
TrailBlazer schreef op maandag 5 december 2022 @ 08:53:
[...]
spoiler:Plaatsen van een hekje was genoeg. Apart dat voor het oplossen van deel 2 minder code nodig was
Als je voor het leaderbord gaat wel, maar ik vind het dan weer een uitdaging om code te schrijven die met elke willekeurige input overweg kan.Gropah schreef op maandag 5 december 2022 @ 11:05:
Ik was hier meer tijd kwijt aan het inlezen dan de opdracht zelf.
spoiler:Vond het dan ook wel slim bedacht dat mensen de input gewoon hardcode in hun code
Meestal begin ik daarom ook met een testcase gebaseerd op het voorbeeld, als ik zowel de testcase als de input kan verwerken heb ik meestal een dynamische oplossing te pakken die alle input kan verwerken.
Gropah schreef op maandag 5 december 2022 @ 11:05:
Ik was hier meer tijd kwijt aan het inlezen dan de opdracht zelf.
spoiler:Vond het dan ook wel slim bedacht dat mensen de input gewoon hardcode in hun code
[...]
spoiler:Hangt af van je oplossing. Die van mij in kotlin maakt gebruik van deques voor de enkele verplaatsing. Voor de meerdere verplaatsing kon ik gebruik maken van take. Deques in kotlin kent wel een addAll, maar die zet het achteraan ipv vooraan zoals ik nodig had. Dus moest ik nog wat omgooien
Dag 5 - Python
[ Voor 7% gewijzigd door Diderikdm op 08-12-2022 14:21 ]
Oh, ik zie het ook als een uitdaging die ik op dit moment graag doe omdat ik kotlin wat meer in de vingers wil krijgen. Maar voor de punten had ik het liever even gehardcode, en later de reader gemaakt.Remcoder schreef op maandag 5 december 2022 @ 11:07:
[...]
Als je voor het leaderbord gaat wel, maar ik vind het dan weer een uitdaging om code te schrijven die met elke willekeurige input overweg kan.
Meestal begin ik daarom ook met een testcase gebaseerd op het voorbeeld, als ik zowel de testcase als de input kan verwerken heb ik meestal een dynamische oplossing te pakken die alle input kan verwerken.
TrailBlazer schreef op maandag 5 december 2022 @ 11:10:
[...]
spoiler:In python was het gewoon een kwestie van een slice ter grootte van het aantal containers nemen en plaatsen op de nieuwe stack. Voor deel 1 moest ik die slice reversen voor deel 2 niet. Vooral blij dat ik niet gekozen heb voor een simpele for loop bij deel1 om elk krat een voor een te verplaatsen.
Uiteindelijk zijn deques ook lijsten, maar de aanpak is door API verschillen lichtelijk anders.
En een grotere: aoc_2022_day05_large_input-2.zip (88 MB uitgepakt).
En een derde: aoc_2022_day05_large_input-3.zip (201 MB uitgepakt). Deze bevat meer dan 9 kolommen; de regel met de kolomnummers ("1 2 3 4 5 6 7 8 9" in de originele invoer) heb ik vervangen door nullen.
Tip: met een goed algoritme moet dit in een paar seconden op te lossen zijn, ook in een scripttaal.
De oplossing: je weet 't als je 't weet.
[ Voor 43% gewijzigd door Soultaker op 05-12-2022 21:09 ]
Voor de commando's is regex toch het makkelijkst om te parsen vind ik. Voor het laden van de stacks negeer ik nogal veel delen van de input, zoals de braces en whitespace. Ik heb kijk gewoon naar de positie van de character.
Ok, mijn stomme simpele oplossing werkt hier niet voor, maar wel een leuke uitdaging om te laten werken. Je moet dus grote blokken data kunnen verplaatsen, volgens mij is een LinkedList hier beter voorSoultaker schreef op maandag 5 december 2022 @ 11:52:
Extra uitdaging voor dag 5: aoc_2022_day05_large_input.zip (uitgepakt 6 MB).
Tip: met een goed algoritme moet dit in een paar seconden op te lossen zijn, ook in een scripttaal.
De oplossing: je weet 't als je 't weet.
Ik ga nog even optimaliseren, thanks voor deze input!
[ Voor 41% gewijzigd door Marcj op 05-12-2022 11:57 ]
Oplossing gevonden, maar net onder de 5 minuten.Soultaker schreef op maandag 5 december 2022 @ 11:52:
Extra uitdaging voor dag 5: aoc_2022_day05_large_input.zip (uitgepakt 6 MB).
Tip: met een goed algoritme moet dit in een paar seconden op te lossen zijn, ook in een scripttaal.
De oplossing: je weet 't als je 't weet.
Hier ook de oplossing gevonden, met anderhalve minuut per deelbakkerjangert schreef op maandag 5 december 2022 @ 12:04:
[...]
Oplossing gevonden, maar net onder de 5 minuten.
Gefeliciteerd! Dat is maar 750x trager dan m'n Python oplossingbakkerjangert schreef op maandag 5 december 2022 @ 12:04:
Oplossing gevonden, maar net onder de 5 minuten.
Ok, nog een iets grotere dan: aoc_2022_day05_large_input-2.zip (88 MB uitgepakt).Jellu schreef op maandag 5 december 2022 @ 12:15:
Hier ook de oplossing gevonden, met anderhalve minuut per deel
Deze moet ik maar niet proberen met mn code in huidig format..Soultaker schreef op maandag 5 december 2022 @ 11:52:
Extra uitdaging voor dag 5: aoc_2022_day05_large_input.zip (uitgepakt 6 MB).
En een grotere: aoc_2022_day05_large_input-2.zip (88 MB uitgepakt).
Tip: met een goed algoritme moet dit in een paar seconden op te lossen zijn, ook in een scripttaal.
De oplossing: je weet 't als je 't weet.
Anyone who gets in between me and my morning coffee should be insecure.
Waarom? Regex moet helemaal niet je eerste gedachte zijn IMO. Als je voornamelijk statische strings in je regex hebt staan is dat al een teken dat je vrijwel 0 van de features van de regex-engine gebruikt en dat deze daarom overbodig is.Marcj schreef op maandag 5 december 2022 @ 11:53:
Voor de commando's is regex toch het makkelijkst om te parsen vind ik. Voor het laden van de stacks negeer ik nogal veel delen van de input, zoals de braces en whitespace. Ik heb kijk gewoon naar de positie van de character.
Als je vervolgens je regeltype-checks op de juiste volgorde uitvoert hoef je niet te checken welke regels crates bevatten dus heb je daar ook geen uitgebreide checks voor nodig.
[ Voor 11% gewijzigd door DataGhost op 05-12-2022 13:32 ]
Hmm, ik dacht dat ik door mijn naïeve stringconcatenaties te vervangen door linked lists wel wat snelheid zou vinden, maar dan nog blijf ik op een minuut voor deel 2 en 2 minuten voor deel 1 steken. Maar ik vermoed dat de werkelijke slimmigheid hem zitSoultaker schreef op maandag 5 december 2022 @ 11:52:
Extra uitdaging voor dag 5: aoc_2022_day05_large_input.zip (uitgepakt 6 MB).
En een grotere: aoc_2022_day05_large_input-2.zip (88 MB uitgepakt).
Tip: met een goed algoritme moet dit in een paar seconden op te lossen zijn, ook in een scripttaal.
De oplossing: je weet 't als je 't weet.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Ik heb 't vrij leesbaar en simpel opgelost met JavaScript! Het grote bestand gaat er niet snel door heen, maar de standaard input doet ie alsnog in 1.5ms
https://github.com/Topene...blob/2022/day5/program.js
Soultaker schreef op maandag 5 december 2022 @ 12:22:
[...]
Gefeliciteerd! Dat is maar 750x trager dan m'n Python oplossing
[...]
Ok, nog een iets grotere dan: aoc_2022_day05_large_input-2.zip (88 MB uitgepakt).
DEVSCHUUR
Lezen van de file: 55ms, parsen: 121ms, daarna werkt mijn code met stacks en duurt het wel ff 😅 (1m46s)
Soultaker schreef op maandag 5 december 2022 @ 11:52:
Extra uitdaging voor dag 5: aoc_2022_day05_large_input.zip (uitgepakt 6 MB).
En een grotere: aoc_2022_day05_large_input-2.zip (88 MB uitgepakt).
Tip: met een goed algoritme moet dit in een paar seconden op te lossen zijn, ook in een scripttaal.
De oplossing: je weet 't als je 't weet.
Heb gewerkt met linked lists/deques, wel heel robuust en easy in elkaar te plakken maar nadat ik ff op Soultaker's git hebt gespiekt snap ik ook waarom mijn oplossing zo traag is, veulsteveul operations (eentje voor elke move
Vanavond ook maar ff de mooie versie opschrijven.
Die file van 6MB met header inlezen
Part 1: ca. 136 seconden
Part 2: ca. 60 seconden
Wie du mir, so ich dir.
Niet heel erg tevreden over mijn code, want zou eigenlijk Aggregate willen gebruiken, maar dan zou ik ook een Immutable stack willen gebruiken ( ja ik weet dat die gewoon bestaat ), en voor part 2 een MultiPop/Push, maar geen zin/tijd om het te verbeteren.
Ik denk dat ik dit jaar maar genoegen ga nemen met de quick and easy implementaties
[ Voor 4% gewijzigd door Woy op 05-12-2022 14:18 ]
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Janoz schreef op maandag 5 december 2022 @ 13:32:
[...]
Hmm, ik dacht dat ik door mijn naïeve stringconcatenaties te vervangen door linked lists wel wat snelheid zou vinden, maar dan nog blijf ik op een minuut voor deel 2 en 2 minuten voor deel 1 steken. Maar ik vermoed dat de werkelijke slimmigheid hem zitspoiler:in het achteruit redeneren.
Mijn volgende idee was een stapel te implementeren als een datastructuur (met wat metadata) van meerdere linked lists (initieel 1 maar bij elke move split je). Maar ik was er nog niet uit of dat effectief veel sneller zou zijn na veel permutaties waarbij de linked lists steeds kleiner en kleiner worden... (dan moet je weer een "merger" implementeren om de efficientie te bewaren)
Was een leuke uitdaging: Day 5 - Python
1444.7 ms om de file te lezen en te parsen, 4381.8 ms voor deel 1, 1342.5 ms voor deel 2. Niet slecht voor phpSoultaker schreef op maandag 5 december 2022 @ 11:52:
Extra uitdaging voor dag 5: aoc_2022_day05_large_input.zip (uitgepakt 6 MB).
Anyone who gets in between me and my morning coffee should be insecure.
Slim bedacht, maar de meest efficiënte versie van m'n oplossing heb ik expres nog niet geüpload.Cranzai schreef op maandag 5 december 2022 @ 13:55:
nadat ik ff op Soultaker's git hebt gespiekt snap ik ook waarom mijn oplossing zo traag is
MueR schreef op maandag 5 december 2022 @ 14:25:
1444.7 ms om de file te lezen en te parsen, 4381.8 ms voor deel 1, 1342.5 ms voor deel 2. Niet slecht voor php
Oh, gelukkig, ik begon al te twijfelen. Kon me moeilijk voorstelen dat python array operaties zo extreem veel sneller zouden zijn dan mijn linked list implementatie.Soultaker schreef op maandag 5 december 2022 @ 14:46:
Slim bedacht, maar de meest efficiënte versie van m'n oplossing heb ik expres nog niet geüpload.
Dag 5
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Voel me aangevallenarmageddon_2k1 schreef op vrijdag 2 december 2022 @ 12:45:
Altijd leuk om m’n oplossingen in Kotlin met die van @Hydra te vergelijken.
Ik heb op dit moment geen tijd
https://niels.nu
Was hem net aan het testen en als ik me niet vergis is die langzamer dan mijn oudeSoultaker schreef op maandag 5 december 2022 @ 14:46:
[...]
Slim bedacht, maar de meest efficiënte versie van m'n oplossing heb ik expres nog niet geüpload.
[...]
Als ik hierboven goed begrijp is de hint is dus
Me think, why waste time say lot word, when few word do trick.
Ok, ik heb een kleine optimalisatie gedaan. Compleet ander idee, maar werkt wel erg goed en schaalt ook echt mooi! Deze 6Mb input wordt nu in 55ms verwerkt:Marcj schreef op maandag 5 december 2022 @ 11:53:
[...]
Ok, mijn stomme simpele oplossing werkt hier niet voor, maar wel een leuke uitdaging om te laten werken. Je moet dus grote blokken data kunnen verplaatsen, volgens mij is een LinkedList hier beter voor
Ik ga nog even optimaliseren, thanks voor deze input!
Part 1: GATHERING
Part 2: DEVSCHUUR
Calculated in 0,055 seconds
De nog grotere is maar iets langzamer, maar niet van die mooie woorden:
Part 1: QERVUBOOM
Part 2: HENBLEIFT
Calculated in 0,264 seconds
Voor het idee:
Ik begin nu bij de eindpositie en ga de commando's in omgekeerde volgorde afspelen. Dan hoef ik alleen maar 1 positie bij te houden en dat is de plek van het character waar ik naar op zoek ben. Als alle commando's terug gespoeld zijn heb ik de positie in de originele input die ik zoek.
[ Voor 7% gewijzigd door Marcj op 05-12-2022 15:14 ]
Ik vind persoonlijk de code van mij met deze regex erg begrijpelijk. Een stuk code met string split doe beperkte checks met meer complexiteit in mijn idee.DataGhost schreef op maandag 5 december 2022 @ 13:30:
[...]
Waarom? Regex moet helemaal niet je eerste gedachte zijn IMO. Als je voornamelijk statische strings in je regex hebt staan is dat al een teken dat je vrijwel 0 van de features van de regex-engine gebruikt en dat deze daarom overbodig is.
spoiler:Ik kijk gewoon of de regel begint met "move", dan split ik hem op spatie en daarna pak ik int() van (0-indexed) delen 1, 3 en 5.
Als je vervolgens je regeltype-checks op de juiste volgorde uitvoert hoef je niet te checken welke regels crates bevatten dus heb je daar ook geen uitgebreide checks voor nodig.
Hm, zou wel zo moeten zijn, dus één van ons heeft een bug; ik sluit niet uit dat ik dat ben. Wat het eerste woord zou moeten zijn kun je waarschijnlijk wel raden.Marcj schreef op maandag 5 december 2022 @ 15:03:
De nog grotere is maar iets langzamer, maar niet van die mooie woorden:
Damn it... nu moet ik gaan kijken of er edge-cases zijn die ik misschien vergeten ben. Waarom zouden we er bij de 88Mb versie wel tegenaan lopen, maar bij de 6Mb versie niet?Soultaker schreef op maandag 5 december 2022 @ 15:19:
[...]
Hm, zou wel zo moeten zijn, dus één van ons heeft een bug; ik sluit niet uit dat ik dat ben. Wat het eerste woord zou moeten zijn kun je waarschijnlijk wel raden.
Een idee: heb je toevallig een commando die meer probeert te pakken dan er op een stack zit? Want daar hou ik duidelijk geen rekening mee. Met een iets andere implementatie zou ik dat wel kunnen detecteren, als ik eerst counters bijhoud hoe groot stacks zijn gedurende het proces.
[ Voor 23% gewijzigd door Marcj op 05-12-2022 15:27 ]
Nee, ik heb hem omgecat naar gewoon een string based versie. Voor de 88mb file heeft ie wel wat moeiteSoultaker schreef op maandag 5 december 2022 @ 14:46:
Maar niet met je eerdere oplossing toch? Want ik kan me niet voorstellen dat die zo snel is; je moet er wat fundamenteels aan verbeterd hebben.
Anyone who gets in between me and my morning coffee should be insecure.
Op een i7 3770.
Die file van 6MB met header inlezen
Part 1: ca. 10 seconden (was 136)
Part 2: ca. 4 seconden (was 60)
[ Voor 5% gewijzigd door eheijnen op 05-12-2022 16:11 ]
Wie du mir, so ich dir.
De twee bestanden zouden op dezelfde manier gegenereerd moeten zijn.Marcj schreef op maandag 5 december 2022 @ 15:20:
Damn it... nu moet ik gaan kijken of er edge-cases zijn die ik misschien vergeten ben. Waarom zouden we er bij de 88Mb versie wel tegenaan lopen, maar bij de 6Mb versie niet?
Als het goed is komt dat niet voor (ik check daar wel op in mijn oplossing).Een idee: heb je toevallig een commando die meer probeert te pakken dan er op een stack zit? Want daar hou ik duidelijk geen rekening mee. Met een iets andere implementatie zou ik dat wel kunnen detecteren, als ik eerst counters bijhoud hoe groot stacks zijn gedurende het proces.
Hoe run ik jouw oplossing? Ik heb je git repo geclonet en gradlew build gerunt maar dat geeft een foutmelding tijdens het testen: https://pastebin.com/raw/azJasB21
edit:
Ik heb jouw algoritme (dat trouwens véél eleganter geïmplementeerd was dan de mijne, hoewel het idee erachter hetzelfde is) naar Python geport en dan krijg ik nog steeds de verwachtte uitkomst. Ik heb dus nu twee oplossingen die op de I/O logica na compleet verschillend zijn; ofwel ik heb ergens een bug in de I/O, of ik neig er naar dat jouw oplossing ergens een subtiele bug bevat.
[ Voor 18% gewijzigd door Soultaker op 05-12-2022 16:20 ]
Op Reddit waren ze blij met je grotere inputs; of je die ook voor andere dagen hebt gemaakt 😊 misschien daar even een draadje maken: https://www.reddit.com/r/...utm_name=iossmf&context=3Soultaker schreef op maandag 5 december 2022 @ 12:22:
[...]
Gefeliciteerd! Dat is maar 750x trager dan m'n Python oplossing
[...]
Ok, nog een iets grotere dan: aoc_2022_day05_large_input-2.zip (88 MB uitgepakt).
Met welk type CPU haal jij dit?Marcj schreef op maandag 5 december 2022 @ 15:20:
[...]
Damn it... nu moet ik gaan kijken of er edge-cases zijn die ik misschien vergeten ben. Waarom zouden we er bij de 88Mb versie wel tegenaan lopen, maar bij de 6Mb versie niet?
Een idee: heb je toevallig een commando die meer probeert te pakken dan er op een stack zit? Want daar hou ik duidelijk geen rekening mee. Met een iets andere implementatie zou ik dat wel kunnen detecteren, als ik eerst counters bijhoud hoe groot stacks zijn gedurende het proces.
Wie du mir, so ich dir.
Dank je, ik had dit over het hoofd gezien. Er zat een extra enter in de 88Mb variant, waarvoor ik een trim had toegevoegd, maar deze verwijderde ook wat spaties aan het beginSoultaker schreef op maandag 5 december 2022 @ 15:50:
[...]
De twee bestanden zouden op dezelfde manier gegenereerd moeten zijn.
[...]
Als het goed is komt dat niet voor (ik check daar wel op in mijn oplossing).
Hoe run ik jouw oplossing? Ik heb je git repo geclonet en gradlew build gerunt maar dat geeft een foutmelding tijdens het testen: https://pastebin.com/raw/azJasB21
edit:
Ik heb jouw algoritme (dat trouwens véél eleganter geïmplementeerd was dan de mijne, hoewel het idee erachter hetzelfde is) naar Python geport en dan krijg ik nog steeds de verwachtte uitkomst. Ik heb dus nu twee oplossingen die op de I/O logica na compleet verschillend zijn; ofwel ik heb ergens een bug in de I/O, of ik neig er naar dat jouw oplossing ergens een subtiele bug bevat.
Nu wel een goed resultaat:
Part 1: KERSTBOOM
Part 2: HENKLEEFT
Calculated in 0,289 seconds
Wie du mir, so ich dir.
DataGhost schreef op maandag 5 december 2022 @ 13:30:
spoiler:Ik kijk gewoon of de regel begint met "move", dan split ik hem op spatie en daarna pak ik int() van (0-indexed) delen 1, 3 en 5.
Als je vervolgens je regeltype-checks op de juiste volgorde uitvoert hoef je niet te checken welke regels crates bevatten dus heb je daar ook geen uitgebreide checks voor nodig.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Janoz schreef op maandag 5 december 2022 @ 16:36:
[...]
spoiler:Waarom checken op move? je kunt er toch vanuit gaan dat er, na het inlezen van de stacks, alleen nog maar moves komen?
Voor de 88MB variant haal ik 390ms per part (exclusief inlezen)
Zelfde algoritme als @Marcj, geimplementeerd in Rust op M1 Pro
Deze invoer is ook in enkele seconden op te lossen met een geschikt algoritme, en de invoer is nog niet zo moeilijk als het zou kúnnen zijn.
De uitvoer is ook langer dan 9 karakters. Hierbij alvast de SHA-256 hash van de antwoorden (alleen de letters, geen newline):
334dc3fea65d33eb2475f356fdad3edf39c91f874e87f92eb1189b9603251d81
881993c12f35922a8a8a6ef3fd2ffb6ee20069f52b4e077131eb61dbc70b0001
Elke stack is een string bij mij (bij opbouwen een kwestie van string aanvullen), dus gewoon de meest rechter char als top (part 1). En een langer stuk van rechts voor part 2. Appeltje-eitje.
Oh, en met een string splitter op de spatie pak je de cijfers voor de moves er op index in een keer uit.
[ Voor 8% gewijzigd door Reptile209 op 05-12-2022 19:03 ]
Zo scherp als een voetbal!
Iets meer dan 12 seconden per part nu ongeveer. Heb wel de indruk dat dit nog een stukje trager is dan @Soultaker en @Marcj...Soultaker schreef op maandag 5 december 2022 @ 17:40:
OK, nog een uitdaging voor dag 5: aoc_2022_day05_large_input-3.zip (201 MB uitgepakt). Deze bevat meer dan 9 kolommen; de regel met de kolomnummers ("1 2 3 4 5 6 7 8 9" in de originele invoer) heb ik vervangen door nullen.
Deze invoer is ook in enkele seconden op te lossen met een geschikt algoritme, en de invoer is nog niet zo moeilijk als het zou kúnnen zijn.
De uitvoer is ook langer dan 9 karakters. Hierbij alvast de SHA-256 hash van de antwoorden (alleen de letters, geen newline):en334dc3fea65d33eb2475f356fdad3edf39c91f874e87f92eb1189b9603251d81(en zoals gebruikelijk is het correcte antwoord een “leesbare” tekst).881993c12f35922a8a8a6ef3fd2ffb6ee20069f52b4e077131eb61dbc70b0001
Voor nu maar de witte vlag gehesen
6MB: 4ms
88MB: 73ms
210MB: 266ms
Rust, Apple M1 Pro
https://github.com/Jeroen...2/blob/main/src/day5_2.rs
(code is niet super clean, maar heb weinig zin om alles op te schonen
EDIT: AMD 7950X doet er respectievelijk 2ms, 47ms en 186ms over
[ Voor 10% gewijzigd door Jern_97 op 05-12-2022 22:19 ]
https://github.com/CodeEn...er/aoc/aoc2022/Day05.java
"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://gitlab.com/NetTin...-/blob/main/day5/task1.py
mischien geen fantastische oneliners maar volgens mij best wel clean.
Het is eigenlijk een recursieve oplossing. Wat meer details:Cranzai schreef op maandag 5 december 2022 @ 19:31:
Ugh, kan die slimme oplossing van marcj niet helemaal volgen
Voor nu maar de witte vlag gehesen
Voor elk commando zijn er een 4-tal opties:
1) Het commando heeft iets verplaatst van de huidige stack naar een andere stack. Dat betekent dat hiervoor de index van de character een stuk hoger was, namelijk zoveel als de count van het commando. Er stonden voor dit commando namelijk 'count' andere characters bovenop die verplaatst waren.
2) Het commando verplaatst iets naar een andere stack vanaf een andere stack. Dan veranderd er dus helemaal niks.
3) Er werden characters verplaatst naar deze stack toe, dan zijn er 2 sub-opties:
3a) De index van de huidige character is groter of gelijk dan het aantal die verplaatst zijn, dan zijn er 'count' characters dus verwijderd vanaf deze stack. Dus de index van het character moet verlaagd worden met deze 'count'. Doordat deze altijd kleiner of gelijk is, zal de index nooit minder dan 0 worden.
3b) De index van de huidige character is kleiner dan het aantal die verplaatst zijn, dan is de plek van deze character dus van een andere stack gekomen. Dan gaan we dus de plek op de nieuwe stack berekenen. Deze is voor opgave 1 de omgekeerde plek (dus count - index + 1), maar voor opgave 2 nog simpler, namelijk dezelfde plek.
Als je dit blok voor elk commando uitvoert, dan kom je uiteindelijk bij de startplek uit. Deze kun je eenvoudig uit de tabel aflezen!
Mijn code is blijkbaar hier nog niet leesbaar genoeg voor, misschien kan het nog beter...
Mijn huidige versie doet het nu in 122 seconden, dat lijkt me wat traag. Ik ga nog even kijken wat er beter kan...Soultaker schreef op maandag 5 december 2022 @ 17:40:
OK, nog een uitdaging voor dag 5: aoc_2022_day05_large_input-3.zip (201 MB uitgepakt). Deze bevat meer dan 9 kolommen; de regel met de kolomnummers ("1 2 3 4 5 6 7 8 9" in de originele invoer) heb ik vervangen door nullen.
Deze invoer is ook in enkele seconden op te lossen met een geschikt algoritme, en de invoer is nog niet zo moeilijk als het zou kúnnen zijn.
De uitvoer is ook langer dan 9 karakters. Hierbij alvast de SHA-256 hash van de antwoorden (alleen de letters, geen newline):en334dc3fea65d33eb2475f356fdad3edf39c91f874e87f92eb1189b9603251d81(en zoals gebruikelijk is het correcte antwoord een “leesbare” tekst).881993c12f35922a8a8a6ef3fd2ffb6ee20069f52b4e077131eb61dbc70b0001
edit: van een meer functionele stijl met objecten naar domme int arrays scheelt al een factor 3
[ Voor 4% gewijzigd door Marcj op 05-12-2022 22:07 ]
Dat zou voor mijn oplossing niet werken. Ik gebruik die nummer namelijk om de juiste stack op te halen.Soultaker schreef op maandag 5 december 2022 @ 11:52:
En een derde: aoc_2022_day05_large_input-3.zip (201 MB uitgepakt). Deze bevat meer dan 9 kolommen; de regel met de kolomnummers ("1 2 3 4 5 6 7 8 9" in de originele invoer) heb ik vervangen door nullen.
Hierdoor kan ik ook andere (niet opeenlopende) volgordes aan. Maar dus niet wanneer er meerdere dezelfde kolomnummers zijn.
let the past be the past.
Hmm ik ben dan wel benieuwd waar je dan de extra snelheid uit zou kunnen halen. Want .pop() en .append() zijn O(1) omdat er geen data verschoven hoeft te worden, wat vergelijkbaar is met linked listsYoToP schreef op maandag 5 december 2022 @ 15:01:
oke, ik hang ook rond de 5 minuten met deze code bij de 6MB input
Als ik hierboven goed begrijp is de hint is dus
spoiler:gebruik(in Python) geen arrays, maar bijv. een Linked List.
Maar als ik die code van jouw lees dan worden die objecten per opdracht ook van de ene naar de andere stack verplaatst.Marcj schreef op maandag 5 december 2022 @ 21:37:
[...]
Het is eigenlijk een recursieve oplossing. Wat meer details:
[spoiler]
Om te beginnen redeneren we van achteren naar voren. Dus we beginnen met de plek van de character waar hij eindigt, want we willen weten waar deze character vandaag is gekomen. Bijvoorbeeld de hoogste character van de eerste stack (stackIx = 0, charIx = 0). Daarna ga ik voor elk commando in omgekeerde volgorde deze terugdraaien om uit te vinden welke positie deze character in de originele set had.
.....
Wat ik met .Net heb gevonden:
Ik heb een array van negen list<char> (de stacks)
1
2
3
4
5
| //where to start in the stack nStackStartIndex = stacks[ nFromStack ].Count - nNumToMove; //copy to the "To Stack" stacks[ nToStack ].AddRange( stacks[ nFromStack ].GetRange( nStackStartIndex, nNumToMove ) ); |
De opdracht hierboven waar de elementen aan de "To Stack" worden toegevoegd is de actie die bijna alle tijd opslurpt, ca. 90/95%.
Misschien heeft iemand een idee of daar een ander List<T> achtig ding voor bestaat wat beter uit de was komt?
Wie du mir, so ich dir.
Dan zit je waarschijnlijk naar m'n oude code te kijken, de nieuwe versie doet dit wat slimmers.eheijnen schreef op maandag 5 december 2022 @ 22:29:
[...]
Maar als ik die code van jouw lees dan worden die objecten per opdracht ook van de ene naar de andere stack verplaatst.
Wat ik met .Net heb gevonden:
Ik heb een array van negen list<char> (de stacks)
C#:
1 2 3 4 5 //where to start in the stack nStackStartIndex = stacks[ nFromStack ].Count - nNumToMove; //copy to the "To Stack" stacks[ nToStack ].AddRange( stacks[ nFromStack ].GetRange( nStackStartIndex, nNumToMove ) );
De opdracht hierboven waar de elementen aan de "To Stack" worden toegevoegd is de actie die bijna alle tijd opslurpt, ca. 90/95%.
Misschien heeft iemand een idee of daar een ander List<T> achtig ding voor bestaat wat beter uit de was komt?
Dan kijk ik effe af hoe jij de line met moves stript en split. Veel mooier dan ik het had, ik deed een regular expression, daarna list comprehension, unpacken, en dan nog moest ik de indices voor 'van' en 'naar' met 1 verminderen omdat mijn tellertje bij 0 begon... Nee, dit was niet mijn elegantste werk...YoToP schreef op maandag 5 december 2022 @ 08:49:
Mijn Python codespoiler:kan totaal niet omgaan met andere hoogtes of ander aantal stacks. Vanavond maar even afkijkenleren hoe dat gemakkelijk dynamisch kan.
Ik wilde je een paar puntjes feedback geven die mij opvielen aan je code, maar toen zag ik je GitHub profiel. Shit, als ik een andere master aan het doen was had je mijn docent kunnen zijn, dat voelt niet goedVisitor.q schreef op maandag 5 december 2022 @ 22:49:
Vandaag Day 05 gedaan, het parsen was eigenlijk met name het probleem. Toen dat eenmaal gebeurd was moest ik me nog wel even vastbijten in het index systeem van lists.
***members only***
Edit: ook nog even iets toevoegen aan het topic. Ik heb ze vandaag allemaal in Python ingehaald, toch mijn go-to taal als ik gewoon even snel dingen voor elkaar moet krijgen. Het is voor het eerst dat ik meedoe en dat ik tot aan dag 5 alles met gemak in elkaar zet. Ik herinner me eerdere jaren met een intcode-computer die me helemaal vloerde. Ben benieuwd wat de komende weken gaan brengen
[ Voor 27% gewijzigd door BeefHazard op 05-12-2022 22:56 ]
R6 | 24-70 F2.8 DG OS HSM Art | 18-35 F1.8 DC HSM Art | EF 70-200 F4L IS USM | EF 50mm f/1.8 | Zenbook 14 OLED | T14G4 OLED
In mijn ogen gewoon de feedback geven, niemand is te oud/geleerd om te lerenBeefHazard schreef op maandag 5 december 2022 @ 22:53:
[...]
Ik wilde je een paar puntjes feedback geven die mij opvielen aan je code, maar toen zag ik je GitHub profiel. Shit, als ik een andere master aan het doen was had je mijn docent kunnen zijn, dat voelt niet goed
There's no place like 127.0.0.1
Ga gerust je gang, ik doe dit juist in Python om er wat vloeiender in te worden en er wat routine in te krijgenBeefHazard schreef op maandag 5 december 2022 @ 22:53:
[...]
Ik wilde je een paar puntjes feedback geven die mij opvielen aan je code, maar toen zag ik je GitHub profiel. Shit, als ik een andere master aan het doen was had je mijn docent kunnen zijn, dat voelt niet goed
Ik had al bij iemand gezien hoe de input parsing beter kan (zonder loop of if-statements), en dat met deque/collections veel te doen is.
Heel gaaf die inputSoultaker schreef op maandag 5 december 2022 @ 17:40:
OK, nog een uitdaging voor dag 5: aoc_2022_day05_large_input-3.zip (201 MB uitgepakt). Deze bevat meer dan 9 kolommen; de regel met de kolomnummers ("1 2 3 4 5 6 7 8 9" in de originele invoer) heb ik vervangen door nullen.
Deze invoer is ook in enkele seconden op te lossen met een geschikt algoritme, en de invoer is nog niet zo moeilijk als het zou kúnnen zijn.
De uitvoer is ook langer dan 9 karakters. Hierbij alvast de SHA-256 hash van de antwoorden (alleen de letters, geen newline):en334dc3fea65d33eb2475f356fdad3edf39c91f874e87f92eb1189b9603251d81(en zoals gebruikelijk is het correcte antwoord een “leesbare” tekst).881993c12f35922a8a8a6ef3fd2ffb6ee20069f52b4e077131eb61dbc70b0001
Zit je dan met je i7 12700K, waarvan maar één thread gebruikt wordt.
Eerste keer dat ik meedoe, ben ik ook eigenlijk maar een C# noob, dus leer er sowieso al erg veel van.
Alleen al advanced (voor mij dan) Linq constructies zijn interessant om eens gezien te hebben.
Oké, paar dingen die ik zie dan.Visitor.q schreef op maandag 5 december 2022 @ 23:20:
[...]
Ga gerust je gang, ik doe dit juist in Python om er wat vloeiender in te worden en er wat routine in te krijgenMijn go-to talen zijn Matlab en C/C++, maar dan vooral grootschalig number crunchen en niet zozeer kratjes stapelen
Ik had al bij iemand gezien hoe de input parsing beter kan (zonder loop of if-statements), en dat met deque/collections veel te doen is.
- Let op pep8 (vscode kan hier enorm bij helpen), dingen zoals consequent spaties na komma's en witregels op de juiste plaatsen helpen jezelf enorm. Python is ontworpen vanuit de gedachte je ook tijdens het programmeren meer je eigen code aan het lezen bent dan aan het schrijven.
- Pep8 geldt ook voor hoofdletters en snake_case, al vind ik het voor een chemicus wel passend om variabelen als Nc, Fr, To te maken
- Super cool dat je regex gebruikt, heb ik zelf niet gedaan
- je kunt
8
| for line,n in zip(lines,range(len(lines))): |
Iets meer Pythonic en leesbaarder schrijven als::
8
| for (n, line) in enumerate(lines): |
- de hele moveList-routine tussen lines 10 en 16 kun je uit de grote loop halen als functie en alleen aanroepen als hasInit. Dat soort 'separation of concerns' maakt alles gelijk leesbaarder en maakt het tijdens het ontwikkelen makkelijker om te ontdekken welke dingen wel goed gaan en welke niet. Des te meer je gaat zoeken naar manieren om subroutines die je kan hergebruiken in een aparte function te zetten, des te minder je voor elke dag weer een nieuwe grote loop zit te schrijven. Op een gegeven moment merk je dat je regelmatig (enigszins aangepaste) onderdelen van vorige dagen kan hergebruiken zonder dat ze afhankelijk zijn van alles dat je in de loop van die dag had lopen
R6 | 24-70 F2.8 DG OS HSM Art | 18-35 F1.8 DC HSM Art | EF 70-200 F4L IS USM | EF 50mm f/1.8 | Zenbook 14 OLED | T14G4 OLED
Ongeveer 955 milliseconden in C# op een i5 3570k.Swedish Clown schreef op donderdag 1 december 2022 @ 09:39:
Bonus challenge for those that accept
![]()
***members only***
@P_Tingen ^
@.oisyn Nice, mijn oplossing is een simpele FileStream met een buffer van 1 MB en byte for byte door de buffer heen. Een buffer van 5MB of meer maakte het bij mij weer iets langzamer (30 milliseconden ofzo).
[ Voor 29% gewijzigd door The Fox NL op 06-12-2022 01:00 ]
Mijn 37ms was trouwens op een 5800X.The Fox NL schreef op dinsdag 6 december 2022 @ 00:04:
[...]
Ongeveer 955 milliseconden in C# op een i5 3570k.
@The Fox NL Memory mapped files zijn je vriend
2,5s volledige running timeSoultaker schreef op maandag 5 december 2022 @ 17:40:
OK, nog een uitdaging voor dag 5: aoc_2022_day05_large_input-3.zip (201 MB uitgepakt).
Wat is een "geschikt algoritme"? Ik volg hier gewoon dom alle moves
[ Voor 53% gewijzigd door .oisyn op 06-12-2022 01: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.
Heb je deel 2 (zie hier) geprobeerd?.oisyn schreef op dinsdag 6 december 2022 @ 00:24:
Wat is een "geschikt algoritme"? Ik volg hier gewoon dom alle moves.
Als je in C++ code, moet je eigenlijk alledrie de test cases in (veel) minder dan 1 seconde kunnen oplossen.
Nee ik ben gewoon begonnen met de laatste.
Ik weet wel hoe ik het algo moet verbeteren hoor, maar ik zit met een hele domme implementatie dus al aan de onderkant van de tijden die ik hier lees
.edit: ah ja set 2 heeft ie idd wat meer moeite mee
.edit2: zo'n 200s.
[ Voor 7% gewijzigd door .oisyn op 06-12-2022 01: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.
Ok dit is beter
Set1: 6ms
Set2: 95ms 66ms
Set3: 232ms 122ms
(Dit is dus inclusief alle parsing. Maar wel met de files in m'n cache)
[ Voor 43% gewijzigd door .oisyn op 06-12-2022 03:32 ]
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.
Vandaag was weer een makkelijke dag, en gelukkig was ik weer een keer snel genoeg om punten voor de algemene ranglijst te verdienen (26e/23e).
EDIT: Toch maar een refactor gedaan van mijn oplossing, kortste code tot nu toe...
[ Voor 14% gewijzigd door MatHack op 06-12-2022 07:59 ]
There's no place like 127.0.0.1
Dag 6 - Python
[ Voor 9% gewijzigd door Diderikdm op 08-12-2022 14:21 ]
Dag6 - Python
"Divine Shields and Hearthstones do not make a hero heroic."
Maar hij was makkelijk. Is dit een voorbode voor morgen?
Dag 6 - Python
Weer vrij eenvoudig, maar had toch nog een foutje
[ Voor 9% gewijzigd door Woy op 06-12-2022 09:33 ]
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
https://github.com/marcde...ejonge/advent2022/Day6.kt
Als je echt je algoritme wilt flexen, zul je ook een grotere buffer moeten nemen. Met een size van 14 ga je denk ik niet echt verschil zien tussen een naïve O(N2) en een efficiënte O(1) matcher.dcm360 schreef op dinsdag 6 december 2022 @ 09:15:
Dus, iemand nog zin in een iets grotere invoer?![]()
Ideale puzzel om decompressie-bommen mee te bouwen, dus let er even op dat het laatste bestand na uitpakken iets meer dan 800MB is.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
dag 6 in R
Voor nu snel zat.
[ Voor 18% gewijzigd door breew op 06-12-2022 09:54 ]
Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...
Heel netjes! Ik heb het gevoel dat ik met Set3 de grenzen van de JVM aan het raken ben. Soms doet hij er 40 seconden over, soms 400 seconden. En ik ben er nog niet helemaal achter waarom. Terwijl volgens mij het algoritme heel erg simpel is....oisyn schreef op dinsdag 6 december 2022 @ 02:14:
@Soultaker
Ok dit is beter
Set1: 6ms
Set2: 95ms 66ms
Set3: 232ms 122ms
(Dit is dus inclusief alle parsing. Maar wel met de files in m'n cache)
Misschien toch eens een excuus om Rust of Go to gaan proberen?
[ Voor 6% gewijzigd door Marcj op 06-12-2022 09:38 ]
[ Voor 6% gewijzigd door FrankMennink op 06-12-2022 10:45 . Reden: spoiler tags ]
Voor de 800MB instantie:dcm360 schreef op dinsdag 6 december 2022 @ 09:15:
Dus, iemand nog zin in een iets grotere invoer?![]()
Ideale puzzel om decompressie-bommen mee te bouwen, dus let er even op dat het laatste bestand na uitpakken iets meer dan 800MB is.
Part 1: 85803316
Part 2: 457617684
Time: 1332ms
Ik heb het gevoel dat het waarschijnlijk nog een pak sneller kan...
https://github.com/JeroenGar/advent_of_code_2022/blob/main/src/day6.rs
[ Voor 11% gewijzigd door Jern_97 op 06-12-2022 11:03 ]
https://github.com/Topene...blob/2022/day6/program.js
Voor deel 2 moest ik die implementatie dus heroverwegen, 14 chars met elkaar vergelijken in een if statement wordt nogal een berg spaghetti...
Dus, we bouwen een CountingCollector
Gebruik ervan leidt dan tot deze oplossing