RosettaCodeData/Task/Move-to-front-algorithm/BCPL/move-to-front-algorithm.bcpl
2026-04-30 12:34:36 -04:00

65 lines
1.2 KiB
Text

get "libhdr"
let indexof(ch, s) = valof
for i = 0 to s%0 do
if s%i = ch resultis i
let copy(sin, sout) be
for i = 0 to sin%0 do
sout%i := sin%i
let streq(a, b) = valof
$( for i = 0 to a%0 do
unless a%i = b%i resultis false
resultis true
$)
let movetofront(s, ch) be
$( let i = indexof(ch, s)
for j = i to 2 by -1 do
s%j := s%(j-1)
s%1 := ch
$)
let encode(s, alph, v) be
$( let a = vec 1+256/BYTESPERWORD
copy(alph, a)
for i = 1 to s%0
$( let c = indexof(s%i, a)
v!(i-1) := c-1
movetofront(a, s%i)
$)
$)
let decode(v, n, alph, s) be
$( let a = vec 1+256/BYTESPERWORD
copy(alph, a)
s%0 := n
for i = 0 to n-1
$( let c = a%(v!i+1)
s%(i+1) := c
movetofront(a, c)
$)
$)
let show(s) be
$( let enc = vec 256
let dec = vec 1+256/BYTESPERWORD
let alph = "abcdefghijklmnopqrstuvwxyz"
writes(s)
writes(" -> ")
encode(s, alph, enc)
for i = 0 to s%0-1 do writef("%N ", enc!i)
writes("-> ")
decode(enc, s%0, alph, dec)
writes(dec)
test streq(s, dec)
writes(" (ok)*N") or writes(" (fail)*N")
$)
let start() be
$( show("broood")
show("bananaaa")
show("hiphophiphop")
$)