"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
Uiteindelijk nog tot dit gekomen maar daarmee ook gestrand:Cranzai schreef op woensdag 15 december 2021 @ 16:45:
Wie heeft zin om mee te kijken? Ik zit vast
https://github.com/Cranza...021/day15/python/day15.py
De code is nog een zootje maar dat komt door het debuggen![]()
spoiler:Mijn intentie was om een soort van depth-first Dijkstra algoritme te gebruiken.
Neem je uitgangspositie, ga vervolgens alle buur-coordinaten af in volgorde van groot naar klein.
Dit probeer ik recursief te doen met bijhouden van paden.
Ik krijg 3 paden als antwoord voor het voorbeeld maar allen zijn fout, ze gaan namelijk allemaal alleen rechtsaf ipv naar beneden te gaan.
Met alle deepcopy's en het spawnen van nieuwe instances ben ik volledig in de war.
https://github.com/Cranza.../day15/python/dijkstra.py
Deel A werkt prima, deel B werkt niet.
Ok, dat was snel. Nu 450ms voor deel 2.Creepy schreef op woensdag 15 december 2021 @ 21:09:
Misschien later nog eens verder optimaliseren.
"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
Er zit nog wel een klein dingetje in dat ik bij het voorbeeld van task2 de laatste node niet meetel in mijn costen maar in mijn puzzle input wel. Dat moet ik nog even uitzoeken.
... en gaat over tot de orde van de dag
Ik vond wikipedia vrij duidelijk:P_Tingen schreef op woensdag 15 december 2021 @ 21:44:
spoiler:Ik lees links en rechts over Dijkstra met priority queue, maar kan er zo snel geen duidelijke uitleg van vinden. Heeft iemand een duidelijke uitleg voor mij?
Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...
Ha, kijk aan, ik had de NL pagina wel gevonden maar daar staat het niet opDricus schreef op woensdag 15 december 2021 @ 21:45:
[...]
Ik vond wikipedia vrij duidelijk:
spoiler:
... en gaat over tot de orde van de dag
Misschien morgen maar ff twee uur uittrekken om dezelfde code als voor A te draaien.
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
Ik kan me voorstellen dat het alloceren van een heleboel kleine objecten niet super-efficient is, maar dat nadeel heeft Python op zich ook, en ik dacht dat de JVM daar juist erg goed voor geoptimaliseerd was (Python natuurlijk ook, maar het verschil zou niet groot moeten zijn).
edit:
Uit nieuwsgierigheid even m'n Python oplossing naar Java omgeschreven: behalve dat de Java broncode drie keer zo lang is (want Java), draait 'ie in 200 ms. Dat lijkt er meer op. De mensen die tientallen seconden nodig hebben doen dus toch iets verkeerd, denk ik.
edit:
Overigens kan het nog sneller door juist helemaal geen priority queue te gebruiken (~150 ms). De reden dat dat toch efficiënt is dat alle edges maximaal lengte 9 hebben dus er zijn maximaal 10 verschillende afstanden tegelijk actief. Daarmee wordt het algoritme O(4*H*W*10) i.p.v O(4*H*W*log(4*H*W)) en dat is beter (zelfs als je de constante factoren meerekent die natuurlijk niet helemaal verwaarloosbaar zijn in de praktijk).
[ Voor 57% gewijzigd door Soultaker op 16-12-2021 02:32 ]
Dit viel mij namelijk ook op in mijn oplossing. Ik splits metingen in voorbereiding en algoritme uitvoer. Waarbij gemiddeld genomen het voorbereiden van opdracht 2 450ms duurt en het draaien van het algoritme 160ms.
Edit: ik heb even zitten spelen met mijn oplossing en blijkbaar is de ArrayList in Java de grootste vertragende factor. Als ik dit allemaal omzet naar normale array's dan duurt voorbereiding nog maar 290ms en algoritme uitvoer nog maar 118ms.
[ Voor 21% gewijzigd door gedonie op 16-12-2021 07:59 ]
Zo, dat was even werk. Vooral goed lezen, en ervoor zorgen dat je geen bitjes overslaat. Verder was het niet heel moeilijk. Wel leuk
Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...
Ik weet niet of mensen de JVM startup tijd meerekenen of niet, maar dat is ook een factor.gedonie schreef op donderdag 16 december 2021 @ 07:52:
@Soultaker je conclusie klopt. Een Java implementatie van dijkstra hoeft absoluut niet zo lang te duren. Ik verwacht dat bij de meeste het mis gaat in het inlezen en omzetten in data structuren (mis in de zin dat het relatief lang duurt).
Een JVM implementatie echt goed benchmarken is sowieso nog niet zo makkelijk.
De JVM past sommige optimalisaties pas toe nadat een method een X aantal keer is aangeroepen, en dat optimaliseren kost ook CPU.
Het 1x uitvoeren van het algoritme zal waarschijnlijk niet het onderste uit de kan halen.
Je zou eerst een warmup kunnen doen (bijv. N maal het algoritme runnen), en dan pas gaan meten.
Ik probeer het dit jaar in Rust te doen, voordeel daarvan is dat die wel meteen optimaliseert: ik heb net de opt-level op 3 gezet, en dan gaat de snelheid van 1 seconde naar 70ms!
[ Voor 10% gewijzigd door Lisper op 16-12-2021 10:55 ]
Mweh, uiteindelijk was het wel geinig, maar vond het iets teveel op werken lijkenDricus schreef op donderdag 16 december 2021 @ 08:41:
Dag 16 in Clojure
Zo, dat was even werk. Vooral goed lezen, en ervoor zorgen dat je geen bitjes overslaat. Verder was het niet heel moeilijk. Wel leuk.
[ Voor 3% gewijzigd door Varienaja op 16-12-2021 09:27 ]
Siditamentis astuentis pactum.
Ik voel trouwens weer een intcode computer aankomen als ik dit zo lees.
... en gaat over tot de orde van de dag
"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
Niet moeilijk, wel veel werk.
[ Voor 13% gewijzigd door Hydra op 16-12-2021 10:19 ]
https://niels.nu
https://github.com/Synthe...84304cabdd/day16/day16.py
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Ik denk het laatste; Java zou absoluut niet langzamer moeten zijn maar de eerste versie van Dijkstra heb ik geimplementeerd op basis van een stukje psuedocode en die was echt super slecht. De nieuwe versie is 'geoptimaliseerd' maar nog steeds op die slechte implementatie gebaseerd. Dus daar zal nog wel het e.e.a. aan verbeterd kunnen worden.Soultaker schreef op donderdag 16 december 2021 @ 01:10:
Ik snap niet waarom de Java/Kotlin oplossingen voor dag 15 allemaal zo traag zijn terwijl m'n Python oplossing in 500 ms draait. Is de Java priority queue slecht geoptimaliseerd ofzo? Of zit er toch een bug in het algoritme van de deelnemers die deze taal gebruiken?
Wat denk ik ook wel meespeelt is dat mijn oplossing generiek is: ik bouw een Graph waar een generieke Dijkstra algo doorheen gaat. Dit betekent alleen wel dat er een hoop Node en Edge objecten aangemaakt worden (width * height nodes, maal 4 edges). Als je de oplossing speciek voor deze dag schrijft met een paar integer arrays, denk ik zeker dat 't een stuk sneller gaat zijn.
Voordeel dat ik weer heb is dat als er nog een keer zo'n vraag komt, ik gewoon de input om kan bouwen naar een graph en hey presto; de oplossing.
[ Voor 6% gewijzigd door Hydra op 16-12-2021 10:54 ]
https://niels.nu
https://github.com/CodeEn...er/aoc/aoc2021/Day16.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
Niet alla Java oplossingen zijn zo traag heSoultaker schreef op donderdag 16 december 2021 @ 01:10:
Ik snap niet waarom de Java/Kotlin oplossingen voor dag 15 allemaal zo traag zijn terwijl m'n Python oplossing in 500 ms draait. Is de Java priority queue slecht geoptimaliseerd ofzo? Of zit er toch een bug in het algoritme van de deelnemers die deze taal gebruiken?
"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
Massive thumbs up voor jouw python implementatie, erg goed te begrijpen!Soultaker schreef op donderdag 16 december 2021 @ 01:10:
Ik snap niet waarom de Java/Kotlin oplossingen voor dag 15 allemaal zo traag zijn terwijl m'n Python oplossing in 500 ms draait. Is de Java priority queue slecht geoptimaliseerd ofzo? Of zit er toch een bug in het algoritme van de deelnemers die deze taal gebruiken?
Ik kan me voorstellen dat het alloceren van een heleboel kleine objecten niet super-efficient is, maar dat nadeel heeft Python op zich ook, en ik dacht dat de JVM daar juist erg goed voor geoptimaliseerd was (Python natuurlijk ook, maar het verschil zou niet groot moeten zijn).
edit:
Uit nieuwsgierigheid even m'n Python oplossing naar Java omgeschreven: behalve dat de Java broncode drie keer zo lang is (want Java), draait 'ie in 200 ms. Dat lijkt er meer op. De mensen die tientallen seconden nodig hebben doen dus toch iets verkeerd, denk ik.
edit:
Overigens kan het nog sneller door juist helemaal geen priority queue te gebruiken (~150 ms). De reden dat dat toch efficiënt is dat alle edges maximaal lengte 9 hebben dus er zijn maximaal 10 verschillende afstanden tegelijk actief. Daarmee wordt het algoritme O(4*H*W*10) i.p.v O(4*H*W*log(4*H*W)) en dat is beter (zelfs als je de constante factoren meerekent die natuurlijk niet helemaal verwaarloosbaar zijn in de praktijk).
Gisteravond eindeloos geploeterd met
Alles net ff aangepast en in mijn eigen stijl opgeschreven maar hopelijk vat je het als een compliment op dat ik "hevig geïnspireerd" was door jouw code
Engineering is like Tetris. Succes disappears and errors accumulate.
Wait... de slechte implementatie, is dat die van mij?Hydra schreef op donderdag 16 december 2021 @ 10:53:
[...]
Ik denk het laatste; Java zou absoluut niet langzamer moeten zijn maar de eerste versie van Dijkstra heb ik geimplementeerd op basis van een stukje psuedocode en die was echt super slecht. De nieuwe versie is 'geoptimaliseerd' maar nog steeds op die slechte implementatie gebaseerd. Dus daar zal nog wel het e.e.a. aan verbeterd kunnen worden.
Wat denk ik ook wel meespeelt is dat mijn oplossing generiek is: ik bouw een Graph waar een generieke Dijkstra algo doorheen gaat. Dit betekent alleen wel dat er een hoop Node en Edge objecten aangemaakt worden (width * height nodes, maal 4 edges). Als je de oplossing speciek voor deze dag schrijft met een paar integer arrays, denk ik zeker dat 't een stuk sneller gaat zijn.
Voordeel dat ik weer heb is dat als er nog een keer zo'n vraag komt, ik gewoon de input om kan bouwen naar een graph en hey presto; de oplossing.

