объяснение
Befunge - это двумерная программа, использующая стеки .
Это означает, что для выполнения 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
Программа должна найти самый короткий строку, которая может представлять ввод (число), используя формат, указанный выше.
Примечания
Это задача кода-гольфа , поэтому выигрывает самый короткий код в байтах.
Disambiguation
-
Может быть либо 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 (или любой другой вариант) для написания кода.