--- /dev/null
+Split←{
+ blocknums ← +`𝕨
+ # Set entries in blocknums to -1 when they correspond with delimiters.
+ blocknums ↩ (¯1¨)⌾(𝕨⊸/) blocknums
+ blocknums⊔𝕩
+}
+
+Prep1Proc←{ # Prepare one step of procedure
+ # Converts "move 3 from 1 to 3" into [⟨1,3⟩,⟨1,3⟩,⟨1,3⟩].
+ •ParseFloat¨⟨1,3,5⟩⊏(' '=𝕩)Split𝕩
+}
+
+Prep←{
+ ⟨rawmap, rawproc⟩←(""⊸≡¨𝕩)Split𝕩
+ map0←⍉>¯1↓rawmap # Drop last line and transpose
+ map1←(1=4|↕≠map0)/map0 # Extract crate letters from chaff
+ map←⟨""⟩∾{(𝕩≠' ')/𝕩}¨<˘map1 # Convert to a 0-based list of strings
+ proc←>Prep1Proc¨rawproc
+ ⟨map, proc⟩
+}
+
+ExecuteMove←{⟨n,from,to⟩𝕊stacks:
+ crates←n↑from⊑stacks
+ stacks (n⊸↓)⌾(from⊸⊑) ↩
+ stacks (crates⊸∾)⌾(to⊸⊑) ↩
+ stacks
+}
+
+Main←{𝕊⟨map,proc⟩:
+ ⊑¨1↓ map ExecuteMove˝⌽proc
+}
+
+•Show Main Prep •file.Lines ⊑•args