Engineering is like Tetris. Succes disappears and errors accumulate.
Oh wat een


^ aangepast in refactor (gelukkig)
..en nu is het spijkerschrijft

[ Voor 44% gewijzigd door Diderikdm op 16-12-2021 16:49 ]
https://github.com/evanra...ob/master/python/day16.py dit heeft heel veel behoefte aan een refactor, maar momenteel niet zo'n zin in:)
Oh wauw, ik zit nu ook in de top 10.000 van vandaag
https://github.com/Janoz-...com/janoz/aoc/y2021/day16
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Ben het zeker eens met bovenstaande posts dat deze opdracht echt niet fun was. Ik weet het zo langzamerhand wel hoe dit probleem opgelost moet worden en dan extra ingewikkelde input te moeten handlen 'omdat het anders te simpel is' maakt het niet moeilijker, maar maakt het gewoon meer werk. Naja... morgen maar hopen op een topological sort, dan ben ik weer wat sneller klaar
[ Voor 33% gewijzigd door EfBe op 16-12-2021 13:02 ]
Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com
Siditamentis astuentis pactum.
Mooi gedaan! Ik zat echt enorm te prutsen, toen ik zag hoe jij je data opslaat heb ik dat ook toegepast en rolde het antwoord er zo uit 😅iThinkSo schreef op donderdag 16 december 2021 @ 10:32:
Dag 16 in Python
https://github.com/Synthe...84304cabdd/day16/day16.py
spoiler:Goede usecase voor iterators, wel de eerste dag dat ik er een externe library bijgehaald heb (more_itertools)
Aanschouw: https://pastebin.com/S5tAT5Bf

