Advent of Code 2023 Vorige deel Overzicht Laatste deel

Dit topic is onderdeel van een reeks. Ga naar het meest recente topic in deze reeks.

Pagina: 1 ... 10 11 Laatste
Acties:

Acties:
  • +1 Henk 'm!

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 20:56

Varienaja

Wie dit leest is gek.

  • challenge-1.txt: OK 22s 2,6s.
  • challenge-2.txt: OK 1070s.
  • challenge-3.txt: Geen zin om zo lang te wachten.
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. :o Het schaalt momenteel in ieder geval mooi kl*te met het aantal bakstenen.

Siditamentis astuentis pactum.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:23
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.
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.
Varienaja schreef op vrijdag 22 december 2023 @ 17:45:
  • challenge-1.txt: OK 22s 2,6s.
  • challenge-2.txt: OK 1070s.
  • challenge-3.txt: Geen zin om zo lang te wachten.
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. :o Het schaalt momenteel in ieder geval mooi kl*te met het aantal bakstenen.
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.

[ Voor 16% gewijzigd door Soultaker op 22-12-2023 18:35 ]


Acties:
  • 0 Henk 'm!

  • Asgardian28
  • Registratie: December 2012
  • Laatst online: 17:57
We hebben ook nog geen game of life puzzel gehad. Of zou dat dag 25 worden?

Acties:
  • +1 Henk 'm!

  • FCA
  • Registratie: April 2000
  • Laatst online: 18-05 21:46

FCA

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:
  • 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).
Referentietijden in Python: 0,3 s, 1,7 s, 12 s.

@FCA: werkt jouw oplossing op deze testdata? Hoe snel runt 'ie?
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 :+
Misschien 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.

Denk dat ik mijn graafalgoritme nog kan verbeteren als ik bijvoorbeeld een topological sort toepas en gelijk afbreek als ik te laag in de graaf zit o.i.d. En natuurlijk een nette DP oplossing, i.p.v. mijn gare memoization (ik besef me nu dat ik de in de memoization key ook de node die ik disintegrate zet, waardoor ik alles opnieuw bereken voor elke disintegrated node... 8)7 )

[ Voor 13% gewijzigd door FCA op 22-12-2023 20:36 ]

Verandert z'n sig te weinig.


Acties:
  • +1 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:23
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?
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? :P
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 :+
Ah, jammer. Op basis van je beschrijving vermoedde ik dat je een meer geavanceerd algoritme had geïmplementeerd.
Misschien 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.
Ja, ik begin dat ook wel zat te worden :P Nog een paar dagen doorbikkelen...

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:44

.oisyn

Moderator Devschuur®

Demotivational Speaker

Day22 in Rust

Superweinig tijd gehad, gelukkig een simpele opdracht.

spoiler:
Mijn implementatie is niet heel efficient. Ik weet dat ik voor deel 2 zou kunnen bijhouden welke stenen er vallen en dan van boven naar onderen kan werken en zo niet steeds dingen opnieuw zou hoeven uitrekenen, maar daar had ik even geen zin in. Wellicht dat ik dat later nog eens implementeer. Ook gebruik ik een fixed size 10x10 grid dus die sets van @Soultaker gaan 'm sowieso niet worden :Y)


.edit:
spoiler:
Heh, nu ik de reacties van vandaag teruglees blijkt dat ik het voor deel 1 van meet af aan toch een stuk efficiënter heb geïmplementeerd dan velen hier :D

[ 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.


Acties:
  • +1 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:44

.oisyn

Moderator Devschuur®

Demotivational Speaker

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:
  • 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).
Referentietijden in Python: 0,3 s, 1,7 s, 12 s.

@FCA: werkt jouw oplossing op deze testdata? Hoe snel runt 'ie?
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)

spoiler:
Mijn volledige antwoorden voor challenge 1 zijn 3760 en 175572


Running tijd is trouwens 10,9ms en 50,9s :P

.edit: oh interessant, als ik de sort vervang door een unstable sort dan krijg ik andere antwoorden voor challenge 1.

.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


.edit3: oh shit dat is bij lange na niet de enige overlap :D.
code:
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


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.

2 en 3 valideren wel volgens mijn check.

.edit4: challenge 2 nu in 18s.

[ 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.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:44

.oisyn

Moderator Devschuur®

Demotivational Speaker

BAM, challenge 2 in 168ms. Zit nog wel een bugje in want ik krijg bij de officiele invoer niet het goede antwoord. Volgens mij klopt mijn algoritme in principe, alleen mis ik denk ik ergens een edge case waardoor ik verkeerd tel. Morgen verder.

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.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:23
.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.
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!

Hier is een nieuwe versie: challenge-1-r1.txt. Correcte antwoorden zijn 54 en 24 modulo 97.

Acties:
  • 0 Henk 'm!

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 20:56

Varienaja

Wie dit leest is gek.

Lekker niet om 6 uur opgestaan, maar ik lach me een aap: "vind het langste pad". :+

Siditamentis astuentis pactum.


Acties:
  • +1 Henk 'm!

  • FCA
  • Registratie: April 2000
  • Laatst online: 18-05 21:46

FCA

Pfff...
Deel 1:
spoiler:
Gewoon brute force proberen, recursief met het gelopen pad bijhouden in een set. Werkt niet bijster snel, maar wel goed genoeg. Redelijk snel geimplementeerd, positie < 1000.

Deel 2 was weer een killer voor mij
spoiler:
Brute force vergelijkbaar met deel 1 (maar dus meer toegestane transities) werd hem niet binnen een minuut, dus alternatieven zoeken. Zoals al eerder opgemerkt, graafalgoritmes zijn niet mijn sterkste punt, dus dat schept geen hoge verwachtingen.

Na veel zoeken kom ik erachter dat het waarschijnlijk NP compleet is, dus ik ga zoeken naar speciale eigenschappen van de graaf. Half uurtje prutsen voor ik een fatsoenlijke plaatje van de graaf kan maken (graphviz, pygraphviz en Windows lopen niet lekker samen).
Blijkt dat de graaf uit veel a_1 <-> a_2 <-> ... <-> a_n rijen bestaat. Dat kunnen we versimpelen naar a_1 <-> a_n met gewicht n.

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:
Afbeeldingslocatie: https://tweakers.net/i/Lz6s0u6EjbxX0yDWsFphytvdIRI=/x800/filters:strip_exif()/f/image/0QwmO9lHe86YVUHEnnRz8Tt1.png?f=fotoalbum_large

[ Voor 18% gewijzigd door FCA op 23-12-2023 09:46 ]

Verandert z'n sig te weinig.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:44

.oisyn

Moderator Devschuur®

Demotivational Speaker

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.
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.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:23
.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)
Ik denk het... Ik gaf het antwoord modulo 97 he, niet simpelweg de laatste twee cijfers.

Check ook of je niets raars doet met whitespace; als ik van pastebin download heb ik Windows newlines in het bestand (maar mogelijk wil jij dat juist).

Probeer anders deze kleinere eerst: small.txt. 100 regels in de invoer. Correcte antwoorden zijn 71 en 251 (exact).

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:44

.oisyn

Moderator Devschuur®

Demotivational Speaker

86 74 hier 8)7

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.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:23
Ok, hier is mijn debug uitvoer. Wijs maar een blok aan dat ik ten onrechte heb gemarkeerd als “NOT safe to remove” :)

Acties:
  • +1 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:23
