program gray_code; loop for n in [0..31] do print( lpad(str n, 2) + ": " + lpad(bits n, 5) + " => " + lpad(bits(g := gray_encode(n)), 5) + " => " + lpad(bits(d := gray_decode(g)), 5) + ": " + lpad(str d, 2) ); end loop; proc gray_encode(n); return n bit_xor (n div 2); end proc; proc gray_decode(n); loop init r := 0; step n div:= 2; until n=0 do r bit_xor:= n; end loop; return r; end proc; op bits(n); b := '' +/ [[str (n mod 2), n div:=2](1) : until n=0]; return reverse(b); end op; end program;