For example, here is an operator packet (hexadecimal string 38006F45291200) with length type ID 0 that contains two sub-packets: 00111000000000000110111101000101001010010001001000000000 VVVTTTILLLLLLLLLLLLLLLAAAAAAAAAAABBBBBBBBBBBBBBBB The three bits labeled V (001) are the packet version, 1. The three bits labeled T (110) are the packet type ID, 6, which means the packet is an operator. The bit labeled I (0) is the length type ID, which indicates that the length is a 15-bit number representing the number of bits in the sub-packets. The 15 bits labeled L (000000000011011) contain the length of the sub-packets in bits, 27. The 11 bits labeled A contain the first sub-packet, a literal value representing the number 10. The 16 bits labeled B contain the second sub-packet, a literal value representing the number 20.
Waarom hebben A en B hier de lengten die ze hebben (11 en 16)? IK snap dat ze samen 27 lengte moeten hebben...
maar waarom is het 11 en 16 in dit voorbeeld, en niet 9 en 18?

A is een header (3 bits) + type (3 bits) + nummer (5 bits). Waarom zou dat 9 bits moeten zijn volgens jou?breew schreef op donderdag 16 december 2021 @ 14:02:
ok... ik heb denk ik ergens een stukje uitleg gemist.. maar ik loop te klooien met deze dag..![]()
For example, here is an operator packet (hexadecimal string 38006F45291200) with length type ID 0 that contains two sub-packets: 00111000000000000110111101000101001010010001001000000000 VVVTTTILLLLLLLLLLLLLLLAAAAAAAAAAABBBBBBBBBBBBBBBB The three bits labeled V (001) are the packet version, 1. The three bits labeled T (110) are the packet type ID, 6, which means the packet is an operator. The bit labeled I (0) is the length type ID, which indicates that the length is a 15-bit number representing the number of bits in the sub-packets. The 15 bits labeled L (000000000011011) contain the length of the sub-packets in bits, 27. The 11 bits labeled A contain the first sub-packet, a literal value representing the number 10. The 16 bits labeled B contain the second sub-packet, a literal value representing the number 20.
Waarom hebben A en B hier de lengten die ze hebben (11 en 16)? IK snap dat ze samen 27 lengte moeten hebben...
maar waarom is het 11 en 16 in dit voorbeeld, en niet 9 en 18?
Edit: ja, van die 5 bits zijn de laatste 4 het nummer zelf, de eerst geeft aan of er nog meer volgen of niet, in dit geval niet
[ Voor 4% gewijzigd door Creepy op 16-12-2021 14:06 ]
"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
Door dit stukje:breew schreef op donderdag 16 december 2021 @ 14:02:
ok... ik heb denk ik ergens een stukje uitleg gemist.. maar ik loop te klooien met deze dag..![]()
For example, here is an operator packet (hexadecimal string 38006F45291200) with length type ID 0 that contains two sub-packets: 00111000000000000110111101000101001010010001001000000000 VVVTTTILLLLLLLLLLLLLLLAAAAAAAAAAABBBBBBBBBBBBBBBB The three bits labeled V (001) are the packet version, 1. The three bits labeled T (110) are the packet type ID, 6, which means the packet is an operator. The bit labeled I (0) is the length type ID, which indicates that the length is a 15-bit number representing the number of bits in the sub-packets. The 15 bits labeled L (000000000011011) contain the length of the sub-packets in bits, 27. The 11 bits labeled A contain the first sub-packet, a literal value representing the number 10. The 16 bits labeled B contain the second sub-packet, a literal value representing the number 20.
Waarom hebben A en B hier de lengten die ze hebben (11 en 16)? IK snap dat ze samen 27 lengte moeten hebben...
maar waarom is het 11 en 16 in dit voorbeeld, en niet 9 en 18?
1
2
3
| The five bits labeled A (10111) start with a 1 (not the last group, keep reading) and contain the first four bits of the number, 0111. The five bits labeled B (11110) start with a 1 (not the last group, keep reading) and contain four more bits of the number, 1110. The five bits labeled C (00101) start with a 0 (last group, end of packet) and contain the last four bits of the number, 0101. |
Je leest in per 5 bits. De eerste zegt of je nog een groep moet inlezen, of dat het de laatste was
breew schreef op donderdag 16 december 2021 @ 14:02:
ok... ik heb denk ik ergens een stukje uitleg gemist.. maar ik loop te klooien met deze dag..![]()
For example, here is an operator packet (hexadecimal string 38006F45291200) with length type ID 0 that contains two sub-packets: 00111000000000000110111101000101001010010001001000000000 VVVTTTILLLLLLLLLLLLLLLAAAAAAAAAAABBBBBBBBBBBBBBBB The three bits labeled V (001) are the packet version, 1. The three bits labeled T (110) are the packet type ID, 6, which means the packet is an operator. The bit labeled I (0) is the length type ID, which indicates that the length is a 15-bit number representing the number of bits in the sub-packets. The 15 bits labeled L (000000000011011) contain the length of the sub-packets in bits, 27. The 11 bits labeled A contain the first sub-packet, a literal value representing the number 10. The 16 bits labeled B contain the second sub-packet, a literal value representing the number 20.
Waarom hebben A en B hier de lengten die ze hebben (11 en 16)? IK snap dat ze samen 27 lengte moeten hebben...
maar waarom is het 11 en 16 in dit voorbeeld, en niet 9 en 18?
Creepy schreef op donderdag 16 december 2021 @ 14:05:
[...]
A is een header (3 bits) + type (3 bits) + nummer (5 bits). Waarom zou dat 9 moeten zijn?