FCA 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]
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 dat
spoiler:
je elke edge in de graaf maar 1 keer mag bezoeken, maar elke vertex meerdere keren. Dat is een heel ander probleem!

En ook plaatjes gemaakt van de graaf:

Afbeeldingslocatie: https://i.imgur.com/6KkBgYv.png Afbeeldingslocatie: https://i.imgur.com/sUlztjZ.png

(De kleuren geven aan of een vertex een even of oneven aantal buren heeft. Dat heb je nergens voor nodig.)

edit: de plaatjes kloppen niet eens :X Dit zijn de correcte versies:

Voorbeeld deel 1 / 2:
Afbeeldingslocatie: https://i.imgur.com/Mv1799R.png Afbeeldingslocatie: https://i.imgur.com/9B3pOgy.png

Officiële invoer deel 1 / 2:
Afbeeldingslocatie: https://i.imgur.com/pRCzhkI.png Afbeeldingslocatie: https://i.imgur.com/vhZgA9p.png


Uiteindelijk hetzelfde gedaan als jij, maar ook een teleurstellende runtime simpelweg vanwege het grote aantal mogelijkheden. Nog even nadenken of dat efficiënter kan. Overigens is het in z'n algemeenheid wel een NP-compleet probleem.

[ Voor 23% gewijzigd door Soultaker op 23-12-2023 19:42 ]


Acties:
  • +2 Henk 'm!

  • Remcoder
  • Registratie: November 2004
  • Laatst online: 06-05 23:25
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? :P
Ik kwam deze observatie tegen dat dag 21 juist de cellular automaton opdracht was. Ik zie best wat die daar bedoelt.

Acties:
  • +1 Henk 'm!

  • Asgardian28
  • Registratie: December 2012
  • Laatst online: 17:57
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.
Ah nice catch.

Ik heb vandaag met 112e mn beste klassering gehaald!
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.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:23
Asgardian28 schreef op zaterdag 23 december 2023 @ 12:20:
Ik heb vandaag met 112e mn beste klassering gehaald!
Gefeliciteerd!
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.
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.)

[ Voor 4% gewijzigd door Soultaker op 23-12-2023 12:34 ]


Acties:
  • 0 Henk 'm!

  • Diderikdm
  • Registratie: December 2020
  • Laatst online: 04-01-2024
Was best snel met p2 vandaag

spoiler:
Omdat ik bij part 1 al de conjunctions relatief aan elkaar had berekend om mee te gaan rekenen.


Maar nu nog ~55s runtime voor p2 :r ... Dus ik ga er nog even mee stoeien.

Voor wie de huidige staat wil zien:

Python

Acties:
  • 0 Henk 'm!

  • Asgardian28
  • Registratie: December 2012
  • Laatst online: 17:57
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

Ik was even in de war omdat je bij weighted edges standaard dijkstra gebruikt. :X

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:23
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
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?

Staat je code ergens online trouwens?

Acties:
  • 0 Henk 'm!

  • Asgardian28
  • Registratie: December 2012
  • Laatst online: 17:57
Kan kloppen, doet er 2,5 minuut over
https://github.com/jvanel...ong%20Walk/solution.ipynb

Acties:
  • +1 Henk 'm!

  • Friits
  • Registratie: December 2023
  • Laatst online: 15-05 16:24
Leuke puzzel vandaag! Zoals de meesten hier maak ik een vereenvoudigde graaf. Oplossen kost voor mijn input 15 seconden, maar ik heb geoptimaliseerd voor leesbaarheid, niet performance :P

Code (Python)

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:44

.oisyn

Moderator Devschuur®

Demotivational Speaker

Soultaker 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” :)
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. Als ik dat support kom ik ook op 71. Ik vind persoonlijk dat je je input moet fixen ;)

[ 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.


Acties:
  • +1 Henk 'm!

  • CrossProd
  • Registratie: November 2014
  • Laatst online: 18-04 13:43
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. Kleine optimalisatie is het opslaan van bezochte nodes in een Int met bit flags want er zijn toch maar 36 nodes. Scheelt weer het bijhouden van bv een Set.

BV:
visitedNodes |= (1 << startIndex)

for edge in edges where (visitedNodes & (1 << edge.b)) == 0 { ... }


Dag 23 in Swift

[ Voor 8% gewijzigd door CrossProd op 23-12-2023 13:31 ]


Acties:
  • +1 Henk 'm!

  • Remcoder
  • Registratie: November 2004
  • Laatst online: 06-05 23:25
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.)
spoiler:
Bij mijn input werkte het blijkbaar :P

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. _O-

Acties:
  • +1 Henk 'm!

  • MatHack
  • Registratie: Oktober 2001
  • Niet online

MatHack

Dev by day, Gamer by night

spoiler:
Had zelf ook al bedacht om de grid naar een graaf te converteren en daardoor gingen deel 1 (beide invoer) + deel 2 (testinvoer) lekker snel. Helaas duurt de echte invoer voor deel 2 lang, maar gaf wel het juiste antwoord.


https://github.com/realma...de.Y2023/Solvers/Day23.cs

There's no place like 127.0.0.1


Acties:
  • +1 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:23
Diderikdm schreef op zaterdag 23 december 2023 @ 13:00:
Maar nu nog ~55s runtime voor p2 :r ... Dus ik ga er nog even mee stoeien.

Voor wie de huidige staat wil zien: Python
Het is in ieder geval correct! Je kunt het nog aanzienlijk sneller maken (spoiler!):

spoiler:
In je huidige oplossing bestaat je state uit (steps, current, seen). Je sorteert seen wat een goed optimalisatie is om het aantal states van O(V × V!) naar O(V × 2V) te verlagen. Maar je doet nu nog onnodig extra werk omdat je dezelfde combinatie van (current, seen) meerdere keren bezoekt, namelijk élke keer dat je steps verlaagt (wat in de officiële testinvoer gelukkig niet vaak voorkomt).

Om dat sneller te maken moet je het van de andere kant bekijken. Bereken niet hoeveel stappen je nodig hebt om tot current te komen, maar bereken wat de maximale afstand tot het eindpunt is gegeven current en seen.
Ah ja, dat verklaart het :P Bijzonder dat je voor een iteratieve oplossing met een while-loop gekozen hebt in plaats van een simpelere DFS met een recursieve functie. En de ordening van de deque, daar heb je hier niets aan (maar kwaad kan het ook niet). Wel lekker strakke code om de graaf voor deel 2 op te bouwen.

Trouwens wel leuk om te zien dat Github die notebook kan previewen.
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.
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.

[ Voor 18% gewijzigd door Soultaker op 23-12-2023 14:29 ]


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:23
.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.
Dat was expres, precies omdat het volgens het problem statement kan. De negatieve/overlappende z-coördinaten was onbedoeld.
Ik vind persoonlijk dat je je input moet fixen ;)
Waarom? Jij hebt je code toch al gefixt :P

Maar je mag ook testinvoer 3 oplossen, die heeft volgens mij geen geïnverteerde coördinaten.

Acties:
  • +1 Henk 'm!

  • Remcoder
  • Registratie: November 2004
  • Laatst online: 06-05 23:25
Remcoder schreef op zaterdag 23 december 2023 @ 14:08:
[...]

spoiler:
Bij mijn input werkte het blijkbaar :P

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. _O-
spoiler:
Helaas ging diezelfde vlieger niet op voor deel 2, dus toch maar even een nette oplossing gemaakt die voor elke input kan werken.

