38 lines
925 B
Text
38 lines
925 B
Text
NB. articulate definition
|
|
NB. local names (assignment =.) won't pollute the namespace
|
|
|
|
3 :0'define Burrows-Wheeler transformations'
|
|
Dyad=. [: :
|
|
Monad=. :[:
|
|
index=. i. Dyad
|
|
Rank=. "
|
|
sort=. /:~ Monad
|
|
|
|
signal_error=. 13!:8
|
|
VALUE_ERROR=. 21
|
|
'STX ETX'=. 2 3 { a.
|
|
verify=. ([ ('STX or ETX invalid in input' signal_error VALUE_ERROR + 0:))^:(1 e. (STX , ETX)&e.)
|
|
rotations=. |."0 1~ -@:i.@:#
|
|
tail=. {:
|
|
mark=. STX , ,&ETX
|
|
transform=. tail Rank 1 @: sort @: rotations @: mark @: verify
|
|
EXPECT=. ETX , 'ANNB' , STX , 'AA'
|
|
assert. EXPECT -: transform 'BANANA'
|
|
|
|
unscramble=. (,Rank 0 1 sort)^:(#@[)&(i.0)
|
|
find=. ETX index~ tail Rank 1
|
|
from=. {
|
|
behead=. }.
|
|
curtail=. }:
|
|
erase_mark =. behead @: curtail
|
|
restore=. erase_mark @: (from~ find) @: unscramble
|
|
assert. 'BANANA' -: restore EXPECT
|
|
|
|
obverse=. :.
|
|
fixed=. f.
|
|
bwt=: transform obverse restore fixed
|
|
|
|
assert (-: ]&.:bwt)'same under transformation'
|
|
|
|
EMPTY
|
|
)
|