nを含むn番目の素数を出力します


39

この質問は、nth個の素数を見つけることのひねりになります。

チャレンジ

1つの入力を受け取りnn10進表現にnサブトリングとしての10進表現を含むth番目の素数を出力するプログラムを作成する必要があります。

混乱した?下記は用例です。

n=1
Primes: 2, 3, 5, 7, 11
                    ^1 first prime that contains a 1
Output: 11

n=2
Primes: 2, 3, 5, 7, 11, 13, 17, 19, 23
        ^1                          ^2 second prime that contains a 2
Output: 23

n=3
Primes: 2, 3, 5, 7, 11, 13, 17, 19, 23
           ^1           ^2          ^3 third prime that contains a 3
Output: 23

n=10
Primes: 2, 3, 5, 7, 11, ..., 97, 101, 103, 107, 109, ..., 997, 1009, 1013, 1019, 1021, 1031, 1033
                                 ^1   ^2   ^3   ^4             ^5    ^6    ^7    ^8    ^9    ^10 tenth prime that contains a 10
Output: 1033

これはであるため、バイト数が最も少なくなります。

何かわかりにくい場合は、コメントを残してください。


2
このためのOEISはありますか?あるべきだと感じている
MayorMonty

@SpeedyNinjaいいえ、私はすでにチェックしました。
アドナン


1
これでHot Network Questionsリストの5位になったとは信じられません。
ericw31415

回答:


12

05AB1E、8バイト

コード:

µN¹åNp*½

説明:

µ          # Run this until the counting variable has reached the input value.
 N¹å       # Check if the input number is in the range variable.
    Np     # Check if the range variable is prime.
      *    # Multiply those two numbers (which is basically an AND operator).
       ½   # If true, increment the counting variable.
           # After the loop, the stack is empty and implicitly prints N.

CP-1252エンコードを使用します。オンラインでお試しください!



8

Python 2、67 65 62バイト

f=lambda n,k=0,m=2,p=1:k/n or-~f(n,k+p%m*(`n`in`m`),m+1,p*m*m)

Ideoneでテストします。

使い方

ウィルソンの定理の帰結を使用します。

ウィルソンの定理の帰結

常に、変数pm-1の階乗の2乗に等しくなります。

k <nの場合、0k/nが生成され、fが再帰的に呼び出されます。mがインクリメントされ、pが更新され、kがインクリメントされるのは、mnを含む素数である場合に限ります。

後者は、の結果p%m*(`n`in`m`)kに追加することで実現されます。ウィルソンの定理の帰結により、mが素数の場合p%m1を返し、そうでない場合は0を返します

いったんk個に達するnは、我々が見つかりました。QN 番目含まプライムnと

チェック中に次の呼び出しが行われるため、m = q + 1です。k/n1を返し、ビットごとの演算子-~は関数呼び出しごとにその数を1つずつ増やします。それがかかるため、Q - 1つのへの呼び出しFインクリメントするMから2までのq + 1、の最も外側の呼び出しfは戻ります1つの+ Qを- 1 = Qを、意図したとおり。


6

Bash、27バイト

primes 0|grep $1|sed $1q\;d

primes bsdgamesから来ています。

入力をコマンドライン引数として受け取り、STDOUTに出力します。



4

Mathematica、75バイト

