골프 스크립트, 59 51 50 자
각 캐릭터는 잃기 매우 어렵습니다.
0[2.{).,2>{\.@%!},{.2$-.4$>{].p~\[}{;\;}if..}or}do
출력 :
[2 3 1]
[3 5 2]
[7 11 4]
[23 29 6]
[89 97 8]
[113 127 14]
...
설명 :
스택은 각 반복이 이와 같은 스택으로 시작하도록 설정되며 상단은 오른쪽입니다. 은 [
통역자가 발생할 때 즉, 현재의 배열을 나타내는 마커 ]
배열에 넣고 가기 마크로부터 스택에 다.
g [ last | cur
g
지금까지 최대 간격입니다. 위에서 아래로 :
command | explanation
-----------------+----------------------------------------
0[2. | initialize vars g=0, last=2, cur=2
{...}do | loop forever...
루프 내부 :
) | cur += 1
.,2>{\.@%!}, | put all divisors of cur into a list
{...}or | if the list is empty, cur is prime, so
| the block is executed. otherwise,
| 'do' consumes the stack, sees it is truthy,
| and loops again
모든 제수를 목록에 어떻게 넣습니까? 단계별로 해보자
Command | explanation | stack
-----------------+----------------------------------------------+----------------
| initial stack | n
., | make list of 0..n-1 | n [0,1,...,n-1]
2> | take elements at index 2 and greater | n [2,3,...,n-1]
{...}, | take list off stack, then iterate through |
| the list. on each iteration, put the current |
| element on the stack, execute the block, and |
| pop the top of the stack. if the top is |
| true then keep the element, else drop it. |
| when done, push list of all true elements |
| So, for each element... | n x
\. | Swap & dup | x n n
@ | Bring x around | n n x
% | Modulo | n (n%x)
! | Boolean not. 0->1, else->0. Thus this is 1 |
| if x divides n. | n (x divides n)
| So only the divisors of n are kept | n [divisors of n]
제수가 비어 있으면 어떻게합니까?
Command | explanation | stack
-----------------+----------------------------------------------+----------------
| initial stack | g [ last | cur
. | dup | g [ l | c | c
2$ | copy 3rd down | g [ l | c | c | l
- | sub. This is the current gap, cur-last | g [ l | c | c-l
. | dup | g [ l | c | c-l | c-l
4$ | copy 4th down | g [ l | c | c-l | c-l | g
> | is cur gap > max gap so far? | g [ l | c | c-l | c-l>g
{#1}{#2}if.. | #1 if c-l > g, #2 otherwise, and do ".." in | ... | g [ c | c | c
| either situation |
두 가지 경로 : 예와 아니오. 예인 경우 ( if
스택에서 최상위 값 을 소비 함)
Command | explanation | stack
-----------------+----------------------------------------------+----------------
| initial stack. note that now the old `g` is | XX [ l | c | g
| garbage and `c-l` is the new `g`. |
] | close the array | XX [l, c, g]
.p | duplicate it and print it, consuming the dup | XX [l, c, g]
~ | pump array back onto the stack. Note now the | XX | l | c | j
| array marker [ is gone. |
\ | swap. | XX | l | g | c
[ | mark the array | XX | l | g | c [
. | this is the part after the if. dups the top, | XX | l | g [ c | c
| but it does this in two steps, first popping |
| c then putting two copies on top, so the |
| array marker moves |
. | dup again | XX | l | g [ c | c | c
그렇지 않은 경우 :
Command | explanation | stack
-----------------+----------------------------------------------+----------------
| initial stack. In this case g is still the | g [ l | c | c-l
| max gap so far |
;\; | dump top of stack, swap, and dump again | g [ c
.. | the part after the if. dup twice | g [ c | c | c
두 경우 모두 스택은 이제 형식 ... | g [ c | c | c
입니다.
이제는 do
스택에서 최상위 값을 팝하고 항상 c
양수이면 루프합니다. c
항상 증가 하기 때문에 이것은 항상 사실이므로 영원히 반복됩니다.
팝되면, 스택의 상단이되고 g [ c | c
, 마지막으로 업데이트되었습니다하는 의미 c
, 배열 마크는 같은 장소에서, 그리고 g
우리가 그것을 기대하는 곳 아직도있다.
이것들은 복잡한 GolfScript 작업입니다. 나는 당신이 함께 따라 즐기기를 바랍니다!