Thursday, December 2, 2021

Advent of Code 2021


... algas facepalm'iga. 

1. päeva ülesanne on triviaalne, soojendus. 
Teen ära, saadan tulemuse - ei sobi.
Wtf?
Lahendan Exceli abil ära.
Õige tulemus oli 1 võrra erinev.
=> debugima. +-1 tulemus viitab veale sisendi lugemises, et kas esimene või viimane rida ei lähe arvesse vms. Aga ei, see on korras.
Lõpuks selgus - tüübiteisenduste viga. Võrdlesin oma arust arve, aga tegelikult stringe. Ja kui "9" > "8", siis "10" < "9". Ehk int() oli puudu. Muidugi on samal teemal ka Redditi lõim.
Pythoni lahendus tuli lõpuks kokku kolm rida - faili sisselugemine, 1. osa ja 2. osa:

data = [int(x) for x in open("data\\01.txt", "r")
print("Part 1:", sum([data[i] > data[i-1] for i in range(1, len(data))]))
print("Part 2:", sum([data[i] > data[i-3] for i in range(3, len(data))]))

2. päeval olin targem ja lahendasin kohe Excelis.

Edetabelites olen ma juba viimane :), sest 1&2 detsembril olin Tartus lähetuses ja aega ei olnud; tegin mõlemad ülesanded 2. õhtul. 
 
3. päev - 10110010... - veidi pythonis pusimist, kõige keerulisem oli ülesande tekstist aru saada.  

4. päev - bingod. Teen kõigepealt mingi listidega pusa. Siis kirjutan klassi-põhiseks ümber, lihtsalt et klasse meelde tuletada. Redditis on sellised pythoni lahendused, et mul pole lootustki aru saada. Kaks rida numpy't.

5. päev - lõikuvad jooned maatriksil ehk "ventilation vents". Lihtne, sest Python on siin väga abiks. Andmestruktuuriks dict((x,y)).
... läksin lugesin ülilõime (kuidas on "megathread" eesti keeles?) ja sain muidugi targemaks:
- numpy.sign()
- collections.defaultdict
- list.extend()
- Counter
- dict.values()
Kõik elementaarsed asjad, eks, aga kui ei kirjuta, siis ei kasuta ega mäleta.
Edit: ja siis tuleb keegi välja lihtsa, kompleksarvudega lahendusega.

08. päev - segiaetud signaalid ja arvu-displey-segmendid.
Lahendasin loogikaülesande paberil ära ja kirjutasin suht jõuga programmiks ümber.
Kole, aga töötab. 
Redditis on paar väga elegantset loogilist lahendust. 
Enamik pakutud variante on aga veel pikemad kui minu oma.
Minu väljamõeldud lahendust ma ei leidnudki.
Päris huvitav, kui mitut moodi saab sama asja lahendada :)

09 .ja 11. päev - ruudustik (grid), flow fill jne. 
Üsna lihtsad mõlemad - vähem kui ekraanitäis koodi.
Õppetund sama mis 5. päeval: maatriksit on lihtne esitada dictionary'ga, võtmeks (x,y).

10. päev - stringitöötlus, "<({[)" ebakõlade leidmine
statisics.median kasutus, ei muud harivat.

13. päev - peegeldused
Lihtne. Kasutasin andmeteks alguses defaultdict'i, siis dict'i, lõpuks set'i. 
Abiks oli hiljuti leitud trikk, et andmestruktuuri muutmiseks selle itereerimise ajal on for x in list(mingi_set). 

14. päev - kemikaal, string? insertions ja reeglid
Esimene osa triviaalne, teist - ei suuda välja mõelda. Arvutasin, et kui ma optimeerin mälu kasutuse biti tasemeni ära, tuleb 20 Gb. Kettale mahuks pmst :) Mingeid mustreid, mis võimaldaks optimeerida, ei leidnud. Tähendab neid kindlasti on, aga ma ei oska kasutada ega usu, et see oleks õige lahendus. Lihtne variant "arvutame kuni mälu on ja sealt ekstrapoleerime" ei tööta.
Hmm. 