Wat een gepriegel dit... Dacht het ff in de luchtijd op te pikken ;-)
je.. hebbesMschamp schreef op donderdag 16 december 2021 @ 14:06:
[...]
Door dit stukje:
code:
1 2 3 The five bits labeled A (10111) start with a 1 (not the last group, keep reading) and contain the first four bits of the number, 0111. The five bits labeled B (11110) start with a 1 (not the last group, keep reading) and contain four more bits of the number, 1110. The five bits labeled C (00101) start with a 0 (last group, end of packet) and contain the last four bits of the number, 0101.
Je leest in per 5 bits. De eerste zegt of je nog een groep moet inlezen, of dat het de laatste was
Hmm? Nee. Ik had eergister van je gejat, niet gisterarmageddon_2k1 schreef op donderdag 16 december 2021 @ 11:15:
Wait... de slechte implementatie, is dat die van mij?
https://niels.nu
Diderikdm schreef op donderdag 16 december 2021 @ 14:07:
[...]
spoiler:De uitleg van type 4 dekt ditde eerste 6 bits van de 11 zijn de V en T (T=4), de 5 bits hierna beginnen met een 0 (laatste package). Voor die van 16 bits -> eerste 6 = V & T (T=4), de 5 bits hierna begint met een 1, dus niet laatste package, de 5 hierna wel met een 0, dus laatste package

