Tes prima yang pada dasarnya BENAR-BENAR


23

Tulis program yang akan menguji keutamaan angka yang ditentukan, dan berikan output sebagai nilai Boolean (True is prime). Tes utama Anda dapat (tetapi tidak harus) valid untuk nomor 1.

Inilah intinya: program Anda sendiri harus dijumlahkan ke bilangan prima. Konversi setiap karakter (termasuk spasi) ke nilai Unicode / ASCII ( tabel ). Kemudian, tambahkan semua angka itu bersama-sama untuk mendapatkan jumlah program Anda.

Misalnya, ambil program yang tidak terlalu bagus yang saya tulis dengan 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)

Jika Anda mengonversi semua karakter ke nilai Unicode / ASCII yang sesuai, Anda mendapatkan:

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 

Anda kemudian dapat menemukan jumlah angka-angka itu secara manual atau dengan program Anda sendiri. Program khusus ini berjumlah 8293, yang merupakan bilangan prima.

Tentu saja, ini Code Golf, jadi semakin kecil Anda dapat membuat program, semakin baik. Seperti yang ditunjukkan oleh pengguna lain, program ini tidak terlalu golf.

Beberapa aturan:

Input yang valid termasuk STDIN dan prompt (tidak ada fungsi, itu hanya cara untuk menambahkan kode tambahan gratis). Spasi diizinkan, tetapi hanya jika itu penting untuk fungsionalitas program Anda. Output harus berupa output, tidak hanya disimpan dalam variabel atau dikembalikan (gunakan cetak, STDOUT, dll.)

Bendera dapat digunakan dan harus dihitung secara harfiah, tidak diperluas. Komentar tidak dibolehkan. Adapun karakter non-ASCII, mereka harus ditugaskan ke nilai di masing-masing pengkodean.

Pastikan untuk mencantumkan ukuran dan jumlah program Anda. Saya akan menguji untuk memastikan program yang valid.

Semoga berhasil!

Berikut ini cuplikan untuk menghitung jumlah program Anda dan memeriksa apakah programnya prima:


12
Dalam bahasa non-golf, sepertinya Anda hanya bisa mengambil kode penentu prime yang terpendek, dan mengubah nama variabel hingga jumlahnya menjadi prima.
xnor

5
Mengapa pembatasan pada I / O?
Jonathan Allan

2
Apa itu "Nilai Unibyte"?! ???
aditsu

5
Anda berbicara tentang karakter dan halaman kode. Karakter Unicode selalu memiliki titik kode yang sama, tidak peduli pengkodean mana yang digunakan untuk mewakilinya. Adapun karakter non-ASCII, mereka harus ditugaskan ke nilai di masing-masing pengkodean. membuat saya berpikir Anda benar-benar ingin jumlah nilai byte menjadi prima
Dennis

Jawaban:


22

Halo Dunia! , 13 byte,1193

hello, world!

1
sempurna . Saya pernah mendengar bahasa ini sebelumnya, tetapi untuk berpikir itu juga kebetulan memiliki jumlah byte yang sempurna untuk tantangan ini: D
Value Ink


6

Microscript II, 2 byte (jumlah 137)

N;

Microscript II, 4 byte (jumlah 353)

N;ph

Saya sebenarnya cukup terkejut bahwa keduanya memiliki jumlah byte primer.



4

Pyth, 2 byte, 127

/P

Cobalah online

Output 1untuk bilangan prima, 0untuk non-bilangan prima.

/memiliki titik kode 47. Pmemiliki titik kode 80.

Bagaimana itu bekerja:

/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

Teorema Wilson.


2
Mengubahnya menjadi program mandiri penuh.
fquarp

::IO IntBenar - benar tidak perlu kecuali jika itu cara terpendek Anda bisa mendapatkan jumlah prima.
Ørjan Johansen