De efficientie laat te wensen over, voor deel 2 draait die 17 seconden.

Ik bouw eerst een graph op met de kruispunten als nodes, dan bepaal ik elk mogelijk pad dat naar de exit kan leiden, en daarvan geef ik dan de grootste lengte terug.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:23
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.
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 er

Acties:
  • +1 Henk 'm!

  • CrossProd
  • Registratie: November 2014
  • Laatst online: 18-04 13:43
[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.
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.

Acties:
  • +1 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:23
CrossProd 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.
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 :)

Acties:
  • 0 Henk 'm!

  • MatHack
  • Registratie: Oktober 2001
  • Niet online

MatHack

Dev by day, Gamer by night

Ik was niet tevreden met mijn oplossing van dag 22, het werkte, maar was supertraag (~30s totaal voor beide antwoorden) en ik wist dat ik die toch zeker nog een stuk kon verbeteren, nou dat is gelukt. Voornamelijk verbetering van datatypes en berekeningen. Nu runnen beide sets in ongeveer 75ms, dat is 400x zo snel. Nu ben ik wel tevreden over mijn oplossing. :*)

https://github.com/realma...de.Y2023/Solvers/Day22.cs

There's no place like 127.0.0.1


Acties:
  • 0 Henk 'm!

  • CrossProd
  • Registratie: November 2014
  • Laatst online: 18-04 13:43
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 :)
Bedankt voor deze check!

Acties:
  • +1 Henk 'm!

  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 01-04 21:59
Ik heb veel tijd besteed aan debuggen aan de recursieve functie. Ik ben (python) niet gewend en dat ie alles by reference doorgeeft. Daarom en omdat ik uberhaupt niet goed bezig was, minder goed gevoel overgehouden aan vandaag, terwijl ik qua aanpak goed zat.
spoiler: day 23, part 2
Voor part 1 gelijk de graaf opgezet. De wat lange looptijd van de code voor part 2 lag zo te lezen niet aan mij alleen.
Ik vind 1.262.816 verschillende routes door het doolhof en analyseer daarvoor 30.580.293 stapjes in 70 seconde.

[ Voor 11% gewijzigd door Bolukan op 23-12-2023 18:45 ]


Acties:
  • +1 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:44

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zo, hèhè, eindelijk even tijd gehad om de bug uit mijn day22 algo te halen :)

Officiele input: 582.3µs

Op @Soultaker's sets:
1: 3,949.0µs
2: 159,689.1µs
3: 244,243.6µs

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.

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.

[ 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.


Acties:
  • +2 Henk 'm!

  • jeroenheijmans
  • Registratie: Maart 2012
  • Laatst online: 07-12-2024
Even tussendoor met een meta-berichtje, niet aan een dag gerelateerd. Voor de liefhebbers heb ik de resultaten van mijn jaarlijkse Advent of Code Survey gepubliceerd, dit jaar 3000+ mensen die 'm hebben ingvuld dus geeft enig beeld van wat men doet en gebruikt.Met sneak peek van de resultaten hieronder.

spoiler: Multi-select vraag: "anno 2023 what are your thoughts on AI and LLM's for Advent of Code?"
Afbeeldingslocatie: https://tweakers.net/i/aMSr9ruPAyzWGJqO8Mc7782CCMA=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/UfLVP3TYlW2I9D1oxSiZ20XE.png?f=user_large


Enjoy! En succes met de laatste puzzels natuurlijk allemaal :)

Acties:
  • +1 Henk 'm!

  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 01-04 21:59
spoiler: day 23, part 2
Afbeeldingslocatie: https://tweakers.net/i/LWy0xtAAFz6OWeC-d8_QPIziL-A=/full-fit-in/4000x4000/filters:no_upscale():strip_exif()/f/image/oSVdqMLI82aByZzvkVxzNqd2.png?f=user_large


Dit verklaart de hoeveelheid routes tussen begin (1) en eind (36)

[ Voor 42% gewijzigd door Bolukan op 23-12-2023 21:51 ]


Acties:
  • +1 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:44

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik vond dat mijn dag 23 deel 2 er wel erg lang over deed. Ik print ondertussen de tot nu toe langst gevonden route, maar daar was al een tijdje geen update op geweest. Ik doe nog niet aan pruning verder dus ik ging gewoon eens kijken of dat dan het juiste antwoord was.

"Your anwer is too high"

Wait, what?! 8)7
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!
d'Oh! :F Ik maak dus exact dezelfde fout. Typisch dat dat niet op deel 1 van toepassing is, noch op het voorbeeld.
spoiler:
Inderdaad even niet bedacht dat alle nodes natuurlijk dezelfde tile delen. Je kunt dus niet naar dezelfde node maar dan een ander pad nemen, want die ene tile die alle paden verbindt is al belopen 8)7


spoiler:
Mijn graaf for good measure

Afbeeldingslocatie: https://tweakers.net/i/bXEB43IaH9m6-EdNwvzdTo7EX0w=/x800/filters:strip_exif()/f/image/FxNLWgyaivnw7Cy0ZDp65WsO.png?f=fotoalbum_large

[ 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.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:44

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik vind het wel goed zo.
Day23 in Rust
Time spent: 2,6s.

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.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:23
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.

Acties:
  • +1 Henk 'm!

  • MatHack
  • Registratie: Oktober 2001
  • Niet online

MatHack

Dev by day, Gamer by night

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.

There's no place like 127.0.0.1


Acties:
  • +1 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
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.
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...

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:23
EfBe 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 deel 1 is dat i.d.d. voldoende maar ik zit vast op deel 2 :)

Acties:
  • +1 Henk 'm!

  • MatHack
  • Registratie: Oktober 2001
  • Niet online

MatHack

Dev by day, Gamer by night

Deel 1 ondertussen gelukt, deel 2 was nog erger dan ik had verwacht.

spoiler: deel 1
Had 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.

[ Voor 10% gewijzigd door MatHack op 24-12-2023 09:56 ]

There's no place like 127.0.0.1


Acties:
  • +1 Henk 'm!

  • Remcoder
  • Registratie: November 2004
  • Laatst online: 06-05 23:25
MatHack schreef op zondag 24 december 2023 @ 09:52:
Deel 1 ondertussen gelukt, deel 2 was nog erger dan ik had verwacht.

spoiler: deel 1
Had 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.
spoiler:
Die eerste formule werkt ook, alleen passen de tussen resultaten niet in een 64 bits getal. Als je die aanpast naar iets wat werkt met grotere getallen krijg je het goede resultaat eruit.

Bij mijn oplossing heb ik dus alles omgebouwd naar BigDecimals, daar krijg ik de goede resultaten uit.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:44

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dit wordt zo te zien een makkie. Jammer dat ik wrinig tijd heb vandaag :Y)

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.


Acties:
  • +3 Henk 'm!

  • MrHaas
  • Registratie: Maart 2009
  • Laatst online: 01-05 10:06
spoiler:
Heb deel 2 ook nog niet, maar ik vermoed dat je iets kan met de punten die dezelfde snelheid in een bepaalde richting hebben, volgens mij kan je daarmee het aantal mogelijke snelheden van de steen die je gooit in een bepaalde richting flink reduceren.

/edit: hiermee is het me inmiddels gelukt om de velocity vector te vinden, nu nog de positie :)
/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 :P

[ Voor 58% gewijzigd door MrHaas op 24-12-2023 16:31 ]


