Explicación
Befunge es un programa bidimensional que utiliza pilas .
Eso significa que, para hacer 5 + 6, escribes 56+
, lo que significa:
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)
Sin embargo, como han observado los inteligentes, no podemos insertar el número 56
directamente en la pila.
Para ello, debemos escribir 78*
en su lugar, lo que multiplica 7
y 8
y empuja el producto en la pila.
Detalles
La entrada puede tomarse en cualquier formato, lo que significa que puede ser STDIN o no, a discreción del programador.
La entrada será un entero positivo (sin bonificación por incluir 0
o enteros negativos).
La salida será una cadena formada únicamente por los caracteres: 0123456789+-*/
(yo no uso %
. Módulo)
El objetivo es encontrar la cadena más corta que pueda representar la entrada, utilizando el formato descrito anteriormente.
Por ejemplo, si la entrada es 123
, entonces la salida sería 67*99*+
. La salida debe evaluarse de izquierda a derecha.
Si hay más de una salida aceptable (por ejemplo, 99*67*+
también es aceptable), se puede imprimir cualquiera (no hay bonificación por imprimirlas todas).
Explicación adicional
Si aún no comprende cómo se 67*99*+
evalúa 123
, aquí hay una explicación detallada.
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
El programa necesita encontrar la cadena más corta que pueda representar la entrada (número), utilizando el formato especificado anteriormente.
Notas
Este es un desafío de código de golf , por lo que gana el código más corto en bytes.
Desambiguación
El -
puede ser x-y
o y-x
, a discreción del programador. Sin embargo, la elección debe ser coherente dentro de la solución. Asimismo para el /
.
Programa de muestra
Lua, 1862 bytes ( pruébelo en línea )
Como soy el autor, no jugaré golf en absoluto.
Explicación:
This uses the depth-first search method.
Más sobre la búsqueda en profundidad: aquí .
El 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
Prima
Un pastel para ti si usas Befunge (o cualquier variante) para escribir el código.