packX←{                           ⍝ TeXt packer.

    ⎕IO←0                         ⍝ environment

    cmp←{                         ⍝ packer
        u←∪,⍵                     ⍝ unique items, odd or even
        p←↓{((⌈0.5×⍴⍵),2)⍴⍵},⍵    ⍝ divide into pairs
        j←,u∘.,u                  ⍝ unique couples
        b←j∊p ⋄ g←b/j             ⍝ take only the needed pairs
        i←g⍳p                     ⍝ indices
        w←⌈2⍟⍴g                   ⍝ bit width
        q←0∨b,,(w⍴2)⊤i            ⍝ bits to bitvec
        u((⍴⍴⍵),⍴⍵)q              ⍝ return uniques, shape, bits
    }

    unc←{                         ⍝ unpack
        (u d a)←⍵                 ⍝ handle arg
        s←0⊃d ⋄ r←s⍴1↓d           ⍝ shape
        j←,u∘.,u                  ⍝ unique pairs..
        p←((⍴j)↑a)/j              ⍝ ..used couples
        q←(⍴j)↓a                  ⍝ indices
        w←⌈2⍟⍴p                   ⍝ bitwidth
        i←2⊥w{(⍺,⌊(⍴⍵)÷⍺)⍴⍵}q     ⍝ calc indices
        r⍴∊p[i]                   ⍝ return array
    }

    ⍺←1 ⋄ ⍺=1:cmp ⍵ ⋄ unc ⍵       ⍝ pack/unpack
}

code_colours

test script

Back to: notes

Back to: Workspaces