Nest[NestWhile[b=NextPrime,b@#,!StringContainsQ@@ToString/@{#,a}&]&,1,a=#]&

まだゴルフ可能です。


これはおそらくNextPrimeを使用するため、最も高速なソリューションです:)

4

Javaの、194 180 173 171 112のバイト

コード:

a->{int i=1,j,n,r=0;for(j=n=new Integer(a);(r+=++i>=j&(""+j).contains(""+n)?1:0)!=n;j+=j%i==0?i=1:0);return j;}

ゴルフをしていない:

class P{
    static int i=1,j,n,r;
    public static void main(String[]s) {
        for(
                j=n=new Integer(s[0]); //executes once before first iteration
                (r+=++i>=j&(""+j).contains(""+n)?1:0)!=n; //executes on first and every iteration
                j+=j%i==0?i=1:0 //executes after first and every iteration
           ) {
            ;
        }
        System.out.print(j);
    }
}

こんにちは、PPCGへようこそ!注意すべき2つのこと、1 。P {とで2つのスペースを削除できますString[] s。2.現在、の出力のみを提供しています10が、コードゴルフの課題は、入力を取得し、nその入力に基づいて適切な出力を提供することでした。また、あなたはこれを面白いと思うかもしれません:Javaでのゴルフのヒント。
ケビンCruijssen

3

ルビー、62 61バイト

->i{Prime.lazy.map(&:to_s).grep(/#{i}/).first(i)[-1]}

-rprimeフラグ(+8バイト)が必要です。

->i{            # lambda with one argument
Prime           # iterator over all primes
.lazy           # make the iterator lazy (can't evaluate infinite primes)
.map(&:x.to_s)  # convert the primes to strings
.grep(/#{i}/)   # find primes that regex match on the input (contain it)
.first(i)       # take the first (input) primes that satisfy this
[-1]            # take the last of those
}


3

MATL、18バイト

`@YqVGVXf?3M]NG<]&

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

説明

これは、do...whileループを使用して順番に素数を生成します。各素数について、条件がテストされます(そして素数が消費されます)。満足したら、その素数は再びスタックにプッシュされます。スタック内の要素の数は、見つかった修飾素数の数として使用されます。それらが十分にある場合、最後のものが表示されます。

`         % Do...while
  @       %   Push iteration index, k. Starts at 1
  YqV     %   k-th prime. Convert to string
  GV      %   Push input, n. Convert to string
  Xf      %   Find string within another
  ?       %   If non-empty
    3M    %     Push k-th prime again (increase stack size by 1)
  ]       %   End if
  NG<     %   Is stack size less than input number? If so proceeed with
          %   a new iteration; else exit do...while loop
]         % End do...while
&         % Implicitly display only top number in the stack 


1

Bash + GNU coreutils、66バイト

@Doorknobのソリューションとは対照的に、これはすべてのGNU / Linuxにインストールされているものだけが必要です。

for((n=2;;n++)){
[ `factor $n|wc -w` -eq 2 ]&&grep $1<<<$n&&exit
}

seq 1e20|factor|grep -Po "(?<=: )\d*$2\d$"|sed $1q\;d
デジタル外傷

@DigitalTrauma、私の脳はこのように機能しません;-)
rexkogitans

改行が必要ですか?
ericw31415

の後for((...)){にはスペースまたは改行が必要なので、それは問題ではありません。終了の前に、改行または改行}が必要である; ため、どちらでもかまいません。
-rexkogitans

1

Perl 6、41バイト

->$n {grep({.is-prime&&/$n/},2..*)[$n-1]}

説明:

-> $n { # has one parameter
  grep(
    {
      .is-prime # check that it is prime
      &&        # and
      / $n /    # that it contains the argument in the "string"
    },
    2 .. *      # for all numbers starting with 2
  )[ $n - 1 ]   # only take the $n-th one
                # ( accounting for 0 based array access )
}

テスト:

#! /usr/bin/env perl6
use v6.c;
use Test;

my &prefix:<ℙ𝕟> = ->$n {grep({.is-prime&&/$n/},2..*)[$n-1]}

my @test = (
  1  => 11,
  2  => 23,
  3  => 23,
  10 => 1033,
);

plan +@test;

for @test {
  is ℙ𝕟.key, .value, .gist
}
1..4
ok 1 - 1 => 11
ok 2 - 2 => 23
ok 3 - 3 => 23
ok 4 - 10 => 1033

1

ジャワ8、192 183 181 171バイト(フルプログラム)

interface M{static void main(String[]a){long n=new Long(a[0]),c=0,r=1,m,i;for(;c<n;c+=m>1&(r+"").contains(a[0])?1:0)for(m=++r,i=2;i<m;m=m%i++<1?0:m);System.out.print(r);}}

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

説明:

interface M{                    // Class
  static void main(String[]a){  //  Mandatory main-method
    long n=new Long(a[0]),      //   Input argument as number
         c=0,                   //   Counter, starting at 0
         r=1,                   //   Result-number, starting at 1
         m,i;                   //   Temp number
    for(;c<n;                   //   Loop as long as `c` does not equals `n`
        c+=                     //     After every iteration: increase `c` by:
           m>1                  //      If the current `r` is a prime,
           &(r+"").contains(a[0])?
                                //      and this prime contains the input `n`
            1                   //       Increase `c` by 1
           :                    //      Else:
            0)                  //       Leave `c` the same
      for(m=++r,                //    Increase `r` by 1 first with `++r`, and set `m` to it
          i=2;i<m;              //    Inner loop `i` in the range [2, `m`)
        m=m%i++<1?              //     If `m` is divisible by `i`
           0                    //      Change `m` to 0 (so it's not a prime)
          :                     //     Else:
           m);                  //      Leave `m` unchanged
    System.out.print(r);}}      //    Print `r` as result

Java 8、105バイト(ラムダ関数)

n->{int c=0,r=1,m,i;for(;c<n;c+=m>1&(r+"").contains(n+"")?1:0)for(m=++r,i=2;i<m;m=m%i++<1?0:m);return r;}

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

上記と同じですが、n整数入力を使用し、詳細なクラスを使用しません。


1
正規表現に置き換え&&&削除でき?ます。
クリフルート

@cliffrootありがとう、投稿を編集しました。私はいつも忘れる&&&...何らかの理由で
ケビンCruijssen

0

Clojure、118バイト

(defn s[n](nth(filter(fn[x](if(.contains(str x)(str n))(not-any? #(=(mod x %)0)(range 2 x))))(drop 2(range)))(dec n)))

素数でありn、文字列表現に含まれる数字の遅延無限シーケンスのn番目の要素を取得します。

ここで試すことができます:https : //ideone.com/ioBJjt


0

実際には、16バイト

;$╗`P$╜@íu`╓dP.X

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

説明:

;$╗`P$╜@íu`╓dP.X
;$╗               make a copy of n, push str(n) to reg0
   `      `╓      push the first n values where f(k) is truthy, starting with k=0:
    P$              kth prime, stringified
      ╜@íu          1-based index of n, 0 if not found
            d     remove last element of list and push it to the stack (dequeue)
             P    nth prime
              .   print
               X  discard rest of list

0

PowerShell v2 +、108 99バイト

やばい。組み込みのプライム計算/チェックのいずれかの種類の欠如は本当にここで痛いです。

param($n)for(){for(;'1'*++$i-match'^(?!(..+)\1+$)..'){if("$i"-like"*$n*"){if(++$o-eq$n){$i;exit}}}}

入力を受け取り$n、無限for()ループに入ります。繰り返しごとにforPowerShell正規表現の素数チェッカー(Martinのh / t)にラップされたループを使用して、ループを実行するたびにインクリメントすることで素数ジェネレーターに変換します$i。(たとえば、単に実行for(){for(;'1'*++$i-match'^(?!(..+)\1+$)..'){$i}}する2, 3, 5, 7...と、改行で区切られて出力されます)。

次に、どこかにあるか-likeどう$nかを確認する簡単なチェックを行い$i、カウンターをインクリメントします$o$n$oが等しい場所に到達した場合は、とを出力$iexitます。それ以外の場合はfor、次の素数を見つけるために処理を続行し、プロセスが繰り返されます。


0

APL(NARS)、39文字、78バイト

{s←⍕w←⍵⋄2{(w≤⍵)∧k←∨/s⍷⍕⍺:⍺⋄(1π⍺)∇⍵+k}1}

1πは次の素数です...; テスト:

  f←{s←⍕w←⍵⋄2{(w≤⍵)∧k←∨/s⍷⍕⍺:⍺⋄(1π⍺)∇⍵+k}1}
  f¨1 2 3 10
11 23 23 1033 

しかし、すでに20でスタックスペースがなくなります...代わりに、これより少し長い(61文字)場合でも、これは問題ないようです

∇r←f w;i;k;s
r←2⋄s←⍕w⋄i←1
→0×⍳(w≤i)∧k←∨/s⍷⍕r⋄r←1πr⋄i+←k⋄→2
∇

  f¨1 2 3 10 20 100
11 23 23 1033 4201 100999 


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