Sito Eratostenesa, krok po kroku

15

Biorąc pod uwagę liczbę N , narysuj wyrównaną do lewej tablicę liczb N x N , pozostawiając 1 pustą (jako spację) (pokażę schematy z 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

Twoim zadaniem jest krok po kroku zbudować sito Eratostenesa. Najpierw zacznij od 2. Jest liczbą pierwszą, więc zostaw ją tam i zastąp wszystkie pozostałe liczby podzielne przez 2 odpowiednią liczbą spacji.

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

Następnie przejdź do następnego niezadrukowanego numeru ( 3w tym przypadku) i zrób to samo.

   2  3     5
   7          
11    13      
   17    19   
      23    25

I tak dalej, aż dojdziesz N .

Najpierw musisz wydrukować całą siatkę i za każdym razem, gdy przejdziesz do nowego numeru, wydrukuj tablicę z usuniętymi wielokrotnościami. Upewnij się, że wydrukowałeś pustą linię pomiędzy!

Przykłady

Tekst w nawiasach służy ()wyłącznie jako odniesienie, nie trzeba go drukować

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    

Pamiętaj, to jest , więc wygrywa kod z najmniejszą liczbą bajtów.

Oliver Ni
źródło
Normalnie na N × N sito zatrzymać przesiewanie po N .
Neil,
1
Na przykład, jeśli N=10, 100nie jest liczbą pierwszą, więc zostaną usunięte w pewnym momencie. Czy wszystkie liczby muszą być uzupełnione do 3 znaków, ponieważ 100mają 3 cyfry?
mbomb007,
4
Dlaczego byś opuścił numery -align?
Dennis,
2
Czy końcowe znaki nowej linii są dopuszczalne?
Dennis,
2
Czy dozwolone są wbudowane siatki? Wynik będzie wyglądał identycznie jak w przykładzie w poście, ale nie będzie ciągiem.
JungHwan Min

Odpowiedzi:

7

Galaretka , 34 bajty

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

Wypróbuj online!

Jak to działa

²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.
Dennis
źródło
5

Perl, 250 243 231 202 157 bajtów

$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}

Sprawdź aktualny golf online! (pamiętaj, aby uruchomić jakoperl -M5.010 main.pl )

Dwa dosłowne znaki nowej linii zapisują 1 bajt zamiast \ n.

