⍝ Generic tree traversal: {}'t.r' 't.a' 't.v'⎕ns¨⊂'' ⍝ make some spaces. subs ← {⍵.(1↓⍎¨'0',↓⎕nl 9)} ⍝ sub-namespaces for space ⍵. accm ← {⍺+1} ⍝ counting namespaces. 0 accm trav subs t ⍝ number of spaces. 4 accm ← , ⍝ accumulating into a vector. vec ← ⍬ accm trav subs t ⍝ vector of spaces. vec ≡ t t.a t.r t.v ⍝ check match. 1 subs ← {⍵.(1↓⍎¨'0',↓⎕nl 9)~⍺} ⍝ sub-namespaces with cycle-buster. t.a.t ← t ⍝ introduce cycle: t → t.a → t.a.t → t vec ≡ ⍬ accm trav subs t ⍝ cycle ignored. 1 ⍝ A nested array may be ┌─┴─┐ ⍝ considered a tree with (1 2)(3 4) ←→ ┌┴┐ ┌┴┐ ⍝ depth-0 items as leaves: 1 2 3 4 subs ← {(0≠≡⍵)/⍵} ⍝ sub-items of array ⍵. accm ← {⍺+1} ⍝ counting nodes. 0 accm trav subs (1 2)(3 4) ⍝ node-count 7 accm ← {⍺,(0=≡⍵)/⍵} ⍝ accumulating simple scalars ⍬ accm trav subs 'ab'('cd' 'e') ⍝ enlist abcde ⍝ simpler coding if accumulator is on the right: vart←{ ⍝ commuted version of trav, ⊃∇/(⍵⍵ ⍺),⊂⍺ ⍺⍺ ⍵ ⍝ ... give simpler coding. } accm←{⍵,⍨(0=≡⍺)/⍺} ⍝ accumulating simple scalars 'ab'('cd' 'e')accm vart subs ⍬ ⍝ enlist abcde gcd ← ⊢ trav {|⍵-⍺~0} ⍝ Euclid's GCD. (2×3×5) gcd (5×7×11) ⍝ cf: 30∨385 5 osc ← {(⍵≠1)/(2|⍵)+⍵×0.5+2.5×2|⍵} ⍝ next term in osc fn. ⍬ , trav osc 11 ⍝ osc sequence 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 0 {⍺+⍵=1} trav {(⍵-1 2)~¯1 ¯2} ¨ 0 to 10 ⍝ fibonacci sequence 0 1 1 2 3 5 8 13 21 34 55 bftrav←{ ⍝ Generic breadth-first tree traversal. ⍺ ⍺⍺{ 0=⍴⍵:⍺ (⍺ ⍺⍺⊃⍵)∇(1↓⍵),(⍺ ⍵⍵⊃⍵) }⍵⍵,⊂⍵ } subs ← {⍵.(1↓⍎¨'0',↓⎕nl 9)} ⍝ sub-namespaces for space ⍵. ⎕ex't' ⍝ remove old tree. {} 't.r.r' 't.a.a' 't.v.v' ⎕ns¨ ⊂'' ⍝ create new tree. vec ← t t.a t.r t.v t.a.a t.r.r t.v.v ⍝ vector of spaces in vec ≡ ⍬ ,bftrav subs t ⍝ ... breadth-first order. 1 ⍝ N-queens problem: accm ← {⍺,(⍺⍺=⍴⍵)/⊂⍵} ⍝ accumulated leaves. subs←{⎕io←1 ⍝ possible placements \|/\ | \/| / dd←⌽⍳⍴⍵ ⍝ diagonal ⍟ \ | /\|/ ak←(⍵-dd),⍵,(⍵+dd) ⍝ attacked cols in next row : \|/ ⍟ ⍵∘,¨(⍳⍺⍺)~ak ⍝ subnodes ⍟ } ⍬(4 accm)trav(4 subs)⍬ ⍝ 4-queens solutions vector. ┌───────┬───────┐ │2 4 1 3│3 1 4 2│ └───────┴───────┘ ⍝∇ trav osc to Back to: code Back to: Workspaces