Erläuterung
Befunge ist ein zweidimensionales Programm, das Stapel verwendet .
Das heißt, um 5 + 6 zu tun, schreiben Sie 56+
, was bedeutet:
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)
Wie die Intelligenten von Ihnen bemerkt haben, können wir die Zahl jedoch nicht 56
direkt in den Stapel schieben .
Dazu müssen wir 78*
stattdessen schreiben , was das Produkt multipliziert 7
und 8
in den Stapel schiebt.
Einzelheiten
Die Eingabe kann in einem beliebigen Format erfolgen, dh nach Ermessen des Programmierers kann dies STDIN sein oder nicht.
Die Eingabe ist eine positive Ganzzahl (kein Bonus für Einschluss- 0
oder negative Ganzzahlen).
Der Ausgang wird eine Reihe von nur diese Zeichen aus: 0123456789+-*/
(ich würde nicht verwenden %
. Modulo)
Das Ziel besteht darin, die kürzeste Zeichenfolge zu finden, die die Eingabe darstellen kann, indem das oben beschriebene Format verwendet wird.
Wenn zum Beispiel die Eingabe ist 123
, dann wäre die Ausgabe 67*99*+
. Die Ausgabe sollte von links nach rechts ausgewertet werden.
Wenn es mehr als eine akzeptable Ausgabe gibt (z. B. 99*67*+
auch akzeptabel), kann eine beliebige gedruckt werden (kein Bonus für das Drucken aller).
Weitere Erklärung
Wenn Sie immer noch nicht verstehen, wie Sie 67*99*+
auswerten sollen 123
, finden Sie hier eine ausführliche Erklärung.
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
Das Programm muss die kürzeste Zeichenfolge finden, die die Eingabe (Zahl) darstellen kann, wobei das oben angegebene Format verwendet wird.
Anmerkungen
Dies ist eine Code-Golf- Herausforderung, daher gewinnt der kürzeste Code in Bytes.
Begriffsklärung
Das -
kann entweder x-y
oder y-x
nach Ermessen des Programmierers sein. Die Auswahl muss jedoch innerhalb der Lösung konsistent sein. Ebenso für die /
.
Beispielprogramm
Lua, 1862 Bytes ( online testen )
Da ich der Autor bin, werde ich überhaupt nicht Golf spielen.
Erläuterung:
This uses the depth-first search method.
Mehr zur Tiefensuche: hier .
Das Programm:
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
Bonus
Ein Kuchen für Sie, wenn Sie Befunge (oder eine andere Variante davon) verwenden, um den Code zu schreiben.