Những số nguyên tố của tôi luôn luôn là đường thẳng


12

Chúng ta hãy tạo một lưới không gian N × N và dấu gạch dưới có thể được sử dụng để xác định trực quan nếu một số là số nguyên tố. (N có thể là bất kỳ số nguyên dương nào.)

Lưới này có ba quy tắc đơn giản:

  1. Cột thứ n chứa mẫu lặp lại của n - 1 dấu gạch dưới theo sau là một khoảng trắng. Mẫu này bắt đầu ở hàng đầu tiên và được dừng lại, có thể là mẫu giữa, tại hàng N. (Hàng và cột được lập chỉ mục 1).
  2. Cột đầu tiên được thay thế bằng tất cả các dấu gạch dưới thay vì tất cả các khoảng trắng.
  3. Nếu một khoảng trắng xuất hiện ở đâu đó thì chỉ mục hàng bằng với chỉ mục cột, nó được thay thế bằng dấu gạch dưới.

Ví dụ: N = 10

           1
  1234567890 <-- column indices
 1__________
 2__________
 3__________
 4_ ________
 5__________
 6_  _______
 7__________
 8_ _ ______
 9__ _______
10_ __ _____
 ^ row indices

Các chỉ số chỉ cho rõ ràng. Bản thân lưới đơn giản (những gì chương trình của bạn phải xuất) là:

__________
__________
__________
_ ________
__________
_  _______
__________
_ _ ______
__ _______
_ __ _____

Thông báo rằng:

  • Cột đầu tiên là tất cả các dấu gạch dưới.
  • Cột thứ hai đi vào không gian gạch dưới, không gian gạch dưới, v.v., ngoại trừ dấu gạch dưới ở hàng 2.
  • Cột thứ ba đi vào không gian gạch dưới, gạch dưới gạch dưới, v.v., ngoại trừ dấu gạch dưới ở hàng 3.
  • Vân vân.

Cũng lưu ý rằng ngoài 1, chỉ các hàng được đánh số nguyên tố có dấu gạch dưới trong mỗi cột.

Vì dấu gạch dưới bao trùm toàn bộ chiều rộng phông chữ, mỗi hàng được đánh số nguyên tố tạo thành một đường liền nét liên tục. Vì vậy, kiểm tra xem một số có phải là số nguyên tố hay không là khá dễ dàng; chỉ cần kiểm tra xem dòng của nó có vững chắc trên tất cả các cột không. (Trong thực tế, việc tìm kiếm căn bậc hai của chỉ số hàng là đủ nhưng xuất ra lưới đó có vẻ kém thanh lịch hơn.)

Chương trình

Viết chương trình sẽ vẽ các lưới đã cho N thông qua stdin (hoặc thay thế gần nhất). Đầu ra đi đến thiết bị xuất chuẩn (hoặc thay thế gần nhất) và chỉ nên chứa khoảng trắng, dấu gạch dưới và dòng mới, với một dòng mới tùy chọn.

Mã ngắn nhất sẽ thắng.


Tôi không hiểu làm thế nào để xác định số nguyên tố
Filip Bartuzi

5
@FilipBartuzi Có thể xem en.wikipedia.org/wiki/Sieve_of_Eratosthenes

"Cột thứ n chứa mẫu lặp lại của n - 1 dấu gạch dưới theo sau là một khoảng trắng." Vì vậy, cột n = 1 không phải là tất cả các không gian, không phải tất cả các dấu gạch dưới?
thuật toán

6
Tôi phải nói rằng tôi không đặc biệt thích yêu cầu "không có dòng mới". Điều này rất khó khăn trong một số ngôn ngữ, hoàn toàn không thể ở những ngôn ngữ khác và nó chỉ ảnh hưởng đến các chương trình in ra STDOUT.
Dennis

4
Mô tả thật khó để tôi hiểu. Đây là cách tôi mô tả nó: Bắt đầu với một lưới gồm N dòng N gạch dưới. Đối với ndòng thứ, hãy đặt kký tự thứ một thành khoảng trắng nếu klà ước của số mđó không phải là 1 hoặc m.
Casey Chu

