ねじれのある最小の素数(A068103)


33

手元のタスクは、番号を指定すると、番号の先頭にあるAT LEASTn始まる最小の素数を見つけます。これは私がOEIS(A068103)で見つけたシーケンスです。 n2

シーケンスの最初の17個の数値を以下に示します。さらに必要な場合は、実際にシーケンスを実装する必要がありますが、これを実行してもかまいません。

0  = 2
1  = 2
2  = 223
3  = 2221
4  = 22229
5  = 2222203
6  = 22222223                # Notice how 6 and 7 are the same! 
7  = 22222223                # It must be **AT LEAST** 6, but no more than necessary.
8  = 222222227
9  = 22222222223             # Notice how 9 and 10 are the same!
10 = 22222222223             # It must be **AT LEAST** 9, but no more than necessary.
11 = 2222222222243
12 = 22222222222201
13 = 22222222222229
14 = 222222222222227
15 = 222222222222222043
16 = 222222222222222221

これは、文字列操作、素数検出、およびシーケンスのクールな組み合わせだと思いました。これは、おそらく月末に最低バイト数が勝者として宣言されます。


5
サポートする必要がある入力の上限に下限はありますか?
-ETHproductions

1
制限時間はありますか?
ブラッドギルバートb2gills

@ETHProductions申し訳ありませんが、これを書いた後、すぐに消えてしまいました。入力を制限する必要がある場合は、言語がを超える数値をサポートしていない理由の論理的議論に基づいて制限を支持する必要がありますx。たとえば、ご使用の言語が32ビット整数のみをサポートしている場合、それを説明できます。
魔法のタコUr

回答:


12

Brachylog12 11バイト

:2rj:Acb#p=

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

これは、驚くべきことに直接Brachylogに変換されます。これは関数であり、完全なプログラムではありません(Zコマンドライン引数としてインタープリターを与えると、適切なラッパーが追加されて関数がプログラムになります。これがTIOリンクを機能させるためにしたことです)。またj、-1インデックスが付けられているように見え、それを可能にするために修正が必要なこともかなり残念です。

あなたは=、それが必要ではないという合理的な議論をすることができますが、私は問題の言葉遣いの方法を考えると、それはそうだと思います。なし、与えられた数の2sで始まるすべての素数のセットを説明する関数、およびプログラムがこの説明で何かを行う必要があるという明示的なステートメントなしで(この場合、最初の値を生成する)、おそらく仕様に準拠します。

説明

:2rjbAcb#p=
:2rj         2 repeated a number of times equal to the input plus one
    :Ac      with something appended to it
       b     minus the first element
        #p   is prime;
          =  figure out what the resulting values are and return them

整数を返す関数として使用する場合、最初の値を超えて値を要求することはないため、最初に心配する必要があります。

1つの微妙さ(コメントで指摘)::Acbb:Ac数学的に同等です(一方が開始から削除され、もう一方が終了に追加され、その間の領域が重複しないように)。私は以前に持っていましたがb:Ac、これはより自然ですが、入力0で壊れます(c空のリストを何かに連結することを拒否するためです。多くのBrachylogビルトインは何らかの理由で空のリストで壊れる傾向があります)。空のリストを表示:Acbする必要がcないことを保証します。つまり、入力0のケースも機能するようになります。


