Một bài kiểm tra chính đó là LITERALLY Prime


23

Viết chương trình sẽ kiểm tra tính nguyên thủy của một số được chỉ định và đưa ra đầu ra dưới dạng giá trị Boolean (True là số nguyên tố). Bài kiểm tra chính của bạn có thể (nhưng không phải) có giá trị cho số 1.

Đây là một nhược điểm: chương trình của bạn phải tổng hợp thành một số nguyên tố. Chuyển đổi mọi ký tự (bao gồm khoảng trắng) thành giá trị Unicode / ASCII ( bảng ). Sau đó, cộng tất cả các số đó lại với nhau để có được tổng số chương trình của bạn.

Ví dụ: lấy chương trình không tuyệt vời này mà tôi đã viết trong Python 3.3:

q=None
y=int(input())
for x in range(2,int(y**0.5)+1):
    if y%x==0:
        q=False
if not q:
    q=True
print(q)

Nếu bạn chuyển đổi tất cả các ký tự thành giá trị Unicode / ASCII tương ứng của chúng, bạn sẽ nhận được:

113 61 78 111 110 101 10 121 61 105 110 116 40 105 110 112 117 116 40 41 41 10 102 111 114 32 120 32 105 110 32 114 97 110 103 101 40 50 44 105 110 116 40 121 42 42 48 46 53 41 43 49 41 58 10 32 32 32 32 105 102 32 121 37 120 61 61 48 58 10 32 32 32 32 32 32 32 32 113 61 70 97 108 115 101 10 105 102 32 110 111 116 32 113 58 10 32 32 32 32 113 61 84 114 117 101 10 112 114 105 110 116 40 113 41 

Sau đó, bạn có thể tìm tổng của các số đó bằng tay hoặc với chương trình của riêng bạn. Chương trình cụ thể này tổng hợp đến 8293, là một số nguyên tố.

Tất nhiên, đây là Code Golf, vì vậy bạn càng có thể làm cho chương trình của mình càng nhỏ thì càng tốt. Như được chỉ ra bởi những người dùng khác, chương trình này không phải là rất golf.

Một vài quy tắc:

Đầu vào hợp lệ bao gồm STDIN và lời nhắc (không có chức năng, đó chỉ là một cách để thêm mã bổ sung miễn phí). Không gian được phép, nhưng chỉ khi chúng quan trọng đối với chức năng của chương trình của bạn. Đầu ra phải là đầu ra, không chỉ được lưu trữ trong một biến hoặc được trả về (sử dụng in, STDOUT, v.v.)

Cờ có thể được sử dụng và nên được tính theo nghĩa đen, không được mở rộng. Bình luận không được phép. Đối với các ký tự không phải ASCII, chúng phải được gán cho giá trị trong mã hóa tương ứng của chúng.

Đảm bảo liệt kê kích thước chương trình của bạn và tổng của chương trình. Tôi sẽ kiểm tra để đảm bảo các chương trình là hợp lệ.

Chúc may mắn!

Dưới đây là đoạn trích để đếm tổng số chương trình của bạn và kiểm tra xem nó có phải là số nguyên tố không:


12
Trong các ngôn ngữ không chơi gôn, có vẻ như bạn chỉ cần lấy mã quyết định ngắn nhất và điều chỉnh tên biến cho đến khi tổng là số nguyên tố.
xnor

5
Tại sao các hạn chế đối với I / O?
Jonathan Allan

2
"Giá trị unibyte" là gì?! ???
aditsu

5
Bạn nói về các nhân vật và trang mã. Một ký tự Unicode luôn có cùng một điểm mã, bất kể mã hóa nào được sử dụng để thể hiện nó. Đối với các ký tự không phải ASCII, chúng phải được gán cho giá trị trong mã hóa tương ứng của chúng. làm tôi nghĩ rằng bạn thực sự muốn tổng các giá trị byte là số nguyên tố
Dennis

Câu trả lời:




6

Kính hiển vi II, 2 byte (tổng 137)

N;

Kính hiển vi II, 4 byte (tổng 353)

N;ph

Tôi thực sự khá ngạc nhiên khi cả hai đều có số tiền nguyên tố.



4

Bình thường, 2 byte, 127

/P

Dùng thử trực tuyến

Đầu ra 1cho các số nguyên tố, 0cho các số nguyên tố.

/có điểm mã 47. Pcó điểm mã 80.

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

