สามารถสร้างวงต้นไม้แบบสี่เหลี่ยมจากช่วงเวลาได้หรือไม่?


33

เห็นได้ชัดว่าใช่! ในสามขั้นตอนง่าย ๆ

ขั้นตอนที่ 1

ให้f ( n ) แสดงถึงฟังก์ชั่นการนับจำนวนเฉพาะ (จำนวนของจำนวนเฉพาะน้อยกว่าหรือเท่ากับn )

กำหนดลำดับ จำนวนเต็มs ( n ) ดังต่อไปนี้ สำหรับแต่ละจำนวนเต็มบวกn ,

  • Initiallize เสื้อเพื่อn
  • ตราบใดที่tไม่ใช่ไพร์มหรือ 1 ให้แทนที่tด้วยf ( t ) และวนซ้ำ
  • จำนวนการวนซ้ำคือs ( n )

กระบวนการซ้ำรับประกันได้ว่าจะสิ้นสุดเพราะ ( n ) < nสำหรับทุกn

ลองพิจารณาตัวอย่างn = 25 เรา initiallize T = 25 ตั้งแต่นี้ไม่ได้เป็นนายกมิได้ 1 เราคำนวณ (25) ซึ่งเป็น 9 นี้จะกลายเป็นค่าใหม่สำหรับเสื้อ นี่ไม่ใช่ไพร์มหรือ 1 ดังนั้นเราจึงดำเนินการต่อ: f (9) คือ 4 เราดำเนินการอีกครั้ง: f (4) คือ 2 เนื่องจากนี่คือไพรม์เราหยุดที่นี่ เราได้ทำซ้ำ 3 ครั้ง (จาก 25 ถึง 9 จากนั้นเป็น 4 จากนั้นเป็น 2) ดังนั้นs (25) คือ 3

40 คำแรกของลำดับมีดังนี้ ลำดับไม่ได้อยู่ใน OEIS

0 0 0 1 0 1 0 2 2 2 0 1 0 2 2 2 0 1 0 3 3 3 0 3 3 3 3 3 0 3 0 1 1 1 1 1 0 2 2 2

ขั้นตอนที่ 2

ได้รับการบวกจำนวนเต็มคี่Nสร้างอาร์เรย์ N ร N (เมทริกซ์) โดยคดเคี้ยวลำดับ จำกัดs (1), s (2), ... , s ( N 2 ) รูปแบบตารางออกไปด้านนอกเกลียว ตัวอย่างเช่นกำหนดN = 5 เป็นเกลียว

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

หรือแทนที่ค่า

 3       3       0       3       3
 3       0       2       2       2
 0       1       0       0       0
 1       0       1       0       1
 0       2       2       2       0

ขั้นตอนที่ 3

แสดงอาร์เรย์ N × N เป็นรูปภาพที่มีแผนที่สีเทาหรือแผนที่สีอื่น ๆ ที่คุณชอบ แผนที่ควรค่อยเป็นค่อยไปเพื่อให้ลำดับของตัวเลขสอดคล้องกับลำดับของสีที่เห็นได้ชัดเจน กรณีทดสอบด้านล่างแสดงแผนที่สีบางตัวอย่าง

ความท้าทาย

ได้รับการบวกจำนวนเต็มคี่N , ผลิตภาพที่อธิบายข้างต้น

กฎระเบียบ

  • เกลียวจะต้องออกไปด้านนอก แต่สามารถตามเข็มนาฬิกาหรือทวนเข็มนาฬิกาและสามารถเริ่มย้ายไปทางขวา (เช่นในตัวอย่างข้างต้น), ซ้าย, ขึ้นหรือลง

  • ตาชั่งของแกนนอนและแนวตั้งไม่จำเป็นต้องเหมือนกัน นอกจากนี้ยังมีป้ายกำกับแกนแถบสีและองค์ประกอบที่คล้ายกันเป็นตัวเลือก ตราบเท่าที่เกลียวสามารถมองเห็นได้อย่างชัดเจนภาพที่ถูกต้อง

  • ภาพที่สามารถส่งออกโดยใด ๆ ของวิธีการมาตรฐาน โดยเฉพาะอย่างยิ่งภาพอาจปรากฏบนหน้าจอหรือไฟล์กราฟิกอาจจะผลิตหรืออาร์เรย์ของค่า RGB อาจถูกส่งออก หากการส่งออกไฟล์หรืออาร์เรย์กรุณาโพสต์ตัวอย่างของสิ่งที่ดูเหมือนว่าเมื่อแสดง

  • วิธีการป้อนข้อมูลและรูปแบบที่มีความยืดหยุ่นได้ตามปกติ โปรแกรมหรือฟังก์ชั่นสามารถให้ ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

  • รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

กรณีทดสอบ

ภาพต่อไปนี้ (คลิกเพื่อความละเอียดเต็ม) สอดคล้องกับค่านิยมของหลายN ใช้เกลียวเกลียวนาฬิกาด้านขวา - ขวาตามตัวอย่างด้านบน รูปภาพยังแสดงแผนที่สีที่ถูกต้องหลายรายการ

  • N = 301: ป้อนคำอธิบายรูปภาพที่นี่

  • N = 501: ป้อนคำอธิบายรูปภาพที่นี่

  • N = 701: ป้อนคำอธิบายรูปภาพที่นี่


หากอาร์เรย์ของค่าของs(n)สามารถป้อนลงในฟังก์ชั่นการพล็อต / แพคเกจโดยไม่ต้องมีการแก้ไข (ฉันคิดว่าimshowใน matplotlib สามารถจัดการเรื่องนี้ได้ตัวอย่าง) นี่เป็นรูปแบบผลลัพธ์ที่ยอมรับได้หรือไม่?
dylnan

@ dylnan แน่นอนว่าตราบใดที่มันแปลงภาพบนหน้าจอหรือสร้างไฟล์ที่ถูกต้อง อันที่จริงฉันสร้างตัวอย่างด้วยสิ่งที่คล้ายกับที่คุณพูดถึง เพียงระมัดระวังด้วยการปรับขนาดของค่า ยกตัวอย่างเช่นมันเป็นที่ยอมรับไม่ได้หากค่าทั้งหมดดังกล่าวข้างต้นจะได้รับ 1 สีเช่นเดียวกับของ Matlab (และอาจ Matplotlib ของ) imshowไม่
หลุยส์ Mendo

จุดดี. ไม่แน่ใจว่าimshowทำอย่างนั้นหรือไม่
dylnan

1
@ kamoroso94 โปรดดูที่นี่
Luis Mendo

1
ใช่ชัดเจนมาก
คริสโตเฟอร์

คำตอบ:


3

Dyalog APL, 94 ไบต์

'P2'
2⍴n←⎕
9
(⍪0){×≢⍵:(≢⍺)((⍉∘⌽⍺,↑)∇↓)⍵⋄⍺}2↓{⍵⌊1+⍵[+\p]}⍣≡9×~p←1=⊃+/(≠⍨,≠⍨,~⍴⍨(×⍨n)-2×≢)¨,\×⍳n

ถือว่า ⎕IO=0

เอาต์พุตสำหรับ n = 701 (แปลงจาก .pgm เป็น .png):

ป้อนคำอธิบายรูปภาพที่นี่


10

MATLAB - 197 185 178 175 184 163 162 148 142 140 ไบต์

โกนได้ 12 ไบต์ขอบคุณ Ander และ Andras และขอขอบคุณ Luis สำหรับการรวมสองตัวเข้าด้วยกัน โกน 16 ครั้งขอบคุณ Remco, 6 ขอบคุณข้อบกพร่อง

function F(n)
p=@primes
s=@isprime
for a=2:n^2
c=0
if~s(a)
b=nnz(p(a))
while~s(b)
b=nnz(p(b))
c=c+1
end
end
d(a)=c
end
imagesc(d(spiral(n)))