Nu ook wel benieuwd wat je er dan uiteindelijk van gemaakt hebttarlitz schreef op donderdag 16 december 2021 @ 13:40:
[...]
Mooi gedaan! Ik zat echt enorm te prutsen, toen ik zag hoe jij je data opslaat heb ik dat ook toegepast en rolde het antwoord er zo uit 😅
Dit is 'm geworden ^^iThinkSo schreef op donderdag 16 december 2021 @ 14:14:
[...]
Nu ook wel benieuwd wat je er dan uiteindelijk van gemaakt hebt
https://pastebin.com/u5BKcVTA
Ik vond dat ook heel verdacht. Met name omdat jouw implementatie eigenlijk alleen daarin verschilt dat je een int[][] array gebruikt en ik een HashMap<Point,Long> voor de gewichten in de grid.Soultaker schreef op donderdag 16 december 2021 @ 01:10:
Ik snap niet waarom de Java/Kotlin oplossingen voor dag 15 allemaal zo traag zijn terwijl m'n Python oplossing in 500 ms draait. Is de Java priority queue slecht geoptimaliseerd ofzo? Of zit er toch een bug in het algoritme van de deelnemers die deze taal gebruiken?
Ik heb de hashCode van mijn Point veranderd, zodat ze 'unieker' zijn. Runtime 1s in plaats van 3.
HashCode van een Point construct-time berekenen ipv iedere keer opniew bij een call geeft 0,8s ipv 1.
Het is wel goed om maar weer eens met de neus op de feiten gedrukt te worden. Veel mooie datastructuren zijn niet gratis. Verre van!
Siditamentis astuentis pactum.
When life gives you lemons, start a battery factory
Cranzai schreef op donderdag 16 december 2021 @ 18:48:
Man man man, wat zijn die overblijfende nullen toch verschikkelijk irritant, ben er nog niet goed uit hoe ik die weg moet slopen. Voor de literal values is het goed te bedenken, er is immers een regel voor gegeven. Voor de operators daarentegen is het een grote chaos.
^ Alleen de allerbuitenste BIT heeft (misschien) verloopnullen. Ik heb er ook mn hoofd op gebroken
Maak je het jezelf niet te moeilijk?Cranzai schreef op donderdag 16 december 2021 @ 18:48:
Man man man, wat zijn die overblijfende nullen toch verschikkelijk irritant, ben er nog niet goed uit hoe ik die weg moet slopen. Voor de literal values is het goed te bedenken, er is immers een regel voor gegeven. Voor de operators daarentegen is het een grote chaos.
Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...
Grappig, deze had ik precies nodig.Dricus schreef op donderdag 16 december 2021 @ 18:52:
[...]
Maak je het jezelf niet te moeilijk?
spoiler:Die "padding" nullen staan alleen maar helemaal aan het einde, na het "root" packet. Ze dienen alleen maar om ervoor te zorgen dat de input in een veelvoud van 4 bits (of zelfs 8?) is uit te drukken.
Eigenlijk moet dat dus een check zijn wanneer er geen 1'en meer in zitten.
Cranzai schreef op donderdag 16 december 2021 @ 18:54:
Grappig, deze had ik precies nodig.
spoiler:Werk met een deque en wilde in principe een check dr op gooien te stoppen wanneer leeg.
Eigenlijk moet dat dus een check zijn wanneer er geen 1'en meer in zitten.
Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...
PS5 PSN: UnrealKazu

Zit met mijn huidige format waarschijnlijk dicht bij oplossing waarin ik eenvoudig de post-processing kan verwerken maar ik ben dr klaar mee.
Ben benieuwd of hier weer op verder geborduurd gaat worden!
"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
running_total *= execute_packet(p)
bijhouden. En dan running_total initializeren op 0
Had ik geen zin in, ik heb gewoon een switch met 16 cases gedaan. Beetje knippen en plakken en ik was van al het gedoe af. Is nog sneller dan leftpad ookCreepy schreef op donderdag 16 december 2021 @ 22:59:
Ik heb speciaal voor dag 16 leftpad gebruikt, nu zit die bij Java gewoon in 1 grote lib (apache-commons3). maar toch voelde het een beetje vies. Ik had alleen geen zin om die zelf te schrijven.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Eenvoudig: nee, best veel gotchas, hele avond over gedaan. Kan vast nog wel cleaner.

Snel: ja, gebenchmarkt met benchee en dag 16 a/b doen er beide minder dan 1ms over.

