설명
Befunge 는 스택 을 사용하는 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
프로그래머의 재량에 따라. 그러나 솔루션 내에서 선택의 일관성이 있어야합니다. 마찬가지로 /
.
샘플 프로그램
루아, 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 (또는 그 변형)를 사용하여 코드를 작성하는 경우 케이크입니다 .