Advent of Code 2021

December 2021 · 9 minute read

APL programlama diliyle çözümlerimi aşaĝıda bulabilirsiniz.

Etkinligin ikinci yarisindaki sorularin kaydini gunluk bu sayfaya gecirmedigim icin eksiklikler var. Bir ara tekrar cozup buraya koymak isterim o cozumleri.

1. Gün

q1 ←{ +/ (1↓⍵) > (¯1↓⍵) }
q1pt1 ←{
	q1 ⍎⍤1⊢↑ ⊃⎕NGET './q1.txt'1
}
q1pt2 ← {
	x ← ⍎⍤1⊢↑ ⊃⎕NGET './q1.txt'1
	q1 (2↓x) + (1↓¯1↓x) + (¯2↓x)
}
q1pt1_v2 ←{
	+/2</ ⍎⍤1⊢↑ ⊃⎕NGET './q1.txt'1
}
q1pt2_v2 ← {
	x ← ⍎⍤1⊢↑ ⊃⎕NGET './q1.txt'1
	+/2</3+/x
}

N op / diyerek çözümü basitleştirebileceĝimi sonradan öĝrendim.

2. Gün

C ← 'forward' 'down' 'up'
M ← (1 0) (0 1) (0 ¯1)
d ← ⊃⎕NGET './q2.txt'1

q2←{
	×/↑↑+/{M[C⍳⍵[1]]×(⍎⍤1⊢↑⍵[2])}¨' '(≠⊆⊢)¨d
}

q2pt2←{
	f←{
		h ← ⍵[1]
		a ← ⍵[2]
		d ← ⍵[3]
		⍵ + ((⍺[1]) (⍺[2]) (a×⍺[1]))
	}
	⍝ (0 0 0) reduce'taki accumulator'un baslangic degeri
	x ← ⊖(↓↓0 0 0), {M[C⍳⍵[1]]×(⍎⍤1⊢↑⍵[2])}¨ ' '(≠⊆⊢)¨d_
	×/ (1 0 1)/ ↑f/ ↑¨x
}

reduce (/) saĝdan sola ilerliyor. Bu yüzden ⊖ yapıp ⍵ ile ⍺ 'yı deĝiştirmem gerekti.

3. Gün

C ← 'forward' 'down' 'up'
M ← (1 0) (0 1) (0 ¯1)
d ← ⊃⎕NGET './q2.txt'1

q2←{
	×/↑↑+/{M[C⍳⍵[1]]×(⍎⍤1⊢↑⍵[2])}¨' '(≠⊆⊢)¨d
}

q2pt2←{
	f←{
		h ← ⍵[1]
		a ← ⍵[2]
		d ← ⍵[3]
		⍵ + ((⍺[1]) (⍺[2]) (a×⍺[1]))
	}
	x ← ⊖(↓↓0 0 0), {M[C⍳⍵[1]]×(⍎⍤1⊢↑⍵[2])}¨ ' '(≠⊆⊢)¨d_
	×/ (1 0 1)/ ↑{}/ ↑¨x
}

4. Gün

n ←{ ⍎⍤1⊢↑⍵ }

nonempty ←{ ↑,/0≠⍴¨⍵ }
playcards ←{ n↑↑(nonempty⊆⊢)' '∘(≠⊆⊢)¨1↓⍵ }

d ← ⊃⎕nget'q4-tmp.txt'1
P ← n','(≠⊆⊢)⊃d ⍝ Pouch
C ← playcards d ⍝ Cards
WT ← {⍵⍳1}¨ ↓⍉↑ ↑∨/¨{∨/5∊¨⍵}¨¨{(+/[1]⍵) (+/[2]⍵)}¨∨\C∘=¨P ⍝ Winning Turns
score ←{ P(⊢⌷⊣)WT(⊢⌷⊣)⍵ × +/ (↑,/,/⍵⌷C) ~ (1+⍵⌷WT)↑P }

q4pt1 ← score WT⍳⌊/WT
q4pt2 ← score WT⍳⌈/WT