@muddyfish:あります。しかし、0明らかな理由もなく、Brachylog は動作しませんでした(Brachylogは、何らかの理由でゼロにアレルギーがあるようですc。とはいえ、修正するのは簡単なので、今すぐ修正します。

b:Ac入力に対して02b:Ac2bが与えられ、先行ゼロで0は使用できないため、機能しませんc。これは、常にゼロを追加して同じ結果を得ることができる一般的な場合に無限ループを回避するためです。
17:30に

また、あなたが書くことによって1バイトで、これを短縮することができます:2rj代わりに,2:?j
Fatalize

私は忘れましたr。それは単なる改善です。私は何が起こっているのか理解していcます(逆方向に実行したときに無限に多くの結果が欲しくありません)。ただし、改善されている可能性があるのは、入力が既に縮退値にバインドされている場合に許可しながら、バインドされていない場合にのみ縮退入力を許可しないことです。

これは間違いなく実行可能であり、Githubトラッカーに追加します。けれどもCONCATENATEの実装は、すでに長いPrologの述語のためにたくさんがあるほぼ100行です。
1

15

Java(OpenJDK 8)164 110バイト

a->{int i=0;for(;!(i+"").matches("2{"+a+"}.*")|new String(new char[i]).matches(".?|(..+)\\1+");i++);return i;}

@FryAmTheEggmanにたくさんのバイトをありがとう!

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


2
主に正規表現のチェックがどのように機能するか説明できますか?
J.アントニオペレス

何も思いつきません。それは私のものではなく、オリジナルのクリエーターが誰なのかわかりません。私はちょうどそれが長さnの文字列を取り、nが素数でない場合に一致します。
パベル

元のソースが何であるか知っていますか?それについてどこで知りましたか?コードをテストしましたか?
J.アントニオペレス

3
@Pavel正規表現をチェックする素数性は、たとえあなたがそれを作らなかったとしても、この答えを驚くべきものにします。「Javaでのゴルフのヒント」スレッドに追加する必要があります。
魔法のタコUr

3
すぐにコードをテストすることはできませんが、正規表現は次のように動作することを確信new String(new char[i]))しています。長さと数値に等しい単項文字列を作成します。次に、一連の数字の繰り返しが文字列全体に適合するかどうかをチェックすることにより、正規表現は複合数に一致します(基本的には試行分割)。私が正しいなら、それはあなたが2番目の部分を持たないようにゴルフできるはずであることを意味します?、私はコンピュータに着いたときに確実にお知らせします。
-FryAmTheEggman

5

Pyth、12バイト

f&!x`T*Q\2P_

擬似コードで:

f                key_of_first_truthy_value( lambda T:
  !                  not (
   x`T*Q\2               repr(T).index(input()*'2')
                     )
 &                   and
          P_T        is_prime(T)
                 )

lambdaから開始してT=1、条件が満たされるまで1ずつ増加してループします。2s の文字列は、文字列の先頭からの部分文字列でなければなりません0。つまり、インデックスメソッドはを返す必要があります。部分文字列が見つからない場合、それは-1便利で真実でもあるため、例外的なケースは存在しません。

ここでオンライン試すことができますが、サーバーはの入力までしか許可しません4


4

Perl、50バイト

49バイトのコード+ -pフラグ。

