답변:
*
출력에 사용때문에 당신은 스택에 문자열을 떠나하여 출력 할 수 있습니다 , 사용하여 문자열을 축적하는 것이 유용 할 수 있습니다 *
보다는 함께 출력 S
. "문자열을 가져 와서 공백을 추가"하는 것이 어려울 경우 출력으로 수행하는 방법은 다음과 같습니다.
S( )S
반면에을 사용하는 방법 *
은 1 바이트 짧습니다.
( )*
문제는 출력에 누적이 많으면 스택의 출력 요소를 처리하는 데 바이트가 필요할 수 있다는 것입니다.
코드 조각을 많이 사용해야하는 경우 해당 코드를 스택에 저장하고 매번 복제 및 평가하는 것이 좋습니다. 지금까지는 일반적인 Underload 프로그래밍입니다. 불행히도, 스택에서 오랫동안 값을 유지하는 것은 어렵고 코드가 장황하게되는 경향이 있으며, 값이 데이터가 아닌 함수 일지라도 마찬가지입니다. 반복해서 재사용해야하는 여러 기능이있는 경우 훨씬 더 나빠집니다.
재사용되는 여러 기능을 활용할 수있는 더 큰 규모의 프로그램에서 대신 사용할 수있는 솔루션은 호출 방식에 따라 목적에 맞는 하나의 큰 기능을 만드는 것입니다. 이상 사용보다는 다만 시퀀스를 호출을 통해 ^
, 신중하게 작성 기능을 구별 할 수 ^^
에서 ^:^
에서 ^*^
에서 ^~^
) 뚜렷한 상당히 짧은 시퀀스 당신에게 제공합니다. 이 "사전"에 여러 번 사용하는 문자열과 같은 다른 유용한 것들을 저장할 수도 있습니다. 사전을 과도하게 사용하는 경우 사전을 일종의 퀴니로 만들어서 사본을 스택에 다시 밀어 넣을 수 있으므로 수동으로 복사 할 필요가 없습니다.:
나중에 사용할 수있는 능력을 잃지 않고 사용할 수 있습니다.
간단한 예로, 가장 일반적으로 보이는 부울 구현은 !()
false (예 : 정수 0)이고 null 문자열은 true (예 : 정수 1)이지만 논리 XOR을 기반으로하는 문제가있는 경우 더 많이 만들 수 있습니다. null 문자열을 false 및 ~
true 로 사용하는 것이 좋습니다. 이 데이터 형식은을 사용하여 다른 부울 형식으로 변환 할 수 있으며 XOR에 대한 (false)~(true)~^!
매우 간결한 구현 *
을 허용합니다 .
이 일반적인 원칙을 더욱 발전시키고 나중에 데이터 값의 일부로 프로그램이 필요로하는 기능을 사용할 수 있습니다. 스택에 함수와 데이터를 별도로 저장하지 않아도됩니다. 이것은 제어 흐름을 좀 더 혼란스럽게 만들 수 있지만, 골프를 칠 때 유지 관리 능력은 종종 뒷좌석을 가져와야하며, Underload가 사용 가능한 것은 아닙니다.
(!)
하고 사용 (~!)
했지만 길은 더 좋아 보입니다.
기능적으로 순수한 교회 숫자를 줄이는 방법은 람다 미적분학 선행 함수를 사용하는 것입니다.
\n.n(\p.\z.z($(pT))(pT))(\z.z0[whatever you define the predecessor of 0 to be])
여기서 0 = \ x. \ yy, T = \ x. \ yx 및 $는 후속 작업입니다.
언더로드로 다시 작성하면 28 바이트입니다.
(!())~(!())~(!:(:)~*(*)*~)~^!
이것은 괜찮아,하지만 우리는, 즉 그, 저 부하의 유용한 특성의 일부를 이용할 수 :!
하고 ()*
있습니다 어떤 작전을하지 않는다. 숫자, 이것은 수단 n
, :ⁿ!!()()*ⁿ
( cⁿ
한다 c
반복 n
시간) N-1을 산출한다. 예를 들어 교회 번호 3에 대해 이것을 수행하면 다음과 같이 나타납니다.
:::!!()()***
No-op 쌍을 제거하면 다음과 같은 이점이 있습니다.
:*
2입니다.
따라서 이것은 새롭고 짧은 선행 작업입니다.
:(:)~^(!!()())*~(*)~^*
이것은 7 바이트 더 짧습니다.
(()~(:))~:(^!!())*~(*)~^**
여전히 3 바이트 짧습니다.
언더로드에는 실제로 두 개의 스택, 즉 문자열 스택과 소스 코드를 구성하는 명령 스택이 있습니다. 언더로드의 ^
명령으로 문자열을 이전 스택에서 후자로 이동할 수 있습니다. 이렇게하면 불필요한 스택 조작을 많이 줄일 수 있습니다.
예를 들어, 우리가 말하는 (a)(b)(c)
주요 스택에 우리는 무시하고, 하단의 두 요소를 연결하는 싶습니다 (c)
얻으려면 (ab)(c)
. 이 작업을 수행하는 순진한 방법은 스택을 돌려서 (c)(a)(b)
수렴하고 다시 바꾸는 것입니다.
a~a~*~a*^*~
이것은 나쁘다. a~a~*~a*^
이와 같이 스택을 회전시키는 데 사용 하는 것은 비용이 많이 들며 가능하면 피해야합니다. (c)
대신 프로그램 공간에 넣으면 4 바이트 더 짧아 질 수 있습니다.
a(*)~*^
아이디어는 실행하려는 지시를 취한 (c)
다음 끝에 지시를 추가 한 다음 결과를 평가하는 것입니다. 즉, (c)
완료 한 후 되돌릴 때까지 걱정할 필요가 없습니다 .
(*)~a*^
있는데, 조금 더 작곡이 가능하다고 생각합니다. 기본적 ~a*^
으로 dip
Joy 의 명령입니다.
eval
명령이라는 것을 좋아합니다.