Acties:
  • +1 Henk 'm!

  • Asgardian28
  • Registratie: December 2012
  • Laatst online: 17:57
spoiler:
Jeeeee wat een kraker weer zeg. Net klaar na 7,5 uur kloooooten

Ik heb heel lang zitten in formules om een vlak te bepalen op basis van twee parallelle lijnen en dan kijken wanneer de andere lijnen hiermee snijden. Voor de testcase werkte dit, maar niet voor het antwoord. Dus dat was een doodlopend spoor. Ook voor het eerst met GPT geprobeerd om dit soort wiskundige ellende uit te vogelen. Dat viel me eigenlijk nog vies tegen, met code die niet werkt e.d.

Om 13:15 kwam ik op het idee om Z3 te gebruiken. En 13:30 had ik het antwoord, in 1x goed. Heel blij mee maakt een hoop van de voorgaande uren goed.

En kwam goed uit want nu snel naar de familie voor kerstdiner.

Acties:
  • 0 Henk 'm!

  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 01-04 21:59
spoiler: day 24, part 2
Zojuist 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.

Acties:
  • 0 Henk 'm!

  • MatHack
  • Registratie: Oktober 2001
  • Niet online

MatHack

Dev by day, Gamer by night

Bolukan schreef op zondag 24 december 2023 @ 16:37:
spoiler: day 24, part 2
Zojuist 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.
spoiler: dag 24, deel 2
Hoe bedoel je dat? Ik had al wel gemerkt dat er maar een enkele paren niet kruisen in het eerste deel. Bedoel je dat je nog iets extra's kunt met de paren die je in deel 1 hebt gevonden, want je gebruikt de Z-as niet in deel 1?

There's no place like 127.0.0.1


Acties:
  • +1 Henk 'm!

  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 01-04 21:59
spoiler:
Waar ik aan denk is dat je 300 lijnen in de tijd kunt tekenen die ergens een lijn die je zoekt doorkruist, waarbij het tijdstip niet belangrijk is (niet belangrijk = per vergelijking anders).
In tegenstelling tot part 1 doe je dat niet tussen die 300 vergelijkingen maar met de onbekende 301e vergelijking, waarvan je de parameters nog niet kent.


Afbeeldingslocatie: https://tweakers.net/i/tHpfsFMK-jeF_xWUEl57noBCTOo=/800x/filters:strip_exif()/f/image/vxguCqp2UbT9gOC6C472WTA4.png?f=fotoalbum_large

[ Voor 68% gewijzigd door Bolukan op 24-12-2023 17:29 ]


Acties:
  • +1 Henk 'm!

  • Diderikdm
  • Registratie: December 2020
  • Laatst online: 04-01-2024
spoiler:
Ben deel 2 nog aan het uitwerken, maar volgens mij zou je aan 3 (met verschillende velocities (geen veelvoud van elkaar) lijnen genoeg moeten hebben om hier een raaklijn op te tekenen. De rock moet immers alle hailstones raken, dus zou dat het pad moeten zijn qua velocity voor de rock, daarna zou je met het tijdstip van een lijn van start tot raakpunt terug kunnen redeneren wat de xyz zou moeten zijn op basis van tijd stappen terug op de raaklijn.

Acties:
  • +1 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:23
Ik heb het ook weer even opgepakt. Momenteel ben ik aan het werken met getallen modulo 529233060817505690510304950800612746886167535693661804372887187718111564412284041920041722342379610808287460926855236217917467249455008000. Geen idee of ik brilliant ben of compleet zot; een van de twee in ieder geval :P

edit: Ik ben brilliant!

[ Voor 5% gewijzigd door Soultaker op 24-12-2023 19:14 ]


Acties:
  • 0 Henk 'm!

  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 01-04 21:59
spoiler: even nadenken
als we de te vinden lijn nummer 0 geven, en de rest 1 tm 300:
1) pxi + ti * dxi = px0 + ti * dx0 voor i=1..300 en idem voor y en z

Herschreven tot:
2) px0 = pxi + ti * ( dxi - dx0 )

Toegepast op i=1 en 2:
3) px1 + t1 * ( dx1 - dx0 ) = px2 + t2 * ( dx2 - dx0 )
idem voor y en z

Herschreven:
4) ( px1 - px2 + t1 * dx1 - t2 * dx2 ) / ( t2 - t1 ) = dx0

en de rest komt na de kerstnachtdienst :)

Acties:
  • 0 Henk 'm!

  • arnold_m
  • Registratie: Januari 2010
  • Laatst online: 18:54
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.
Ik heb er vrij lang over gedaan, maar ik heb een oplosser geprogrammeerd die geen floating-pointgetallen gebruikt.
spoiler:
Bij deel 2 moest ik wel grootste gemene delers bepalen en op tijd variabelen omlaagschalen, omdat mijn algoritme anders overflows produceerde met de i128 van Rust.

flickr


Acties:
  • +1 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:23
Zo, dag 23 eindelijk af (Python code). Ik zat al een tijdje in de correcte richting te denken maar de implementatie-details waren nog wel tricky.

Als iemand interesse heeft kan ik (morgen of overmorgen) een gedetailleerde uitleg posten.
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 :P
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.
.oisyn schreef op zondag 24 december 2023 @ 11:10:
Dit wordt zo te zien een makkie. Jammer dat ik wrinig tijd heb vandaag :Y)
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.)
Bolukan schreef op zondag 24 december 2023 @ 19:05:
spoiler: even nadenken
Herschreven:
4) ( px1 - px2 + t1 * dx1 - t2 * dx2 ) / ( t2 - t1 ) = dx0

en de rest komt na de kerstnachtdienst :)
Ik had op enig moment dezelfde vergelijking opgesteld, maar
spoiler:
het probleem is dat de deling de vergelijking niet-lineair maakt, en dan wordt het heel moeilijk oplossen. Mogelijk moet je dus in een andere richting denken.
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.
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.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:44

.oisyn

Moderator Devschuur®

Demotivational Speaker

Soultaker 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.)
Daarom. Lijnintersecties tik ik uit het hoofd in :P. Volgens mij kun je ook wel bepalen of het intersectiepunt in het vierkant ligt zonder het uit te rekenen.

Jammer dat ik deel 2 nog niet kan inzien.

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.


Acties:
  • 0 Henk 'm!

  • MatHack
  • Registratie: Oktober 2001
  • Niet online

MatHack

Dev by day, Gamer by night

Uiteindelijk heb ik voor deel 2 een implementatie gejat van iemand op reddit die het zonder allerlei externe libraries heeft geïmplementeerd (en waarvan ik ook begreep wat er gebeurde). Dit is toch echt veel wiskunde en dan is voor mij de lol op een gegeven moment er wel vanaf, omdat het niet echt een programmeer puzzel is. De oplossing werkt alleen voor de echte set, niet voor de testset.
Ik begrijp de oplossing wel, maar was er zelf niet opgekomen.

spoiler:
Eerst de snelheid van de steen bepalen door te zoeken naar punten met gelijke snelheid op de verschillende assen, als zelfde snelheid dan moeten ze een bepaalde afstand van elkaar liggen (modulo berekening). Als je dit voor alle drie dimensies hebt gedaan kun je met twee willekeurige punten uitrekenen wat de start positie is.

There's no place like 127.0.0.1


Acties:
  • +1 Henk 'm!

  • FCA
  • Registratie: April 2000
  • Laatst online: 18-05 21:46

