คำอธิบาย
Befungeเป็นโปรแกรมที่สองมิติที่ใช้สแต็ค
นั่นหมายความว่าในการทำ 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+-*/
(ฉันจะไม่ใช้%
modulo)
เป้าหมายคือการค้นหาสตริงที่สั้นที่สุดที่สามารถเป็นตัวแทนของอินพุตโดยใช้รูปแบบที่อธิบายไว้ข้างต้น
ตัวอย่างเช่นถ้าใส่เป็นแล้วออกจะเป็น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 (หรือตัวแปรอื่น ๆ ) เพื่อเขียนโค้ด