++$\=~/^2{$_}/&&(1x$\)!~/^1?$|^(11+)\1+$/||redo}{

最終改行なしで入力を提供します。例えば:

echo -n 4 | perl -pE '++$\=~/^2{$_}/&&(1x$\)!~/^1?$|^(11+)\1+$/||redo}{'

これは、すべての数字をテストするため、4より大きい数字を実行するのに時間がかかります(2つのテストがあります:最初のテスト/^2{$_}/では、最初に十分な2があるかどうかをチェックし、2番目の(1x$\)!~/^1?$|^(11+)\1+$/テストでは、素数をテストします(パフォーマンスが非常に低い))。


3

Haskell、73バイト

f n=[x|x<-[2..],all((>0).mod x)[3..x-1],take n(show x)==([1..n]>>"2")]!!0

使用例:f 3-> 2221

強引な。現在の素数の文字列表現の最初の文字と比較されるsの[1..n]>>"2"リストを作成します。n 2n


3

Mathematica、103バイト

ReplaceRepeated[0,i_/;!IntegerDigits@i~MatchQ~{2~Repeated~{#},___}||!PrimeQ@i:>i+1,MaxIterations->∞]&

名前が負でない整数引数を取り、整数#を返す関数。両方が#2で始まり素数であるものが見つかるまで、文字通りすべての正の整数を順番にテストします。5を超える入力では恐ろしく遅い。

前の結果:Mathematica、155バイト

Mathematicaは、強く型付けされていなければゴルフに向いています。整数/リスト/文字列タイプを明示的に切り替える必要があります。

(d=FromDigits)[2&~Array~#~Join~{1}//.{j___,k_}/;!PrimeQ@d@{j,k}:>({j,k+1}//.{a__,b_,10,c___}->{a,b+1,0,c}/.{a:Repeated[2,#-1],3,b:0..}->{a,2,0,b})]/. 23->2&

奇妙なことに、このアルゴリズムは数字のリストで動作します{2,...,2,1}。それらが素数の数字でない限り、ルールを使用して最後の数字に1を追加し{j___,k_}/;!PrimeQ@d@{j,k}:>({j,k+1}ます...そして、次の桁のいずれかを運ぶ限り、1桁から次の桁を運ぶことを手動で実装しますルールを使用して数字が10になり、{a__,b_,10,c___}->{a,b+1,0,c}...で、先頭2のsの最後がa 3に変わってしまった場合、ルールを使用して最後の別の数字からやり直し{a,b+1,0,c}/.{a:Repeated[2,#-1],3,b:0..}->{a,2,0,b}ます。/. 23->2最後には、単に入力された特殊なケースで修正され1、ほとんどの素数がで終了することはできません。2しかし、2することができます。(入力01にいくつかのエラーが吐き出されますが、関数は正しい答えを見つけます。)

このアルゴリズムは非常に高速である:例えば、私のラップトップ上で、1000との最初の素数開始することを計算するために以下3秒以上かかる2のです22...220521


2

Pyth、17バイト

f&q\2{<`T|Q1}TPTh

n = 4オンラインでは解決できないようですが、理論的には正しいです。

説明

               Th    Starting from (input)+1, 
f                    find the first T so that
      <              the first
          Q          (input) characters
         | 1         or 1 character, if (input) == 0
       `T            of T's string representation
     {               with duplicates removed
  q\2                equal "2", 
 &                   and
            }T       T is found in
              PT     the list of T's prime factors.




2

セージ、69 68バイト

lambda n:(x for x in Primes()if '2'*len(`x`)=>'2'*n==`x`[:n]).next()

ジェネレータを使用して、無限に多くの項の最初の(したがって最小の)を見つけます。


2

Japt、20バイト

L²o@'2pU +Xs s1)nÃæj

オンラインでテストしてください!私のマシンでは、最大14のすべての入力に対して2秒以内に終了し、その後は自然に精度が失われます(JavaScriptの最大精度は2 53です)。

この作業をしてくれた@obarakonに感謝します:-)

説明

                       // Implicit: U = input integer, L = 100
L²o                    // Generate the range [0...100²).
   @             Ã     // Map each item X through the following function:
    '2pU               //   Take a string of U "2"s.
         +Xs s1)n      //   Append all but the first digit of X, and cast to a number.
                       // If U = 3, we now have the list [222, 222, ..., 2220, 2221, ..., 222999].
                  æ    // Take the first item that returns a truthy value when:
                   j   //   it is checked for primality.
                       // This returns the first prime in the forementioned list.
                       // Implicit: output result of last expression

Japtの最新バージョンでは、これは12バイトになります。

_n j}b!+'2pU   // Implicit: U = input integer
_   }b         // Return the first non-negative bijective base-10 integer that returns
               // a truthy value when run through this function, but first,
      !+       //   prepend to each integer
        '2pU   //   a string of U '2's.
               // Now back to the filter function:
 n j           //   Cast to a number and check for primality.
               // Implicit: output result of last expression

オンラインでテストしてください!私のマシンでは、最大14のすべての入力に対して0.5秒以内に終了します。


素晴らしい解決策!
オリバー

これは入力5で失敗します。これは、決してテストせ2222203222223、その後すぐにのみ2222210です。また、文字列の後に三つ以上の追加の数字が必要です任意の入力に失敗する2などの入力15としてSを、
グレッグ・マーティン

@GregMartin Darn、あなたは正しい。5バイトのコストで修正されました。
ETHproductions

これによりテストケースが修正されますが、アルゴリズムでは、素数を見つけるために3桁を超える数字を追加する必要はないと想定しています。
グレッグマーティン

最大14すべてのテストケースのためにこの作品@GregMartin、およびJSはケース15の整数精度の問題に実行されます私は2 ^ 53理論的に正しい過去のようにアルゴリズムのニーズを考えていませんが、おそらく私は間違っています...
ETHproductions

2

PHP、76バイト

for($h=str_pad(2,$i=$argv[1],2);$i>1;)for($i=$p=$h.++$n;$p%--$i;);echo$p?:2;

コマンドライン引数から入力を受け取ります。で実行し-rます。

壊す

for($h=str_pad(2,$i=$argv[1],2) # init $h to required head
    ;$i>1;                      # start loop if $p>2; continue while $p is not prime
)
    for($i=$p=$h.++$n               # 1. $p = next number starting with $h
                                    #    (first iteration: $p is even and >2 => no prime)
    ;$p%--$i;);                     # 2. loop until $i<$p and $p%$i==0 ($i=1 for primes)
echo$p?:2;                      # print result; `2` if $p is unset (= loop not started)

1

Bash(+ coreutils)、53バイト

最大2 ^ 63-1(9223372036854775807)で動作し、N> 8で終了するのにかなりの時間がかかります。

ゴルフ

seq $[2**63-1]|factor|grep -Pom1 "^2{$1}.*(?=: \S*$)"

テスト

>seq 0 7|xargs -L1 ./twist

2
2
223
2221
22229
2222203
22222223
22222223

1

Python 3、406バイト

w=2,3,5,7,11,13,17,19,23,29,31,37,41
def p(n):
 for q in w:
  if n%q<1:return n==q
  if q*q>n:return 1
 m=n-1;s,d=-1,m
 while d%2==0:s,d=s+1,d//2
 for a in w:
  x=pow(a,d,n)
  if x in(1,m):continue
  for _ in range(s):
   x=x*x%n
   if x==1:return 0
   if x==m:break
  else:return 0
 return 1
def f(i):
 if i<2:return 2
 k=1
 while k:
  k*=10;l=int('2'*i)*k
  for n in range(l+1,l+k,2):
   if p(n):return n

テストコード

for i in range(31):
    print('{:2} = {}'.format(i, f(i)))

テスト出力

 0 = 2
 1 = 2
 2 = 223
 3 = 2221
 4 = 22229
 5 = 2222203
 6 = 22222223
 7 = 22222223
 8 = 222222227
 9 = 22222222223
10 = 22222222223
11 = 2222222222243
12 = 22222222222201
13 = 22222222222229
14 = 222222222222227
15 = 222222222222222043
16 = 222222222222222221
17 = 222222222222222221
18 = 22222222222222222253
19 = 222222222222222222277
20 = 2222222222222222222239
21 = 22222222222222222222201
22 = 222222222222222222222283
23 = 2222222222222222222222237
24 = 22222222222222222222222219
25 = 222222222222222222222222239
26 = 2222222222222222222222222209
27 = 2222222222222222222222222227
28 = 222222222222222222222222222269
29 = 2222222222222222222222222222201
30 = 222222222222222222222222222222053

バイトサイズではなく、かなり広い範囲で速度を上げることにしました。:)私は、この目撃者のセットで最大3317044064679887385961981まで保証される決定論的ミラーラビン素数テストを使用します。より大きな素数は常にテストに合格しますが、確率は非常に低くなりますが、一部のコンポジットも合格する場合があります。ただし、楕円曲線分解プログラムpyecmを使用してi> 22の出力数もテストしましたが、素数のようです。


1
最初に:提出には、正しい出力の確率が1である必要があります。第二に、これはcodegolfなので、実際にはバイトサイズを選択する必要があります。それ以外はいいですね
破壊可能なレモン

1
@DestructibleWatermelonありがとう!バイトサイズを選ぶことについての公正なポイント。私は呼び出しをインライン化できると思いp()ます... OTOH、i> 20秒で正しい出力を与えることができる非常に小さなプログラムを書くのは難しいでしょう(組み込みを呼び出すことで「チート」しません)素数チェッカー)。:)
PM 2Ring

多くのプログラムは33桁の数字(n:= 30)を処理できません。OPの黄金の標準は18桁までであり、他に設定された制限はないことを考えると、n:= 30が十分なIMOであると仮定することは合理的です。
user3819867

@ PM2Ring「秒未満」である必要はありません。コードをできるだけ短くし、速度を完全に無視します。それが[code-golf]の精神です。ゴルフが終了したら、下票を上票に変更します。
mbomb007

実際、限界まで正しい出力を生成する場合、答えは確率1で機能します。
破壊可能なレモン

1

Python 3、132バイト

def f(x):
 k=10;p=2*(k**x//9)
 while x>1:
  for n in range(p*k,p*k+k):
   if all(n%q for q in range(2,n)):return n
  k*=10
 return 2

バイトカウントを小さくすると、パフォーマンスへの期待が犠牲になります。


-1

Java、163バイト

BigInteger f(int a){for(int x=1;x>0;x+=2){BigInteger b=new BigInteger(new String(new char[a]).replace("\0","2")+x);if(b.isProbablePrime(99))return b;}return null;}

テストコード

    public static void main(String[] args) {
    for(int i = 2; i < 65; i++)
        System.out.println(i + " " + new Test20170105().f(i));
    }

出力:

2 223
3 2221
4 22229
5 2222219
6 22222223
7 22222223
8 222222227
9 22222222223
10 22222222223
11 2222222222243
12 22222222222229
13 22222222222229
14 222222222222227
15 222222222222222143
16 222222222222222221
17 222222222222222221
18 22222222222222222253
19 222222222222222222277
20 2222222222222222222239
21 22222222222222222222261
22 222222222222222222222283
23 2222222222222222222222237
24 22222222222222222222222219
25 222222222222222222222222239
26 2222222222222222222222222213
27 2222222222222222222222222227
28 222222222222222222222222222269
29 22222222222222222222222222222133
30 222222222222222222222222222222113
31 222222222222222222222222222222257
32 2222222222222222222222222222222243
33 22222222222222222222222222222222261
34 222222222222222222222222222222222223
35 222222222222222222222222222222222223
36 22222222222222222222222222222222222273
37 222222222222222222222222222222222222241
38 2222222222222222222222222222222222222287
39 22222222222222222222222222222222222222271
40 2222222222222222222222222222222222222222357
41 22222222222222222222222222222222222222222339
42 222222222222222222222222222222222222222222109
43 222222222222222222222222222222222222222222281
44 2222222222222222222222222222222222222222222297
45 22222222222222222222222222222222222222222222273
46 222222222222222222222222222222222222222222222253
47 2222222222222222222222222222222222222222222222219
48 22222222222222222222222222222222222222222222222219
49 2222222222222222222222222222222222222222222222222113
50 2222222222222222222222222222222222222222222222222279
51 22222222222222222222222222222222222222222222222222289
52 2222222222222222222222222222222222222222222222222222449
53 22222222222222222222222222222222222222222222222222222169
54 222222222222222222222222222222222222222222222222222222251
55 222222222222222222222222222222222222222222222222222222251
56 2222222222222222222222222222222222222222222222222222222213
57 222222222222222222222222222222222222222222222222222222222449
58 2222222222222222222222222222222222222222222222222222222222137
59 22222222222222222222222222222222222222222222222222222222222373
60 222222222222222222222222222222222222222222222222222222222222563
61 2222222222222222222222222222222222222222222222222222222222222129
62 2222222222222222222222222222222222222222222222222222222222222227
63 2222222222222222222222222222222222222222222222222222222222222227
64 2222222222222222222222222222222222222222222222222222222222222222203

582.5858ミリ秒

説明:整数をループし、それらを文字列としてルート文字列に追加します。これは指定された「2」文字列であり、素数かどうかを検証します。


3
isProbablePrime時折誤認があります。間違った値を返す状況があるため、それは答えを無効にします。

間違いの確率は2 ^ -99未満です(ドキュメントを参照)。
SamCle88

@ SamCle88小さい確率かどうか、これは技術的に間違っています。isProbablePrimeはプライム検証には受け入れられず、他の課題では拒否されました。
魔法のタコUr
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.