繊細な素数

Sep 21 2020

最大の壊れやすい素数を見つけることに触発されました。

正の整数から少なくとも1桁を削除することにより、別の非負の整数を取得できます。これはRemove、リンクされた質問の機能とは異なることに注意してください。この方法で生成されたすべての整数が素数でない場合、素数はデリケートであると言います。たとえば、\$60649\$ 次の整数を生成します。

0, 4, 6, 9, 49, 60, 64, 66, 69, 604, 606, 609, 649, 664, 669, 6049, 6064, 6069, 6649

これらの整数はどれも素数ではないため、\$60649\$デリケートなプライムです。先行ゼロはすべて削除され、要件は「素数ではない」ため、\$0\$および\$1\$どちらも修飾されます。つまり、たとえば、\$11\$ デリケートなプライムです。

標準のシーケンスルールと同様に、次のいずれかのタスクを実行する必要があります。

  • 正の整数が与えられた\$n\$、\かどうかに応じて、2つの異なる一貫した*値を出力します。$n\$ デリケートな素数かどうか
  • 正の整数が与えられた\$n\$、\を出力します$n\$繊細なプライム
  • 正の整数が与えられた\$n\$、最初の\を出力します$n\$ 繊細な素数
  • 繊細な素数のリストを無限に出力する

*:代わりに、2つの値のセットを出力することを選択できます。このセットの値は、言語の真と偽の定義に対応しています。たとえば、Pythonの回答では、falsey / trueの場合は空のリストが出力され、それ以外の場合は空でないリストが出力される場合があります。

実行したいタスクを選択できます。

標準的な方法で入力および出力できます。これはコードゴルフであるため、バイト単位の最短コードが優先されます。

参考までに、最初の20個の繊細な素数は次のとおりです。

2, 3, 5, 7, 11, 19, 41, 61, 89, 409, 449, 499, 881, 991, 6469, 6949, 9001, 9049, 9649, 9949

注意すべき点がさらにいくつかあります。

821 - False (Removing the 8 and the 1 gives 2 which is prime)

決定問題の方法ではなく、標準のシーケンスI / Oの1つを実装する回答に対して、+ 100の報奨金を提供します。

  • 素朴な決定問題の実装よりも短い(まだ投稿されていない場合は、証拠としてそのようなバージョンを含めてください)
  • または、値を生成するときに値がデリケートな素数であるかどうかをチェックすることに依存しません(たとえば、特定の数字のみが発生する可能性があるという事実、または単に「数値をループしてデリケートな素数を見つける」以外の何かを使用する場合があります)

これは「繊細な素数をチェックする」と見なされるものについては主観的なものなので、賞金の授与に関しては最善の判断を下します。

回答

11 Adnan Sep 21 2020 at 07:11

05AB1E、4バイト

コード

05AB1Eエンコーディングを使用します。与えられた数がデリケートな素数であるかどうかをチェックします。

æpJΘ

オンラインでお試しください!または1から9949までのすべての番号を確認します。

説明

æ      # 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が拡張)、16の14バイト

</1⍭⍎⍕(⊢,,¨)\⍞

オンラインでお試しください!

- ∊⍎¨¨ → ⍎⍕@ ngnのおかげで2バイト()。

stdinから単一の数値を取得し、1(true)または0(false)を出力する完全なプログラム。

ここでの秘訣は、空でないすべてのサブシーケンスを生成する方法です。

  • (⊢,,¨)/ strstr最後の文字を含むすべてのサブシーケンスを提供します。
  (⊢,,¨)/ '1234'
→ '1' (⊢,,¨) '2' (⊢,,¨) '3' (⊢,,¨) '4'
→ '1' (⊢,,¨) '2' (⊢,,¨) '4' '34'
→ '1' (⊢,,¨) '4' '34' '24' '234'
→ '4' '34' '24' '234' '14' '134' '124' '1234'
  • (⊢,,¨)\ strの(⊢,,¨)/各プレフィックスに適用されstr、空でないすべてのサブシーケンスを文字列のリストのリストとして提供します。
  (⊢,,¨)\ '1234'
