Prep←".#"⊸⊐∘>
-# Propose moving north if possible.
-ProposeN←{ ((1≠+´⥊𝕩)∧(0=+´⊏𝕩))/⟨[0‿1‿0,0‿0‿0,0‿0‿0]⟩ }
+self←[0‿0‿0,0‿1‿0,0‿0‿0]
+near←[1‿1‿1,1‿0‿1,1‿1‿1]
+n ←[1‿1‿1,0‿0‿0,0‿0‿0]
+s ←[0‿0‿0,0‿0‿0,1‿1‿1]
+e ←[0‿0‿1,0‿0‿1,0‿0‿1]
+w ←[1‿0‿0,1‿0‿0,1‿0‿0]
+Any←{∨´⥊𝕨∧𝕩}
-Propose←{𝕊in: # Given a map of local area, say where Elf in centre will go.
- ⊑ (∾{𝕏⁼¨ ProposeN 𝕏 in}¨{⌽∘⍉⍟𝕩}¨⟨0,2,3,1⟩) ∾ ⟨[0‿0‿0,0‿1‿0,0‿0‿0]⟩
-}
+ProposeN←(Any⟜self)∧(Any⟜near)∧(¬Any⟜n)
+ProposeS←(Any⟜self)∧(Any⟜near)∧(Any⟜n)∧(¬Any⟜s)
+ProposeE←(Any⟜self)∧(Any⟜near)∧(Any⟜n)∧(Any⟜s)∧(¬Any⟜e)
+ProposeW←(Any⟜self)∧(Any⟜near)∧(Any⟜n)∧(Any⟜s)∧(Any⟜e)∧(¬Any⟜w)
+Propose0←(Any⟜self)∧(¬Any⟜near)∨(Any⟜n)∧(Any⟜s)∧(Any⟜e)∧(Any⟜w)
-# Same but propose empty array if there is no Elf.
-ProposeOr←{ (⟨1,1⟩⊑𝕩)∧Propose 𝕩 }
+Pad←{ »˘»(2+≢𝕩)↑𝕩 }
Round←{𝕊map:
- •Show map
- ⟨h,w⟩←≢map ⋄ map↩»˘»(2+w)↑˘(2+h)↑map # Pad the map so windows work.
- ⟨2,3,0,1⟩⍉ProposeOr⎉2⟨3,3⟩↕map
+ map Pad↩
+ proposers←⟨propose_n, propose_s, propose_e, propose_w, propose_0⟩
+ shifts←⟨«,»,»˘,«˘,⊢⟩ ⋄ unshifts←⟨»,«,«˘,»˘,⊢⟩
+ proposals←{ Pad 𝕏⎉2⟨3,3⟩↕map }¨proposers
+ collisions← 1<+´⥊ shifts { 𝕎 𝕩 }¨ proposals
+ stay← unshifts { 𝕩∧ 𝕎 collisions }¨ proposals
+ (∨´stay)∨(∨´ shifts { 𝕎 𝕩 }¨ proposals∧¬stay)
}
Main←Round⍟1