Penjelasan
Befunge adalah program dua dimensi yang menggunakan tumpukan .
Itu berarti, untuk melakukan 5 + 6, Anda menulis 56+
, yang berarti:
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)
Namun, seperti yang diamati oleh kecerdasan Anda, kami tidak dapat mendorong nomornya 56
langsung ke tumpukan.
Untuk melakukannya, kita harus menulis 78*
sebaliknya, yang mengalikan 7
dan 8
dan mendorong produk ke dalam stack.
Detail
Input dapat diambil dalam format apa pun, artinya bisa STDIN atau tidak, atas kebijakan programmer.
Input akan berupa bilangan bulat positif (tidak ada bonus untuk menyertakan 0
atau bilangan bulat negatif).
Outputnya akan berupa string yang hanya terdiri dari karakter-karakter ini: 0123456789+-*/
(Saya tidak akan menggunakan %
modulo.)
Tujuannya adalah untuk menemukan string terpendek yang dapat mewakili input, menggunakan format yang dijelaskan di atas.
Misalnya, jika inputnya adalah 123
, maka outputnya adalah67*99*+
. Keluaran harus dievaluasi dari kiri ke kanan.
Jika ada lebih dari satu output yang dapat diterima (mis. 99*67*+
Juga dapat diterima), ada yang bisa dicetak (tidak ada bonus untuk mencetak semuanya).
Penjelasan lebih lanjut
Jika Anda masih tidak mengerti bagaimana cara 67*99*+
mengevaluasi 123
, berikut adalah penjelasan terperinci.
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 perlu menemukan string terpendek yang dapat mewakili input (angka), menggunakan format yang ditentukan di atas.
Catatan
Ini adalah tantangan kode-golf , jadi kode terpendek dalam byte menang.
Disambiguasi
The -
baik dapat x-y
atau y-x
, kebijaksanaan programmer. Namun, pilihannya harus konsisten dalam solusi. Demikian juga untuk/
.
Program sampel
Lua, 1862 bytes ( coba online )
Karena saya penulis, saya tidak akan golf sama sekali.
Penjelasan:
This uses the depth-first search method.
Lebih lanjut tentang pencarian mendalam-pertama: di sini .
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
Kue untuk Anda jika Anda menggunakan Befunge (atau varian lainnya) untuk menulis kode.