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
.)
- 여러 개의 동일한 요소를 연속으로 지연
:
시키거나 하나의 요소 $
로 만드는 데 사용할 수 있습니다.
(n
n
브래킷으로 감싸서 나중에 편리하게 제거 할 수 있습니다. 이것은 숫자 계산에 특히 중요합니다. 숫자는 블록에 넣지 않고 복사하기조차 너무 불안정하기 때문입니다.
전반적인 구조
나머지 설명은 각각 실행중인 프로그램 섹션에 대해 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가 다 사용 되면 $1
1 개의 사본 [~]
(효과적으로 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
대신 사용하는 것입니다 . 아아 , 프로그램에서 하나만 도움이되었습니다.--10
10
10
[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 계산을 수행해야합니다.