可変プライム「ツイン」


18

私は兄弟と2/3の双子です。つまり、同じ月の同じ日に生まれますが、12年後です。私が5歳のとき、彼は17歳でした。私たちが合理的に期待できる最後のペアは[71、83]で、私たちは両方とも生きており、この偶然の記念日を祝うことができます。

仕事

次のコードを作成します

  • 入力として2つの整数を取ります:正の整数k(まあはい、私は若い)としてのカウンターと「ツイン」の差と正の整数u(実行時の考慮事項)としての上限

  • そして、ii + kの両方が素数であるu以下のすべてのi数の配列またはリストとして出力を与えます。出力をソートする必要はありません。

テストケース

12, 1000 -> [5, 7, 11, 17, 19, 29, 31, 41, 47, 59, 61, 67, 71, 89, 97, 101, 127, 137, 139, 151, 167, 179, 181, 199, 211, 227, 229, 239, 251, 257, 269, 271, 281, 337, 347, 367, 389, 397, 409, 419, 421, 431, 449, 467, 479, 487, 491, 509, 557, 587, 601, 607, 619, 631, 641, 647, 661, 727, 739, 757, 761, 797, 809, 811, 827, 907, 929, 941, 971, 997]
2, 999 -> [3, 5, 11, 17, 29, 41, 59, 71, 101, 107, 137, 149, 179, 191, 197, 227, 239, 269, 281, 311, 347, 419, 431, 461, 521, 569, 599, 617, 641, 659, 809, 821, 827, 857, 881]
3, 1500 -> [2]
30, 1500 -> [7, 11, 13, 17, 23, 29, 31, 37, 41, 43, 53, 59, 67, 71, 73, 79, 83, 97, 101, 107, 109, 127, 137, 149, 151, 163, 167, 181, 193, 197, 199, 211, 227, 233, 239, 241, 251, 263, 277, 281, 283, 307, 317, 337, 349, 353, 359, 367, 379, 389, 401, 409, 419, 431, 433, 449, 457, 461, 479, 491, 541, 547, 557, 563, 569, 571, 577, 587, 601, 613, 617, 631, 643, 647, 653, 661, 709, 727, 739, 743, 757, 797, 809, 823, 827, 829, 853, 857, 877, 881, 907, 911, 937, 941, 947, 953, 967, 983, 991, 1009, 1019, 1021, 1031, 1033, 1039, 1061, 1063, 1087, 1093, 1123, 1151, 1163, 1171, 1187, 1193, 1201, 1229, 1249, 1259, 1277, 1289, 1291, 1297, 1399, 1409, 1423, 1429, 1451, 1453, 1459, 1481, 1493]

編集

上限の指定に失敗したため、包括的ソリューションと排他的ソリューションの両方を歓迎します。

編集番号2

チャレンジは、開始から1週間である9月1日に終了します。
勝者はいるように見えますが、同点の場合は人気があります。この場合、「2番目」は報奨金によって補償されます。


回答:



6

Brachylog27 23バイト

:1f
hS,?tye.:S+:.L*$pL,

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

すべてのテストケースを検証します。

述語0(メイン述語)

:1f                     Find all solutions of predicate 1
                        given Input as Input,
                        Unify Output with the set of all solutions.

述語1(補助述語)

hS,?tye.:S+:.L*$pL,

hS                      the first element of Input is S,
   ?tye.                Output is an element between 0 and
                        the last element of Input,
       .:S+:.L          The list [Output+S,Output] is L,
             L*$pL      The product of L, prime-factorized, is still L





4

Python 3、114 92 90バイト

-2バイトの@Dennisに感謝

def f(k,u):
 i=P=1;l={0}
 while i<u+k:l|={P%i*i};P*=i*i;i+=1
 return{i-k for i in l}&l-{0}

引数を介して入力を受け取り、ソートされていないセットを返す関数。これは、上限に関して排他的です。

ここでは、@ xnorの回答にあるメソッドを使用して素数を見つけます。

Ideoneでお試しください

使い方

主な発見

