Cetak bilangan prima yang hilang


18

Tugas

Tulis program atau fungsi yang, ketika melewati input numerik x, mencetak atau mengembalikan bilangan prima di bawah akar kuadrat x1 yang bukan merupakan faktor x.

Contohnya

Biarkan f(x)menjadi fungsi yang disebut:

>>> f(4)
[]

>>> f(5)
[2]

>>> f(20)
[3]

>>> f(60)
[7]

>>> f(100)
[3, 7]

>>> f(10000)
[3, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

Aturan Bonus

  • Anda dapat menggunakan bawaan apa pun yang disediakan bahasa Anda.
  • Program Anda harus mendukung xinput setinggi batas atas yang ditentukan oleh bahasa Anda.

1 Menggunakan akar kuadrat karena hanya bilangan prima di bawah akar kuadrat sebenarnya dapat terlibat dalam faktor x. Tanpa membuat batasan ini, angka yang lebih besar akan memiliki banyak angka cetak berlebih.


3
"Hanya bilangan prima di bawah akar kuadrat yang benar-benar dapat terlibat dalam faktor-faktor x" tidak benar: angka dapat memiliki satu faktor utama yang lebih besar dari akar kuadratnya. Memang, dua contoh pertama Anda (5 dan 20) memiliki properti ini, seperti halnya semua bilangan prima, dua kali semua bilangan prima, ....
Greg Martin

1
@GregMartin Ya, mereka bisa - tetapi mereka tidak dapat ditemukan di bagian pertama dari faktor. Masuk akal untuk tidak memasukkan 7 dalam bilangan prima yang hilang dari 48 karena 7 ^ 2 lebih besar dari 48. (alasan saya ada di sana)
Addison Crump

Jawaban:


8

Jelly, 6 byte dalam codepage Jelly

½ÆRḟÆf

Cobalah online!

Penjelasan:

½ÆRḟÆf
 ÆR    All primes less than or equal to
½      the square root of the input
   ḟ   but with the following removed:
    Æf All prime factors of {the input, by default}

5
Jawaban
jeli

6

MATL , 10 9 byte

X^ZqGYfX-

Cobalah online!

Penjelasan

X^    % Implicit input. Square root
Zq    % Array if primes up to that
G     % Push input again
Yf    % Array of prime factors
X-    % Set difference. Implicit display


5

MATLAB, 57 54 byte

function h(p);a=primes(p^.5);a(~ismember(a,factor(p)))

Cukup mudah, dapatkan array bilangan prima hingga sqrt (p) kemudian menghapus semua yang juga merupakan faktor p. Mencetak output dari baris terakhir secara default karena titik koma tidak digunakan.


1
Saya tidak pernah mencoba MATLAB, tetapi menurut apa yang saya baca tentang hal itu, sqrt (p) dapat ditulis sebagai p ^ 0,5 atau mungkin p ^ .5 meskipun saya tidak yakin tentang saran kedua
t-clausen.dk

Bagus! :) Saya memposting kiriman Oktaf menggunakan pendekatan yang sama.
Stewie Griffin

4

Pyth, 10 byte

fP_T-S@Q2P

Program yang mengambil input nomor dan mencetak daftar.

Suite uji

Bagaimana itu bekerja

fP_T-S@Q2P   Program. Input: Q
fP_T-S@Q2PQ  Implicit input fill
f            Filter
     S@Q2    the 1-indexed range up to floor(sqrt(Q))
    -    PQ  with the prime factors of Q removed
 P_T         by primality
             Implicitly print


3

PHP, 76 byte

for($n=1;++$n*$n<$x=$argv[1];){for($i=$n;$n%--$i;);if($i<2&&$x%$n)echo$n,_;}

menggunakan solusi is_prime saya yang di-golf dengan $ n> 1

mengambil input dari argumen baris perintah. Jalankan dengan -r.


2

Mathematica, 46 byte

