이것은 놀랍게도 까다 롭고 최적이라고 확신하지 않습니다 ...
<.@!$?
코드를 채우고 펼친 후에는 다음 16 진 격자를 나타냅니다.

이것은 최근 오류없는 고양이 프로그램과 유사한 제어 흐름을 사용하여 대각선을 따라 움직입니다. 이를 위해 명령 포인터 (IP)를 왼쪽으로 편향하여 시작합니다. 여기서 자주색 경로는 왼쪽 아래 모서리로 둘러싸입니다.
?입력을 정수로 읽습니다. !다시 인쇄합니다. .그냥 no-op입니다. 이제 그리드의 코너는 브랜치 역할을합니다.
입력이 0이면 IP는 빨간색 경로를 따라 계속 진행하며로 간단히 프로그램을 종료합니다 @.
입력이 1이면 IP는 녹색 경로에서 계속됩니다. 다시 말하지만, .no-op이지만 $Befunge의 트램펄린과 같습니다. 다음 명령을 건너 뜁니다. 줄 바꿈 후 다음 명령은 ?이지만 $실행 으로 인해 실제로 파란색 경로에서 계속 진행되어 !다른 사본을 인쇄합니다 1. 포함하는이 루프 !..$는 이제 무한정 반복됩니다.
Hexagony의 제어 흐름에 대한 연구 ...
위의 솔루션이 최적이라고 생각합니다. I는 포함 된 모든 6 바이트 Hexagony 프로그램을 검사하는 짐승 포서를 작성한 적어도 하나의 각 ?!@(필요한되는, I는 확인한 :과 %대신 @분할 0으로 에러로 종료 할 수 있지만 그것도 도움이되지 않았습니다). 이 검사는 a) 0입력시 생성 0및 종료 및 b) 최소 2 1초 (및 기타) 를 생성하고 프로그램의 처음 60 틱 (5 바이트 솔루션의 경우 200 틱) 내에 종료 되지 않는 모든 프로그램을 인쇄합니다. . 유효한 솔루션이 작은 눈금에 첫 번째 0또는 두 번째를 올바르게 인쇄하는 데 200 틱 이상이 걸릴 것이므로 의심되는 솔루션을 1놓친 것으로 생각하지 않습니다.
검색 결과 5 바이트에 대한 결과는 나오지 않았지만 6 바이트에 대해서는 57 개의 결과가 나타 @났습니다 (사용 ; 동일한 양의 바이트에서이 문제를 깨끗하게 해결할 수 있다면 오류로 종료 할 필요가 없습니다). 그 중 57 명 중 6 명만이 실제로는 2 초만 인쇄 1한 다음 더 이상 인쇄하지 않고 무한 루프에 들어갔습니다. 하나의 솔루션에는 두 개의 !명령 이 포함되어 있기 때문에 두 번 나열되었습니다 . 정확히 50 개의 유효한 솔루션이 남습니다.
하나 또는 두 개의 문자가 실질적으로 유효하지 않은 솔루션 사이에는 어느 정도의 퇴화가 있습니다. 솔루션은 23 개의 진정으로 구별되는 프로그램 세트로 그룹화 할 수 있습니다 (일부 경우 두 세트간에 문자 차이가 하나 뿐이지 만 제어 흐름이 크게 변경되므로 별도로 계산했습니다). 두 그룹은 예상치 못한 방식으로 여러 명령 포인터를 사용하기도합니다. 가지와 거울을 사용하는 이러한 방법 중 대부분을 생각해 낼 수 없었기 때문에 Hexagony에서 어떤 종류의 제어 흐름이 가능한지에 대해 매우 흥미로운 연구를하고 미래 골프에 대한 몇 가지 새로운 트릭을 확실히 배웠습니다.
전체 제어 흐름은 거의 항상 동일합니다 : 숫자를 읽고, 그것을 인쇄 할 수 있습니다. 에 0대한 방법을 찾으면을 @계속 반복하지 않으면 !가장자리 값을 유지 1합니다. 다음과 같은 네 가지 예외가 있습니다.
- 하나의 솔루션 (두 개가있는 솔루션
!) 1은 그리드를 통해 반복 당 2 초를 인쇄하므로 대부분의 프로그램보다 약 2 배 빠릅니다. 나는 이것을 x2아래에 표시했습니다 .
- 몇 가지 솔루션 (AN을 함유하는 사람들은
o)를 교체 1로모그래퍼 111(문자 코드 o), 그래서 그들은 인쇄 세 1 들이 프로그램의 대부분만큼 빠르게 세 번에 대해 인쇄하고, 반복 당들. x3아래에 이것을 표시했습니다 .
- 두 가지 솔루션 이 각 반복에서 모서리 값에 a 를 추가 합니다
1(따라서 1-> 11-> 111-> ...). 인쇄 속도가 매우 빠르지 만 결국 메모리가 부족합니다. OoM아래에 이것을 표시했습니다 .
- 두 가지 솔루션은 매우 타이트한 루프로 들어가서 단지 앞뒤로 튀어 오를
!때마다 매 5 초 대신에 다른 모든 틱에 인쇄하여 조금 더 빠르고 깔끔하게 만듭니다. ><아래에 이것을 표시했습니다 .
전체 동물원은 다음과 같습니다.
#1 #5 #12 #19
?!/$.@ ?$!>$@ .?!/$@ |!|?$@ # ><
?!/$1@ # OoM ?$!|$@ =?!/$@
?!/$=@ #20
?!/$\@ #6 #13 $@.?<!
?!/$o@ # x3 ?/!<|@ .?/!$@ $@1?<! # OoM
?!/$!@ # x2 =?/!$@ $@=?<!
#7 $@o?<! # x3
#2 ?\!<|@ #14
?!>$)@ \!?__@ #21
?!>$1@ #8 _>_!?@
?!>$o@ # x3 ?<!>$@ # >< #15
?!|$)@ \_?!$@ #22
?!|$1@ #9 <!@.$?
?!|$o@ # x3 ?\$!@$ #16 <!@/$?
\_?!_@ <!@=$?
#3 #10 <$@!$?
?!|)$@ ?~#!@) #17 <.@!$?
?!|1$@ ?~#!@1 $$?\@! </@!$?
?!|o$@ # x3 <=@!$?
#11 #18
#4 ?$)\@! \$?\@! #23
?_!<@> ?$1\@! <<@]!?
?$o\@! # x3
다음은 소수의 대표적인 그룹을위한 간단한 설명입니다. 특히 그룹 10과 23은 체크 아웃 할 가치가 있습니다. 다른 그룹에는 다른 흥미롭고 복잡한 경로가 많이 있지만 이것의 끝에서 나는 당신을 충분히 지루하다고 생각합니다. 실제로 Hexagony를 배우고 싶은 사람에게는 거울과 거울의 더 많은 사용을 보여주기 때문에 조사 할 가치가 $있습니다.
그룹 1
이것은 원래의 솔루션보다 훨씬 정교하지는 않지만 경로는 다른 방향으로 진행됩니다. 또한 가장 오른쪽에있는 no-op를 5 가지 명령으로 대체하여 구조를 변경하지 않고도이를 유효하게 만들 수 있으므로 단일 셀에서 가장 많은 변형을 허용합니다.