/P
/PQQ    Implicit variables.
        Q = input
 PQ     Prime factorize Q.
/  Q    Count how many times Q appears. 1 if prime, 0 if not.

4

Haskell, 52 byte, 4421

main=do
 k<-readLn
 print$product[1..k-1]`rem`k==k-1

Định lý Wilson.


2
Biến nó thành một chương trình độc lập đầy đủ.
fquarp

Điều ::IO Intthực sự không cần thiết trừ khi đó là cách ngắn nhất bạn có thể nhận được một số tiền gốc.
Ørjan Johansen

Cuộc gọi tốt Tuy nhiên, sau đó chúng tôi nhận được một số mã 'băm' đến một giá trị chẵn. Thêm dấu cách hoặc dòng mới không làm gì (thậm chí giá trị), cũng như không thay đổi tên của biến (nó xuất hiện bốn lần, do đó, thay thế mã của nó (giả sử c) để trừ đi 4 * c và thêm 4 * c ', để lại Tổng số chẵn. Tuy nhiên, nó có thể được điều chỉnh bằng cách ngắt các dòng và vẫn ngắn hơn, điều mà tôi đã làm.
fquarp

1
47 byte với một bài kiểm tra nguyên thủy khác: Hãy thử trực tuyến! (lưu ý rằng có các tab thay vì khoảng trắng để đếm đúng).
Laikoni

Cũng chào mừng đến với PPCG!
Laikoni

4

Python 2, 50 byte, 4201

Hoạt động cho 1. Đầu ra là dương nếu nguyên tố hoặc bằng 0 nếu không.

p=input();print all(p%m for m in range(2,p))*~-p;p

Dùng thử trực tuyến


Python 2, 44 byte, 3701

Không hoạt động cho 1. Kết quả Boolean.

p=input();print all(p%k for k in range(2,p))

Dùng thử trực tuyến



3

05AB1E , 2 byte,173

p=

Giải trình:

p  # Checks if number is prime - returns 1 if true and 0 if false. Uses implicit input.
 = # Wouldn't usually be required for this sort of program, but I added it to make the sum prime.

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


Một cái gì đó "không được phép bình luận" nhưng tôi đoán các no-op hiệu quả hoạt động tốt: D
Ink Ink

2

PHP, 38 byte, tổng 2791

Thực tế thú vị: $hThay vì $c, tổng sẽ là 2801(cũng là một số nguyên tố) và biểu diễn nhị phân của nó 101011110001được đọc dưới dạng thập phân cũng là một số nguyên tố.

for($b=$c=$argv[1];$c%--$b;);echo$b<2;

lấy đối số dòng lệnh, in 1hoặc chuỗi rỗng. Chạy với -r.

Mã được lấy từ hàm nguyên tố của riêng tôi (nhìn vào bài gốc nếu bạn có thể).


@Artyer Nó cố định.
Tít

2

R, 27 32 byte, tổng 2243 2609

Đã lưu 5 byte nhờ @rturnbull

cat(gmp::isprime(scan(),r=43)>0)

Điều này làm cho việc sử dụng hàm isprime của thư viện gmp.

> sum(as.integer(charToRaw('cat(!!gmp::isprime(scan()))')))
[1] 2243
> cat(!!gmp::isprime(scan()))
1: 2243
2: 
Read 1 item
TRUE
> 

cat(!!gmp::isprime(scan()))ngắn hơn 5 byte và tính tổng 2243, cũng là số nguyên tố.
rturnbull

@rturnbull cảm ơn vì điều đó :)
MickyT

1

Python 2, 44 byte, byte-sum 3109

Đây là cách thực hiện 44 byte của xnor với các tên biến có giá trị thấp nhất mang lại tổng byte nguyên tố.

In 1nếu nguyên tố và 0nếu không.

C=B=1
exec"B*=C*C;C+=1;"*~-input()
print B%C

1

Jelly 6 byte , byte tổng 691

ƓÆḍ,ṠE

in 1nếu nguyên tố và 0nếu không.

Dùng thử trực tuyến!

Các byte trong hệ thập lục phân là 93 0D D5 2C CD 45(xem trang mã ) hoặc theo số thập phân là 147 13 213 44 205 69tổng của 691, là số nguyên tố.

Làm sao?

ƓÆḍ,ṠE - Main Link: no arguments
Ɠ      - read and evaluate a line from STDIN (integer expected)
 Æḍ    - proper divisor count
   ,   - paired with
    Ṡ  - sign
     E - all equal? - returns a boolean (1 or 0)
       - implicit print