Câu trả lời:


7

CJam, 33 28 27 byte

q~,:)_f{f{md\1=+'_S?}0'_tN}

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

Làm thế nào nó hoạt động

q~        " Read one line from STDIN and evaluate it.                                     ";
,:)       " For “N”, push [ 1 ... N ].                                                    ";
_         " Push a copy.                                                                  ";
f{        " For each “I in [ 1 ... N ], push “I   [ 1 ... N ]”; then:                     ";
  f{      " For each “J in [ 1 ... N ], push “J   I”; then:                               ";
    md\   " Push “J % I   J / I”.                                                         ";
    1=+   " Calculate “J % I + (J / I == 1)”.                                             ";
    '_S?  " Push an underscore if the result is truthy and a space otherwise.             ";
  }       "                                                                               ";
  0'_t    " Replace the first character of the resulting array by an underscore.          ";
  N       " Push a newline.                                                               ";
}         "                                                                               ";

Chạy ví dụ

$ cjam solid-primes.cjam <<< 10
__________
__________
__________
_ ________
__________
_  _______
__________
_ _ ______
__ _______
_ __ _____
$ cjam solid-primes.cjam <<< 100 | md5sum # trailing newline
e4396b316989813dada21141b569ccf9  -

Tôi sẽ đăng một lời giải thích khi tôi chơi golf.
Dennis

9
33 byte và bạn chưa chơi golf ??

5

Ruby, 77 73 ký tự

puts (1..n=gets.to_i).map{|a|?_+(2..n).map{|b|a!=b&&a%b==0? ' ':?_}.join}

Một số thủ thuật tôi đã sử dụng:

  • Các ..nhà điều hành đã gần như được ưu tiên thấp nhất của tất cả các nhà khai thác trong Ruby, vì vậy (1..n=gets.to_i)chỉ hoạt động.

  • Thay vì thêm một a!=1điều kiện bổ sung khi kiểm tra xem liệu ký tự có phải là khoảng trắng thay vì dấu gạch dưới không (vì hàng đầu tiên là tất cả các dấu gạch dưới), tôi chỉ bắt đầu phạm vi từ 2và thêm một dấu phụ ?_.

  • Dòng A có thể trở thành dòng B:

    A | a%b==0&&a!=b ? ' ':?_
    B | a!=b&&a%b==0? ' ':?_
    

    bởi vì tôi phải có thêm một khoảng trắng giữa b?trong dòng A, nhưng điều đó không cần thiết giữa 0?trong dòng B. b?là một phương thức Ruby hợp lệ, nhưng 0?không phải.

  • putssẽ tự động tham gia các mảng với dòng mới cho bạn, loại bỏ sự cần thiết phải thêm *"\n".

Đầu ra cho n=100:

