AoC 2023, 5. päev
Publish date: Dec 5, 2023
Ülesanne
Siin: https://adventofcode.com/2023/day/5
Lahendus
Esimene pool
Ülesande esimene pool on päris lihtne, sest kui keeruline saab olla täisarvude mingisse lõiku kuuluvuse kontroll. Aga mõistagi, kui vaadata arvude suurusjärke, tekib selge teadmine, et teises pooles on mingit teravamat pirukat oodata.
Teine pool
No muidugi nii läkski. Mõtlesin üle, kirjutasin kokku päris paljusõnalise lahenduse, tegin sinna sisse mitu off-by-one viga ja raiskasin hullusti aega.
Töötav loogika on aga lihtne:
- Iga sisendiks olev vahemik tuleb jagada kolmeks: vasak, keskmine, parem, kusjuures lihtsamapoolse matemaatilise avaldisega on võimalik igal juhul väljendada seda, et kui vastav osa puudub (näiteks: kui teisendusreegel katab vahemiku täielikult, siis vasak ja parem pool puuduvad), siis on tema pikkus $0$. Kolmeksjagamine käib selle järgi, kuidas parasjagu kasutusel olev teisenduskaardi esimene kättejuhtuv reegel sisendiks olevat vahemikku katab. “Keskmine osa” on defineeritud kui see, mida hetkel kasutatav reegel katab.
- Keskmine osa, kui selline eksisteerib, tuleb teisendada.
- Vasak ja parem osa, kui sellised eksisteerivad, tuleb anda edasi järgmisele teisendusreeglile ning teisenduste kaardi lõppemisel anda järgmisele kaardile edasi, nii nagu on.
- Seda loogikat tuleb korrata üle kõigi teisenduskaartide.
Väike DRY nipp: ülesande esimene pool on võimalik taandada teiseks pooleks, defineerides sisendandmed kui vahemikud, mille pikkus on $1$.
Lõplik lahenduskäik: https://github.com/fazz/aoc/blob/master/aoc2023/day05.py