说明
这就是说,做5 + 6,你写56+
,意思是:
56+
5 push 5 into stack
6 push 6 into stack
+ pop the first two items in the stack and add them up, and push the result into stack
(to those of you who do not know stacks, "push" just means add and "pop" just means take off)
但是,正如您所知,我们无法将数字56
直接推入堆栈。
要做到这一点,我们必须写78*
相反,它乘7
与8
和将产品推入堆栈。
细节
输入可以采用任何格式,这取决于程序员可以决定是否使用STDIN。
输入将是一个正整数(包含0
或不包含负整数将没有加分)。
输出将是仅包含以下字符的字符串:(0123456789+-*/
我不会使用%
模数。)
目标是使用上述格式找到可以表示输入的最短字符串。
例如,如果输入为123
,则输出为67*99*+
。应该从左到右评估输出。
如果有一个以上可接受的输出(例如99*67*+
,也是可接受的),则可以打印任何输出(打印所有输出均无奖金)。
进一步说明
如果您仍然不了解如何67*99*+
评估123
,这是详细的说明。
stack |operation|explanation
67*99*+
[6] 6 push 6 to stack
[6,7] 7 push 7 to stack
[42] * pop two from stack and multiply, then put result to stack
[42,9] 9 push 9 to stack
[42,9,9] 9 push 9 to stack
[42,81] * pop two from stack and multiply, then put result to stack
[123] + pop two from stack and add, then put result to stack
TL; DR
程序需要使用上面指定的格式找到可以表示输入(数字)的最短字符串。
笔记
这是一个代码挑战,因此以字节为单位的最短代码获胜。
消歧
该-
可以是x-y
或y-x
,在程序员的自由裁量权。但是,选择必须在解决方案内保持一致。同样的/
。
样例程序
Lua,1862个字节(在线尝试)
因为我是作者,所以我不会打高尔夫球。
说明:
This uses the depth-first search method.
有关深度优先搜索的更多信息:此处。
该程序:
local input = (...) or 81
local function div(a,b)
if b == 0 then
return "error"
end
local result = a/b
if result > 0 then
return math.floor(result)
else
return math.ceil(result)
end
end
local function eval(expr)
local stack = {}
for i=1,#expr do
local c = expr:sub(i,i)
if c:match('[0-9]') then
table.insert(stack, tonumber(c))
else
local a = table.remove(stack)
local b = table.remove(stack)
if a and b then
if c == '+' then
table.insert(stack, a+b)
elseif c == '-' then
table.insert(stack, b-a)
elseif c == '*' then
table.insert(stack, a*b)
elseif c == '/' then
local test = div(b,a)
if test == "error" then
return -1
else
table.insert(stack, a+b)
end
end
else
return -1
end
end
end
return table.remove(stack) or -1
end
local samples, temp = {""}, {}
while true do
temp = {}
for i=1,#samples do
local s = samples[i]
table.insert(temp, s..'0')
table.insert(temp, s..'1')
table.insert(temp, s..'2')
table.insert(temp, s..'3')
table.insert(temp, s..'4')
table.insert(temp, s..'5')
table.insert(temp, s..'6')
table.insert(temp, s..'7')
table.insert(temp, s..'8')
table.insert(temp, s..'9')
table.insert(temp, s..'+')
table.insert(temp, s..'-')
table.insert(temp, s..'*')
table.insert(temp, s..'/')
end
for i=1,#temp do
if input == eval(temp[i]) then
print(temp[i])
return
end
end
samples = temp
end
奖金
如果您使用Befunge(或它的任何变体)编写代码,这对您来说是小菜一碟。