ตะแกรงของ Eratosthenes ทีละขั้นตอน


15

รับจำนวนNวาดซ้ายชิดN x Nคณะตัวเลขออก 1 ว่าง (เป็นพื้นที่) (ฉันจะแสดงแผนภาพกับ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

งานของคุณคือการสร้าง Sieve of Eratosthenes ทีละขั้นตอน ก่อนอื่นให้เริ่มด้วย 2 มันสุดยอดดังนั้นปล่อยไว้ที่นั่นแล้วแทนที่ตัวเลขอื่น ๆ ทั้งหมดหารด้วย 2 ด้วยจำนวนช่องว่างที่เหมาะสม

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

ถัดไปไปที่หมายเลขที่ไม่ได้พิมพ์ถัดไป ( 3ในกรณีนี้) และทำเช่นเดียวกัน

   2  3     5
   7          
11    13      
   17    19   
      23    25

และอื่น ๆ จนกว่าจะถึงN

คุณต้องพิมพ์กริดที่สมบูรณ์ก่อนและทุกครั้งที่คุณไปที่หมายเลขใหม่ให้พิมพ์บอร์ดโดยลบมัลติพลาย ตรวจสอบให้แน่ใจว่าคุณพิมพ์บรรทัดว่างในระหว่าง!

ตัวอย่าง

ข้อความในวงเล็บ()เป็นเพียงการอ้างอิงคุณไม่จำเป็นต้องพิมพ์

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    

จำไว้ว่านี่คือดังนั้นโค้ดที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ


ปกติสำหรับN ร Nตะแกรงคุณหยุด sieving หลังจากN
Neil

1
ตัวอย่างเช่นถ้าN=10, 100ไม่สำคัญดังนั้นจะถูกลบออกในบางจุด ตัวเลขทั้งหมดต้องถูกทับด้วยอักขระ 3 ตัวเพราะ100มี 3 หลักหรือไม่
mbomb007

4
เหตุใดคุณจึงต้องใส่หมายเลขที่ไม่ถูกต้อง
เดนนิส

2
บรรทัดใหม่ต่อท้ายยอมรับได้หรือไม่
เดนนิส

2
อนุญาตกริดในตัวหรือไม่ ผลลัพธ์จะมีลักษณะเหมือนตัวอย่างในโพสต์ แต่จะไม่เป็นสตริง
JungHwan Min

คำตอบ:


7

เยลลี่ 34 ไบต์

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

ลองออนไลน์!

มันทำงานอย่างไร

²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 ไบต์

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

ทดสอบสนามกอล์ฟออนไลน์ในปัจจุบัน! (ต้องแน่ใจว่าได้ทำงานเป็นperl -M5.010 main.pl)

ขึ้นบรรทัดใหม่สองตัวอักษรแต่ละตัวบันทึก 1 ไบต์แทน \ n

เอาต์พุตตัวอย่าง (อินพุต 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       

ฉันคิดว่าฉันเล่นกอล์ฟไม่เก่งดังนั้นเมื่อฉันกลับถึงบ้านฉันจะลองดูอีกครั้งเพื่อดูว่าฉันสามารถโกนหนวดได้มากแค่ไหน

แก้ไข 1: -7 ไบต์ (เปลี่ยน "print sprintf" เป็น "printf" ที่เห็นได้ชัด)

แก้ไข 2: บันทึกไว้ 12 ไบต์โดยใช้ $ d อย่างชัดเจนในที่เดียวมันถูกเรียกว่าแทนที่จะสร้างตัวแปรแยกจากกันโดยรวมการประกาศบางส่วนและโดยกำจัดหนึ่งในเงื่อนไขของฉันสำหรับnextคำสั่งในforeachลูปแรกด้วยการเพิ่มช่องว่างอื่น . มีการเพิ่ม 29 ไบต์อีกครั้งโดยทำการวนซ้ำสองครั้งเพื่อวนซ้ำเป็นวงเดียวกำจัดการประกาศตัวแปรสองชุดและเปลี่ยนunlessคำสั่งเป็นคำสั่ง if-not การประกาศmy$e=$n*$n;จากนั้นแทนที่ทั้งสามอินสแตนซ์ของ $ n * $ n ด้วย $ e (อนุญาตให้ฉันวาง paren สำหรับหนึ่งในนั้น) กลายเป็นผลตอบแทน± 0 ไบต์ แต่ฉันเก็บไว้ในนั้น

แก้ไข 3: ด้วย @Dada อีก 40 ไบต์ถูกลบออก (การประกาศตัวแปร 'foreach' กลายเป็น 'สำหรับ' นัย $ _ ในหลาย ๆ ที่และลดขนาดคำสั่ง printf) เพิ่มอีก 1 ไบต์ถูกโกนด้วยการเปลี่ยนเข้าสู่if!($c%$p||$c==$p||$p==1) if!($p~~[(1,$_)]||$_%$p)น่าเสียดายที่จำเป็นต้องใช้ [] ล้อมรอบอาร์เรย์เนื่องจากตัวดำเนินการ smartmatch ~~ ยังคงอยู่ในช่วงทดลองและดูเหมือนจะไม่ทำงานอย่างถูกต้องในอาร์เรย์ที่แท้จริง แต่ใช้การอ้างอิงกับพวกเขาแทน อีก 4 sayไบต์ถูกถอดออกโดยการเอาสองอัฒภาคและชุดที่ว่างเปล่าของเครื่องหมายคำพูดหลังจากที่ผ่านมา


1
เป็นการเริ่มต้นที่ดี แต่คุณสามารถตีกอล์ฟได้มากขึ้น อย่าประกาศตัวแปร (ดังนั้นอย่าใช้my) ใช้-pธงจะมีNภายในแทนการใช้$_ $n=<>เขียนforแทนforeach(คำสั่งนี้เทียบเท่า) วางวงเล็บรอบสภาพของifที่อยู่ในตำแหน่งที่ปรับแต่งคำสั่ง (เช่นif!$c%$nแทนที่จะif(!$c%$n)ไม่มีวงเล็บที่จำเป็นในการเริ่มต้น. @a: @a=0..$e. คุณสามารถวางเพื่อforตัวแปรและ$_wiil นำมาใช้แทนเขียน. printf"%*s",1+length$e,$a[$c](คน `` sprintf` doc สำหรับรายละเอียดเกี่ยวกับที่*)
Dada

1
ใช้แทน$" แทน(คุณมี newline ครอกในรหัสของคุณ แต่ฉันไม่สามารถเขียนในความคิดเห็น) (คุณจะเพิ่มเพื่อเพิ่มในบรรทัดคำสั่ง แต่ที่ไม่นับในจำนวนไบต์) คุณอาจจะสามารถใช้ในการบันทึกหนึ่งไบต์ที่ initialisation ของ ลองดูเคล็ดลับการเล่นกอล์ฟแบบเพอร์ลมันมีเคล็ดลับที่มีประโยชน์มากมาย แต่มันก็เป็นเรื่องดีที่ได้เห็นนักกอล์ฟ Perl คนใหม่ยินดีต้อนรับ! :) (และให้อภัยความผิดพลาดในการสะกดคำฉันอาจเขียนความคิดเห็นก่อนหน้านี้เร็วเกินไป)" "say""print"\n"-M5.0100..$e=$n*$n$e
Dada

@Dada ขอบคุณสำหรับคำแนะนำของคุณ! ฉันไม่คุ้นเคยกับการเรียกใช้โค้ดในบรรทัดคำสั่ง (ฉันมักจะเรียกใช้เป็นไฟล์) แต่ฉันจะดูการทำเช่นนั้น ส่วนif!$c%$nเรื่อง! โอเปอเรเตอร์มีความสำคัญเหนือกว่าโอเปอเรเตอร์% ดังนั้นในทางเทคนิคแล้วสิ่งนี้จะเป็นif((!$c)%$n)เท็จสำหรับสิ่งอื่นนอกเหนือจาก $ c = 0 (ซึ่งฉันไม่ต้องการ) สำหรับเคล็ดลับอื่น ๆ ของคุณฉันจะเห็นสิ่งที่ฉันสามารถทำได้! ขอบคุณมาก!
Gabriel Benamy

คุณไม่จำเป็นต้องเรียกใช้มันบนบรรทัดคำสั่งการปรับเปลี่ยนเหล่านั้นจะทำงานหากคุณวางไว้ในไฟล์เช่นกัน ขออภัยที่!ฉันไม่ได้อยู่ในคอมพิวเตอร์เพื่อตรวจสอบ คุณควรจะได้รับลงไป 160 ตัวอักษรฉันคิดว่า
Dada

5

PHP, 155 ไบต์

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 ไบต์ขอบคุณ @Titus -6 ขอบคุณ

ลองมัน

ครั้งแรกที่ฉันพิมพ์ในสภาพลูป

ชำรุด

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 

เวอร์ชันก่อนหน้า 174 ไบต์

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 ไบต์เปลี่ยนเงื่อนไข: !($d<2||$a[$d]>0)=>$d>1&&$a[$d]<1
Crypto

1
-1 ไบต์โดยใช้เคล็ดลับนี้เพื่อรับความยาวจำนวนเต็ม$l=strlen($m)+1ถึง$l=log10($m)+2
Crypto

1
-3 ไบต์: $i=$d*$x=$d>1แทน$i=$d<2?0:$dและ$xสำหรับอีกสองเหตุการณ์ที่เกิดขึ้น$d>1
ติตัส

1
-2 ไบต์: $n*$n>=$i+=$dแทน($i+=$d)<=$m=$n**2และ$n*$nสำหรับการเกิดอื่น ๆ ของ$m
ติตัส

1
-1 ไบต์: นำหน้าแทนการขึ้นบรรทัดใหม่
ติตัส

3

Groovy, 201 195 191 ไบต์

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

นี่คือคลัสเตอร์ที่แน่นอน ... การจัดตำแหน่งซ้ายฆ่าจำนวนไบต์ของฉัน แต่เดี๋ยวก่อนมันใช้ได้ นี่คือผลลัพธ์สำหรับ 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.
    }        
}


2
นี่ดูไม่จัดชิดซ้ายกับฉัน
เดนนิส

แก้ไขแล้ว ... ฉันไม่ได้มีโอกาสแก้ไขจนกระทั่งตอนนี้ ...
Magic Octopus Urn

@Dennis ฉันเห็นความคิดเห็นของคุณจริงและคิดว่าเขาเปลี่ยนไปตามความคิดเห็นของคุณ
Magic Octopus Urn

3

Perl, 115 114 113 112 ไบต์

รวม +1 สำหรับ -a

รันด้วยหมายเลขอินพุตบน 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

ต้องการ Perl ล่าสุดเพียงพอเพื่อที่ว่าหมายถึง-a -nถ้า Perl ของคุณเก่าเกินไปเพิ่ม-nตัวเลือก

พิมพ์บรรทัดใหม่ที่ต่อท้ายซึ่งได้รับอนุญาต


2

Python 2, 199 202 201 bytes

+3 ไบต์ (ฉันไม่ได้หยุดเร็ว)
-1 ไบต์ขอบคุณ @Oliver (พลาดช่องว่าง)

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
คุณสามารถลบช่องว่างระหว่าง1และfor
Oliver Ni

2

JavaScript (ES6), 190 189 ไบต์

พิมพ์โดยตรงไปยังคอนโซล

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

การสาธิต


2

แบตช์ 464 ไบต์

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

มันค่อนข้างลำบาก คำอธิบาย: เริ่มต้นด้วยการกู้nเพื่อที่จะสามารถคำนวณความกว้างของคอลัมน์ที่ต้องการcและปริมาณที่เหมาะสมของการขยายการใช้ห่วงp :lห่วงนอกจาก1ไปnจากนั้นก็วิ่งครั้งสำหรับแต่ละตารางเรียก subroutine แต่ละค่าจะถูกตรวจสอบเพื่อดูว่าเป็นหนึ่งในหมายเลขเฉพาะที่พบจนถึงปัจจุบันหรือไม่หากไม่มีหมายเลขหลักที่พบในตอนนี้หาร หากเป็นเช่นนั้นค่าจะถูกรวมเข้ากับบัฟเฟอร์เอาต์พุตซึ่งจะถูกเสริมให้มีความกว้างของคอลัมน์ที่ต้องการ บัฟเฟอร์ถูกพิมพ์และล้างทุกบรรทัดและเพิ่มบรรทัดว่างพิเศษที่ท้ายตาราง ฉลากหมายถึง subroutine ปัจจัยการตรวจสอบ; f (x, y) เพิ่ม 1 ให้กับแต่ละจำนวนเต็มระหว่าง 2 ถึง:isubroutine ก่อนอื่นค่าจะถูกตรวจสอบเพื่อดูว่าเป็น 1 หรือเฉพาะ ถ้าไม่เช่นนั้นกริดนั้นจะถูกข้าม วงในจาก1ไปn*nจัดการกับแถวและคอลัมน์ของกริดเรียกรูทีนย่อย:jn:ffxหารว่าyไม่รวมyตัวเอง


2

R, 195 191 185 204 ไบต์

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

ขอบคุณ @Billywob สำหรับบันทึกเพิ่มอีก 6 ไบต์!

เยื้องกับบรรทัดใหม่:

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

การใช้งาน:

> 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                     

ดีฉันไม่สามารถหาวิธีการพิมพ์เมทริกซ์อย่างถูกต้องเพื่อให้เป็นไปตามข้อกำหนดของ codegolfing โดยไม่คำนึงถึงเหตุผล คุณสามารถบันทึกไม่กี่ไบต์โดยแม้ว่า ผู้ประกอบการยกกำลัง^เป็นเพียงคนเดียวที่ไม่ได้ vectorized เมื่อมีการสร้างลำดับการใช้:ซึ่งหมายความว่าคุณสามารถใช้เช่นที่จะได้รับ1:2^2 1 2 3 4ประการที่สองถ้าคุณกำหนดa=b=1:n^2คุณสามารถใช้ในภายหลังfor(j in b)แทนการกำหนดเวกเตอร์อื่นเพื่อวนซ้ำ ควรช่วยคุณสองสามไบต์
Billywob

แน่นอน! ขอบคุณ! ไม่สามารถจำลำดับที่แน่นอนของผู้ประกอบการมีความสำคัญ ...
plannapus

ทำไมถึงมีช่องว่างระหว่างตัวเลขใน f (2) และ f (3) และสองช่องว่างใน f (9) ควรเป็นหนึ่งช่องว่างเสมอ
Oliver Ni

โอ้ถูกต้องฉันตั้งค่าตัวละคร 3 ตัวเป็นบรรทัดฐานเพราะฉันทดสอบกับ N = 10 ขอให้ฉันแก้ไขให้ถูกต้อง
plannapus

1

J, 125 ไบต์

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

นี่เป็นเรื่องชัดเจนไม่ใช่โดยปริยาย J แต่ควรมีวิธีในการเล่นกอล์ฟโดยปริยาย

การใช้

   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

PHP, 155 150 147 145 142 140 ไบต์

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

ชำรุด

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]="";แทนที่จะunset($a[$i]);ควรบันทึก 4 ไบต์
JörgHülsermann

$i%$k<1แทนที่จะ!($i%$k)บันทึกหนึ่งไบต์
JörgHülsermann
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.