그룹 2
이것은 수평으로 만 움직이므로 매우 흥미 롭습니다. 로 줄 바꿈 >하면 IP가 즉시 반전되어 구석에 지점이 생깁니다. 다이어그램이 완전히 보이지는 않지만 1우리 의 경우 첫 번째 행을 다시 통과하지만 이번에는 뒤로 이동합니다. 이것은 또한 우리가 ?다시 뛰어 들어 0(EOF)를 반환 한다는 것을 의미 합니다 . )인쇄를 유지하기 위해 (증가)로 고정됩니다 1. 이것은 또한으로, 5 변화를 가지고 )도 될 수있다 1또는 o, 및 >도 될 수있다 |:

그룹 3
이것은 이전과 거의 동일하게 보이지만 지옥처럼 지저분합니다. |맨 아래 줄 을 치고 다시 가로 지르는 것은 동일합니다. 그러나 루프의 경우 $이제 미러 ) 로 건너 뜁니다 . 그래서 우리는 건너 뛰기, 현재 증가에 충돌, 오른쪽에있는 청록색 경로를 따라 @우리는 주위에 포장하기 전에 | 다시 및 다음 상단에있는 녹색 경로로 돌아갑니다.

그룹 4
나는 이것이 특히 멋 졌다고 생각했다.