最初にテスト値iと積をPとして初期化し、を含む集合として1素数のリストを初期化します。次に、素数の範囲内のすべての値をテストするループが実行されます。アイデアは、各反復の終わりに乗算することにより、テスト中に値を取る、つまり、整数の二乗の積です。次に、計算によって実際の素数性テストが実行されます。これがゼロを返す場合、積を構成する値の少なくとも1つで割り切れることを意味するため、素数にはなりません。これが返される場合、l0whilei[1, u+k-1]Pi^2P(i-1)!^2i[1, i+1]P mod iii1i積の値で割り切れないため、素数でなければなりません。iが素数の場合、に追加されl、そうでない場合0は追加されます。製品の防止誤った識別の二乗4プライムとして、それが唯一のことを保証するので、ここで有益である0かは、1値の選択は、単純で結果を掛けて作られるに追加することができ、返されますi

「双子」素数の識別

l-kでは、要素ごとにのすべての要素を含むファーターセットを作成します。このセットとの交点は、をl使用して検出さ&れ、両方のセットに共通の要素のみを含むセットが残ります。数はi両方の場合のみ、両方のセットであるiとは、i+k首相であること、この葉所望の出力を意味し、。ただし、kが素数の場合0、両方のセットに存在します。つまり、戻る前にこれを削除する必要があります。


2
k,u=input();i=P=1;l={0};exec'l|={P%i*i};P*=i*i;i+=1;'*(u+k);print{i-k for i in l}&lPython 2では83バイトで動作します。3でも、この方法でセットを構築すると、いくつかのバイトを節約できます。
デニス

@Dennisおかげで-これは、Python 3で数バイト節約んしかし、私は削除する必要がなかった0場合以来、最終セットからk素数である、これは誤っます返さ
TheBikingViking

3

R、98バイト

function(k,u){v=c();for(i in 1:u)if(sum(i%%(1:i)==0)==2&&sum((i+k)%%(1:(i+k))==0)==2){v=c(v,i)};v}

アンゴルフド:

function(k,u)
v=c()                                                    #Empty vector

for(i in 1:u)
    if(sum(i%%(1:i)==0)==2&&sum((i+k)%%(1:(i+k))==0)==2) #If both i and i+k only have 
                                                         #2 divisors such as the rest of the 
                                                         #euclidian division is 0 
                                                         #(i.e., they're both prime) :
        v=c(v,i)
v


2

Java 7、185 175バイト

import java.util.*;List c(int k,int u){List l=new ArrayList();for(int i=1;++i<u;)if(p(i)&p(i+k))l.add(i);return l;}boolean p(int n){for(int i=2;i<n;)n=n%i++<1?0:n;return n>1;}

未ゴルフ&テストコード:

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

import java.util.*;
class M{
  static List c(int k, int u){
    List l = new ArrayList();
    for(int i = 1; ++i < u; ){
      if(p(i) & p(i+k)){
        l.add(i);
      }
    }
    return l;
  }

  static boolean p(int n){
    for(int i = 2; i < n; ){
      n = n % i++ < 1
           ? 0
           : n;
    }
    return n>1;
  }

  public static void main(String[] a){
    System.out.println(c(12, 1000));
    System.out.println(c(2, 999));
    System.out.println(c(3, 1500));
    System.out.println(c(30, 1500));
  }
}

出力:

[5, 7, 11, 17, 19, 29, 31, 41, 47, 59, 61, 67, 71, 89, 97, 101, 127, 137, 139, 151, 167, 179, 181, 199, 211, 227, 229, 239, 251, 257, 269, 271, 281, 337, 347, 367, 389, 397, 409, 419, 421, 431, 449, 467, 479, 487, 491, 509, 557, 587, 601, 607, 619, 631, 641, 647, 661, 727, 739, 757, 761, 797, 809, 811, 827, 907, 929, 941, 971, 997]
[3, 5, 11, 17, 29, 41, 59, 71, 101, 107, 137, 149, 179, 191, 197, 227, 239, 269, 281, 311, 347, 419, 431, 461, 521, 569, 599, 617, 641, 659, 809, 821, 827, 857, 881]
[2]
[7, 11, 13, 17, 23, 29, 31, 37, 41, 43, 53, 59, 67, 71, 73, 79, 83, 97, 101, 107, 109, 127, 137, 149, 151, 163, 167, 181, 193, 197, 199, 211, 227, 233, 239, 241, 251, 263, 277, 281, 283, 307, 317, 337, 349, 353, 359, 367, 379, 389, 401, 409, 419, 431, 433, 449, 457, 461, 479, 491, 541, 547, 557, 563, 569, 571, 577, 587, 601, 613, 617, 631, 643, 647, 653, 661, 709, 727, 739, 743, 757, 797, 809, 823, 827, 829, 853, 857, 877, 881, 907, 911, 937, 941, 947, 953, 967, 983, 991, 1009, 1019, 1021, 1031, 1033, 1039, 1061, 1063, 1087, 1093, 1123, 1151, 1163, 1171, 1187, 1193, 1201, 1229, 1249, 1259, 1277, 1289, 1291, 1297, 1399, 1409, 1423, 1429, 1451, 1453, 1459, 1481, 1493]


