Soultaker schreef op vrijdag 22 december 2023 @ 14:37:
Extra testinvoer voor dag 22:
- challenge-1.txt: OK 22s 2,6s.
- challenge-2.txt: OK 1070s.
- challenge-3.txt: Geen zin om zo lang te wachten.
Siditamentis astuentis pactum.
Dit topic is onderdeel van een reeks. Ga naar het meest recente topic in deze reeks.
Soultaker schreef op vrijdag 22 december 2023 @ 14:37:
Extra testinvoer voor dag 22:
Siditamentis astuentis pactum.
Ah ja, zou kunnen dat dat dag 20 was. We hebben ook nog maar 2½ dag te gaan dus een hele set van puzzels zoals met IntCode zit er sowieso niet in.Remcoder schreef op vrijdag 22 december 2023 @ 14:31:
Mmh, ik vond dag 20 wel redelijk in die categorie vallen, vooral omdat je daar voor deel 2 wel echt de input moest analyseren zoals wel vaker gebeurt bij de instructie-set puzzels.
Niet slecht! Ik moest mijn oorspronkelijke oplossing ook aanzienlijk verbeteren om deze problemen op te kunnen lossen (zonder optimalisaties doet 'ie net challenge-1.txt in 1 minuut). Het is ook de bedoeling om je een beetje uit te dagen je oplossing sneller en meer solide te maken, en zoals je terecht opmerkt, zijn er bij dit probleem veel plekken waar je makkelijk veel snelheidswinst kunt behalen. Dat maakt het een leuk probleem naar mijn mening.Varienaja schreef op vrijdag 22 december 2023 @ 17:45:Eerst ging mijn oplossing stuk. Er zat nog een domme typefout in. Daarna heb ik de boel versneld door de baksteen met zijn stukje vloer te vergelijken ipv de hele vloer met de baksteen. Daardoor kon ik challenge 1 überhaupt in eindige tijd uitvoeren. Zo te zien valt er nog vééééél meer te optimaliseren.
- challenge-1.txt: OK 22s 2,6s.
- challenge-2.txt: OK 1070s.
- challenge-3.txt: Geen zin om zo lang te wachten.
Het schaalt momenteel in ieder geval mooi kl*te met het aantal bakstenen.
[ Voor 16% gewijzigd door Soultaker op 22-12-2023 18:35 ]
Challenge 1 werkt (nadat ik eerst deel 1 een stuk sneller had gemaakt, niet meer 1 per keer droppen, maar netjes bijhouden hoever je naar beneden kunt vallen en direct daar neer zetten). Had eerst nog een off-by-one error in deel 2 die ik blijkbaar niet triggerde in de officiele invoer. Tijd voor challenge 1 is niet geweldig, 40,4 s.Soultaker schreef op vrijdag 22 december 2023 @ 14:37:
Extra testinvoer voor dag 22: aoc-2023-day-22-challenge-1-to-3.zip
Correcte antwoorden modulo 97:Referentietijden in Python: 0,3 s, 1,7 s, 12 s.
- challenge-1.txt: 67 (deel 1), 7 (deel 2).
- challenge-2.txt: 1 (deel 1), 20 (deel 2).
- challenge-3.txt: 85 (deel 1), 83 (deel 2).
@FCA: werkt jouw oplossing op deze testdata? Hoe snel runt 'ie?
[ Voor 13% gewijzigd door FCA op 22-12-2023 20:36 ]
Verandert z'n sig te weinig.
Dag 25 is meestal relatief simpel (en sowieso maar 1 deel). Maar een cellular automaton zou best kunnen voor morgen of overmogen! Iedereen heeft zijn Hashlife implementatie klaar hoop ik?Asgardian28 schreef op vrijdag 22 december 2023 @ 20:08:
We hebben ook nog geen game of life puzzel gehad. Of zou dat dag 25 worden?
Ah, jammer. Op basis van je beschrijving vermoedde ik dat je een meer geavanceerd algoritme had geïmplementeerd.FCA schreef op vrijdag 22 december 2023 @ 20:20:
Challenge 1 werkt (nadat ik eerst deel 1 een stuk sneller had gemaakt, niet meer 1 per keer droppen, maar netjes bijhouden hoever je naar beneden kunt vallen en direct daar neer zetten). Had eerst nog een off-by-one error in deel 2 die ik blijkbaar niet triggerde in de officiele invoer. Tijd voor challenge 1 is niet geweldig, 40,4 s.
Challenge 2 gooit een OOM bij het alloceren van de initiele array voor de posities
Ja, ik begin dat ook wel zat te wordenMisschien ga ik eens van de kerstvakantie wat optimaliseren, maar voor vandaag houd ik het voor gezien, elke dag om 6 uur opstaan bouwt de vermoeidheid aardig op.
[ Voor 23% gewijzigd door .oisyn op 22-12-2023 23:44 ]
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 heb van mijn statische array even een hashmap gemaakt zodat ik iig je challenges kan runnen, maar ik krijg voor deel 2 de juiste antwoorden, terwijl ik voor deel 1 iets anders krijg (resp. 74 en 2)Soultaker schreef op vrijdag 22 december 2023 @ 14:37:
Extra testinvoer voor dag 22: aoc-2023-day-22-challenge-1-to-3.zip
Correcte antwoorden modulo 97:Referentietijden in Python: 0,3 s, 1,7 s, 12 s.
- challenge-1.txt: 67 (deel 1), 7 (deel 2).
- challenge-2.txt: 1 (deel 1), 20 (deel 2).
- challenge-3.txt: 85 (deel 1), 83 (deel 2).
@FCA: werkt jouw oplossing op deze testdata? Hoe snel runt 'ie?
1
| bricks ((72, 83, 758), (72, 83, 792)) and ((59, 83, 787), (92, 83, 787)) overlap |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| bricks ((72, 83, 758), (72, 83, 792)) and ((59, 83, 787), (92, 83, 787)) overlap bricks ((72, 54, 1848), (72, 54, 1881)) and ((65, 54, 1852), (97, 54, 1852)) overlap bricks ((72, 53, 2673), (72, 92, 2673)) and ((56, 62, 2673), (99, 62, 2673)) overlap bricks ((78, 73, 2896), (78, 73, 2942)) and ((78, 62, 2913), (78, 75, 2913)) overlap bricks ((73, 70, 2912), (73, 93, 2912)) and ((73, 79, 2912), (73, 79, 2900)) overlap bricks ((56, 80, 5671), (56, 80, 5698)) and ((56, 53, 5684), (56, 103, 5684)) overlap bricks ((89, 66, 6167), (89, 86, 6167)) and ((65, 78, 6167), (92, 78, 6167)) overlap bricks ((53, 82, 6293), (53, 82, 6336)) and ((53, 68, 6318), (53, 114, 6318)) overlap bricks ((60, 63, 7124), (60, 63, 7128)) and ((60, 56, 7125), (60, 71, 7125)) overlap bricks ((97, 87, 7134), (97, 87, 7180)) and ((97, 59, 7172), (97, 98, 7172)) overlap bricks ((94, 73, 7241), (94, 73, 7285)) and ((66, 73, 7265), (98, 73, 7265)) overlap bricks ((87, 73, 7250), (87, 73, 7288)) and ((66, 73, 7265), (98, 73, 7265)) overlap bricks ((82, 62, 7882), (82, 62, 7901)) and ((82, 60, 7883), (82, 101, 7883)) overlap bricks ((95, 57, 7916), (95, 106, 7916)) and ((95, 58, 7916), (95, 58, 7931)) overlap bricks ((89, 78, 8251), (89, 78, 8271)) and ((89, 77, 8263), (89, 97, 8263)) overlap bricks ((58, 69, 8326), (95, 69, 8326)) and ((63, 69, 8326), (63, 69, 8280)) overlap bricks ((57, 99, 9362), (57, 99, 9406)) and ((57, 99, 9363), (74, 99, 9363)) overlap bricks ((89, 65, 10702), (89, 112, 10702)) and ((72, 86, 10702), (98, 86, 10702)) overlap bricks ((78, 64, 11139), (78, 64, 11163)) and ((78, 51, 11152), (78, 69, 11152)) overlap bricks ((54, 90, 11493), (54, 90, 11537)) and ((52, 90, 11536), (75, 90, 11536)) overlap bricks ((85, 52, 12515), (85, 52, 12537)) and ((68, 52, 12532), (85, 52, 12532)) overlap bricks ((85, 100, 14102), (85, 100, 14134)) and ((67, 100, 14126), (117, 100, 14126)) overlap |
[ Voor 63% gewijzigd door .oisyn op 23-12-2023 02:52 ]
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.
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.
D'oh! Je hebt gelijk, dat was niet mijn bedoeling. Er zat een fout in 1 van de 3 generatoren (elke invoer heeft een andere structuur). Bedankt voor het melden!.oisyn schreef op zaterdag 23 december 2023 @ 00:47:
.edit2: ah, je hebt een foutje in je data. Heb even een test ingebouwd.
code:
1 bricks ((72, 83, 758), (72, 83, 792)) and ((59, 83, 787), (92, 83, 787)) overlap
[..]
Ook heb je heel veel negatieve z-coordinaten er in staan. Dat lijkt me onjuiste data, want de puzzel tekst heeft het erover dat de grond zich op z=0 bevindt, dus dan zouden er stenen door de grond zijn gezakt.
Siditamentis astuentis pactum.
[ Voor 18% gewijzigd door FCA op 23-12-2023 09:46 ]
Verandert z'n sig te weinig.
Are you sure? Ik krijg andere antwoorden (waarvan ik 99,999% zeker ben dat deel 1 iig correct is)Soultaker schreef op zaterdag 23 december 2023 @ 08:37:
Hier is een nieuwe versie: challenge-1-r1.txt. Correcte antwoorden zijn 54 en 24 modulo 97.
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 denk het... Ik gaf het antwoord modulo 97 he, niet simpelweg de laatste twee cijfers..oisyn schreef op zaterdag 23 december 2023 @ 09:35:
Are you sure? Ik krijg andere antwoorden (waarvan ik 99,999% zeker ben dat deel 1 iig correct is)
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, hier is mijn debug uitvoer. Wijs maar een blok aan dat ik ten onrechte heb gemarkeerd als “NOT safe to remove”
Ik was vanochtend ook helemaal niet wakker (nu nog nauwelijks) en heb ontzettend zitten prutsen. Sterker nog, de aanpak die jij beschrijft had ik al bij deel 1 gebruikt (wat natuurlijk volslagen overkill was, dom!) en dan zou je denken: dan was deel 2 zeker makkelijk. Ja, ware het niet dat ik op de een of andere manier bedacht had datFCA schreef op zaterdag 23 december 2023 @ 09:29:
spoiler:Recursief op de versimpelde graaf blijkt te werken. Nog steeds niet snel (het blijft brute-force), maar de graaf heeft nog maar 36 edges, dan gaat het blijkbaar net (net even gecheckt: 1.262.816 unieke paden om te checken, maar er zijn natuurlijk nog veel meer doodlopende/in zichzelf kerende paden)
BTW: mijn gereduceerde graaf:
[Afbeelding]
[ Voor 23% gewijzigd door Soultaker op 23-12-2023 19:42 ]
Ik kwam deze observatie tegen dat dag 21 juist de cellular automaton opdracht was. Ik zie best wat die daar bedoelt.Soultaker schreef op vrijdag 22 december 2023 @ 20:48:
[...]
Dag 25 is meestal relatief simpel (en sowieso maar 1 deel). Maar een cellular automaton zou best kunnen voor morgen of overmogen! Iedereen heeft zijn Hashlife implementatie klaar hoop ik?
Ah nice catch.Remcoder schreef op zaterdag 23 december 2023 @ 11:33:
[...]
Ik kwam deze observatie tegen dat dag 21 juist de cellular automaton opdracht was. Ik zie best wat die daar bedoelt.
Gefeliciteerd!Asgardian28 schreef op zaterdag 23 december 2023 @ 12:20:
Ik heb vandaag met 112e mn beste klassering gehaald!
Maar dat kan toch helemaal niet?spoiler:Voor deel 1 nog een off by 1 error, maar voor deel 2 zag ik snel de kruispunten in m'n input, dus voor alle kruispunten & start & einde de afstanden naar alle direct bereikbare andere kruispunten & start & einde bepaald en vervolgens die door de dijkstra heen geknald.
[ Voor 4% gewijzigd door Soultaker op 23-12-2023 12:34 ]
Soultaker schreef op zaterdag 23 december 2023 @ 12:33:
Maar dat kan toch helemaal niet?
Dat klinkt beter, in de zin dat het het correcte antwoord zou moeten geven, maar vanuit performance oogpunt is het een beetje verdacht. Hoe voorkom je op deze manier dat het aantal states te groot wordt?Asgardian28 schreef op zaterdag 23 december 2023 @ 13:05:
spoiler:Ownee sorry, het is gewoon dezelfde dfs als deel 1 die je door laat draaien, maar nu met kruispunten ipv cellen. Een state is (het kruispunt, afgelegde afstand, al bezochte kruispunten) En als je dan bij je bestemming komt check je of deze beter is dan je maximale afstand tot nu toe
Ah ik zie het al, jij hebt regels alsSoultaker schreef op zaterdag 23 december 2023 @ 10:11:
[...]
Ok, hier is mijn debug uitvoer. Wijs maar een blok aan dat ik ten onrechte heb gemarkeerd als “NOT safe to remove”
[ Voor 20% gewijzigd door .oisyn op 23-12-2023 13: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.
[ Voor 8% gewijzigd door CrossProd op 23-12-2023 13:31 ]
Soultaker schreef op zaterdag 23 december 2023 @ 12:33:
[...]
Gefeliciteerd!
[...]
Maar dat kan toch helemaal niet?
spoiler:Dijkstra's algoritme vindt het kórtste pad in een graaf, niet het langste. En nee, je kunt niet simpelweg het element met de grootste afstand uit de set halen in plaats van de kleinste afstand.
Ik zag trouwens dat er in mijn code ook een bug zat, terwijl het antwoord wel klopte (ik miste wat edges). Het zou me niets verbazen als een aantal mensen met een verkeerde oplossing toch toevallig op het goede antwoord terecht kwamen.
(Overigens heb ik 'm nu in ongeveer 8 seconde in Python. Eigenlijk te traag voor m'n smaak maar ik heb niet echt een idee hoe ik het nog sneller moet maken.)
There's no place like 127.0.0.1
Het is in ieder geval correct! Je kunt het nog aanzienlijk sneller maken (spoiler!):Diderikdm schreef op zaterdag 23 december 2023 @ 13:00:
Maar nu nog ~55s runtime voor p2... Dus ik ga er nog even mee stoeien.
Voor wie de huidige staat wil zien: Python
Ah ja, dat verklaart hetAsgardian28 schreef op zaterdag 23 december 2023 @ 13:19:
Kan kloppen, doet er 2,5 minuut over
https://github.com/jvanel...ong%20Walk/solution.ipynb
Dit klinkt alsof er een bug in je code zit... Als je een DFS zonder optimalisaties doet is het aantal paden O(V!) en dat is toch veel te veel om in 1 seconde te doen? De oplossingen van @Asgardian28 en @Friits hebben dezelfde logica en doen er logischerwijs veel langer over.CrossProd schreef op zaterdag 23 december 2023 @ 13:30:
Mijn algoritme voor part 2 (dag 23) eindigde maar niet maar ik had wel al het juiste antwoord naar de console geprint dus de twee sterren waren al binnen vanochtend. Nu flink lopen refactoren en het is nu klaar in ~1 seconde met Swift.
spoiler:Zoals denk ik iedereen eerst het grid omgezet naar een weighted graph. Daarna met DFS alle mogelijke paden bekijken.
[ Voor 18% gewijzigd door Soultaker op 23-12-2023 14:29 ]
Dat was expres, precies omdat het volgens het problem statement kan. De negatieve/overlappende z-coördinaten was onbedoeld..oisyn schreef op zaterdag 23 december 2023 @ 13:23:
Ah ik zie het al, jij hebt regels als
99,79,139~62,79,139
Waarbij componenten van het eerste coordinaat hoger zijn dan die van het tweede coordinaat. Ik weet niet of dat de bedoeling was? De omschrijving noemt verder niet dat dat verboden is, maar de voorbeeld en de officiele input doet dat nooit.
Waarom? Jij hebt je code toch al gefixtIk vind persoonlijk dat je je input moet fixen
Remcoder schreef op zaterdag 23 december 2023 @ 14:08:
[...]
spoiler:Bij mijn input werkte het blijkbaar
Ik had gewoon de compareTo van mijn nodes omgedraaid, zodat de sortering in de queue andersom is. Voor de test input gaf die het op 1 na beste resultaat terug, ik runde hem voor de gein maar eens met de echte input, en blijkbaar gaf die daar het goede antwoord terug.
Bedankt voor de link — dit is conceptueel heel cool! (En ook echt met HashLife zoals ik al eerder noemde...) Helaas krijg ik er niet de juiste antwoorden uit voor mijn testdata, maar ik weet niet of dat aan mij code ligt of de zijne. Sowieso is zijn implementatie verdacht traag, terwijl ik zou denken dat erRemcoder schreef op zaterdag 23 december 2023 @ 11:33:
Ik kwam deze observatie tegen dat dag 21 juist de cellular automaton opdracht was. Ik zie best wat die daar bedoelt.
Maar gecompileerde swift code is verwacht ik wel significant sneller dan Python. Zover ik kan zien loop ik alle mogelijke paden door.[b]Soultaker schreef op zaterdag 23 december 2023 @ 14:18:
Dit klinkt alsof er een bug in je code zit... Als je een DFS zonder optimalisaties doet is het aantal paden O(V!) en dat is toch veel te veel om in 1 seconde te doen? De oplossingen van @Asgardian28 en @Friits hebben dezelfde logica en doen er logischerwijs veel langer over.
Als ik het vergelijk met de code van Friits hier dan wordt search() ~100 miljoen keer gecalled, waarbij 'ie ~29 miljoen keer langs de eerste twee if-statements komt. Dat zit dus ongeveer in de orde van grootte van jouw oplossing. Mischien is Swift gewoon swifter dan ik dachtCrossProd schreef op zaterdag 23 december 2023 @ 16:13:
Maar gecompileerde swift code is verwacht ik wel significant sneller dan Python. Zover ik kan zien loop ik alle mogelijke paden door. Een simpele globale counter geeft aan dat ik de dfs functie 30,580,294 keer uitvoer in die 1 seconde.
There's no place like 127.0.0.1
Bedankt voor deze check!Soultaker schreef op zaterdag 23 december 2023 @ 17:05:
[...]
Als ik het vergelijk met de code van Friits hier dan wordt search() ~100 miljoen keer gecalled, waarbij 'ie ~29 miljoen keer langs de eerste twee if-statements komt. Dat zit dus ongeveer in de orde van grootte van jouw oplossing. Mischien is Swift gewoon swifter dan ik dacht
[ Voor 11% gewijzigd door Bolukan op 23-12-2023 18:45 ]
[ Voor 76% gewijzigd door .oisyn op 23-12-2023 20:36 ]
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 42% gewijzigd door Bolukan op 23-12-2023 21:51 ]
d'Oh!Soultaker schreef op zaterdag 23 december 2023 @ 10:23:
Ja, ware het niet dat ik op de een of andere manier bedacht had dat
spoiler:je elke edge in de graaf maar 1 keer mag bezoeken, maar elke vertex meerdere keren. Dat is een heel ander probleem!
[ Voor 66% gewijzigd door .oisyn op 24-12-2023 02: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.
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.
There's no place like 127.0.0.1
Volgens mij heeft dit SO antwoord de juiste wiskunde: https://stackoverflow.com/a/565282/44991, maar mocht je het niet zien dan wordt deze wel taai inderdaad...Soultaker schreef op zondag 24 december 2023 @ 07:17:
Dit is wel heel veel wiskunde voor een vroege zondagmorgen. Geometrie nog wel... Ik ben er nog niet uit. Ik neem nog maar een kopje koffie denk ik.
Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com
Voor deel 1 is dat i.d.d. voldoende maar ik zit vast op deel 2EfBe schreef op zondag 24 december 2023 @ 09:26:
Volgens mij heeft dit SO antwoord de juiste wiskunde: https://stackoverflow.com/a/565282/44991, maar mocht je het niet zien dan wordt deze wel taai inderdaad...
[ Voor 10% gewijzigd door MatHack op 24-12-2023 09:56 ]
There's no place like 127.0.0.1
MatHack schreef op zondag 24 december 2023 @ 09:52:
Deel 1 ondertussen gelukt, deel 2 was nog erger dan ik had verwacht.
spoiler: deel 1Had van Wikipedia: Line–line intersection de eerste formule gebruikt (uiteindelijk met doubles), maar kreeg daar het foute antwoord uit. Uiteindelijk de tweede formule gebruikt en daar kwam wel het juiste antwoord uit. Er zat een verschil van 1 tussen de tellingen van formule1 en formule2... zal wel een precisie-verschil in doubles geweest zijn ofzo...
EDIT: Heb ondertussen op reddit gezien dat heel veel mensen externe libraries/websites hebben gebruikt voor deel 2.
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 58% gewijzigd door MrHaas op 24-12-2023 16:31 ]
Bolukan schreef op zondag 24 december 2023 @ 16:37:
spoiler: day 24, part 2Zojuist snap ik hoe part 2 te doen. Part 1 verwijst er heel erg goed naar: dat je niet in de tijd moet zoeken maar naar kruispunten tussen 2 lijnen. Alleen de andere lijn van part 2 is nog juist te bepalen. Leuke animaties in de tijd gemaakt van x/y/z.
There's no place like 127.0.0.1
[ Voor 68% gewijzigd door Bolukan op 24-12-2023 17:29 ]
[ Voor 5% gewijzigd door Soultaker op 24-12-2023 19:14 ]
Ik heb er vrij lang over gedaan, maar ik heb een oplosser geprogrammeerd die geen floating-pointgetallen gebruikt.MatHack schreef op zondag 24 december 2023 @ 08:29:
Pfff... ik heb de juiste wiskunde voor deel 1 (en ik heb al een vermoeden waar deel 2 heen gaat), testinvoer werkt ook prima, maar de echte invoer niet. Gezien de grote nummers en het feit dat er non-integer intersecties kunnen zijn vermoed ik dat het probleem in datatypes zit voor mijn oplossing...
Heb ondertussen al wel een range te pakken voor het juiste antwoord gezien ik ondertussen 2 foute antwoorden heb gegeven, een te hoog, ander te laag.
spoiler:Die crossings in de past waren de grootste uitdaging tot nu toe, rest was formules overtypen.
Oh interessant. Ik heb geen gebruik van gemaakt van dit soort eigenschappen van de invoer. Ik had wel een aantal observaties maar de meeste leken niet heel bruikbaar. Ik moet later nog eens in detail naar je code kijken om te begrijpen wat je precies doet. Op het eerste gezicht is het aanzienlijk simpeler dan mijn aanpak.MrHaas schreef op zondag 24 december 2023 @ 11:31:
spoiler:/edit2: en uiteindelijk gelukt door ook voor het vinden van de initiele positie de parallelen te gebruiken: ik pak de eerste 2 punten die parallel zijn voor x over t en kan tussen die 2 makkelijk dt bepalen door `dx*t1 = vx1 * t1 + x1` en `dx*t2 = vx2 * t2 + x2` op te lossen. Deze dt kan je dan weer gebruiken door mbv y1(t) en y2(t) de daadwerkelijke t te vinden. Uren naar lijnen en snijpunten zitten staren, maar blij dat ik het zonder hints heb kunnen oplossen
Grappig genoeg is het wel een beetje jouw vakgebied. Ik denk dus dat je met deel 1 relatief weinig moeite zal hebben. (Voor deel 2 durf ik het niet te zeggen.).oisyn schreef op zondag 24 december 2023 @ 11:10:
Dit wordt zo te zien een makkie. Jammer dat ik wrinig tijd heb vandaag
Ik had op enig moment dezelfde vergelijking opgesteld, maarBolukan schreef op zondag 24 december 2023 @ 19:05:
spoiler: even nadenkenHerschreven:
4) ( px1 - px2 + t1 * dx1 - t2 * dx2 ) / ( t2 - t1 ) = dx0
en de rest komt na de kerstnachtdienst
Zelfde hier; 100% integer arithmetic, wat bij deel 1 al nodig was. Gelukkig maakt Python dit erg makkelijk. 128-bits integers waren niet voldoende voor mijn oplossing.arnold_m schreef op zondag 24 december 2023 @ 20:07:
Ik heb er vrij lang over gedaan, maar ik heb een oplosser geprogrammeerd die geen floating-pointgetallen gebruikt.
Daarom. Lijnintersecties tik ik uit het hoofd inSoultaker schreef op zondag 24 december 2023 @ 20:13:Grappig genoeg is het wel een beetje jouw vakgebied. Ik denk dus dat je met deel 1 relatief weinig moeite zal hebben. (Voor deel 2 durf ik het niet te zeggen.)
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.
There's no place like 127.0.0.1
[ Voor 7% gewijzigd door FCA op 24-12-2023 22:44 ]
Verandert z'n sig te weinig.
[ Voor 9% gewijzigd door .oisyn op 25-12-2023 04: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.
[ Voor 12% gewijzigd door Soultaker op 25-12-2023 14:45 ]
Verandert z'n sig te weinig.
... en gaat over tot de orde van de dag
Haha, ik ben juist onder de indruk van iedereen die de puzzels in "serieuze" talen oplost, en zich druk moet maken over types, overflows en allerlei andere zaken, en heel veel meer (foutloze) regels code moet schrijven.P_Tingen schreef op maandag 25 december 2023 @ 10:35:
Kudos voor iedereen die alles heeft binnengehengeld. Ik merk dat mijn ervaring met allerlei bedrijfs- en productiesystemen iets heel anders is dan al dit soort problemen. Gebrek aan kennis daarvan en tijdgebrek hebben er voor gezorgd dat ik tot 33 ben gekomen. Toch blij dat ik weer heb meegedaan met een taal die voor heel veel problemen veel minder geschikt is dan anderen die ik hier zie. Als ik zie dat ik 200 regels nodig heb en iemand in python dat in 12 regels doet dan vind ik dat knap werk! Op naar AoC2024!
Soultaker schreef op maandag 25 december 2023 @ 08:26:
Fijne kerstdagen allemaal!
Dag 25:
spoiler: Alternatieve aanpakHet viel me op dat ik het antwoord ook zonder algoritme kan vinden. Als ik de invoer converteer naar GraphViz formaat en open met Qt Visual Graph Editor, dan zijn de twee helften duidelijk te zien.
[Afbeelding] [Afbeelding]
Je kunt dan simpelweg op de kritieke edges klikken om de eindpunten te identificeren, en de vertices selecteren om te zien hoe groot de componenten zijn. Het verbaasde me enigszins dat QVGE geen moeite heeft met zulke grote bestanden.
[ Voor 10% gewijzigd door Asgardian28 op 25-12-2023 11:27 ]
There's no place like 127.0.0.1
MrHaas schreef op maandag 25 december 2023 @ 11:15:
spoiler:Ik heb https://en.wikipedia.org/wiki/Karger%27s_algorithm gebruikt, beetje slechte implementatie dus hij doet er ruim een minuut over, maar hey, het doel heiligt de middelen.
Ik ben vooral ontzettend klaar met het “vroeg opstaan” aspect van de competitieMatHack schreef op maandag 25 december 2023 @ 12:15:
Moet zeggen dat ik @FCA's mening wel deel met dat ik er ook wel een beetje klaar mee ben.
Siditamentis astuentis pactum.
Ik natuurlijk ook niet tot vanmorgen.
Siditamentis astuentis pactum.
[ Voor 43% gewijzigd door .oisyn op 25-12-2023 14: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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| $ ./target/release/aoc2023 --all | grep "time: " Day 1 time: 2.16ms (A: 145.67µs, B: 2.02ms) Day 2 time: 166.42µs (A: 89.33µs, B: 76.96µs) Day 3 time: 1.23ms (A: 599.38µs, B: 629.79µs) Day 4 time: 403.46µs (A: 207.13µs, B: 196.33µs) Day 5 time: 155.67µs (A: 53.79µs, B: 101.79µs) Day 6 time: 20.98ms (A: 2.21µs, B: 20.97ms) Day 7 time: 1.33ms (A: 682.71µs, B: 644.46µs) Day 8 time: 3.68ms (A: 724.21µs, B: 2.95ms) Day 9 time: 531.46µs (A: 265.17µs, B: 266.13µs) Day 10 time: 3.33ms (A: 1.35ms, B: 1.98ms) Day 11 time: 5.14ms (A: 2.64ms, B: 2.49ms) Day 12 time: 13.96ms (A: 1.35ms, B: 12.62ms) Day 13 time: 2.13ms (A: 1.07ms, B: 1.07ms) Day 14 time: 30.19ms (A: 114.63µs, B: 30.07ms) Day 15 time: 494.54µs (A: 81.25µs, B: 413.25µs) Day 16 time: 45.76ms (A: 1.60ms, B: 44.16ms) Day 17 time: 67.23ms (A: 21.94ms, B: 45.28ms) Day 18 time: 167.00µs (A: 80.88µs, B: 86.13µs) Day 19 time: 1.04ms (A: 449.67µs, B: 586.75µs) Day 20 time: 5.28ms (A: 1.04ms, B: 4.24ms) Day 21 time: 73.45ms (A: 4.86ms, B: 68.59ms) Day 22 time: 259.93ms (A: 6.26ms, B: 253.67ms) Day 23 time: 307.94ms (A: 5.17ms, B: 302.78ms) Day 24 time: 1.39ms (A: 595.58µs, B: 797.17µs) Day 25 time: 2.99ms (A: 2.99ms, B: 125.00ns) Total time: 851.07ms |
Het minimaal aantal buren is 4 (aldus mijn debug, iig zo zou ik het geloven) dus je hebt altijd alsnog een overlap van 3 welke je zou moeten vergelijken op cycles. Lastige is dat zolang je niet prunet op de drie punten welke je wilt alles connected blijft.Friits schreef op dinsdag 26 december 2023 @ 00:35:
Update: ik heb vanochtend volgens mij te ingewikkeld gedacht... wat denken jullie van de volgende aanpak:
spoiler:We definiëren de twee componenten als S en (impliciet) G \ S. We willen dat S slechts knopen bevat zodat er exact drie zijden zijn tussen S en G \ S.
De knoop in S met de meeste buren in G \ S hoort waarschijnlijk niet thuis S, dus we verwijderen we deze uit S. Dit herhalen we tot er precies drie zijden zijn tussen de componenten.
Code
Dit werkt op de voorbeeld-input en mijn eigen input, maar het klinkt te mooi (te eenvoudig) om volledig correct te zijn... ziet iemand waar mijn denkfout zit?
[ Voor 10% gewijzigd door .oisyn op 26-12-2023 02:44 ]
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.
Interessant idee! Het werkt vast op de officiële invoer die een bepaalde structuur heeft, maar zoals veel greedy algoritmes kan het soms een suboptimale oplossing geven.Friits schreef op dinsdag 26 december 2023 @ 00:35:
Update: ik heb vanochtend volgens mij te ingewikkeld gedacht... wat denken jullie van de volgende aanpak:
spoiler:We definiëren de twee componenten als S en (impliciet) G \ S. We willen dat S slechts knopen bevat zodat er exact drie zijden zijn tussen S en G \ S.
De knoop in S met de meeste buren in G \ S hoort waarschijnlijk niet thuis S, dus we verwijderen we deze uit S. Dit herhalen we tot er precies drie zijden zijn tussen de componenten.
Code
Dit werkt op de voorbeeld-input en mijn eigen input, maar het klinkt te mooi (te eenvoudig) om volledig correct te zijn... ziet iemand waar mijn denkfout zit?
Klopt, dit is er aan de hand:Soultaker schreef op dinsdag 26 december 2023 @ 11:10:
omdat in Python de volgorde van elementen in een set() niet alleen ongedefinieerd is, maar actief gerandomized wordt, zodat elke run de volgorde anders is (wat ik me niet gerealiseerd had).
[ Voor 6% gewijzigd door Friits op 26-12-2023 13:12 ]
1
2
3
4
5
6
| >>> s=set() >>> s.add('a') >>> s.add('b') >>> s.add('c') >>> list(s) ['b', 'c', 'a'] |
[ Voor 44% gewijzigd door Friits op 26-12-2023 13:37 ]
1
| {'a', 'b', 'c'} |
[ Voor 18% gewijzigd door Bolukan op 26-12-2023 23:09 ]
while (me.Alive) {
me.KickAss();
}
Corniel schreef op woensdag 27 december 2023 @ 08:26:
spoiler: dag 24Ik heb 1 paar van hails waarbij zowel de dX, als de dZ gelijk zijn, hebben jullie die ook, of is dat toeval?
[ Voor 23% gewijzigd door .oisyn op 27-12-2023 10:15 ]
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.
Dit is heel slim gevonden en werkt heel goed voor alle drie van mijn testcases, maar het is helaas worst case nog steeds een kwadratisch algoritme..oisyn schreef op zaterdag 23 december 2023 @ 20:03:
Zo, hèhè, eindelijk even tijd gehad om de bug uit mijn day22 algo te halen
[..]
spoiler:Voor deel 2 doe ik 2 passes.
In de eerste pass bepaal ik welke steen je moet omgooien om een steen te laten vallen. Hierbij heb je gegevens nodig over op welke stenen een steen rust. Ik werk van onder naar boven (stenen gesorteerd op minimale y-waarde). Voor elke steen voeg ik de stenen waar de steen op rust toe aan een max-queue. Dan pop ik steeds een waarde van de max-queue en vervang die met de steen die die steen doet laten vallen (die ik dan al weet, want die zijn lager dus die zijn al aan de beurt geweest). Als er maar 1 entry in de lijst zit, dan valt de steen bij het verwijderen van die ene steen in de lijst. Als we een steen bereiken die nooit kan vallen (omdat hij op de grond staat) met meerdere stenen in de queue, dan kan deze steen ook niet vallen.
1,42,2~7,42,2
spoiler:Dan heb ik een lijstje met wanneer elke steen valt. Voor de tweede pass maak ik een nieuw lijstje; hoeveel stenen er vallen bij het omgooien van elke steen. Nu loop van boven naar onderen, waarbij ik steeds 1 + het aantal stenen dat valt bij omgooien van deze steen, optel bij de steen die deze steen doet laten vallen. Het antwoord van deel twee is de som van dit lijstje.
Ik vermoed dat je met deze analyse 98% van je publiek kwijt bent. Maar ik snap waar je naartoe wil. Ik weet niet of het goed komt met de non-integer getallen. Maar dat is een kwestie van proberen. Dat in dit specifieke voorbeeld de inverse de matrix zelf is, is wel bijzonder. Dat betekent dat er ergens een 0° of 180° hoek in zit (het is een transformatiematrix). Ik zou trouwens vooral bezorgd zijn over determinant=0; dit moet je dan apart gaan afvangen..oisyn schreef op woensdag 27 december 2023 @ 10:02:
spoiler: dag24Ik gebruik dus het gegeven dat sommige paren dezelfde snelheid op een bepaalde as hebben.
Ik zat te denken dat je dezelfde oplossing kunt gebruiken zonder paren van hagels te hebben in de input waarvoor dat geldt, door gebruik te maken van lineaire transformaties.
Bijvoorbeeld, in 2d, stel je hebt een steen met snelheid (0, 1) en een steen met snelheid (1,0). Als je dat transformeert naar een stelsel met als basis-assen (1,0) en (-1, 1), dan worden de snelheden in dit nieuwe stelsel respectievelijk (1,0) en (1,1) en dan heb je dus een paar met gelijke snelheid op de nieuwe x-as.
Je moet alleen wel oppassen dat je geen non-integer antwoorden krijgt. Volgens mij is dat wel op te lossen.
.edit:
spoiler:Heb even zitten pieken met een online matrix calculator op m'n telefoon. In dit specifieke voorbeeld is de transformatiematrix zijn eigen inverse, dus alle transformaties vallen in Z. Waar je specifiek naar moet kijken is de determinant van de matrix, daar zul je door moeten delen bij het terugtransformeren. Dus de resultaten die je berekent in de getransformeerde ruimte moeten een veelvoud zijn van de determinant.
When life gives you lemons, start a battery factory
Dan is er geen inverse en is er een rij of kolom de 0-vector of zijn de assen lineair afhankelijk, dus dat wil je sowieso vermijdenKabouterSuper schreef op woensdag 27 december 2023 @ 11:05:
[...]
Ik zou trouwens vooral bezorgd zijn over determinant=0; dit moet je dan apart gaan afvangen.
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.
Soultaker schreef op woensdag 27 december 2023 @ 09:19:
spoiler: dag 24Dat was me in mijn invoer ook opgevallen (exact 1 paar), dus mogelijk was dat opzet. Ik kon er verder niet zoveel mee. Heb je het nog ergens voor gebruikt?
while (me.Alive) {
me.KickAss();
}
Apple iPhone 16e LG OLED evo G5 Google Pixel 10 Samsung Galaxy S25 Star Wars: Outlaws Nintendo Switch 2 Apple AirPods Pro (2e generatie) Sony PlayStation 5 Pro
Tweakers is onderdeel van
DPG Media B.V.
Alle rechten voorbehouden - Auteursrecht © 1998 - 2025
•
Hosting door TrueFullstaq