∨\C∘=¨P diyerek tombala kartlarının her bir turdaki halini türetmek gayet hoştu. \ işlemini önümüzdeki problemlerde nerelerde deĝerlendirebileceĝimi merak ediyorum.

Bu sefer tacit (bileşik) programlamayı daha iyi anladım. Y(⊢⌷⊣)X demenin Y[X] için en iyi çözüm olduĝundan emin deĝilim ama en azından bu tür fonksiyonlar yazabiliyorum.

Bir de çok ve yaptıĝımı farkediyorum, ki bu da ¨ kullanmamı gerektiriyor. Kutulanmış deĝerleri işlemeyi daha iyi öĝrenmem gerek.

5. Gun

valid_pt1 ← {(∆x ∆y)←|-/¨⍵ ⋄         (∆x=0)∨(∆y=0)}
valid_pt2 ← {(∆x ∆y)←|-/¨⍵ ⋄ (∆x=∆y)∨(∆x=0)∨(∆y=0)}
applyvent ← {{(⍵⌷M)+←1}¨⍵} ⍝ impure function. modifies M
range ← {d←⍵-⍺ ⋄ s←d÷|d ⋄ ⍺+s×⍳+1+|d} ⍝ 5 range 3 gives 5 4 3

d ← ⊃⎕nget'q5.txt'1
V ← {n¨','∘(≠⊆⊢)¨(1 0 1)/' '(≠⊆⊢)⍵}¨d
D ← 1+⌈/∊V
M ← D D⍴0 ⋄ valid ← valid_pt1 ⋄ applyvent¨0⌷{↑(↑,.(⊂,))/↑range/¨⍵}¨(↑valid¨⊆⊢){↓⍉↑⍵}¨V
q5pt1 ← +/∊M≥2
M ← D D⍴0 ⋄ valid ← valid_pt2 ⋄ applyvent¨0⌷{↑(↑,.(⊂,))/↑range/¨⍵}¨(↑valid¨⊆⊢){↓⍉↑⍵}¨V
q5pt2 ← +/∊M≥2

Haritanin uzerinde gezinerek bu problemi cozmek keyifliydi. Zaten ben bu gibi etkilesimli-kodlama benim sevdigim ve tavsiye ettigim bir yontem. Veri uzerinde yaptigim islemleri adim adim insaa edebiliyor olmak ilk basta zor gorunen problemleri bile goz korkutucu olmaktan cikariyor.

Degisebilir (mutable) bir tablo kullanmak durumunda kaldim. Saf olarak da cozmeyi denemek isterim.

6. Gun

f ← {s←⍵⋄((1↓s),0)+s[0]×(0 0 0 0 0 0 1 0 1)}
genS ← {x←⍵ ⋄ {+/x=⍵}¨⍳8+1}

d ← ⊃⎕nget'q6.txt'1
N ← n','(≠⊆⊢)d

q6pt1 ← 20⍕ +/↑(⊢f)/(⍳80),↓genS N
q6pt2 ← 20⍕ +/↑(⊢f)/(⍳256),↓genS N

Problemi "array"ler uzerinden dusunmenin cozumu kolaylastirdigi bir ornekti bu benim icin.

Ilk buldugum cozum sorunun ikinci yarisinda hafizayi cok sisirince yeni bir cozum bulmam gerekti.

7. Gun

d ← ⊃⎕nget'q7.txt'1
N ← n','(≠⊆⊢)⊃d
K ← 1+⌈/∊N
q7pt1 ← ⌊/+/ |(⍉↑K⍴¨N)-(0⌷¨⍳K(≢N))
g ← {0.5×⍵×⍵+1}
q7pt2 ← ⌊/+/g|(⍉↑K⍴¨N)-(0⌷¨⍳K(≢N))

Tablo ile hos bir sekilde cozulebilen bir problem daha. APL’den bahsettigim bir yazi yazarsam ornek olarak bu problemi kullanacagim.

8. Gun

A ← 'abcdefg'
MK ← {(∊∘⍵)¨A}
MK_v2 ← A∊
Mb ← ↑MK ¨ ('abcfeg' 'cf' 'acdeg' 'acdfg' 'bcdf' 'abdfg' 'abdefg' 'acf' 'abcdefg' 'abcdfg')

