FCA schreef op zondag 14 december 2025 @ 20:41:
Dag 2:
spoiler:Je moet kijken naar de priemfactorisatie van het aantal digits. Zit daar een priemfactor 2x of meer in hoef je die uberhaupt niet mee te tellen. Verder moet je het aantal priemfactoren tellen: is dat even tel je die mee, is dat oneven dan moet je die negatief meetellen, om dubbeltelling te compenseren.
Top dat je het zelf hebt weten op te lossen! Voor de duidelijkheid: het is de priemfactorisatie van het aantal
herhalingen (
rep in je code) waar het om gaat, niet het aantal cijfers dat herhaald wordt (
digits) of het totaal aantal cijfers. Dat is wat het zo verwarrend maakt.
Achteraf is het wel logisch, en als je de kwadraten van priemgetallen hebt geëlimineerd, is de rest feitelijk een toepassing van het
inclusion-exclusion principle.
(Mogelijk kan je implementatie iets eenvoudiger: de special casing rond
invalid_check_start ziet er een beetje verdacht uit.)
Dag 8:
spoiler:De disjoint set datastructuur geimplementeerd. Uiteindelijk maar marginaal sneller (18ms vs 20ms) dan mijn oorspronkelijke versie waarbij ik in een bitset bijhield welke punten er in zaten. Grappig genoeg was een niet-triviale speedup (nou ja, ~13ms van 18 naar 5) voor deel 1 om niet alles te sorteren, maar een select te doen.
Dit had je vast zelf al bedacht, maar dat komt het genereren en sorteren van alle paren van punten O(n
2 log n) tijd kost, terwijl zelfs de meest naïeve implementatiie van disjoint sets (waarbij je simpelweg de hele array doorloopt om de ene set naar de andere te herlabelen) nog in O(n
2) loopt, dus het optimaliseren van het tweede deel levert theoretisch geen fundamentale verbetering op. Die optimalisatie levert pas wat op als je ook het eerste deel efficiënter maakt, maar dat is veel moeilijker.
Dat was de reden dat ik voor deze dag uiteindelijk geen extra challenge had gepost; ik kon geen data sets genereren waarop het verschil tussen naïeve en slimme oplossingen voldoende groot was.
Dag 9:
spoiler:Met behulp van een flood-fill en een 2d prefix sum hoef je alleen maar de hoekpunten te checken, en als je de coordinaten goed comprimeert, krijg je een oplossing die als O(k^2) schaalt, met k het aantal punten in de invoer.
Mooi gevonden met die prefix sum!
Zit nog wel een bugje in je implementatie. Bijvoorbeeld op deze invoer:
zou 12 het antwoord moeten zijn bij deel 2.
Was blij dat ik de parsers van vorig jaar ter inspiratie had, en weinig gestruggeld met Rust dingen (in tegenstelling tot vorig jaar, heb dus wel wat bijgeleerd blijkbaar).
Qua parsing was dit jaar ook wel echt eenvoudiger; ik heb niet één keer een reguliere expressie hoeven gebruiken.
Overigens vind ik jouw Rust code erg goed leesbaar, terwijl ik eigenlijk geen Rust kan. Dus wat mij betreft ben je goed bezig.
De moeilijkheidsgraad ging wel snel omhoog vanaf dag 7 vond ik. Aan de andere kant vind ik het wel weer mooi geweest, moet nog genoeg doen voor werk voor de kerst.
De interessante algoritmes komen vaak pas na een paar dagen, en zijn vaak voor de officiële invoeren helemaal niet nodig; dag 10 was de uitzondering op de regel. Persoonlijk zou ik het wel leuk vinden als de opgaven wat moeilijker waren, met wat meer tijd ertussen om er goed over na te denken, maar dat is eigenlijk het tegenovergestelde van de “advent”-formule natuurlijk.