FCA

Pfff...
Ga later nog maar eens kijken naar de andere oplossingen, wat ik gemist heb, ben er even klaar mee. :O
spoiler:
Deel 1 inderdaad goed te doen. Deel 2 daarentegen....
Eerst met wat geprutst 3 vergelijkingen met 3 onbekenden, alleen niet lineair (inhomogeen bilinear), door in te zien dat als A_12 = (H_1 + t_1 V_1) - (H_2 + t_2 V_2) en A_13 = (H_1 + t_1 V_1) - (H_3 + t_3 V_3) parallel zijn (wat ze moeten zijn, anders kan er geen steen door alle 3 heen), dan krijg je uit crossproduct(A_12, A_13) = 0,
3 vergelijkingen met 3 onbekenden (de t_1, t_2 en t_3).
Alleen niet-lineair...
Eerst brute-force geprobeerd, maar dat ging hem niet worden.
Toen ingezien dat je t_3 uit t_1 en t_2 kunt bepalen, maar ook een brute-force search over t_1 en t_2 ging hem niet worden.
Toen met veel gepruts een vergelijking voor t_3 en t_2 uit t_1 kunnen bepalen (Sylvester matrices en resultant polynomials...). Maar ook een brute-force over t_1 alleen ging hem niet worden.

Er is een mogelijkheid om t_1 ook direct te bepalen, maar na talloze vellen papier volgekladderd te hebben kwam ik tot de conclusie dat dat een 6e graads polynoom zou worden. Die gaan we niet proberen op te lossen (hoewel ik vermoed dat er wel een mooie algebraische oplossing zou zijn, gezien het feit dat de oplossing in integers uitgedrukt kon worden).

Ook nog geprobeerd: de oplossing benaderen door een gradient descent search. Werkt niet, door de grote getallen gaat het niet convergeren.

Toen maar sympy erbij gepakt: oorspronkelijke vergelijking erin stoppen, fout antwoord krijgen :(
Toen alle numpy (cross products e.d.) vervangen door bare python, en alles opnieuw uitrekenen. Nu een vergelijking waarin t3 een onbekende bleef: er is blijkbaar nog een vrijheidsgraad over. Nu met sympy de resulterende 2 vergelijkingen (een voor t1 in termen van t3, een voor t2 in termen van t3) diophantisch oplossen (dus alleen integers...). Eindelijk de oplossing, maar door het gebruik van Sympy niet echt voldoening :|
Wel nog even gecheckt, mijn methode met 1 variable brute force werkte correct als ik rond de goede waarde zoek, maar ja, brute force naar ~60 miljard gaat hem niet worden.


spoiler:
Zie nu (op reddit) dat ik het om had kunnen schrijven naar 6 lineaire vergelijkingen met 6 onbekenden... dat had ik wel kunnen oplossen :'(
Ik ben te geintrigeerd door moeilijke oplossingen blijkbaar.
Andere mogelijkheid was blijkbaar brute-force op snelheden van de steen, dat is natuurlijk flauw dat dat werkt

[ Voor 7% gewijzigd door FCA op 24-12-2023 22:44 ]

Verandert z'n sig te weinig.


Acties:
  • +2 Henk 'm!

  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 01-04 21:59
"You have completed day 24 !" _/-\o_

Acties:
  • +1 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:44

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zo, in een keer goed, maar ik heb wel 2 uur zitten debuggen voor een stom foutje |:(
day24 in Rust
Time spent: 26533.6µs

Deel 2 was wel even pittig ja. Deel 1 had ik in 15 minuten ingetypt :)

spoiler:
Ik heb het uiteindelijk opgelost door voor paren van stenen die op een as dezelfde snelheid hebben een verzameling van mogelijke snelheden (de delers van de afstand tussen die stenen op die as, relatief aan hun snelheid) bepaald, die ik uiteindelijk wegstreep tegen de mogelijke snelheden bij andere paren.

Blijkt dat je voor de officiele input maar 1 mogelijkheid per as overhoud, maar voor het voorbeeld is dat niet zo, dus ik heb het generiek geimplementeerd waarbij hij ze gewoon probeert. Met een snelheid op 1 as de twee snijpunten op een andere as bepaald om op zo'n manier op te lossen voor positie en snelheden op alle assen. En dan kijken of dat de juiste oplossing is voor alle stenen.


spoiler:
Ah ik zie dat meer mensen voor die oplossing hebben gekozen :D
Deel 2 gewoon in i64. Ik had even geen zin om over deel 1 na te denken dus daar wel even een i128 gebruikt.

[ 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.


Acties:
  • +1 Henk 'm!

  • Asgardian28
  • Registratie: December 2012
  • Laatst online: 17:57
Nou dat was het weer mensen, ik vond het een moeilijk jaar! Vooral dag 21 en 24... Maar ze waren allemaal interessant. En vandaag een leuke om het af te sluiten.

spoiler:
Ik had gelukkig een graaf visualisatie functie gemaakt, die kon ik nu mooi gebruiken.
Maar goed ook, want op reddit blijkt dat veel mensen min cut methode hebben gebruikt, had ik nog nooit van gehoord.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:23
Fijne kerstdagen allemaal!

Dag 25:

spoiler: Oplossing voor dag 25
Eerst probeerde ik 'm gewoon te brute forcen: voor elke drie edges een depth-first search om de componenten te detecteren. Dat was natuurlijk veel te traag. Toen had ik code geschreven om cliques te detecteren en samen te trekken. Dat werkte uitstekend op de voorbeeldinvoer, maar de officiële invoer blijkt geen cliques groter dan 3 te hebben, dus dat bleek verspilde tijd.

Uiteindelijk heb ik het Ford-Fulkerson algoritme maar geïmplementeerd om de minimum cut in de graaf te vinden. Probleem is dat je een start- en een eindvertex moet hebben in aparte componenten, anders vind je de minimum cut niet. Ik heb dat simpelweg opgelost door in een while-loop random twee vertices te kiezen. Als de componenten ongeveer even groot zijn is de kans dat je twee goede vertices hebt ongeveer 50%. Vraag me af of dat slimmer kan.


Python code: 25-minimal.py (~150 ms) (of 25.py voor een iets leesbaardere versie).

spoiler: Alternatieve aanpak
Het 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.

Afbeeldingslocatie: https://i.imgur.com/WI5mAS4.png%5D Afbeeldingslocatie: https://i.imgur.com/kKxm6Jj.png

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.

edit:
neato maakt er ook een “mooi” plaatje van:
Afbeeldingslocatie: https://i.imgur.com/Xwim9D8.png

De edges binnen de componenten zijn een grote warboel maar de drie kritieke edges tússen de componenten zijn duidelijk herkenbaar, en dat is precies de informatie die je nodig hebt :) Jammer dat ik dit niet meteen geprobeerd had. Had me een heleboel tijd gescheeld (al had ik het probleem ook nog écht op willen lossen).

[ Voor 12% gewijzigd door Soultaker op 25-12-2023 14:45 ]


Acties:
  • +2 Henk 'm!

  • FCA
  • Registratie: April 2000
  • Laatst online: 18-05 21:46

FCA

Dat was hem dan. Ik vond hem voor dag 25 best een pittige eigenlijk. Wel snel gedaan, gelukje.
spoiler:
Ik had ooit (voor programmeerwedstrijden in het verleden) Edmonds-Karp voor max-flow geimplementeerd, dus een 2e keer (en nu in Python) ging redelijk soepel.

Min-cut uit de max flow halen, door over source en target te loopen, en dan stoppen zodra er 1 van 3 is gevonden.
Complexiteit wijs beetje dubieus (O(V^3 E^2)) door de loop over source en target, maar je kunt gelukkig stoppen zodra je de edges hebt gevonden.
Daarna nog connected components inkleuren met een queue.


Ik merk dat ik wel een beetje klaar met AoC was. Vooral dag 21 en 24, waarin ik vast bleef zitten in een oplossingsrichting die weliswaar mogelijk was, maar een veel simpelere (werkend althans op de gegeven input) ook beter was, waren eigenlijk niet leuk. Volgend jaar een andere aanpak kiezen (andere taal eens, om kennis daarvan uit te diepen?) en zeker niet meer in de weekenden om 6 uur beginnen.

Verandert z'n sig te weinig.


Acties:
  • +3 Henk 'm!

  • H34H
  • Registratie: November 2020
  • Laatst online: 30-04 14:00
Ik heb nog niet in gepost in dit topic, maar wel veel interesse gevolgd. Voor mij was dit het derde jaar dat ik meedeed en voor het eerst dat ik er redelijk soepel doorheen fietste. Dank voor al jullie inzichten! Ik heb uiteindelijk niet alle sterren binnen geharkt, maar wel weer enorm veel geleerd. Speciale shoutout naar @Soultaker , je zou docent moeten worden. :)

