이것은 엄청나게 재미있었습니다. 이 과제를 게시 해 주셔서 감사합니다.
전체 공개 :이 챌린지가 게시 될 당시에는 언어 (헥사 고니)가 없었습니다. 그러나 나는 그것을 발명하지 않았으며 언어는이 도전 (또는 다른 특정 도전)을 위해 설계되지 않았습니다.
){_2"_{\"{{""}"{'2//_.\><*\"\/_><[\]/3\'\_;|#__/(\2\'3_'}(#:|{$#{>_\//(#={/;01*&"\\_|[##={|}$_#></)]$_##|){*_.>.(/?#//~-="{}<_"=#/\}.>"%<.{#{x\"<#_/=&{./1#_#>__<_'\/"#|@_|/{=/'|\"".{/>}]#]>(_<\'{\&#|>=&{{(\=/\{*'"]<$_
육각형으로 배치 :
) { _ 2 " _ { \ "
{ { " " } " { ' 2 /
/ _ . \ > < * \ " \ /
_ > < [ \ ] / 3 \ ' \ _
; | # _ _ / ( \ 2 \ ' 3 _
' } ( # : | { $ # { > _ \ /
/ ( # = { / ; 0 1 * & " \ \ _
| [ # # = { | } $ _ # > < / ) ]
$ _ # # | ) { * _ . > . ( / ? # /
/ ~ - = " { } < _ " = # / \ } .
> " % < . { # { x \ " < # _ /
= & { . / 1 # _ # > _ _ < _
' \ / " # | @ _ | / { = /
' | \ " " . { / > } ] #
] > ( _ < \ ' { \ & #
| > = & { { ( \ = /
\ { * ' " ] < $ _
프로그램은 실제로 #
명령을 사용하지 않으므로 해당 문자를 사용하여 어떤 셀이 실제로 사용되지 않았는지 보여줍니다.
이 프로그램은 어떻게 작동합니까? 조건에 따라서. 짧은 버전 또는 긴 버전을 원하십니까?
간단한 설명
다음 설명에서“line”과“segment”의 의미를 설명하기 위해 의도 된 출력의이 해부를 고려하십시오.
segments →
│ │ │ │ │ │x lines
─┼───┼─┼─────────┼─┼───┼─ ↓
│ │ │ │ │xxx│
─┼───┼─┼─────────┼─┼───┘
│ │ │ │x│
─┼───┼─┼─────────┼─┘
│ │ │xxxxxxxxx│
─┼───┼─┼─────────┘
│ │x│
─┼───┼─┘
│xxx│
─┼───┘
x│
그 설명으로 프로그램은 다음 의사 코드에 해당합니다.
n = get integer from stdin
# Calculate the number of lines we need to output.
line = pow(2, n+1)
while line > 0:
line = line - 1
# For all segments except the last, the character to use is spaces.
ch = ' ' (space, ASCII 32)
# The number of segments in each line is
# equal to the line number, counting down.
seg = line
while seg > 0:
seg = seg - 1
# For the last segment, use x’s.
if seg = 0:
ch = 'x' (ASCII 120)
# Calculate the actual segment number, where the leftmost is 1
n = line - seg
# Output the segment
i = pow(3, number of times n can be divided by 2)
i times: output ch
output '\n' (newline, ASCII 10)
end program
긴 설명
이 색상으로 코드화 된 코드 경로 다이어그램을 참조하십시오.
왼쪽 상단에서 실행이 시작됩니다. 명령 순서 는 상당히 복잡한 경로를 추구하여 ){2'"''3''"2}?)
실행됩니다 (예 : 중복 취소 "{
등). 우리는 크림슨으로 강조 표시된 Instruction Pointer # 0으로 시작합니다. 도중에 오른쪽 상단에서 시작하여 녹색으로 칠해진 # 1로 전환합니다. IP # 2가 수레 국화 파란색 (오른쪽 가운데)으로 시작하면 메모리 레이아웃은 다음과 같습니다.
전체 프로그램에서 2a 및 2b로 표시된 모서리 는 항상 값을 가지며 2
(각각 2ⁿ⁺를 계산하고 2로 나누기 위해 사용) 3으로 표시된 모서리 는 항상 3
( 3 (을 계산하는 데 사용)입니다.
수레 국화 파란색으로 강조 표시된 첫 번째 루프에 들어가면 사업을 시작합니다. 이 루프는 명령 (}*{=&}{=
을 실행하여 값 2 to¹를 계산합니다. 루프가 종료되면 새들 브라운 경로가 생성되어 Instruction Pointer # 3으로 이동합니다. 이 IP는 단지 아래쪽 가장자리를 따라 서쪽으로 황금빛 노란색으로 변하고 곧 IP # 4로 제어를 전달합니다.
자홍색 경로는 IP # 4는 왼쪽 하단부터 감량을 신속히 진행 방법을 나타내는 선 , 설정된 채널 에 32
(스페이스 문자) 및 SEG (새로운 값)에 라인 . 우리가 실제로 2ⁿ⁺¹-1로 시작하고 결국 0 값으로 마지막 반복을 경험하는 것은 초기 감소로 인한 것입니다. 그런 다음 첫 번째 중첩 루프를 시작합니다.
우리는 분기 인디고에주의를 돌립니다. 여기서 seg 의 짧은 감소 후에 seg 가 이제 0 인 경우에만 ch가 업데이트되는 것을 볼 수 있습니다. 그런 다음 n 은 line-seg 로 설정되어 우리가 속한 세그먼트의 실제 수를 결정합니다. 즉시 이번에는 토마토의 공정한 색상으로 다른 루프에 들어갑니다.x
여기서 우리는 n (현재 세그먼트 번호)을 2로 나눌 수있는 횟수를 계산합니다. 모듈로가 0을주는 한, i 를 증가 시키고 n 을 2로 나눕니다 . 만족할 때 n 은 더 이상 나눌 수 없습니다. , 우리는 두 개의 루프를 포함하는 슬레이트 그레이로 분기합니다. 먼저 계산 한 i 의 거듭 제곱으로 3을 올린 다음 ch 를 여러 번 출력 합니다. 이 루프 중 첫 번째 루프에는[
명령을 사용하여 제어를 IP # 3으로 전환합니다.이 명령은 하단 가장자리를 따라 아기 발걸음을 내딛는 것입니다. 루프의 몸체 (3을 곱하고 감소)는 외로운 IP # 3에 의해 실행되며, 코드의 아래쪽 가장자리를 따라 끝없는 짙은 올리브 녹색 주기로 수감됩니다. 마찬가지로,이 슬레이트 회색 루프 중 두 번째 루프에는 ]
IP # 5를 활성화하여 ch 및 감소 를 출력 하는 명령이 포함되어 있습니다. 여기에 어두운 인도 빨강으로 표시됩니다. 두 경우 모두, servitude에 갇힌 명령 포인터는 한 번에 하나의 반복을 순종적으로 실행하고 IP # 4로 제어권을 양도하고 서비스가 다시 한 번 호출되는 순간을 무시합니다. 한편, 슬레이트 그레이는 자홍색과 남색 형제들과 다시 합류합니다.
세그먼트가 필연적으로 0에 도달 함에 따라 , 인디고 루프는 잔디밭 녹색 경로로 빠져 나가며, 단지 개행 문자를 출력하고 즉시 자홍색으로 다시 병합되어 라인 루프 를 계속합니다 . 라인 루프 의 최종 반복을 넘어서서 궁극적 인 프로그램 종료의 짧은 세이블 경로입니다.
(,],~3^#@~.)@]
를(1,[:,1,"0~3*])
절약합니다. 그리고 당신과 함께 확인 인 경우!
출력 문자로u:32+
대신이' #'{~
다른 하나를 저장합니다.