l ← {{((~'|'∊⊢)¨⍵)⊆⍵}' '∘(≠⊆⊢)⍵}
loner ← {x←⍵ ⋄ {⍵/x}1={+/x=⍵}¨x}
len ← {∊(⍺=≢¨⍵)⊆⍵} ⍝ selects items with given length
decode ←{
     b←⍺∊⍵
     1(⊢⍳⊣)b∘(⊢≡⊣)¨↓Mb
 }

solve ← {
     x←⍵
     S_1←2 len x
     S_4←4 len x
     S_7←3 len x
     S_8←7 len x
     S_a←S_7~S_1
     S_g←⊃1 len{⍵~S_a,S_4}¨x
     S_e←⊃∊{⍵~S_g,S_a,S_4}¨x
     S_b←loner 1 len{⍵~S_7,S_e,S_g}¨x
     S_d←S_8~S_7,S_b,S_e,S_g
     S_c←loner 1 len{⍵~S_a,S_g,S_e,S_b,S_d}¨x
     S_f←⊃∊{⍵~S_a,S_c,S_g,S_e,S_b,S_d}¨x
     ∊(S_a S_b S_c S_d S_e S_f S_g)
 }

d ← ⊃⎕nget'q8.txt'1
q8pt2 ← +/{R←solve↑0⌷l ⍵ ⋄ ⊖{⍺+10×⍵}/⊖R∘decode¨↑1⌷l ⍵}¨d

Bu aslinda epey vaktimi aldi. S_g yi bulmak problemin dugumunu cozdu.

len ve loner gibi fonksiyonlarin "tacit" hallerini de yazabilmek isterim tabii bir gun :)

9. Gun

x←↑n¨¨⊃⎕NGET'q9.txt' 1
d←⍴x

q9_pt1 ← +/{o←4⌷⍵ ⋄ (o+1)×0=+/o>(0 1 0 1 0 1 0 1 0)/⍵}¨∊¨sx

connlabel←{{{⍵[1;0]=0:0 ⋄ ⌊/0~⍨,⍵}¨(⊂⊢)⌺3 1⊢{⍵[0;1]=0:0 ⋄ ⌊/0~⍨,⍵}¨(⊂⊢)⌺1 3⊢⍵}(⍣≡)1+∘⍸@⊢⍵}
m2←connlabel x<9
pt2←×/3↑(⊂∘⍒⌷⊢){+/∊m2=⍵}¨0~⍨∪∊m2

Komsu-renklendirme problemiydi bu seferki. Array uzerinden bir cozum bulmak icin ugrasir iken ⍣≡ 'i kesfettim. Sistem dengeye varana kadar (sonuc degisene kadar) ayni fonksiyonu tekrar tekrar cagirma imkani veriyor.

Ayrica 'yi kullanmayi bilsem evvelden yaptigim 2-boyutlu filtre islemleri cok kolaylasirdi.

10. Gun

B        ← '>'   '}'  ']' ')' ' ' '(' '[' '{' '<'
Cost_b_1 ← 25137 1197 57  3   0   1   2   3   4
Cost_b_2 ← 25137 1197 57  3   0   0   0   0   0
Cost_b ← Cost_b_1

c←{Cost_b[B⍳⍵] }
cost←{
    x ← c⊃(⍵∊'>}])')/⍵
    x>0:0
    {⍺+⍵×5}/⊖0,⊖c¨⍵
}
f_i←{{(⍵,0)∨(0,⍵)}2=(1↓⍺[1]=⍵)+(¯1↓⍺[0]=⍵)}
f_rm←{∊(⊢⊆∘⍵)↑~∨/(⊢f_i∘⍵)¨'()' '{}' '[]' '<>'}
f_rms←{
    w_←f_rm ⍵
    (⍴w_)=(⍴⍵):w_
    f_rms w_
}
q10← {{⍵[0.5×(⍴⍵)-1]}{(⊂⍋⍵)⌷⍵}∊0(≠⊆⊢)cost¨f_rms¨d}
⍝ pt1
Cost_b ← Cost_b_1
q10 0
⍝ pt2
Cost_b ← Cost_b_2
q10 0

