En de oud papier prijs is ook niet meer wat hij geweest is....oisyn schreef op maandag 4 december 2023 @ 10:40:
[...]
Sowieso, het enige dat je met de loten blijkbaar kunt winnen is nog meer loten
mijn totaal aantal loten is ruim 8 miljoen. Als je 40 loten op een A4tje propt zijn dit 400 pakken A4 papier. :Litpho schreef op maandag 4 december 2023 @ 10:43:
[...]
En de oud papier prijs is ook niet meer wat hij geweest is...

Dat is gewoon de implementatie van wat er in de opgave staat? "Cards will never make you copy a card past the end of the table."TrailBlazer schreef op maandag 4 december 2023 @ 10:39:
spoiler:ben benieuwd hoe eerlijk deze loten zijn want de laaste paar hebben nooit meer matches dan er totaal aan loten zijn.
card 189 has 2 matches
card 190 has 1 matches
card 191 has 0 matches
TrailBlazer schreef op maandag 4 december 2023 @ 10:39:
spoiler:ben benieuwd hoe eerlijk deze loten zijn want de laaste paar hebben nooit meer matches dan er totaal aan loten zijn.
card 189 has 2 matches
card 190 has 1 matches
card 191 has 0 matches
spoiler:
Dat werd inderdaad gewoon in de opgave vermeld.
Ergens wel een beetje jammer, was wel grappig geweest als je had moeten loopen naar ticket 1, en dan maar hopen dat er iets in de opgave verscholen zit om uit de oneindige loop te komen.
Of dat het geaccepteerde antwoord daadwerkelijk #NaN is, of zo
Ergens wel een beetje jammer, was wel grappig geweest als je had moeten loopen naar ticket 1, en dan maar hopen dat er iets in de opgave verscholen zit om uit de oneindige loop te komen.
Of dat het geaccepteerde antwoord daadwerkelijk #NaN is, of zo

Dido schreef op maandag 4 december 2023 @ 12:10:
[...]
spoiler:Dat werd inderdaad gewoon in de opgave vermeld.
Ergens wel een beetje jammer, was wel grappig geweest als je had moeten loopen naar ticket 1, en dan maar hopen dat er iets in de opgave verscholen zit om uit de oneindige loop te komen.
Of dat het geaccepteerde antwoord daadwerkelijk #NaN is, of zo
spoiler:
Of hoeveel tickets missen er van de stapel? tickets * missing oid
Ik heb opgeschoond, mijn resultaat is toonbaar. Dag 4 in Java.
Siditamentis astuentis pactum.
Wat een onwijs leuke puzzel vandaag! Niet teveel hannessen met parsing enzo, maar gewoon gaan 
Python
De runtime ging van 59.56 seconden naar 0.0022 seconden
Ninja edit: ik was begonnen met het idee dat de winnende nummers verwezen naar de kaart nummer kopieën die je krijgt, maar toen dat niet het geval bleek
Python
spoiler:
Ik heb (uiteraard?) recursie gebruikt, en kon fijn spelen met functools.cache om de boel te versnellen want nu bezoekt/processed hij de kaarten talloze keren.
De runtime ging van 59.56 seconden naar 0.0022 seconden
spoiler:
Het moet vast ook mogelijk zijn om alle kaarten slechts 1 keer te doorlopen en op basis van de uitkomst daarvan een sommetje te maken, maar ik ben er nog niet helemaal uit hoe dan
Ninja edit: ik was begonnen met het idee dat de winnende nummers verwezen naar de kaart nummer kopieën die je krijgt, maar toen dat niet het geval bleek
spoiler:
kon ik die hele card ID ook aan de kant gooien.
[ Voor 15% gewijzigd door Visitor.q op 04-12-2023 12:56 ]
Visitor.q schreef op maandag 4 december 2023 @ 12:54:
Wat een onwijs leuke puzzel vandaag! Niet teveel hannessen met parsing enzo, maar gewoon gaan
Python
spoiler:Ik heb (uiteraard?) recursie gebruikt, en kon fijn spelen met functools.cache om de boel te versnellen want nu bezoekt/processed hij de kaarten talloze keren.
De runtime ging van 59.56 seconden naar 0.0022 seconden
spoiler:Het moet vast ook mogelijk zijn om alle kaarten slechts 1 keer te doorlopen en op basis van de uitkomst daarvan een sommetje te maken, maar ik ben er nog niet helemaal uit hoe dan
spoiler:
en Het aantal winnende getallen op een kaart verandert nooit
spoiler:
verder hoef je alleen maar te weten hoe vaak je een kaart krijgt, dat is puur afhankelijk van de kaarten erboven, geen andere kaarten.
Veel te lang vastgezeten op part 2 door slecht lezen. Halverwege een gare recursieve implementatie er achter komen dat je het verkeerd begrepen hebt en het simpeler is dan het leek
https://github.com/ysmild...tree/master/pkg/2023/day4
https://github.com/ysmild...tree/master/pkg/2023/day4
Visitor.q schreef op maandag 4 december 2023 @ 12:54:
spoiler:Het moet vast ook mogelijk zijn om alle kaarten slechts 1 keer te doorlopen en op basis van de uitkomst daarvan een sommetje te maken, maar ik ben er nog niet helemaal uit hoe dan
spoiler:
Twee manieren
- Hou een tabelletje bij hoeveel kopieën je van een kaart moet hebben. Als je een winnende kaart hebt, dan tel je het aantal kopieën van die kaart (incl origineel) bij de kopieën van de N opeenvolgende kaarten.
- Of, en dat is de manier die ik gebruik, hou een lijstje bij met hoeveel wins je nog hebt lopen, inclusief het aantal kopieën die voor die wins gezorgd hebben, en tel die af. Het aantal kopieën wat je van een kaart hebt is dan het origineel plus de som van alle aantallen kopieën in dat lijstje. Als een entry aftelt naar 0 dan haal je 'm weg
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.
spoiler:
Zonder recursie in python.
Een class gemaakt met ID, winnende set en set van getallen. Daarna eenvoudig de intersection van elke set gepakt. Voor part 2 de lijst met card objecten omgezet naar een dictionary zodat je eenvoudig de aantallen kan optellen bij elke volgende kaart. (aantal is daarom toegevoegd als attribute met standaard waarde 1).
[code]
Function read_cards(<class 'list'>,): time elapsed: 2.718 [ms]
Function puzzle1(<class 'list'>,): time elapsed: 0.198 [ms]
Puzzle 1: 21568
Function puzzle2(<class 'list'>,): time elapsed: 0.295 [ms]
Puzzle 2: 11827296
Function main(): time elapsed: 5.420 [ms]
[/code]
Een class gemaakt met ID, winnende set en set van getallen. Daarna eenvoudig de intersection van elke set gepakt. Voor part 2 de lijst met card objecten omgezet naar een dictionary zodat je eenvoudig de aantallen kan optellen bij elke volgende kaart. (aantal is daarom toegevoegd als attribute met standaard waarde 1).
[code]
Function read_cards(<class 'list'>,): time elapsed: 2.718 [ms]
Function puzzle1(<class 'list'>,): time elapsed: 0.198 [ms]
Puzzle 1: 21568
Function puzzle2(<class 'list'>,): time elapsed: 0.295 [ms]
Puzzle 2: 11827296
Function main(): time elapsed: 5.420 [ms]
[/code]
[ Voor 65% gewijzigd door fruitschaal2 op 04-12-2023 13:25 ]
spoiler:
Ook zonder recursie in PHP: https://github.com/BernardV/aoc2023/blob/main/day4/both.php
Ook geen multiplier gebruikt maar een bit shift, 1 << count-1 voor de punten.
Ook geen multiplier gebruikt maar een bit shift, 1 << count-1 voor de punten.
Dat moet nog veel beter kunnen, mijn eerste versie van deel 2 runt in 2,5598ms en dat is in een VM waarvan ik van vorige jaren weet dat die een stukje trager is dan direct op het systeem draaien (en debug build).Mugwump schreef op maandag 4 december 2023 @ 09:57:
Nou mijn beroepseer is gered.
spoiler:Het origineel
Total value: 5920640
Execution time 6.612145250s
De verbeterde versie
Total value: 5920640
Execution time 28.917291ms
Nog steeds niet helemaal blij met het gebruik van mutable datastructures, volgens mij kan het ook gewoon met recursief terugkijken oid.
There's no place like 127.0.0.1
Dag 4
spoiler:
Ook geen recursie. Kan vast efficiënter, maar daar kijk ik vanavond wel eens naar.. runtimes nog altijd onder de milliseconde, dus meh. Ik parse wel de input 2 keer (voor elke part los), dus er zou nog wat tijd af kunnen.
Part 1 output: (298.503µs)
Part 2 output: (301.656µs)
Part 1 output: (298.503µs)
Part 2 output: (301.656µs)
[ Voor 12% gewijzigd door MueR op 04-12-2023 14:26 ]
Anyone who gets in between me and my morning coffee should be insecure.
Godsamekrake, hier dus dezelfde fout. Ik sloeg zo ongeveer mijn monitor van het bureau omdat ik /wist/ dat het goed moest zijn, om er dan na veel te lang achter te komen dat ik dezelfde fout had gemaakt.KabouterSuper schreef op maandag 4 december 2023 @ 08:56:
Ziezo, vandaag ook weer klaar.
spoiler:Net iets te lang bezig geweest met het bepalen wat de identifiers van de Cards waren om in deel 2 de volgende kaarten te identificeren. In het voorbeeld heet de eerste kaart "Card<spatie>1", maar in de echte set "Card<spatie><spatie><spatie>1". Ik had beter het regelnummer kunnen pakken als identifier in plaats van
int(line.split(':')[0].replace(' ','')[4:])
spoiler:
in mijn geval was de makkelijkste oplossing om als eerste stap alle >1 spaties te vervangen door 1 spatie te vervangen
... en gaat over tot de orde van de dag
spoiler:
Ik zoek gewoon 1 keer naar de ':', dan naar de '|', en dan naar de newline, en dan weet ik precies waar de getallen staan op elke regel.
218µs voor het hele ding trouwens.
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.
na ene kort nachtje dag 4 in 1x allebei goed.
https://github.com/wimpel...e2023/blob/main/r/day04.R
hier mijn R-benadering:
https://github.com/wimpel...e2023/blob/main/r/day04.R
hier mijn R-benadering:
spoiler:
input splitsen in "kaart + nummers" en "kaart + winnende nummers"
daarna joinen op nummer en kaart.. je ziet dan direct welke nummers per kaart een winnend nummer zijn.
deel 1 en 2 antwoorden volgend dan vrij eenvoudig
daarna joinen op nummer en kaart.. je ziet dan direct welke nummers per kaart een winnend nummer zijn.
deel 1 en 2 antwoorden volgend dan vrij eenvoudig
Ik zit trouwens naar de personal leader board te kijken op https://adventofcode.com/2023/leaderboard/self, maar hoe moet ik die tijden interpreteren?
Het zijn geen absolute tijden, en ook niet de tijd sinds het publiceren van de puzzel.
.edit: ooh wacht, het is UTC+2 en een 12h clock. Waarom?!
Het zijn geen absolute tijden, en ook niet de tijd sinds het publiceren van de puzzel.
.edit: ooh wacht, het is UTC+2 en een 12h clock. Waarom?!

