Lukantima

Advent of Code: 7. Gün

Bayanlar baylar, Advent of Code'un ikinci yarısının ilk gönderisine hoş geldiniz! Biraz dramatik mi oldu acaba giriş? Altı gün arka arkaya, baya kısa da olsa, gönderi attığıma inanamayınca böyle olabiliyor.

Problemin kendisine geçecek olursak, 6 gün sonunda ilk kez şuncacık zorlandığımı hissettim diyebilirim. Zorlanma dediğim de ilk kez yazılımla ilgili bir bilgimi ortaya koydum anlamında daha çok. O da problemin ikinci kısmındaydı zaten.

İlk kısmında takyonların bölünmesini satır satır simüle etmek yeterli oluyor. Ben bool dizisi kullandım, sonraki aşamada eğer bölünme varsa kendisini false yaparken yanlarını true yapıyordu simülasyon. Zaten girdide hiçbir zaman yan yana iki bölücü olmayacağı için bu mantığı bozan bir durum yoktu. Ki olsaydı bile "koyacağım yuva sonraki satırda bir bölücü mü?" sorusunun cevabı ile o sorunu da halledebilirdim, ama dediğim gibi gerek yok buna.

İkinci kısım gerçekten dişe dokunur bir şeyle geldi: dinamik programlama. Her bir bölünmenin diğer bölünmelerle kombinasyonunu hesaplamak üstel oluyor, sonuçta n tane bölünme varsa 2n'e yakınsayan sayıda ihtimal mevcut. Belki faktöriyeldir hatta, çok düşünmedim açıkçası, ama işin içinden çıkılmayacak hızda büyüyen bir seviye olduğuna eminim. Fakat aşağıda gerçekleşen bir bölünmenin sonucu yukarıdaki bölünmelerden bağımsız olduğu için burada dinamik programlama uygulanabilir hâle geliyor. Her bir satır ve sütun tablonun bir parçası olduğu için iki boyutlu bir tablo yeterli oluyor. Sonrasında düz tablo doldurma, hatta muhtemelen tablonun tamamını bile doldurmaya gerek yok, hash tablosu olsa hafıza açısından daha verimli bile olabilirmiş.

Bu çözümdeki en ilginç kısımlardan birisi bence defer'i kullanma şeklim. C gibi C3'te de atama işlecinin kendisi bir değer döndüğü için return ret = 0; gibi bir ifade geçerli, 0 dönüyor ama dönmeden önce değeri ret'e atıyor. Bunun en güzel kısmı da tabloya kaydetmeyi çok temiz kılması. defer table[row][col] = ret; dediğimizde fonksiyondan dönmeden ama reti atadıktan sonra ret'i tabloya kaydediyor, böylece değer döndüğüm her yerde değeri elle kaydetmek zorunda kalmıyorum! Nasıl aklıma geldiğini bilmiyorum ama güzel bir hile bence.