⍝ Quad-tree packing: pack4 10 20 30/'abc' ┌───┬──┬──────────────────────┐ │abc│60│¯3 0 ¯2 0 ¯1 0 1 1 1 2│ └───┴──┴──────────────────────┘ 0 pack4 pack4 10 20 30/'abc' ⍝ round-trip aaaaaaaaaabbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccc chk←{⍵≡0 pack4 pack4 ⍵} ⍝ check round-trip chk 10 20/'ab' 1 chk¨ 99 (⊂'hello') ⍝ check scalar cases 1 1 chk (4/4)↑4 ⍝ check higher-rank array 1 chk ⎕a ⍝ worst case: no similar regions. 1 ∧/ chk¨ '' 'a' 'aa' 'ab' 'aab' 'abb' ⍝ edge cases. 1 chk{⍵⍴⍳×/⍵}5/3 ⍝ worst case: check default ⍺ is adequate. 1 chk 2 3 0 5 6 ⍴ 88 ⍝ check empty array 1 pack4{⍵≡0 ⍺⍺ 0 ⍺⍺¨ ⍺⍺¨ ⍺⍺ ⍵} 10 20/'ab' ⍝ pack of pack. 1 quads←{⌊/¨⌊((⍳⍺/⍵×⍵)-⎕io)÷⍵} ⍝ "quadrants" image 1 quads 4 ⍝ 1-quad 0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 2 quads 4 ⍝ 2-quad 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 pack4 2 quads 4 ⍝ pack of 2-quad ┌───────┬─────┬────────────────────────────────────────────┐ │0 1 2 3│16 16│¯3 0 ¯1 0 1 ¯1 0 1 ¯3 0 1 ¯1 0 1 ¯1 2 ¯1 2 3│ └───────┴─────┴────────────────────────────────────────────┘ cmp←{(⍴,⍵)(⍴¨pack4 ⍵)} ⍝ compare ravel-shape with pack shapes for: cmp 2 quads 4 ⍝ 2-quad ┌───┬────────┐ │256│┌─┬─┬──┐│ │ ││4│2│19││ │ │└─┴─┴──┘│ └───┴────────┘ {(⍴,⍵)(⍴¨pack4 ⍵)}3 quads 4 ⍝ 3-quad ┌────┬────────┐ │4096│┌─┬─┬──┐│ │ ││4│3│58││ │ │└─┴─┴──┘│ └────┴────────┘ {(⍴,⍵)(⍴¨pack4 ⍵)}4 quads 4 ⍝ 4-quad ┌─────┬─────────┐ │65536│┌─┬─┬───┐│ │ ││4│4│179││ │ │└─┴─┴───┘│ └─────┴─────────┘ image←⌈0.5×∘.⌊⍨⍳8 image 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 2 2 2 2 2 2 1 1 2 2 3 3 3 3 1 1 2 2 3 3 3 3 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4 ⍕,[⍬]disp¨{⍵ pack4 image}¨1 to 5 ⍝ decreasing resolution. ┌───────┬───┬────────────────────────────────────────────┐ │1 2 3 4│8 8│¯3 0 ¯1 0 1 ¯1 0 1 ¯3 0 1 ¯1 0 1 ¯1 2 ¯1 2 3│ └───────┴───┴────────────────────────────────────────────┘ ┌───────┬───┬───────────┐ │1 2 3 4│8 8│¯1 0 ¯1 0 2│ └───────┴───┴───────────┘ ┌───────┬───┬───────────┐ │1 2 3 4│8 8│¯1 0 ¯1 0 2│ └───────┴───┴───────────┘ ┌───────┬───┬─┐ │1 2 3 4│8 8│0│ └───────┴───┴─┘ ┌───────┬───┬─┐ │1 2 3 4│8 8│0│ └───────┴───┴─┘ {0 pack4 ⍵ pack4 image}¨1 to 5 ⍝ decreasing resolution ┌───────────────┬───────────────┬───────────────┬───────────────┬───────────────┐ │1 1 1 1 1 1 1 1│1 1 1 1 1 1 1 1│1 1 1 1 1 1 1 1│1 1 1 1 1 1 1 1│1 1 1 1 1 1 1 1│ │1 1 1 1 1 1 1 1│1 1 1 1 1 1 1 1│1 1 1 1 1 1 1 1│1 1 1 1 1 1 1 1│1 1 1 1 1 1 1 1│ │1 1 2 2 2 2 2 2│1 1 1 1 1 1 1 1│1 1 1 1 1 1 1 1│1 1 1 1 1 1 1 1│1 1 1 1 1 1 1 1│ │1 1 2 2 2 2 2 2│1 1 1 1 1 1 1 1│1 1 1 1 1 1 1 1│1 1 1 1 1 1 1 1│1 1 1 1 1 1 1 1│ │1 1 2 2 3 3 3 3│1 1 1 1 3 3 3 3│1 1 1 1 3 3 3 3│1 1 1 1 1 1 1 1│1 1 1 1 1 1 1 1│ │1 1 2 2 3 3 3 3│1 1 1 1 3 3 3 3│1 1 1 1 3 3 3 3│1 1 1 1 1 1 1 1│1 1 1 1 1 1 1 1│ │1 1 2 2 3 3 4 4│1 1 1 1 3 3 3 3│1 1 1 1 3 3 3 3│1 1 1 1 1 1 1 1│1 1 1 1 1 1 1 1│ │1 1 2 2 3 3 4 4│1 1 1 1 3 3 3 3│1 1 1 1 3 3 3 3│1 1 1 1 1 1 1 1│1 1 1 1 1 1 1 1│ └───────────────┴───────────────┴───────────────┴───────────────┴───────────────┘ ⍝∇ pack4 to Back to: code Back to: Workspaces