Các Æḍ chức năng là như vậy mà số nguyên tố và phủ nhận họ trở lại một khi các số nguyên khác không (composite và phủ nhận họ trở lại với số lượng nhiều hơn một, một và trừ một sự trở lại không và không trở về, kỳ quặc đủ, trừ một).

Các chức năng là số nguyên âm trả về một trừ, số không trả về số 0 và số nguyên dương trả về một số nguyên.

Do đó, hai hàm chỉ trả về cùng một giá trị cho các số nguyên tố.

Lưu ý rằng chương trình 3 byte ƓÆP trực tiếp kiểm tra nếu đầu vào từ STDIN là số nguyên tố không may không phải là chương trình tổng (240).

Việc kiểm tra sự bằng nhau bằng cách sử dụng =(bằng), e(tồn tại trong) hoặc (bằng không vectơ bằng) cho 5 byte cũng không mang lại các chương trình tổng hợp.


Thay thế (có thể không chấp nhận được) 4 byte, tổng 571

Nếu các hạn chế I / O vẫn cho phép các chương trình đầy đủ đưa ra một đối số.

Æḍ⁼Ṡ

... Sử dụng nguyên tắc tương tự như trên, trong đó là đẳng thức không véc tơ (khía cạnh không vector hóa không có tác dụng vì dù sao cũng không có gì để véc tơ hóa). Các giá trị hex được 0D D5 8C CDđó là 13 213 140 205trong số thập phân mà sum tới 571, một nguyên tố.

Một lần nữa lưu ý rằng chương trình 2 byte ÆPkhông có tổng nguyên tố (93).


ƓÆPG(311) và ÆPF(163) có ổn không, tôi nghĩ vậy?
Lynn

Như Unicode, đối với ƓÆḍ,ṠE, giá trị là 16183, hoàn toàn ngẫu nhiên!
Artyer

@Lynn Có, có vẻ như "hạn chế mã không cần thiết" (ngoại trừ ký tự khoảng trắng) đã được gỡ bỏ, làm cho ƓÆPGOK. Tôi cũng đã hỏi liệu một chương trình lấy đầu vào thay vì sử dụng STDIN có được chấp nhận hay không.
Jonathan Allan

1
... Nếu cả hai điều đó đều ổn thì ÆP¥là 3 byte và 97.
Jonathan Allan


1

Toán học, 21 byte, 1997

Print@*PrimeQ@Input[]

Input[]đọc một dòng đầu vào (từ STDIN nếu không có kết thúc trước được sử dụng, thông qua một hộp thoại nếu kết thúc trước Mathematica được sử dụng), Print@*PrimeQlà thành phần ( @*) của PrintPrimeQchức năng, và @là ký hiệu chức năng tiền tố.


1

Perl 6 , 24 22 byte,1949

say .is-prime
for +get

Tất cả ba ký tự khoảng trắng được yêu cầu.
(Tuy nhiên, Perl 6 không quan tâm họ là loại ký tự khoảng trắng nào, vì vậy tôi đã chọn một dòng mới thay vì không gian thường được sử dụng cho cái thứ hai ...)



1

Pip , 8 byte,511

0Na%,a=1

Tôi đã viết một trình kiểm tra chính, và tổng là số nguyên tố. Tiện lợi. Xác minh đầu vào 1-30: Dùng thử trực tuyến!

Giải trình

          a is first command-line argument
    ,a    Numbers from 0 to a-1
  a%      Take a mod each of those numbers (a%0 gives nil)
0N        Count number of times 0 occurs in that list
      =1  If 0 occurs only 1 time (for a%1), then a is prime


1

J, 18 byte, 1103

echo 1&p:".(1!:1)1