15. päev - optimaalse tee leidmine ruudustikus
Sisuliselt samuti flood fill. 
Pusisin palju pikemalt kui peaks, aga midagi keerulist ei esimese ega teises osas.
Realisatsioon ühe dict'i ja paari set'i peal, kõigil indeksiteks (x,y) tuple-d. Jube mugav. 

17. päev, allveelaeva kasutamine kahurina, https://adventofcode.com/2021/day/17
Esimese osa modelleerisin virgalt, tegelikult oli analüütiline O(1) lahendus olemas, tobu. Ehkki oli puhas Newtoni füüsika / kinemaatika ülesanne. (Üles visatud asja v-kiirus maapinnale tagasi jõudes == viskamise v-kiirus.) 
Teise osa.. pusisin ka kuidagi ära. 

20. päev - pilditöötlus, sisuliselt game-of-life ruudistikul, https://adventofcode.com/2021/day/20
... , aga trikiga. 
Tegin programmi, imelihtne, testiga töötab... aga päris sisendiga mitte.
Wtf!
Hakkasin vahe-etappe välja trükkima ja leidsin mingi bugi... mis, nagu selgus, polnudki bugi, vaid erinevus testi/päris sisendi vahel. Default rule lõpmatul väljal oli erinev. Võttis veidi pusimist, et lahendus korda saada. 

21. päev - Dirac Dice, https://adventofcode.com/2021/day/21
Esimene osa lihtne, teine - ei oska. 

22. päev - Reactor Reboot, ülekattega kuubikute arvutus, https://adventofcode.com/2021/day/22
Esimene osa lihtne, teine - ei proovinud veel.

23. päev - kirpvähkide korraldaminehttps://adventofcode.com/2021/day/23
Esimese osa tegin Excelis mängides, aga edasi?
Pole aimugi. :(
(edit: tegelikult muidugi on aimu, eks ta üks puud pidi otsimise ülesanne on, tuleb lihtsalt ette võtta.)



24. - monaadide arvutus liba-assembleris, https://adventofcode.com/2021/day/24
Oo mida ülesannet!!!
Oli antud assembleri-laadne keel, kuue opkoodiga (inp add mul div mod eql) ja nelja registriga.
Sisendiks oli programmitäis selle assembleti koodi.
Ülesanne: leia maksimaalne nelja_teist_kohaline arv, mille kohta see programm andis tulemuseks nulli.
Kuna ammendav otsing üle 14 numbri tundus võimatu, siis... mida?
Süvenesin pikka koodi; see koosnes lõikudest, mis kas korrutasid eelmise väljundi 26-ga või ei vastavalt mingile tingimusele. Pmst hakkasin Notepadis käsitsi assemblerit interpreteerima. Mitmel korral jooksin ummikusse. Käisin Redditist abi otsimas, kuid sealsed juhendid lõid pildi täiesti sassi, läheneti kes kurat kuidas :) Igatahes sain kinnitust sellele, et assembleri emulaatorit kirjutada ei ole vaja ja peaks saama analüütilise lahenduse. Sisuliselt tõlkisin programmi käsitsi ümber - Exceli valemiteks :) 
Lõpuks taandus kõik triviaalsete algebraliste avaldiste peale. Tuli vaid aru saada, mis millega seoses on - milline rida millega ja milline atribuut sisendis (assemblerist välja nopitud parameetrites) millega. Ja siis lahendada seitse lihtsat diofantilist kahe muutujaga võrrandit, mille mõlemad lahendid pidid olema lõigul [1,9]. Kõlab segaselt, aga on lihtne, vt joonis. Kuid mitu korda umbe jooksin ikkagi. 

Redditis on sama ülesande jaoks pööraselt erinevaid lahendusi. 


25. - meripurade liikumine ruudustikus, https://adventofcode.com/2021/day/25
Väga lihtne, ehkki kulutasin tänu valesti lugemisele ja mõnele bugile ikkagi palju aega.

No comments: