これらの数字のみを含む最小のn桁の素数


26

n数字を含む最小の素数を生成する必要があり、リストに指定された数字のみが含まれますk

例:

入力:

4
1 2

そのために4は、数字1を含む最小の素数を生成する必要があり、その素数には数字とのみが含まれている必要があります2

出力:

2111

入力:

10
0 4 7 

出力:

4000000007

入力:

6
5 5 5 5 5 5 5 5 5 5 1 5 5 5 5 5 5 5 5 5 5

出力:

115151

入力は常に指定した形式であることが保証でき、無効な入力(入力が1桁であるなどnk

入力に対するそのような解決策が存在しない場合、プログラムは次のいずれかを実行できます。

  • 印刷する banana
  • エラーを投げる
  • 永遠に走る
  • 他に何か

これは、最短のコードを目指してください。

入力は、指定した任意の形式にすることができます。たとえば、入力を次のいずれかにしたい場合は問題ありません。

4
[1, 2]

[1,2]4

1,2
4

4 12

プログラムまたは関数を作成できます。正しい値を返すか、印刷する必要があります。

空白はどこでも使用できます。

A036229に触発されたこの課題。


2
必須の質問:任意のベースを使用できますか?(単項での挑戦ははるかに簡単です。)
flawr

ゼロが入力数字の1つである場合、ソリューションは先行ゼロを持つことができますか?
ルイスメンドー

@flawrもちろんそうではない、私はそれが標準的な抜け穴の下に来るかもしれないと思う(そうでなければ、それを追加する必要がある)
Okx

1
@LuisMendo私はそれを「適切な」数として数えないので、いいえ。
Okx

リストは集合リテラルにできますか?そして整数の代わりに文字?(@xnorのPythonの答えはそれらを使用しています)
mbomb007

回答:


4

Brachylog(2)、8バイト

j₍oᵐ∋ᵐcṗ

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

多くの可能性のある数字がある問題、または可能性のある数字のセットに0が含まれる問題では非常に遅い( ます)この場合します。問題が非常に単純でない限り、TIOがタイムアウトするほど遅くなります)。Brachylogの場合と同様、これは関数であり、完全なプログラムではありません。

入力は次の形式で取得されます [ndigits,[list of digits]]で。[10,[[0,4,7]]]

説明

j₍oᵐ∋ᵐcṗ
j₍        Make a number of copies of the second element equal to the first element
  oᵐ      Sort each (ᵐ) of those copies (evaluation order hint)
    ∋ᵐ    Take one element from each of those copies
      c   Concatenate those elements to form an integer (asserts no leading 0)
       ṗ  producing a prime number

純粋に宣言的な観点から見ると、これは「すべての数字が指定された数字の1つである、指定された桁数の素数を見つける」ことを意味します。そのような最小の番号を見つけるために、評価順序のヒントを使用して、番号をテストする順序が最小から最大になるようにします。この場合、リストの最初の近くの決定は、最後の近くの決定よりも変更されにくい傾向があります(これは自然順序であり、辞書式辞書と整数の数値順序と同じです)。したがって、{o∋}ᵐ2つの評価順序があります。ヒント、「最後の数桁を最初に変更する」(からから(より重要なヒントとしての自然な順序)、および『より大きな数字の前に小さな数字を確認する』oの前に、これはこのコンテキストでヒントとして機能します)タイブレークとして。バイトを保存する{o∋}ᵐのと同等のものとして書くことができoᵐ∋ᵐます。



9

Python 2、66バイト

f=lambda n,s,k=1,p=1:10**~-n<p%k*k<s>=set(`k`)or-~f(n,s,k+1,p*k*k)

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

のような入力を受け取りますf(3,{'9','3','8'})

Pythonには素数の組み込み機能がないため、関数はウィルソンの定理を使用してそれらを生成し、それぞれの潜在的な値をk順に素数であるかどうかをチェックします。

連鎖不等式10**~-n<p%k*k<s>=set(`k`)は、次の3つの条件を組み合わせますk

  • 10**~-n<kk少なくともn数字が含まれています。桁数が増えても解決策はなかったはずなので、正確に確認する必要はありません。
  • p%k>0kは、ウィルソンの定理条件を介して素数p=(n-1)!^2です。以来、p%k0または1であり、これは、以前の状態に組み合わせることができます10**~-n<p%k*k
  • s>=set(`k`):のすべての数字kはセットに含まれていsます。Python 2はセットを数値よりも大きいと見なしているため、これを継ぎ合わせることができます。

