Змінні прем'єр-близнюки


18

Я з братом 2/3 близнюків, тобто народився в той же день того ж місяця, але через дванадцять років. Коли мені було 5, йому було 17, обидва праймери; остання пара віків, на які ми можемо розумно розраховувати, - це [71, 83], коли ми обидва живі та здатні відсвяткувати цей збіг ювілею.

Завдання

Створіть код, який

  • приймає два цілих числа як вхідні дані: різниця між лічильником і «близнюком» як додатне ціле число k (ну так, я молодший) і верхня межа як додатне ціле число u (час виконання)

  • і дає вихід в вигляді масиву або списку всіх я чисел менше або дорівнює U , для яких , як я і я + до прості числа. Вихід не потребує сортування.

Випробування

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 вересня, через тиждень від початку.
Схоже, у нас є переможець, але у випадку кращої популярності - тай-брейк; в цьому випадку "другий" буде компенсований за рахунок щедрості.


Відповіді:



6

Брахілог , 27 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 байт

Дякуємо @Dennis за -2 байти

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, і список простих чисел lяк набір, що містить 0. Потім виконується whileцикл, який тестує всі значення iв діапазоні [1, u+k-1]на первинність. Ідея полягає в тому , що шляхом множення Pна i^2в кінці кожної ітерації, Pприймає значення у (i-1)!^2час тестування i, тобто твір цілих чисел в [1, i+1]квадраті. Потім фактичний тест первинності виконується шляхом обчислення P mod i; якщо це повертає нуль, то він iне може бути простим, оскільки це означає, що iділиться принаймні на одне із значень, що складають продукт. Якщо це повернеться 1, значитьiповинен бути простим, оскільки його не поділяють жодне зі значень у творі. Якщо 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}&lпрацює на 83 байти в Python 2. Навіть у 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

Математика, 43 байти

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

Створіть усі праймери менше, ніж дорівнює верхній межі. До результату додайте різницю віків. Виберіть серед них прості числа. Віднімаємо різницю віків до результату.


2

Свіфт, 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*`░

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 байти

На відміну від іншого 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.