Vòng cây vuông có thể được tạo ra từ số nguyên tố?


33

Rõ ràng là có! Trong ba bước dễ dàng.

Bước 1

Gọi f ( n ) là hàm đếm số nguyên tố (số nguyên tố nhỏ hơn hoặc bằng n ).

Xác định dãy số nguyên s ( n ) như sau. Với mỗi số nguyên dương n ,

  • Bắt đầu từ t đến n .
  • Miễn là t không phải là số nguyên tố cũng không phải 1, thay thế t bằng f ( t ) và lặp lại.
  • Số lần lặp là s ( n ).

Quá trình lặp được đảm bảo kết thúc vì f ( n ) < n cho tất cả n .

Xem xét ví dụ n = 25. Chúng tôi khởi tạo t = 25. Vì đây không phải là số nguyên tố cũng không phải 1, chúng tôi tính f (25), là 9. Điều này trở thành giá trị mới cho t . Đây không phải là số nguyên tố cũng không phải 1, vì vậy chúng tôi tiếp tục: f (9) là 4. Chúng tôi tiếp tục một lần nữa: f (4) là 2. Vì đây là số nguyên tố nên chúng tôi dừng ở đây. Chúng tôi đã thực hiện 3 lần lặp (từ 25 đến 9, sau đó đến 4, sau đó đến 2). Do đó s (25) là 3.

40 điều khoản đầu tiên của chuỗi như sau. Trình tự không có trong 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

Bước 2

Với một dương lẻ số nguyên N , xây dựng một mảng N × N (ma trận) bằng cách uốn lượn các dãy hữu hạn s (1), s (2), ..., s ( N 2 ) để tạo thành một hình vuông bên ngoài xoắn ốc . Ví dụ: cho N = 5 hình xoắn ốc là

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)

hoặc, thay thế các giá trị,

 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

Bước 3

Thể hiện mảng N × N dưới dạng hình ảnh với bản đồ màu xám hoặc với một số bản đồ màu khác theo sở thích của bạn. Bản đồ nên dần dần, để thứ tự các số tương ứng với một số thứ tự trực quan rõ ràng của màu sắc. Các trường hợp thử nghiệm dưới đây cho thấy một số bản đồ màu ví dụ.

Các thách thức

Cho một số nguyên dương N lẻ , tạo ra hình ảnh được mô tả ở trên.

Quy tắc

  • Hình xoắn ốc phải hướng ra ngoài, nhưng có thể theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ, và có thể bắt đầu di chuyển sang phải (như trong ví dụ trên), trái, xuống hoặc lên.

  • Các tỷ lệ của trục ngang và trục dọc không cần phải giống nhau. Ngoài ra nhãn trục, thanh màu và các yếu tố tương tự là tùy chọn. Miễn là hình xoắn ốc có thể được nhìn thấy rõ ràng, hình ảnh là hợp lệ.

  • Hình ảnh có thể được xuất ra bởi bất kỳ phương tiện tiêu chuẩn . Cụ thể, hình ảnh có thể được hiển thị trên màn hình hoặc một tệp đồ họa có thể được tạo ra hoặc một mảng các giá trị RGB có thể được xuất ra. Nếu xuất ra một tập tin hoặc một mảng, xin vui lòng gửi một ví dụ về những gì nó trông giống như khi hiển thị.

  • Phương tiện và định dạng đầu vào là linh hoạt như bình thường . Một chương trình hoặc một chức năng có thể được cung cấp . Sơ hở tiêu chuẩn bị cấm .

  • Mã ngắn nhất trong byte thắng.

Các trường hợp thử nghiệm

Những hình ảnh sau đây (bấm vào cho đầy đủ độ phân giải) tương ứng với số giá trị của N . Một vòng xoắn theo chiều kim đồng hồ, phải-đầu tiên được sử dụng, như trong ví dụ trên. Các hình ảnh cũng minh họa một số bản đồ màu hợp lệ.

  • N = 301: nhập mô tả hình ảnh ở đây

  • N = 501: nhập mô tả hình ảnh ở đây

  • N = 701: nhập mô tả hình ảnh ở đây


Nếu một mảng các giá trị s(n)có thể được đưa vào một số hàm / gói âm mưu mà không bị sửa đổi (tôi nghĩ imshowtrong matplotlib có thể xử lý việc này chẳng hạn) thì đây có phải là một hình thức đầu ra chấp nhận được không?
dyl Nam

@dylnan Chắc chắn, miễn là nó vẽ hình ảnh trên màn hình hoặc tạo ra một tập tin hợp lệ. Trong thực tế, tôi đã tạo ra các ví dụ với một cái gì đó tương tự như những gì bạn đề cập. Chỉ cần cẩn thận với quy mô của các giá trị. Ví dụ đó là không thể chấp nhận được nếu tất cả các giá trị trên 1 được cung cấp cùng một màu sắc, như Matlab (và có thể Matplotlib của) imshowlàm
Luis Mendo

điểm tốt. Không chắc chắn nếu imshowlàm điều đó.
dylnan

1
@ kamoroso94 Vui lòng xem tại đây
Luis Mendo

1
Vâng rất rõ ràng
Christopher

Câu trả lời:


3

APL Dyalog, 94 byte

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

giả định ⎕IO=0

đầu ra cho n = 701 (được chuyển đổi từ .pgm sang .png):

nhập mô tả hình ảnh ở đây


