Sebagian besar dari kita tahu ...
bahwa semua bilangan prima p>3
adalah dari bentuk
Tapi, berapa Primes Plus ( 6n+1
) dan berapa Prius Minus ( 6n-1
) dalam kisaran tertentu?
Tantangan
Mengingat integer k>5
, menghitung berapa banyak primes<=k
yang PlusPrimes dan berapa banyak yang MinusPrimes .
Contohnya
untuk k=100
kami memiliki
[5, 11, 17, 23, 29, 41, 47, 53, 59, 71, 83, 89]
12 MinusPrimes
dan
[7, 13, 19, 31, 37, 43, 61, 67, 73, 79, 97]
11 PlusPrimes
karena k=149
kami memiliki
[5, 11, 17, 23, 29, 41, 47, 53, 59, 71, 83, 89, 101, 107, 113, 131, 137, 149]
18 MinusPrimes
dan
[7, 13, 19, 31, 37, 43, 61, 67, 73, 79, 97, 103, 109, 127, 139]
15 PlusPrimes
Aturan
Kode Anda harus menampilkan 2 bilangan bulat : satu untuk MinusPrimes dan satu untuk PlusPrimes dalam urutan apa pun yang Anda suka (sebutkan yang mana).
Ini adalah kode-golf : jawaban terpendek dalam byte menang!
Uji Kasus
Input -> Output [ MinusPrimes , PlusPrimes ]
6->[1,0]
7->[1,1]
86->[11,10]
986->[86,78]
5252->[351,344]
100000->[4806,4784]
4000000->[141696, 141448]
0%6
adalah kelipatan 6,1%6
tidak dapat ditentukan,2%6
kelipatan 2,3%6
kelipatan 3,4%6
kelipatan 2, dan5%6
tidak dapat ditentukan.Jawaban:
05AB1E ,
109 byteDisimpan 1 byte berkat Erik the Outgolfer
Output sebagai
[PlusPrimes, MinusPrimes]
Cobalah online! atau sebagai Test Suite
Penjelasan
sumber
MATL , 10 byte
Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
sumber
Python 2 , 77 byte
-2 byte terima kasih kepada Neil
Cobalah online!
Solusi sebelumnya,
838179 byte-1 byte terima kasih kepada Tn. Xcoder
-2 byte terima kasih kepada Halvard Hummel
Cobalah online!
Keduanya keluaran sebagai [MinusPrimes, PlusPrimes]
sumber
[]
.Jelly , 7 byte
Plus, lalu minus.
Cobalah online!
Bagaimana itu bekerja
sumber
Mathematica, 51 byte
Cobalah online!
@ngenisis memutarnya, menghemat 4 byte
Mathematica, 47 byte
sumber
Mod
bisa juga infix, dan jika Anda akan menyebutkan argumen pertamas
, cukup gunakan argumen bernama:sPrime~Array~PrimePi@s~Mod~6~Count~#&/@{5,1}
Japt ,
151311 byteUrutan output adalah
[+,-]
.Menguji
ë
metode array yang sebelumnya tidak diketahui untuk saya perhatikan.Penjelasan
Input bilangan bulat implisit
U
.Hasilkan array bilangan bulat (
õ
) dari 1 hinggaU
dan periksa apakah masing-masing bilangan prima (j
), berikan array boolean.Partisi array menjadi sub-array dengan panjang 6.
Transpose (
y
) dan jumlah kolomnya.Dapatkan setiap elemen ke-4 array dan secara implisit mengeluarkannya.
Asli,
19171615 byteMenguji
sumber
J , 23 byte
Cobalah online!
sumber
Retina ,
5351 byteCobalah online! Penjelasan:
Konversikan ke unary.
Hitung mulai dari 1 hingga
n
.Hapus angka kurang dari 4.
Hapus angka komposit.
Ambil modulo 6 sisanya.
Cetak jumlah angka dengan sisa antara 3 dan 5.
Cetak jumlah angka dengan sisa 1.
sumber
Ruby,
6160 byte(52 byte + 8 untuk
-rprimes
bendera)Mengembalikan array bentuk [plus bilangan prima, bilangan minus bilangan prima].
Disimpan 1 byte berkat GB!
Cobalah online.
sumber
count
rentang tanpa operator percikan (simpan 1 byte).Perl 6 , 42 byte
Disimpan 1 byte dengan menghapus ruang yang tidak berguna ...
Disimpan 2 byte dengan mengatur ulang
map
panggilan - terima kasih kepada @Joshua.Disimpan 3 byte karena
.round
sama dengan.round: 1
.Sebenarnya eksponensial kompleks itu keren tapi sangat mahal. Disimpan 10 byte hanya dengan membuangnya ...
Cobalah online!
Ini adalah versi dengan eksponensial kompleks. (Saya suka terlalu banyak untuk menghapusnya.) Versi baru berfungsi persis dengan cara yang sama, hanya eksponensial kompleks yang digantikan oleh operator ternary yang jauh lebih pendek.
Cobalah online!
Outputnya adalah bilangan kompleks
(PlusPrimes) + (MinusPrimes)i
. Saya harap itu tidak terlalu melanggar aturan.Penjelasan: Ini adalah fungsi yang membutuhkan satu argumen integer. Kami beralih dari semua bilangan bulat dari 5 ke argumen (
(5..$_)
). Untuk masing-masing, kami mengevaluasi.is-prime
(ini dipanggil$_
, argumen dari blok yang dipetakan), melipatgandakannya (jika dinomori,True == 1, False == 0
) dengan eksponensial kompleks yang dibuat menjadiexp(0) = 1
(untuk$_%6 = 1
) atauexp(iπ/2) = i
(untuk$_%6 = 5
), dan akhirnya membulatkannya ke bilangan bulat terdekat. Menjumlahkan mereka dengan[+]
memberikan hasilnya.Akhirnya: ini sangat efisien, jadi saya tidak yakin apakah TIO tidak akan kehabisan waktu sebelum Anda mendapatkan output untuk angka yang lebih tinggi (untuk 1e5, dibutuhkan 26 detik pada mesin saya, dan TIO cenderung agak lambat).
sumber
map
ataugrep
kadang-kadang dapat dikenakan biaya beberapa karakter. Ini menghemat 2 karakter:{[+] map {.is-prime*exp(π*($_%6-1)i/8).round: 1},5..$_}
Sebenarnya , 21 byte
Cobalah online!
Menghasilkan PlusPrimes terlebih dahulu, diikuti oleh MinusPrimes
Penjelasan:
sumber
Ditumpuk , 37 byte
Cobalah online!
Agak lambat, tes untuk primality untuk setiap K < N . Bekerja mirip dengan jawaban J saya.
sumber
MATLAB 2017a, 29 Bytes
Penjelasan:
primes(k)
dapatkan semua bilangan prima hingga dan termasuk k.mod(primes(k),6)'
mengambil modulus 6 dari semua bilangan prima dan memindahkannya sehingga jumlah berjalan sepanjang dimensi yang benar.==[5,1]
set semua balita (minusPrimes) ke 1 di kolom pertama dan semua yang (plusPrimes) menjadi 1 di kolom kedua.sum()
jumlah setiap kolom.Ini output
[minusPrime, plusPrime]
sumber
Japt ,
1816 byte-2 byte terima kasih kepada @Oliver
Cobalah online!
Output dalam format
[PlusPrimes, MinusPrimes]
.sumber
[5,1]
untuk mendapatkan penghitungan dan Anda sampai di sana terlebih dahulu.f
ilter dan string; Saya menggunakan fungsi pemetaanõ
dan array. Selain itu, saya mendapat[5,1]
ide dari jawaban lain.5â
untuk mendapatkan[1,5]
C #,
202179174 Bytes-23 Bytes terima kasih kepada Tn. Xcoder
-5 Bytes berkat Cyoce
Fungsi yang mengembalikan array dengan panjang 2,
[MinusPrimes, PlusPrimes]
Jalankan dengan memanggila(n)
.Kode yang diformat dengan benar di Try It Online: Sini
sumber
public int[]a(int n){int[]r=new int[2];for(int i=5;i<=n;i++)if(i%2*b(i)>0)if(i%6<5)r[1]++;else++r[0];return r;}public int b(int n){for(int i=3;i<=Math.Sqrt(n)+1;i+=2)if(n%i<1)return 0;return 1;}
public int[]a(int n){int[]r=new int[2];for(int i=5;i<=n;i++)if(i%2*b(i)>0)if(i%6<5)r[1]++;else++r[0];return r;}public int b(int n){for(int i=3;i-2<Math.Sqrt(n);i+=2)if(n%i<1)return 0;return 1;}
Haskell ,
8169 byteCobalah online!
Solusi pertama adalah:
Tapi saya membaca jawaban w0lf di Ruby ...
sumber
Pyth , 15 byte
Test Suite.
Pyth , 16 byte
Test Suite.
Bagaimana?
Penjelasan # 1
Penjelasan # 2
Alternatif:
sumber
Jelly ,
12 1110 byteTerima kasih kepada @cairdcoinheringaahing untuk beberapa kiat dalam obrolan. Terima kasih kepada @Dennis karena menyimpan satu byte dalam obrolan.
Cobalah online!
Jelly , 11 byte
Cobalah online!
Jelly , 11 byte
Cobalah online!
Bagaimana cara kerjanya?
Penjelasan # 1
Penjelasan # 2
Penjelasan # 3
sumber
Java 8,
141140138106101100969481 byteMengembalikan integer-array dengan dua nilai, dalam urutan terbalik dibandingkan dengan deskripsi tantangan:
[plusPrime, minusPrime]
.Port jawaban @Xynos C # , setelah saya bermain golf
394042 byte.Bantuan besar dari @Nay untuk -55 byte kekalahan lainnya
Penjelasan:
Coba di sini. (Kasus uji akhir
4000000
melebihi batas waktu 60 detik sedikit.)sumber
n->{int r[]={0,0},i=4,j,c;for(;i++<n;){for(j=c=1;j*j<i;)c=i%(j+=2)<1?0:c;if(i%2*c>0)r[i%6%5]++;}return r;}
n->{int r[]={0,0},i=4,j,c;for(;i++<n;r[i%6%5%2]-=-i%2*c>>-1)for(j=c=1;j*j<i;)c|=i%(j+=2)-1;return r;}
n->{int r[]={0,0},i=4,j,c;for(;i++<n;r[i%6%5%2]+=i&c)for(j=c=1;j*j++<i;)c&=-i%++j>>-1;return r;}
(-1 terima kasih untuk Andaj++,++j
)n->{int r[]={0,0},i=4,j,c;for(;i++<n;r[i%6/4]+=i&c)for(j=c=1;j*j++<i;)c&=-i%++j>>-1;return r;}
([plusPrime, minusPrime]
).n->{int r[]={0,0},c;for(;n-->4;r[n%6/4]+=c)for(c=n;c>1;)c=c-1&~n%c>>-1;return r;}
JavaScript (ES6),
8382806866 byteTernyata solusi yang sepenuhnya rekursif jauh lebih pendek daripada memetakan array!
Urutan output adalah
[-,+]
. Craps dengan kesalahan overflow di sekitar 3490.Cobalah
sumber
CJam , 19 byte
Program yang mengambil input dari STDIN, dan menampilkan dua angka yang dipisahkan oleh baris baru melalui STDOUT.
Cobalah online!
Penjelasan
sumber
Angka R + ,
66605840 byte-16 bytes terima kasih kepada Jarko Dubbeldam! Saya kemudian bermain golf dua byte lagi.
Mencetak
PlusPrimes MinusPrimes
ke stdout; dibaca dari stdin.table
mentabulasikan jumlah setiap kemunculan nilai dalam vektor inputnya, dalam urutan nilai yang menaik. Oleh karena itu, karena hanya ada dua nilai, yaitu1
dan5
(mod 6), inilah fungsi yang kita butuhkan, bersama dengannumbers::Primes
, yang mengembalikan semua bilangan prima di antara4
dan input.Cobalah online!
Basis R ,
9791898665 bytesekelompok byte yang disimpan oleh Jarko di sini juga
Ini hampir identik dengan yang di atas, kecuali ia menghitung semua bilangan prima dalam basis R daripada menggunakan paket, dan kembali dengan fungsi output daripada mencetaknya. Anda dapat melihat dalam output bahwa ia mengembalikan tabel dengan nama
1
dan5
, dengan jumlah di bawah ini.Cobalah online!
sumber
all(x%%2:x^.5>0)
, apa pun yang bukan nol sudah benar, jadiall(x%%2:x^.5)
berfungsi juga4
bisa kita singkirkan>4
karena kita tidak akan memiliki2
di sana lagi sebagai bilangan prima, jadi golf ini menjadi 40 byte sebagai gantinya.Pari / GP , 41 byte
Cobalah online!
sumber
JavaScript (SpiderMonkey) ,
151,140, 131 byteCobalah online!
Terima kasih kepada shaggy karena membantu memperbaiki bug dan bermain golf.
Penjelasan:
sumber
17,15
untuk 149 (Harus18,15
). Anda perlu menambah ukuran array Anda dengan 1: TIO . Kebetulan, ini hanya "vanilla" ES6, tidak ada yang spesifik untuk SpiderMonkey di dalamnya. Anda juga dapat menggunakan Stack Snippets untuk JS, daripada TIO. Dan, Anda memiliki banyak ruang yang dapat Anda hapus.