Fueue는 실행중인 프로그램 이 큐인 큐 기반 esolang입니다 .
)$$4255%%1(~):[)$$24%%0:<[~:)~)]~[$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]](H-):~:[)[):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]~:](106328966328112328136317639696111819119696281563139628116326221310190661962811611211962861109696289611619628116111612896281115421063633063961111116163963011632811111819159628151213262722151522061361613096119619190661966311961128966130281807072220060611612811961019070723232022060611
온라인으로 사용해보십시오!
작동 원리
이 설명 은 방해 가되었을 수도 있고 아닐 수도 있습니다 . 반면에 사람들이 따라갈 수있는 방법으로 더 짧게 설명 하는 방법을 모르겠습니다.
푸에 치트 시트
이 프로그램에서 사용되지 않는 몇 가지 기능을 포함하여 자세한 내용 은 esolang 위키 기사 를 참조하십시오 .
실행 추적 구문
숫자 사이를 제외하고 Fueue에서 공백은 선택 사항입니다. 다음 실행 추적에서는 특히 프로그램 구조를 제안하는 데 사용됩니다.
- 함수가 실행될 때 함수와 그 인수는 공백이있는 주변 요소에서 시작됩니다. 인수 중 일부가 복잡하면 이들 사이에도 공백이있을 수 있습니다.
- 많은 실행 추적은 실질적인 데이터 조작을 수행하는 부분에서 오른쪽으로 분리 된 왼쪽의 "지연 블롭"으로 나뉩니다. 다음 섹션을 참조하십시오.
괄호 {}(Fueue에서 사용되지 않음)는 수학 표현식의 정수 결과를 나타 내기 위해 트레이스에 사용됩니다. Fueue에는 음이 아닌 리터럴 만 있기 때문에 음수를 포함합니다 – -부정 함수입니다.
다양한 메타 변수 이름으로 ...값과 약어를 나타냅니다.
전술 지연
직관적으로 실행은 큐 주위를 순환하며 통과하는 내용을 부분적으로 수정합니다. 다음 사이클까지는 기능 결과를 다시 실행할 수 없습니다. 프로그램의 다른 부분은 상호 작용하지 않는 한 효과적으로 병렬로 진화합니다.
결과적으로 많은 코드가 동기화, 특히 프로그램의 일부 부분을 적시에 실행 지연시키는 데 전념합니다. 골프를 타기위한 많은 옵션이 있는데,이 부분을 읽을 수없는 얼룩으로 바꾸는 경향이 있는데,주기별로 실행주기를 추적해야만 이해할 수 있습니다.
이러한 전술이 아래에서 항상 개별적으로 언급되는 것은 아닙니다.
)[A]A사이클 지연 . (아마도 가장 쉽고 읽기 쉬운 방법 일 것입니다.)
~ef엘리먼트를 스왑 e하고 f또한 실행을 지연한다. (아마도 읽기는 쉽지 않지만 약간의 지연이있는 경우에는 가장 짧습니다.)
$1e단일 요소를 지연시킵니다 e.
-및 %숫자를 지연하는 데 유용합니다 (위해 후자를 0하고 1.)
- 여러 개의 동일한 요소를 연속으로 지연
:시키거나 하나의 요소 $로 만드는 데 사용할 수 있습니다.
(nn브래킷으로 감싸서 나중에 편리하게 제거 할 수 있습니다. 이것은 숫자 계산에 특히 중요합니다. 숫자는 블록에 넣지 않고 복사하기조차 너무 불안정하기 때문입니다.
전반적인 구조
나머지 설명은 각각 실행중인 프로그램 섹션에 대해 7 개의 부분으로 나뉩니다. 대부분의 사이클이 반복 된 이후의 더 큰 사이클은 전체 큐를 통한 단일 패스의 "사이클"과 구별하기 위해 "반복"이라고합니다.
초기 프로그램이 그들 사이에서 어떻게 나누어지는가는 다음과 같습니다.
A: )$$4255%%1(~
B: ):[)$$24%%0:<[~:)~)]~[$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]
C:
D: (H-
E:
F:
G: ):~:[)[):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]~:](106328966328112328136317639696111819119696281563139628116326221310190661962811611211962861109696289611619628116111612896281115421063633063961111116163963011632811111819159628151213262722151522061361613096119619190661966311961128966130281807072220060611612811961019070723232022060611
프로그램의 끝에서 큰 숫자는 각각의 ASCII 값으로부터 감산 30 반대로 나머지 문자 당 두 자리, 부호화 (예 그래서이 10인코딩 ().
높은 수준에서이 프로그램의 데이터 (bignum으로 시작)를 오른쪽에서 왼쪽으로 흐르는 것으로 생각할 수 있지만 제어는 왼쪽에서 오른쪽으로 흐르는 것으로 생각할 수 있습니다. 그러나 하위 레벨에서 Fueue는 항상 코드와 데이터의 구별을 방해합니다.
- 섹션 G는 큰 숫자를 ASCII 숫자 (예 :
0정수로 숫자)로 디코딩하여 48가장 작은 유효 숫자를 먼저 분리합니다. 15 사이클마다 한 자리 숫자를 생성합니다.
- 섹션 F는 섹션 E가 사용할 수있을 때까지 생성 된 숫자 ASCII 값 (각 블록 내부)을 포함합니다.
- 섹션 E는 생성 된 자릿수를 한 번에 두 개씩 처리하여 양식 블록으로
[x[y]]쌍을 이루며 각 쌍의 인코딩 된 문자를 인쇄합니다.
- 섹션 D는
[x[y]]모든 숫자를 포함하고 나면 모든 블록을 인쇄 한 다음 전체 프로그램을 중지 할 수있는 방식으로 블록에서 점진적으로 중첩 된 블록으로 구성됩니다 .
- 섹션 C는 섹션 D의 구성을 처리하고 섹션 E를 재생성합니다.
- 섹션 B는 섹션 C와 30 사이클마다 자체를 다시 생성합니다.
- 섹션 A는 다른 섹션의 마지막 반복까지 사이클을 카운트 다운합니다. 그런 다음 섹션 B를 중단하고 섹션 D를 실행합니다.
섹션 A
섹션 A는 프로그램 종료 일정을 처리합니다. 단일 스왑 기능으로 축소하는 데 4258 사이클이 걸리며 ~, 그러면 메인 루프를 멈추고 섹션 D를 대신 실행하는 섹션 B를 조정합니다.
)$ $4255% %1 (~
)$%%%...%% %0 [~]
)$%%%...% %1 [~]
⋮
)$ %0 [~]
) $1[~]
)[~]
~
$함수는 다음의 4,255 카피를 작성 %하면서 (감싸는 ~괄호이다.
- 마지막으로 각주기
%사이에 다음 수를 전환까지 사용 0하고 1.
- 모든
%s가 다 사용 되면 $11 개의 사본 [~](효과적으로 NOP)이 작성되고 다음주기 )에서 대괄호 가 제거됩니다.
섹션 B
섹션 B는 30 사이클마다 섹션 C의 새로운 반복뿐만 아니라 자체 재생을 처리합니다.
) : [)$$24%%0:<[~:)~)]~[$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]
) [)$$24%%0:<[~:)~)]~[$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]] [BkB]
)$ $24% %0 :< [~:)~)] ~ [$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<] [BkB]
)$ %...%%% %1 < < [~:)~)] [BkB] [$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]
)$ %...%% %0 < [~:)~)[BkB]] [$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]
)$ %...% %1 [~:)~)[BkB][$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]
⋮
) $1 [~:)~)[BkB][$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]
) [~:)~)[BkB][$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]] (1)
~:) ~)[BkB] [$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]
) : [BkB] ) [$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<] (2)
) [BkB] [BkB] $11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<
- A
:는 다음에 나오는 큰 블록을 복제하고 (하나는 약자로 줄여서 [BkB]) )첫 번째 사본에서 괄호 를 제거합니다.
$$24%%0 섹션 A의 카운트 다운과 유사한 카운트 다운을 설정합니다.
- 이 카운트 다운 동안
:<으로 전환 <<하고, ~스왑 블록이, 마지막으로 새로운 섹션 C에 대한 코드를 배치.
- 두
<함수는 두 개의 마지막 블록을 첫 번째 블록으로 묶습니다. 이것은 정상적인 반복에서는 중복되지만 ~섹션 A부터 끝까지 작업을 수행 할 수 있습니다.
- (1) 카운트 다운이 끝나면
)외부 브래킷 이 제거됩니다. 다음 ~:)으로 변 ):과 ~)스왑 )섹션 C 코드의 시작.
- (2) 섹션 B는 이제 초기 사이클로 돌아 왔으며, a
)는 섹션 C의 새로운 반복 실행을 시작하기 위해 브래킷을 제거하려고합니다.
마지막 반복 ~에서 시작 섹션 A가 위의 (1) 지점에 나타납니다.
~ ) [~:)~)[BkB][$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]] (1)
[~:)~)[BkB][$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]] )
~스와프 )에서 부 B 방지 블록에 걸쳐 부 및 C로 다시 실행된다.
섹션 C
섹션 C는 새로운 숫자 문자 쌍을 섹션 D의 블록으로 병합하고 섹션 E의 새로운 반복 생성을 처리합니다.
아래는 전형적인 반복 표시 x와 y숫자 'ASCII 코드를 표시합니다. 첫 번째 반복에서, 들어오는 "D"및 "E"요소는 초기 [H]이며 -대신에 모든 문자 문자 쌍을 생성하기 위해 이전 섹션 E가 실행되지 않았기 때문입니다.
C D E
$11~ ) ~<[[+$4--498+*-:~-10)):])<~] [)))~] < [)))~[...]] [x[y]]
~~~ ~~~ ~~~ ~~) [[+$4--498+*-:~-10)):])<~] < [)))~] [)))~[...][x[y]]]
~~~ ~~~ ) ~ [[+$4--498+*-:~-10)):])<~] [)))~[)))~[...][x[y]]]]
~~~ ~ ) [)))~[....]] [[+$4--498+*-:~-10)):])<~]
~~[)))~[....]] )[[+$4--498+*-:~-10)):])<~]
[)))~[....]] ~[+$4--498+*-:~-10)):])<~
- 이것은이 답변에 대해 발견 한 다른 동기화 방법을 사용합니다.
~한 행에 여러 개의 스왑 기능 이있는 경우 행은 각주기마다 약 2/3로 줄어들지 만 (1 ~개는 2 개의 스왑 때문에 ) 때때로 ~s 의 나머지 부분이 있으면 뒤 따르는 내용 을 신중하게 조작합니다.
$11~그런 행을 생성합니다. 다음 ~스왑 a를 <다음 블록에서. <마지막에 또 다른 숫자는 새로운 숫자 쌍 블록 (숫자 x와 y를 ASCII 코드로)을 D 블록에 추가합니다.
- 다음 사이클에서
~행에 ~~나머지 ~가 있으며 다음 을 대체합니다 ). 다른 하나 <는 섹션 D를 [)))~]블록에 추가합니다 .
- 다음으로 스왑 된
~자체는 다음 블록을 섹션 D 블록에서 새로운 섹션 E 코드로 교체 합니다. 그런 다음 새로운 나머지는 ~스왑 )에 걸쳐, 그리고 마지막으로 마지막 ~~에서 ~의인으로 섹션 E를 통해 그들의 행 스왑 하나 )의 브라켓을 제거했습니다.
마지막 반복에서 섹션 A가 섹션 B와 섹션 C를 ~교체했습니다 ). 그러나 섹션 C는 너무 짧아서 이미 사라져서 )섹션 D의 시작 부분으로 끝납니다.
섹션 D
섹션 D는 마지막 큰 숫자 인쇄 및 프로그램 중지를 다룹니다. 대부분의 프로그램이 실행되는 동안 B–G 섹션이 빌딩에 대해 협력하는 것은 비활성 블록입니다.
(H -
[H]-
⋮
[)))~[H-]] After one iteration of section C
⋮
[)))~[)))~[H-][49[49]]]] Second iteration, after E has also run
⋮
) [)))~[...]] [49[48]] Final printing starts as ) is swapped in
))) ~[...][49[48]]
)) )[49[48]] [...]
)) 49 [48][...] Print first 1
) )[48] [...]
) 48 [...] Print 0
)[...] Recurse to inner block
...
⋮
)[H-] Innermost block reached
H - Program halts
- 프로그램의 첫 번째 사이클
(에서 멈춤 기능 H은 괄호로 묶습니다. A -는 숫자 쌍 대신 첫 번째 반복의 더미 요소로 사용됩니다.
- 숫자
[49[49]]의 마지막 11에 해당하는 첫 번째 실수 자리 쌍은입니다 .
- 맨 마지막 디지트 쌍
[49[48]](에 대응하는 10부호의 시작 부분)은 실제로 블록에 포함되지 않고,이 같은 차이는 없습니다 )[A[B]]및 )[A][B]양쪽으로 선회, 동일 A[B].
최종 반복 후, )섹션 B에서 오른쪽으로 교체 된 섹션이 도착하고 섹션 D 블록이 차단 해제됩니다. )))~각 서브 블록의 시작 부분에 모든 부품이 올바른 순서로 실행되어 있는지 확인합니다. 마지막으로 가장 안쪽 블록에는 H프로그램을 정지시키는 것이 포함됩니다.
섹션 E
섹션 E는 섹션 G에 의해 생성 된 ASCII 숫자 쌍의 결합을 처리하고, 둘 다 해당 인코딩 된 문자를 인쇄하고 결합 된 쌍이있는 블록을 섹션 C 및 D로 보냅니다.
다시 아래는 숫자의 ASCII 코드를 사용 x하고 y나타내는 전형적인 반복을 보여줍니다 .
E F
~ [+$4--498+*-:~-10)):] ) < ~ [y] [x]
) [+$4--498+*-:~-10)):] < [x] [y]
+ $4- - 498 +*- :~ -10 ) ) : [x[y]]
+--- -{-498} +*- ~~{-10} ) ) [x[y]] [x[y]]
+-- - 498 +* -{-10} ~ ) x [y] [x[y]]
+- -{-498} + * 10 x )[y] [x[y]]
+ - 498 + {10*x} y [x[y]]
+ {-498} {10*x+y} [x[y]]
{10*x+y-498} [x[y]]
[x[y]]
- 수신 숫자 블록이 교환 된 다음 y 블록이 x 블록에 추가되고 전체 쌍 블록이 복사됩니다. 섹션 C와 D의 끝까지 하나의 사본이 남습니다.
- 다른 사본은 다시 차단 해제되고, 일련의 산술 함수가 적용되어
10*x+y-498인코딩 된 문자의 ASCII 값 을 계산 합니다. 498 = 10*48+48-30의 48들의 ASCII 인코딩을 취소 x하고 y그동안 30의 인코딩 변화 00–99로 30–129모든 인쇄 가능한 ASCII를 포함한다.
- 결과 숫자는 실행 상태로 남아 문자를 인쇄합니다.
섹션 F
섹션 F는 ASCII 숫자 코드를 포함하는 비활성 블록으로 구성됩니다. 섹션 E는 G가 프로그램을 생성하는 것과 동일한 속도로 프로그램을 소비하기 때문에 대부분의 프로그램 실행에는 최대 2 개가 있습니다. 그러나 최종 인쇄 단계에서 일부 중복 0숫자가 여기에 수집됩니다.
[y] [x] ...
섹션 G
섹션 G는 프로그램의 끝에서 큰 숫자를 나누고, 유효 숫자를 가장 먼저 빼고, ASCII 코드가있는 블록을 다른 섹션으로 왼쪽으로 보내는 것을 처리합니다.
정지 점검이 없으므로 0섹션 D가 H함수를 사용 하여 전체 프로그램을 정지시킬 때까지 숫자가 0으로 줄어든 경우 실제로 숫자를 계속 생성 합니다.
[BkG] 큰 시작 코드 블록의 사본을 축약하여 새 반복을 시작하기 위해 자체 복제에 사용됩니다.
첫 번째 사이클에서 초기화 :
) :~ : [)[):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]~:] ( 106328966328112328136317639696111819119696281563139628116326221310190661962811611211962861109696289611619628116111612896281115421063633063961111116163963011632811111819159628151213262722151522061361613096119619190661966311961128966130281807072220060611612811961019070723232022060611
) ~ ~ [)[):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]~:] [BkG] [10...11]
) [)[):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]~:] ~ [BkG] [10...11]
) [):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):] ~ : [10...11] [BkG]
일반적인 반복 N은 분할 할 숫자를 나타냅니다.
) [):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):] ~ : [N] [BkG]
) :~ [)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+ :5 ) : [N] : [BkG]
) ~ ~ [)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/] +5 5 ) [N] [N] [BkG] [BkG]
) [)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/] ~ 10 N [N] [BkG] [BkG]
) ~:~ ~ ( [:~)*[):~[$1(+48]):~+]-:~~)10)~~] / N 10 [N] [BkG] [BkG]
) ~ : [:~)*[):~[$1(+48]):~+]-:~~)10)~~] ( {N/10} [N] [BkG] [BkG]
) [:~)*[):~[$1(+48]):~+]-:~~)10)~~] : [{N/10}] [N] [BkG] [BkG]
:~ )*[):~[$1(+48]):~+]- :~ ~)10 ) ~ ~ [{N/10}] [{N/10}] [N] [BkG] [BkG]
~~) *[):~[$1(+48]):~+]- ~~10 ) ) [{N/10}] ~ [{N/10}] [N] [BkG] [BkG]
) ~ * [):~[$1(+48]):~+] -10 ~ ) {N/10} [N] [{N/10}] [BkG] [BkG]
) [):~[$1(+48]):~+] * {-10} {N/10} ) [N] [{N/10}] [BkG] [BkG]
) :~ [$1(+48]) :~ + {-10*(N/10)} N [{N/10}] [BkG] [BkG]
) ~ ~ [$1(+48] ) ~ ~ {N%10} [{N/10}] [BkG] [BkG]
) [$1(+48] ~ ) {N%10} ~ [{N/10}] [BkG] [BkG]
$1( + 48 {N%10} ) [BkG] [{N/10}] [BkG]
( {48+N%10} BkG [{N/10}] [BkG] New iteration starts
[{48+N%10}] ....
- 지연 블롭은 특히 털이 있습니다. 그러나 새로운 지연 트릭은 두 사이클 을 지연시키는
+:5대신 사용하는 것입니다 . 아아 , 프로그램에서 하나만 도움이되었습니다.--101010
[N]및 [BkG]블록 중복의 다음 한 사본 N으로 나누어 져 있습니다 10.
[{N/10}]중복 다음 이상의 산술 기능의 마지막 자리의 ASCII 코드를 계산하는데 사용되는 N등을 48+((-10)*(N/10)+N). 이 ASCII 코드가있는 블록은 섹션 F에 남습니다.
- 다른 사본은 블록
[{N/10}]사이에서 교환되어 [BkG]새로운 반복의 시작을 설정합니다.
보너스 퀘인 (540 바이트)
)$$3371%%1[~!~~!)!]):[)$$20%%0[):]~)~~[)$$12%%0[<$$7%~~0):~[+----48+*-~~10))]<]<~!:~)~~[40~[:~))~:~[)~(~~/[+--48):]~10]+30])):]]][)[H]](11(06(06(21(21(25(19(07(07(19(61(96(03(96(96(03(11(03(63(11(28(61(11(06(06(20(18(07(07(18(61(11(28(63(96(11(96(96(61(11(06(06(19(20(07(07(18(61(30(06(06(25(07(96(96(18(11(28(96(61(13(15(15(15(15(22(26(13(12(15(96(96(19(18(11(11(63(30(63(30(96(03(28(96(11(96(96(61(22(18(96(61(28(96(11(11(96(28(96(61(11(96(10(96(96(17(61(13(15(15(22(26(11(28(63(96(19(18(63(13(21(18(63(11(11(28(63(63(63(61(11(61(42(63(63
온라인으로 사용해보십시오!
어떤 방법이 가장 짧은 지 잘 모르기 때문에 먼저 문자를 (s로 구분 된 두 자리 숫자로 인코딩하려고했습니다 . 핵심 코드는 약간 짧지 만 50 % 더 큰 데이터 표현이이를 보완합니다. 내가 이길 수 없다는 것을 깨달았을 때 나는 다른 골프만큼 골프를 치지 않았다. 한 가지 장점이 있습니다. bignum을 지원하는 구현이 필요하지 않습니다.
전체 구조는 기본 구조와 다소 유사합니다. 데이터 표현이 섹션 F를 직접 채우므로 섹션 G가 누락되었습니다. 그러나 섹션 E는 두 자리 숫자의 숫자를 재구성하기 위해 유사한 divmod 계산을 수행해야합니다.