Bilangan prima halus
Terinspirasi oleh Find prime rapuh terbesar .
Dengan menghapus setidaknya 1 digit dari bilangan bulat positif, kita bisa mendapatkan bilangan bulat non-negatif yang berbeda. Perhatikan bahwa ini berbeda dengan Removefungsi dalam pertanyaan terkait. Kita mengatakan bilangan prima rumit jika semua bilangan bulat yang dihasilkan dengan cara ini bukan bilangan prima. Misalnya, \$60649\$ menghasilkan bilangan bulat berikut:
0, 4, 6, 9, 49, 60, 64, 66, 69, 604, 606, 609, 649, 664, 669, 6049, 6064, 6069, 6649
Tak satu pun dari bilangan bulat ini adalah bilangan prima, oleh karena itu \$60649\$adalah bilangan prima yang halus. Perhatikan bahwa setiap nol di depan dihilangkan, dan persyaratannya adalah "bukan bilangan prima", jadi \$0\$dan \$1\$keduanya memenuhi syarat, artinya, misalnya, \$11\$ adalah bilangan prima yang halus.
Mirip dengan aturan urutan standar , Anda harus melakukan salah satu tugas berikut:
- Diberikan bilangan bulat positif \$n\$, menghasilkan dua nilai yang berbeda dan konsisten * bergantung pada apakah \$n\$ adalah bilangan prima yang halus atau tidak
- Diberikan bilangan bulat positif \$n\$, keluarkan \$n\$pokok halus
- Diberikan bilangan bulat positif \$n\$, keluaran pertama \$n\$ bilangan prima halus
- Menghasilkan tak terhingga daftar bilangan prima halus
* : Anda dapat memilih untuk mengeluarkan dua set nilai sebagai gantinya, di mana nilai dalam set tersebut sesuai dengan definisi bahasa Anda tentang truthy dan falsey. Misalnya, jawaban Python dapat mengeluarkan daftar kosong untuk falsey / truthy dan sebaliknya daftar tidak kosong.
Anda dapat memilih tugas mana yang ingin Anda lakukan.
Anda dapat memasukkan dan mengeluarkan dengan cara standar apa pun , dan, karena ini adalah kode-golf , kode terpendek dalam byte menang
Sebagai referensi, 20 bilangan prima halus pertama adalah:
2, 3, 5, 7, 11, 19, 41, 61, 89, 409, 449, 499, 881, 991, 6469, 6949, 9001, 9049, 9649, 9949
Beberapa lagi yang harus diperhatikan:
821 - False (Removing the 8 and the 1 gives 2 which is prime)
Saya akan menawarkan hadiah +100 untuk jawaban yang mengimplementasikan salah satu urutan standar I / Os daripada metode masalah keputusan , baik itu:
- lebih pendek dari implementasi masalah keputusan yang naif (harap sertakan versi seperti itu sebagai bukti jika belum diposting)
- atau yang tidak bergantung pada pemeriksaan apakah nilai adalah bilangan prima halus atau tidak saat menghasilkan nilai (misalnya, dapat menggunakan fakta bahwa hanya digit tertentu yang dapat terjadi, atau sesuatu yang lain yang tidak sekadar menampar "putaran di atas bilangan, menemukan bilangan prima yang rumit" )
Ini agak subjektif untuk apa yang dianggap sebagai "memeriksa bilangan prima yang rapuh", jadi saya akan menggunakan penilaian terbaik saya dalam hal pemberian hadiah.
Jawaban
05AB1E , 4 byte
Kode
Menggunakan pengodean 05AB1E. Memeriksa apakah bilangan yang diberikan adalah bilangan prima atau bukan.
æpJΘ
Cobalah secara online! atau Periksa semua nomor antara 1 dan 9949 .
Penjelasan
æ # Get the powerset of the number.
p # Check for each element whether it is a prime.
J # Join these numbers into one big number.
Θ # Check whether this joined number is equal to 1.
APL (Dyalog Extended) , 16 14 byte
</1⍭⍎⍕(⊢,,¨)\⍞
Cobalah secara online!
-2 byte ( ∊⍎¨¨ → ⍎⍕) berkat @ngn.
Program penuh yang mengambil satu nomor dari stdin dan mencetak 1 (benar) atau 0 (salah).
Triknya di sini adalah bagaimana ia menghasilkan semua selanjutnya yang tidak kosong:
(⊢,,¨)/ strmemberikan semuastrurutan yang mencakup karakter terakhir.
(⊢,,¨)/ '1234'
→ '1' (⊢,,¨) '2' (⊢,,¨) '3' (⊢,,¨) '4'
→ '1' (⊢,,¨) '2' (⊢,,¨) '4' '34'
→ '1' (⊢,,¨) '4' '34' '24' '234'
→ '4' '34' '24' '234' '14' '134' '124' '1234'
(⊢,,¨)\ strberlaku(⊢,,¨)/untuk setiap awalan daristr, memberikan semua selanjutnya yang tidak kosong sebagai daftar daftar string.
(⊢,,¨)\ '1234'
→ '1' ('2' '12') ('3' '23' '13' '123') ('4' '34' '24' '234' '14' '134' '124' '1234')
Penjelasan seluruh kode:
</1⍭⍎⍕(⊢,,¨)\⍞
⍞ ⍝ Take n from stdin as a string
( )\ ⍝ For each prefix, reduce from right by
,¨ ⍝ prepend the previous char to each string
⊢, ⍝ and append to the previous list of strings
⍎⍕ ⍝ Convert nested strings to a single string,
⍝ and then eval it to get a simple integer vector
1⍭ ⍝ Test each number for primality
</ ⍝ Test if the only truth is the last one
Brachylog , 7 6 byte
ṗ⊇ᵘṗˢȮ
Cobalah secara online!
ṗ⊇ᵘṗˢȮ the implicit input
ṗ is a prime
⊇ᵘ and from every unique subset
ṗˢ select the primes
Ȯ and this should be a list with one element (the prime input itself)
Jelly , 7 byte
DŒPḌẒḄ’
Tautan monadik yang menerima bilangan bulat positif yang mengembalikan nol (falsey) jika bilangan prima halus, atau bilangan bulat bukan nol (kebenaran) jika tidak.
Cobalah secara online! Atau lihat dua puluh yang pertama .
Bagaimana?
DŒPḌẒḄ’ - Link: n e.g. 824 409
D - decimal digits [8,2,4] [4,0,9]
ŒP - power-set [[],[8]...,[8,2,4]] [[],[4],...,[4,0,9]]
Ḍ - undecimal [0,8,2,4,82,84,24,824] [0,4,0,9,40,49,9,409]
Ẓ - is prime? [0,0,1,0,0,0,0,0] [0,0,0,0,0,0,0,1]
Ḅ - from binary 32 1
’ - decrement 31 0
Japt , 7 byte
¥à f_°j
Coba atau uji[0,1000)
¥à f_°j :Implicit input of integer string
¥ :Is equal to
à :Combinations
f :Filter
_ :By passing each through a function
° :Postfix increment, to cast to an integer
j :Is prime?
J , 25 23 byte
-2 Terima kasih Jonah!
Menampilkan daftar yang berisi 1 benar atau 0 sebaliknya.
1</@p:(#~2#:@i.@^#)&.":
Cobalah secara online!
Bagaimana itu bekerja
1</@p:(#~2#:@i.@^#)&.":
&.": convert the number to a string
( 2 ^#) 2 ^ length
#:@i.@ enumerated and to base 2
#~ select from the string based on the bit mask
&.": convert from strings to numbers
1 p: primes -> 1, non-primes -> 0
so in the delicate prime case, we have
(2^L) - 1 zeros and one 1 for the input itself
</@ reduce from left to right with less-than
(so last position is 1, everything else 0)
Pyth , 14 8 byte
qjfP_sTy
Cobalah secara online!
Penjelasan
qjfP_sTy
f # filter
y # all subsets of input
P_sT # with a primality test
j # join result of filter on newlines
q # check if it equals input
Retina 0.8.2 , 53 byte
^
;
+%`;(.)
$1;$'¶$`; .+ $*
%A`^.?$|^(..+)\1+$
^1+¶+$
Cobalah secara online! Tautan termasuk kasus uji. Penjelasan:
^
;
+%`;(.)
$1;$'¶$`;
Hasilkan semua urutan masukan.
.+
$*
Ubah kemudian menjadi unary.
%A`^.?$|^(..+)\1+$
Hapus yang bukan bilangan prima, tapi jangan hapus baris baru. (Penggantian multiline juga berfungsi, tetapi lebih sulit untuk memformat penjelasan.)
^1+¶+$
Periksa bahwa masukan asli adalah bilangan prima tetapi tidak ada urutan yang tepat.
Scala , 173.170 byte
n=>(s"$n".indices.toSet.subsets.filter{x=>1<x.size&x.size<s"$n".size}.map(_.toSeq.sorted.map(""+n).mkString.toInt).toSet+n).filter{x=>x>1&2.to(x/2).forall(x%_>0)}==Set(n)
Cobalah secara online!
R , 163154 byte
function(x,n=nchar(x),s=sum)(a=apply(!expand.grid(rep(list(0:1),n)),1,function(v)(y=s((x%/%10^(n:1-1)%%10)[v]*10^(s(v):1-1)))&s(!y%%1:y)==2))[1]&!s(a[-1])
Cobalah secara online!
Memeriksa bilangan prima di antara bilangan yang dibentuk dengan menghapus semua kombinasi digit dari x. Kombinasi pertama adalah penghapusan ada angka: ini harus BENAR, dan semua tes perdana lainnya harus SALAH.
Berkomentar:
is_delicate_prime=
function(x, # x = number to test
n=nchar(x), # n = number of digits of x
s=sum) # s = alias to sum() function
(a= # a = matrix of all prime-tests:
apply( # apply the function v to each of...
!expand.grid(rep(list(0:1),n)), # all combinations of n of TRUE/FALSE...
1, # row-by-row...
function(v) # defining the output of v as:
(y=s((x%/%10^(n:1-1)%%10) # the digits of x...
[v] # (considering only the elements chosen by v)...
*10^(s(v):1-1))) # multiplied by 10^((v-1)..0)...
&s(!y%%1:y)==2)) # tested for primality AND non-zero
[1] # Finally, output TRUE if a[1] is TRUE...
&!s(a[-1]) # and the sum of all other elements of a are FALSE
Wolfram Language (Mathematica) , 54 byte
Select[FromDigits/@Subsets@@RealDigits@#,PrimeQ]=={#}&
Cobalah secara online!
JavaScript (ES6), 98 95 byte
Diharapkan nsebagai string. Mengembalikan nilai Boolean.
n=>[...n].reduce((a,x)=>[...a,...a.map(y=>(g=k=>y%--k?g(k):(p+=q=y>1&k<2,y))(y+=x))],[p=0])|q/p
Cobalah secara online!
Bagaimana?
Kami menghitung kumpulan pangkat dari digit nsedemikian rupa sehingga urutannya dipertahankan dan ndihitung terakhir. Hasilnya benar jika satu-satunya bilangan prima di antara bilangan bulat yang dihasilkan adalah yang terakhir.
Python 2 , 139 \$\cdots\$ 145 142 byte
Menambahkan 36 byte untuk memperbaiki bug yang ditunjukkan oleh pxeger .
Disimpan 5 byte berkat pxeger !!!
lambda n,R=range:all((g<2or any(g%i<1for i in R(2,g)))-(`g`==n)for g in{int(''.join(n[j]for j in R(len(n))if i>>j&1))for i in R(1,2**len(n))})
Cobalah secara online!
Memasukkan integer sebagai string dan mengembalikan Truejika bilangan prima halus atau Falsesebaliknya.
Python 3.8 (pra-rilis) , 146144 byte
-2 byte dengan menghapus tanda kurung yang berlebihan
Saya juga mengerjakan jawaban yang sangat mirip tepat sebelum Noodle9 memposting milik mereka, dan saya menggabungkan ide dari itu untuk mendapatkan ini ( upvote it! ). Yang itu sekarang sangat berbeda karena awalnya ada yang rusak, jadi saya pikir saya akan memposting milik saya.
lambda s,R=range:(l:=len(s))*all((g!=int(s))^(g>1)&all(g%k for k in R(2,g))for g in{int(''.join(s[j]for j in R(l)if i>>j&1))for i in R(1,2**l)})
Cobalah secara online!
Penjelasan:
lambda s,R=range:(l:=len(s))*all((g!=int(s))^(g>1)&all(g%k for k in R(2,g))for g in{int(''.join(s[j]for j in R(l)if i>>j&1))for i in R(1,2**l)})
lambda s : function
,R=range alias `range` built-in to `R`
{ s[j]for j in R(l)if i>>j&1 for i in R(1,2**l)} compute the power-set (excluding the empty set)
int(''.join( )) convert each list of digits to an integer
all( for g in ) check the integers for primality
all(g%k for k in R(2,g)) check for factors in the number
(g>1)& makes sure 0 and 1 aren't treated as prime
(g!=int(s))^ ensure the number itself is prime
(l:=len(s))* store the length in `l`
SageMath , 139 byte
def f(n):s=str(n);l=len(s);return p(n)*all(~-p(g)for g in{int(''.join(s[j]for j in R(l)if i>>j&1))for i in R(1,2**l-1)})
R=range;p=is_prime
Cobalah secara online!
Port jawaban Python saya.
Python 3 , 181 byte
Menggunakan itertools dan resep golf untuk powerset.
lambda s,R=range:all(p(int(''.join(t)),R)for t in sum(([*combinations(s,k)]for k in R(1,len(s))),[]))>p(int(s),R)
from itertools import*
p=lambda n,R:any(n%i<1for i in R(2,n))or 2>n
Cobalah secara online!
Mengharapkan masukan sebagai string.
Fungsi pkembali Truejika masukannya bukan bilangan prima, dan Falsejika bilangan prima; fungsi utama mengembalikan (forall t, p(t)) > p(s)tempat tmengambil semua "subvalues" dari s. Satu-satunya cara bagi boolean untuk memenuhi ketidaksetaraan ini adalah True > False, yang berarti semua tnonprima dan sbukan nonprima.
Penafian: Sudah ada dua jawaban python ketika saya memposting yang ini.