147 lines
2.7 KiB
Lua
147 lines
2.7 KiB
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()
|