Saringan Eratosthenes, Langkah demi Langkah

15

Diberi nomor N , menggambar meninggalkan selaras N x N dewan angka, meninggalkan 1 kosong (sebagai ruang) (saya akan menunjukkan diagram dengan 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

Tugas Anda adalah membuat Saringan Eratosthenes, langkah demi langkah. Pertama, mulailah dengan 2. Ini prima, jadi biarkan saja di sana, dan ganti semua angka lain yang dapat habis dibagi 2 dengan jumlah ruang yang tepat.

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

Selanjutnya, buka nomor yang belum dicetak berikutnya ( 3dalam hal ini) dan lakukan hal yang sama.

   2  3     5
   7          
11    13      
   17    19   
      23    25

Dan seterusnya, sampai Anda mencapai N .

Anda harus terlebih dahulu mencetak kisi lengkap, dan setiap kali Anda pergi ke nomor baru, cetak papan dengan kelipatan dihapus. Pastikan Anda mencetak garis kosong di antaranya!

Contohnya

Teks dalam tanda kurung () hanya untuk referensi, Anda tidak perlu mencetaknya

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    

Ingat, ini adalah , jadi kode dengan jumlah byte terkecil menang.

Oliver Ni
sumber
Biasanya untuk N × N saringan Anda berhenti pengayakan setelah N .
Neil
1
Sebagai contoh, jika N=10, 100tidak prima, sehingga akan dihapus di beberapa titik. Haruskah semua angka diisi dengan 3 karakter karena 100memiliki 3 digit?
mbomb007
4
Mengapa Anda meninggalkan angka -ignign?
Dennis
2
Apakah membuntuti baris baru dapat diterima?
Dennis
2
Apakah grid bawaan diizinkan? Outputnya akan terlihat identik dengan contoh di postingan, tetapi tidak akan berupa string.
JungHwan Min

Jawaban:

7

Jelly , 34 byte

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

Cobalah online!

Bagaimana itu bekerja

²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
sumber
5

Perl, 250 243 231 202 157 byte

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

Uji golf online saat ini! (pastikan dijalankan sebagai perl -M5.010 main.pl)

Dua baris baru literal masing-masing menyimpan 1 byte sebagai pengganti \ n.

Output sampel (input 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       

Saya yakin saya tidak bermain golf dengan baik, jadi ketika saya pulang saya akan melihat lagi untuk melihat seberapa banyak saya bisa mencukur.

Edit 1: -7 byte (mengubah "print sprintf" menjadi "printf" yang jelas)

Sunting 2: Disimpan 12 byte dengan menggunakan $ d secara eksplisit di satu tempat ia dipanggil alih-alih membuat variabel terpisah, dengan menggabungkan beberapa deklarasi, dan dengan menghilangkan salah satu syarat saya untuk nextpernyataan di dalam foreachloop pertama dengan menambahkan spasi di tempat lain . 29 byte tambahan di-golf-kan dengan mengolah kembali dua untuk loop menjadi satu loop, menghilangkan dua deklarasi variabel, dan mengubah unlesspernyataan menjadi pernyataan if-not. Mendeklarasikanmy$e=$n*$n; kemudian mengganti tiga instance dari $ n * $ n dengan $ e (memungkinkan saya untuk melepaskan paren untuk salah satu dari mereka) ternyata menghasilkan ± 0 byte, tetapi saya tetap menyimpannya.

Sunting 3: Berkat @Dada, 40 byte lainnya di-golf-kan (deklarasi variabel, 'foreach' menjadi 'untuk', $ _ implisit di beberapa lokasi, dan mengurangi ukuran pernyataan printf). Tambahan 1 byte dicukur dengan mengubahnya if!($c%$p||$c==$p||$p==1)menjadi if!($p~~[(1,$_)]||$_%$p). Sayangnya, [] di sekitar array diperlukan, karena operator smartmatch ~~ masih eksperimental dan tampaknya tidak berfungsi dengan baik pada array aktual, tetapi malah bekerja pada referensi untuk array tersebut. 4 byte lagi dihapus dengan menghapus dua titik koma dan satu set tanda kutip kosong setelah yang terakhir say.

Gabriel Benamy
sumber
1
Itu awal yang baik, tetapi Anda bisa lebih banyak bermain golf. Jangan mendeklarasikan variabel (jadi jangan gunakan my). Gunakan -pbendera untuk memiliki Ndi dalam $_daripada menggunakan $n=<>. Tulis foralih-alih foreach(instruksi ini setara). Letakkan tanda kurung di sekitar kondisi ifyang ada di posisi pengubah pernyataan (misalnya if!$c%$nalih-alih if(!$c%$n). Tidak perlu tanda kurung untuk menginisialisasi @a:. @a=0..$eAnda dapat turun ke forvariabel dan $_akan digunakan sebagai gantinya. Tulis printf"%*s",1+length$e,$a[$c](dokumen `sprintf` untuk detail tentang itu *)
Dada
1
Gunakan $"sebagai ganti " ". say""alih-alih print"\n"(Anda memiliki baris baru litteral dalam kode Anda, tetapi saya tidak dapat menuliskannya dalam komentar) (Anda akan menambahkan untuk menambah -M5.010baris perintah, tetapi itu tidak dihitung dalam jumlah byte). Anda mungkin dapat menggunakan 0..$e=$n*$nuntuk menyimpan satu byte pada inisialisasi dari $e. Lihatlah tips perl golf , ini berisi banyak tips berguna. Tapi senang melihat pegolf perl baru, selamat datang! :) (dan maafkan kesalahan pengejaan saya, saya mungkin terlalu cepat menulis komentar saya sebelumnya)
Dada
@Dada Terima kasih atas saran Anda! Saya tidak terlalu akrab dengan menjalankan kode pada baris perintah (saya cenderung menjalankannya sebagai file) tapi saya akan coba melakukannya dengan cara itu. Adapun if!$c%$n,! operator memiliki prioritas di atas operator%, jadi secara teknis ini akan menjadi if((!$c)%$n)false untuk apa pun selain $ c = 0 (yang saya tidak mau). Adapun tips Anda yang lain, saya akan melihat apa yang bisa saya lakukan! Terima kasih banyak!
Gabriel Benamy
Anda tidak harus menjalankannya di baris perintah, modifikasi itu akan berfungsi jika Anda memasukkannya ke dalam file juga. Maaf untuk !, saya tidak di komputer saya untuk memeriksanya. Anda harus bisa mendapatkan hingga 160 karakter, saya pikir.
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 Terima Kasih @Titus -6 Bytes Terima kasih

Cobalah

Pertama kali saya menggunakan print dalam kondisi after loop

Kerusakan

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 

Versi Sebelumnya 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);  
Jörg Hülsermann
sumber
1
-3 byte mengubah kondisi: !($d<2||$a[$d]>0)=>$d>1&&$a[$d]<1
Crypto
1
-1 byte menggunakan trik ini untuk mendapatkan panjang integer $l=strlen($m)+1ke$l=log10($m)+2
Crypto
1
-3 byte: $i=$d*$x=$d>1alih-alih $i=$d<2?0:$ddan $xuntuk dua kejadian lainnya$d>1
Titus
1
-2 byte: $n*$n>=$i+=$dalih-alih ($i+=$d)<=$m=$n**2dan $n*$nuntuk kejadian lainnya$m
Titus
1
-1 byte: memimpin alih-alih mengikuti baris baru
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)}}

