⍝ Pack the (simple) array in one binary vector:
packD'mississippi'
0 0 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 1 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 1 0 1 1 0 1 0
{⍵≡0 packD 1 packD ⍵}'Full Circle'
1
crypt←{
⍝| ⍺: character set (64 elements!)
⍝| ⍺⍺: 0 = decrypt, 1 = crypt
⍝| ⍵⍵: key (positive integer)
⍝| ⍵: text
⍺←⎕D,⎕A,'+-',lcase ⎕A ⍝ default character set.
⎕IO←0 ⋄ set←⍺ ⍝ works nicer in zero origin.
key←{((⌊2⍟⍵+1)⍴2)⊤⍵}⍵⍵ ⍝ binarise key.
cry←{ ⍝ encryption:
b←{(6×⌈(⍴⍵)÷6)↑⍵,6⍴1}packD ⍵ ⍝ pack, pad with 1's if needed.
c←b≠(⍴b)⍴key ⍝ poor man's xor encryption.
set[2⊥(6,(⍴c)÷6)⍴c] ⍝ result is gibberish.
}
yrc←{ ⍝ decryption:
c←,(6⍴2)⊤set⍳⍵ ⍝ encode indices.
0 packD{(-+/∧\⌽⍵)↓⍵}c≠(⍴c)⍴key ⍝ de-xor, unpack (n.b. remove last 1's)
}
0::⍵ ⋄ ⍺⍺=1:cry ⍵ ⋄ yrc ⍵
}
crypted←(1 crypt 313)'mississippi'
crypted
5Na1n4ia1qmLJK
'mississippi'≡(0 crypt 313)crypted
1
chk←{
⍵≡0 ⍺⍺ ⍺⍺ ⍵:'ok'
' Error: compression round-trip fails'
}
packD chk ⎕fmt notes.Marilyn ⍝ simple text matrix
ok
⍝∇ packD lcase notes.Marilyn
Back to: code
Back to: Workspaces