Przykładowe dane wyjściowe (wejście 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       

Jestem pewien, że nie grałem zbyt dobrze w golfa, więc kiedy wrócę do domu, spojrzę na to jeszcze raz, aby zobaczyć, ile mogę się ogolić.

Edytuj 1: -7 bajtów (zmieniając „sprint wydruku” na oczywisty „printf”)

Edycja 2: Zapisano 12 bajtów, używając jawnie $ d w jednym miejscu, w którym został wywołany, zamiast tworzyć osobną zmienną, łącząc niektóre deklaracje i eliminując jeden z moich warunków dla nextinstrukcji wewnątrz pierwszej foreachpętli, dodając spację gdzie indziej . Wyodrębniono dodatkowe 29 bajtów, przerabiając dwa pętle for w pojedynczą pętlę, eliminując dwie deklaracje zmienne i przekształcając unlessinstrukcje w instrukcje if-not. Zadeklarowanie, my$e=$n*$n;a następnie zastąpienie trzech instancji $ n * $ n przez $ e (pozwalając mi upuścić paren dla jednego z nich) okazało się, że daje ± 0 bajtów, ale i tak go zachowałem.

Edycja 3: Dzięki @Dada wyodrębniono kolejne 40 bajtów (zmienne deklaracje, „foreach” staje się „for”, domyślnie $ _ w kilku lokalizacjach i ograniczenie wielkości instrukcji printf). Dodatkowy 1 bajt został ogolony przez przekształcenie if!($c%$p||$c==$p||$p==1)w if!($p~~[(1,$_)]||$_%$p). Niestety [] wokół tablicy jest konieczne, ponieważ operator smartmatch ~~ jest nadal eksperymentalny i wydaje się, że nie działa poprawnie na rzeczywistych tablicach, ale zamiast tego działa na odniesieniach do nich. 4 kolejne bajty zostały usunięte przez usunięcie dwóch średników i pustego zestawu znaków cudzysłowu po ostatnim say.

Gabriel Benamy
źródło
1
To dobry początek, ale możesz grać w golfa o wiele więcej. Nie deklaruj zmiennych (więc nie używaj my). Użyj -pflagi, aby mieć Nwewnątrz $_zamiast używać $n=<>. Napisz forzamiast foreach(ta instrukcja jest odpowiednikiem). Upuścić nawiasów wokół kondycji if, które znajdują się w pozycji oświadczenie modyfikatora (na przykład if!$c%$nzamiast if(!$c%$n)No nawias potrzebne do zainicjowania. @a: @a=0..$e. Można spaść do forzmiennej i $_wiil być stosowany zamiast pisać. printf"%*s",1+length$e,$a[$c](Z `` sprintf` doc o szczegóły, które *)
Dada,
1
Użyj $"zamiast " ". say""zamiast print"\n"(masz literę nowego wiersza w kodzie, ale nie mogę tego napisać w komentarzu) (dodasz, aby dodać -M5.010do wiersza poleceń, ale to się nie liczy w liczbie bajtów). Prawdopodobnie można użyć 0..$e=$n*$ndo zapisania jednego bajtu przy inicjalizacji $e. Spójrz na perlowe wskazówki dotyczące gry w golfa , zawiera wiele przydatnych wskazówek. Ale miło jest widzieć nowego golfisty Perla, witamy! :) (i wybaczam moje błędy ortograficzne, być może napisałem mój poprzedni komentarz zbyt szybko)
Dada,
@Dada Dziękujemy za radę! Nie jestem zbyt obeznany z uruchamianiem kodu w linii poleceń (zwykle uruchamiam go jako plik), ale przyjrzę się, jak to zrobić. Co do if!$c%$n,! operator ma pierwszeństwo przed operatorem%, więc technicznie byłoby to if((!$c)%$n)fałszem dla czegoś innego niż $ c = 0 (czego nie chcę). Jeśli chodzi o inne wskazówki, zobaczę, co mogę zrobić! Dziękuję Ci bardzo!
Gabriel Benamy,
Nie musisz uruchamiać go w wierszu poleceń, te modyfikacje będą działać, jeśli umieścisz je również w pliku. Przepraszam !, że nie było mnie na komputerze, żeby to sprawdzić. Myślę, że powinieneś być w stanie sprowadzić do 160 znaków.
Dada,
5

PHP, 155 bajtów

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 Thank You @Titus -6 Bytes Thank You

Spróbuj

Pierwszy raz używam print w stanie po pętli

Awaria

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 

Poprzednia wersja 174 bajtów

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);  
Jörg Hülsermann
źródło
1
-3 bajty zmieniające warunek: !($d<2||$a[$d]>0)=>$d>1&&$a[$d]<1
Crypto
1
-1 bajt przy użyciu tej sztuczki, aby uzyskać długość całkowitą $l=strlen($m)+1do$l=log10($m)+2
Crypto
1
-3 bajty: $i=$d*$x=$d>1zamiast $i=$d<2?0:$di $xdla dwóch pozostałych przypadków$d>1
Tytus
1
-2 bajty: $n*$n>=$i+=$dzamiast ($i+=$d)<=$m=$n**2i $n*$nprzy innym wystąpieniu$m
Tytus
1
-1 bajt: wiodący zamiast końcowego nowego wiersza
Titus
3

Groovy, 201 195 191 bajtów

{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)}}

To jest gromada absolutna ... Lewe wyrównanie zamordowało moją liczbę bajtów. Ale hej, to działa. Oto wynik dla 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         

Nie golfowany:

{
    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.
    }        
}

W pobliżu

Urna Magicznej Ośmiornicy
źródło
2
To nie wygląda na wyrównane do lewej.
Dennis,
Naprawiono ... Po prostu nie miałem okazji go edytować do tej pory ...
Magic Octopus Urn
@ Dennis Właściwie widziałem twoje komentarze i myślałem, że zmienił je na podstawie twojego komentarza.
Magic Octopus Urn
3

Perl, 115 114 113 112 bajtów

Obejmuje +1 dla -a

Uruchom z numerem wejściowym na STDIN:

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

sieving.pl:

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

Potrzebuje wystarczająco niedawnego perla, aby to -asugerowało -n. Jeśli twój perl jest za stary, dodaj -nopcję.

Drukuje znak nowej linii, który jest dozwolony.

Ton Hospel
źródło
2

Python 2, 199 202 201 bajtów

+3 bajty (nie zatrzymywałem się wcześnie)
-1 bajt dzięki @Oliver (brakowało spacji)

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

Jonathan Allan
źródło
1
Możesz usunąć spację między 1ifor
Oliver Ni
2

JavaScript (ES6), 190 189 bajtów

Drukuje bezpośrednio na konsoli.

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)))

Próbny

Arnauld
źródło
2

Partia, 464 bajty

@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)

To było trochę pracochłonne. Objaśnienie: Zaczyna od kwadratu, ndzięki czemu może obliczyć żądaną szerokość kolumny ci odpowiednią ilość wypełnienia pza pomocą pętli :l. Zewnętrzna pętla od 1do nnastępnie działa raz dla każdej siatki, wywołując podprogram :i. Najpierw sprawdzana jest wartość, aby zobaczyć, czy jest to 1, czy liczba pierwsza; jeśli nie, to siatka jest pomijana. Wewnętrzna pętla od 1do n*nnastępnie obsługuje wiersze i kolumny siatki, wywołując podprogram:j . Każda wartość jest sprawdzana, aby sprawdzić, czy jest to jedna z liczb pierwszych znalezionych do tej pory, czy też żadna z znalezionych liczb pierwszych nie dzieli jej. Jeśli tak, to wartość jest konkatenowana do bufora wyjściowego, który jest następnie dopełniany do pożądanej szerokości kolumny. Bufor jest drukowany i czyszczony w każdym nwierszu, a na końcu siatki dodawany jest dodatkowy pusty wiersz. The:fetykieta oznacza podprogram sprawdzający czynnik; f (x, y) dodaje 1 do fkażdej liczby całkowitej między 2 i xktóra dzieli y, wyłączając ysiebie.

Neil
źródło
2

R, 195 191 185 204 bajtów

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]}}

Dzięki @Billywob zaoszczędzono 6 dodatkowych bajtów!

Wcięte, z nowymi liniami:

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
   }
}

Stosowanie:

> 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                     
plannapus
źródło
Fajnie, nigdy nie umiem wymyślić, jak prawidłowo wydrukować matryce, aby spełnić wymagania kodegolfingu, nie mówiąc już o ich uzasadnieniu. Możesz jednak zaoszczędzić kilka bajtów. Operator potęgowania ^jest jedynym, który nie jest wektoryzowany podczas generowania sekwencji za pomocą, :co oznacza, że ​​możesz użyć np. 1:2^2Do pobrania 1 2 3 4. Po drugie, jeśli zdefiniujesz a=b=1:n^2, możesz później użyć for(j in b)zamiast definiowania innego wektora do zapętlenia. Powinieneś zaoszczędzić kilka bajtów.
Billywob,
W rzeczy samej! Dzięki! Nigdy nie pamiętam dokładnej kolejności pierwszeństwa operatorów ...
plannapus 20.10.16
Dlaczego istnieją trzy spacje między liczbami wf (2) i f (3) i dwie spacje w f (9)? Zawsze powinna to być jedna spacja.
Oliver Ni
No tak, ustawiłem 3 znaki jako normę, ponieważ testowałem z N = 10, pozwól mi to poprawić.
plannapus
1

J, 125 bajtów

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

Jest to wyraźne, nie milczące J, ale powinien istnieć sposób na milczenie w golfa.

Stosowanie

   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      
mile
źródło
1

Mathematica, 133 bajty

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

PHP, 155 150 147 145 142 140 bajtów

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";}

awaria

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";
}
Tytus
źródło
1
$a[$i]="";zamiast unset($a[$i]);oszczędzać 4 bajty
Jörg Hülsermann
$i%$k<1zamiast !($i%$k)uratować jeden bajt
Jörg Hülsermann