Değişken Prime “İkizler”


18

Kardeşimle 2/3 ikizim, yani aynı ayın aynı gününde ama on iki yıl sonra doğdum. Ben 5 yaşındayken, o 17 yaşındaydı; makul bir şekilde güvenebileceğimiz son çağ çifti [71, 83], ikimiz de hayatta ve bu rastlantısal jübile'yi kutlayabiliyoruz.

Görev

Bir kod oluşturun

  • girdi olarak iki tamsayı alır: pozitif tamsayı k olarak sayaç ve "ikiz" arasındaki fark (evet, ben daha gencim) ve pozitif tamsayı u olarak üst sınır (çalışma zamanı değerlendirmesi)

  • ve bir dizi ya da liste olarak çıkış verir i numaraları daha düşük ya da eşit u olan her iki I ve I + k asal bulunmaktadır. Çıktının sıralanması gerekmez.

Test Durumları

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]

Düzenle

Üst sınırı belirleyemediğim için, hem kapsayıcı hem de özel çözümler kabul edilir.

2 Numarasını Düzenle

Zorluk başlangıçtan bir hafta sonra 1 Eylül'de sona erecek.
Görünüşe göre bir kazananımız var ama bir kravat popülerliği durumunda kravat kırıcı; bu durumda "ikinci" ödül yoluyla telafi edilecektir.


Yanıtlar:


5

Jöle, 8 7 bayt

+ÆR©_f®

Çevrimiçi deneyin!

açıklama

+          add the upper bound and the difference
 ÆR        find all primes up to that number
   ©       save that in the register
    _      subtract the difference from each
     f®    remove anything not in the original prime list

Tebrikler @ Pietu1998!
user3819867

6

Brachylog , 27 23 bayt

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

Çevrimiçi deneyin!

Tüm test vakalarını doğrulayın.

Tahmin 0 (ana yüklem)

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

Tahmin 1 (yardımcı yüklem)

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

Oktav, 34 33 bayt

@(k,u)(a=primes(u))(isprime(a+k))

Harika bir yaklaşım! Cevabımda 11'den 8 bayta düşmeme izin verdi
Luis Mendo

4

MATL , 8 bayt

3 bayt kaydetmeme yardımcı olan yaklaşımı için @alephalpha'ya teşekkür ederim

Zqti+Zp)

Çevrimiçi deneyin!

Zq    % Take input implicitly. Vector of primes up to that. Call this vector A
ti+   % Duplicate, take second input, add element-wise. Call this vector B
Zp    % Vector containing true for prime numbers in B
)     % Use as an index into A. Display implicitly

4

Python 3, 114 92 90 bayt

-2 bayt için @Dennis'e teşekkürler

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}

Bağımsız değişken üzerinden girdi alan ve sıralanmamış bir küme döndüren işlev. Bu, üst sınır için özeldir.

Bu @ XNOR yanıtında yöntemini kullanır burada asal sayıları bulmak için.

Ideone üzerinde deneyin

Nasıl çalışır

Başbakan bulma

Öncelikle bir test değeri ive bir ürün Polarak 1ve lküme içeren set olarak bir başlangıç ​​listesi başlatırız 0. Ardından, öncelik aralığındaki whiletüm değerleri test eden bir döngü yürütülür. Fikir çarparak olmasıdır tarafından her yinelemenin sonunda, değerini alır test ederken , yani tamsayılar ürünü karesi. Daha sonra gerçek öncelik testi hesaplanarak yapılır ; bu sıfır döndürürse, o zaman asal olamaz çünkü bu ürünü oluşturan değerlerden en az biri ile bölünebilir. Bu geri dönerse , o zamani[1, u+k-1]Pi^2P(i-1)!^2i[1, i+1]P mod iii1iÜründeki herhangi bir değerle bölünemeyeceği için asal olmalıdır. Eğer iasal, bu eklenir lve eğer, 0eklenir. Ürünün karesi 4asal olarak yanlış tanımlamayı önler ve burada yararlıdır, çünkü yalnızca 0veya 1döndürülmesini garanti eder , sonucun basitçe çarpılmasıyla eklenecek değerin seçimine izin verir i.

'İkiz' asal sayıların belirlenmesi

Şimdi l-k, element- wise'ın tüm unsurlarını içeren bir dizi seti yaratıyoruz . Bu kümenin kesişimi ve ldaha sonra &, her iki kümede ortak olan elemanları içeren bir küme bırakarak kullanılarak bulunur. Bir sayı iyalnızca her ikisinde de ive i+kher ikisi de asalsa, yani istenen çıktıdan çıkar. Ancak, kasal ise , 0her iki sette de mevcut olacaktır, yani geri dönmeden önce bunun kaldırılması gerekir.


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'de 83 bayt için çalışır. 3'te bile, bu şekilde bir set oluşturmak bazı baytları kaydetmelidir.
Dennis

@Dennis Teşekkürler - bu Python 3'te birkaç bayt tasarruf sağlar. Ancak, 0son kümeden kaldırmak zorunda kaldım , çünkü eğer kasal ise, bu yanlışlıkla iade edilir .
TheBikingViking

3

R, 98 bayt

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}

Kurtulmamış:

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, 185175 bayt

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

Test edilmemiş ve test kodu:

Burada deneyin.

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

Çıktı:

[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 bayt

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

Üst sınırdan küçük veya ona eşit tüm primerleri üretin. Sonuca yaş farkını ekleyin. Bunlar arasından asal sayıları seçin. Yaş farkını sonuca çıkarın.


2

Swift, 142 bayt

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 bayt

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

Açıklama:

-> \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

Aslında 12 bayt

uSonra giriş yapılır k. Golf önerileri hoş geldiniz. Çevrimiçi deneyin!

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

Ungolfing:

╖              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 bayt

Gönderilen diğer R çözeltisinin aksine, bu stdin'den girdi alır.

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

Ungolfed:

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 bayt

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

Misal:

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 bayt

f&P_TP_+ThQSe

Formun bir listesini alan [k, u]ve bir liste basan bir program.

Çevrimiçi deneyin

Nasıl çalışır

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.