10

MATLAB - 197 185 178 175 184 163 162 148 142 140 byte

Cạo 12 byte, cảm ơn Ander và Andras, và rất cảm ơn Luis vì đã kết hợp hai thứ đó lại với nhau. Cạo 16 nhờ Remco, 6 nhờ flawr

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

Kết quả cho N=301( F(301)):

nhập mô tả hình ảnh ở đây

Giải trình:

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

Ngôn ngữ Wolfram (Mathicala) , 124 byte

Cảm ơn Martin Ender đã lưu 12 byte!

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

Hãy thử trực tuyến!


Hình ảnh được tạo là:

Xoắn ốc

Công thức dạng đóng của giá trị xoắn ốc lấy trực tiếp từ câu trả lời này của tôi.


5
#/2-.5tiết kiệm một byte.
dùng202729

8
Haha, bạn đang gợi ý điều đó cho chính mình?
Luis Mendo

6
@ user202729 Dường như không hoạt động.
dùng202729

18
Tôi không có ý làm gián đoạn cuộc đối thoại nội tâm của bạn :-P
Luis Mendo

Trì hoãn định nghĩa pcho đến khi bạn cần nó:...,{y,p=(1-#)/2,-p},{x,p,-p}
Martin Ender

7

MATLAB: 115 114 110 byte

Một lớp lót (chạy trong R2016b + dưới dạng hàm trong tập lệnh ) 115 byte

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

Đưa hàm vào một tệp riêng, như được đề xuất bởi flawr và sử dụng 1 byte bổ sung cho mỗi quy tắc tệp bổ sung

Trong tệp s.m, 64 + 1 byte cho mã + tệp

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

Cửa sổ lệnh để xác định I, 45 byte

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

Tổng cộng: 110 byte


Điều này sử dụng đệ quy thay vì whilelặp như các triển khai MATLAB khác ( gnovice , Adriaan ). Chạy nó dưới dạng tập lệnh (trong R2016b hoặc mới hơn), điều này xác định chức năng Icó thể chạy như thế nào I(n).

Phiên bản có cấu trúc:

% 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

Thí dụ:

I(301)

âm mưu

Ghi chú:

  • Tôi đã cố gắng để làm cho schức năng ẩn danh quá, tất nhiên điều đó sẽ làm giảm số lượng đáng kể. Tuy nhiên, có 2 vấn đề:

    1. Đệ quy vô hạn là điều khó tránh khi sử dụng các hàm ẩn danh, vì MATLAB không có toán tử ternary để đưa ra một điều kiện ngắt. Việc tránh một toán tử ternary của các loại (xem bên dưới) cũng tốn byte vì chúng ta cần điều kiện hai lần.

    2. Bạn phải truyền một hàm ẩn danh cho chính nó nếu nó được đệ quy (xem ở đây ) để thêm byte.

    Lần gần nhất tôi đến đây đã sử dụng các dòng sau, có lẽ nó có thể được thay đổi để hoạt động:

    % 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 * byte

Tôi đã thử một cách tiếp cận véc tơ hơn Adriaan và có thể loại bỏ nhiều byte hơn. Đây là giải pháp một dòng:

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

Và đây là giải pháp được định dạng độc đáo:

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

* Lưu ý: nếu bạn sẵn sàng cho phép một crapton số lần lặp không cần thiết, bạn có thể thay đổi dòng while any(i), thành for m=v, và lưu 5 byte.


Tốt đẹp! Tôi thích cách bạn sử dụng cumsumđể vector hóa và tránhnnz(primes(...)
Luis Mendo

1
Nếu tôi hiểu chính xác, sẽ không hại gì khi lặp lại nhiều lần hơn mức cần thiết (với chi phí tốc độ). Vì vậy, bạn có thể thay thế while any(i)bằng for m=M. Ai quan tâm nếu mã phải mất hàng giờ để chạy :-)
Luis Mendo

2
@LuisMendo: Chắc chắn, tại sao không? Nó đã lặp đi lặp lại nhiều lần hơn mức cần thiết, những gì n^2lặp đi lặp lại sẽ làm tổn thương! ;)
gnovice

1
Đó là tinh thần! Bạn cũng có thể giữ phiên bản chạy nhanh hơn, nhưng số byte là ngắn hơn
Luis Mendo

2

Python 3, 299 265 byte

Đã lưu 5 byte nhờ các đề xuất định dạng từ Jonathan Frech và NoOneIsHere. Đã xóa thêm 34 byte bằng cách xóa định nghĩa hàm chỉ được gọi một lần.

Điều này dài hơn một chút so với một số người khác, do python không có lệnh để xác định tính nguyên thủy hoặc xoắn ốc một mảng. Nó chạy tương đối nhanh, tuy nhiên, khoảng một phút cho 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

Kiểm tra nó với

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

1
Có thể 294 byte (chưa được kiểm tra).
Jonathan Frech

1
Một điều nhanh chóng: bạn có thể loại bỏ khoảng cách giữa import*.
NoOneIsĐây là

2

J, 121 byte

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

Xác định hàm:

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 byte

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

Hơi ít chơi golf:

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
}

Chức năng ẩn danh. Đầu ra trong một cửa sổ đồ họa. Tỷ lệ nằm trên thang màu đỏ với màu tối nhất bằng 0 và các giá trị tăng dần rõ hơn.

Kết quả cho n = 101:

n = 101

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.