11. Gun

step←{
     x0←↑⍵[1]
     d←⍴x0
     flash←{
         ⍝⎕←DISPLAY ⍺ ⍵
         x←⍵
         F←⍺
         F_new←F-⍨x>9
         0=+/∊F_new:F x
         0=+/{(⍵⌷x)+←1}¨N_diag¨(,F_new)/(,⍳d):F x
         (F∨F_new)∇(x)
     }
     l r←↑¨(d⍴0)flash 1+x0
     (+/⍵[0],∊l)({9<⍵:0 ⋄ ⍵}¨r)
 }
x←↑n¨¨⊃⎕NGET'q11.txt'1
pt1←0⌷⊃step/⊖(⊂0 x),⍳100
pt2←1+{⍵⍳1}99<|2-/⊃¨{⊃step/⊖(⊂0 x),⍳⍵}¨⍳1000

"scan" (tarama) islemi tum elemanlarin uzerinden tekrar tekrar geciyor, ve bu yuzden de oldukca hantal. Bunun O(N!) olmayanini bulmak lazim.

12. Gun

A_lower←819⌶⎕A

d←⊃⎕NGET'q12.txt' 1
L←'-'∘(≠⊆⊢)¨d
C←∪↑,/L
C_once←{⍵/C}{⍵∊A_lower}¨⊃¨C
D←⊃↑⍴C
M←D D⍴0⍴D*2
{(⍵⌷M)←1}¨{⍵⍳1}¨¨{(,⍵)∘≡¨C}¨¨,¨¨L ⍝ marks M with 1s

iCity←{1(⊢⍳⊣)(,⍵)∘≡¨C}

f←{
  c←⍺
  Open←⍵
  next←Open∩{⍵/C}(iCity↑c)⌷(M∨⍉M)
  c≡'end':1
  0=(⍴next):0
  Open_←Open~C_once∩(↓,c)
  ∊{⍵ f Open_}¨next
}

pt1←+/ 'start'f(C~↓,'start')

f2←{
     fin←{⍵}
     c←↑⍺[0]
     path←⍺[1]
     Closed←⍵
     C_open←{⍵~↓'start'}{⍵/C}(Closed<(2-+/Closed>1))
     next←C_open ∩ {⍵/C}(iCity↑c)⌷(M∨⍉M)
     c≡'end':(fin 1)
     0=(⍴next):0
     +/∊{n←↓,⍵ ⋄ (⍵(∊path,'-',⍵)) f2 (Closed+(C∊n)×n∊C_once)}¨next
 }

pt2←('start' 'start') f2 ((⍴C)⍴0)

Bildigimiz postaci problemi…​

13. Gun

p←{'.#'[⍵]}¨                                                      ⍝ plot for binary matrix

{a←⍺[0] ⋄ b←⍺[1]>⍳a⌷⍴⍵ ⋄ (b⌿[a]⍵)((0,¯1↓~b)⌿[a]⍵)}                ⍝ cuts ⍵ at ⍺ to 2
                                                                  ⍝   where ⍺[0] is axis
                                                                  ⍝   where ⍺[1] is position at axis
f←{
     pt1 pt2←⍺ cut ⍵
     pt2_←⍺{⍺[0]=0:⊖⍵ ⋄ ⌽⍵}pt2                                    ⍝ flip horizontally or vertically
     sBigger←∊⌈/⍴¨pt1 pt2_
     ⊃∨/{⊖⌽sBigger↑⌽⊖⍵}¨⊢pt1 pt2_                                 ⍝ pad (in top and left) to match the bigger of the two
 }