Pattern matching en recursie FTW! Kom maar eens in een andere taal met zo'n all-in-one function header:
1
| defp parse(<<version::3, type::3, 0::1, sub_length::15, subpacketbits::size(sub_length), rest::bitstring>>, packets) do |
Counterpoint: Voor dag 15b kom ik niet verder dan het generen van een foutief antwoord in 13 seconden.
How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.
[ Voor 5% gewijzigd door Varienaja op 17-12-2021 12:03 ]
Siditamentis astuentis pactum.
Ik ken deel 2 nog niet maar iets zegt me dat dit daar niet voor gaat werken, deze oplossingsrichting ligt iets te veel voor de hand ben ik bang....Varienaja schreef op vrijdag 17 december 2021 @ 06:22:
Misschien vindt iemand het leuk om mijn ongecensureerde kladcode voor vandaag te zien.
***members only***
... en gaat over tot de orde van de dag
Varienaja schreef op vrijdag 17 december 2021 @ 06:22:
Misschien vindt iemand het leuk om mijn ongecensureerde kladcode voor vandaag te zien.
***members only***
Stilte voor de storm voor dit weekend?
Bij mij ging bruteforce ook, en nog behoorlijk snel.Diderikdm schreef op vrijdag 17 december 2021 @ 08:15:
Python dag 17
spoiler:Er zal denk ik wel een formule zijn om hier part 1 & 2 op uit te rekenen, toch gekozen voor bruteforce
Stilte voor de storm voor dit weekend?
Alleen de eerste keer een fout antwoord omdat ik niet genoeg combinaties probeerde.
Deel 2 voelde eenvoudiger dan deel 1.
Tja, wat zal ik ervan zeggen. Verdient geen schoonheidsprijs
Engineering is like Tetris. Succes disappears and errors accumulate.
Siditamentis astuentis pactum.
Deze was vrij simpel en ik had door mijn aanpak ook meteen het antwoord voor deel 2.
https://niels.nu
Of na de storm van gisteren. Vandaag was een makkie.Diderikdm schreef op vrijdag 17 december 2021 @ 08:15:
Python dag 17
spoiler:Er zal denk ik wel een formule zijn om hier part 1 & 2 op uit te rekenen, toch gekozen voor bruteforce
Stilte voor de storm voor dit weekend?
When life gives you lemons, start a battery factory
Ik betwijfel of er een gemakkelijke formule is. Je kunt de minimale en maximale horizontale snelheid wel vrij gemakkelijk bepalen.Remcoder schreef op vrijdag 17 december 2021 @ 09:29:
***members only***
spoiler:Tsja, soms is brute force wél de beste oplossing. Ik verwacht dat er ergens wel een formule voor is.
maximaal: v<=grootste x-coordinaat van target (want dit wordt na 1 stap bereikt)
Wat betreft de verticale snelheid:
maximaal: als je de minimale horizontale snelheid aanhoudt en je wilt zo hoog mogelijk, dan kom je uiteindelijk weer uit op y=0 (want de y-coordinaat volgt een symmetrisch pad). Dus de volgende stap mag geen overshoot zijn, dus v<=-1*kleinste y-coordinaat
Maar binnen dit gebied weet ik niet of je nog heel veel meer kunt doen. Anyway, met deze afschattingen een antwoord in 3.5 sec.
[ Voor 6% gewijzigd door KabouterSuper op 17-12-2021 09:56 ]
When life gives you lemons, start a battery factory
KabouterSuper schreef op vrijdag 17 december 2021 @ 09:54:
Anyway, met deze afschattingen een antwoord in 3.5 sec.
Hiermee hoef ik nog maar iets meer dan 120.000 stappen te simuleren, alweer 3x minder dan daarnet. Mijn runtime zat al op 'onmeetbaar' weinig. (Unittest in 0.000s uitgevoerd). En nu nog 3x minder dus. Ik vind 3,5s daarom wel heel erg overdreven.
Siditamentis astuentis pactum.
Dat kan efficienter, op mijn laptop draai ik zelfs alle test cases van alle dagen in minder dan 3 seconden.KabouterSuper schreef op vrijdag 17 december 2021 @ 09:54:
[...]
Maar binnen dit gebied weet ik niet of je nog heel veel meer kunt doen. Anyway, met deze afschattingen een antwoord in 3.5 sec.
Dag 16 was leuk en afgezien van het leeswerk makkelijk
Engineering is like Tetris. Succes disappears and errors accumulate.
https://github.com/CodeEn...er/aoc/aoc2021/Day17.java
[ Voor 7% gewijzigd door Creepy op 17-12-2021 11:00 ]
"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
Volgens mij klopt hij niet helemaalKabouterSuper schreef op vrijdag 17 december 2021 @ 09:54:
[...]
Ik betwijfel of er een gemakkelijke formule is. Je kunt de minimale en maximale horizontale snelheid wel vrij gemakkelijk bepalen.
spoiler:minimaal: v*(v+1)/2>=kleinste x-coordinaat van target (want dit is de maximale afstand die je kunt bereiken)
maximaal: v<=grootste x-coordinaat van target (want dit wordt na 1 stap bereikt)
Wat betreft de verticale snelheid:
spoiler:minimaal: v>=kleinste y-coordinaat (want dit wordt na 1 stap bereikt).
maximaal: als je de minimale horizontale snelheid aanhoudt en je wilt zo hoog mogelijk, dan kom je uiteindelijk weer uit op y=0 (want de y-coordinaat volgt een symmetrisch pad). Dus de volgende stap mag geen overshoot zijn, dus v<=-1*kleinste y-coordinaat
Maar binnen dit gebied weet ik niet of je nog heel veel meer kunt doen. Anyway, met deze afschattingen een antwoord in 3.5 sec.
Ikzelf heb nu max(top, (-1*bottom)-1) waardoor ik uiteindelijk maar 420 of 32.314 simulaties hoef te doen
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
De minimale vx waarde die goed is, is de eerste (n * (n+1) // 2) die tussen (minx,maxx) valt, omdat dit de eerste waarde is waarbij x binnen de range van het vlak stilvalt. Hierdoor zal er /een/ waarde voor vy zijn waardoor deze in het vlak valt.
De max vx die goed is, is maxx, omdat na 1 iteratie de uiterste rand van het vlak is bereikt
de minimale vy waarde is miny (omdat je anders per definitie onder het vlak komt)
de maximale vy waarde lijkt de zijn:
abs(miny) - 1, ofwel, gespiegeld in de x-as 1 hoger dan de hoogste y van het vlak.
Ik ga even kijken of ik hier nog iets zinnigs van kan maken verder..
[ Voor 4% gewijzigd door EfBe op 17-12-2021 11:53 ]
Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com
Het target is een trench in de oceaanbodem, dus is het niet altijd zo dat het target onder 0 zit? Als het target boven 0 zit, wordt het inderdaad iets anders.Janoz schreef op vrijdag 17 december 2021 @ 11:44:
[...]
spoiler:Ten eerste ga je er nu allen vanuit dat het target onder 0 zit. Je hebt ook nog het geval waarbij het target boven 0 zit. Daarnaast kan voor het target onder 0 de velocity 1 stap kleiner omdat je een extra stap doet om onder 0 te komen.
When life gives you lemons, start a battery factory
Heb je een punt inderdaad, maar dan nog geld de -1 toevoeging van mijKabouterSuper schreef op vrijdag 17 december 2021 @ 11:51:
[...]
Het target is een trench in de oceaanbodem, dus is het niet altijd zo dat het target onder 0 zit? Als het target boven 0 zit, wordt het inderdaad iets anders.
Hij wordt helemaal mooi wanneer het target over de x-as ligt. Dan zijn beide antwoorden oneindig
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
^Hiervoor kan je (maxx - minx + 1) * (maxy - miny + 1) doen.
Je kunt verder alle waarden van vx skippen die: (vx < minx and vx + vx-1 > maxx). Deze gaan nooit in het vlak komen...
Klopt helemaal. Ik was te lui om het helemaal netjes te doen.Janoz schreef op vrijdag 17 december 2021 @ 11:53:
[...]
Heb je een punt inderdaad, maar dan nog geldt de -1 toevoeging van mij..
Haha, dat had ik me helemaal niet gerealiseerd.Janoz schreef op vrijdag 17 december 2021 @ 11:53:
[...]
Hij wordt helemaal mooi wanneer het target over de x-as ligt. Dan zijn beide antwoorden oneindig
When life gives you lemons, start a battery factory
Ik helemaal blij dat ik een manier had gevonden dat ik niet brute force door alles heen hoef voor deel 1.
Ook hoef je niet alle Y's door. bij een positieve start Y kom je altijd uiteindelijk op y=0 terecht. De eerst volgende stap die je richting Y doet is de start Y + 1. De voorgaande boog is maximaal als je in 1 stap direct op de uiterste Y lijn terecht komt. Hieruit volgt dat de som van de getallen 1 tot de uiterste Y lijn (positief gemaakt) de hoogst mogelijke hoogte is.
Toen kwam deel 2 en dat toch maar brute force gedaan

[ Voor 4% gewijzigd door FrankMennink op 17-12-2021 12:25 ]
FrankMennink schreef op vrijdag 17 december 2021 @ 12:22:
Dag 17 in Python
Ik helemaal blij dat ik een manier had gevonden dat ik niet brute force door alles heen hoef voor deel 1.
spoiler:x coordinaat maakt niks uit voor deel 1, we schieten zo hoog dat we al gauw aan een verticale val bezig zijn. Zolang er maar een x is waarvoor we in ieder geval het doel bereiken.
Ook hoef je niet alle Y's door. bij een positieve start Y kom je altijd uiteindelijk op y=0 terecht. De eerst volgende stap die je richting Y doet is de start Y + 1. De voorgaande boog is maximaal als je in 1 stap direct op de uiterste Y lijn terecht komt. Hieruit volgt dat de som van de getallen 1 tot de uiterste Y lijn (positief gemaakt) de hoogst mogelijke hoogte is.
Toen kwam deel 2 en dat toch maar brute force gedaanWel met wat limieten op de ranges waardoor deel 2 netjes in 36ms draait
1+2+....+n=n*(n+1)/2 (let op: ik moest n*(n-1)/2 invullen, dus er zit ergens een 0/1 dingetje in)
x*(x+1)/2>=m -> x>=math.floor((1/4+2*m)**(1/2))-1
When life gives you lemons, start a battery factory
for tx in range(next((x for x in range(minx) if (x * (x+1) // 2) >= minx)), maxx + 1)[::-1]:
temp[tx] = []
x = tx
tot_x = 0
i = 0
while tot_x <= maxx and x > 0:
tot_x += x
x -= 1
i += 1
if minx <= tot_x <= maxx:
temp[tx] += [i]
tot = 0
for x in temp[tx]:
tot += ceil(a/x)
print(tx, tot)
print(temp)
Hiermee kom je al redelijk in de buurt en kan je een bulk vxen berekenen.. Totdat er getallen voor vx komen waarbij 3+ mogelijkheden zijn om in het vlak te landen (bijvoorbeeld 27 -> 27+26+25, 27+26+25+24, 27+26+25+24+23) 70 <= x <= 125), vanaf dit punt gaan snijdvlakken door het aanpassen van de vy ook meewegen..

Nu kap ik ermee, maar het lijkt alsof je alleen (op dit moment en bij mijn input) 15 vxen hoeft te bruteforcen en de rest zou je kunnen berekenen
Gaat je bepaling van h wel goed?Diderikdm schreef op vrijdag 17 december 2021 @ 08:15:
Python dag 17
spoiler:Er zal denk ik wel een formule zijn om hier part 1 & 2 op uit te rekenen, toch gekozen voor bruteforce
is toch niet hetzelfde als:
x=x+vx
y=y+vy
h=max(h,y)
?
In mijn code hoog ik eerst y op en daarna h. Jij doet het simultaan, waardoor je met de oude y rekent als je h berekent.
Het maakt in dit geval geen fluit uit voor het antwoord, maar ik had dit verwacht:
x, y, h = x + vx, y + vy, max(h,y+vy)
When life gives you lemons, start a battery factory
Scherp, inderdaad! Gelukje gehad hier dat niet direct na dit punt iets gedaan hoefde te wordenKabouterSuper schreef op vrijdag 17 december 2021 @ 12:50:
[...]
Gaat je bepaling van h wel goed?
spoiler:x, y, h = x + vx, y + vy, max(h,y)
is toch niet hetzelfde als:
x=x+vx
y=y+vy
h=max(h,y)
?
In mijn code hoog ik eerst y op en daarna h. Jij doet het simultaan, waardoor je met de oude y rekent als je h berekent.
Het maakt in dit geval geen fluit uit voor het antwoord, maar ik had dit verwacht:
x, y, h = x + vx, y + vy, max(h,y+vy)
Thanks die kende ik nog nietKabouterSuper schreef op vrijdag 17 december 2021 @ 12:36:
[...]
spoiler:Je kunt de sommen vermijden als je gebruikt dat (disclaimer: typefouten en +/-1 foutjes):
1+2+....+n=n*(n+1)/2 (let op: ik moest n*(n-1)/2 invullen, dus er zit ergens een 0/1 dingetje in)
x*(x+1)/2>=m -> x>=math.floor((1/4+2*m)**(1/2))-1
Voor deel 1 is wel een gemakkelijke oplossing te bepalen.Remcoder schreef op vrijdag 17 december 2021 @ 09:29:
***members only***
spoiler:Tsja, soms is brute force wél de beste oplossing. Ik verwacht dat er ergens wel een formule voor is.
Fraaie analyse.Diderikdm schreef op vrijdag 17 december 2021 @ 12:49:
spoiler:a = maxy-miny + 1
for tx in range(next((x for x in range(minx) if (x * (x+1) // 2) >= minx)), maxx + 1)[::-1]:
temp[tx] = []
x = tx
tot_x = 0
i = 0
while tot_x <= maxx and x > 0:
tot_x += x
x -= 1
i += 1
if minx <= tot_x <= maxx:
temp[tx] += [i]
tot = 0
for x in temp[tx]:
tot += ceil(a/x)
print(tx, tot)
print(temp)
Hiermee kom je al redelijk in de buurt en kan je een bulk vxen berekenen.. Totdat er getallen voor vx komen waarbij 3+ mogelijkheden zijn om in het vlak te landen (bijvoorbeeld 27 -> 27+26+25, 27+26+25+24, 27+26+25+24+23) 70 <= x <= 125), vanaf dit punt gaan snijdvlakken door het aanpassen van de vy ook meewegen..![]()
Nu kap ik ermee, maar het lijkt alsof je alleen (op dit moment en bij mijn input) 15 vxen hoeft te bruteforcen en de rest zou je kunnen berekenen
Voor het geval vy<0 kan je analytisch bepalen hoeveel tijdsstappen het duurt voordat je in de verticale range zit. Je bepaalt namelijk wanneer je voorbij de bovenkant schiet en wanneer voorbij de onderkant. Alle gehele getallen ertussen zijn potentiele oplossingen.
Voor deze tijdstippen, kan je uitzoeken voor welke vx je in de horizontale range zit.
Hiermee hoef je alleen maar over je verticale snelheden te loopen in plaats van een dubbele loop over vx en vy.
Maar ik vind het ook genoeg geweest voor vandaag.
When life gives you lemons, start a battery factory
Daarna al mijn calculus bij elkaar geraapt om tot wat betere ranges te komen.
Easy peasy, lemon squeezy
https://github.com/Cranza...021/day17/python/day17.py