Không xa tối ưu, ít nhất tôi có thể chơi một bài kiểm tra tính nguyên thủy của chương trình đầy đủ là 17 Byte: echo(p:[:".1!:1)1 không may là tổng số tiền là 1133 = 11 * 103.

Thật không may, tôi không thể tìm ra cách để đầu vào bàn phím hoạt động trên TIO, vì vậy chưa có liên kết nào.

Giải trình:

echo 1&p:".(1!:1)1  | Full program
           (1!:1)1  | Read a line of input from keyboard
         ".         | Evaluate (converts string to int)
     1&p:           | 1 for prime, 0 for composite
echo                | Print result. The space is required, as 'echo1' would be interpreted as a variable

Xác thực chương trình:

   1 p:+/u:inv'echo 1&p:".(1!:1)1'  NB. Convert to ints, sum, and test primality
1

1

C (gcc) , 62 60 byte, 4583

Khá đơn giản. Đầu ra * nếu nguyên tố, nếu không, nó xuất ra một khoảng trắng. Không hoạt động cho 1.

-2 nhờ l4m2

p;main(i){for(scanf("%d",&p);++i<p;)p=p%i?p:0;puts("*"+!p);}

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


1
n;main(i){for(scanf("%d",&n);++i<n;)n=n%i?n:0;puts("*"+!n);}có thể cần thay đổi một số tên biến cho tổng số nguyên tố
l4m2

@ l4m2 Đẹp một!
dạ dày

1

AWK , 36 byte, tổng byte 2239

{for(a=1;$0%++a&&a<$0;);$0=(a==$0)}1

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

Đầu ra 0nếu không phải là số nguyên tố và 1cho số nguyên tố. Chắc chắn không phải là mã hiệu quả nhất, vì nó kiểm tra mọi số nguyên lớn hơn 1để xem liệu nó có phân chia đầu vào không.


1

Excel (57 byte, tổng mã 3547)

=XOR(0<PRODUCT(MOD(A1,ROW(OFFSET(D2,0,,SQRT(A1))))),3>A1)

Excel không thực sự có "đầu vào" như vậy, nhưng công thức này hy vọng số được kiểm tra là A1 và xuất ra bất kỳ ô nào bạn thả nó vào. Đó là một công thức mảng, vì vậy hãy nhấn Ctrl-Shift-Enter để nhập nó, thay vì Enter.


1

Java 8, 114 byte, Prime 10037

interface M{static void main(String[]a){long n=new Long(a[0]),x=2;for(;x<n;n=n%x++<1?0:n);System.out.print(n>1);}}

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

Giải trình:

interface M{                     // Class
  static void main(String[]a){   //  Mandatory main-method
    long n=new Long(a[0]),       //   The first argument as number
    x=2;for(;x<n;n=n%x++<1?0:n); //   Check if `n` is a prime
    System.out.print(n>1);}}     //   Print whether `n` was a prime
                                 //    (if `n` is still the same: it's a prime;
                                 //     if `n` is now 0 or 1: it's not a prime)

Tôi đã sử dụng xthay vì ilàm cho tổng số unicode trở thành số nguyên tố. Xác nhận tổng số unicode ở đây.



0

SmileBASIC, 42 byte, 2687

INPUT N:FOR D=2TO N/2P=P+!(N MOD D)NEXT?!P

Đầu ra 1 (đúng) nếu số là số nguyên tố, ngược lại là 0 (sai).

Tên biến không chỉ được chọn để làm cho chương trình chính. Nn màu nâu đen để kiểm tra, Dd ivisor, và Ptheo dõi cho dù N là p sương muối.



0

Rust, 190 byte, điểm 15013

fn main(){let A=&mut"".into();std::io::stdin().read_line(A);let(B,mut C)=(A.trim().parse::<u64>().unwrap(),true);for H in 2..((B as f64).sqrt()+1.0) as u64{if B%H==0{C=false}}print!("{}",C)}

Bị đánh cắp

fn main() {
    let input = &mut "".into();
    std::io::stdin().read_line(input);
    let (number, mut prime) = (input.trim().parse::<u64>().unwrap(), true);

    for x in 2..((number as f64).sqrt() + 1.0) as u64 {
        if number % x == 0 {
            prime = false;
        }
    }

    print!("{}", prime);
}

Không hoạt động cho 1



0

Thì thầm v2 , 33 byte

>>> ⊤ℙ∘ℕ
> Input
>> 1∘2

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

  1. Ghi bàn: 44381
  2. Chỉ có 6 byte / 2 ký tự được thêm vào để làm cho nó hợp lệ!
  3. 1 không phải là số nguyên tố

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

Điều này được hiển thị theo thứ tự nó được thực hiện trong:

		; Line 3:
>>  ∘		; Compose...
   1            ; Line 1 with
     2          ; The result of line 2

		; Line 2:
> Input		; Retrieve a line of input

		; Line 1:
>>> ⊤		; The input is...
     ℙ		; Prime
      ∘		; And it is...
       ℕ	; Natural
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.