_오른쪽 상단 의 미러는 처음에는 작동하지 않으므로로 인쇄하고 !를 누르십시오 <. 0경로는 이제 수평 거울을 명중하고 종료합니다. 1경로는 정말 흥미로운 궤적을 취합니다 . 경로는 아래로 휘어지고, 줄 바꿈되어 !가로 방향으로 리디렉션 된 다음 다시 줄 바꿈 ! 됩니다 . 그런 다음이 마름모 모양으로 계속 움직이면서 반복 당 두 번 인쇄됩니다 (3 번째 틱마다).
그룹 8
이것은 매우 엄격한 인쇄 루프를 가진 두 가지 솔루션 중 하나입니다.

<분기와 같은 역할을합니다. 두 번 포장 한 후, 0히트 @. 1반면에, 우선은 생략 ?하고 >상기에 보낸다 $즉 스킵하므로, 다시 @. 그런 다음, IP는 앞뒤로 사이 청록색 반송 경로로 래핑 >하고 <(그 사이의 에지 주위에 배치).
그룹 10
다른 명령 포인터를 사용하는 두 그룹 중 하나이며 절대적으로 아름답습니다. Hexagony에는 6이 있습니다-각각은 시계 방향 가장자리를 따라 다른 모서리에서 시작하지만 한 번에 하나만 활성화됩니다.

평소처럼, 우리는로 읽습니다 ?. 이제 ~단항 부정이다 : 그것은 변 1로 -1. 다음으로을 누르십시오 #. 이것은 IP 사이를 전환하는 한 가지 방법입니다. 현재 에지 값 모듈로 6을 가져와 해당 IP로 전환합니다 (IP는 0시계 방향으로 번호가 매겨 짐 ). 따라서 입력이 0이면 IP는 그대로 유지되며 지루하게 직선으로 이동합니다 !@. 그러나 입력이 1이면 현재 값은 -1입니다 5 (mod 6). 그래서 우리는 동일한 셀 (녹색 경로)에서 시작하는 IP로 전환합니다. 이제 #no-op이며 ?메모리 에지를로 설정합니다 0. )증가하므로 !a를 인쇄합니다 1. 이제 우리는 ~다시#프로그램을 종료하는 IP 1로 전환하는 것과 달리 여전히 작동하지 않습니다. 이 작은 프로그램에서 모든 것이 얼마나 잘 어울리는 지 생각이 듭니다.
그룹 22
참고로 이것은 원래 솔루션이 속한 그룹입니다. no-op은 두 개의 다른 위치에있을 수 있으며 실제 (효과적인 no-op) 명령에 대한 몇 가지 선택이 있기 때문에 가장 큰 그룹이됩니다.
그룹 23
여러 IP를 사용하는 다른 그룹입니다. 실제로 이것은 3 개의 다른 IP를 사용합니다. 오른쪽 상단은 약간 엉망이지만이 과정을 안내해 드리겠습니다.

따라서 이전에 본 시작 : <북동쪽을 편향하고 ?입력을 읽습니다. 이제 ]IP를 변경하는 또 다른 방법은 시계 방향으로 다음 IP를 제어하는 것입니다. 그래서 우리는 제어를 남동쪽으로가는 북동쪽 모퉁이에서 시작하는 청록색 경로로 전환합니다. <북동쪽으로 가면서 남동쪽 코너로 포장되도록 즉시 반영됩니다 . 그것은 또한 (가) 히트 ]그래서 우리는 전환 다음 IP. 이것은 동쪽 모서리에서 시작하여 남서쪽으로가는 회색 경로입니다. 입력을 인쇄 한 다음 북동쪽 모서리로 줄 바꿈합니다. <경로를 수평으로 편향시켜 다른 방향으로 경로를 반영합니다 <. 이제 오른손<입력이 0이면 IP가 북동쪽으로 이동하고으로 래핑됩니다 @. 입력이 1이면 IP !가로 <이동하여 반영되는 레프-스 랜드 로 랩핑합니다 . 이제 코너에서 다시로 랩핑 !하고 오른쪽으로 편향되어 <왼쪽으로 반사되고 <경로가 시작됩니다. 위에...
꽤 엉망이지만 아름다운 엉망입니다. :)
Timwi의 놀라운 HexagonyColorer로 생성 된 다이어그램 .