Spiegazione
Befunge è un programma bidimensionale che utilizza stack .
Ciò significa che, per fare 5 + 6, scrivi 56+
, nel senso:
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)
Tuttavia, come ha notato l'intelligente di voi, non possiamo inserire il numero 56
direttamente nello stack.
Per fare ciò, dobbiamo scrivere 78*
, invece, che moltiplica 7
e 8
e spinge il prodotto nello stack.
Dettagli
L'input può essere preso in qualsiasi formato, nel senso che può essere STDIN o meno, a discrezione del programmatore.
L'input sarà un numero intero positivo (nessun bonus per 0
numeri interi inclusi o negativi).
L'uscita sarà una stringa costituita solo questi caratteri: 0123456789+-*/
(io non usare%
. Modulo)
L'obiettivo è trovare la stringa più corta che possa rappresentare l'input, usando il formato sopra descritto.
Ad esempio, se l'input è 123
, allora l'output sarebbe 67*99*+
. L'output deve essere valutato da sinistra a destra.
Se esistono più uscite accettabili (ad es 99*67*+
è anche accettabile), uno può essere stampata (senza bonus per la stampa di tutti).
Ulteriori spiegazioni
Se ancora non capisci come 67*99*+
valuta 123
, ecco una spiegazione dettagliata.
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
Il programma deve trovare il più breve stringa che può rappresentare l'input (numero), usando il formato sopra specificato.
Appunti
Questa è una sfida di code-golf , quindi vince il codice più breve in byte.
disambiguation
Il -
possono essere sia x-y
o y-x
, a discrezione del programmatore. Tuttavia, la scelta deve essere coerente all'interno della soluzione. Allo stesso modo per il /
.
Programma di esempio
Lua, 1862 byte ( provalo online )
Dal momento che sono l'autore, non lo golfò affatto.
Spiegazione:
This uses the depth-first search method.
Ulteriori informazioni sulla ricerca approfondita: qui .
Il programma:
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
indennità
Una torta per te se usi Befunge (o qualsiasi sua variante) per scrivere il codice.