(Bu yaziyi 2022-01-18 tarihinde hazirlamis ama farkli sebeplerden yukleyememistim.)
AOC noel civarinda sonlaniyor sanirim. Yani 2 hafta oldu biteli. Tabii problemleri cozmek icin bir son tarih yok. 2016 yili etkinliginin sorularini da acip cozebiliriz yani hala.
Bu sene APL kullandim problemleri cozmek icin. APL’e de bu sayede girme firsati elde etmis oldum. https://xpqz.github.io/learnapl/intro.html adresindeki kaynak bu surecte oldukca yardimci oldu.
projects/advent-of-code adresindeki cozumlerden de goreceginiz uzere APL dili diger programlama dillerine pek benzemiyor. Pek cok islem ve fonksiyon icin semboller mevcut. Mesela asagidaki bir problemin (https://adventofcode.com/2021/day/20) cozumu. Tum cozum bu satirdan ibaret. Ilginctir ki bu satir aslinda okunabilir bir satir. (Agustos 2022 tarihli ek not: gectigimiz aylarda APL bilgim gelisti ve bu cozumun idealden uzakligini daha iyi gorebiliyorum. Ama benim o tarihteki bilgimi temsil ettigi icin yaziya ve koda dokunmadan birakiyorum).
Ornek
⊢part1 ← +/∊ ({s←⊃⍵ ⋄ a←⊃1⌷⍵ ⋄ (m⌷⍨2⊥9⍴s),⊂({m⌷⍨2⊥∊{(s 0 1)[⍵]}¨⍵}⌺3 3)1+s pad a}⍣2) (0,(⊂x0))
Ilginc bulabileceginiz kisimlar:
-
f⍣2 X
: 2 defaf
fonksiyonunu X uzerinde calistir:f (f X)
-
f⌺(3 3)X
: X uzerinde 3x3’luk bir filtre ile gezerek her bir 3x3’luk alan icin f’i cagir demek. -
m⌷⍨2⊥∊ X
: X icindeki elemanlari bir liste haline getirip, bu listenin denk geldigi 2 tabanindaki degeri hesapla.m
nin bu hesaplanan konumdaki degerini al. -
+/∊X
: X icindeki 1’lerin sayisini bul.
Bu 1 adet satir aslinda algoritmanin koda dokulmus hali.
: FILL FAUCETS OPEN TILL-FULL FAUCETS CLOSE ;
: RINSE FILL AGITATE DRAIN ;
: WASHER WASH SPIN RINSE SPIN ;
FORTH dilini ogretirken verilen bu kod ornekleri nasil ki bir camasir makinesinin algoritmasini saydam bir sekilde okuyucuya aktarabiliyorsa, APL okuyabilen birisi de part1
satirini okuyup algoritmayi netce gorebilir.
APL de zaten algoritmayi kagit uzerine anlasilabilir bir sekilde, bu algoritmayi calistiracak bilgisayarin calisma prensibinden de cok kopuk olmayan bir sekilde yazabilmek icin cikmis. Bir programlama dili degil, bir notasyon olarak kullanilmis.
APL’in programlama dili olarak cikisi daha sonraki tarihlerde oluyor. Su anda Dyalog-APL, J, K, Q, vb turevleri mevcut. Finans teknolojileri haricinde piyasada pek yeri yok. Ama zaten bir dili ogrenmek icin bu dilin piyasa dili olmasina da gerek yok. Bir sey sadece keyifli oldugu icin de yapilabilir, ve de gorunen o ki ben bulmaca cozumlerinde APL kullanmaktan keyif alacagim.
Ayni zamanda APL bir "array" programlama dili. Ruby’de mesela "her sey bir nesnedir", LISP’te "her sey bir listedir (linked-list)" algisi var. APL’de de "her sey bir array" deniliyor.
Sonuc
Ben APL dilini kullanmaya devam edecegim sanirim. Bulmaca cozmek disinda hangi konularda kullanacagim, hangi konularda kullanabilecegim, bunlar zamanla gorecegim seyler. Ama dil ile ilk etkilesimimden keyif aldim. 2022’de yeni bir dil ogrenmek istiyor iseniz ve henuz secmediyseniz APL turevi dillere (ben Dyalog’u sectim) bir bakin derim.