Sieb von Eratosthenes, Schritt für Schritt


15

Zeichne mit einer gegebenen Zahl N eine linksbündige N x N- Tafel mit Zahlen und lasse 1 frei (als Leerzeichen) (ich zeige Diagramme mit N = 5)

   2  3  4  5
6  7  8  9  10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

Ihre Aufgabe ist es, Schritt für Schritt das Sieb des Eratosthenes zu bauen. Beginnen Sie zuerst mit 2. Es ist eine Primzahl. Lassen Sie es also dort und ersetzen Sie alle anderen durch 2 teilbaren Zahlen durch die richtige Anzahl von Leerzeichen.

   2  3     5
   7     9    
11    13    15
   17    19   
21    23    25

Gehen Sie als Nächstes zur nächsten nicht gedruckten Nummer ( 3in diesem Fall) und machen Sie dasselbe.

   2  3     5
   7          
11    13      
   17    19   
      23    25

Und so weiter, bis Sie N erreichen .

Sie müssen zuerst das vollständige Raster ausdrucken und jedes Mal, wenn Sie zu einer neuen Zahl wechseln, die Tafel mit den entfernten Vielfachen ausdrucken. Stellen Sie sicher, dass Sie eine leere Zeile dazwischen drucken!

Beispiele

Text in Klammern dient ()nur als Referenz. Sie müssen ihn nicht ausdrucken

N = 2:

  2 (complete grid)
3 4

  2 (remove multiples of 2)
3  

N = 3:

  2 3 (complete grid)
4 5 6
7 8 9

  2 3 (remove multiples of 2)
  5  
7   9

  2 3 (remove multiples of 3)
  5  
7    

Denken Sie daran, dies ist , also gewinnt der Code mit der geringsten Anzahl von Bytes.


Normalerweise hört man für ein N × N- Sieb nach N auf zu sieben .
Neil

1
Wenn zum Beispiel N=10, 100nicht prim ist, wird so zu einem bestimmten Zeitpunkt entfernt werden. Müssen alle Zahlen mit 3 Zeichen aufgefüllt werden, weil 100sie 3 Ziffern haben?
mbomb007

4
Warum würden Sie links -align Zahlen?
Dennis

2
Sind nachgestellte Zeilenumbrüche akzeptabel?
Dennis

2
Sind eingebaute Gitter erlaubt? Die Ausgabe sieht identisch aus wie im Beispiel im Beitrag, ist jedoch keine Zeichenfolge.
JungHwan Min 20.10.16

Antworten:


7

Jelly , 34 Bytes

Ṿ€“1“ ”ys³G
>®i©1ḍoṛ®¦
²R;1©ÇÐĿÑ€Y

Probieren Sie es online!

Wie es funktioniert

²R;1©ÇÐĿÑ€Y  Main link. Argument: n (integer)

²            Yield n².
 R           Range; yield [1, ..., n²].
   1©        Yield 1 and copy it to the register.
  ;          Append 1 to the range.
             This is the initial state. Let's call it S.
     ÇÐĿ     Call the second helper link until the results are no longer unique.
             This returns all unique results as an array.
        Ṅ€   Call the first helper link on each result.
          Y  Join, separating by linefeeds.

>®i©1ḍoṛ®¦   Second helper link. Argument: S (state)

