Golfscript, 59 51 50 ký tự
Con người mỗi nhân vật đều vô cùng khó mất:
0[2.{).,2>{\.@%!},{.2$-.4$>{].p~\[}{;\;}if..}or}do
Đầu ra :
[2 3 1]
[3 5 2]
[7 11 4]
[23 29 6]
[89 97 8]
[113 127 14]
...
Giải thích :
Ngăn xếp được thiết lập để mỗi lần lặp bắt đầu với ngăn xếp như thế này, phía trên bên phải. Dấu [hiệu cho biết dấu hiệu mảng hiện tại, nghĩa là khi trình thông dịch gặp a ], mọi thứ trên ngăn xếp từ dấu đến đỉnh được đặt vào một mảng.
g [ last | cur
glà khoảng cách tối đa cho đến nay. Từ đỉnh xuống:
command | explanation
-----------------+----------------------------------------
0[2. | initialize vars g=0, last=2, cur=2
{...}do | loop forever...
Bên trong vòng lặp:
) | 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
Làm thế nào để nó đưa tất cả các ước vào một danh sách? Hãy làm từng bước một
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]
Nó làm gì nếu các ước số trống?
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 |
Hai con đường: có và không. Nếu có (lưu ý rằng iftiêu thụ giá trị hàng đầu trên ngăn xếp):
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
Nếu không:
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
Lưu ý trong cả hai trường hợp, ngăn xếp của chúng tôi bây giờ ở dạng ... | g [ c | c | c.
Bây giờ dogiá trị bật ra khỏi ngăn xếp - luôn luôn c- và các vòng lặp nếu nó là số dương. Vì cluôn luôn tăng, điều này luôn đúng, vì vậy chúng tôi lặp đi lặp lại mãi mãi.
Sau khi bật lên, đỉnh của ngăn xếp g [ c | c, nghĩa là lần cuối cùng đã được cập nhật c, dấu mảng nằm ở cùng một vị trí và gvẫn là nơi chúng ta mong đợi.
Đây là những hoạt động phức tạp của GolfScript. Tôi hy vọng bạn thích theo sau!