Переменная Премьера «Близнецы»


18

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

задача

Создать код, который

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

  • и выводит в виде массива или списка всех чисел i, меньших или равных u, для которых i и i + k являются простыми числами. Вывод не нужно сортировать.

Тестовые случаи

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

Октава, 34 33 байта

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

Отличный подход! Это позволило мне уменьшить от 11 до 8 байтов в моем ответе
Луис Мендо

4

MATL , 8 байт

Благодарю @alephalpha за его подход , который помог мне сэкономить 3 байта

Zqti+Zp)

Попробуйте онлайн!

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

Спасибо @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}

Ungolfed:

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

Ungolfed & тестовый код:

Попробуй это здесь.

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*`░

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

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

(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.