Fijne dagen allemaal!

Acties:
  • +1 Henk 'm!

  • Remcoder
  • Registratie: November 2004
  • Laatst online: 06-05 23:25
Ik heb ook weer alle sterren binnen gehaald.

spoiler:
Vandaag opgelost op basis van de aanname dat edges die gecut moeten worden ertoe leiden dat de afstand tussen die 2 nodes het grootste wordt.

Ik probeer dus elke edge te snijden en daarna de nieuwe afstand tussen die 2 nodes te bepalen.

De edges die de grootste afstand opleveren moeten dan doorgesneden worden.

Daarna pak ik van de eerste edge beide nodes en bepaal per node welke nodes er allemaal bij horen. Van die 2 sets geef ik dan het formaat terug.

Het werkt niet voor elke willekeurige graaf, maar voor de AoC inputs wel.

Acties:
  • +1 Henk 'm!

  • P_Tingen
  • Registratie: Maart 2005
  • Laatst online: 21:07

P_Tingen

omdat het KAN

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!

... en gaat over tot de orde van de dag


Acties:
  • 0 Henk 'm!

  • MrHaas
  • Registratie: Maart 2009
  • Laatst online: 01-05 10:06
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.

Acties:
  • +1 Henk 'm!

  • Friits
  • Registratie: December 2023
  • Laatst online: 15-05 16:24
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!
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.

Bijvoorbeeld gisteren: vergeleken met de code van .oisyn voelen mijn 20 regels Python een beetje als Lego ;)

Tot slot nog mijn code voor vandaag, met iets wat lijkt op Karger's.

Acties:
  • +2 Henk 'm!

  • Asgardian28
  • Registratie: December 2012
  • Laatst online: 17:57
Soultaker schreef op maandag 25 december 2023 @ 08:26:
Fijne kerstdagen allemaal!

Dag 25:
spoiler: Alternatieve aanpak
Het 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.
spoiler:
Je kan ook networkx met graphviz gebruiken, uiteindelijk is het dan zo'n soort regel om te visualiseren
nx.nx_agraph.graphviz_layout(G,prog='neato', args ='')

Dan krijg je zoiets https://github.com/jvanel...nowverload/solution.ipynb

[ Voor 10% gewijzigd door Asgardian28 op 25-12-2023 11:27 ]


Acties:
  • +1 Henk 'm!

  • MatHack
  • Registratie: Oktober 2001
  • Niet online

MatHack

Dev by day, Gamer by night

Pfff... ik had een simpele verwacht vandaag, maar dat was dus niet zo.
Moet zeggen dat ik @FCA's mening wel deel met dat ik er ook wel een beetje klaar mee ben.

spoiler:
Na een kleine zoektocht op internet eerst maar Wikipedia: Stoer–Wagner algorithm geïmplementeerd, maar mijn implementatie gaf het foute antwoord. Geen idee waarom, maar toen maar Wikipedia: Karger's algorithm gepakt met een check op 3 cuts.

https://github.com/realma...de.Y2023/Solvers/Day25.cs

There's no place like 127.0.0.1


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:23
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.
spoiler:
Leuk, die kende ik nog niet! Interessant om te zien dat zowel dit als mijn compleet andere algoritme allebei gebruik maken van randomization.
MatHack 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.
Ik ben vooral ontzettend klaar met het “vroeg opstaan” aspect van de competitie :P




Voor het geval iemand toch nog tijd over heeft vandaag, of misschien morgen teleurgesteld is dat er geen nieuw probleem is om op te lossen, hier wat extra testinvoer voor dag 25:
aoc-2023-day-25-challenge-1-to-4.zip

Correcte antwoorden eindigen op: ..16144, ..05408, ..80480 en ..41796.

Acties:
  • 0 Henk 'm!

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 20:56

Varienaja

Wie dit leest is gek.

Lollig. Nog niemand die het algoritme gebruikt heeft?

Siditamentis astuentis pactum.


Acties:
  • +1 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:23
Gebruikt? Ik had er nog nooit van gehoord :P

Acties:
  • 0 Henk 'm!

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 20:56

Varienaja

Wie dit leest is gek.

Soultaker schreef op maandag 25 december 2023 @ 12:39:
Gebruikt? Ik had er nog nooit van gehoord :P
Ik natuurlijk ook niet tot vanmorgen.

Siditamentis astuentis pactum.


Acties:
  • +1 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:44

.oisyn

Moderator Devschuur®

Demotivational Speaker

Grappig, de puzzel van vandaag is precies iets waar ik afgelopen tijd op m'n werk mee bezig ben geweest :D

spoiler:
Namelijk het partitioneren van een graaf in N delen waarbij je de edge cut minimaliseert. Ik gebruik daar een library voor. Zou wel flauw zijn om die gewoon aan te slingeren :P


Hier trouwens een representatie van het voorbeeld waarin het op het oog direct duidelijk is welke je moet knippen.
Afbeeldingslocatie: https://tweakers.net/i/lBj5Amp5qFzhOem7i_Tvnps12h0=/800x/filters:strip_exif()/f/image/p18HqrnsQMPNqaqPmuV29CiV.png?f=fotoalbum_large

[ 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.


Acties:
  • +1 Henk 'm!

  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 01-04 21:59
The End
spoiler: day 25
Ik heb alle bovengenoemde wiki's gevonden en doorgelezen, maar ik snapte het idee maar half en had de energie niet (day 24 nam ook wat tijd) om die rabbit hole te bewandelen.
Dus gezocht naar een short-cut en net als @Remcoder de zwakste schakels opgezocht, verwijderd uit de graph en toen bleken xxx items opeens op distance Infinity te zitten.

Snel de BIG RED BUTTON ingedrukt en de global snow production is hersteld. Eind goed al goed. Fijne feestdagen iedereen.

Acties:
  • +4 Henk 'm!

  • Daanoz
  • Registratie: Oktober 2007
  • Laatst online: 18-05 11:44
Poeh, was een heftige klus dit jaar. Dankzij de switch naar een andere taal wel eindelijk een keertje de 1 second challenge gehaald :). Was even bang dat het niet ging lukken de laatste paar dagen, maar met wat inspiratie links en rechts genoeg kunnen optimaliseren om eronder te blijven.