Select[Prime@Range@PrimePi@Sqrt[a=#],!#∣a&]&

Fungsi anonim. Mengambil angka sebagai input dan mengembalikan daftar angka sebagai output. Karakter Unicode adalah U + 2223 DIVIDES untuk \[Divides].


2

Ruby, 55 byte

require'prime'
->x{Prime.to_a(x**0.5).select{|n|x%n>0}}

Jawaban yang agak malas menggunakan enumerator utama bawaan.


2

Bertanya-tanya , 14 byte

@(_> > ^#0.5)P

Pemakaian:

(@(_> > ^#0.5)P)10

Mengambil item dari daftar bilangan prima yang tak terbatas sementara item kurang dari akar kuadrat dari argumen.


2

Pyke, 10 byte

,BS#_P)QP-

Coba di sini!

,B         -    int(sqrt(input))
  S        -   range(1, ^+1)
   #_P)    -  filter(^, is_prime)
         - - ^.remove(V)
       QP  -  factors(input)

2

PowerShell v2 +, 71 byte

param($n)1..[math]::Sqrt($n)|?{$n%$_-and'1'*$_-match'^(?!(..+)\1+$)..'}

Solusi berulang. Mengambil input $ndan membuat rentang dari 1ke Sqrt($n)(perhatikan bahwa operator rentang secara implisit akan melemparkan ujung atas ke [int]yang akan melakukan Pembulatan Banker secara default). Kemudian penggunaan |?{...}(yang Where-Objectoperator, yang bertindak seperti filter) untuk menarik keluar angka-angka di mana $n%$_non-nol (yaitu, setiap sisanya untuk sarana Modulo itu bukan faktor, dan setiap non-nol adalah truthy) -andyang tes perdana regex biasa adalah $true. Itu dibiarkan di dalam pipa, dan hasilnya implisit.

Contohnya

(dengan beberapa format tambahan untuk menambah output)

PS C:\Tools\Scripts\golfing> 5,20,60,100,10000|%{"f($_)";(.\print-the-missing-primes.ps1 $_)-join', ';""}
f(5)
2

f(20)
3

f(60)
7

f(100)
3, 7

f(10000)
3, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97

NB - Ini akan gagal pada versi sebelumnya jika input lebih besar dari sekitar 2500000000, karena ..operator jangkauan hanya dapat mendukung hingga 50.000 item. Tapi, karena itu lebih besar dari [int]nilai maks datatype default 2147483647,, saya anggap itu OK. Di komputer saya, PSv4 Win8.1, bagaimanapun, saya bisa naik lebih tinggi, tapi saya tidak dapat menemukan dokumentasi yang menjelaskan perbedaannya.


2

JavaScript (ES6), 79 76 byte

f=(q,n=2,x=n)=>n*n<q?[...--x<2&&q%n?[n]:[],...x>1&&n%x?f(q,n,x):f(q,n+1)]:[]

Berdasarkan pada fungsi tes primality rekursif saya . Saya merasa harus ada beberapa cara untuk menyederhanakan ini, tapi saya tidak tahu bagaimana ...

Cuplikan tes

f=(q,n=2,x=n)=>n*n<q?[...--x<2&&q%n?[n]:[],...x>1&&n%x?f(q,n,x):f(q,n+1)]:[]
<input type="number" step=1 min=4 value=4 oninput="O.innerHTML='['+f(this.value)+']'"><br>
<pre id=O>[]</pre>


2

Oktaf, 44 byte

Jawaban ini terinspirasi oleh jawaban MATLAB dari MattWH , tetapi saya telah menggunakannya dengan menggunakan beberapa fitur khusus Oktaf.

@(x)(y=primes(x^.5))(~ismember(y,factor(x)))

Ini adalah fungsi anonim yang mengambil input x. Oktaf memiliki penugasan variabel inline dan pengindeksan yang memungkinkan yuntuk pertama kali dibuat dalam fungsi (tidak mungkin di MATLAB), kemudian digunakan sebagai bagian dari topeng logis yang dibuat oleh ismember(sekali lagi, tidak mungkin melakukannya dengan cara ini di MATLAB).


Sangat bagus, harus melihat ke dalam Oktaf. Fitur-fitur itu akan sangat membantu untuk golf!
MattWH

1

Perl 6 , 37 byte

{grep {$^a.is-prime&$_%$a},2.. .sqrt}

Diperluas:

{   # bare block lambda with implicit parameter 「$_」

  grep
  {
    $^a.is-prime  # check if it is prime
    &             # and junction
    $_ % $a       # check if the input is not evenly divisible by it
  },
  2.. .sqrt          # Range of values up-to and including squareroot
}

1

TSQL, 130 byte

DECLARE @v int=10000

,@ INT=2SELECT 2p INTO #
g:INSERT # SELECT @ FROM # HAVING isnull(min(@%p),1)>0SET @+=1IF @*@<@v GOTO g
SELECT*FROM # WHERE @v%p>0

Ini hanya akan mengeksekusi sekali, maka Anda perlu menjatuhkan tabel temp untuk mengeksekusi lagi di editor yang sama

DROP TABLE #

Saya membuat versi untuk mengujinya, ini sedikit lebih lama karena izin online untuk membuat tabel tidak tersedia. Untuk alasan yang sama, tidak perlu drop table.

Cobalah online


1

R, 58 63 byte

for(i in 2:sqrt(x<-scan()))if(x%%i&numbers::isPrime(i))print(i)

Simpulkan semua nilai dari 2 hingga sqrt(x)dan periksa apakah semuanya prima dengan numberspaket. x%%imenghitung x mod iyang 0 -> Falsejika imerupakan pembagi dari xdan >0 -> Truejikai tidak.

+5 byte karena numbers::Primes(n)fungsinya tidak memungkinkan desimal, sementara 2:sqrt(x)berfungsi, menambahkan pemeriksaan prima pada ifpernyataan.


1

Haskell, 55 54 byte

f x=[y|y<-[2..x],y*y<x,[z|z<-[1..y],gcd(z*x)y>1]==[y]]

Sebagian besar daftar pemahaman bersarang langsung. GCD melakukan dua peran, menguji apakah angka-angka di bawah y adalah faktor y dan juga menguji apakah y adalah faktor x.

Ditempatkan sedikit:

f x = [ y|y<-[2..x],     y*y<x,     [z|z<-[1..y], gcd (z*x) y > 1] == [y] ]

Simpan satu byte dengan gcd(z*x)y>1.
Zgarb

Saya juga meletakkan y * y <x periksa dulu untuk membuatnya sedikit lebih cepat.
James Hollis

0

Retina , 69 66 byte

.+
$*
(11\1|^1)+
$#1$*1:$&
M!&`(?!(11+)\1+:)(1+):(?!\2+$)
M%`1
^0

Mencetak bilangan prima pada garis yang terpisah, dari yang terbesar ke yang terkecil.

Cobalah online! (Membutuhkan waktu sekitar 10 detik karena dua kasus pengujian terakhir. Header dan footer memungkinkan suite pengujian linefeed-terpisah, dan mengubah output menjadi koma-pemisahan untuk keterbacaan.)

Penjelasan

.+
$*

Konversikan input ke unary.

(11\1|^1)+
$#1$*1:$&

Ini mendahului akar kuadrat dari input, dipisahkan oleh :. Akar kuadrat dihitung berdasarkan fakta bahwa kuadrat njuga merupakan jumlah dari nbilangan bulat ganjil pertama . Kami dapat mencocokkan bilangan bulat aneh berurutan dengan referensi maju(11\1|^1) . Dalam prosesnya kelompok akan digunakan tepat nwaktu, di manan adalah angka terbesar yang kuadratnya sesuai dengan input.

Kami memasukkan representasi unary dari nomor ini dengan $#1$*1, diikuti oleh titik dua dan pertandingan itu sendiri.

M!&`(?!(11+)\1+:)(1+):(?!\2+$)

Ini cocok dengan semua bilangan prima yang hilang yang cocok dengan akar kuadrat. Deteksi utama didasarkan pada regex pengecekan prime prima , dan kemudian kami hanya memastikan bahwa prime yang baru saja kami tangkap tidak membagi input dengan lookahead kedua. Dengan menggunakan &opsi, kami mendapatkan pertandingan yang tumpang tindih untuk memastikan bahwa kami mendapatkan semua bilangan prima.

M%`1

Ini mengkonversi setiap baris (yaitu setiap prime yang hilang) kembali ke desimal dengan mencocokkan jumlah 1s. Satu-satunya masalah adalah bahwa ini memasukkan nol jika tidak ada bilangan prima yang hilang ditemukan sama sekali.

^0

Jadi tahap ini menghilangkan nol itu jika ditambahkan.

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.