電流kがこれらのすべてを満たさない場合、関数はに再帰しk+1、結果の出力に1を追加します。出力はTruewhichに等しい値1で終了し、でk始まる1ため、出力はkです。成功時に直接k出力kするビートのこの並行追跡。


うわー-ウィルソンの定理の素晴らしい使用!
チャンドラーワトソン

5

JavaScript(ES7)、100バイト

入力をカリー化構文のn桁数と許容桁の文字列として受け取りsます(n)(s)undefinedソリューションが見つからない場合に返します。

6桁まではかなり高速に動作しますが、7桁は動作する可能性がありますが、それを超えると明らかにメモリが不足します。

n=>s=>(a=[...Array(10**n).keys()]).find(i=>eval(`/[${s}]{${n}}/`).test(i)&&a.every(j=>j<2|j==i|i%j))

テスト


多分異なる素数テストを除いて、まさに私がやったであろうこと。私は...私の方法は、あなたと比較する方法がわかります
ETHproductions

@ETHproductions私は再帰的素数テストから始めましたが、4桁に制限されていました(または、一部のブラウザではもう少しですか?)
Arnauld

再帰的なソリューションに対する私の最初の考えは4バイト短くなりましたが、大きな数値に対してはエラーをスローします。私が持っていたn=>s=>[...Array(10**n).keys()].find(i=>eval(`/[${s}]{${n}}/`).test(i)&(p=j=>i%--j?p(j):j==1)(i))
ETHproductions

@ETHproductions私も&&の代わりに&を使用したいと思いました。しかし、パフォーマンスに関しては、これは非常にコストのかかるバイトです。
アーナウド

