:-:_
온라인으로 사용해보십시오! 바닥 글에는 다른 모든 4 바이트 솔루션이 포함되어 있습니다. (스택 고양이는 첫 줄 바꿈 후 모든 것을 무시합니다.)
반대로 시도하십시오!
설명
-n
숫자 출력에 플래그 회전 (입력,하지만 우리는 어떤이없는), 그리고 -m
플래그는 일반적으로 소스 코드의 중복 부분을 방지 할 수 있습니다 단지 골프 편리합니다. 모든 Stack Cats 프로그램에 미러 대칭이 필요하기 때문입니다. -m
깃발을 사용하면 상반기 (중앙 문자 포함) 만 제공합니다. 이렇게 실제 여기 프로그램입니다 :
:-:_:-:
첫 번째 TIO 링크에서 볼 수 있듯이, 4 바이트 솔루션이 많이 있지만 단순성을 위해이 솔루션을 선택했습니다. Stack Cats는 스택 기반이며이 프로그램은 초기 스택 만 사용합니다. 입력이 없기 때문에 -1
, 무한정의 제로 위에 단일 (EOF 마커)이 포함됩니다. 프로그램의 세 가지 명령은 다음과 같은 의미를 갖습니다.
: Swap the top two stack elements.
- Negate the top stack element (i.e. multiply by -1).
_ Pop a. Peek b. Push b-a.
프로그램이 스택을 수정하는 방법은 다음과 같습니다 (상태와 명령은 각 명령이 스택을 한 상태에서 다음 상태로 변경하는 방법을 나타 내기 위해 스 태거됩니다).
: - : _ : - :
-1 0 0 -1 1 0 0 1
0 -1 -1 0 0 1 1 0
0 0 0 0 0 0 0 0
… … … … … … … …
실제로 여기서 실제로 수행하는 유일한 명령은 _
EOF 마커를로 변환하는 것 1
입니다. 프로그램 끝의 출력은 암시 적이며 EOF 마커는 선택 사항이므로 1
우리가 얻는 것을 인쇄합니다 .
이제 암시 적 미러링으로 인해 소스 코드를 되 돌리면 실제 프로그램은 다음과 같습니다.
_:-:-:_
이것은 매우 다른 일을합니다.
_ : - : - : _
-1 1 0 0 1 -1 0 -1
0 0 1 1 0 0 -1 -1
0 0 0 0 0 0 0 0
… … … … … … … …
이번에는 스택 맨 아래 가 여전히 -1
EOF 마커 역할을하고 -1
맨 위만 인쇄됩니다.
...
이제는 Stack Cats가 반전 코드와 고유 한 관계를 가지므로 사용 -m
이 약간의 부정 행위 라고 생각합니다 . 일반적으로 소스 코드의 중복 부분을 생략하여 바이트를 절약하는 것이지만 여기서는 실제로 훨씬 더 쉽고 전체 프로그램을 더 짧게 만듭니다. 전체 프로그램을 취소하면 프로그램에가 포함 된 경우에만 프로그램이 변경되기 때문에 프로그램 <>[]
에서 여러 스택을 사용하게됩니다 (스택 고양이에는 실제로 스택 테이프가 있으며 초기 스택을 제외한 모든 스택 만 채워집니다) 0으로 시작). 또한 그것을 뒤집 으면 <>
and와 []
쌍이 바뀌어 실행 대칭이됩니다. 그 대칭을 깰 수있는 유일한 방법은 사용하는 것입니다 I
있는 수행 -]
또는-[
또는 스택 상단의 부호에 따라 아무것도 없습니다. 그래서...
*|]I*:*I[|*
온라인으로 사용해보십시오! 바닥 글은 동일한 바이트 수로 다른 모든 대안을 다시 포함합니다. 출력 1 / -1 중 일부는 출력 후 2 / -2 출력됩니다. 나는 이것을 2를 출력하는 것 중 하나로 무작위로 설명하기 위해 이것을 선택했습니다.
반대로 시도하십시오!
설명
내가 말했듯이, 이것은 조금 더 길다. 우리가 사용했다하더라도 -m
이에 대한 표기를 대신 4 위의 6 바이트에서 무게가 나간다 것입니다.
이번에 사용되는 명령 :
* Toggle the least significant bit of the top of the stack.
| Reverse the longest non-zero of prefix on this stack.
[] Move one stack to the left/right and take the top of the current stack with you.
I If the top of the stack is positive, -], if it's negative, -[, otherwise do nothing.
: Swap the top two stack elements.
첫 번째 프로그램은 두 개의 스택 만 사용합니다. ASCII 아트에서는 약간 지저분하지만 최선을 다할 것입니다. 대괄호는 테이프 헤드가있는 스택을 나타내며 각 스택 상태 쌍 사이에 명령을 넣습니다.
[-1]
… 0 0 …
0 0
… …
*
[-2]
… 0 0 …
0 0
… …
| (does nothing)
]
[-2]
… 0 0 …
0 0
… …
I
[2]
… 0 0 …
0 0
… …
*
[3]
… 0 0 …
0 0
… …
:
[0]
… 3 0 …
0 0
… …
*
[1]
… 3 0 …
0 0
… …
I
[-1]
… 3 0 …
0 0
… …
[
[-1]
… 3 0 …
0 0
… …
|
[ 3]
… -1 0 …
0 0
… …
*
[ 2]
… -1 0 …
0 0
… …
이제 -1
EOF 마커 역할을하고 2
인쇄됩니다.
다른 프로그램은까지 동일합니다 [
. 두 번째까지 거의 동일합니다 I
. 우리는 기술적으로 다른 스택에 있지만 값이 없으면 구별 할 수 없습니다. 그러나 사이의 차이 I[
와 I]
mattering 끝 :
*|[I*:*I
[-1]
… 3 0 0 …
0 0 0
… … …
]
[-1]
… 3 0 0 …
0 0 0
… … …
| (does nothing)
*
[-2]
… 3 0 0 …
0 0 0
… … …
그리고 이번에는 EOF 마커가 없지만 프로그램은 여전히을 출력합니다 -2
.
-
(0x45 = 0b00101101)는 Jelly에서 작동-
합니다. 리터럴은 -1을 정의하므로 -1을 생성하는 반면,Ṇ
(0xB4 = 0b10110100)은 논리를 수행하지 않기 때문에 1을 생성합니다. 암시 적 입력 0. (물론Ṇ
잘 작동합니다 : p)