Giải trình
Befunge là một chương trình hai chiều sử dụng ngăn xếp .
Điều đó có nghĩa là, để làm 5 + 6, bạn viết 56+
, có nghĩa là:
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)
Tuy nhiên, như sự thông minh của bạn đã quan sát, chúng tôi không thể đẩy số 56
trực tiếp vào ngăn xếp.
Để làm như vậy, chúng ta phải viết 78*
thay vào đó, mà nhân lên 7
và 8
và đẩy sản phẩm vào ngăn xếp.
Chi tiết
Đầu vào có thể được thực hiện ở bất kỳ định dạng nào, có nghĩa là nó có thể là STDIN hoặc không, theo quyết định của lập trình viên.
Đầu vào sẽ là một số nguyên dương (không có phần thưởng cho bao gồm 0
hoặc số nguyên âm).
Đầu ra sẽ là một chuỗi chỉ bao gồm các ký tự sau: 0123456789+-*/
(Tôi sẽ không sử dụng %
modulo.)
Mục tiêu là tìm chuỗi ngắn nhất có thể đại diện cho đầu vào, sử dụng định dạng được mô tả ở trên.
Ví dụ, nếu đầu vào là 123
, thì đầu ra sẽ là 67*99*+
. Đầu ra nên được đánh giá từ trái sang phải.
Nếu có nhiều hơn một đầu ra có thể chấp nhận (ví dụ: 99*67*+
cũng được chấp nhận), bất kỳ đầu ra nào cũng có thể được in (không có phần thưởng cho việc in tất cả chúng).
Giải thích thêm
Nếu bạn vẫn không hiểu cách 67*99*+
đánh giá 123
, đây là một lời giải thích chi tiết.
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
Chương trình cần tìm chuỗi ngắn nhất có thể biểu thị đầu vào (số), sử dụng định dạng được chỉ định ở trên.
Ghi chú
Đây là một thử thách chơi gôn mã , vì vậy mã ngắn nhất tính bằng byte sẽ thắng.
Định hướng
Có -
thể x-y
hoặc y-x
, theo ý của lập trình viên. Tuy nhiên, sự lựa chọn phải nhất quán trong giải pháp. Tương tự như vậy cho /
.
Chương trình mẫu
Lua, 1862 byte ( thử trực tuyến )
Vì tôi là tác giả, tôi sẽ không chơi golf.
Giải trình:
This uses the depth-first search method.
Tìm hiểu thêm về tìm kiếm chuyên sâu: tại đây .
Chương trình:
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
Tặng kem
Một chiếc bánh cho bạn nếu bạn sử dụng Befunge (hoặc bất kỳ biến thể nào của nó) để viết mã.