Ini adalah kluster absolut ... Garis-kiri membunuh jumlah byte saya. Tapi hei, itu berhasil. Inilah output untuk 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         

Tidak Disatukan:

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

Guci Gurita Ajaib
sumber
2
Ini tidak terlihat sejajar dengan saya.
Dennis
Memperbaiki ... Saya hanya tidak mendapatkan kesempatan untuk mengeditnya sampai sekarang ...
Magic Octopus Mm
@ Dennis Saya benar-benar melihat komentar Anda dan berpikir dia telah mengubahnya berdasarkan komentar Anda.
Magic Octopus Mm
3

Perl, 115 114 113 112 byte

Termasuk +1 untuk -a

Jalankan dengan nomor input pada 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

Membutuhkan perl yang cukup baru sehingga -amenyiratkan -n. Jika perl Anda terlalu lama, tambahkan -nopsi.

Mencetak baris baru yang diizinkan.

Ton Hospel
sumber
2

Python 2, 199 202 201 byte

+3 byte (saya tidak berhenti lebih awal)
-1 byte berkat @Oliver (melewatkan spasi)

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
sumber
1
Anda dapat menghapus spasi di antara 1danfor
Oliver Ni
2

JavaScript (ES6), 190 189 byte

Langsung mencetak ke konsol.

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

