Explicação
O Befunge é um programa bidimensional que utiliza pilhas .
Isso significa que, para fazer 5 + 6, você escreve 56+
, significando:
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)
No entanto, como os inteligentes de vocês observaram, não podemos colocar o número 56
diretamente na pilha.
Para isso, devemos escrever 78*
em vez disso, que se multiplica 7
e 8
e empurra o produto para a pilha.
Detalhes
A entrada pode ser obtida em qualquer formato, o que significa que pode ser STDIN ou não, a critério do programador.
A entrada será um número inteiro positivo (nenhum bônus para 0
números inteiros ou negativos).
A saída será uma string composta apenas por esses caracteres: 0123456789+-*/
(eu não usaria o %
módulo.)
O objetivo é encontrar a string mais curta que possa representar a entrada, usando o formato descrito acima.
Por exemplo, se a entrada for 123
, a saída seria 67*99*+
. A saída deve ser avaliada da esquerda para a direita.
Se houver mais de uma saída aceitável (por exemplo, 99*67*+
também é aceitável), qualquer uma poderá ser impressa (sem bônus por imprimir todas elas).
Explicação adicional
Se você ainda não entende como 67*99*+
avalia 123
, aqui está uma explicação detalhada.
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
O programa precisa encontrar a string mais curta que possa representar a entrada (número), usando o formato especificado acima.
Notas
Este é um desafio de código-golfe , portanto o código mais curto em bytes vence.
Desambiguação
O -
pode ser x-y
ou y-x
, a critério do programador. No entanto, a escolha deve ser consistente dentro da solução. Da mesma forma para o /
.
Programa de exemplo
Lua, 1862 bytes ( experimente online )
Como sou o autor, não jogarei nada.
Explicação:
This uses the depth-first search method.
Mais sobre a pesquisa em profundidade: aqui .
O programa:
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
Bônus
Um bolo para você, se você usar o Befunge (ou qualquer outra variante) para escrever o código.