[ Voor 11% gewijzigd door .oisyn op 04-12-2023 16:24 ]
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.
Que? Het is de tijd na het beschikbaar komen van de opdracht van die dag.
Nou dit was volgens mij wel een erg makkelijke opdracht in vergelijking met de vorige dagen. Was alsnog erg laat omdat ik niet voor het werk aan de slag kon. Als ik dit had geweten, had ik een kwartiertje eerder opgestaan... Was een stuk beter geweest voor mn rankings 
Het is zoals DataGhost aangeeft de verstreken tijd sinds het vrijkomen van de puzzel..oisyn schreef op maandag 4 december 2023 @ 16:22:
Ik zit trouwens naar de personal leader board te kijken op https://adventofcode.com/2023/leaderboard/self, maar hoe moet ik die tijden interpreteren?
Het zijn geen absolute tijden, en ook niet de tijd sinds het publiceren van de puzzel.
.edit: ooh wacht, het is UTC+2 en een 12h clock. Waarom?!
De vrijdag- en weekend-opdrachten zijn meestal iets moeilijker dan het niveau de rest van de week, want dan hebben mensen doorgaans meer tijd. Nu begon het toevallig op vrijdag waardoor het al wat moeilijker leek te beginnen. Dus dat deze wat makkelijker zou zijn lag opzich wel voor de hand, alleen het leeswerk was nog wel belangrijkGropah schreef op maandag 4 december 2023 @ 16:32:
Nou dit was volgens mij wel een erg makkelijke opdracht in vergelijking met de vorige dagen. Was alsnog erg laat omdat ik niet voor het werk aan de slag kon. Als ik dit had geweten, had ik een kwartiertje eerder opgestaan... Was een stuk beter geweest voor mn rankings
[...]
Het is zoals DataGhost aangeeft de verstreken tijd sinds het vrijkomen van de puzzel.
Daar klopt in mijn geval niets van. Als ik kijk naar mijn git commits, die ik vrij vlak na het indienen van de tweede deel heb gemaakt, dan komt dat niet overeen met de looptijd van de puzzel. Die worden toch om 6:00 lokale tijd gepubliceerd?DataGhost schreef op maandag 4 december 2023 @ 16:25:
Que? Het is de tijd na het beschikbaar komen van de opdracht van die dag.
EDIT: Oh allejezus. De dagen tellen *af* in het lijstje

