Explication
Befunge est un programme en deux dimensions qui utilise des piles .
Cela signifie que pour faire 5 + 6, vous écrivez 56+
, ce qui signifie:
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)
Cependant, comme vous l'avez remarqué, vous ne pouvez pas pousser le nombre 56
directement dans la pile.
Pour ce faire, il faut écrire à la 78*
place, qui se multiplie 7
et 8
et pousse le produit dans la pile.
Détails
L'entrée peut être prise dans n'importe quel format, ce qui signifie qu'elle peut être STDIN ou non, à la discrétion du programmeur.
L'entrée sera un entier positif (pas de bonus pour 0
les entiers inclus ou négatifs).
La sortie sera une chaîne composée de seulement ces caractères: 0123456789+-*/
(je ne l' utiliser %
. Modulo)
Le but est de trouver la chaîne la plus courte pouvant représenter l'entrée, en utilisant le format décrit ci-dessus.
Par exemple, si l'entrée est 123
, alors la sortie le serait 67*99*+
. La sortie doit être évaluée de gauche à droite.
S'il y a plus d'une sortie acceptable (par exemple, elle 99*67*+
est également acceptable), n'importe laquelle peut être imprimée (pas de bonus pour toutes les imprimer).
Plus d'explications
Si vous ne comprenez toujours pas comment est 67*99*+
évalué 123
, voici une explication détaillée.
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
Le programme doit trouver la chaîne la plus courte pouvant représenter l'entrée (nombre), en utilisant le format spécifié ci-dessus.
Remarques
C'est un défi de code-golf , donc le code le plus court en octets gagne.
Désambiguïsation
Le -
peut être x-y
soit y-x
, soit à la discrétion du programmeur. Cependant, le choix doit être cohérent au sein de la solution. De même pour le /
.
Exemple de programme
Lua, 1862 octets ( essayez-le en ligne )
Puisque je suis l'auteur, je ne jouerai pas au golf du tout.
Explication:
This uses the depth-first search method.
En savoir plus sur la recherche en profondeur: ici .
Le programme:
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
Prime
Un gâteau pour vous si vous utilisez Befunge (ou toute variante de celui-ci) pour écrire le code.