→ '1' ('2' '12') ('3' '23' '13' '123') ('4' '34' '24' '234' '14' '134' '124' '1234')

コード全体の説明:

</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バイト

ṗ⊇ᵘṗˢȮ

オンラインでお試しください!

ṗ⊇ᵘṗˢȮ 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

ゼリー、7バイト

DŒPḌẒḄ’

デリケートな素数の場合はゼロ(falsey)を返し、そうでない場合はゼロ以外の整数(truthy)を返す正の整数を受け入れるモナドリンク。

オンラインでお試しください!または最初の20を参照してください。

どうやって?

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バイト

¥à f_°j

試してみるかテストする[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バイト

-2ヨナに感謝します!

1が真であるか0であるかを含むリストを返します。

1</@p:(#~2#:@i.@^#)&.":

オンラインでお試しください!

使い方

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バイト

qjfP_sTy

オンラインでお試しください!

説明

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バイト

^
;
+%`;(.)
$1;$'¶$`;
.+
$*
%A`^.?$|^(..+)\1+$
^1+¶+$

オンラインでお試しください!リンクにはテストケースが含まれています。説明:

^
;
+%`;(.)
$1;$'¶$`;

入力のすべてのサブシーケンスを生成します。

.+
$*

次に、単項に変換します。

%A`^.?$|^(..+)\1+$

素数ではないものを削除しますが、改行は削除しないでください。(複数行の置換も機能しますが、説明をフォーマットするのは困難です。)

^1+¶+$

元の入力が素数であったが、適切なサブシーケンスがどれもそうではなかったことを確認します。

3 user Sep 21 2020 at 04:21

Scala、173170バイト

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)

オンラインでお試しください!

3 DominicvanEssen Sep 21 2020 at 19:57

R、163154バイト

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])

オンラインでお試しください!

xから数字のすべての組み合わせを削除することによって形成された数の中から素数をチェックします。最初の組み合わせは、数字を削除しないことです。これはTRUEである必要があり、他のすべての素数テストはFALSEである必要があります。

コメント:

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言語(Mathematica)、54バイト

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

オンラインでお試しください!

2 Arnauld Sep 21 2020 at 16:55

JavaScriptの(ES6)、 98の 95バイト

n文字列として期待します。ブール値を返します。

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

オンラインでお試しください!

どうやって?

の桁のnべき集合は、順序が保持され、nそれ自体が最後に計算されるように計算されます。結果の整数の中で唯一の素数が最後の素数である場合、結果は真です。

2 Noodle9 Sep 21 2020 at 15:38

Pythonの2、139 \$\cdots\$ 145の142バイト

pxegerが親切に指摘したバグを修正するために36バイトを追加しました。pxegerの
おかげで5バイト節約できました!!!

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

オンラインでお試しください!

整数を文字列として入力し、Trueそれがデリケートな素数であるかどうかを返しますFalse。

2 pxeger Sep 21 2020 at 19:27

Python 3.8(プレリリース)、146144バイト

-冗長な括弧を削除して2バイト

Noodle9が投稿する直前にも、非常によく似た回答に取り組んでいました。そこからアイデアを組み合わせて、これを取得しました(賛成!)。最初は壊れていたので、今はかなり違うので、投稿したいと思いました。

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,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バイト

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

オンラインでお試しください!

私のPythonの答えの移植。

1 Stef Sep 22 2020 at 17:33

Python 3、 181バイト

itertoolsとゴルフレシピを使用して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

オンラインでお試しください!

文字列としての入力が必要です。

関数pはTrue、入力が素数でないFalse場合、および素数の場合に戻ります。main関数は(forall t, p(t)) > p(s)、のtすべての「サブ値」を取る場所を返しますs。ブール値がこの不等式を満たす唯一の方法はTrue > False、です。これは、すべてtが非プライムでsあり、非プライムではないことを意味します。

免責事項:私がこれを投稿したとき、すでに2つのPythonの回答がありました。