Friday, December 1, 2023

Advent of Code 2023

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.

7. Seitsmes päev - kaardimäng ja pokkeri kombinatsioonide võrdlemine. Õppisin ära sort() funktsioonile custom comparator'i tegemise. Üldiselt ootamatult lihtne.

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.

14. neljateistkümnes päev, kivide veeretamine. Üsna lihtne.

Õ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)]



15. Viieteistkümnes päev, läätsede jagamine kastidesse. Väga lihtne. Kirjeldus oli aga pikk ja keeruline. Nagu selgus, sai AI sellega triviaalselt hakkama. Siin on chatgpt näidis-sessioon.

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". 

7 comments:

notsu said...

ma loen "adventi" alati nii, et selle ladina tähendus tiksub kaasas. Et advent on kohaletulemine. Seega loen "advent of code'i" alati tähenduses "koodi kohaletulemine" ja mõtlen: kust ta tuleb? mis siis juhtub, kui ta kohale jõuab?

Cranberry said...

Mitte midagi ei saanud aru.
Enese harimise eesmärgil olen kõigil koolitustel valinud endale rühmatöö kaaslasteks IT-mehed/naised, lootuses, et midagi(gi) külge jääb. Väidetavalt pidi pime kana ka tera leidma. Nemad jälle vastupidi - särasid õnnest, et regulatsiooniinimest lähedalt tundma saavad.

Kaur said...

Ahh hm. Kui tohib uurida - mis regulatiivses valdkonnas sa toimetad?

Arusaamisest. Ega ma ülearu selgelt ei kirjuta. Aga kas sa ülesande lingi tegid lahti ja vaatasid läbi? See on siis see:
https://adventofcode.com/2023/day/1

Kas see harjutuse sisu on arusaadav?

Kaur said...

Mu arust kõik normaalsed :) inimesed mõtlevad "advent" all "ootus", mitte "kohaletulemine".

notsu said...

ega see väga erinev ei olegi! koodi ootus: kust see oodatav kood tuleb? mis juhtub, kui tuleb?

mustkaaren said...

ja mis see siis teeb?

Kaur said...

Kaaren, mille kohta see küsimus käis...?