XOR 솔루션에 필요한 영감을 주신 FryAmTheEggman에게 감사합니다.
0000 !@
0001 ?.|@!
0010 #?#!)@
0011 ?!@
0100 +?|@!?
0101 ??!@
0110 ?<@!!<_\~(
0111 ?<<@!
1000 )\!#?@{
1001 (~?/@#!
1010 ??|@!)
1011 \#??!1@
1100 ?(~!@
1101 ?.|@!)
1110 ?$@#)!<
1111 1!@
모든 프로그램 0
은 거짓과 1
참으로 사용됩니다.
온라인으로 사용해보십시오! 이것은 테스트 스위트가 아니며 다른 프로그램으로 복사하여 직접 입력해야합니다.
위의 솔루션은 최적의 2 바이트 내에 있습니다 (진실한 / 거짓 해석을 완화하지 않는 한). 나는 즉, 최대 7 바이트 (안에, 측면 길이 2에 맞게 모든 프로그램 이상 이일에 가까운에 대한 무력 검색을 실행하도록 한 매우 모든 프로그램을 - 나는 무엇을 모든 유효한 프로그램의 요구와 무엇에 대한 몇 가지 가정을 만들어 없음 유효한 프로그램). 검색 결과 16 개의 가능한 게이트 중 15 개에 대한 솔루션이 발견되었으며 종종 하나 이상의 게이트에 대한 솔루션이 발견되었습니다. 이 pastebin 에서 동등한 대안으로 그룹화 한 모든 대체 솔루션 목록을 찾을 수 있습니다 . 위에 표시된 것은 가장 간단하거나 가장 흥미로운 솔루션이기 때문에 선택한 것이므로 내일 설명을 추가하겠습니다.
16 번째 게이트 : XOR은 7 바이트로 구현할 수없는 유일한 게이트입니다. 더 큰 프로그램에 대한 무차별 대입 검색은 불행히도 현재 가지고있는 코드로는 불가능합니다. 그래서 XOR은 손으로 작성해야했습니다. 지금까지 찾은 가장 짧은 것은 FryAmTheEggman의 실패한 (그러나 매우 가까운) 시도를 기반으로하는 위의 10 바이트 프로그램입니다. 8 바이트 또는 9 바이트 솔루션이 존재할 수 있지만 그 외에는 모든 솔루션이 실제로 최적이어야합니다.
설명
경고 : 텍스트 벽. 이러한 높은 압축 Hexagony 프로그램의 실제 작동 방식에 관심이있는 사람이라면 누구나 아래에 각 프로그램에 대한 설명을 포함 시켰습니다. 설명을 합리적으로 짧게 유지하기 위해 둘 이상의 최적의 프로그램이 존재하는 경우 각 게이트에 대해 가장 간단한 솔루션을 선택하려고했습니다. 그러나 그들 중 일부는 여전히 마음을 흔들 리므로 좀 더 정교해질 가치가 있다고 생각했습니다.
0000
: 거짓
나는 우리가 이것에 대한 다이어그램이 필요하다고 생각하지 않습니다.
! @
. . .
. .
전체 메모리 그리드가 0으로 초기화되므로 !
간단히 0 을 인쇄 @
하고 프로그램을 종료하십시오.
이것은 또한 유일한 2 바이트 솔루션입니다.
0001
: 그리고
? .
| @ !
. .
이것은 기본적으로 단락을 구현 합니다. 아래의 회색 다이어그램은 프로그램의 시작 부분을 보여줍니다. 여기서 첫 번째 입력을 읽고 ?
명령 포인터 (IP)가 |
미러가 반영 하는 왼쪽 모서리를 감 습니다. 이제 코너는 조건부로 작동하므로 첫 번째 입력 값에 따라 두 개의 다른 실행 경로가 있습니다. 빨간색 다이어그램은 다음에 대한 제어 흐름 A = 0
과 녹색 다이어그램을 보여줍니다 A = 1
.
보시다시피, A
is 0
인 경우 간단히 인쇄하고 종료합니다 (모두 .
가 없음을 기억하십시오 ). 그러나 A
is 1
인 경우 IP는 첫 번째 행을 다시 통과하여 B
대신 읽고 인쇄합니다.
이 게이트에는 총 16 개의 5 바이트 솔루션이 있습니다. 그 중 하나는 포티하여, 본질적으로 상기와 동일하다 >
대신 |
하거나 교체 .
효과적으로 무 조작 없다 명령과 함께 퍼팅 또는 ?
제 2 위치에 :
?.|@! .?|@! ?=|@! =?|@! ?_|@! _?|@! ?0|@!
?.>@! .?>@! ?=>@! =?>@! ?_>@! _?>@! ?0>@!
그리고 다른 두 가지 솔루션이 있습니다 (서로 동일합니다). 이것들은 동일한 단락 논리를 구현하지만 실행 경로는 약간 더 미묘합니다 (독자에게 연습으로 남겨 두십시오).
?<!@|
?<!@<
0010
: A와 B가 아님
# ?
# ! )
@ .
이것은 또한 단락의 형태를 구현하지만 #
제어 흐름 의 사용으로 인해 훨씬 까다 롭습니다. #
조건부 IP 스위치입니다. Hexagony 실제로 표시된 여섯 개 IP를 함께 제공 0
에 5
자신의 시계 가장자리를 따라 가리키는 그리드의 여섯 개 모서리에서 시작 (프로그램은 항상 IP로 시작 0
). a #
에 도달하면 현재 값이 modulo로 취해지고 6
해당 IP로 제어 흐름이 계속됩니다. 어떤 기능을 사용하여이 기능을 추가했는지는 확실하지 않지만 놀라운 프로그램 (예 : 이와 같은)을 허용합니다.
우리는 세 가지 경우를 구별 할 것입니다. 때 A = 0
값이 항상 있기 때문에,이 프로그램은 매우 간단 0
경우 #
에는 IP 스위칭이 발생하지 않도록 발생 :
#
아무것도하지 않고, ?
읽 거나 A
(아무것도하지 않음), #
아무것도하지 않고,을 !
인쇄하고 0
, )
증가 시키며 (이것은 중요합니다. 그렇지 않으면 IP가 세 번째 줄로 넘어 가지 않습니다) @
프로그램을 종료합니다. 충분히 간단합니다. 이제 사례를 고려해 보겠습니다 (A, B) = (1, 0)
.
빨간색 경로는 여전히 IP에 해당하며 IP 0
의 녹색 경로를 추가했습니다 1
. ?
읽은 후 A
( 1
이번) #
오른쪽 상단에서 시작하는 IP로 전환됩니다. 즉 ( )를 ?
읽을 수 있습니다 . 이제 해당 증가 등의 것을 왼쪽 상단 모서리에 아무것도하지 않고, 우리는 IP로 남아있다 . 인쇄물 이 인쇄 되고 IP가 왼쪽 대각선을 감 쌉니다. 여전히 아무것도하지 않고 프로그램을 종료합니다.B
0
)
1
#
1
!
1
#
@
마지막으로 두 입력이 모두있는 이상한 경우 1
:
이번에는 두 번째 입력도 1
되고으로 )
증가합니다 2
. 즉, 의미 #
왼쪽 상단 모서리에 원인이 다른 IP로 IP 스위치를 2
파란색으로 표시합니다. 그 길에서, 우리는 먼저 3
( 더 이상 관련이 없지만) 그것을 더 증가시킨 다음 ?
세 번째 로 전달합니다 . 이제 EOF에 도달 했으므로 (즉, 입력이 소진되었습니다)를 ?
반환 0
하고 !
인쇄 한 @
다음 프로그램을 종료합니다.
특히이 게이트에 대한 유일한 6 바이트 솔루션입니다.
0011
: A
? !
@ . .
. .
이것은 다이어그램이 필요 없을 정도로 간단합니다 : ?
reads A
, !
printes, @
terminates.
이것이이 게이트에 대한 유일한 3 바이트 솔루션입니다. (원칙적으로 할 수도 ,;@
있지만 검색에 포함되지 않았습니다 ;
. 왜냐하면 !
이 작업을 위해 바이트를 절약 할 수 있다고 생각하지 않기 때문 입니다.)
0100
: B가 아닌 A
+ ?
| @ !
? .
이것은 "형제"보다 훨씬 간단 0010
합니다. 제어 흐름은 실제로 0001
(And)에 대해 위에서 본 것과 동일 합니다. 인 경우 A = 0
IP는 하단 라인을 통과하여 B
종료하기 전에 해당 라인을 읽고 인쇄합니다. 만약 A = 1
그 IP는 읽기, 다시 첫 번째 라인을 통과 B
,하지만은 +
않은 두 개의 메모리가가하는 모든 현재 값을 재설정 그래서 가장자리를 추가 0
, 그래서 !
항상 인쇄 0
.
이것에 대한 6 바이트 대안이 많이 있습니다 (총 42 개). 첫째, 위와 동등한 솔루션이 많이 있습니다. 우리는 다시 사이에서 자유롭게 선택할 수 |
와 >
, 그리고 +
우리에게 빈 우위를 제공 다른 명령으로 대체 할 수있다 :
"?|@!? &?|@!? '?|@!? *?|@!? +?|@!? -?|@!? ^?|@!? {?|@!? }?|@!?
"?>@!? &?>@!? '?>@!? *?>@!? +?>@!? -?>@!? ^?>@!? {?>@!? }?>@!?
또한 ]
대신에 사용할 수도 있습니다 ?
. ]
다음 1
분기 로 이동하여 (즉 , IP 선택 )이 분기는 대신 ?
오른쪽 상단 모서리의 를 다시 사용합니다 . 그것은 또 다른 18 가지 해결책을 제공합니다.
"?|@!] &?|@!] '?|@!] *?|@!] +?|@!] -?|@!] ^?|@!] {?|@!] }?|@!]
"?>@!] &?>@!] '?>@!] *?>@!] +?>@!] -?>@!] ^?>@!] {?>@!] }?>@!]
그리고 다양한 레벨의 크레이지와 다르게 작동하는 6 가지 다른 솔루션이 있습니다.
/[<@!? ?(#!@] ?(#>@! ?/@#/! [<<@!? [@$\!?
0101
: B
? ?
! @ .
. .
또 하나의 간단한 것 : read A
, read B
, print B
, terminate. 그러나 실제로 이것에 대한 대안이 있습니다. 때문에 A
단 하나의 문자입니다, 우리는 또한 그것을 읽을 수 있습니다 ,
:
,?!@
그리고 하나 ?
를 사용하고 거울을 사용하여 두 번 통과 시키는 옵션도 있습니다 .
?|@! ?>@!
0110
: 소르
? < @
! ! < _
\ ~ ( . .
. . . .
. . .
위에서 말했듯이, 이것은 측면 길이 2에 맞지 않는 유일한 게이트이므로 FryAmTheEggman과 저 자신이 손으로 쓴 솔루션이며 최적이 아닐 가능성이 높습니다. 구별해야 할 두 가지 경우가 있습니다. 경우 A = 0
제어 흐름 (이 경우 우리는 인쇄해야하기 때문에 매우 간단하다 B
)
우리는 빨간 길에서 시작합니다. ?
읽고 A
, <
제로 왼쪽으로 편향 지점이다. IP는 맨 아래로 감싼 다음 _
또 다른 미러이며 IP가 모퉁이에 도달하면 왼쪽 상단으로 감싼 다음 파란색 경로를 계속합니다. ?
읽고 B
, !
그것을 인쇄합니다. 이제 (
그것을 줄입니다. 이는 값이 양수가 아님을 보증하기 때문에 중요합니다 ( 현재 0
또는 어느 쪽이든 -1
). 그러면 IP 랩이 오른쪽 @
끝으로 이동하여 프로그램 이 종료됩니다.
A = 1
상황이 조금 까다로워 질 때 . 이 경우 우리 not B
는 그 자체로는 너무 어렵지는 않지만 print 경로를 원하지만 실행 경로는 약간 복잡합니다.
이번에 <
는 IP를 오른쪽으로 편향시킨 다음 <
미러 역할 만합니다. 따라서 IP는 동일한 경로를 거꾸로 통과하여 다시 B
만나면 읽 ?
습니다. IP가 오른쪽 구석을 감싸고 녹색 경로를 계속합니다. 다음 (~
으로 "감소, -1 곱하기" 가 발생 하여이를 교환 0
하여 1
계산합니다 not B
. \
거울 일 뿐이며 !
원하는 결과를 인쇄합니다. 그런 다음 ?
다른 숫자를 반환하려고하지만 0을 반환합니다. IP는 이제 파란색 경로의 왼쪽 하단에서 계속됩니다. (
감소, <
반영,(
IP가 모퉁이에 도달하면 현재 값이 음수가되도록 다시 감소합니다. 오른쪽 하단 대각선을 가로 질러 이동 한 다음 마지막으로 @
프로그램을 종료합니다.
0111
: 또는
? <
< @ !
. .
더 단락.
이 A = 0
경우 (빨간색 경로)는 약간 혼란 스럽습니다. 에 의해는 IP가, 왼쪽으로 편향 왼쪽 하단에 랩 도착, 즉시 반영됩니다 <
사람 및 반환 ?
읽을 B
. 그 다음의 rigt 코너에 랩 인쇄 B
로 !
하고 종료합니다.
A = 1
경우 (녹색 경로) 조금 더 간단합니다. <
우리가 단순히 인쇄 할 수 있도록 지점은 IP를 잘 편향 !
, 다시 왼쪽 상단에 포장, 및에서 종료 @
.
다른 5 바이트 솔루션은 하나만 있습니다.
\>?@!
본질적으로 동일하게 작동하지만 실제 실행 경로는 상당히 다르며 분기 대신 모서리를 사용합니다 <
.
1000
: 노
) \
! # ?
@ {
이 검색에서 내가 가장 좋아하는 프로그램 일 수 있습니다. 가장 멋진 점은이 구현이 nor
실제로 최대 5 개의 입력에서 작동 한다는 것입니다 . 나는 이것을 설명하기 위해 메모리 모델의 세부 사항에 조금 들어가야 할 것이다. 따라서 빠른 새로 고침으로 Hexagony의 메모리 모델은 개별 육각형 격자로, 각 모서리 에는 정수 값 (처음에는 모두 0)이 있습니다. 메모리 포인터 (MP)가 있으며 그 가장자리를 따라 가장자리와 방향을 나타냅니다 (현재 가장자리 앞뒤에 인접한 두 개의 가장자리가 있으며 의미있는 왼쪽 및 오른쪽 이웃이 있습니다). 다음은 MP가 빨간색으로 표시된 상태에서 사용할 가장자리의 다이어그램입니다.
먼저 두 입력이 모두있는 경우를 고려해 보겠습니다 0
.
우리는 단순히 에지 증가 회색 경로에 시작 을 에 1
있도록 #
IP로 전환 1
, 파란색 경로를하다 오른쪽 상단에서 시작. \
아무것도하지 않고 ?
입력을 읽습니다. )
입력을 증가시키는 왼쪽 상단으로 줄 바꿈합니다 . 이제 입력이 0 인 한, 결과는 1
이므로 #
아무것도하지 않습니다. 그런 다음 {
MP를 왼쪽으로, 즉 A 에서 B 로의 첫 번째 반복에서 이동합니다 . 이 에지는 여전히 초기 값이 0이므로 IP는 오른쪽 상단 모서리와 새로운 메모리 에지로 다시 랩핑됩니다. 따라서이 루프는 ?
0 을 읽는 한 계속해서 MP를 B 에서 육각형 주위로 이동시킵니다.행 C 에 D 등. ?
입력이거나 EOF이기 때문에 0을 리턴 하는지 는 중요하지 않습니다 .
이 루프를 6 번 반복 한 후 A로{
돌아갑니다 . 이번에는 가장자리가 이미 첫 번째 반복 의 값 을 유지 하므로 IP가 왼쪽 모서리로 줄 바꿈하여 대신 녹색 경로를 계속합니다. 단순히를 출력 하고 프로그램을 종료합니다.1
!
1
@
이제 입력 중 하나가 1
무엇입니까?
그런 다음 어느 시점에서 그것을 ?
읽고 증가시킵니다 . 즉, 이제 IP를 다시 전환하고 빨간색 경로의 오른쪽 모서리에서 계속 진행합니다. 다른 입력 (있는 경우)을 읽습니다. 실제로 중요하지 않으며 한 가장자리를 더 이동시킵니다. 이것은 사용되지 않은 에지 여야하므로 최대 5 개의 입력에 작동합니다. IP는 오른쪽 상단으로 감싸 져 즉시 반영되어 왼쪽 모서리로 감 깁니다. 사용하지 않는 가장자리를 인쇄하고 다시 IP로 전환합니다 . 그 IP는 여전히 남서쪽 (회색 경로)으로 가면서 기다리고 있었으므로 즉시 충돌 하고 프로그램을 종료합니다.1
)
2
#
?
{
!
0
#
0
#
@
이 게이트에는 총 7 개의 7 바이트 솔루션이 있습니다. 그중 5 개는 이것과 동일하게 작동하고 다른 명령을 사용하여 사용하지 않는 가장자리로 이동합니다 (다른 육각형 주위 또는 다른 방향으로 걸을 수 있음).
)\!#?@" )\!#?@' )\!#?@^ )\!#?@{ )\!#?@}
그리고 두 개의 입력에서만 작동하지만 실행 경로가 실제로 더 지저분한 솔루션의 또 다른 클래스가 있습니다.
?]!|<)@ ?]!|<1@
1001
: 평등
( ~
? / @
# !
또한 조건부 IP 선택을 매우 영리하게 사용합니다. 우리는 사이에 다시 구분해야 A = 0
하고 A = 1
. 첫 번째 경우에는 인쇄 not B
하고, 두 번째 경우에는 인쇄 하고 싶습니다 B
. 들어 A = 0
우리는 또한에 대한 두 경우를 구별 B
. 시작하자 A = B = 0
:
우리는 회색 길에서 시작합니다. (~
무시 될 수 있으며, IP는 (여전히 회색 경로) 왼쪽 코너에 랩과 읽기 A
와 ?
. (
그래서 우리는 얻을 감소시키고 -1
왼쪽 하단 및 IP 랩. 앞에서 말했듯이 IP를 선택하기 전에 #
모듈로 값을 취 6
하므로 -1
실제로 값은 IP를 가져 5
옵니다.이 경로는 빨간색 경로의 왼쪽 모서리에서 시작합니다. ?
읽고 B
, (
우리가 IP에 남아뿐만 아니라 있도록 감소율 5
우리가 공격 할 때 #
다시. ~
는 무효화 -1
는 IP가, 오른쪽 하단 모서리에 래핑을 인쇄하도록 1
하고 종료합니다.
경우 지금 B
입니다 1
대신, 현재의 값이 될 것입니다 0
우리가 공격 할 때 #
두 번째로 우리가 IP로 전환, 0
(녹색 경로에 현재). 즉, 히트 ?
수득 세 번째로 0
, !
그것과 출력 @
이 종료.
마지막으로 A = 1
. 이번에 #
는 처음 공격 할 때 현재 값이 이미 0 이므로 5
처음에는 IP 로 전환되지 않습니다 . 우리는 단순히 녹색 길을 계속 이어갑니다. ?
이제 0을 제공하지 않고 B
대신 반환 합니다. !
그것을 인쇄하고 @
다시 종료합니다.
이 게이트에는 총 3 바이트의 7 바이트 솔루션이 있습니다. 다른 두 개는 서로 매우 다르게 작동하며을 더 이상 사용 #
합니다. 특히 그들은 ,
(정수 대신 문자 코드를 읽는) 하나 이상의 값을 읽은 다음 해당 값 modulo 6을 사용하여 IP를 선택합니다. 예쁜 견과류입니다.
),)#?@!
?~#,~!@
1010
: B가 아님
? ?
| @ !
) .
이것은 매우 간단합니다. 실행 경로는 우리가 이미 알고있는 수평 브랜치 and
입니다. ??
읽고 A
즉시 B
. 이후에 반영 |
하고 들면 분기 B = 0
우리 바닥 지점을 실행할 것이며, 여기서 )
에 대한 값을 증분 1
한 다음, 인쇄된다 !
. 상단 분기 (있는 경우 B = 1
)에서 ?
단순히 가장자리를 재설정 0
한 다음 인쇄합니다 !
.
이 게이트에는 8 바이트의 6 바이트 프로그램이 있습니다. 그중 4 개는 >
대신 |
또는 1
대신 )
(또는 둘 다)을 사용하여 거의 동일합니다 .
??>@!) ??>@!1 ??|@!) ??|@!1
둘 ?
은 거울 때문에 두 번 사용되는 단일 을 사용합니다 . 우리가 그랬던 것처럼 부정은 어떻게 xor
하나와 (~
나 ~)
.
?>!)~@ ?>!~(@
마지막으로 두 가지 솔루션은 조건부 IP 스위치를 사용합니다. 왜 복잡한 솔루션도 작동하는 경우 간단한 방법을 사용해야하기 때문입니다.
??#)!@ ??#1!@
1011
: B는 A를 의미
\ #
? ? !
1 @
이것은 다소 정교한 IP 스위칭을 사용합니다. A = 1
이번에 는 케이스가 더 간단하기 때문에 시작하겠습니다 .
우리는 읽고 회색 경로에 시작 A
하여 ?
다음 명중 #
. 이것이 IP (녹색 경로)로 전환 되기 때문 A
입니다 . 는 즉시 IP 상단 왼쪽 감싸는 것이 판독 출력한다 (불필요하게)하고 종료한다.1
1
!
B
A = 0
일이 좀 더 흥미로워 질 때 . 먼저 고려해 봅시다 A = B = 0
:
이번에 #
는 아무것도하지 않으며 IP 0
(그 시점부터 빨간색 경로) 에 남아 있습니다 . ?
읽기 B
와 1
로 바뀝니다 1
. 왼쪽 상단에 줄 바꿈을 한 후 #
다시 맞았 으므로 결국 녹색 경로 1
를 끝내고 이전 과 같이 인쇄 하여 종료합니다.
마지막으로 (A, B) = (0, 1)
허위 경우는 다음과 같습니다.
명확성을 위해 초기 회색 경로를 제거했지만 프로그램은 같은 방식으로 시작하여 이전과 같이 빨간색 경로로 끝납니다. 이번에는 두 번째로 ?
돌아갑니다 1
. 이제 우리는 발생 1
. 이 시점에서 Hexagony에서 실제로 숫자가 수행하는 작업을 이해하는 것이 중요합니다 (지금까지는 0에서만 사용했습니다). 숫자가 발생하면 현재 값에 10을 곱한 다음 숫자가 추가됩니다. 일반적으로 소스 코드에 10 진수를 그대로 쓰는 데 사용되지만 B = 1
실제로는 값에 매핑됩니다 11
. 우리가 쳤을 때 그래서 #
,이 모듈로 촬영 6
주고를 5
따라서 우리는 IP로 전환 5
(대신 1
이전)과 파란색 경로에 계속. 타격?
세 번째는 0을 반환하므로이를 !
인쇄하고 두 번째 후에 ?
는 IP가 프로그램이 종료되는 오른쪽 하단으로 줄 바꿈됩니다.
여기에는 4 바이트의 7 바이트 솔루션이 있으며 모두 다르게 작동합니다.
#)/!?@$ <!?_@#1 \#??!1@ |/)#?@!
1100
: 아님
? (
~ ! @
. .
그냥 간단한 선형 하나를 읽어 A
와 ?
,와 부정 (~
으로 인쇄 !
와 함께 종료 @
.
하나의 대안 솔루션이 있으며 그 ~)
대신에 부정적입니다 .
?~)!@
1101
: A는 B를 의미
? .
| @ !
) .
이것은 우리가 방금 말한 반대의 의미보다 훨씬 간단합니다. 다시 같은 수평 브랜치 프로그램 중 하나입니다 and
. 경우 A
이며 0
, 그것은 단순히 증가됩니다 1
하단 지점에 인쇄. 그렇지 않으면 상단 분기가 다시 실행 되어 대신 ?
읽은 B
다음 !
인쇄됩니다.
있다 톤 주로 인해 효과가없는 작전의 자유로운 선택, 여기에 대안 (총 66 개 솔루션). 시작을 위해 위와 같은 솔루션을 우리가 할 수있는 것과 똑같은 방식으로 변화 and
시킬 수 있으며 )
, 1
다음 중에서 선택할 수도 있습니다 .
?.|@!) .?|@!) ?=|@!) =?|@!) ?_|@!) _?|@!) ?0|@!)
?.|@!1 .?|@!1 ?=|@!1 =?|@!1 ?_|@!1 _?|@!1 ?0|@!1
?.>@!) .?>@!) ?=>@!) =?>@!) ?_>@!) _?>@!) ?0>@!)
?.>@!1 .?>@!1 ?=>@!1 =?>@!1 ?_>@!1 _?>@!1 ?0>@!1
그리고 첫 번째 명령은 거의 임의로 선택 할 수있는 조건 IP 선택을 사용하여 다른 버전이있다, 사이의 선택도있다 )
과 1
이러한 옵션 중 일부는 :
"?#1!@ &?#1!@ '?#1!@ )?#1!@ *?#1!@ +?#1!@ -?#1!@ .?#1!@
0?#1!@ 1?#1!@ 2?#1!@ 3?#1!@ 4?#1!@ 5?#1!@ 6?#1!@ 7?#1!@
8?#1!@ 9?#1!@ =?#1!@ ^?#1!@ _?#1!@ {?#1!@ }?#1!@
"?#)!@ &?#)!@ '?#)!@ *?#)!@ +?#)!@ -?#)!@
0?#)!@ 2?#)!@ 4?#)!@ 6?#)!@
8?#)!@ ^?#)!@ _?#)!@ {?#)!@ }?#)!@
1110
낸드
? $
@ # )
! <
마지막 복잡한 것. 아직도 읽고 있다면 거의 다 읽었을 것입니다. :) A = 0
먼저 살펴 보자 .
?
읽고 A
우리는 때렸다 $
. 이것은 Befunge와 같은 점프 명령으로 #
, 다음 명령을 건너 뛰어에서 종료하지 않습니다 @
. 대신 IP는에서 계속됩니다 #
. 그러나 A
is 이기 때문에 0
이것은 아무것도하지 않습니다. IP 가 인쇄 되는 맨 아래 경로에서 계속 IP 주소 )
를 증가시킵니다 . 편향이 왼쪽 코너에 랩과 프로그램이 종료 오른쪽에있는 IP.1
1
<
다음으로 입력이 이루어지면 다음과 (A, B) = (1, 0)
같은 상황이 발생합니다.
그것은 본질적에서 것을 제외하고 이전과 동일 년대 #
우리가 IP로 전환 1
(녹색 경로), 그러나 이후 B
입니다 0
우리가 IP로 전환 0
우리가 쳤을 때 #
그것을 인쇄하는 두 번째 (지금 파란색 경로), 1
이전을.
마지막으로 A = B = 1
사례는 다음과 같습니다.
이번에 #
는 두 번째로도 현재 값이 그대로 유지 1
되어 IP를 다시 변경하지 않습니다. 는 <
그것을 반영하고 우리가 친 세 번째는 ?
우리는 0을 얻는다. 따라서 IP는 왼쪽 하단으로 줄 바꿈 !
하여 0을 인쇄하고 프로그램을 종료합니다.
이를 위해 총 9 바이트의 7 바이트 솔루션이 있습니다. 첫 번째 대안은 단순히 다음 1
대신 사용 합니다 )
.
?$@#1!<
그런 다음 진행중인 IP 스위칭의 양에 따라 두 가지 솔루션이 있습니다.
)?#_[!@ 1?#_[!@
이것들은 실제로 제 생각을 불렀습니다. 흥미로운 부분은 IP 전환이 지연된 조건으로 사용될 수 있다는 것입니다. 언어의 IP 전환 규칙은 현재 IP가 전환이 일어나기 전에 다른 단계를 밟는 규칙입니다. 이 단계가 코너를 통과하는 경우 현재 값은 IP로 다시 전환 할 경우 IP가 어떤 분기를 계속할 것인지 결정합니다. 입력이이면 정확히 발생합니다 A = B = 1
. 이것이 언어를 어떻게 설계했는지와 일치하지만, 스펙에 대한 이러한 의미를 결코 알지 못했기 때문에 언어가 새로운 트릭을 가르쳐 줄 때 좋습니다 : D.
그런 다음 IP 전환 량이 훨씬 더 나쁜 세 번째 솔루션이 있습니다 (비록 지연된 조건 적 효과를 사용하지는 않지만).
>?1]#!@
그리고 또 다른 것이 있습니다.
?$@#)!<
그리고 조건없는 IP 스위칭을 사용하고 대신 분기와 코너를 통해 모든 논리를 구현하는 다음과 같은 네 가지 솔루션이 있습니다.
]<?<@!) ]<?<@!1 ]|?<@!) ]|?<@!1
1111
: 사실
1 !
@ . .
. .
끝을 위해 간단한 것을 얻었습니다 : edge to 1
, print with !
, terminate with @
. :)
물론 한 가지 대안이 있습니다.
)!@
평소와 같이 Timwi의 HexagonyColorer로 생성 된 모든 제어 흐름 다이어그램 과 EsotericIDE로 메모리 다이어그램이 생성됩니다 .