Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
146
Task/Balanced-ternary/Lua/balanced-ternary.lua
Normal file
146
Task/Balanced-ternary/Lua/balanced-ternary.lua
Normal file
|
|
@ -0,0 +1,146 @@
|
|||
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()
|
||||
Loading…
Add table
Add a link
Reference in a new issue