Arnauld
sumber
2

Batch, 464 byte

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

Ini agak melelahkan. Penjelasan: Mulai dengan mengkuadratkan nsehingga dapat menghitung lebar kolom yang diinginkan c, dan jumlah padding yang sesuai p, menggunakan loop :l. Loop luar dari 1ke nkemudian berjalan sekali untuk setiap grid, memanggil subrutin :i. Pertama nilainya diperiksa untuk melihat apakah nilainya 1 atau prima; jika tidak maka grid dilewati. Loop batin dari 1ke n*nkemudian menangani baris dan kolom dari grid, memanggil subrutin:j. Setiap nilai diperiksa untuk melihat apakah itu adalah salah satu bilangan prima yang ditemukan sejauh ini, atau jika tidak ada bilangan prima yang ditemukan sejauh ini membaginya. Jika demikian maka nilainya disatukan dengan buffer output, yang kemudian diisi dengan lebar kolom yang diinginkan. Buffer dicetak dan dihapus setiap nbaris, dan baris kosong tambahan ditambahkan di ujung kisi. The :flabel menunjukkan subroutine faktor-memeriksa; f (x, y) menambahkan 1 kef untuk setiap bilangan bulat antara 2 dan xyang membagi y, tidak termasuk yitu sendiri.

Neil
sumber
2

R, 195 191 185 204 byte

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

Terima kasih kepada @Billywob untuk 6 byte tambahan yang disimpan!

Diindentasi, dengan baris baru:

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

Pemakaian:

> 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
sumber
Bagus, saya tidak pernah tahu cara mencetak matriks dengan benar untuk memenuhi persyaratan codegolfing, apalagi membenarkannya. Anda dapat menyimpan beberapa byte. Operator eksponensial ^adalah satu-satunya yang tidak vektor saat membuat urutan menggunakan :yang berarti Anda dapat menggunakan misalnya 1:2^2untuk mendapatkan 1 2 3 4. Kedua, jika Anda mendefinisikan, a=b=1:n^2Anda nantinya dapat menggunakan for(j in b)alih-alih mendefinisikan vektor lain untuk mengulang. Harus menghemat beberapa byte.
Billywob
Memang! Terima kasih! Tidak pernah dapat mengingat urutan yang tepat dari operator yang diutamakan ...
plannapus
Mengapa ada tiga spasi antara angka dalam f (2) dan f (3) dan dua spasi di f (9)? Itu harus selalu menjadi satu ruang.
Oliver Ni
Oh benar saya mengatur 3 karakter sebagai norma karena saya menguji dengan N = 10, biarkan saya memperbaikinya.
plannapus
1

J, 125 byte

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

Ini eksplisit, bukan J diam-diam, tetapi harus ada cara untuk golf itu diam-diam.

Pemakaian

   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      
mil
sumber
1

Mathematica, 133 byte

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

PHP, 155 150 147 145 142 140 byte

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

kerusakan

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";
}
Titus
sumber
1
$a[$i]="";bukannya unset($a[$i]);harus menyimpan 4 Bytes
Jörg Hülsermann
$i%$k<1alih-alih !($i%$k)menyimpan satu Byte
Jörg Hülsermann