⍝ Expand/compress HT chars:
text←'whistles far and wee'
ht←⎕ucs 9 ⍝ horizontal tab.
st ← ht '→'∘subs ⍝ show tab chars as →.
st ¯8 xtabs text ⍝ 8-tabs for multiple blanks.
whistles→far→and wee
st ¯4 xtabs text ⍝ 4-tabs for multiple blanks.
whistles→→far→→and→wee
4 xtabs ¯4 xtabs text ⍝ 4-tabs round trip.
whistles far and wee
trip ← {⍵≡⍺ xtabs(-⍺)xtabs ⍵} ⍝ check round trip for tabs ⍺, text ⍵.
trips ← {∧/(0,⍳1+⍴⍵)trip¨⊂⍵} ⍝ round trips for all ⍺∊0..1+⍴⍵.
trips text ⍝ check round-trips for all tabs ⍺.
1
trips ,(6 35⍴↑,/(⍳20)↑¨'⎕'),⊃⌽⎕tc ⍝ text with embedded linefeeds.
1
4 trip scripts.xtabs ⍝ round-trip this script.
1
(2/ht' ')≡¯4 xtabs 10↑'' ⍝ all-blanks case works correctly.
1
∧/trips¨1↓,\10↑'' ⍝ round-trip all-blank cases.
1
⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ test various codings of runs:
ones ← 0 1 1 1 0 1 0 1 1 0
runs ← {s←+\⍵ ⋄ s-⌈\s×~⍵} ⍝ runs of adjacent 1s.
runs ones ⍝ runs of adjacent 1s.
0 1 2 3 0 1 0 1 2 0
runs ← {⍵{⍵-⌈\⍵×~⍺}+\⍵} ⍝ ditto, but with no local variable.
runs ones ⍝ runs of adjacent 1s.
0 1 2 3 0 1 0 1 2 0
⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝ test various codings of onoff:
⍝
⍝ onoff codings must decide two issues:
⍝
⍝ - whether to start in state ON or OFF and
⍝ - whether a clash of 1-bits results in ON or OFF or STAY or FLIP
⍝
⍝ where STAY means to remain in the current state (ignore concident bits),
⍝ and FLIP means to change state.
⍝
⍝ This gives rise to 8 permutations, labelled:
⍝
⍝ [00] start OFF, resolve clash to OFF
⍝ [01] ·· OFF ·· ·· ·· ·· ON
⍝ [0+] ·· OFF ·· ·· ·· ·· STAY
⍝ [0~] ·· OFF ·· ·· ·· ·· FLIP
⍝ [10] ·· ON ·· ·· ·· ·· OFF
⍝ [11] ·· ON ·· ·· ·· ·· ON
⍝ [1+] ·· ON ·· ·· ·· ·· STAY
⍝ [1~] ·· ON ·· ·· ·· ·· FLIP
⍝
⍝ .------------------------------ switch ON
⍝ | .---------------------------- switch ON while ON
⍝ | | .-------------------- switch ON
⍝ | | | .---------------- clash while ON
ons ← 0 1 1 0 0 0 1 0 1 0 0 0 1 0
offs ← 0 0 0 0 1 1 0 0 1 0 1 0 1 0
⍝ | | | '-------- clash while OFF
⍝ | | '------------ switch OFF
⍝ | '---------------------- switch OFF while OFF
⍝ '------------------------ switch OFF while ON
op←{↑⍺ ⍵,⊂⍺ ⍺⍺ ⍵} ⍝ arg rows followed by result
ons {1↓⊃,/∨\¨(1,⍵)⊂0,⍺}op offs ⍝ [01]
0 1 1 0 0 0 1 0 1 0 0 0 1 0
0 0 0 0 1 1 0 0 1 0 1 0 1 0
0 1 1 1 0 0 1 1 1 1 0 0 1 1
ons {1↓⊃,/∨\¨(1,⍵)⊂1,⍺}op offs ⍝ [11]
0 1 1 0 0 0 1 0 1 0 0 0 1 0
0 0 0 0 1 1 0 0 1 0 1 0 1 0
1 1 1 1 0 0 1 1 1 1 0 0 1 1
ons {1↓⊃,/∨\¨(1,⍵)⊂0,⍺}op offs ⍝ [01]
0 1 1 0 0 0 1 0 1 0 0 0 1 0
0 0 0 0 1 1 0 0 1 0 1 0 1 0
0 1 1 1 0 0 1 1 1 1 0 0 1 1
ons {1↓⊃,/∧\¨(1,⍺)⊂1,~⍵}op offs ⍝ [10]
0 1 1 0 0 0 1 0 1 0 0 0 1 0
0 0 0 0 1 1 0 0 1 0 1 0 1 0
1 1 1 1 0 0 1 1 0 0 0 0 0 0
ons {1↓⊃,/∧\¨(1,⍺)⊂0,~⍵}op offs ⍝ [00]
0 1 1 0 0 0 1 0 1 0 0 0 1 0
0 0 0 0 1 1 0 0 1 0 1 0 1 0
0 1 1 1 0 0 1 1 0 0 0 0 0 0
ons {n←⍺≠⍵ ⋄ ≠\n\2≠/¯1,n/⍺-⍵}op offs ⍝ [0+]
0 1 1 0 0 0 1 0 1 0 0 0 1 0
0 0 0 0 1 1 0 0 1 0 1 0 1 0
0 1 1 1 0 0 1 1 1 1 0 0 0 0
ons {(⍺≠⍵){≠\⍺\2≠/¯1,⍺/⍵}⍺-⍵}op offs ⍝ [0+]
0 1 1 0 0 0 1 0 1 0 0 0 1 0
0 0 0 0 1 1 0 0 1 0 1 0 1 0
0 1 1 1 0 0 1 1 1 1 0 0 0 0
⍝∇ xtabs subs to
Back to: code
Back to: Workspaces