where
. toGray base
. toBase base (logB base x)
toBase base = toBase'
where
toBase' len 0 = replicate len 0
toBase' len x = toBase' (len - 1) (x `div` base) ++ [x `mod` base]
toGray :: Int -> [Int] -> [Int]
toGray base = toGray' 0
where
toGray' :: Int -> [Int] -> [Int]
toGray' _ [] = []
toGray' shift (x:xs) = (x + shift) `mod` base : toGray' (shift + base - x) xs
bWFpbiA6OiBJTyAoKQptYWluID0gaW50ZXJhY3QKICAgICAkIChcKGJhc2U6eHMpIC0+IGNvbmNhdE1hcCAoYWxsR3JheXMgKHJlYWQgYmFzZSkgLiByZWFkKSB4cykKICAgICAuIGxpbmVzCgphbGxHcmF5cyA6OiBJbnQgLT4gSW50IC0+IFN0cmluZwphbGxHcmF5cyBiYXNlIHggPSB1bmxpbmVzICQgbWFwIGVhY2hHcmF5IFswLi54LTFdCiAgd2hlcmUKICAgIGVhY2hHcmF5ID0gY29uY2F0TWFwIHNob3cKICAgICAgICAgICAgIC4gdG9HcmF5IGJhc2UKICAgICAgICAgICAgIC4gdG9CYXNlIGJhc2UgKGxvZ0IgYmFzZSB4KQoKbG9nQiA6OiBJbnQgLT4gSW50IC0+IEludApsb2dCIGJhc2UgPSBjZWlsaW5nIC4gbG9nQmFzZSAoZnJvbUludGVncmFsIGJhc2UpIC4gZnJvbUludGVncmFsCgp0b0Jhc2UgOjogSW50IC0+IEludCAtPiBJbnQgLT4gW0ludF0KdG9CYXNlIGJhc2UgPSB0b0Jhc2UnCiAgd2hlcmUKICAgIHRvQmFzZScgOjogSW50IC0+IEludCAtPiBbSW50XQogICAgdG9CYXNlJyBsZW4gMCA9IHJlcGxpY2F0ZSBsZW4gMAogICAgdG9CYXNlJyBsZW4geCA9IHRvQmFzZScgKGxlbiAtIDEpICh4IGBkaXZgIGJhc2UpICsrIFt4IGBtb2RgIGJhc2VdCgp0b0dyYXkgOjogSW50IC0+IFtJbnRdIC0+IFtJbnRdCnRvR3JheSBiYXNlID0gdG9HcmF5JyAwCiAgd2hlcmUKICAgIHRvR3JheScgOjogSW50IC0+IFtJbnRdIC0+IFtJbnRdCiAgICB0b0dyYXknIF8gICAgIFtdICAgICA9IFtdCiAgICB0b0dyYXknIHNoaWZ0ICh4OnhzKSA9ICh4ICsgc2hpZnQpIGBtb2RgIGJhc2UgOiB0b0dyYXknIChzaGlmdCArIGJhc2UgLSB4KSB4cw==