[ Voor 56% gewijzigd door .oisyn op 04-12-2023 16: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.
spoiler:
je kan ook de line splitten en zoeken naar een str.count(x) == 2 (gedeeld door twee ivm paartjes), als het goed is zijn er geen dubbele waarden in zowel winning als je eigen, en de kaarten zelf hebben een ":" eraan vast.
Obscure oneliner omdat het kan:
print((a,sum(b))if not(a:=0)and(b:=[1]*len(c:=open("day04.txt","r").read(
).splitlines()))and[x for e,x in enumerate(c)if(a:=a+(1<<(s:=sum(x.split(
).count(y)== 2 for y in{*x.split()}if y))>>1))and[b.insert(d,b.pop(d)+1*b[e]
)for d in range(e+1,e+s+1)]]else 0)
Obscure oneliner omdat het kan:
print((a,sum(b))if not(a:=0)and(b:=[1]*len(c:=open("day04.txt","r").read(
).splitlines()))and[x for e,x in enumerate(c)if(a:=a+(1<<(s:=sum(x.split(
).count(y)== 2 for y in{*x.split()}if y))>>1))and[b.insert(d,b.pop(d)+1*b[e]
)for d in range(e+1,e+s+1)]]else 0)
[ Voor 47% gewijzigd door Diderikdm op 04-12-2023 17:52 ]
Ik draai het gewoon vanuit mijn IDE, maar je kunt talen ook niet zo maar vergelijken. Qua parsen van de file doe ik ongeveer hetzelfde als jij en dat kost al zo'n 16ms.MatHack schreef op maandag 4 december 2023 @ 13:39:
[...]
Dat moet nog veel beter kunnen, mijn eerste versie van deel 2 runt in 2,5598ms en dat is in een VM waarvan ik van vorige jaren weet dat die een stukje trager is dan direct op het systeem draaien (en debug build).
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Wat een absolute puinzooi vandaag
Na twee dagen geen tijd vandaag wel genoeg om in ieder geval deel 1 en 2 te doen.
https://github.com/Unreal...n/day4-second/src/main.rs
Vandaag was een groot gevalletje tunnelvisie, gemixt met nog wat meer stoeien met Rust, waardoor mijn code echt om te huilen is
https://github.com/Unreal...n/day4-second/src/main.rs
spoiler:
Ik ben echt dom bezig geweest. Om een of andere reden bleef ik hangen bij hashmaps, terwijl ik het bepalen van de intersect ook gewoon letterlijk met sets had kunnen doen (geen idee waarom dat nieteens in me op is gekomen). Vervolgens bij part 2 het gebruik van de hashmap doorgetrokken in m'n recursive oplossing, omdat ik niet stilstond dat ik die traceability helemaal niet nodig heb
.
Vandaag was een groot gevalletje tunnelvisie, gemixt met nog wat meer stoeien met Rust, waardoor mijn code echt om te huilen is
spoiler:
Running time is 464ms, wat waarschijnlijk voor een groot deel komt door mijn inefficiënte manier van het splitsen van de slice, wat wederom niet nodig was. Het valt me wel op, gezien de andere oplossingen, dat ik een van de weinige ben geweest die het opsplitsen van de regels via regex heb gedaan.
PS5 PSN: UnrealKazu
Zo ik heb dag 3 en 4 ook opgelost
https://github.com/rverst.../blob/main/Y2023/Day03.cs
https://github.com/rverst.../blob/main/Y2023/Day04.cs
Dag 4 was weer erg makkelijk, dag 3 moest ik even over nadenken hoe het op te lossen. Op zich is het probleem niet zo lastig, maar de code werd als snel wat minder leesbaar
https://github.com/rverst.../blob/main/Y2023/Day03.cs
https://github.com/rverst.../blob/main/Y2023/Day04.cs
Dag 4 was weer erg makkelijk, dag 3 moest ik even over nadenken hoe het op te lossen. Op zich is het probleem niet zo lastig, maar de code werd als snel wat minder leesbaar
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Kazu schreef op maandag 4 december 2023 @ 17:54:
Wat een absolute puinzooi vandaagNa twee dagen geen tijd vandaag wel genoeg om in ieder geval deel 1 en 2 te doen.
https://github.com/Unreal...n/day4-second/src/main.rs
spoiler:Ik ben echt dom bezig geweest. Om een of andere reden bleef ik hangen bij hashmaps, terwijl ik het bepalen van de intersect ook gewoon letterlijk met sets had kunnen doen (geen idee waarom dat nieteens in me op is gekomen). Vervolgens bij part 2 het gebruik van de hashmap doorgetrokken in m'n recursive oplossing, omdat ik niet stilstond dat ik die traceability helemaal niet nodig heb.
spoiler:
Ik gebruik gewoon een u128 als bitset 
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
.oisyn schreef op maandag 4 december 2023 @ 18:23:
[...]
spoiler:Ik gebruik gewoon een u128 als bitset
spoiler:
Ik zag het, ja. Veel makkelijker en sneller 
PS5 PSN: UnrealKazu
Wel bijzonder dat je eerst de kaartnummers in de invoer weggooit onder de (correcte) aanname dat ze simpelweg van 1 to N lopen, dan vervolgens in SolvePart2() een dictionary maakt. Dat kan dan net zo goed een simpele array van integers zijn.
Ja dat besefte ik mij ook, maar had geen zin meer om het aan te passen.Soultaker schreef op maandag 4 december 2023 @ 18:33:
[...]
Wel bijzonder dat je eerst de kaartnummers in de invoer weggooit onder de (correcte) aanname dat ze simpelweg van 1 to N lopen, dan vervolgens in SolvePart2() een dictionary maakt. Dat kan dan net zo goed een simpele array van integers zijn.
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”
Na een hele daq moeten vergaderen maar even snel tussendoor gedaan. Maar dag 4 in Java is dan toch eindelijk af.
Deel 2 was op zich een makkie als je voor deel 1 al gelijk een goede data structuur kiest.
Deel 2 was op zich een makkie als je voor deel 1 al gelijk een goede data structuur kiest.
Ja, stoeien met replace en indices is nooit leuk. Gewoon doorgaan met split() en strip(), simpel en robuust:KabouterSuper schreef op maandag 4 december 2023 @ 08:56:
Ziezo, vandaag ook weer klaar.
spoiler:Net iets te lang bezig geweest met het bepalen wat de identifiers van de Cards waren om in deel 2 de volgende kaarten te identificeren. In het voorbeeld heet de eerste kaart "Card<spatie>1", maar in de echte set "Card<spatie><spatie><spatie>1". Ik had beter het regelnummer kunnen pakken als identifier in plaats van
int(line.split(':')[0].replace(' ','')[4:])
int(line.split(':')[0].split()[-1].strip())
Overigens is strip() niet eens nodig bij int(), die slurpt whitespace zelf wel weg zolang er maar iets wat op een integer lijkt komt (ooit).
Nice. Maar ik begrijp de keuze voor Math.Min() niet. Daar zou een assert of een throws moeten staan. Dan vind je de eventuele problemen ipv dat je ze moeizaam debuggen moet. Je kunt zelfs helemaal niks defensief programmeren, dan gooit Java zelf wel een OutOfBounds.gedonie schreef op maandag 4 december 2023 @ 18:56:
Na een hele daq moeten vergaderen maar even snel tussendoor gedaan. Maar dag 4 in Java is dan toch eindelijk af.
Deel 2 was op zich een makkie als je voor deel 1 al gelijk een goede data structuur kiest.
Gelukkig is AoC lief en geeft altijd heel consistente input, zodat dit allemaal niet uitmaakt in dit geval.
[ Voor 6% gewijzigd door Varienaja op 04-12-2023 19:30 ]
Siditamentis astuentis pactum.
En dag 4 ook klaar.
https://github.com/CodeEn...23/blob/main/days/Day4.go
spoiler:
Recursie? Ik loop twee keer door het geheel heen. 1 keer door de input en hou vervolgens het aantal winnende getallen bij per kaart. En de tweede loop door alle kaarten en dan bij de opvolgende kaarten optellen met 1 x het aantal wins van de huidige kaart. Klaar.
En strings.Fields() ontdekt in Go, fixt gelijk alle ellende met whitespaces
En strings.Fields() ontdekt in Go, fixt gelijk alle ellende met whitespaces
https://github.com/CodeEn...23/blob/main/days/Day4.go
[ Voor 20% gewijzigd door Creepy op 04-12-2023 22:59 ]
"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
De Math.min of eigenlijk de out of bounds kan optreden als een van de latere kaarten bijvoorbeeld meer goede nummers heeft dan dat er nog kaarten over zijn in de lijst, of dat zo is bij de input heb ik niet gecontroleerd. Maar dat is gezien het verhaal van vandaag niet uitgesloten.Varienaja schreef op maandag 4 december 2023 @ 19:27:
[...]
Nice. Maar ik begrijp de keuze voor Math.Min() niet. Daar zou een assert of een throws moeten staan. Dan vind je de eventuele problemen ipv dat je ze moeizaam debuggen moet. Je kunt zelfs helemaal niks defensief programmeren, dan gooit Java zelf wel een OutOfBounds.
Gelukkig is AoC lief en geeft altijd heel consistente input, zodat dit allemaal niet uitmaakt in dit geval.
Dat is gezien het verhaal van vandaag wel uitgeslotengedonie schreef op maandag 4 december 2023 @ 20:17:
[...]
De Math.min of eigenlijk de out of bounds kan optreden als een van de latere kaarten bijvoorbeeld meer goede nummers heeft dan dat er nog kaarten over zijn in de lijst, of dat zo is bij de input heb ik niet gecontroleerd. Maar dat is gezien het verhaal van vandaag niet uitgesloten.
Cards will never make you copy a card past the end of the table.
"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
Dat er geen kaarten buiten de set zullen vallen staat letterlijk in de tekst van vandaag:gedonie schreef op maandag 4 december 2023 @ 20:17:
[...]
De Math.min of eigenlijk de out of bounds kan optreden als een van de latere kaarten bijvoorbeeld meer goede nummers heeft dan dat er nog kaarten over zijn in de lijst, of dat zo is bij de input heb ik niet gecontroleerd. Maar dat is gezien het verhaal van vandaag niet uitgesloten.
(Cards will never make you copy a card past the end of the table.)
There's no place like 127.0.0.1
Dat begrijp ik wel. Maar ik begrijp niet dat je zelf en vrijwillig een bug inprogrammeert, waardoor je een fout antwoord gaat genereren bij rare invoer. Ik zou liever het feit dat de invoer inconsistent is luid en duidelijk de wereld in slingeren.gedonie schreef op maandag 4 december 2023 @ 20:17:
[...]
De Math.min of eigenlijk de out of bounds kan optreden als een van de latere kaarten bijvoorbeeld meer goede nummers heeft dan dat er nog kaarten over zijn in de lijst, of dat zo is bij de input heb ik niet gecontroleerd. Maar dat is gezien het verhaal van vandaag niet uitgesloten.
Siditamentis astuentis pactum.
Ben ik de enige die niet snap wat ik hier moet doen?That means card 1 is worth 8 points (1 for the first match, then doubled three times for each of the three matches after the first).
Parsen en zoeken op dubbelen was een eitje maar ik snapte niet hoe de scoring nu werkte.
Door de spieken bij anderen kon ik pas door.
Deel 2 was goed te doen.
Het staat er precies. Met 4 overeenkomsten dus:
1 punt voor de eerste overeenkomst
*2 voor de tweede
*2 voor de derde
*2 voor de vierde
1*2*2*2 = 8
Wiskundig is dit simpelweg 2 ^ (aantal_overeenkomsten - 1)
1 punt voor de eerste overeenkomst
*2 voor de tweede
*2 voor de derde
*2 voor de vierde
1*2*2*2 = 8
Wiskundig is dit simpelweg 2 ^ (aantal_overeenkomsten - 1)
[ Voor 16% gewijzigd door Varienaja op 04-12-2023 21:08 ]
Siditamentis astuentis pactum.
niet helemaal want bij nul overeenkomsten zou je met deze formule op 1/2 uitkomen daar moet je dus wat voor regelen.Varienaja schreef op maandag 4 december 2023 @ 20:53:
Het staat er precies. Met 4 overeenkomsten dus:
1 punt voor de eerste overeenkomst
*2 voor de tweede
*2 voor de derde
*2 voor de vierde
1*2*2*2 = 8
Wiskundig is dit simpelweg 2 ^ (aantal_overeenkomsten - 1)
Dat is waar.TrailBlazer schreef op maandag 4 december 2023 @ 21:39:
[...]
niet helemaal want bij nul overeenkomsten zou je met deze formule op 1/2 uitkomen daar moet je dus wat voor regelen.
[ Voor 7% gewijzigd door Varienaja op 04-12-2023 21:54 ]
Siditamentis astuentis pactum.
Ja, maar 2 tot de macht -1 is 0,5, en dat krijg je bij 0 winnende getallen als je daar niet expliciet op controleertVarienaja schreef op maandag 4 december 2023 @ 21:53:
[...]
Nee hoor. 2 tot de macht 0 is namelijk 1.
[ Voor 3% gewijzigd door .oisyn op 04-12-2023 22:02 ]
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.
lelijke oplossing: omlaag afronden op integer.oisyn schreef op maandag 4 december 2023 @ 21:54:
[...]
Ja, maar 2 tot de macht -1 is 0,5, en dat krijg je bij 0 winnende getallen als je daar niet expliciet op controleert
Wat niet gaat werken als je bitshift
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
ik weet niet wat dat is ;-), maar ik ga het opzoeken.
daarom werk ik waarschijnlijk in R in plaats van 'echt' programmeren
Even inhaalslag gemaakt en meteen dag 2 tm 4 gedaan 
Niet zo kort en krachtig als @Woy, maar zeker wel leesbaar/verbose en run snel (300ms)
https://github.com/flutte...tOfCode/Year2023/Day04.cs
Niet zo kort en krachtig als @Woy, maar zeker wel leesbaar/verbose en run snel (300ms)
https://github.com/flutte...tOfCode/Year2023/Day04.cs
Not just an innocent bystander
Wauw. Dag 5, onderdeel 2 ga ik niet afkrijgen voordat ik weg moet.
Edit 1: Maar..... ik heb wél een idee gekregen. Dat is voor in de trein zometeen.
Edti 2: Tóch nog kunnen implementeren voordat ik weg moet. Woei!
Edit 1: Maar..... ik heb wél een idee gekregen. Dat is voor in de trein zometeen.
Edti 2: Tóch nog kunnen implementeren voordat ik weg moet. Woei!
[ Voor 58% gewijzigd door Varienaja op 05-12-2023 06:55 ]
Siditamentis astuentis pactum.
Nog niet echt begonnen maar waarom is de volgorde destination source range. Ipv source destination range. Klopt gewoon niet in mijn hoofd.
Helemaal omdat de tekst wel source dest is.
Helemaal omdat de tekst wel source dest is.
[ Voor 14% gewijzigd door TrailBlazer op 05-12-2023 08:18 ]
Om je leesvaardigheid op de vroege ochtend te testen.TrailBlazer schreef op dinsdag 5 december 2023 @ 08:15:
Nog niet echt begonnen maar waarom is de volgorde destination source range. Ipv source destination range. Klopt gewoon niet in mijn hoofd.
Maar inderdaad, daar las ik ook bijna overeen.
spoiler:
Beiden opgelost met een vrij domme iteratie over alle seeds. Wel correcte antwoord, deel 2 alleen enorm traag natuurlijk. Nu even kijken of ik een meer algoritmische aanpak kan vinden voor zover het werk het toelaat. 
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Even knutselen om het onderliggende model goed te krijgen, maar daarna waren zowel deel 1 als deel 2 redelijk simpel met een brute force. Deel 1 in de microseconden, deel 2 aanzienlijk langzamer. Daar mag nog wel een slim laagje overheen.
Deel 1 was voornamelijk parsen, de oplossing was daarna vrij simpel te vinden. Deel 2 koste iets meer moeite (maar is geen brute-force, kost 3 ms).
https://github.com/realma...de.Y2023/Solvers/Day05.cs
spoiler:
In eerste instantie ook brute-force geprobeerd (deel1, maar dan met een grote lijst seeds), maar kreeg een out-of-memory exception (zit op een VM met 8GB RAM te werken). Dus toen toch maar range overlaps gebouwd. Kost me altijd redelijk wat denkwerk, maar het werkt wel binnen een maar milliseconden.
https://github.com/realma...de.Y2023/Solvers/Day05.cs
[ Voor 6% gewijzigd door MatHack op 05-12-2023 09:46 . Reden: taalvauten ]
There's no place like 127.0.0.1
Jouw oplossing ga ik dan zeker bekijken! Ik heb nu ook gewoon een nested loop maar snel is het niet. Wel goed ;-)MatHack schreef op dinsdag 5 december 2023 @ 08:41:
Deel 1 was voornamelijk parsen, de oplossing was daarna vrij simpel te vinden. Deel 2 koste iets meer moeite (maar is geen brute-force).
spoiler:In eerste instantie ook brute-force geprobeerd (deel1, maar dan met een grote lijst seeds), maar kreeg een out-of-memory exception (zit op een VM met 8GB RAM te werken). Dus toen toch maar range overlaps gebouwd. Kost me altijd redelijk wat denkwerk, maar het werkte wel binnen een maar milliseconden.
https://github.com/realma...de.Y2023/Solvers/Day05.cs
Edit: deel 2 kost mij nu 3,5 minuut...
@TrailBlazer
Misschien doen ze dat om de opdracht een beetje lastiger te maken en je noopt om de tekst goed door te nemen, Maar wat maakt het uit als je de juiste volgorde weet...?
Misschien doen ze dat om de opdracht een beetje lastiger te maken en je noopt om de tekst goed door te nemen, Maar wat maakt het uit als je de juiste volgorde weet...?
[ Voor 4% gewijzigd door eheijnen op 05-12-2023 08:53 ]
Wie du mir, so ich dir.
So, deel 2 is een pittige
spoiler:
Heb uiteindelijk maar gewoon een range checker/splitter gebouwd, ik zag met die hoeveelheid seeds het niet zitten om het brute-force te doen. Hij draait wel lekker snel: 5ms, in Python nog wel Eerst nog even overwogen om een backwards binary search te doen, maar dat zag ik toch niet zitten, hoewel dat dan wel de volgorde van de input zou volgen 
Verandert z'n sig te weinig.
FCA schreef op dinsdag 5 december 2023 @ 09:17:
So, deel 2 is een pittige
spoiler:Heb uiteindelijk maar gewoon een range checker/splitter gebouwd, ik zag met die hoeveelheid seeds het niet zitten om het brute-force te doen. Hij draait wel lekker snel: 5ms, in Python nog wel Eerst nog even overwogen om een backwards binary search te doen, maar dat zag ik toch niet zitten, hoewel dat dan wel de volgorde van de input zou volgen
spoiler:
Ehm, hoe/wat werkt een "range checker/splitter"? Heb je dan meerdere threads of hoe werkt dat? Ik zit nu tegen een brute-force poging aan te kijken die al een kwartier draait en nog niet klaar is met de eerste conversie van seed-to-soil .... (lang leve een 4GL)
Edit: de ranges overlappen elkaar natuurlijk. Als je dat er uit filtert, scheelt dat aanzienlijk werk. Ben alleen bang dat mijn 4GL dat nog steeds niet trekt. Ik heb hem nu afgebroken, na 20 min nog niet halverwege de eerste conversie van de eerste range. Die gaat niet finishen zo voor kerst
Edit: de ranges overlappen elkaar natuurlijk. Als je dat er uit filtert, scheelt dat aanzienlijk werk. Ben alleen bang dat mijn 4GL dat nog steeds niet trekt. Ik heb hem nu afgebroken, na 20 min nog niet halverwege de eerste conversie van de eerste range. Die gaat niet finishen zo voor kerst
[ Voor 16% gewijzigd door P_Tingen op 05-12-2023 09:27 ]
... en gaat over tot de orde van de dag
Het was helemaal niet in me opgekomen om dag 5 deel 2 te bruteforcen... achteraf gezien had het waarschijnlijk wel gekund, maar dan had ik van Python moeten overstappen naar een snellere taal als C++.
De testdata was ook niet zo gemeen als 'ie had kunnen zijn. Voor wie z'n code wil benchmarken hier iets moeilijkere invoer:
De testdata was ook niet zo gemeen als 'ie had kunnen zijn. Voor wie z'n code wil benchmarken hier iets moeilijkere invoer:
[ Voor 2% gewijzigd door Soultaker op 05-12-2023 10:08 . Reden: Data sets geüpdated ]
10012ms (~10sec) voor de medium setSoultaker schreef op dinsdag 5 december 2023 @ 09:27:
Het was helemaal niet in me opgekomen om dag 5 deel 2 te bruteforcen... achteraf gezien had het waarschijnlijk wel gekund, maar dan had ik van Python moeten overstappen naar een snellere taal als C++.
De testdata was ook niet zo gemeen als 'ie had kunnen zijn. Voor wie z'n code wil benchmarken hier iets moeilijkere invoer:
De large set vindt mijn oplossing niet leuk (parse error naar datatype), ook al heb ik al overal Int64 (.NET) gebruikt.
There's no place like 127.0.0.1
Niet slecht! Maar het kan sneller.MatHack schreef op dinsdag 5 december 2023 @ 09:51:
10012ms (~10sec) voor de medium set
Ah, my bad. Ik had inderdaad te grote getallen in beide invoerbestanden staan. Ik heb het gefixt (en de links aangepast).De large set vindt mijn oplossing niet leuk (parse error naar datatype), ook al heb ik al overal Int64 (.NET) gebruikt.
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.
Die sets mappen allemaal seeds op dezelfde destination. Klopt dat wel?
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.
Haha, natuurlijk kan dat sneller, ik zit op een niet optimale dev-omgeving (VM) in een niet-optimale taal/platform (C#/.NET) dit te bouwen. Voor de snelheid zal je sowieso iets als C++/Rust/Kotlin moeten hebben. Helaas moet ik aan de slag voor de studie, dus het blijft hier van mijn kant even bij.
There's no place like 127.0.0.1
Damn, ik heb een goede oplossing voor deel 2 in mijn trage 4GL: 2 msec. Eat that, bitches!
Oplossing in Progress 4GL. Zal voor de meesten even wennen zijn, maar het is goed leesbaar. De magic begint ongeveer halverwege. Daarvoor is het inlezen en parsen van de data.
https://github.com/patric...ter/2023/Day-05/day-05b.p
spoiler:
De crux is om andersom te werken. Je begint met de location en werkt dan terug naar de seed. Begin bij location 1, reken terug naar de seed en check of die in de mapping voorkomt.
Dit duurt natuurlijk nog retelang, dus bouw je daar een lus omheen waarin je met grote stappen er doorheen gaat. Ik begin met stapgrootte 10.000.000. Als ik dan een match vind, trek ik de stapgrootte van de location af waar ik mee begonnen ben (omdat ik anders te hoog zit), deel de stapgrootte door 10 en doe het nog een keer. Uiteindelijk vind je zo in een paar stappen het goede antwoord.
Dit duurt natuurlijk nog retelang, dus bouw je daar een lus omheen waarin je met grote stappen er doorheen gaat. Ik begin met stapgrootte 10.000.000. Als ik dan een match vind, trek ik de stapgrootte van de location af waar ik mee begonnen ben (omdat ik anders te hoog zit), deel de stapgrootte door 10 en doe het nog een keer. Uiteindelijk vind je zo in een paar stappen het goede antwoord.
Oplossing in Progress 4GL. Zal voor de meesten even wennen zijn, maar het is goed leesbaar. De magic begint ongeveer halverwege. Daarvoor is het inlezen en parsen van de data.
https://github.com/patric...ter/2023/Day-05/day-05b.p
... en gaat over tot de orde van de dag
Kotlin is gewoon een JVM taal die verder niet significant sneller draait dan Java, absoluut niet te vergelijken met talen als C++ of Rust, eerder met C#.MatHack schreef op dinsdag 5 december 2023 @ 10:26:
[...]
Haha, natuurlijk kan dat sneller, ik zit op een niet optimale dev-omgeving (VM) in een niet-optimale taal/platform (C#/.NET) dit te bouwen. Voor de snelheid zal je sowieso iets als C++/Rust/Kotlin moeten hebben. Helaas moet ik aan de slag voor de studie, dus het blijft hier van mijn kant even bij.
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Dat was het idee inderdaad; de probleemomschrijving garandeert niet dat doelbereiken niet kunnen overlappen..oisyn schreef op dinsdag 5 december 2023 @ 10:19:
Die sets mappen allemaal seeds op dezelfde destination. Klopt dat wel?
P_Tingen schreef op dinsdag 5 december 2023 @ 10:28:
spoiler:De crux is om andersom te werken. Je begint met de location en werkt dan terug naar de seed. Begin bij location 1, reken terug naar de seed en check of die in de mapping voorkomt.
Dit duurt natuurlijk nog retelang, dus bouw je daar een lus omheen waarin je met grote stappen er doorheen gaat. Ik begin met stapgrootte 10.000.000. Als ik dan een match vind, trek ik de stapgrootte van de location af waar ik mee begonnen ben (omdat ik anders te hoog zit), deel de stapgrootte door 10 en doe het nog een keer. Uiteindelijk vind je zo in een paar stappen het goede antwoord.
spoiler:
Dit is vergelijkbaar met de binary search die @FCA ook noemde, maar dat werkt toch niet in z'n algemeenheid? De mogelijke outputs zijn niet een continue bereik; er kunnen allerlei gaten in zitten. Dus met individuele steekproeven kun je geen begin vinden. Bijvoorbeeld, als je precies 1 seed hebt die op locatie 42 terecht komt. Hoe vind je die dan?
Vooruit dan maar.Soultaker schreef op dinsdag 5 december 2023 @ 10:57:
[...]
Dat was het idee inderdaad; de probleemomschrijving garandeert niet dat doelbereiken niet kunnen overlappen.
code: large.in
1
2
| 1234567890987654321 1234567890987654321 Time spent: 272.4µs |
[ Voor 37% gewijzigd door .oisyn op 05-12-2023 12:03 . Reden: copy-paste error in het antwoord ;) ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Soultaker schreef op dinsdag 5 december 2023 @ 10:57:
[...]
Dat was het idee inderdaad; de probleemomschrijving garandeert niet dat doelbereiken niet kunnen overlappen.
[...]
spoiler:Dit is vergelijkbaar met de binary search die @FCA ook noemde, maar dat werkt toch niet in z'n algemeenheid? De mogelijke outputs zijn niet een continue bereik; er kunnen allerlei gaten in zitten. Dus met individuele steekproeven kun je geen begin vinden. Bijvoorbeeld, als je precies 1 seed hebt die op locatie 42 terecht komt. Hoe vind je die dan?
spoiler:
Nee, binary search gaat inderdaad niet werken (vroeg/duf hoofd, etc.), en zo'n search met steeds kleinere stappen heeft inderdaad ook geen garantie (alhoewel, je kunt natuurlijk iets zeggen over het aantal intervallen wat je maximaal hebt, over een bepaalde mogelijke range, dus wie weet..), maar vaak is de input, zeker in de eerste paar dagen, niet al te pathologisch gekozen, dus kom je er nog wel mee weg hier.
P_Tingen schreef op dinsdag 5 december 2023 @ 09:21:
[...]
spoiler:Ehm, hoe/wat werkt een "range checker/splitter"? Heb je dan meerdere threads of hoe werkt dat? Ik zit nu tegen een brute-force poging aan te kijken die al een kwartier draait en nog niet klaar is met de eerste conversie van seed-to-soil .... (lang leve een 4GL)
Edit: de ranges overlappen elkaar natuurlijk. Als je dat er uit filtert, scheelt dat aanzienlijk werk. Ben alleen bang dat mijn 4GL dat nog steeds niet trekt. Ik heb hem nu afgebroken, na 20 min nog niet halverwege de eerste conversie van de eerste range. Die gaat niet finishen zo voor kerst
spoiler:
Je begint met de input-ranges. Dan kijk je waar die overlappen met de 1e source-ranges en map je die overlappen naar de destination range (dus als je input van 10-17 is, je eerste source range van 9-14 is, en de destination van 2 - 7 is, dan wordt dat dus naar 3-7 en houd je 15 - 17 over). De restanten map je naar zichzelf (wat ik heb gedaan is de source-ranges opvullen met "triviale" maps, zodat ik wat randgevallen niet hoefde te checken). Zo itereer je door de maps heen, totdat je bij het eind bent.
Tussendoor elke keer de ranges en de source-ranges sorteren, anders blijf je bezig met zoeken.
Ik heb geen merges van ranges gedaan als ze overlapten, dat zou het nog wat sneller kunnen maken.
Tussendoor elke keer de ranges en de source-ranges sorteren, anders blijf je bezig met zoeken.
Ik heb geen merges van ranges gedaan als ze overlapten, dat zou het nog wat sneller kunnen maken.
Verandert z'n sig te weinig.
Python - d5
Poef, is nog wel wat te refactoren/combineren aan deze boemerang denk ik.
Beide parts runnen wel in ~8 ms
Poef, is nog wel wat te refactoren/combineren aan deze boemerang denk ik.
Beide parts runnen wel in ~8 ms
spoiler:
Zat heel lang te stoeien met wat nou min wat en wat plus wat, example bleef natuurlijk wel werken.. 
[ Voor 6% gewijzigd door Diderikdm op 05-12-2023 11:55 ]
Waarom blijven mensen toch vasthouden aan het beeld dat de JVM perse trager is dan C++? Er zijn al meerdere onderzoeken gedaan, en er zijn tegenwoordig veel gevallen waarbij de JVM net zo goed presteert als rauwe C++/C code.Mugwump schreef op dinsdag 5 december 2023 @ 10:47:
[...]
Kotlin is gewoon een JVM taal die verder niet significant sneller draait dan Java, absoluut niet te vergelijken met talen als C++ of Rust, eerder met C#.
Hoe is Java met SIMD intrinsics en cache locality?Remcoder schreef op dinsdag 5 december 2023 @ 11:53:
[...]
Waarom blijven mensen toch vasthouden aan het beeld dat de JVM perse trager is dan C++? Er zijn al meerdere onderzoeken gedaan, en er zijn tegenwoordig veel gevallen waarbij de JVM net zo goed presteert als rauwe C++/C code.
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.
De specifics ervan weet ik niet, maar een snelle search leert me dat Java hier support voor heeft..oisyn schreef op dinsdag 5 december 2023 @ 12:02:
[...]
Hoe is Java met SIMD intrinsics en cache locality?
Dat zeg ik ook niet. Ik zeg dat Kotlin niet sneller is dan Java omdat het op de JVM draait. Degene waar ik op reageer werkt in C# en contrasteert C# met talen als Kotlin / C++ / Rust, terwijl qua werking JVM talen meer lijken op talen uit de .Net wereld.Remcoder schreef op dinsdag 5 december 2023 @ 11:53:
[...]
Waarom blijven mensen toch vasthouden aan het beeld dat de JVM perse trager is dan C++? Er zijn al meerdere onderzoeken gedaan, en er zijn tegenwoordig veel gevallen waarbij de JVM net zo goed presteert als rauwe C++/C code.
Laten we ook wel wezen, in het gros van de applicaties waar mensen hier hoogstwaarschijnlijk aan werken is het al veel als 10% van de doorlooptijd van acties in je systeem bestaat uit compute in je code (ipv netwerkverkeer, database queries, enz).
Ik denk wel dat je bij complexe algoritmische problemen met talen als Rust / C++ nog net wat meer performance kunt halen, al hangt dat ook af van wat je hoe implementeert. Ik ben lang niet zo hardcore als @.oisyn wat dat betreft.
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
Dank voor deze uitleg, maar ik snap er nog steeds geen kont van. Als je zin en tijd hebt hou ik me aanbevolen voor een uitgebreidere uitleg voor dummiesFCA schreef op dinsdag 5 december 2023 @ 11:35:
[...]
spoiler:Je begint met de input-ranges. Dan kijk je waar die overlappen met de 1e source-ranges en map je die overlappen naar de destination range (dus als je input van 10-17 is, je eerste source range van 9-14 is, en de destination van 2 - 7 is, dan wordt dat dus naar 3-7 en houd je 15 - 17 over). De restanten map je naar zichzelf (wat ik heb gedaan is de source-ranges opvullen met "triviale" maps, zodat ik wat randgevallen niet hoefde te checken). Zo itereer je door de maps heen, totdat je bij het eind bent.
Tussendoor elke keer de ranges en de source-ranges sorteren, anders blijf je bezig met zoeken.
Ik heb geen merges van ranges gedaan als ze overlapten, dat zou het nog wat sneller kunnen maken.
... en gaat over tot de orde van de dag
Ah wat ik vond was dat de Vector API nog niet af was, maar dat is het nu wel? Cache locality blijft een ding, je hebt in de JVM geen expliciete keuze voor value-type objects, of is dat er inmiddels ook? Je moet dan maar hopen dat references niet daadwerkelijk references blijven.Remcoder schreef op dinsdag 5 december 2023 @ 12:10:
[...]
De specifics ervan weet ik niet, maar een snelle search leert me dat Java hier support voor heeft.
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.
P_Tingen schreef op dinsdag 5 december 2023 @ 12:20:
[...]
Dank voor deze uitleg, maar ik snap er nog steeds geen kont van. Als je zin en tijd hebt hou ik me aanbevolen voor een uitgebreidere uitleg voor dummies
spoiler:
Stel je hebt een range mapping M van a..b naar x..y, en je hebt een range R van p..q. Dan wil je kijken welk deel van R overlapt met M, en specifiek die overlap wil je remappen. Dan krijg je te maken met 6 verschillende cases
#1 en #2: geen overlap: b<p || q<a
a====M====b
p====R===q
a====M====b
p====R===q
#3: p valt in de mapping, q niet
a====M====b
p====R===q
#4: q valt in de mapping, p niet
a====M====b
p====R===q
#5: zowel p als q vallen binnen de mapping
a====M====b
p==R==q
#6: de mapping valt volledig binnen de range, maar p en q zelf niet
a==M==b
p=====R====q
Bij geen overlap blijft de oorspronkelijke range natuurlijk gelijk.
In geval van #3 wordt het begin van R regemapped, maar het einde hou je over om verder te checken
#4 is als #3, maar dan wordt juist het einde geremapped en het begin hou je over
Bij #5 wordt de volledige range geremapped
Bij #6 wordt het midden van de range geremapped. Het begin en het eind hou je over.
En nu ik dit typ realiseer ik me dat ik #6 ben vergeten te implementeren
. Maakt blijkbaar niet uit voor het eindresultaat.
#1 en #2: geen overlap: b<p || q<a
a====M====b
p====R===q
a====M====b
p====R===q
#3: p valt in de mapping, q niet
a====M====b
p====R===q
#4: q valt in de mapping, p niet
a====M====b
p====R===q
#5: zowel p als q vallen binnen de mapping
a====M====b
p==R==q
#6: de mapping valt volledig binnen de range, maar p en q zelf niet
a==M==b
p=====R====q
Bij geen overlap blijft de oorspronkelijke range natuurlijk gelijk.
In geval van #3 wordt het begin van R regemapped, maar het einde hou je over om verder te checken
#4 is als #3, maar dan wordt juist het einde geremapped en het begin hou je over
Bij #5 wordt de volledige range geremapped
Bij #6 wordt het midden van de range geremapped. Het begin en het eind hou je over.
En nu ik dit typ realiseer ik me dat ik #6 ben vergeten te implementeren
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.
P_Tingen schreef op dinsdag 5 december 2023 @ 12:20:
[...]
Dank voor deze uitleg, maar ik snap er nog steeds geen kont van. Als je zin en tijd hebt hou ik me aanbevolen voor een uitgebreidere uitleg voor dummies
spoiler:
Mijn code doet dit toevallig ook, misschien kan je het daaruit herleiden?
Value type objects zijn er ook tegenwoordig voor Java. Daar zitten wel een aantal regels aan vast, zoals dat je niet meer afhankelijk mag zijn van reference equality, maar enkel de object equality mag gebruiken..oisyn schreef op dinsdag 5 december 2023 @ 12:20:
[...]
Ah wat ik vond was dat de Vector API nog niet af was, maar dat is het nu wel? Cache locality blijft een ding, je hebt in de JVM geen expliciete keuze voor value-type objects, of is dat er inmiddels ook? Je moet dan maar hopen dat references niet daadwerkelijk references blijven.
Java gaat snel tegenwoordig
Nee. Je hebt inmiddels records in Java. Dat lijken ogenschijnlijk value-type objects, maar het blijven references..oisyn schreef op dinsdag 5 december 2023 @ 12:20:
[...]
Ah wat ik vond was dat de Vector API nog niet af was, maar dat is het nu wel? Cache locality blijft een ding, je hebt in de JVM geen expliciete keuze voor value-type objects, of is dat er inmiddels ook? Je moet dan maar hopen dat references niet daadwerkelijk references blijven.
Edit: Oh remcoder heeft gelijk. Je hebt ook ValueTypes tegenwoordig natuurlijk.
[ Voor 7% gewijzigd door Mugwump op 05-12-2023 12:57 ]
"The question of whether a computer can think is no more interesting than the question of whether a submarine can swim" - Edsger Dijkstra
... en gaat over tot de orde van de dag
Bron?Remcoder schreef op dinsdag 5 december 2023 @ 12:54:
Value type objects zijn er ook tegenwoordig voor Java.
En kun je dan ook een ArrayList<MyValueType> alloceren waarbij de data in contiguous memory staat (zoals in C++ al 30 jaar kan met std::vector<>) in plaats van een array van pointers naar heap-allocated objects met behoorlijke overhead, zoals tot nu toe het geval was?
Fijn, mijn uitleg was ook erg gaar... nog steeds last van de griep, ik kan de oplossing wel coderen op intuitie, maar uitleggen, ho maarP_Tingen schreef op dinsdag 5 december 2023 @ 13:02:
[...]
Dank voor de uitleg! Nu snap ik wat je bedoelt inderdaad.
@Diderikdm Tnx, duidelijk!

Verandert z'n sig te weinig.
Jemig wat een opgave met dag 5!
Eerste was easy-peasy met binnen aantal ms opgelost..
de 2e stuk gewoon bruteforce, na 36 minuten kwam het juiste antwoord eruit
Eerste was easy-peasy met binnen aantal ms opgelost..
de 2e stuk gewoon bruteforce, na 36 minuten kwam het juiste antwoord eruit


Not just an innocent bystander
Mmh, ik was me aan het baseren op deze 2 bronnen: Oracle docs en uitleg op baeldung.Soultaker schreef op dinsdag 5 december 2023 @ 13:17:
[...]
Bron?
En kun je dan ook een ArrayList<MyValueType> alloceren waarbij de data in contiguous memory staat (zoals in C++ al 30 jaar kan met std::vector<>) in plaats van een array van pointers naar heap-allocated objects met behoorlijke overhead, zoals tot nu toe het geval was?
Maar als ik dan deze JEP lees, is het nog niet ingebouwd.
Mmh, ik word hier ff nerd sniped, interessante materie om later verder uit te zoeken
Dag 5 in Python
Zo deel 2 was toch wel een stuk pittiger, had wel al door dat bruteforcen niet heel handig zou zijn. Na een tijdje denken ook op de oplossingsmanier van .oisyn (in de quote) gekomen. Implementeren daarvan was wel een k-klus
Deel 2 runt uiteindelijk netjes in ~2ms
Zo deel 2 was toch wel een stuk pittiger, had wel al door dat bruteforcen niet heel handig zou zijn. Na een tijdje denken ook op de oplossingsmanier van .oisyn (in de quote) gekomen. Implementeren daarvan was wel een k-klus
.oisyn schreef op dinsdag 5 december 2023 @ 12:34:
[...]
spoiler:Stel je hebt een range mapping M van a..b naar x..y, en je hebt een range R van p..q. Dan wil je kijken welk deel van R overlapt met M, en specifiek die overlap wil je remappen. Dan krijg je te maken met 5 verschillende cases
#1 en #2: geen overlap: b<p || q<a
a====M====b
p====R===q
a====M====b
p====R===q
#3: p valt in de mapping, q niet
a====M====b
p====R===q
#4: q valt in de mapping, p niet
a====M====b
p====R===q
#5: zowel p als q vallen binnen de mapping
a====M====b
p==R==q
#6: de mapping valt volledig binnen de range, maar p en q zelf niet
a==M==b
p=====R====q
Bij geen overlap blijft de oorspronkelijke range natuurlijk gelijk.
In geval van #3 wordt het begin van R regemapped, maar het einde hou je over om verder te checken
#4 is als #3, maar dan wordt juist het einde geremapped en het begin hou je over
Bij #5 wordt de volledige range geremapped
Bij #6 wordt het midden van de range geremapped. Het begin en het eind hou je over.
En nu ik dit typ realiseer ik me dat ik #6 ben vergeten te implementeren. Maakt blijkbaar niet uit voor het eindresultaat.
Dag 5 In Java is ook weer gedaan.
spoiler:
Was wel even aan het puzzelen omdat ik een aantal denk fouten had gemaakt in de overlap gevallen tussen de mutaties en de seeds.
Hehe, als ik jouw code run met mijn input maakt het wel uit. Heb jij geluk..oisyn schreef op dinsdag 5 december 2023 @ 12:34:
[...]
spoiler:En nu ik dit typ realiseer ik me dat ik #6 ben vergeten te implementeren. Maakt blijkbaar niet uit voor het eindresultaat.
Anyone who gets in between me and my morning coffee should be insecure.
Wanneer heb je die code gepakt? Want ik heb een paar minuten geleden de fix gepushtMueR schreef op dinsdag 5 december 2023 @ 14:28:
[...]
Hehe, als ik jouw code run met mijn input maakt het wel uit. Heb jij geluk.
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.
Vijftien minuten 20 minuten geleden.. typisch.oisyn schreef op dinsdag 5 december 2023 @ 14:29:
[...]
Wanneer heb je die code gepakt? Want ik heb een paar minuten geleden de fix gepusht

[ Voor 3% gewijzigd door MueR op 05-12-2023 14:31 ]
Anyone who gets in between me and my morning coffee should be insecure.
Het was 14:09 volgens github. Ik heb de fix niet getest overigens.
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.
Met die fix komt er wel de correcte uitkomst uit iig.
Anyone who gets in between me and my morning coffee should be insecure.
tot nu toe alle opdrachten in js/typescript opgelost, maar deel 2 van dag 5 daar had firefox het te moeilijk mee 
edge deed het wel
edge deed het wel
Pfoeh, dat was nog wel even stoeien.
Uiteindelijk redelijk tevreden met het resultaat. Niet zo functioneel als ik had gewild maar het moet maar klaar zijn. En het is met 75ms gebeurd.
Dag 5 - Kotlin
spoiler:
De naïeve implementatie met de ranges uitklappen duurde veel te lang. Dan de ranges steeds maar expanden naar relevante ranges of dummy ranges in de volgende stap.
Uiteindelijk redelijk tevreden met het resultaat. Niet zo functioneel als ik had gewild maar het moet maar klaar zijn. En het is met 75ms gebeurd.
Dag 5 - Kotlin
Tja
Ik had eerst een brute-force oplossing en dat deed er 90 seconden over. Nu even een rewrite gedaan die met alleen de ranges werkt en dat is in ~0.15 milliseconden klaar
Dag 5 - Swift
Dag 5 - Swift
dag 5 gelukt in Python
standard input:
part 1 - 10 ms
part 2 - 3 ms
medium input
part 2 - <does not compute>
large input
part 2 - <does not compute>
spoiler:
Deel twee bruteforcen met Python lukte niet. dus moest toch maar anders
standard input:
part 1 - 10 ms
part 2 - 3 ms
medium input
part 2 - <does not compute>
large input
part 2 - <does not compute>
Me think, why waste time say lot word, when few word do trick.
Bij deel 1 vreselijk zitten stoeien met het parsen, misschien moet ik toch eens regex-crate voor Rust opzoeken.
Na deel 1 was het tijd voor andere dingen.
Voor het tweede deel heb ik een aanpak zoals die van @.oisyn gekozen. Dat zat er vrij snel in en gaat snel genoeg.
spoiler:
* arnold_m moet gewoon de documentatie van BufReader<> in Rust beter lezen.
Na deel 1 was het tijd voor andere dingen.
Voor het tweede deel heb ik een aanpak zoals die van @.oisyn gekozen. Dat zat er vrij snel in en gaat snel genoeg.
Ik heb mijn oplossing moeten aanpassen. Hij was veel langer bezig dan dat en nog geen antwoord.Camulos schreef op dinsdag 5 december 2023 @ 13:26:
Jemig wat een opgave met dag 5!
Eerste was easy-peasy met binnen aantal ms opgelost..
de 2e stuk gewoon bruteforce, na 36 minuten kwam het juiste antwoord eruit![]()

En dat was voor mijn oplossing die al 20GB gebruikt voordat ik hem stopte.

Uiteindelijk toch gelukt.
spoiler:
Eerst nog gedacht om bij de seed ranges een remapping waarde te berekenen.
Maar uiteindelijk gegaan om de herberekende ranges steeds door te geven.
Maar uiteindelijk gegaan om de herberekende ranges steeds door te geven.
let the past be the past.
Zo, gedaan. En daarmee is het ook wel gezegd

spoiler:
Ja, je kan met ranges etc werken. Maar ben vandaag een luie donder dus heb het gewoon gebruteforced waarbij ik eerst ook nog eens alle seeds tegelijk in geheugen wou... Dat vond de JVM niet leuk. Dus nu seed voor seed. Hij was ongeveer 6 minuten aan het rekenen. Dat was goedkoper om te draaien dan mij een uur op de ranges laten proggen zullen we maar als verantwoording gebruiken 
spoiler:
Hoe krijgen mensen een runtime met een resultaat in minuten?
Mijn eerste poging vrat in no time al het geheugen op. Alle seeds maken en in het geheugen proppen was blijkbaar niet zo snugger.
Mijn tweede poging zou vast nu nog aan het lopen zijn.
En mijn derde poging was klaar binnen 8 seconden, wat ik al veel vind. Daarbij begin ik met location 0, die reken ik terug naar een seed en dat net zo lang ophogen tot ik een seed in range vond.
Zonder parallelisatie, dus mijn machine stond lekker single threaded te stampen.
Dus, hoe kom je tot een runtime die realistisch in minuten kan tellen?
Mijn eerste poging vrat in no time al het geheugen op. Alle seeds maken en in het geheugen proppen was blijkbaar niet zo snugger.
Mijn tweede poging zou vast nu nog aan het lopen zijn.
En mijn derde poging was klaar binnen 8 seconden, wat ik al veel vind. Daarbij begin ik met location 0, die reken ik terug naar een seed en dat net zo lang ophogen tot ik een seed in range vond.
Zonder parallelisatie, dus mijn machine stond lekker single threaded te stampen.
Dus, hoe kom je tot een runtime die realistisch in minuten kan tellen?
Remcoder schreef op dinsdag 5 december 2023 @ 19:11:
spoiler:Hoe krijgen mensen een runtime met een resultaat in minuten?
Mijn eerste poging vrat in no time al het geheugen op. Alle seeds maken en in het geheugen proppen was blijkbaar niet zo snugger.
Mijn tweede poging zou vast nu nog aan het lopen zijn.
En mijn derde poging was klaar binnen 8 seconden, wat ik al veel vind. Daarbij begin ik met location 0, die reken ik terug naar een seed en dat net zo lang ophogen tot ik een seed in range vond.
Zonder parallelisatie, dus mijn machine stond lekker single threaded te stampen.
Dus, hoe kom je tot een runtime die realistisch in minuten kan tellen?
spoiler:
Gezien hoe groot de getallen worden had ik niet eens bedacht om van de locatie terug te rekenen. Ik ben gewoon alle seeds 1 voor 1 aan het bereken, voor alle seeds die er zijn (en dat zijn er nogal wat, 2.207.992.808 om precies te zijn) , terwijl ondertussen de laagste locatie word opgeslagen.