#!/usr/bin/ruby # ## http://rosettacode.org/wiki/Negative_base_numbers # func EncodeNegBase(Num n, Num b { .~~ (-36 .. -2) }) { var out = [] var r = 0 while (n) { (n, r) = divmod(n, b) if (r < 0) { n += 1 r -= b } out << r.base(-b) } return (out.join.flip || 0) } func DecodeNegBase(Str s, Num b { .~~ (-36 .. -2) }) { var total = 0 for i,c in (s.flip.chars.pairs) { total += (Num(c, -b) * b**i) } return total } say (" 10 in base -2: ", EncodeNegBase(10, -2)) say ("146 in base -3: ", EncodeNegBase(146, -3)) say (" 15 in base -10: ", EncodeNegBase(15, -10)) say '-'*25 say ("11110 from base -2: ", DecodeNegBase("11110", -2)) say ("21102 from base -3: ", DecodeNegBase("21102", -3)) say (" 195 from base -10: ", DecodeNegBase("195", -10)) say '-'*25 say ("25334424 in base -31: ", EncodeNegBase(25334424, -31)) say ("sidef from base -31: ", DecodeNegBase("sidef", -31)) assert_eq(EncodeNegBase(25334424, -31), "sidef") assert_eq(DecodeNegBase("sidef", -31), 25334424)