>®           Compare all integers in S with the value in the register.
  i 1        Find the first index of 1 (i.e., the first number that is greater
             than the register.
   ©         Copy the index to the register. Let's call the index p.
     ḍ       Test all numbers in S for divisibility by p. This yield 1 for
             multiples of p, 0 otherwise.
      o      Logical OR; replace 0's with the corresponding values of S.
       ṛ®¦   Replace the 0 at index p with the corresponding element of S (p).
             For the purposes of the explanation, S is now the updated state.

Ṿ€“1“ ”ys³G  First helper link. Argument: A (array)

Ṿ€           Uneval each; convert all integers in A into strings.
  “1“ ”y     Replace each string "1" with the string " ".
        s³   Split into chunks of length n (command-line argument).
          G  Grid; separate row items by spaces (left-padding since the row items
             are strings), the rows themselves by linefeeds.

5

Perl, 250 243 231 202 157 Bytes

$n=<>;@a=0..($e=$n*$n);$a[1]=$";for$p(1..$n){next if!$a[$p];for(1..$e){$a[$_]=""if!($p~~[(1,$_)]||$_%$p);printf"%-*s",1+length$e,$a[$_];say""if!($_%$n)}say}

Testen Sie das aktuelle Golf online! (unbedingt ausführen als perl -M5.010 main.pl)

Die beiden wörtlichen Zeilenumbrüche speichern jeweils 1 Byte anstelle von \ n.

Beispielausgabe (Eingabe von 7):

   2  3  4  5  6  7  
8  9  10 11 12 13 14 
15 16 17 18 19 20 21 
22 23 24 25 26 27 28 
29 30 31 32 33 34 35 
36 37 38 39 40 41 42 
43 44 45 46 47 48 49 

   2  3     5     7  
   9     11    13    
15    17    19    21 
   23    25    27    
29    31    33    35 
   37    39    41    
43    45    47    49 

   2  3     5     7  
         11    13    
      17    19       
   23    25          
29    31          35 
   37          41    
43          47    49 

   2  3     5     7  
         11    13    
      17    19       
   23                
29    31             
   37          41    
43          47    49 

   2  3     5     7  
         11    13    
      17    19       
   23                
29    31             
   37          41    
43          47       

Ich bin mir sicher, dass ich nicht sehr gut Golf gespielt habe. Wenn ich nach Hause komme, werde ich es mir noch einmal ansehen, um zu sehen, wie viel ich abschneiden kann.

Edit 1: -7 Bytes (Ändern von "print sprintf" in das offensichtliche "printf")

Edit 2: 12 Bytes wurden gespeichert, indem $ d explizit an der Stelle verwendet wurde, an der es aufgerufen wurde, anstatt eine separate Variable zu erstellen, indem einige Deklarationen kombiniert wurden und eine meiner Bedingungen für die nextAnweisung in der ersten foreachSchleife durch Hinzufügen eines Leerzeichens an einer anderen Stelle beseitigt wurde . Weitere 29 Byte wurden ausgegeben, indem zwei for-Schleifen in eine einzige Schleife überarbeitet, zwei Variablendeklarationen entfernt und unlessAnweisungen in if-not-Anweisungen umgewandelt wurden. Das Deklarieren my$e=$n*$n;und Ersetzen der drei Instanzen von $ n * $ n durch $ e (wodurch ich einen Paren für einen von ihnen löschen konnte) ergab ± 0 Bytes, aber ich behielt es trotzdem bei.

Edit 3: Dank @Dada wurden weitere 40 Bytes herausgefiltert (variable Deklarationen, 'foreach' wird 'for', implizites $ _ an mehreren Stellen und Reduzierung der printf-Anweisungsgröße). Ein zusätzliches Byte wurde durch Drehen if!($c%$p||$c==$p||$p==1)in abgeschabt if!($p~~[(1,$_)]||$_%$p). Leider ist das [] um das Array erforderlich, da der Smartmatch-Operator ~~ noch experimentell ist und bei tatsächlichen Arrays anscheinend nicht richtig funktioniert, sondern stattdessen bei Verweisen auf diese Arrays. 4 weitere Bytes wurden entfernt, indem zwei Semikolons und ein leerer Satz von Anführungszeichen nach dem letzten entfernt wurden say.


1
Das ist ein guter Anfang, aber Sie können viel mehr Golf spielen. Deklarieren Sie keine Variablen (verwenden Sie sie also nicht my). Verwenden Sie -pflag, um Ninnen zu haben, $_anstatt zu verwenden $n=<>. Schreiben Sie forstatt foreach(diese Anweisung entspricht). Löschen Sie die Klammer um den Zustand der , ifdie in Anweisung Modifikator Position sind (zum Beispiel if!$c%$nstatt if(!$c%$n)keine Klammern benötigt zu initialisieren. @a: @a=0..$e. Sie fallen können forvariabel und $_wiil stattdessen verwendet werden schreiben. printf"%*s",1+length$e,$a[$c](Die `` sprintf` doc für Details über das *)
Dada

1
Verwenden Sie $"anstelle von " ". say""stattdessen print"\n"(Sie haben einen kleinen Zeilenvorschub in Ihrem Code, aber ich kann ihn nicht in einem Kommentar schreiben) (Sie werden hinzufügen, um ihn -M5.010zur Befehlszeile hinzuzufügen , aber das zählt nicht in der Byteanzahl). Sie können wahrscheinlich verwenden 0..$e=$n*$n, um ein Byte bei der Initialisierung von zu speichern $e. Schauen Sie sich die Perl-Golftipps an , sie enthalten viele nützliche Tipps. Aber es ist schön, einen neuen Perlgolfspieler zu sehen, willkommen! :) (und verzeihen Sie meine Rechtschreibfehler, ich kann meinen vorherigen Kommentar zu schnell geschrieben haben)
Dada

@Dada Danke für deinen Rat! Ich bin nicht sehr vertraut damit, Code in der Befehlszeile auszuführen (ich neige dazu, ihn als Datei auszuführen), aber ich werde es mir so ansehen. Wie für if!$c%$ndie! operator hat Vorrang vor dem% -Operator. Technisch gesehen ist dies also if((!$c)%$n)der Wert, der für alles andere als $ c = 0 (was ich nicht möchte) als false ausgegeben wird. Was Ihre anderen Tipps angeht, werde ich sehen, was ich tun kann! Vielen Dank!
Gabriel Benamy

Sie müssen es nicht in der Befehlszeile ausführen. Diese Änderungen funktionieren, wenn Sie sie auch in eine Datei einfügen. Entschuldigung !, ich war nicht auf meinem Computer, um das zu überprüfen. Sie sollten in der Lage sein, bis zu 160 Zeichen zu bekommen, denke ich.
Dada

5

PHP, 155 Bytes

for(;$d++<$n=$argv[1];$x&$a[$d]<1?:print"\n".chunk_split(join($a),$n*$l))for($i=$d*$x=$d>1;$n**2>=$i+=$d;)$a[$i]=str_pad($x|$i<2?"":$i,$l=strlen($n**2)+1);

@Crypto -3 Bytes Vielen Dank @Titus -6 Bytes Vielen Dank

Versuch es

Das erste Mal, dass ich print in einer After-Loop-Bedingung verwende

Nervenzusammenbruch

for(;$d++<$n=$argv[1];
$x&$a[$d]<1?:print"\n".chunk_split(join($a),$n*$l))
#after loop print the grid if $d = 1 or is prime
for($i=$d*$x=$d>1;$n**2>=$i+=$d;)
$a[$i]=str_pad($x|$i<2?"":$i,$l=strlen($n**2)+1);
#fills the array at first run and replace positions with space in the next runs 

Vorherige Version 174 Bytes

for(;$d++<=$n=$argv[1];!($d<2||$a[$d]>0)?:print chunk_split(join($a),$n*$l)."\n")for($i=$d<2?1:2*$d;$i<=$m=$n**2;$i+=$d)$a[$i]=str_pad($d<2?($i<2?"":$i):" ",$l=strlen($m)+1);  

1
-3 Bytes ändern den Zustand: !($d<2||$a[$d]>0)=>$d>1&&$a[$d]<1
Crypto

1
-1 Byte mit diesem Trick, um eine Ganzzahl $l=strlen($m)+1für$l=log10($m)+2
Crypto

1
-3 Bytes: $i=$d*$x=$d>1statt $i=$d<2?0:$dund $xfür die beiden anderen Vorkommen von$d>1
Titus

1
-2 Bytes: $n*$n>=$i+=$danstelle von ($i+=$d)<=$m=$n**2und $n*$nfür das andere Vorkommen von$m
Titus

1
-1 Byte: führende statt nachfolgende Newline
Titus

3

Groovy, 201 195 191 Bytes

{n->a=(1..n*n).toArray();y={a.collect{(it?"$it":"").padRight((""+n*n).size())}.collate(n).each{println it.join(" ")}};a[0]=0;y(a);(2..n).each{b->(b+1..n*n).each{if(it%b==0){a[it-1]=0}};y(a)}}

Dies ist ein absoluter Cluster ... Die Linke hat meine Byteanzahl ermordet. Aber hey, es funktioniert. Hier ist die Ausgabe für 4:

   2  3  4 
5  6  7  8 
9  10 11 12
13 14 15 16

   2  3    
5     7    
9     11   
13    15   

   2  3    
5     7    
      11   
13         

   2  3    
5     7    
      11   
13         

Ungolfed:

{
    n->
    a = (1..n*n).toArray();                           // Create initial array.
    y = {                                             // Createa  printing utility closure.
        a.collect {                                   // Create an array collection of...
            (it ? "$it":"").padRight((""+n*n).size()) // If 0, store "", else store number & right pad it.
        }.collate(n).each{                            // Collate by n (break into nxn grid).
            println it.join(" ")                      // print each separated by spaces.
        }
    };
    a[0]=0;                                           // Remove first element.
    y(a);                                             // Print initial status.
    (2..n).each{                                      // From 2 to n...
        b->
        (b+1..n*n).each{                              // From current number + 1 to end of grid...
            if(it%b==0){                              // If current grid position is divisible...
                a[it-1]=0                             // Replace with 0.
            }
        }
        y(a)                                          // Print it.
    }        
}

Um die Umstellung zu erleichtern, müssen Sie


2
Das sieht für mich nicht linksbündig aus.
Dennis

Behoben ... Ich hatte bis jetzt keine Chance, es zu bearbeiten ...
Magic Octopus Urn

@Dennis Ich habe deine Kommentare gesehen und dachte, er hätte sie aufgrund deines Kommentars geändert.
Magic Octopus Urn

3

Perl, 115 114 113 112 Bytes

Beinhaltet +1 für -a

Mit der eingegebenen Nummer auf STDIN ausführen:

perl -M5.010 sieving.pl <<< 7

sieving.pl:

#!/usr/bin/perl -a
$_*=$_;$a.="$_"x$|++|$"x"@+".($_%"@F"?$":$/)for/\d+/..$_;*_=a;s^^$$_++||say;$.++;s//$&%$.|$&==$.?$&:$&&$_/eg^eg

Benötigt eine aktuelle genug Perl, so dass -aimpliziert -n. Wenn Ihr Perl zu alt ist, fügen Sie eine -nOption hinzu.

Gibt eine abschließende neue Zeile aus, die zulässig ist.


2

Python 2, 199 202 201 Bytes

+3 Byte (ich habe nicht vorzeitig
angehalten ) -1 Byte dank @Oliver (Leerzeichen verpasst)

def f(n,p={()}):
 m=n*n;g=['']+[[i,''][any(i>n and i%n<1for n in p)]for i in range(2,m+1)];x=min(set(g)-p);i=0
 while i<m+n:print' '.join('%%%ds'%-len(`m`)%v for v in g[i:i+n]);i+=n
 if x<=n:f(n,p|{x})

repl.it


1
Sie können ein Leerzeichen zwischen 1und entfernenfor
Oliver Ni

2

JavaScript (ES6), 190 bis 189 Byte

Druckt direkt auf die Konsole.

f=(w,k=1,a=[...Array(w*w)].map((_,n)=>n&&n+1))=>k++<=w&&(k==2|a[k-2]&&console.log(a.map((n,x)=>`${n||''}    `.slice(0,`_${w*w}`.length)+(++x%w?'':`
`)).join``),f(w,k,a.map(n=>n==k|n%k&&n)))

Demo


2

Batch, 464 Bytes

@echo off
set/an=%1,s=n*n,t=s,c=1
set p=
:l
set/ac+=1,t/=10
set p= %p%
if %t% gtr 0 goto l
for /l %%i in (1,1,%1)do call:i %%i
exit/b
:i
set l=
set/af=0
call:f %1 %1
if %f%==0 for /l %%j in (1,1,%s%)do call:j %1 %%j
exit/b
:j
set/am=%2,f=!(m-1),g=%2%%n
call:f %1 %2
if %f% gtr 0 set m=
set m=%m% %p%
call set l=%%l%%%%m:~0,%c%%%
if %g%==0 echo(%l%&set l=
if %2==%s% echo(
exit/b
:f
for /l %%l in (2,1,%1)do if %%l neq %2 set/af+=!(%2%%%%l)

Das war etwas mühsam. Erläuterung: Beginnt mit dem Quadrieren, ndamit mithilfe der Schleife die gewünschte Spaltenbreite cund der entsprechende Abstand berechnet werden können . Die äußere Schleife von bis wird dann für jedes Raster einmal ausgeführt und ruft die Unterroutine auf . Zuerst wird geprüft, ob der Wert 1 oder eine Primzahl ist. Wenn nicht, wird dieses Gitter übersprungen. Die innere Schleife von bis behandelt dann die Zeilen und Spalten des Rasters und ruft die Unterroutine aufp:l1n:i1n*n:j . Jeder Wert wird überprüft, um festzustellen, ob es sich um eine der bisher gefundenen Primzahlen handelt oder ob keine der bisher gefundenen Primzahlen diese dividiert. In diesem Fall wird der Wert mit dem Ausgabepuffer verknüpft, der dann auf die gewünschte Spaltenbreite aufgefüllt wird. Der Puffer wird alle nZeilen gedruckt und gelöscht , und am Ende des Rasters wird eine zusätzliche Leerzeile hinzugefügt. Das :fEtikett kennzeichnet das Unterprogramm zur Faktorprüfung; f (x, y) addiert 1 zu fjeder ganzen Zahl zwischen 2 und xder dividierty , ohne sich yselbst.


2

R 195, 191 185 204 Bytes

f=function(N){a=b=1:N^2;i=1;a[1]="";S=sprintf;while(i<=N){for(j in b)cat(a[j]<-S(S("%%-%is",nchar(N^2)),if(j==i|j%%i|i<2)a[j]else ""),if(j%%N)"" else"\n");cat("\n");i=(grep("\\d",a[-(1:i)],v=T)[1]:1)[1]}}

Danke an @Billywob für 6 zusätzliche Bytes!

Eingerückt, mit Zeilenumbrüchen:

f=function(N){
   a=b=1:N^2 #Initial array
   i=1 #Turn counter
   a[1]="" #1 never shown
   S=sprintf
   while(i<=N){
      for(j in b)
         cat(a[j]<-S(S("%%-%is",nchar(N^2)),if(j==i|j%%i|i<2)a[j]else ""),
             if(j%%N)"" else"\n") #Newline at end of row
      cat("\n") #Newline between turns
      i=(grep("\\d",a[-(1:i)],v=T)[1]:1)[1] #Select next prime as next i
   }
}

Verwendung:

> f(2)
  2 
3 4 

  2 
3   

> f(3)
  2 3 
4 5 6 
7 8 9 

  2 3 
  5   
7   9 

  2 3 
  5   
7     

> f(9)
   2  3  4  5  6  7  8  9  
10 11 12 13 14 15 16 17 18 
19 20 21 22 23 24 25 26 27 
28 29 30 31 32 33 34 35 36 
37 38 39 40 41 42 43 44 45 
46 47 48 49 50 51 52 53 54 
55 56 57 58 59 60 61 62 63 
64 65 66 67 68 69 70 71 72 
73 74 75 76 77 78 79 80 81 

   2  3     5     7     9  
   11    13    15    17    
19    21    23    25    27 
   29    31    33    35    
37    39    41    43    45 
   47    49    51    53    
55    57    59    61    63 
   65    67    69    71    
73    75    77    79    81 

   2  3     5     7        
   11    13          17    
19          23    25       
   29    31          35    
37          41    43       
   47    49          53    
55          59    61       
   65    67          71    
73          77    79       

   2  3     5     7        
   11    13          17    
19          23             
   29    31                
37          41    43       
   47    49          53    
            59    61       
         67          71    
73          77    79       

   2  3     5     7        
   11    13          17    
19          23             
   29    31                
37          41    43       
   47                53    
            59    61       
         67          71    
73                79       

> f(12)
    2   3   4   5   6   7   8   9   10  11  12  
13  14  15  16  17  18  19  20  21  22  23  24  
25  26  27  28  29  30  31  32  33  34  35  36  
37  38  39  40  41  42  43  44  45  46  47  48  
49  50  51  52  53  54  55  56  57  58  59  60  
61  62  63  64  65  66  67  68  69  70  71  72  
73  74  75  76  77  78  79  80  81  82  83  84  
85  86  87  88  89  90  91  92  93  94  95  96  
97  98  99  100 101 102 103 104 105 106 107 108 
109 110 111 112 113 114 115 116 117 118 119 120 
121 122 123 124 125 126 127 128 129 130 131 132 
133 134 135 136 137 138 139 140 141 142 143 144 

    2   3       5       7       9       11      
13      15      17      19      21      23      
25      27      29      31      33      35      
37      39      41      43      45      47      
49      51      53      55      57      59      
61      63      65      67      69      71      
73      75      77      79      81      83      
85      87      89      91      93      95      
97      99      101     103     105     107     
109     111     113     115     117     119     
121     123     125     127     129     131     
133     135     137     139     141     143     

    2   3       5       7               11      
13              17      19              23      
25              29      31              35      
37              41      43              47      
49              53      55              59      
61              65      67              71      
73              77      79              83      
85              89      91              95      
97              101     103             107     
109             113     115             119     
121             125     127             131     
133             137     139             143     

    2   3       5       7               11      
13              17      19              23      
                29      31                      
37              41      43              47      
49              53                      59      
61                      67              71      
73              77      79              83      
                89      91                      
97              101     103             107     
109             113                     119     
121                     127             131     
133             137     139             143     

    2   3       5       7               11      
13              17      19              23      
                29      31                      
37              41      43              47      
                53                      59      
61                      67              71      
73                      79              83      
                89                              
97              101     103             107     
109             113                             
121                     127             131     
                137     139             143     

    2   3       5       7               11      
13              17      19              23      
                29      31                      
37              41      43              47      
                53                      59      
61                      67              71      
73                      79              83      
                89                              
97              101     103             107     
109             113                             
                        127             131     
                137     139                     

Gut, ich kann nie herausfinden, wie man Matrizen richtig druckt, um den Codegolf-Anforderungen zu entsprechen. Sie können jedoch ein paar Bytes sparen. Der Exponential - Operator ^ist die einzige, die nicht vektorisiert wird bei der Generierung von Sequenzen , :welche Mittel Sie zB verwenden können , 1:2^2zu erhalten 1 2 3 4. Zweitens, wenn Sie definieren a=b=1:n^2, können Sie später einen for(j in b)anderen Vektor zum Schleifen verwenden, anstatt ihn zu definieren. Sollte Ihnen ein paar Bytes ersparen.
Billywob

Tatsächlich! Vielen Dank! Ich kann mich nie an die genaue Rangfolge der Operatoren erinnern ...
Plannapus

Warum gibt es drei Leerzeichen zwischen den Zahlen in f (2) und f (3) und zwei Leerzeichen in f (9)? Es sollte immer ein Leerzeichen sein.
Oliver Ni

Oh, richtig, ich habe 3 Zeichen als Norm festgelegt, weil ich mit N = 10 getestet habe. Lassen Sie mich das korrigieren.
Plannapus

1

J, 125 Bytes

p=:3 :'}."1,./('' '',.>)"1|:(-%:#y)]\((a:"_)`(<@":)@.*)"+y'
3 :'p@>~.|.(]*](*@|~+.=)({[:I.*){])&.>/\.(<"+i.-y),<]`>:@.*i.*:y'

Dies ist ausdrücklich, nicht stillschweigend, aber es sollte eine Möglichkeit geben, stillschweigend Golf zu spielen.

Verwendung

   p =: 3 :'}."1,./('' '',.>)"1|:(-%:#y)]\((a:"_)`(<@":)@.*)"+y'
   f =: 3 :'p@>~.|.(]*](*@|~+.=)({[:I.*){])&.>/\.(<"+i.-y),<]`>:@.*i.*:y'
   f 2
  2
3 4

  2
3  
   f 3
  2 3
4 5 6
7 8 9

  2 3
  5  
7   9

  2 3
  5  
7    
   f 4
   2  3  4 
5  6  7  8 
9  10 11 12
13 14 15 16

   2  3    
5     7    
9     11   
13    15   

   2  3    
5     7    
      11   
13         
   f 5
   2  3  4  5 
6  7  8  9  10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

   2  3     5 
   7     9    
11    13    15
   17    19   
21    23    25

   2  3     5 
   7          
11    13      
   17    19   
      23    25

   2  3     5 
   7          
11    13      
   17    19   
      23      

1

Mathematica, 133 Bytes

Grid[#,Alignment->Left]~Print~"
"&/@FoldList[#/.(##|1&@@(2~r~i#2)->Null)&,(r=Range)[i=#^2]~Partition~#/.Rule[1,],Prime@r@PrimePi@#];&

1

PHP, 155 150 147 145 142 140 Bytes

for(;$k++<$n=$argv[1];)if($k<2||$a[$k]){for($i=0;$i++<$n*$n;)echo$a[$i]=$k>1?$i>$k&$i%$k<1?"":$a[$i]:($i<2?"":$i),"\t\n"[$i%$n<1];echo"\n";}

Nervenzusammenbruch

for(;$k++<$n=$argv[1];)
    if($k<2||$a[$k])    // if first iteration or number unprinted ...
{
    for($i=0;$i++<$n*$n;)
        echo
            $a[$i]=$k>1
                ?$i>$k&$i%$k<1
                    ?""         // sieve
                    :$a[$i]     // or copy value
                :($i<2?"":$i)   // first iteration: init grid
            ,
            // append tab, linebreak every $n columns
            "\t\n"[$i%$n<1]
        ;
    // blank line after each iteration
    echo"\n";
}

1
$a[$i]="";statt unset($a[$i]);4 Bytes sparen soll
Jörg Hülsermann

$i%$k<1statt !($i%$k)ein Byte zu speichern
Jörg Hülsermann
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.