code:
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

Acties:
  • 0 Henk 'm!

  • Friits
  • Registratie: December 2023
  • Laatst online: 15-05 16:24
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?

Acties:
  • 0 Henk 'm!

  • Diderikdm
  • Registratie: December 2020
  • Laatst online: 04-01-2024
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?
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.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:44

.oisyn

Moderator Devschuur®

Demotivational Speaker

Day25 in Rust
29381.9µs

spoiler:
Voordat ik het register opentrok met een min-cut algoritme wilde ik eerst zelf wat aankloten. Ik heb een hele vieze oplossing. Voor alle edges check ik hoe lang een loopje minimaal is voor je weer bij dezelfde edge aankomt. Of anders gezegd, het kortste pad van A naar B zonder gebruik te maken van edge AB. Het euvel wil dat zowel in het voorbeeld als in de officiele input, de edges die je door moet knippen een veel langer loopje hebben dan de rest van de edges. Daarna brute-force ik het op volgorde van de loop-grootte, maar die vindt dus in deze datasets direct het antwoord bij de eerste poging.


.edit:
spoiler:
Ah volgens mij precies wat @Remcoder ook doet :)

[ 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.


Acties:
  • +4 Henk 'm!

  • Asgardian28
  • Registratie: December 2012
  • Laatst online: 17:57
Ik heb de afgelopen jaren altijd wat burnout, het is best zwaar als er een paar krakers op een rij tussen zitten. Elk jaar denk ik dit is de laatste keer dat ik voor lb ga, volgend jaar relaxed aan en mooie code schrijven. Maar dan begint het in November toch weer te kriebelen.

Acties:
  • 0 Henk 'm!

  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 01-04 21:59
Ik ben gisteravond door mijn repositories gegaan en heb alles van AOC bij elkaar gezet. Niet elk jaar meegedaan of afgemaakt, maar ik heb bewaard een jaar met C# (2016), met C++ gedraaid op een ESP32 MCU (2019), met Excel (2020) en vorig jaar (maar paar dagen) en dit jaar met Python. Misschien ook eens naar Rust en Go kijken.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:23
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?
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.

Je had je code ook kunnen testen op mijn extra testinvoer, daar gaat 'ie op de eerste invoer al mis ;)

spoiler:
Het deel van de logica dat correct is, is: als een knoop v in S meer dan drie verbindingen heeft met knopen in S \ G, dan hoort v niet in S thuis en kun je 'm verwijderen. Het probleem is dat het kan voorkomen dat geen enkele individuele knoop meer dan 3 verbindingen heeft, terwijl het totaal aantal verbindingen tussen S en S \ G nog wel groter dan 3 is, en dan kies je een willekeurige knoop, die mogelijk wel in S moet blijven.

Hier is een concreet tegenvoorbeeld:

a: b c d g
b: c d g
c: d e
d: f
e: f g h
f: g h
g: h

Dat ziet er zo uit:
Afbeeldingslocatie: https://i.imgur.com/Kb0AsGX.png

Het is duidelijk dat de componenten A = {a, b, c, d, e, f, g} en B = {h} zijn. Als je code toevallig begint met het verwijderen van e, f en g zodat S = {a, b, c, d, h} (wat consistent is met de regels), dan zul je vervolgens h willen verwijderen: h heeft immers exact 3 verbindingen met {e, f, g}, terwijl {a, b, c, d} er elk maar 1 hebben. Dan concludeer je ten onrechte dat h niet in S thuishoort, terwijl je juist met S={h} wil eindigen. Wanneer je eenmaal zo'n fout maakt is het onmogelijk die te herstellen.


Grappig genoeg geeft je code op bovenstaande voorbeeld soms wel het goede antwoord, afhankelijk van waar je toevallig begint. Blijkbaar is het een randomized algoritme, 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).

Acties:
  • +1 Henk 'm!

  • Friits
  • Registratie: December 2023
  • Laatst online: 15-05 16:24
Thanks voor de uitleg. Mijn aanpak leek al te mooi (te eenvoudig) om volledig correct te zijn. Gelukkig werkt 'ie prima op de officiële AoC inputs, en in het uitzonderlijke geval dat 'ie de mist in gaat kan ik 'm gewoon opnieuw draaien. Het is een voor een puzzeltje, niet mission-critical software :Y)
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).
Klopt, dit is er aan de hand:

Elementen worden in een set geplaatst op basis van hun hash. Sinds 3.3 wordt er bij het hashen van strings een seed gebruikt voor security-redenen. Die seed wordt random gekozen wanneer de interpreter opstart.

Je kan dit uitzetten met export PYTHONHASHSEED=0, en dan zal de volgorde ook tussen runs gelijk zijn.

[ Voor 6% gewijzigd door Friits op 26-12-2023 13:12 ]


Acties:
  • 0 Henk 'm!

  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 01-04 21:59
De volgorde van de insert in een set wordt sinds 3.7 vastgehouden en kan met list(set) worden gebruikt.

Acties:
  • 0 Henk 'm!

  • Friits
  • Registratie: December 2023
  • Laatst online: 15-05 16:24
Weet je het zeker?

code:
1
2
3
4
5
6
>>> s=set()
>>> s.add('a')
>>> s.add('b')
>>> s.add('c')
>>> list(s)
['b', 'c', 'a']


Voor zover ik weet geldt dit alleen voor dictionaries, en niet voor sets.

[ Voor 44% gewijzigd door Friits op 26-12-2023 13:37 ]


Acties:
  • 0 Henk 'm!

  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 01-04 21:59
Je hebt gelijk, ik zat hier fout. Uit de release notes 3.7:
"the insertion-order preservation nature of dict objects has been declared to be an official part of the Python language spec."

Hoewel mijn output in de juiste 17% valt:
Python:
1
{'a', 'b', 'c'}

[ Voor 18% gewijzigd door Bolukan op 26-12-2023 23:09 ]


Acties:
  • +1 Henk 'm!

  • Corniel
  • Registratie: April 2002
  • Laatst online: 31-03 14:56

Corniel

De wereld is gek!

Ik hèb dat 24 opgelost (niet op de manier die ik wilde), daarom een vraag:

spoiler:
Ik heb 1 paar van hails waarbij zowel de dX, als de dZ gelijk zijn, hebben jullie die ook, of is dat toeval?

while (me.Alive) {
me.KickAss();
}


Acties:
  • +1 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:23
Corniel schreef op woensdag 27 december 2023 @ 08:26:
spoiler: dag 24
Ik heb 1 paar van hails waarbij zowel de dX, als de dZ gelijk zijn, hebben jullie die ook, of is dat toeval?
spoiler: dag 24
Dat 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?

Acties:
  • +3 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:44

.oisyn

Moderator Devschuur®

Demotivational Speaker

spoiler: dag24
Ik 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 :P. 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.

[ 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.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:23
Beetje laten reactie, maar ik had nu pas tijd om deze slimme oplossing goed genoeg te bestuderen dat ik 'm ook volledig begrijp:
.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.
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.

Als je bijvoorbeeld aan aoc-2023-day-22-challenge-3.txt één regel toevoegt:
1,42,2~7,42,2


Dan gaat de runtime van ~400 ms naar ~7 minuten :)