dat←⊃⎕NGET'proj/apl/q13.txt'1
P←⊖¨n¨,','(≠⊆⊢)¨↑','∘((∊¨)⊆⊢)dat                                  ⍝ points as (i j) tuples
d←∊1+⌈/P                                                          ⍝ dimensions
F←(('yx'∘⍳∊)@0)¨(n@1)¨'='(≠⊆⊢)¨↑2∘⌷¨' '(≠⊆⊢)¨1↓,↑','∘((~∊¨)⊆⊢)dat ⍝ folds (as t
M←(1@P)d⍴0                                                        ⍝ the initial matrix

pt1←q13pt1←+/∊(⊃F) f M
pt2←p↑f/⌽(⊂M),F

Internette gordugum APL kodlarindaki gibi yorumlar ekledim yandaki sutuna. Guzel olmamis mi? :)

14. Gun

fn←{
 turns←⍵
 dat←⊃⎕NGET'proj/apl/q14.txt' 1
 p0←2,/⊃dat                                                  ⍝ initial pairs
 Ma←{a b c←⍵ ⋄ (a b)(a c)(c b)}¨(∊(1 0 1)∘/)¨' '(≠⊆⊢)¨2↓dat  ⍝ all movez
 Mk←⊃¨Ma                                                     ⍝ keys of moves
 Punq←∪↑,/Ma,⊂p0                                             ⍝ all pairs, uniq
 M←↑(+/(¯1 1 1)∘×)¨(Punq∊⊂)¨¨Ma                              ⍝ ∆state of moves
 Ps←{↑(Mk∊⊂⍵)/M}¨Punq                                        ⍝ ∆state of pairs
 s0←⊃+/(Punq∊⊂)¨p0                                           ⍝ initial state
 sf←↑{⍵+∊+/Ps×⍵}/⌽(⊂s0),⍳turns                               ⍝ final state
 ⎕←⊢A←∪∊Punq                                                 ⍝ all letters available
 ⎕←⊢scr←⌈2÷⍨(+/sf∘×)¨(+/¨Punq∘=)¨A                           ⍝ scores
 (⌈/-⌊/)scr
}
pt1←fn 10
pt2←fn 40

pt2 yine pt1’in cozumuyle calisamadi. Hafiza cok sisti ve daha etkin bir cozum bulmak durumunda kaldim. Verileri degil verilerin sayilarini tutarak bunu da hallettim. Ama kullanimindan oturu aldigim cevap istedigimden 1 fazla cikti. Ilk denememde dogru sonucu elde edemedim yani…​

15. Gun

solv←{
  M←⍵
  d←⍴M
  O←(1@(⊂0 0))d⍴0
  V←d⍴0
  C←d⍴0
  g←⊂d-1
  H←+/¨|g-⍳d
  f←{
      ⍝ V  visited
      ⍝ O  open/available
      ⍝ H  heuristics (cost to 'g'oal)
      ⍝ C  costs (cost to start)

      o←⍸(O∧0=V)
      0=≢o:1                ⍝ no more open slots. finish
      x←o⌷⍨{⍵⍳⌊/⍵}C[o]+H[o] ⍝ take the least cost pos
      x≡g:1
      V[x]←1
      n←{(~0∘∊¨⍵≥0)/⍵}{(~0∘∊¨⍵<⊂d)/⍵}(0 ¯1)(¯1 0)(0 1)(1 0)+x      ⍝ neighbours
      c←C[x]
      C[n]←{⍵⌷O:(⍵⌷C)⌊c+⍵⌷M ⋄ c+⍵⌷M}¨n ⍝ update costs to neighbours
      O[n]←1                           ⍝ make available

      0
  }
  {f 0:C[g] ⋄ ∇ 0} 0
}
pt1←{
    M←↑n¨¨⊃⎕NGET'tmp.txt' 1
    solv M
}
pt2←{
    M←↑n¨¨⊃⎕NGET'tmp.txt' 1
    S←⊖⌽10 9↑⌽⊖↑{⍵⌽1+⍳9}¨∪,+/¨⍳5 5
    solv⍪/(⊃,/)¨↓{S∘(⌷⍨)¨⍵∘(,⍨)¨M}¨+/¨⍳5 5
}

16. Gun, 17

Bu noktadan sonraki sorular icin tuttugum notlarin kalitesi dustu. Bazi cozumleri kullandigim arayuz (Ride) cokunce kaybettigim de oldu.

