Jatketaan Advent of Code 2017:n kolmanteen tehtävään, jonka nimi on Spiral Memory.
Tämä oli minusta jo hieman tavallista day 3:a haastavampi. Usein aivan alkupään tehtävät aukeavat vielä aika suoraviivaisesti, mutta tässä piti pysähtyä hetkeksi miettimään mitä ruudukossa oikeastaan tapahtuu. Se on minusta yleensä hyvä merkki: tehtävä ei ole hankala vain työn määrän takia, vaan siksi että se pakottaa hahmottamaan rakennetta.
Ensimmäinen osa kysyy annetun luvun Manhattan-etäisyyttä spiraalin keskelle. Suoraviivainen tapa olisi rakentaa koko ruudukko koordinaatteineen, mutta tähän kohtaan sitä ei oikeastaan tarvita lainkaan. Riittää huomata, että jokaisen kehän kulmiin osuvat parittomien lukujen neliöt. Kun oikea kehä on löydetty, etäisyyden saa laskettua suoraan siitä, kuinka kaukana luku on lähimmästä sivun keskipisteestä. En edes tiedä onko tämä se tavallisin tapa ratkaista a-kohta, mutta minusta ainakin aika siisti shortcut.
Toiseen osaan en sitten keksinyt vastaavaa oikotietä, joten siinä spiraali piti jo käytännössä rakentaa. Kävelen kehää ympäri yksi sivu kerrallaan ja säilytän jokaisen ruudun arvon sanakirjassa koordinaattiparin perusteella. Sanakirja tuntui tässä oikein luontevalta valinnalta: naapurit saa haettua helposti, eikä tarvitse varata etukäteen mitään kiinteää kaksiulotteista taulukkoa.
Ratkaisu pyörii omalla koneellani noin 0,1 ms ajassa, mikä on tällaiseen tehtävään jo oikein hyvä tulos. Toki aina voisi vielä viilata, mutta en tiedä saisinko parempaa aikaa ilman että koodi samalla menisi tarpeettoman erikoiseksi. Varsinkin b-kohdassa sanakirjaratkaisu tuntui hyvinkin oikealta valinnalta.
Ratkaisun lähdekoodi löytyy myös erillisenä tiedostona: d3_2017.py.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | |
Tykkäsin tässä erityisesti siitä, että saman tehtävän kaksi osaa menivät lopulta aika eri tavoilla. A-kohdassa pääsi oikaisemaan rakenteen havainnoinnilla, mutta b-kohta palautti nopeasti takaisin koordinaatteihin, naapureihin ja askel askeleelta etenevään rakentamiseen. Ehkä juuri siksi tämä jäi mieleen tavallista parempana day 3:na.