Balanced ternary: Difference between revisions

(Rename Perl 6 -> Raku, alphabetize, minor clean-up)
Line 3,172:
a * (b - c) -262023
</pre>
 
=={{header|Lua}}==
{{trans|C}}
<lang lua>function to_bt(n)
local d = { '0', '+', '-' }
local v = { 0, 1, -1 }
 
local b = ""
 
while n ~= 0 do
local r = n % 3
if r < 0 then
r = r + 3
end
 
b = b .. d[r + 1]
 
n = n - v[r + 1]
n = math.floor(n / 3)
end
 
return b:reverse()
end
 
function from_bt(s)
local n = 0
 
for i=1,s:len() do
local c = s:sub(i,i)
n = n * 3
if c == '+' then
n = n + 1
elseif c == '-' then
n = n - 1
end
end
 
return n
end
 
function last_char(s)
return s:sub(-1,-1)
end
 
function add(b1,b2)
local out = "oops"
if b1 ~= "" and b2 ~= "" then
local d = ""
 
local L1 = last_char(b1)
local c1 = b1:sub(1,-2)
local L2 = last_char(b2)
local c2 = b2:sub(1,-2)
if L2 < L1 then
L2, L1 = L1, L2
end
 
if L1 == '-' then
if L2 == '0' then
d = "-"
end
if L2 == '-' then
d = "+-"
end
elseif L1 == '+' then
if L2 == '0' then
d = "+"
elseif L2 == '-' then
d = "0"
elseif L2 == '+' then
d = "-+"
end
elseif L1 == '0' then
if L2 == '0' then
d = "0"
end
end
 
local ob1 = add(c1,d:sub(2,2))
local ob2 = add(ob1,c2)
 
out = ob2 .. d:sub(1,1)
elseif b1 ~= "" then
out = b1
elseif b2 ~= "" then
out = b2
else
out = ""
end
 
return out
end
 
function unary_minus(b)
local out = ""
 
for i=1, b:len() do
local c = b:sub(i,i)
if c == '-' then
out = out .. '+'
elseif c == '+' then
out = out .. '-'
else
out = out .. c
end
end
 
return out
end
 
function subtract(b1,b2)
return add(b1, unary_minus(b2))
end
 
function mult(b1,b2)
local r = "0"
local c1 = b1
local c2 = b2:reverse()
 
for i=1,c2:len() do
local c = c2:sub(i,i)
if c == '+' then
r = add(r, c1)
elseif c == '-' then
r = subtract(r, c1)
end
c1 = c1 .. '0'
end
 
while r:sub(1,1) == '0' do
r = r:sub(2)
end
 
return r
end
 
function main()
local a = "+-0++0+"
local b = to_bt(-436)
local c = "+-++-"
local d = mult(a, subtract(b, c))
 
print(string.format(" a: %14s %10d", a, from_bt(a)))
print(string.format(" b: %14s %10d", b, from_bt(b)))
print(string.format(" c: %14s %10d", c, from_bt(c)))
print(string.format("a*(b-c): %14s %10d", d, from_bt(d)))
end
 
main()</lang>
{{out}}
<pre> a: +-0++0+ 523
b: -++-0-- -436
c: +-++- 65
a*(b-c): ----0+--0++0 -262023</pre>
 
=={{header|Mathematica}} / {{header|Wolfram Language}}==
1,452

edits