Ter vergelijking, mijn snelle oplossing gebaseerd op runt deel 2 in O(V + E log V) tijd, waarbij V het aantal blokjes in de invoer is, en E het aantal paren van blokjes dat elkaar raakt.
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.
spoiler:
Hier doen we bijna precies hetzelfde, maar net wat anders. We hebben dezelfde informatie berekend: wat bij jou fall_at[x] heet, heet bij mij Parent(x).

fall_at[x] = Parent(x) = y zodat y het hoogstgelegen bokje is dat blokje x doet vallen. Deze relatie is logischerwijs transitief (als x valt wanneer y valt, en y valt wanneer z valt, dan valt x ook wanneer z valt). Je kunt het dus zien als een boomstructuur (vandaar Parent()) en dan is het antwoord op deel 2 simpelweg het aantal paren (x, y) in de boom zodat y een voorouder is van x.

Om dat aantal paren te berekenen neem jij de som van de groottes van de deelbomen (i.e., als ik dit blokje weghaal, hoeveel hogergelegen blokjes vallen er dan) wat je berekent door bij de bladeren te beginnen en dan naar beneden te werken. Ik bereken juist de som van de diepten van de knooppunten (i.e., hoeveel lagergelegen blokjes kunnen de val van dit blokje veroorzaken). Het loopt beide in O(N) tijd. Het praktische voordeel van de bottom up approach is dat je maar één pass nodig hebt. Wat niet wil zeggen dat het ook sneller is natuurlijk.

Acties:
  • 0 Henk 'm!

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
.oisyn schreef op woensdag 27 december 2023 @ 10:02:
spoiler: dag24
Ik 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 :P. 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.
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.
Ik heb trouwens vooral gewerkt met QR decomposities, eigenvectoren en eigenwaarden. Maar dat lijkt in deze opgave niet de goede aanpak te zijn.

When life gives you lemons, start a battery factory


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:44

.oisyn

Moderator Devschuur®

Demotivational Speaker

KabouterSuper schreef op woensdag 27 december 2023 @ 11:05:
[...]

Ik zou trouwens vooral bezorgd zijn over determinant=0; dit moet je dan apart gaan afvangen.
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 vermijden :)

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.


Acties:
  • +1 Henk 'm!

  • Corniel
  • Registratie: April 2002
  • Laatst online: 31-03 14:56

Corniel

De wereld is gek!

Soultaker schreef op woensdag 27 december 2023 @ 09:19:

spoiler: dag 24
Dat 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?
spoiler:
Nee, ik heb - uiteindelijk - Z3 ingezet, maar ik ben daar niet trots op. Het voelt als valsspelen.

while (me.Alive) {
me.KickAss();
}


Acties:
  • +2 Henk 'm!

  • Marcj
  • Registratie: November 2000
  • Laatst online: 20:50
Na 3 dagen worstelen is dag 24 me ook eindelijk gelukt! Ik wilde het perse zonder hints van hier halen, en het is eindelijk gelukt. Volgens mij ben ik wel tot een aantal vergelijkbare conclusies gekomen als anderen hier. Mijn observaties waarmee het lukte:

spoiler:
1) Je kunt de assen afzonderlijk verkennen om de snelheid te bepalen van de steen die je moet gooien.
2) Ik ging ervan uit dat de snelheid vrij laag zou zijn. Per as zoek ik een paar hagelstenen met dezelfde snelheid op die as. Hiermee test ik elke mogelijk snelheid, aangezien het verschil in snelheden deelbaar moet zijn door het verschil in positie. Deze stap gaat gelukkig vrij vlot.
3) Er is op 1 van de assen 1 hagelsteen met dezelfde snelheid als de snelheid van de steen. Deze kan ik gebruiken om de positie op 1 as alvast te bepalen (is dezelfde positie als die hagelsteen namelijk).
4) Daarna pak ik een hagelsteen met een snelheid die anders is op alle assen. Deze kan ik gebruiken om te bepalen in verhouden to de hagelsteen in stap 3 wat de tijd is waarop de botsing plaats vind.
5) Die tijd kan ik vervolgens gebruiken om terug te rekenen wat de startpositie van de steeds was


Wat een werk zeg...

In verhouding daartoe was dag 25 vrij eenvoudig.

spoiler:
Ik heb blijkbaar een variant gebruikt van een bekend algoritme, waarbij je een heel aantal kortste routes verkent en kijkt welke paden het meeste gebruikt worden. Als je genoeg paden hebt verkend zijn de 3 toppers hiervan duidelijk de split tussen de 2 helften.
Je hoeft trouwens maar een klein deel van de nodes te verkennen hiervoor (ongeveer de wortel van het aantal nodes) om toch al resultaat te krijgen.

Acties:
  • +2 Henk 'm!

  • bakkerjangert
  • Registratie: Februari 2012
  • Laatst online: 16:14
Pfff, eindelijk klaar. Dag 24 deel 2 kostte me wel wat moeite, uiteindelijke opgelost door het geheel om te schrijven naar een lineaire vergelijking met 4 onbekenden.

spoiler:
Deel 1:
Simpel genoeg omschrijven naar een formaat y = ax + b en de snijpunten berekenen. Zie comments in de code voor de uitwerking.

Deel 2:
Starten met 6 onbekenden van de steen. Uitwerken en oplossen in x-y vlak totdat een lineaire vergelijking met 4 onbekenden ontstaat. Deze heb ik opgelost met Numpy. Gelukkig heeft float64 van numpy genoeg precisie, al kom ik niet exact op ....,0 antwoorden. Zelfde aanpak herhalen voor x-z vlak en alle waarden zijn bekend.

Voor de geïnteresseerde hieronder de uitwerkingsstappen, ook te vinden in mijn code.

# Stone X, Y, Z, VX, VY, VZ UPPER = unknowns
# Hail x, y, z, vx, vy, vz lower = knowns
#
# Step 1: Collision of 1 hail with Stone
# X + VX.t1 = x + vx.t1
# t1.VX – t1.vx = x – X
# t1(VX – vx) = (x – X)
# t1 = (x – X)/(VX – vx) Same equations for y and z
# t1 = (y – Y)/(VY – vy)
# t1 = (z – Z)/(VZ – vz)
#
# Step 2: equation in x and y
# (x – X)/(VX – vx) = (y – Y)/(VY – vy)
# (x – X).(VY – vy) = (y – Y).(VX – vx)
# x.VY – x.vy – X.VY + X.vy = y.VX – y.vx – Y.VX + Y.vx
# Y.VX - X.VY = y.VX – y.vx + Y.vx – x.VY + x.vy – X.vy
#
# Note how left-hand side is independent of hail
#
# Step 3: add in another hail, lets say hail[i] and hail[j]
# yi.VX – yi.vxi + Y.vxi – xi.VY + xi.vyi – X.vyi = yj.VX – yj.vxj + Y.vxj – xj.VY + xj.vyj – X.vyj
# X(vyj – vyi) + Y(vxi – vxj) + VX(yi – yj) + VY(xj – xi) = yi.vxi - xi.vyi – yj.vxj + xj.vyj
#
# Note how this is just a linear equation with 4 unknowns
#
# Step 4: Solve Linear equation with 4 unknowns
# Solve with Linear Algebra (Numpy in this case) using multiple lines
#
# Step 5: replace y for z and redo calculation
Pagina: 1 ... 10 11 Laatste