Golfscript, 59 51 50 Zeichen
Mann, jeder Charakter ist extrem schwer zu verlieren:
0[2.{).,2>{\.@%!},{.2$-.4$>{].p~\[}{;\;}if..}or}do
Ausgabe :
[2 3 1]
[3 5 2]
[7 11 4]
[23 29 6]
[89 97 8]
[113 127 14]
...
Erklärung :
Der Stapel wird so eingerichtet, dass jede Iteration mit dem Stapel wie diesem beginnt, wobei sich der obere Teil rechts befindet. Das [zeigt die aktuelle Array-Markierung an, dh, wenn der Interpreter auf ein trifft ], wird alles auf dem Stapel von der Markierung bis zur Spitze in ein Array eingefügt.
g [ last | cur
gist die maximale Lücke bisher. Von oben nach unten:
command | explanation
-----------------+----------------------------------------
0[2. | initialize vars g=0, last=2, cur=2
{...}do | loop forever...
In der Schleife:
) | 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
Wie werden alle Teiler in eine Liste aufgenommen? Lass es uns Schritt für Schritt machen
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]
Was macht es, wenn die Teiler leer sind?
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 |
Zwei Wege: ja und nein. Wenn ja (beachten Sie, dass ifder oberste Wert auf dem Stapel verbraucht wird):
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
Wenn nein:
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
Beachten Sie in beiden Fällen, dass sich unser Stapel jetzt in der Form befindet ... | g [ c | c | c.
Jetzt wird der doSpitzenwert immer vom Stapel genommen cund es wird eine Schleife ausgeführt, wenn er positiv ist. Da dies cimmer weiter zunimmt, ist es immer wahr, so dass wir für immer eine Schleife bilden.
Nach dem Auftauchen befindet sich der obere Bereich des Stapels g [ c | c, was bedeutet, dass der letzte aktualisiert wurdec und die Array-Markierung befindet sich an derselben Stelleg befindet sich immer noch dort, wo wir dies erwarten.
Dies sind die verschlungenen Operationen von GolfScript. Ich hoffe, Sie haben es genossen, mitzufolgen!