Panggilan yang bagus. Namun, kami kemudian mendapatkan beberapa kode yang `hashes 'hingga nilai genap. Menambahkan spasi atau baris baru tidak menghasilkan apa-apa (bahkan nilai), juga tidak mengubah nama variabel (muncul empat kali, jadi mengganti kodenya (katakanlah c) sama dengan mengurangi 4 * c dan menambahkan 4 * c ', meninggalkan jumlah rata
rata.Namun

1
47 byte dengan tes primality berbeda: Cobalah online! (perhatikan bahwa ada tab alih-alih spasi untuk menghitung dengan benar).
Laikoni

Juga selamat datang di PPCG!
Laikoni

4

Python 2, 50 byte, 4201

Berfungsi untuk 1. Output positif jika prima, atau nol jika tidak.

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

Cobalah online


Python 2, 44 byte, 3701

Tidak berfungsi untuk 1. Menghasilkan Boolean.

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

Cobalah online


3

JavaScript (ES6), 47 byte, 3541

Ini sangat didasarkan pada fungsi pengujian primality produk ETH , yang dapat ditemukan di sini .

alert((F=(n,x=n)=>n%--x?F(n,x):!~-x)(prompt()))


3

05AB1E , 2 byte,173

p=

Penjelasan:

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.

Cobalah online!


Sesuatu sesuatu "komentar tidak diperbolehkan" tapi saya kira efektif no-ops berfungsi dengan baik: D
Value Ink

2

PHP, 38 byte, jumlah 2791

Fakta menyenangkan: Dengan $halih-alih $c, jumlahnya akan menjadi 2801(juga prima), dan representasi binernya 101011110001dibaca sebagai desimal juga merupakan bilangan prima.

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

mengambil argumen baris perintah, cetakan 1atau string kosong. Jalankan dengan -r.

Kode diambil dari fungsi utama saya sendiri (lihat posting asli jika Anda bisa).


@Artyer Sudah diperbaiki.
Titus

2

R, 27 32 byte, jumlah 2243 2609

Menyimpan 5 byte berkat @rturnbull

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

Ini memanfaatkan fungsi isprime pustaka 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()))lebih pendek 5 byte, dan jumlah untuk 2243, juga prima.
rturnbull

@ Arturnbull terima kasih untuk itu :)
MickyT

1

Python 2, 44 byte, byte-sum 3109

Ini adalah implementasi 44 byte xnor dengan nama variabel bernilai terendah yang menghasilkan jumlah byte primer.

Mencetak 1jika prima dan 0jika tidak.

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

1

Jelly 6 byte , byte-jumlah 691

ƓÆḍ,ṠE

mencetak 1jika prima dan 0jika tidak.

TryItOnline!

Bytes dalam heksadesimal adalah 93 0D D5 2C CD 45(lihat halaman kode ), atau dalam desimal 147 13 213 44 205 69yang berjumlah 691, yang merupakan prime.

Bagaimana?

ƓÆḍ,Ṡ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

The Æḍfungsi adalah seperti yang prima dan negations mereka kembali satu sementara bilangan bulat lain tidak (komposit dan negations mereka kembali jumlah yang lebih besar dari satu, satu dan minus satu kembali nol dan nol kembali, anehnya, minus satu).

The fungsi adalah seperti yang bilangan bulat negatif kembali minus satu, nol kembali nol dan bilangan bulat positif kembali satu.

Dengan demikian kedua fungsi hanya mengembalikan nilai yang sama untuk bilangan prima.

Perhatikan bahwa program 3 byte ƓÆPyang secara langsung menguji apakah input dari STDIN adalah prima sayangnya bukan program prime-sum (240).

Pengujian untuk kesetaraan menggunakan =(sama dengan), e(ada di), atau (sama dengan non-vektor) untuk 5 byte juga tidak menghasilkan program prime-sum.


Alternatif (mungkin tidak dapat diterima) 4 byte, jumlah 571

Jika pembatasan I / O masih memungkinkan program lengkap yang mengambil argumen.

Æḍ⁼Ṡ

... menggunakan prinsip yang sama seperti di atas, di mana kesetaraan non-vektorisasi (aspek non-vektorisasi tidak berpengaruh karena toh tidak ada yang di-vector-kan). Nilai hex 0D D5 8C CDadalah 13 213 140 205dalam desimal yang berjumlah 571, sebuah bilangan prima.

Sekali lagi perhatikan bahwa program 2 byte ÆPtidak memiliki jumlah prima (93).


ƓÆPG(311) dan ÆPF(163) seharusnya baik-baik saja, saya pikir?
Lynn

Sebagai Unicode, untuk ƓÆḍ,ṠE, nilainya 16183, yang kebetulan adalah yang utama!
Artyer

@ Lynna Ya, sepertinya "pembatasan kode yang tidak perlu" (kecuali untuk karakter spasi) telah diangkat, membuat ƓÆPGOK. Saya juga bertanya apakah program yang mengambil input daripada penggunaan STDIN dapat diterima.
Jonathan Allan

1
... Jika kedua hal tersebut baik-baik saja maka ÆP¥3 byte dan 97.
Jonathan Allan


1

Mathematica, 21 byte, 1997

Print@*PrimeQ@Input[]

Input[]membaca garis input (dari STDIN jika tidak ada ujung depan yang digunakan, melalui kotak dialog jika ujung depan Mathematica digunakan), Print@*PrimeQadalah komposisi ( @*) dari Printdan PrimeQfungsi, dan @merupakan notasi fungsi awalan.


1

Perl 6 , 24 22 byte,1949

say .is-prime
for +get

Ketiga karakter spasi putih diperlukan.
(Perl 6 tidak peduli apa jenis karakter spasi mereka, meskipun, jadi saya memilih baris baru bukan ruang yang lebih umum digunakan untuk yang kedua ...)



1

Pip , 8 byte,511

0Na%,a=1

Saya menulis pemeriksa prima, dan jumlahnya prima. Mudah. Verifikasi input 1-30: Coba online!

Penjelasan

          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 Bytes, 1103

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

Tidak jauh dari optimal, paling tidak saya bisa golf tes program primality penuh adalah 17 Bytes:, echo(p:[:".1!:1)1yang sayangnya berjumlah 1133 = 11 * 103.

Sayangnya saya tidak tahu bagaimana cara mendapatkan input keyboard bekerja pada TIO, jadi belum ada tautan.

Penjelasan:

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

Memvalidasi program:

   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

Cukup mudah. Output * jika prima, jika tidak output spasi. Tidak berfungsi untuk 1.

-2 Berkat l4m2

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

Cobalah online!


1
n;main(i){for(scanf("%d",&n);++i<n;)n=n%i?n:0;puts("*"+!n);}mungkin perlu mengubah beberapa nama variabel untuk prime sum
l4m2

@ l4m2 Bagus sekali!
gastropner

1

AWK , 36 byte, byte-jumlah 2239

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

Cobalah online!

Output 0jika tidak prima dan 1untuk prima. Jelas bukan kode yang paling efisien, karena memeriksa setiap bilangan bulat lebih besar daripada 1melihat apakah itu membagi input.


1

Excel (57 byte, jumlah kode 3547)

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

Excel tidak benar-benar memiliki "input" seperti itu, tetapi rumus ini mengharapkan angka yang akan diuji berada di A1 dan output ke sel apa pun yang Anda masukkan. Ini adalah rumus array, jadi tekan Ctrl-Shift-Enter untuk memasukkan itu, bukan Enter.


1

Java 8, 114 byte, Perdana 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);}}

Cobalah online.

Penjelasan:

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)

Saya telah menggunakan xbukannya imembuat jumlah unicode menjadi prima. Verifikasikan jumlah unicode di sini.



0

SmileBASIC, 42 byte, 2687

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

Output 1 (benar) jika angkanya prima, sebaliknya 0 (salah).

Nama-nama variabel tidak hanya dipilih untuk membuat program utama. Nadalah n Banyaknya untuk menguji, Dadalah d ivisor, dan Pmelacak apakah N adalah p rime.



0

Rust, 190 byte, skor 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)}

Tidak disatukan

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

Tidak berfungsi untuk 1



0

Bisikan v2 , 33 byte

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

Cobalah online!

  1. Skor: 44381
  2. Hanya 6 byte / 2 karakter yang ditambahkan untuk membuatnya valid!
  3. 1 bukan prima

Bagaimana itu bekerja

Ini ditunjukkan dalam urutan yang dijalankan di:

		; 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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.