____________________________________________________________________________________________________
____________________________________________________________________________________________________
____________________________________________________________________________________________________
_ __________________________________________________________________________________________________
____________________________________________________________________________________________________
_  _________________________________________________________________________________________________
____________________________________________________________________________________________________
_ _ ________________________________________________________________________________________________
__ _________________________________________________________________________________________________
_ __ _______________________________________________________________________________________________
____________________________________________________________________________________________________
_   _ ______________________________________________________________________________________________
____________________________________________________________________________________________________
_ ____ _____________________________________________________________________________________________
__ _ _______________________________________________________________________________________________
_ _ ___ ____________________________________________________________________________________________
____________________________________________________________________________________________________
_  __ __ ___________________________________________________________________________________________
____________________________________________________________________________________________________
_ _  ____ __________________________________________________________________________________________
__ ___ _____________________________________________________________________________________________
_ ________ _________________________________________________________________________________________
____________________________________________________________________________________________________
_   _ _ ___ ________________________________________________________________________________________
____ _______________________________________________________________________________________________
_ __________ _______________________________________________________________________________________
__ _____ ___________________________________________________________________________________________
_ _ __ ______ ______________________________________________________________________________________
____________________________________________________________________________________________________
_  _  ___ ____ _____________________________________________________________________________________
____________________________________________________________________________________________________
_ _ ___ _______ ____________________________________________________________________________________
__ _______ _________________________________________________________________________________________
_ ______________ ___________________________________________________________________________________
____ _ _____________________________________________________________________________________________
_   _ __ __ _____ __________________________________________________________________________________
____________________________________________________________________________________________________
_ ________________ _________________________________________________________________________________
__ _________ _______________________________________________________________________________________
_ _  __ _ _________ ________________________________________________________________________________
____________________________________________________________________________________________________
_  __  ______ ______ _______________________________________________________________________________
____________________________________________________________________________________________________
_ _ ______ __________ ______________________________________________________________________________
__ _ ___ _____ _____________________________________________________________________________________
_ ____________________ _____________________________________________________________________________
____________________________________________________________________________________________________
_   _ _ ___ ___ _______ ____________________________________________________________________________
______ _____________________________________________________________________________________________
_ __ ____ ______________ ___________________________________________________________________________
__ _____________ ___________________________________________________________________________________
_ _ ________ ____________ __________________________________________________________________________
____________________________________________________________________________________________________
_  __ __ ________ ________ _________________________________________________________________________
____ _____ _________________________________________________________________________________________
_ _ __  _____ _____________ ________________________________________________________________________
__ _______________ _________________________________________________________________________________
_ __________________________ _______________________________________________________________________
____________________________________________________________________________________________________
_     ___ _ __ ____ _________ ______________________________________________________________________
____________________________________________________________________________________________________
_ ____________________________ _____________________________________________________________________
__ ___ _ ___________ _______________________________________________________________________________
_ _ ___ _______ _______________ ____________________________________________________________________
____ _______ _______________________________________________________________________________________
_  __ ____ __________ __________ ___________________________________________________________________
____________________________________________________________________________________________________
_ _ ____________ ________________ __________________________________________________________________
__ ___________________ _____________________________________________________________________________
_ __ _ __ ___ ____________________ _________________________________________________________________
____________________________________________________________________________________________________
_   _ _  __ _____ _____ ___________ ________________________________________________________________
____________________________________________________________________________________________________
_ __________________________________ _______________________________________________________________
__ _ _________ _________ ___________________________________________________________________________
_ _ ______________ __________________ ______________________________________________________________
______ ___ _________________________________________________________________________________________
_  __ ______ ____________ ____________ _____________________________________________________________
____________________________________________________________________________________________________
_ _  __ _ _____ ___ ___________________ ____________________________________________________________
__ _____ _________________ _________________________________________________________________________
_ ______________________________________ ___________________________________________________________
____________________________________________________________________________________________________
_   _  ____ _ ______ ______ _____________ __________________________________________________________
____ ___________ ___________________________________________________________________________________
_ ________________________________________ _________________________________________________________
__ _________________________ _______________________________________________________________________
_ _ ___ __ __________ _____________________ ________________________________________________________
____________________________________________________________________________________________________
_  _  __  ____ __ ___________ ______________ _______________________________________________________
______ _____ _______________________________________________________________________________________
_ _ __________________ ______________________ ______________________________________________________
__ ___________________________ _____________________________________________________________________
_ ____________________________________________ _____________________________________________________
____ _____________ _________________________________________________________________________________
_   _ _ ___ ___ _______ _______ _______________ ____________________________________________________
____________________________________________________________________________________________________
_ ____ ______ __________________________________ ___________________________________________________
__ _____ _ _____________________ ___________________________________________________________________
_ _  ____ _________ ____ ________________________ __________________________________________________

Bây giờ bao gồm Extra-Special ™ Mega-Colourful Red © Highlight-Magic ™ ® Extended Edition ©: (nhấp vào hình thu nhỏ để phóng to)

Ruby có màu, 110 ký tự

puts (1..n=gets.to_i).map{|a|x=(2..n).map{|b|a!=b&&a%b==0? ' ':?_}.join;x.index(' ')??_+x :"\e[41m_#{x}\e[0m"}

Phiên bản mở rộng


1
Có vẻ như nó phải là một mảnh nhỏ ...
Beta Decay

