이것은 놀랍게도 까다 롭고 최적이라고 확신하지 않습니다 ...
<.@!$?
코드를 채우고 펼친 후에는 다음 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로 생성 된 다이어그램 .