Lukantima

Advent of Code: 1. Gün

Advent of Code Blog'un ilk gününden herkese selamlar! Önümüzdeki 12 gün boyunca bu senenin Advent of Code'unun her bir günü hakkında yazıyor olacağım. Kısa blog gönderileri biçiminde başımdan geçenleri anlatmak aslında amacım.

Eğer benim gibi AoC'ye ilk kez katılmışsanız/katılacaksanız, soruların her geçen gün zorlaştığını duymamış olabilirsiniz. Ben kasımın sonundaki ufak araştırmalarımda bu durumu öğrenmiştim aslında. Bu sebeple de ilk günün sorusunu görünce şaşırmıştım aslında, ilk gün olabilecek kadar kolay gelmedi aslında. Bunu biraz bu senenin AoC'sinin 25 değil 12 gün olmasından kaynaklı olduğuna yordum, sonuçta süre yarıdan az ise zorlaşma hızının da yüksek olması hatta daha zor bir sorudan başlanması gerekebileceğini düşündüm. Ha evet, daha önceki yılların AoC'lerini çözmediğim için tam olarak ne beklemem gerektiğini de bilmiyordum.

Sonuç olarak soru, basitçe bir modüler aritmetik sorusuydu. Kalan alma işlemini öğrendiğim ilk günden beridir, ortaokul? lise?, modüler aritmetiğe lanet okuyan birisi olarak çok da kolay değildi diyebilirim. Fakat yine de zamanımın daha büyük bir kısmını dil seçimi için kullandım. Teal oldukça mantıklı geldi. Lua'nın aksine statik tipli olduğu için yazması daha rahat ama Lua kadar da sade ve basit bir dil olması etkendi. Detaylı öğrenmek de istiyordum açıkçası. Bu soru için de oldukça mantıklıymış aslında. Lua'daki modulo işleci diğer birçok dilinkinin aksine kalan değil modulo işleci, yani negatif sayılarda da pozitif değer dönüyor! Birçok dilde ((x % n) + n) % n gibi bir fonksiyon ile kalanı modulo yapıyorken insanlar, ben bu sorunun varlığından bile tam haberdar olmadım diyebilirim. Bu sayede çözümüm oldukça kolay oldu:

local direction_string, number_string = rotation_input:match("([RL])(%d*)")
local direction = direction_string as RotationDirection
local rotation = ROTATION[direction] * tonumber(number_string) as integer

state = (state + rotation) % 100
if state == 0 then
    password = password + 1
end

Burada ilk boşluğa kadarki kısım girdiyi alma, sonrası ise hesaplama oldu. 100 ile modulo alıp duruyor sürekli kod. Buradaki bir iki ekstrayı da şöyle tanımladım:

local enum RotationDirection
    "R"
    "L"
end

local ROTATION <total>: {RotationDirection: integer} = {
    R = 1,
    L = -1,
}
local state = 50
local password = 0

total anahtar kelimesi Teal'da baya güzel bir yere sahip, keşke const ile de birleştirebilsek!

Bununla birlikte ilk bölüm çözülmüş oldu. İtiraf etmek gerekirse, bulmacaların iki bölüm olduğunu tam bu ana kadar bilmiyordum. İkinci bölüm geldiğinde girdi alma kısmını ayırma ihtiyacı hissettim. Girdiyi basitçe aldıktan sonra modulo ile değişik hesaplamalar denedim ama bir türlü tutturamadım. Saatlerimi yemiş olmasına rağmen bir türlü matematiksel ifadesini bulamadım çözümün. Sonuç olarak işin hilesine kaçtım ve hareketleri teker teker simüle ettim:

for line in io.lines() do
    local rotation = parse_rotation(line)
    local rotation_sign = sign(rotation)
    local rotated = state + rotation
    local old_state = state
    for i=old_state + rotation_sign,rotated,rotation_sign do
        if i % 100 == 0 then
            password = password + 1
        end
    end
    
    state = rotated % 100
end

Buradaki sign işarete göre 0, 1 veya -1 dönen bir fonksiyon, yazması zor olmadığı için koymadım. Çok da önemli değil, döngünün adımını hesaplamak için yazdım bir bakıma.

Bu sayede ilk günden çift yıldızımı aldım! Hayatımda ilk kez Aoc'den çift yıldız almış oldum böylece. Bir şeyler başarmış olma hissini hissettiğim bir andı açıkçası. Artık başka bir dünyaya adım atmıştım, önümde 12 gün aralıksız bir etkinlik vardı ve ben de artık bu etkinliğin bir parçasıydım!

İlk AoC problemim olmasının yanında verdiği tat hoş değildi. Dediğim gibi, modüler aritmetik en başından beridir benim için hem zor hem de sinir bozucu olagelmiştir. Nitekim modüler aritmetik ile çözemedim problemi tam olarak. Yine de kafa patlatmanın kendisi bile hiç yoktan yeğdir.

İşin hilesine kaçıp O(n) süren problemi O(n2)'de çözmüş olmama rağmen ilk gün iki yıldızı da almış oldum böylece.

#aoc2025 #programlama #teal