18. Gun

mag←{
    ⍝⎕←↑⍵
    x←⍵
    n d←x
    2>≢n:⊃n
    i j←0 2+(⊢⍳⌈/)d
    l←1⌷⍴↑x
    a←↑i↑¨x
    c←↑j↓¨x
    m←+/3 2×⌷∘n¨(i(i+1))
    n←1-⍨i⌷d
    ∇↓(a,(2 1⍴m n),c)
}
itr←{
    s x←(9 4)<⌈/¨⍵
    x:∇ xpl ⍵
    s:∇ spl ⍵
    ⍝⎕←↑⍵
    ⍵
}
add←{0 1+↓⊃,/↑¨⍺ ⍵}
par←{
    x←⍵
    b←↑x∘=¨'[],'
    n←⍎¨(~∨⌿b)⊆x
    d←⊃¨(~∨⌿b)⊆(-⌿+\2↑b)
    n d
}

mag⊃⊢y←(itr add⍨)/⌽par¨⊃⎕NGET'proj/apl/q18.txt' 1

19. Gun

'pmat' 'det'⎕CY'dfns'
RA←{⍵/⍨1=det¨⍵},(↓pmat 3)∘.{⍵@(⍺,¨⍳3)⊢3 3⍴0},1-2×⍳2 2 2
dat←getdata ⍬
D←≢dat
snsA←(∘.⊣)⍨dat

⍝ find matching sensors
matches←(∘.{cmn←⊃∩/∊¨⍺ ⍵ ⋄ 12=+⌿⍺∊cmn})⍨{(∘.far)⍨↓⍵}¨dat
snsM←↑¨(⍴snsA)⍴↑(,matches),.{⊂⍺/↓⍵}(,snsA)

fnd←(,⍨⍴dat)⍴⊃(,snsM),.(⊂relpos)(,⍉snsM)
⍝ found matches. fnd[i;j] ≡ r x y z,
⍝   `r` is ∆rot of "j" wrt "i"
⍝   `x y z` is ∆pos of "j" wrt "i"
fndr←⊃¨fnd    ⍝ found rotations
fndp←(1∘↓)¨fnd ⍝ found positions
I←⍸25>fndr    ⍝ indexes of matches in "fnd"

⍝{(⍵⌷xp)←⊂0 0 0 ⋄ (⍵⌷xr)←0}¨{(=/¨⍵)/⍵},⍳D D

open←(≢∪∊I)⍴0
imap←(⊃¨I){⊂(1∘⌷¨⍵)}⌸I
myi←(≢imap)⍴10+≢imap
0{myi[⍺]<⍵:⍵ ⋄ myi[⍺]←⍵ ⋄ ⍵>30:⍵ ⋄ ∇/(⊃imap[⍺]),⍵+1}0
Icand←⊃,/(((⊃¨I){⊂⍵}⌸I)@myi)27⍴9999
Idup←{i j←⍵ ⋄ open[i]←1 ⋄ open[j]}¨Icand
I_←(~Idup)/Icand
0≡≢∊~/∊¨I I_ ⍝ ensure nothing missing

P R←fill I_ ⍝ absolute positions and rotations
part1←≢∪⊃⍪/{↑(⊃P[⍵])∘+¨R[⍵]∘roti¨↓⊃dat[⍵]}¨⍳D
part2←{⌈/∊P(∘.{+/⍺-⍵})P}

20. Gun

m x0←readdata ⍬

pad←{k←⍺ ⋄ r c←(2 0)+⍴⍵ ⋄ (r⍴k){⍺,⍵,⍺}(c⍴k){⍺⍪⍵⍪⍺}⍵}

⊢part1←+/∊({s←⊃⍵ ⋄ a←⊃1⌷⍵ ⋄ (m⌷⍨2⊥9⍴s),⊂({m⌷⍨2⊥∊{(s 0 1)[⍵]}¨⍵}⌺3 3)1+s pad a}⍣2)(0,(⊂x0))
⊢part2←+/∊({s←⊃⍵ ⋄ a←⊃1⌷⍵ ⋄ (m⌷⍨2⊥9⍴s),⊂({m⌷⍨2⊥∊{(s 0 1)[⍵]}¨⍵}⌺3 3)1+s pad a}⍣50)(0,(⊂x0))

