説明
Befungeは、stacksを使用する2次元プログラムです。
つまり、5 + 6を行うには、と書く56+
、という意味です。
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)
ただし、知人が観察しているように、数字を56
直接スタックにプッシュすることはできません。
そうするために、我々は書かなければならない78*
、代わりにその乗算を7
して8
、スタックに製品をプッシュします。
詳細
入力は任意の形式で取得できます。つまり、プログラマの裁量により、STDINであるかどうかは問われません。
入力は正の整数になります(0
負の整数を含めても負の整数でもない)。
出力は、これらの文字のみで構成される文字列になります0123456789+-*/
(モジュロは使用しません%
)。
目標は、上記の形式を使用して、入力を表すことができる最短の文字列を見つけることです。
たとえば、入力がの場合123
、出力はになります67*99*+
。出力は左から右に評価する必要があります。
許容される出力が複数ある場合(たとえば許容される場合もあります99*67*+
)、いずれかを出力できます(すべてを出力してもボーナスはありません)。
さらなる説明
それでも67*99*+
評価方法がわからない場合123
は、詳細な説明があります。
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
プログラムは、上記で指定した形式を使用して、入力(数値)を表すことができる最短の文字列を見つける必要があります。
ノート
これはコードとゴルフのチャレンジなので、バイト単位の最短コードが優先されます。
明確化
-
いずれかになりますx-y
かy-x
プログラマの裁量で、。ただし、選択はソリューション内で一貫している必要があります。同様に/
。
サンプルプログラム
Lua、1862バイト(オンラインで試してみてください)
私は著者なので、ゴルフは一切しません。
説明:
This uses the depth-first search method.
:深さ優先探索の詳細ここに。
プログラム:
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
ボーナス
Befunge(またはそのバリアント)を使用してコードを記述する場合のケーキ。