Mogelijk zit daar het probleem. Ik doe iets soortgelijks maar ik spendeer iets meer tijd aan het detecteren van een patroon, zonder er van uit te gaan dat het na 3 keer vaststaat.Thorwing schreef op donderdag 21 december 2023 @ 19:31:
Kijk, dat heb ik dan wel weer, dezelfde oplossing. Haha, maar ik moet ook eerlijk zeggen dat mijn oplossing niet werkt voor jouw 'hele moeilijke case' (elders in de thread) Mijn oplossing gaat er namelijk vanuit dat de set aan punten in de frontier vaker voor kan komen. En bij het vinden van 3 maak ik daar een quadratic formule voor.
Ik kan deze ook niet volledig oplossen. Bruteforcen tot 1000 of 5000 stappen geeft 1072 respectievelijk 5360 als antwoord.Hier vind ik helaas ook geen oplossing voor, op stap 5 zit een frontier van 3 punten die daarna nooit meer voorkomt, en daar breekt mijn code op.
Mooie compacte oplossing! Hoe kwam je op het idee voor die cykel-detectie?
Een paar implementatie-tips (ik weet niet of je er op zit te wachten maar ik kan het niet laten):
- In plaats van een binary heap kun je voor een breadth-first search beter een deque gebruiken; is aanzienlijk sneller.
- De check if (x, y) in seen kun je beter doen vóór je de state in de queue stopt op regel 25. Is ook sneller.
- De seen-set is eigenlijk de combinatie van de even/odd-set. Je kunt beter 2 sets gebruiken i.p.v. 3.
- De grid dictionary lijkt me niet zo zinnig aangezien 'ie precies dezelfde informatie bevat als data, maar kostbaarder is om te indexeren; simpeler om die achterwege te laten?
- Tenslotte, misschien een persoonlijke voorkeur, maar ik vind dat je hier de tuple assignment syntax een beetje misbruikt:
Python:
1
| ln, steps, cycle, seen, even, odd, n = len(data), 0, [], set(), set(), set(), 26501365 |
Het is zo lastig te zien welke waarde precies aan welke variabele wordt toegekend (is cycle nu een lege lijst of een set?). Als je al die assignments per se op één regel wil zetten, doe het dan zo:
Python:
1
| ln = len(data); steps = 0; cycle = []; seen = set(); even = set(); odd = set(); n = 26501365 |
edit:
En dit stukje:
Python:
1
2
3
| for x in range(n // (ln * 2)): p2 += offset offset += increment |
Kun je volgens de formule voor driehoeksgetallen omschrijven naar de gesloten vorm:
Python:
1
2
| x = n // (ln * 2) p2 += x*offset + x*(x - 1)//2*increment |
Als ik die ideëen combineer kom ik op de volgende code: day21.py
[ Voor 6% gewijzigd door Soultaker op 21-12-2023 20:18 ]