Balanced ternary: Difference between revisions

Content added Content deleted
m (Automated syntax highlighting fixup (second round - minor fixes))
(→‎{{header|11l}}: Static type variables and static methods are supported now)
Line 33: Line 33:
R a I/ b
R a I/ b
R (a - b + 1) I/ b
R (a - b + 1) I/ b

F BalancedTernary_int2ternary(n)
I n == 0
R [Int]()
V n3 = ((n % 3) + 3) % 3
I n3 == 0 {R [0] [+] BalancedTernary_int2ternary(py_idiv(n, 3))}
I n3 == 1 {R [1] [+] BalancedTernary_int2ternary(py_idiv(n, 3))}
I n3 == 2 {R [-1] [+] BalancedTernary_int2ternary(py_idiv((n + 1), 3))}
X RuntimeError(‘’)

F BalancedTernary_neg(digs)
R digs.map(d -> -d)

V table = [(0, -1), (1, -1), (-1, 0), (0, 0), (1, 0), (-1, 1), (0, 1)]

F BalancedTernary_add(a, b, =c = 0)
I !(!a.empty & !b.empty)
I c == 0
R I !a.empty {a} E b
E
R BalancedTernary_add([c], I !a.empty {a} E b)
E
(V d, c) = :table[3 + (I !a.empty {a[0]} E 0) + (I !b.empty {b[0]} E 0) + c]
V res = BalancedTernary_add(a[1..], b[1..], c)
I !res.empty | d != 0
R [d] [+] res
E
R res

V BalancedTernary_str2dig = [‘+’ = 1, ‘-’ = -1, ‘0’ = 0]
V BalancedTernary_dig2str = [1 = ‘+’, -1 = ‘-’, 0 = ‘0’]


T BalancedTernary
T BalancedTernary
:str2dig = [‘+’ = 1, ‘-’ = -1, ‘0’ = 0]
:dig2str = [1 = ‘+’, -1 = ‘-’, 0 = ‘0’]
:table = [(0, -1), (1, -1), (-1, 0), (0, 0), (1, 0), (-1, 1), (0, 1)]

[Int] digits
[Int] digits


Line 73: Line 46:
E
E
X ValueError(‘BalancedTernary: Wrong input digits.’)
X ValueError(‘BalancedTernary: Wrong input digits.’)

F :int2ternary(n)
I n == 0
R [Int]()
V n3 = ((n % 3) + 3) % 3
I n3 == 0 {R [0] [+] .:int2ternary(py_idiv(n, 3))}
I n3 == 1 {R [1] [+] .:int2ternary(py_idiv(n, 3))}
I n3 == 2 {R [-1] [+] .:int2ternary(py_idiv((n + 1), 3))}
X RuntimeError(‘’)


F to_int()
F to_int()
Line 80: Line 62:
I .digits.empty
I .digits.empty
R ‘0’
R ‘0’
R reversed(.digits).map(d -> BalancedTernary_dig2str[d]).join(‘’)
R reversed(.digits).map(d -> .:dig2str[d]).join(‘’)

F :neg(digs)
R digs.map(d -> -d)

F -()
R BalancedTernary(.:neg(.digits))

F :add(a, b, =c = 0)
I !(!a.empty & !b.empty)
I c == 0
R I !a.empty {a} E b
E
R .:add([c], I !a.empty {a} E b)
E
(V d, c) = .:table[3 + (I !a.empty {a[0]} E 0) + (I !b.empty {b[0]} E 0) + c]
V res = .:add(a[1..], b[1..], c)
I !res.empty | d != 0
R [d] [+] res
E
R res


F +(b)
F +(b)
R BalancedTernary(BalancedTernary_add(.digits, b.digits))
R BalancedTernary(.:add(.digits, b.digits))


F -(b)
F -(b)
R (.) + BalancedTernary(BalancedTernary_neg(b.digits))
R (.) + (-b)


F *(b)
F *(b)
Line 94: Line 96:
E
E
[Int] x
[Int] x
I a[0] == -1 {x = BalancedTernary_neg(b)}
I a[0] == -1 {x = .:neg(b)}
E I a[0] == 0 {}
E I a[0] == 0 {}
E I a[0] == 1 {x = b}
E I a[0] == 1 {x = b}
Line 100: Line 102:
assert(0B)
assert(0B)
V y = [0] [+] @_mul(a[1..], b)
V y = [0] [+] @_mul(a[1..], b)
R BalancedTernary_add(x, y)
R .:add(x, y)


R BalancedTernary(_mul(.digits, b.digits))
R BalancedTernary(_mul(.digits, b.digits))


F createBalancedTernaryFromStr(inp)
F createBalancedTernaryFromStr(inp)
R BalancedTernary(reversed(inp).map(c -> BalancedTernary_str2dig[c]))
R BalancedTernary(reversed(inp).map(c -> BalancedTernary.:str2dig[c]))
F createBalancedTernaryFromInt(inp)
F createBalancedTernaryFromInt(inp)
R BalancedTernary(BalancedTernary_int2ternary(inp))
R BalancedTernary(BalancedTernary.int2ternary(inp))


V a = createBalancedTernaryFromStr(‘+-0++0+’)
V a = createBalancedTernaryFromStr(‘+-0++0+’)