ผลลัพธ์สำหรับN=301( F(301)):

ป้อนคำอธิบายรูปภาพที่นี่

คำอธิบาย:

function F(n)
p=@primes % Handle
s=@isprime % Handle
for a=2:n^2 % Loop over all numbers
    c=0 % Set initial count
    if~s(a) % If not a prime
        b=nnz(p(a)) % Count primes
        while~s(b) % Stop if b is a prime. Since the code starts at 2, it never reaches 1 anyway
            b=nnz(p(b)) % count again
            c=c+1 % increase count
        end
    end
    d(a)=c % store count
end
imagesc(d(spiral(n))) % plot

8

ภาษา Wolfram (Mathematica) , 124 ไบต์

ขอบคุณMartin Ender ที่ช่วยประหยัด 12 ไบต์!

Image[#/Max@#]&[Array[(n=0;Max[4#2#2-Max[+##,3#2-#],4#
#-{+##,3#-#2}]+1//.x_?CompositeQ:>PrimePi[++n;x];n)&,{#,#},(1-#)/2]]&

ลองออนไลน์!


ภาพที่สร้างขึ้นคือ:

เกลียว

สูตรรูปแบบปิดของค่าเกลียวที่นำโดยตรงจากคำตอบของฉันนี้


5
#/2-.5บันทึกเป็นไบต์
user202729

8
ฮ่าฮ่าคุณแนะนำให้ตัวเองเหรอ?
Luis Mendo

6
@ user202729 ดูเหมือนจะไม่ทำงาน
user202729

18
ฉันไม่ได้ตั้งใจจะขัดจังหวะบทสนทนาภายในของคุณ :-P
Luis Mendo

เลื่อนคำจำกัดความของpจนกว่าคุณจะต้องการ:...,{y,p=(1-#)/2,-p},{x,p,-p}
Martin Ender

7

MATLAB: 115 114 110 ไบต์

สายการบินหนึ่ง (ทำงานใน R2016b + เป็นฟังก์ชันในสคริปต์ ) 115 ไบต์

I=@(N)imagesc(arrayfun(@(x)s(x,0),spiral(N)));function k=s(n,k);if n>1&~isprime(n);k=s(nnz(primes(n)),k+1);end;end

วางฟังก์ชั่นในไฟล์แยกต่างหากตามที่แนะนำโดย flawr และใช้1 ไบต์เพิ่มเติมต่อกฎไฟล์เพิ่มเติม

ในไฟล์s.m64 + 1 ไบต์สำหรับรหัส + ไฟล์

function k=s(n,k);if n>1&~isprime(n);k=s(nnz(primes(n)),k+1);end

หน้าต่างคำสั่งเพื่อกำหนดIขนาด 45 ไบต์

I=@(N)imagesc(arrayfun(@(x)s(x,0),spiral(N)))

ทั้งหมด: 110 ไบต์


ใช้การสอบถามซ้ำแทนการwhileวนซ้ำเหมือนการนำ MATLAB ไปใช้งานอื่น ( gnovice , Adriaan ) เรียกใช้เป็นสคริปต์ (ใน R2016b หรือใหม่กว่า) นี่เป็นการกำหนดฟังก์ชั่นIที่สามารถเรียกใช้ได้I(n)ใช้ได้

รุ่นที่มีโครงสร้าง:

% Anonymous function for use, i.e. I(301)
% Uses arrayfun to avoid for loop, spiral to create spiral!
I=@(N)imagesc(arrayfun(@(x)s(x,0),spiral(N)));

% Function for recursively calculating the s(n) value
function k=s(n,k)
    % Condition for re-iterating. Otherwise return k unchanged
    if n>1 && ~isprime(n)
        % Increment k and re-iterate
        k = s( nnz(primes(n)), k+1 );
    end
end

ตัวอย่าง:

I(301)

พล็อต

หมายเหตุ:

  • ฉันพยายามทำให้sฟังก์ชั่นไม่ระบุชื่อด้วยเช่นกันซึ่งแน่นอนว่าจะลดจำนวนลงอย่างมาก อย่างไรก็ตามมี 2 ประเด็น:

    1. การเรียกซ้ำแบบไม่สิ้นสุดเป็นเรื่องยากที่จะหลีกเลี่ยงเมื่อใช้งานฟังก์ชั่นที่ไม่ระบุชื่อเนื่องจาก MATLAB ไม่มีตัวดำเนินการแบบไตรภาคเพื่อเสนอเงื่อนไขการพัก การรวมตัวดำเนินการแบบไตรภาค (ดูด้านล่าง) ยังมีค่าใช้จ่ายเป็นไบต์เช่นกันเมื่อเราต้องการเงื่อนไขสองครั้ง

    2. คุณจะต้องผ่านฟังก์ชั่นที่ไม่ระบุชื่อไปยังตัวมันเองถ้ามันเรียกซ้ำ (ดูที่นี่ ) ซึ่งจะเพิ่มไบต์

    ฉันเข้ามาใกล้ที่สุดนี้ใช้บรรทัดต่อไปนี้บางทีมันอาจจะเปลี่ยนเป็นงาน:

    % Condition, since we need to use it twice 
    c=@(n)n>1&&~isprime(n);
    % This uses a bodged ternary operator, multiplying the two possible outputs by
    % c(n) and ~c(n) and adding to return effectively only one of them
    % An attempt was made to use &&'s short-circuiting to avoid infinite recursion
    % but this doesn't seem to work!
    S=@(S,n,k)~c(n)*k+c(n)&&S(S,nnz(primes(n)),k+1);

6

MATLAB - 126 121 *ไบต์

ฉันพยายามใช้วิธีเวกเตอร์มากกว่าAdriaanและสามารถลดจำนวนไบต์ได้มากขึ้น นี่คือโซลูชันบรรทัดเดียว:

function t(n),M=1:n^2;c=0;i=1;s=@isprime;v=cumsum(s(M));while any(i),i=M>1&~s(M);c=c+i;M(i)=v(M(i));end;imagesc(c(spiral(n)))

และนี่คือรูปแบบที่เหมาะสม:

function t(n),
  M = 1:n^2;
  c = 0;
  i = 1;
  s = @isprime;
  v = cumsum(s(M));
  while any(i),         % *See below
    i = M > 1 & ~s(M);
    c = c+i;
    M(i) = v(M(i));
  end;
  imagesc(c(spiral(n)))

* หมายเหตุ: หากคุณยินดีที่จะอนุญาตให้ใช้การวัดซ้ำโดยไม่จำเป็นคุณสามารถเปลี่ยนบรรทัด while any(i), เป็น for m=v, และบันทึกได้ 5 ไบต์


ดี! ฉันชอบวิธีที่คุณใช้ในการcumsumทำให้เป็นเวกเตอร์และหลีกเลี่ยงnnz(primes(...)
Luis Mendo

1
ถ้าฉันเข้าใจถูกต้องมันไม่เจ็บซ้ำไปซ้ำมากกว่าที่จำเป็น (ด้วยความเร็ว) ดังนั้นคุณสามารถแทนที่โดยwhile any(i) for m=Mใครจะสนใจว่ารหัสนี้ใช้เวลาหลายชั่วโมงในการทำงาน :-)
Luis Mendo

2
@ LuisMendo: แน่นอนทำไมไม่ มันซ้ำแล้วซ้ำอีกมากกว่าที่จำเป็นมีอะไรซ้ำแล้วซ้ำอีกn^2หรือจะเจ็บ! ;)
gnovice

1
นั่นคือจิตวิญญาณ! นอกจากนี้คุณยังสามารถรักษาเวอร์ชันที่รันเร็วขึ้นได้ แต่จำนวนไบต์นั้นสั้นกว่า
Luis Mendo

2

Python 3, 299 265 ไบต์

บันทึก 5 ไบต์ด้วยการจัดรูปแบบคำแนะนำจาก Jonathan Frech และ NoOneIsHere ลบ 34 ไบต์เพิ่มเติมโดยลบนิยามฟังก์ชั่นที่ถูกเรียกเพียงครั้งเดียว

นี่เป็นเวลานานกว่าบางคนเล็กน้อยเนื่องจากไพ ธ อนไม่ได้มีคำสั่งในการกำหนดความไพเราะหรืออาร์เรย์จำนวนมาก มันทำงานค่อนข้างเร็ว n = 700แต่รอบนาทีสำหรับ

from pylab import*
def S(n):
 q=arange(n*n+1);t=ones_like(q)
 for i in q[2:]:t[2*i::i]=0
 c=lambda i:0 if t[i]else 1+c(sum(t[2:i]));S=[c(x)for x in q]
 t=r_[[[S[1]]]]
 while any(array(t.shape)<n):m=t.shape;i=multiply(*m)+1;t=vstack([S[i:i+m[0]],rot90(t)])
 return t

ทดสอบด้วย

n = 7
x = S(n)
imshow(x, interpolation='none')
colorbar()
show(block=False)

1
เป็นไปได้ 294 ไบต์ (ไม่ได้ทดสอบ)
Jonathan Frech

1
สิ่งหนึ่งที่รวดเร็ว: คุณสามารถลบช่องว่างระหว่างและimport *
NoOneIsHere ที่

2

J, 121 ไบต์

load 'viewmat'
a=:3 :'viewmat{:@((p:inv@{.,>:@{:)^:(-.@((=1:)+.1&p:)@{.)^:_)@(,0:)"0(,1+(i.@#+>./)@{:)@|:@|.^:(+:<:y),.1'

กำหนดฟังก์ชั่น:

a=:3 :'viewmat{:@((p:inv@{.,>:@{:)^:(-.@((=1:)+.1&p:)@{.)^:_)@(,0:)"0(,1+(i.@#+>./)@{:)@|:@|.^:(+:<:y),.1' | Full fuction
                                                                     (,1+(i.@#+>./)@{:)@|:@|.^:(+:<:y),.1  | Creates the number spiral
              {:@((p:inv@{.,>:@{:)^:(-.@((=1:)+.1&p:)@{.)^:_)@(,0:)"0                                      | Applies S(n) to each element
       viewmat                                                                                             | View the array as an image

2

R, 231 ไบต์

function(n){p=function(n)sum(!n%%2:n)<2;M=matrix(0,n,n);M[n^2%/%2+cumsum(c(1,head(rep(rep(c(1,-n,-1,n),l=2*n-1),rev(n-seq(n*2-1)%/%2)),-1)))]=sapply(1:(n^2),function(x){y=0;while(x>2&!p(x)){x=sum(sapply(2:x,p));y=y+1};y});image(M)}

golfed น้อยกว่าเล็กน้อย:

function(n){
    p=function(n)sum(!n%%2:n)<2 #"is.prime" function
    M=matrix(0,n,n)             #empty matrix
    indices=n^2%/%2+cumsum(c(1,head(rep(rep(c(1,-n,-1,n),l=2*n-1),rev(n-seq(n*2-1)%/%2)),-1)))
    values=sapply(1:(n^2),function(x){
        y=0
        while(x>2&!p(x)){
            x=sum(sapply(2:x,p))
            y=y+1
            }
        y})
    M[indices]=values
    image(M) #Plotting
}

ฟังก์ชั่นไม่ระบุชื่อ เอาท์พุทในหน้าต่างกราฟิก สเกลอยู่บนสเกลสีแดงที่มีสีเข้มที่สุดเท่ากับ 0 และเฉดสีที่ชัดเจนเพิ่มค่า

ผลลัพธ์สำหรับ n = 101:

n = 101

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.