Hexagony , 920 (722) 271 바이트
여섯 가지 유형의 과일 고리가 있습니다. 즉 Hexagony가 된 것입니다 제작 을 위해.
){r''o{{y\p''b{{g''<.{</"&~"&~"&<_.>/{.\.....~..&.>}<.._...=.>\<=..}.|>'%<}|\.._\..>....\.}.><.|\{{*<.>,<.>/.\}/.>...\'/../==.|....|./".<_>){{<\....._>\'=.|.....>{>)<._\....<..\..=.._/}\~><.|.....>e''\.<.}\{{\|./<../e;*\.@=_.~><.>{}<><;.(~.__..>\._..>'"n{{<>{<...="<.>../
알았어 세상에, 내가 한 짓은 ...
이 코드는 이제 측면 길이 10의 육각형입니다 (19에서 시작). 아마 9 골드까지 골프를 쳤을지도 모르지만, 제 일이 여기에서 끝났다고 생각합니다 ... 참고로, 소스에 175 개의 실제 명령이 있습니다. 교차로에서 명령을 내림).
명백한 선형성에도 불구하고 코드는 실제로 2 차원입니다. Hexagony는이 코드를 일반 육각형으로 재 배열합니다 (유효한 코드이지만 모든 공백은 Hexagony에서 선택 사항 임). 여기에 펼쳐진 코드가 있습니다 ... 음 "아름다움"이라고 말하고 싶지 않습니다.
) { r ' ' o { { y \
p ' ' b { { g ' ' < .
{ < / " & ~ " & ~ " & <
_ . > / { . \ . . . . . ~
. . & . > } < . . _ . . . =
. > \ < = . . } . | > ' % < }
| \ . . _ \ . . > . . . . \ . }
. > < . | \ { { * < . > , < . > /
. \ } / . > . . . \ ' / . . / = = .
| . . . . | . / " . < _ > ) { { < \ .
. . . . _ > \ ' = . | . . . . . > {
> ) < . _ \ . . . . < . . \ . . =
. . _ / } \ ~ > < . | . . . . .
> e ' ' \ . < . } \ { { \ | .
/ < . . / e ; * \ . @ = _ .
~ > < . > { } < > < ; . (
~ . _ _ . . > \ . _ . .
> ' " n { { < > { < .
. . = " < . > . . /
설명
나는이 골프 버전에서 모든 복잡한 실행 경로를 설명하려고 시도하지는 않지만 알고리즘과 전반적인 제어 흐름은이 ungolfed 버전과 동일하므로 알고리즘을 설명한 후에 정말 궁금한 점을 연구하기가 더 쉽습니다.
) { r ' ' o { { \ / ' ' p { . . .
. . . . . . . . y . b . . . . . . .
. . . . . . . . ' . . { . . . . . . .
. . . . . . . . \ ' g { / . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . > . . . . < . . . . . . . . .
. . . . . . . . . . . . . . > . . ) < . . . . .
. . . . . . . . . . / = { { < . . . . ( . . . . .
. . . . . . . . . . . ; . . . > . . . . . . . . . <
. . . . . . . . . . . . > < . / e ; * \ . . . . . . .
. . . . . . . . . . . . @ . } . > { } < . . | . . . . .
. . . . . / } \ . . . . . . . > < . . . > { < . . . . . .
. . . . . . > < . . . . . . . . . . . . . . . | . . . . . .
. . . . . . . . _ . . > . . \ \ " ' / . . . . . . . . . . . .
. . . . . . \ { { \ . . . > < . . > . . . . \ . . . . . . . . .
. < . . . . . . . * . . . { . > { } n = { { < . . . / { . \ . . |
. > { { ) < . . ' . . . { . \ ' < . . . . . _ . . . > } < . . .
| . . . . > , < . . . e . . . . . . . . . . . . . = . . } . .
. . . . . . . > ' % < . . . . . . . . . . . . . & . . . | .
. . . . _ . . } . . > } } = ~ & " ~ & " ~ & " < . . . . .
. . . \ . . < . . . . . . . . . . . . . . . . } . . . .
. \ . . . . . . . . . . . . . . . . . . . . . . . < .
. . . . | . . . . . . . . . . . . . . . . . . = . .
. . . . . . \ . . . . . . . . . . . . . . . . / .
. . . . . . > . . . . . . . . . . . . . . . . <
. . . . . . . . . . . . . . . . . . . . . . .
_ . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
솔직히 첫 번째 단락에서 나는 반 농담이었습니다. 우리가 6 가지 요소의주기를 다루고 있다는 사실은 실제로 큰 도움이되었습니다. Hexagony의 메모리 모델은 무한 육각형 그리드로, 그리드의 각 가장자리에는 0으로 초기화 된 부호있는 임의 정밀도 정수가 포함됩니다.
이 프로그램에서 사용한 메모리의 레이아웃 다이어그램은 다음과 같습니다.
왼쪽의 긴 직선 비트 a
는 문자 r 과 관련된 임의의 크기 의 0으로 끝나는 문자열로 사용됩니다 . 다른 문자의 파선은 같은 종류의 구조를 나타내며 각 구조는 60도 회전합니다. 처음에 메모리 포인터는 1 이라고 표시된 가장자리를 가리키고 북쪽을 향합니다.
코드의 첫 번째 선형 비트는 모서리의 내부 "별"을 문자 roygbp
로 설정하고 초기 모서리를로 설정 1
하여주기가 끝나고 시작되는 위치 ( p
및 사이 r
)를 알 수 있도록합니다.
){r''o{{y''g{{b''p{
그런 다음 1 이라고 표시된 가장자리로 돌아갑니다 .
이제 알고리즘의 일반적인 아이디어는 다음과 같습니다.
- 주기의 각 문자에 대해 STDIN에서 문자를 계속 읽고 현재 문자와 다른 경우 해당 문자와 연관된 문자열에 추가하십시오.
- 현재 찾고있는 문자를 읽을 때 ?
e
라고 표시된 모서리에를 저장합니다 . 사이클이 완료되지 않는 한이 캐릭터도 먹어야한다고 가정해야합니다. 그런 다음 고리 주위를 순환하면서 다음 문자로 이동합니다.
- 이 프로세스가 중단 될 수있는 두 가지 방법이 있습니다.
- 어느 쪽이든 우리는주기를 완료했습니다. 이 경우 싸이클을 통해 또 다른 빠른 라운드를 수행
e
하여 ? 와 가장자리 n
들, 이제 우리는 그주기가 목걸이에 남아 원하기 때문에. 그런 다음 인쇄 코드로 넘어갑니다.
- 또는 EOF (음수 문자 코드로 인식)를 누르십시오. 이 경우 음수 값을 ? 현재 문자의 가장자리 (그래서 우리는 쉽게 모두 구별 할 수
e
와 n
). 그런 다음 인쇄 코드로 이동하기 전에 잠재적으로 불완전한 사이클의 나머지 부분을 건너 뛰기 위해 1 에지를 검색 합니다.
- 인쇄 코드는주기를 다시 반복합니다.주기의 각 문자에 대해 문자를 인쇄하는 동안 저장된 문자열을 지 웁니다
e
. 그런 다음 ?로 이동합니다 . 캐릭터와 관련된 가장자리. 그것이 부정적이라면, 우리는 단순히 프로그램을 종료합니다. 긍정적 인 경우 간단히 인쇄하여 다음 문자로 넘어갑니다. 주기를 마치면 2 단계로 돌아갑니다.
흥미로운 또 다른 점은 임의 크기의 문자열을 구현 한 방법입니다 (Hexagony에서 무제한 메모리를 사용한 것은 처음이기 때문입니다).
우리는 우리가 여전히에 대한 문자를 읽고 어떤 점에있어 상상 R (같이 우리가 그림을 사용할 수 있도록) 및 A [0] 과 1은 이미 그 모든 것을 북서 여전히 제로 (문자로 가득 차있다 ). 예를 들어 입력 의 처음 두 문자 를 해당 가장자리로 읽은 다음 이제는을 읽습니다 .og
y
새로운 문자는로 읽어 에서의 가장자리. 우리는 ? 에지는이 문자가 같은지 여부를 확인한다 r
. (여기에는 멋진 트릭이 있습니다. Hexagony는 긍정적이고 비 긍정적으로 쉽게 구별 할 수 있으므로 빼기를 통해 평등을 확인하는 것은 성가 시며 적어도 두 개의 분기가 필요합니다. 그러나 모든 글자는 서로 2 배 미만입니다 모듈로를 사용하여 값을 비교할 수 있습니다. 모듈로가 같으면 0 만 제공합니다.)
때문에 y
다른 r
, 우리의 왼쪽 (라벨이없는) 가장자리 이동 의를 하고, 복사 y
가. 우리가있을 때까지 우리는 이제 더 때마다 문자 하나 가장자리를 복사, 육각 주위에 더 이동 y
의 에지 반대에 에서 . 그러나 이제는 [0] 에 덮어 쓰고 싶지 않은 문자가 이미 있습니다. 대신 y
다음 육각형 주위를 "끌어" 1을 확인 합니다 . 그러나 거기에도 캐릭터가 있으므로 다른 육각형을 더 나아갑니다. 이제 a [2] 는 여전히 0이므로y
그것에. 메모리 포인터는 이제 스트링을 따라 내부 링을 향해 뒤로 이동합니다. a [i] 사이의 (레이블이없는) 모서리 가 모두 0 인 반면 , 문자열의 시작 부분에 도달 한 시점을 알고 있습니다 . 긍정적입니다.
이것은 아마도 Hexagony에서 사소한 코드를 작성하는 데 유용한 기술 일 것입니다.