Rice coding

func rice(k, arr) {
    var t = 2**k
    arr.map {|v|
        ['1' * (v >> k), '0', '%0*s' % (k, as_bin(v % t))].join
    }.join
}

func derice(k, str) {
    gather {
        var re = Regex('\G(1*)0(.{' + Str(k) + '})', 'g')
        while (str =~ re) {|m|
            take((m[0].len << k) + Num(m[1], 2))
        }
    }
}

for k in (2 .. 6) {
    say "\nk = #{k}\n"
    var input = @(0..17).shuffle
    var enc = rice(k, input)
    var dec = derice(k, enc)
    say "  input: #{input}"
    say "   rice: #{enc}"
    say "decoded: #{dec}"
    assert_eq(dec, input)
}

Output:

k = 2

  input: [5, 6, 15, 17, 3, 9, 4, 10, 12, 2, 11, 0, 1, 13, 7, 16, 8, 14]
   rice: 10011010111011111100101111001100011010111000010110110000011110011011111100011000111010
decoded: [5, 6, 15, 17, 3, 9, 4, 10, 12, 2, 11, 0, 1, 13, 7, 16, 8, 14]

k = 3

  input: [11, 14, 16, 4, 0, 5, 12, 13, 17, 3, 6, 10, 15, 2, 9, 7, 8, 1]
   rice: 100111011011000001000000010110100101011100010011011010010101110010100010111100000001
decoded: [11, 14, 16, 4, 0, 5, 12, 13, 17, 3, 6, 10, 15, 2, 9, 7, 8, 1]

k = 4

  input: [6, 4, 2, 9, 0, 5, 1, 3, 17, 15, 10, 11, 16, 13, 8, 14, 7, 12]
   rice: 00110001000001001001000000010100001000111000010111101010010111000000110101000011100011101100
decoded: [6, 4, 2, 9, 0, 5, 1, 3, 17, 15, 10, 11, 16, 13, 8, 14, 7, 12]

k = 5

  input: [17, 11, 14, 15, 4, 10, 12, 8, 16, 5, 6, 13, 3, 7, 1, 9, 2, 0]
   rice: 010001001011001110001111000100001010001100001000010000000101000110001101000011000111000001001001000010000000
decoded: [17, 11, 14, 15, 4, 10, 12, 8, 16, 5, 6, 13, 3, 7, 1, 9, 2, 0]

k = 6

  input: [2, 3, 14, 1, 7, 11, 17, 9, 16, 8, 13, 15, 6, 10, 12, 5, 4, 0]
   rice: 000001000000110001110000000100001110001011001000100010010010000000100000011010001111000011000010100001100000010100001000000000
decoded: [2, 3, 14, 1, 7, 11, 17, 9, 16, 8, 13, 15, 6, 10, 12, 5, 4, 0]

Last updated