Remcoder schreef op dinsdag 21 december 2021 @ 13:26:
[...]
Ik ben wel benieuwd naar jouw oplossing.
spoiler:Ik had wel het idee dat je deel 1 kan bepalen zonder ook maar 1 dobbelsteenworp te gooien, met die aanpak was ik aanvankelijk ook begonnen. Voor speler 1 had ik al snel bepaald dat die altijd zou winnen, want per 10 beurten (5 voor speler 1, en 5 voor speler 2) zou speler 1 30 plekken vooruit gaan, en speler 2 25 plekken. Die 30 plekken voor speler 1 had ik dus gebruikt om het aantal beurten te bepalen tot die net geen 1000 punten zou bereiken, en hoeveel punten die dan nog nodig had om te winnen. Daarna die laatste paar punten gebruiken om te bepalen hoeveel extra beurten nog nodig waren om te winnen en dan had ik het totale aantal beurten dat gespeeld werd.
Dit kon ik dan gebruiken om voor speler 2 de eindscore te bepalen, maar hier ging ik redelijk de mist in. Uiteindelijk dan maar voor speler 2 wel de worpen simuleren, en hier leek ik aanvankelijk een goed antwoord uit te krijgen met de testcase. Helaas werkte het niet met de echte input.
Na wat verder denkwerk bedacht ik me dat er in mijn uitwerking een fout zat. Omdat ik geen zin had om het opnieuw uit te werken ben ik toch maar de worpen gaan simuleren.
Voor deel 2 verwacht ik dat er ook nog een optimalisatie mogelijk is aangezien ik nu elke keer alle 3 de worpen doe, terwijl de eindwaarde van de 3 worpen altijd tussen de 3 en de 9 ligt. Dit zou ik samen met het aantal keren dat elk getal voorkomt moeten kunnen gebruiken om zonder 3 geneste loopjes de resultaten te kunnen bepalen, maar hier zit ik ook nog te broeden op een oplossing.
Nou, de dobbelsteen is deterministisch en
spoiler:eindig. Dan weet je dat je met steeds drie opvolgende worpen een herhaling hebt na maximaal 300 beurten.
Het geheel is echter
spoiler:modulo 10, dus of je nou 12, 13, 13 of 1, 2, 3 gooit, maakt niet uit. Dan is je maximale herhaling opeens nog maar 30 beurten. Een duizendzijdige deterministische dobbelsteen geeft precies dezelfde resultaten.
Als je dit simuleert, moet direct opvallen dat
spoiler:er een poepsimpele formule voor de worp in beurt X te bedenken valt. Bovendien herhaalt deze zich ondertussen nog maar elke 10 stappen
Daarmee kan je dus uitrekenen wat
spoiler:de scores en posities zijn na X beurten vanaf een startpositie. Dit herhaalt zich ook na Y stappen. Alleen nog even zorgen dat je de beurten om en om doet voor elke speler. Omdat speler 1 altijd de even beurten en speler 2 altijd de oneven beurten heeft is dit een simpele en kleine 1D-array per speler.
Het is nu al relatief makkelijk geworden, maar je kan nog iets verder gaan,
spoiler:in de posities is namelijk ook een herhaling te zien, een verschillende voor beide spelers maar natuurlijk met een klein gemeenschappelijk veelvoud. Bovendien is de herhaling an sich onafhankelijk van de startpositie. Daardoor zijn de posities voor de rest van de opgave volstrekt irrelevant geworden en heb je alleen nog maar de scores nodig als je die array groot genoeg maakt.
Als je dat allemaal hebt bedacht, is het nog maar een kleine stap om
spoiler:uit te rekenen hoe vaak de hoogste score voor elke speler in de totaalscore past, en daarna zijn er nog maximaal Y ronden te doen, waarvan de scores in je eerder uitgerekende array zitten.
Op dat moment heb je het aantal ronden en kan je
spoiler:de rest redelijk makkelijk uitrekenen op een vergelijkbare manier als waarop de scoreberekening ging. Het is nu nauwelijks complexer dan een formule geworden

qua looptijd iig
Daarom duurt het bij mij ook even lang ongeacht tot welke score je wilt spelen. Dus tot 100000000000000000000 punten is ook binnen een paar milliseconden uitgerekend.
Misschien niet het superleesbaarst, en deel 2 heb ik geen zin gehad netter te maken, maar here goes:
Members only:
Alleen zichtbaar voor ingelogde gebruikers.
Inloggen