세 번째 스택 사용
제목을 읽은 경우 약간 혼란 스러울 수 있습니다. Brain-Flak에는 반드시 두 개의 스택 만 있습니까? 그러나 나는 그것이 존재하고 그것이 Brain-Flak을 작성하고 골프를 타는 데 가장 강력한 도구가 아니라면 가장 강력하다는 것을 확신합니다.
"Third Stack"은 무엇입니까?
모든 Brain-Flak 프로그램은 어떤 방식 으로든 세 번째 스택을 사용하지만 대부분의 사용은 뒤에서 진행되며 종종 존재한다는 사실을 단순히 무시하는 것이 유용합니다. 프로그램의 각 괄호는 스택에서 하나의 항목을 추가하거나 제거합니다. 열린 괄호 중 3 개는 ([<
모두 스택에 항목을 추가하고 3 개의 켤레는 )]>
모두 스택에서 항목을 제거합니다. 스택의 아이템 값은 프로그램의 현재 범위 값이며 nilads를 사용하면 특정 방식으로이 값을 수정합니다. 닫기 괄호 )
는 요소를 세 번째 스택에서 현재 스택으로 이동시키는 고유 한 기능을 가지고 있습니다. 푸시.
잘만되면 이것은 당신에게 분명 해지고있다. 세 번째 스택은 이미 실행 된 코드의 반환 값을 기억하는 일종의 스택입니다. 두 개의 일반 스택과 세 번째 스택을 추적하는 간단한 프로그램의 예를 살펴 보겠습니다.
예
다음과 같은 프로그램을 안내합니다. 이 프로그램은 -3, 1, -2
스택으로 푸시 됩니다.
(([()()()])(()))
우리는 세 개의 열린 괄호로 시작합니다.
이제 스택은 다음과 같습니다. 세 번째 스택은 오른쪽에 있고 활성 스택은 그 ^
아래에 있습니다.
0
0
0 0 0
^
(([()()()])(()))
^
이제 우리는 세 가지 ()
nilads가 있습니다. 이것들은 일반적인 두 스택에는 아무런 영향을 미치지 않지만 각각 세 번째 스택의 상단에 하나씩 추가하여 스택을 다음과 같이 만듭니다.
3
0
0 0 0
^
(([()()()])(()))
^
이제 ]
닫는 중괄호가 세 번째 스택에서 항목을 제거하기 전에 언급 한대로 표시되지만 스택 ]
의 상단에서 제거하는 요소를 빼는 기능이 있습니다. 따라서 새로운 스택은 다음과 같습니다.
-3
0 0 0
^
(([()()()])(()))
^
이것은 말이된다; [...]
부정 ]
은 아래로 빼야합니다.
이제 우리는를 실행해야합니다 )
. )
프로그램에서 물건이 스택으로 푸시되는 위치를 기억할 것이므로 세 번째 스택의 상단을 현재 스택으로 이동하고 또한 -3
세 번째 스택의 다음 요소 에을 추가합니다 .
-3 0 -3
^
(([()()()])(()))
^
다시 한번 우리는 세 개의 열린 중괄호 중 하나를 만나서 세 번째 스택에 다른 요소를 추가합니다.
0
-3 0 -3
^
(([()()()])(()))
^
앞서 말했듯 ()
이 세 번째 스택의 맨 위를 하나씩 증가시킵니다.
1
-3 0 -3
^
(([()()()])(()))
^
그리고 )
세 번째 스택의 상단을 활성 스택으로 옮기고 아래쪽으로 추가합니다
1
-3 0 -2
^
(([()()()])(()))
^
마지막 )
은 세 번째 스택을 활성 스택 으로 이동하고 추가 할 요소가 세 번째 스택에 남아 있지 않으므로 다른 작업은 수행하지 않습니다.
-2
1
-3 0
^
(([()()()])(()))
^
프로그램이 종료되었으므로 종료하고 출력합니다.
이 예제는 세 번째 스택이 무엇이며 어떤 역할을하는지에 대한 느낌을주기위한 것입니다. 모든 작업이 포함되어 있지는 않지만 각 작업이 자체적으로 수행하는 작업을 파악할 수 있기를 바랍니다. 여전히 어려움을 겪고 있다면이 답변 맨 아래에 "치트 시트"를 포함시켜 도움을 드리겠습니다.
좋아, 그럼?
자, 이제 세 번째 스택을 이해하지만 "그래서 무엇"입니까? "Third Stack"이라고하지 않더라도 이미 사용하고 있었는데, Third Stack이라는 관점에서 생각하는 것이 골프에 어떤 도움이됩니까?
문제를 보자. 당신 은 숫자 의 삼각형을 원합니다 . 이것은 n보다 작은 모든 숫자의 합입니다.
한 가지 방법은 오프 스택에서 누산기를 만들고 카운트 다운 할 때 추가하는 것입니다. 다음과 같은 코드가 생성됩니다.
(<>)<>{(({}[()])()<>{})<>}{}<>({}<>)
온라인으로 사용해보십시오!
이 코드는 매우 간결하며 더 작아 질 수 없다고 생각할 수 있습니다. 그러나 우리가 세 번째 스택 관점에서 접근하면 이것이 비효율적이라는 것이 분명해집니다. 누산기를 오프 스택에 두는 대신 a를 사용하여 세 번째 스택에 배치하고 (
사용하는 마지막에 검색 할 수 있습니다 )
. 우리는 다시 한 번 모든 숫자를 반복하지만 이번에는 세 번째 스택을 늘리기 위해 많은 일을 할 필요가 없습니다. 이것은 다음과 같습니다
({()({}[()])}{})
온라인으로 사용해보십시오
이 코드는 우리가 이전에 만든 골프 버전의 절반보다 작습니다. 실제로 컴퓨터 검색은이 프로그램이이 작업을 수행 할 수있는 가장 짧은 프로그램이라는 것을 증명했습니다. 이 프로그램은 "모든 실행의 합"접근법을 사용하여 설명 할 수 있지만, 제 3 스택 접근법을 사용하여 설명하면 훨씬 직관적이고 명확하다고 생각합니다.
세 번째 스택은 언제 사용합니까?
이상적으로 Brain-Flak에서 새로운 문제에 대한 작업을 시작할 때마다 세 번째 스택을 염두에두고 어떻게해야하는지 스스로 생각해야합니다. 그러나 어떤 유형의 누산기를 추적하거나 누적 합계를 유지해야 할 때마다 일반적으로 두 개의 실제 스택 대신 세 번째 스택에 배치하는 것이 좋습니다.
세 번째 스택 사용을 고려하는 것이 좋은 또 다른 때는 다른 두 스택에 값을 저장할 공간이 없을 때입니다. 이것은 두 개의 기존 스택에서 조작을 수행 할 때 유용하며 나중에 위치를 추적하지 않고 나중에 사용할 수 있도록 값을 저장하려고합니다.
세번째 스택의 한계
세 번째 스택은 여러 가지면에서 매우 강력하지만 자체 한계와 단점이 있습니다.
첫째, 주어진 시점에서 세 번째 스택의 최대 스택 높이는 컴파일 타임에 결정됩니다. 즉, 스택에서 일정량의 공간을 사용하려면 프로그램을 작성할 때 해당 공간을 할당해야합니다.
둘째, 세 번째 스택은 랜덤 액세스가 아닙니다. 이는 가장 높은 값을 제외한 모든 값에서 작업을 수행 할 수 없음을 의미합니다. 또한 스택에서 값을 이동할 수 없습니다 (예 : 처음 두 요소 교환).
결론
세 번째 스택은 강력한 도구이므로 모든 Brain-Flak 사용자에게 필수적이라고 생각합니다. Brain-Flak 프로그래밍에 익숙해지기 위해서는 약간의 적응이 필요하지만, 올바르게 사용하면 골프와 관련하여 괜찮은 것과 놀라운 것의 모든 차이를 만듭니다.
컨닝 지
다음은 작업 목록과 해당 작업이 세 번째 스택에 미치는 영향입니다
Operation | Action
====================================================
(,[,< | Put a zero on top of the Third Stack
----------------------------------------------------
) | Add the top of the Third Stack to the
| second element and move it to the
| active stack
----------------------------------------------------
] | Subtract the top of the Third Stack
| from the second element and pop it
----------------------------------------------------
> | Pop the top of the Third Stack
----------------------------------------------------
() | Add one to the top of the Third Stack
----------------------------------------------------
{} | Pop the top of the active stack and
| add it to the top of the Third Stack
----------------------------------------------------
[] | Add the stack height to the Third
| Stack
----------------------------------------------------
<>,{,} | Nothing