procedure main(A) every writes(s := !A, " -> [") do { every writes(!(enc := encode(&lcase,s))," ") writes("] -> ",s2 := decode(&lcase,enc)) write((s == s2, " (Correct)") | " (Incorrect)") } end procedure encode(m,s) enc := [] every c := !s do { m ?:= reorder(tab(i := upto(c)),move(1),tab(0)) put(enc,i-1) # Strings are 1-based } return enc end procedure decode(m,enc) dec := "" every i := 1 + !enc do { # Lists are 1-based dec ||:= m[i] m ?:= reorder(tab(i),move(1),tab(0)) } return dec end procedure reorder(s1,s2,s3) return s2||s1||s3 end