「enable-javascript-harmony」フラグを有効にすると、Chromeの現在のバージョンはTCOをサポートします(chrome:// flagsに移動してそのオプションを見つけてください)
ETHproductions

4

ゼリー、12バイト

DL×ÆP
ṗḌÇÐṀṂ

コマンドライン引数としてセットと整数を取ります。印刷0を何も解決策が存在しない場合。

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

使い方

ṗḌÇÐṀṂ  Main link. Left argument: A (digit set/array). Right argument: n (integer)

ṗ       Cartesian power; yield all arrays of length n that consist only of elements
        of the array A.
 Ḍ      Undecimal; convert all generated digit arrays to integers.
  ÇÐṀ   Keep only elements for which the helper link returns a maximal result.
     Ṃ  Take the minimum.


DL×ÆP   Helper link. Argument: k (integer)

D       Decimal; convert k into the array of its base 10 digits.
 L      Take the length.
   ÆP   Test if k is a prime number. Yields 1 or 0.
  ×     Multiply the length and the Boolean.

3

パイク、18 16バイト

j;~p#`ljqi`Q-!)h

ここで試してみてください!

値が見つからない場合は永久に実行されます


@Okxは今現在すべてのテストケースのほとんど実行している場合ではないために十分な速さでなければなりません
ブルー

@Okx制限なしで完全にテストしたい場合、Pykeをダウンロードしてオフラインで実行できることを知っていますか?
ブルー

あ、ごめんなさい。私はそれがコードだと思った。タイムアウトは約4秒ですが、それほど長くはありません。
Okx

3

Mathematica、64バイト

FirstCase[Tuples@##,x:{f_,___}/;f>0&&PrimeQ[y=FromDigits@x]:>y]&

最初の引数が許可された数字の(ソートされた)リストであり、2番目の引数が許可された長さである純粋な関数。Tuples@##許可された長さの許可された数字のすべてのリストを計算し、最初の数字がなく、整数が素数であり、それで置き換えられるようFirstCaseに一致するものを見つけます。x:{f_,___}f0y=FromDigits@xy


2
これは、/;テストを使用してタプルを選択するだけでなく:>、目的の出力形式に変換する方法です。(許可されているが、この答えを読んだ後にのみ!)あなたの関数は、許可された数字をソートする必要があることを指定する必要があります:で呼び出された場合では3331なく、間違った答えを与えます。3313[{3,1},4]
グレッグマーティン

@ngenisisどうSelect[FromDigits/@Tuples[Sort@#,#2],PrimeQ][[1]]&@@#&
マーティン

@martinそれはタプルを最初から考慮せず0@@#&冗長なようです。
ngenisis

@ngenisisすみません-それを説明しませんでした
マーティン

3

Brachylog、15バイト

tL∧?h~lṗ.dẹp⊆L∧

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

これはかなり遅いです。

説明

tL                Input = [H, L]
  ∧
   ?h~l .         The Output is a variable of length H
       ṗ.         The Output is a prime number
          ẹ       The Output's digits...
        .d        ...when removing duplicate digits...
           p      ...is a permutation...
            ⊆L    ...of an ordered subset of L
              ∧

2

JavaScript(ES6)、86バイト

カリー化構文を介して入力を受け取ります。たとえば、 (4)('12')

n=>(d,F=(i,P=j=>i%--j?P(j):1==j)=>P(i)&&`${i}`.match(`^[${d}]{${n}}$`)?i:F(i+1))=>F(2)

'use strict';

const G=n=>(d,F=(i,P=j=>i%--j?P(j):1==j)=>P(i)&&`${i}`.match(`^[${d}]{${n}}$`)?i:F(i+1))=>F(2)

const submit = () => {
  console.clear();
  console.log(G(+n.value)(d.value));
}

button.onclick = submit;
submit();
<input id="n" type="number" min="1" value="4" />
<input id="d" type="text" value="12" />
<button id="button">Submit</button>

厳密モードで実行する(末尾呼び出し最適化[TCO]の場合)。ご使用の環境がTCOをサポートしていない場合、環境スタックよりも大きい素数に対してスタックオーバーフローエラーが発生します。

無効な入力の場合、永久に実行されます。

注意:

  • Chrome(> = 51)ユーザーはchrome://flags/#enable-javascript-harmony、このフラグにアクセスして、TCOサポートを使用して上記のスニペットを実行できます。
  • Safari(> = 10)はTCOをサポートします

私はあなたと2つのバイトを保存することができると思うF=i=>(P=j=>i%--j?P(j):1==j)(i)&&...
ETHproductions

それは(回避のスタックオーバーフローの)strictモードで実行する必要があり、それがグローバル変数P.を作成するため@ETHproductionsはできません
ジョージReithの

ああ、TCOが厳密モードでのみ適用されることに気づきませんでした。
ETHproductions

@ETHproductions Ayeは、XDに投稿した仕様を読むまでは、私が答えた最初のバリエーションが無効であることに気付くまでそのショートカットを使用していませんでした。
ジョージリース

2

MATL、17バイト

wlwX"1GXNUStZp)l)

この関数は、2つの入力、桁数を指定する整数、および可能な値を示す文字配列を受け入れます。素数がない場合、エラーが表示されます。

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

説明

        % Implicitly grab two inputs. First as an integer (N), second as a string (OPTS)
w       % Reverse the order of the inputs
l       % Push the literal 1 to the stack
w       % Pull N back to the top of the stack
X"      % Repeat OPTS N times 
1G      % Explicitly grab N again
XN      % Get all N-character combinations of the repeated version of OPTS
U       % Convert each row from a string to a number
S       % Sort them in ascending order
tZp)    % Grab only those that are primes
l)      % Retrieve the first prime
        % Implicitly print the result


2

セージ、62バイト

lambda l,d:[p for p in primes(10^(l-1),10^l)if set(`p`)<=d][0]

フォームの入力を受け取ります: f( 4 , {'1','2'} )


1

Perl 6、43バイト

->\n,@k {first *.is-prime&/^@k**{n}$/,^∞}

ソリューションが存在しない場合、永久に実行されます。


入力形式は何ですか?
Okx

1
@Okx:数値nとリストkの2つの引数を取るラムダです。
smls

1

05AB1E、17バイト

[¾Øмg¹QiS²Kg0Qiq

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

[¾Ø ¼             # Infinite loop over all primes
   Ð              # Push two extra copies on the stack
     g¹Qi         # If the length of this prime == the first input...
         S²K      # Push this prime without any of the digits in the second input
            g0Qi  # If the length of what remains is 0...
                q # quit
                  # implicitly print this prime


0

Perl5、77バイト

($n,$d)=@ARGV;/^[$d]{$n}$/&&("x"x$_)!~/^(..+?)\1+$/&&print&&die for 2..10**$n

次のように実行します。

perl -le '($n,$d)=@ARGV;/^[$d]{$n}$/&&("x"x$_)!~/^(..+?)\1+$/&&print&&die for 2..10**$n' 4 12

0

ルビー、77 76バイト

->n,l{(10**~-n..10**n).find{|n|(2...n).none?{|x|n%x<1}&&!n.to_s[/[^#{l}]/]}}

入力形式:数値と文字列。

例:

->n,l{...see above...} [6,"555555555515555555555"]
=> 115151

0

Perl 6、68バイト

->\n,\k{first {.is-prime&&/.**{n}/},+«[X~] 0,|(k.unique.sort xx n)}

それを試してみてください

返品 Nilそのような素数が見つからない場合に。

拡張:

->
  \n, # number of digits
  \k  # list of digits
{

  first

    {
        .is-prime
      &&
        / . ** {n} / # exactly 「n」 digits ( in case 「k」 has a 0 )
    },

    \          # turn the following into a list of numbers

    [X[~]]       # cross the following with &infix:<~>

    0,           # append a 0 in case 「n」 was 1
    |(           # slip this list in (flatten)

        k        # the input list of possible digits
        .unique  # only one of each to reduce the search space (optional)
        .sort    # sort it so that the cross meta op returns them sorted

      xx         # list repeat

        n        # 「n」 times
    )
}

0

Python 2 + primefac91 85バイト

import primefac as P
n,k=input()
p=10**~-n
while set(`p`)!=k:p=P.nextprime(p)
print p

オンラインで試す

入力はのようなもの4,{'1','2'}です。


1,{'1'}は有効な入力ではないため(1は素数ではないため)、好きなことを行うことができます。

ああ、そう。ありがとう。
mbomb007

0

PHP、82バイト

for($n=10**--$argv[1];$i-1||a&trim($n,$argv[2]);)for($i=++$n;--$i&&$n%$i;);echo$n;

コマンドライン引数から数字と数字列を取得します。で実行し-nrます。

壊す

for($n=10**--$argv[1];  // $n = smallest number with (argument1) digits
    $i-1||                  // loop while $n is not prime or
    a&trim($n,$argv[2]);    // $n without all digits from (argument2) is not empty
)
    for($i=++$n;--$i&&$n%$i;);  // $i=largest divisor of $n smaller than $n (1 for primes)
echo$n;                 // print

0

Java 7、139 141バイト

long c(int a,String b){for(long n=2,i,x;;n++){for(x=n,i=2;i<x;x=x%i++<1?0:x);if(x>1&(n+"").length()==a&(n+"").matches("["+b+"]+"))return n;}}

32ビット以上の数をサポートすることにより+2バイト(変更intしますlong

入力形式:整数(つまり4)と文字列(つまり"12"

説明:

long c(int a, String b){                  // Method with the two input parameters specified above
  for(long n = 2, i, x; ; n++){           // Loop from 2 going upwards
    for(x = n, i = 2; i < x; x = x % i++ < 1 ? 0 : x);  // Prime check for `n` 
    if (x > 1                             // if `n` is a prime (if `x` > 1 after the loop above it means `n` is a prime)
         & (n+"").length() == a           // AND if `n` has a length equal to the input integer
         & (n+"").matches("["+b+"]+")){   // AND if `n` only contains the specified digits of the input String (using a regex)
      return n;                           // Then we have our answer
    }
  }                                       // If no answer is available for the given input, it continues looping
}

テストコード:

ここで試してみてください。
注:2番目のテストケースは非常に長い時間ループするため、無効になっています。

class M{
  static long c(int a,String b){for(long n=2,i,x;;n++){for(x=n,i=2;i<x;x=x%i++<1?0:x);if(x>1&(n+"").length()==a&(n+"").matches("["+b+"]+"))return n;}}

  public static void main(String[] a){
    System.out.println(c(4, "12"));
    //System.out.println(c(10, "047"));
    System.out.println(c(6, "555555555515555555555"));
  }
}

出力:

2111
115151
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.