21. Gun

part1←{
   ⍝ both 'pad' and '⌺' uses 0 as fill-character
   ⍝  so I used 1 2 in place of 0 1 in the img matrix
    n←0
    scr←0 0
    pos←1-⍨4 1
    {i nr←⍵ ⋄ ⌈/scr≥1000:⍵ ⋄ nr_ ∆x←r nr ⋄ pos[i]←10|∆x+i⌷pos ⋄ scr[i]+←1+pos[i] ⋄ ∇(2|i+1)nr_}(0 0)
    (⌊/scr)×n×3
}
part2←{
    initpos←4 8
    N←21+10+1
    I←⍳N N
    IW←⍸¨⊂[1 2]21<(0 1)∘.⌷I ⍝ win indexes
    p←↓(initpos-1)(∘.=)⍳10 ⋄ s←(1@(⊂0 0))N N⍴0 ⋄ wins←0 0 ⋄ f 0
    (⊂p)(⊂s)
}

22. Gun

todo

23. Gun

todo

24. Gun

K←⎕.v>
s0←'w0' 'x0' 'y0' 'z0'
doop←{ ⍝ do op at left to state at right
    k←⊃⍺
    v←1↓⍺
    k=INP:v inp ⍵
    k=ADD:v add ⍵
    k=MUL:v mul ⍵
    k=DIV:v div ⍵
    k=EQL:v eql ⍵
    k=MOD:v mod ⍵
    ⎕←'unknown op: ',k
    ⍵ ⍝noop
}
pt1←{doop/(⌽⊃,/8↑digiops),⊂s0}
pt2←{inpi←0 ⋄ ↑{⊃doop/(⌽⊃,/⍵⌷digiops),⊂'w0' 'x0' 'y0' 'z0'}¨⍳14}

⍝ the above didn't actually help solve the problem, but they explained the state of it.

P←(12 1 1)  (13 1 9)  (12 1 11)  (¯13 26 6)  (11 1 6)  (15 1 13)  (¯14 26 13)  (12 1 5)  (¯8 26 7)  (14 1 2)  (¯9 26 10)  (¯11 26 14)  (¯6 26 7)  (¯5 26 1)
itr←{
    i z←⍵
    a b c←i⊃P
    d←i⊃⍺
    k←d≠a+26|z
    0≠b∧k:1
    k=0:(i+1)z÷b
    (i+1)c+d+26×z÷b
}
soln←{{0=⊃(⊖⍵)(itr⍣14)0 0:⍵ ⋄ ∇ dc ⍵}14⍴9}

yazdigim kod aslinda problemin cozumu olmadi. Problemin cozumunu bu kod bloklarinin ciktisina bakarak kagit ve kalem ile yaptim. 26 tabanindaki sayilar icin bir deste hissiyati veren islemler yaptigimiz ortaya cikti.

25. Gun

K←⎕.v>
plt←{K∘(⌷⍨)¨⍵}
upd←{(mvS FF)(mvE FF)⍵}
mvS←{
    n _ s _ c←⍵[I]
    (c s)≡S O:O
    (n c)≡S O:S
    c
}
mvE←{
    _ e _ w c←⍵[I]
    (c e)≡E O:O
    (w c)≡E O:E
    c
}
pt1←{
    K←'⋄.v>'
    F O S E←⍳4
    I←(0 1)(1 2)(2 1)(1 0)(1 1) ⍝ neighbour indexes
    plt←{K∘(⌷⍨)¨⍵}
    X←dat←↑K∘⍳¨⊃⎕NGET'tmp.txt' 1
    ⍝⎕←plt¨{(upd⍣⍵)X}¨⍳⍵
    1↓({x n←⍵ ⋄ x_←(upd⊃⍵) ⋄ x_(n+1)}⍣{(⊃⍺)≡(⊃⍵)})(X 0)
}

ve son…​