2

Mathematica、43バイト

(Prime@Range@PrimePi@#2+#)~Select~PrimeQ-#&

上限以下のすべての素数を生成します。結果に年齢の差を追加します。それらの中から素数を選択します。結果に年齢の差を引きます。


2

Swift、142バイト

func f(a:Int,b:Int)->Array<Int>{let p={(n:Int)->Int in([Int]()+(2..<n)).filter{n%$0<1}.count}
return([Int]()+(2...b)).filter{p($0)+p($0+a)<1}}

2

Perl 6の 39の  37バイト

->\k,\u{grep {($_&$_+k).is-prime},2..u}
->\k,\u{grep {($_&$_+k).is-prime},^u}

説明:

-> \k, \u {

  # find all the values
  grep

  # where
  {
    # 「all」 junction of the two values
    ( $_   &   $_ + k ) # 「 all( $_, $_ + k ) 」

    # autothread a method call against the junction
    .is-prime
  },

  # from the values up to (and excluding) 「u」
  ^ u # short for 「 0 ..^ u 」
  # for inclusive use 「 2 .. u 」

}


1

実際には、12バイト

入力されuた後k。ゴルフの提案を歓迎します。オンラインでお試しください!

╖R`;p@╜+p*`░

アンゴルフ:

╖              Store k in register 0.
 R             Range [1..u]
  `       `░   Start a function f and push values i of the range where f(i) is truthy.
   ;p@         Duplicate i, check if i is prime, and swap with the other i.
      ╜+p      Push k, add to i, check if i+k is prime.
         *     Multiply the two if results together.
                 Similar to logical AND. 1 if both are true, else 0.

1

R、104バイト

投稿された他のRソリューションとは異なり、このソリューションはstdinから入力を受け取ります。

s=scan();sapply(1:s[2],function(i){j=i+s[1];if((all(i%%(3:i-1)!=0)|i==2)&all(j%%(3:j-1)!=0))cat(i," ")})

ゴルフをしていない:

s=scan();        # Read from stdin
sapply(1:s[2],   # For i from 1 to u,
    function(i){     # apply this function:
        j=i+s[1];                # Define i+k
        if((all(i%%(3:i-1)!=0)   # Test if i is prime
           | i==2)               # (i is prime if i==2)
           & all(j%%(3:j-1)!=0)) # Test if i+k is prime
        cat(i," ")               # If i and i+k are prime, print i
    }
)

1

Javascript(ES6)、90 83 80 75バイト

(k,u)=>(r=n=>n++<u+k?r(P[P.every(i=>n%i)*n]=n):P.filter(n=>P[n+k]))(1,P=[])

例:

let F =
(k,u)=>(r=n=>n++<u+k?r(P[P.every(i=>n%i)*n]=n):P.filter(n=>P[n+k]))(1,P=[])

console.log(F(2, 999))


1

Pyth、13バイト

f&P_TP_+ThQSe

フォームのリストの入力を受け取り、リストを[k, u]印刷するプログラム。

オンラインで試す

使い方

f&P_TP_+ThQSe  Program. Input: Q
           Se  1-indexed range up to Q[1], yielding [1, 2, 3, ..., u]
f              Filter that, using variable T, by:
  P_T           T is prime
 &              and
     P_+ThQ     T+Q[0], i.e. T+k, is prime
               Implicitly print
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.