açıklama
Befunge , yığınları kullanan iki boyutlu bir programdır .
Yani, 5 + 6 yapmak için şunu yazıyorsunuz 56+
, yani:
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)
Bununla birlikte, zekanızın gözlemlediği gibi, sayıyı 56
doğrudan yığının içine itemeyiz.
Bunu yapmak için, biz yazmalısınız 78*
hangi çarpar, yerine 7
ve 8
ve yığın haline ürünü iter.
ayrıntılar
Giriş, programcının takdirine bağlı olarak herhangi bir biçimde alınabilir, yani STDIN olabilir veya olmayabilir.
Giriş pozitif bir tamsayı olacaktır (dahil etme 0
veya negatif tamsayılar için bonus olmaz ).
Çıktı bir dize yalnızca bu karakterden oluşan olacaktır: 0123456789+-*/
(ı ediyorum değil kullanmak %
. Modulo)
Amaç, yukarıda açıklanan formatı kullanarak girişi temsil edebilecek en kısa dizeyi bulmaktır .
Örneğin, giriş ise 123
, çıkış olur 67*99*+
. Çıktı soldan sağa doğru değerlendirilmelidir.
Birden fazla kabul edilebilir çıktı varsa (örn. Kabul 99*67*+
edilebilir), herhangi biri yazdırılabilir (hepsini yazdırmak için bonus olmaz).
Daha fazla açıklama
Hala nasıl 67*99*+
değerlendirildiğini anlamıyorsanız 123
, işte ayrıntılı bir açıklama.
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
Program , yukarıda belirtilen formatı kullanarak girişi (sayı) temsil edebilecek en kısa dizeyi bulmalıdır .
notlar
Bu bir kod golf mücadelesi, bu yüzden bayttaki en kısa kod kazanır.
Netleştirme
-
Ya olabilir x-y
veya y-x
programcı takdirine bağlı olarak,. Bununla birlikte, seçim çözüm içinde tutarlı olmalıdır. Aynı şekilde /
.
Örnek program
Lua, 1862 bayt ( çevrimiçi deneyin )
Ben yazar olduğum için, ben hiç golf olmaz.
Açıklama:
This uses the depth-first search method.
Önce derinlemesine arama hakkında daha fazla bilgi: burada .
Program:
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
Kodu yazmak için Befunge (veya herhangi bir varyantını) kullanırsanız sizin için bir pasta .