Loại bỏ không gian trong ternary trước ' '. Nó có thể làm rối cú pháp tô sáng của bạn, nhưng nó vẫn hoạt động đúng. Ngoài ra,a%b<1
Mực giá trị

*''sẽ hoạt động giống như tham gia và bạn có thể kiểm tra a<bthay a!=bvì không có yếu tố nào của a lớn hơn a. Cũng có thể có các khoản tiết kiệm từ việc cắt thành một chuỗi hai ký tự với kết quả của một số phép toán trên a và b thay vì sử dụng một ternary.
lịch sử

5

J - 28 char

1('_ '{~0==+&|:1&=+|/~)@:+i.

Giải thích bằng vụ nổ:

1(                    )@:+i.  NB. on vector 1..n, do
                   |/~        NB. take the table "column modulo row"
               1&=+           NB. add 1 to column 1
          =                   NB. identity matrix of size 10
            &|:               NB. transpose both tables (now table is row mod col)
           +                  NB. add them
  '_ '{~0=                    NB. space if cell=0 else underscore

Nó trông như thế nào:

   1('_ '{~0==+&|:1&=+|/~)@:+i.25
_________________________
_________________________
_________________________
_ _______________________
_________________________
_  ______________________
_________________________
_ _ _____________________
__ ______________________
_ __ ____________________
_________________________
_   _ ___________________
_________________________
_ ____ __________________
__ _ ____________________
_ _ ___ _________________
_________________________
_  __ __ ________________
_________________________
_ _  ____ _______________
__ ___ __________________
_ ________ ______________
_________________________
_   _ _ ___ _____________
____ ____________________

4

Con trăn 2, 76 71

r=range(1,input()+1)
for i in r:print''.join("_ "[i%j<1<j<i]for j in r)

Không chắc nó có thể rút ngắn hơn được không ... Những từ khóa này : range, inputvà có printgiá khá cao.


3
Bạn có thể thay thế i>j>1and i%j<1bằngi>j>1>i%j
seequ

@Sieg: Tuyệt! Đây thực sự là lần đầu tiên tôi khai thác những so sánh được kết hợp này.
Falko

Tôi đã viết mã ký tự chính xác cho ký tự này cho đến tên var, bao gồm i%j<1<j<i:-P. Vì vậy, có lẽ nó thực sự không nhận được bất kỳ ngắn hơn.
xnor

Trên thực tế, tôi nghĩ (không được thử nghiệm) bạn có thể làm i%j<1. Nó ngụ ý i>=j.
xem

@Sieg: Có, nhưng chúng tôi cần i>j, không i>=jtránh những khoảng trống trên đường chéo.
Falko

3

APL (28)

'_ '[(1+(1≠⊢)∧≠∧0=|⍨)/¨⍳2⍴⎕]

Giải trình:

  • ⍳2⍴⎕: đọc số N và tạo ma trận tọa độ N-by-N
  • (... )/¨: cho mỗi cặp tọa độ, áp dụng chức năng sau:
    • Một ô phải có khoảng trắng nếu:
    • 0=|⍨: y modx = 0 và
    • : x không bằng y và
    • 1≠⊢: x không 1.
    • 1+: Thêm vào 1ma trận bit kết quả vì mảng APL bắt đầu từ 1.
  • '_ '[... ]: thay thế từng 1dấu gạch dưới và dấu 2cách.

Rõ ràng 28 là con số golf kỳ diệu ở đây.

2

Perl,    69   61

Phiên bản cập nhật (cảm ơn, Dennis !)

$n=<>;for$i(1..$n){say"_".join"",map{$i%$_|$i==$_?_:$"}2..$n}

Phiên bản gốc:

$n=<>;for$i(1..$n){say"_".join("",map{$i%$_||$i==$_?"_":" "}(2..$n))}

1
1. Không cần joincũng không 2..$ncần dấu ngoặc đơn. 2. Với công -ntắc, bạn có thể sử dụng $_thay vì $n. 3. _là một bareword hợp lệ, vì vậy nó không cần báo giá. 4. Bạn có thể sử dụng $"thay vì " ". 5. Bạn có thể sử dụng | thay vì ||.
Dennis

@Dennis - Cảm ơn! Tôi đã áp dụng một vài trong số đó. Tôi đã không làm -nđiều đó bởi vì tôi muốn giữ cho nó một chương trình khép kín và không phải nói $^N=1. Việc sử dụng _như một bareword hoạt động trong trường hợp $i==_nhưng không hoạt động trong trường hợp $i%_vì trình phân tích cú pháp nghĩ %_là một hàm băm.
Todd Lehman

1
1. Bạn có thể giữ nó độc lập với một shebang ( #!/bin/perl -nthường được tính là 1 byte), nhưng điều đó rõ ràng tùy thuộc vào bạn. Tôi không biết cái gì $^N=1... 2. $i==_sẽ không hoạt động đúng; Nó sẽ kiểm tra nếu $i == "_". Ý tôi là sử dụng _thay vì "_", tức là say _$i==$_?_:$".
Dennis

@Dennis - ohhhh tào lao, bạn đúng. Bản chỉnh sửa tôi đã giới thiệu một đường chéo thông qua ma trận. Xấu hổ vì tôi đã không nắm bắt được điều đó. Đã sửa. Tôi thấy những gì bạn có ý nghĩa về _= "_"bây giờ. Thật không may, nó hoạt động trong trường hợp sau nhưng lại cho tôi một lỗi bên cạnh sayvì dường như nó nghĩ rằng đó là một tập tin.
Todd Lehman

2

CJam, 27 byte

q~:I,{__I?'_*S+I*I<'_t}%zN*

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

Cách tiếp cận này đạt được số byte tương tự như câu trả lời khác của tôi, nhưng tôi nghĩ dù sao nó cũng đáng để đăng. Thay vì đánh dấu bội số thích hợp trong mỗi hàng, nó thực hiện chính xác những gì đặc tả nói.

Làm thế nào nó hoạt động

q~:I                         " Read an integer I from STDIN.                              ";
    ,{                }%     " For each J ∊ {1,...,I}:                                    ";
          '_*S+              " Push J - 1 underscores followed by a space.                ";
               I*I<          " Repeat the pattern to complete I characters.               ";
       _I?                   " For the first row, replace all spaces with underscores.    ";
      _            '_t       " Replace the Jth character by an underscore.                ";
                        zN*  " Transpose rows and columns; separate with linefeeds.       ";

Chạy ví dụ

$ cjam prime-lines.cjam <<< 10; echo
__________
__________
__________
_ ________
__________
_  _______
__________
_ _ ______
__ _______
_ __ _____
$ cjam prime-lines.cjam <<< 100 | md5sum # no trailing newline
83c7b974e1510f482322456a9dbb461f  -

1

C, 143

C rõ ràng không phải là sự lựa chọn đúng đắn của ngôn ngữ này. Nhưng để hoàn thiện, đây là một cách có thể để thực hiện trong C. Hoạt động cho các giá trị n lên tới 1048575. Đọc n từ đầu vào tiêu chuẩn.

#include <stdio.h>
main(){int n,i=0,j;scanf("%d",&n);char x[1<<20];x[n+1]=0;
for(;++i<=n;){for(j=0;++j<=n;)x[j]=i%j|i==j|j==1?95:32;puts(x+1);}}

Nó rất nhanh, tuy nhiên.

  • Thời gian chạy cho n = 1.000.000 (tạo ra lưới 1.000.000.000.000 phần tử) là khoảng 55 phút trên hệ thống của tôi.

  • Thời gian chạy cho n = 1000 (cung cấp lưới 1.000.000 phần tử) nhỏ hơn 1/100 giây.


4
1. Bao gồm không cần thiết cho một số trình biên dịch (ví dụ: GCC), vì vậy bạn có thể xóa nó. 2. Biến toàn cục khởi tạo thành 0 và mặc định là int, vì vậy bạn có thể sử dụng char x[1<<20];n,i,j;main.... 3. for(scanf("%d",&n);i++<n;)lưu hai byte trên scanf("%d",&n);for(;++i<=n;).
Dennis
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.