Bilangan prima halus

Sep 21 2020

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

11 Adnan Sep 21 2020 at 07:11

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.
9 Bubbler Sep 21 2020 at 08:12

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 semua strurutan 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 dari str, 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
7 xash Sep 21 2020 at 03:39

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)
6 JonathanAllan Sep 21 2020 at 06:56

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
5 Shaggy Sep 21 2020 at 04:39

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?
4 xash Sep 21 2020 at 04:01

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)
4 Mukundan314 Sep 21 2020 at 02:43

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
3 Neil Sep 21 2020 at 03:50

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.

3 user Sep 21 2020 at 04:21

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!

3 DominicvanEssen Sep 21 2020 at 19:57

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
2 att Sep 21 2020 at 07:10

Wolfram Language (Mathematica) , 54 byte

Select[FromDigits/@Subsets@@RealDigits@#,PrimeQ]=={#}&

Cobalah secara online!

2 Arnauld Sep 21 2020 at 16:55

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.

2 Noodle9 Sep 21 2020 at 15:38

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.

2 pxeger Sep 21 2020 at 19:27

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`

1 Noodle9 Sep 21 2020 at 21:12

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.

1 Stef Sep 22 2020 at 17:33

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.