Iga-jõulune programmeerimise harjutus, iga päev uus ülesanne.
https://adventofcode.com/2023
1. Esimene päev - arvude leidmine tekstirealt.
Olin regulaaravaldiste mooduli värskelt meelde tuletanud ja esimene osa oli lihtne, re.findall("\d", s). Teisega jäin aga nii hätta, et läksin foorumit vaatama. Esimesel päeval! Õige käitumine oleks olnud 2. osa implementatsioon kirjutada uuesti ja nullist, ilma regexp'ita, siis oleks mu viga välja tulnud. Subreddit arutleb, kas ülesande püstitus oli piisavalt selga ja et test-sisend ei katnud ülesande "triki" poolt. Ka mul jooksis test kenast läbi esimese proovimise peale.
Õppetund: positive lookahead regexp'ides, ehk siis muster findall("(?=(\d|one|two))").
Ma pole ainus; Reddit on hala täis. Veidi temaatilist kunsti sealt:
Mu armas laps tegi mõlemad osad rekursiooniga nagu naksti ära ja küsis "mis seal üldse rasket sai olla?" Nojah.
2.
Teine päev oli hästi lihtne - kolme värvi kuubikute kokkulugemine.
|
AI kunst, kuubikud |
3.
Kolmas päev - masina joonise pealt arvude ja tärnide leidmine. Lihtne.
4.
Neljas päev - kaardimäng ja korduvate arvude leidmine. Lihtne. Õppisin itertools.zip_longest() kasutamise ära.
5. päev - seemned, mullad ja asukohad. Esimene osa on graafi juurutamine. Teist ei oska. :(
6. päev -
boat races; sisuliselt ruutvõrrandi lahendamine sobiva aegade vahemiku leidmiseks. Tegin Excelis ära.
8.
Kaheksas päev - AAA ZZZ ja
PJD = (XJN, PCV) labürindis hulkumine. Lihtne. Tulin ise väiksema ühiskordse lahenduse peale. Õppisin ära lõpmatu tsüklilise iteraatori, itertools.cycle(). Redditi meemid on puhas kuld.Päeva nalja tegi Chrome, kes pakkus, et sisend on kõmri keeles.
9. Üheksas päev - jadade (tegelikult N-järku polünoomide) ekstrapoleerimine. 1. osa oli triviaalne, 2. osa vajas veidi +- märkide üle mõtlemist. Programmeerida polnud suurt midagi. Sisulist koodi oli vaid paar lihtsat rida.
10. Kümnes päev. Maasikas :) Kõigepealt tuli leida ruudustikust üles toru. See oli kerge. Siis tuli leida selle toru "sees" olev ala. Kasutati väga eri meetodeid - flood fill, raytracing jne. Ma trükkisin ruudustiku koos toruga välja, vahetasin Wordis sümbolid Nethacki seinte vastu ära ja siis lugesin "sees" ja "väljas" olevad punktid käsitsi kokku. Läks veidi aega, aga töötas!!! Järgmisena imesin sama asja Photoshoppi ja flood fill'isin ära. Lõpuks lahendasin programmiga ka ära - skaneerisin järjest ridu ja lugesin seinu (|, FJ ja L7) kokku. Ootamatult lihtne ja kiire.
11.
Üheteistkümnes päev, galaktikate kauguse leidmine paisuvas ruudustikus. Tegin üleminekutabeli sisseloetud koordinaatidest uute arvutamiseks. Nii 1. kui 2. osa olid triviaalsed, ja 2. osa jaoks tuli konstant +1 lihtsalt (1000000-1) -ga asendada.
Väga abiks on loetud soovitus x ja y asemel kasutada koordinaatides "row" ja "column" ("col"), kõik on kohe palju selgem. X/Y korral pole iial selge, mis on esimene ja mis teine, mis suunas nad on jne.
13. Kolmeteistkümnes päev, peegelduste leidmine. Brute force ja natuke indeksi-aritmeetikat. Redditis on igasugu imelahendusi ja algoritme. Minu oma on ebaefektiivne, aga hästi lihtne ja hakkas kohe tööle mõlema osa peal.
Õppisin tuple'de (paaride) list sorteerima igatepidi.
Nii näiteks saab sortida tuple teise välja väärtuse järgi:
rolls = [(1,2),(1,3),(1,4),(3,1),(3,2)]
sorted(rolls, key = lambda x:(x[1],x[0]))
[(3, 1), (1, 2), (3, 2), (1, 3), (1, 4)]
18.
Kaheksateistkümnes päev, ruudustikus teega ümbritsetud pindala leidmine. Esimese osa tegin ära oma peaga ja kergesti - tegin tee sees flood fill'i. Teise jaoks pidin googeldama, leidsin
Shoelace algoritmi, aga ka see ei andnud päris õiget tulemust. Võtsin Redditist vihje ja siis sain. Kokku tuli 20 rida hõredat koodi... Kasuks või asjasse puutuvad veel
Green's theorem ja
Pick's theorem. Rahvas rõõmustab "näe, päris matemaatikat ka natuke".