Первые и последние простые числа с простыми цифрами диапазона


12

Вызов

Для заданного диапазона положительных целых чисел найдите первое и последнее простое число, полностью состоящее из цифр простого числа, в том числе исключительно 0 (для цифр диапазон 0-2 должен вывести 2-2). Ассортимент включительно. Если номер не найден, ожидаемый результат равен 0. Если существует только один такой номер, ожидаемый результат равен этому числу дважды.

Примеры

  • Для диапазона 1–100 первое простое число равно 2, а последнее - 73 (7 и 3 - простые числа).
  • Для диапазона 70–80 первое простое число равно 73, а последнее - также 73 (поскольку в данном диапазоне есть только одно правильное число, мы возвращаем его дважды).
  • Для диапазона 190–200 нет правильного ответа, поэтому вы возвращаете 0.
  • Для диапазона 2000-2100 первое простое число - 2003, а последнее - 2053 (мы опускаем цифру 0, но все остальные цифры простые)

Это , поэтому выигрывает самый короткий код в байтах!

Все стандартные лазейки применяются.

вход

  • Вы можете принять два целых числа в качестве входных данных, однако вы можете увидеть fit, stack, аргумент (ы) функции, аргумент CLI, stdin.
  • Вы должны получить только два целых числа.

Выход

  • Вы должны либо вернуть результат (кортеж, массив, множественный возврат, если ваш язык его поддерживает), оставить его в стеке, либо распечатать (в этом случае они должны быть как-то разделены).
  • Порядок выходов не имеет значения.
  • Вам разрешено ставить перед собой / конечные скобки и переводы строк.
  • Вы должны вернуть два числа, если есть ответ, даже если они совпадают.
  • Вы должны вернуть 0, если ответа нет.

Просто чтобы убедиться, что если я возвращаю список целых чисел, когда есть ответы, я могу вернуть список, содержащий только 0, когда ответов нет? Мне не нужно возвращаться 0вместо [0]?
Οurous

Ответы:



5

Perl 6, 105 94 90 86 байт

{my @b=grep {is-prime all($_,|.comb>>.Int Xor 2)},$^a..$^b;say @b??"@b[0] @b[*-1]"!!0}

4

JavaScript (ES6), 83 байта

Принимает диапазон [ab] в синтаксисе карри (a)(b). Возвращает либо массив из 2 элементов, либо 0 .

n=>g=(m,a=0)=>n>m?a:g(m-1,(P=d=>m%--d?P(d):d>1|/[14689]/.test(m))(m)?a:[m,a[1]||m])

Контрольные примеры



3

Желе , 14 байт

æRµDo2ÆPẠµÐf.ị

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

Как это устроено

æRµDo2ÆPẠµÐf.ị ~ Полная программа.

æR ~ Включая простейший диапазон.
  µ µÐf ~ Оставляйте только те, которые удовлетворяют условию.
   Do2ÆPẠ ~ Состояние фильтра:
   D ~ Десятичные цифры текущего номера.
    o2 ~ Логический или с 2 (отображает от 0 до 2 и любую другую цифру себе).
      PrimeP ~ Простое (поэлементное)?
        Check ~ Проверьте, все ли цифры удовлетворяют условию.
            .ị ~ Получить элемент с модульным индексом 0.5. Некоторые детали:
                 ~ Jelly индексируется 1, поэтому 1 дает нам первый элемент, а 0
                   дает нам последний элемент.
                 ~ Если потолок и пол данного числа N не совпадают, 
                   затем Желе возвращает предметы в индексах floor (N) и ceil (N).
                 ~ Если список пуст, это дает 0, следовательно, это очень удобно.

Если брать весь диапазон будет разрешено (хотя я думаю, что это не должно быть), то 12 байтов:

Do2,ÆPȦµÐf.ị

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


13 байт, хотя это не супер похоже. Должен ли я просто опубликовать это сам? Вы можете взять его, если хотите, но дайте мне знать, если вы собираетесь сохранить свое решение.
Дилнан

ОП говорит For a given positive integers range. Я попрошу уточнить
Дилнан

@dylnan обратите внимание, что ваша версия тем не менее недействительна ( 0это исключение из задачи, потому что по какой-то причине ее следует рассматривать как простую цифру). Во всяком случае, я опубликовал более короткую и действительную версию
Mr. Xcoder

О, я думал, что 0 - главное правило, было изменено
dylnan

3

Брахилог , 16 байт

⟦₂{ṗṗᵐ}ˢ⟨⌋≡⌉⟩|∧0

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

Совершенно бессмысленное «возвращаемое 0, если нет простого числа» заставляет нас терять 3 байта ( |∧0) без причины (оно вернулось false.бы, если бы мы не добавили их)

объяснение

⟦₂                Range from the smallest element of the input to the biggest
  {   }ˢ          Select on that range:
   ṗ                Numbers that are primes
    ṗᵐ              And whose digits are primes
        ⟨   ⟩     Fork on this new list:
         ⌋          Minimum
           ⌉        maximum
          ≡         Do nothing and return [Minimum, Maximum]
             |∧0  If all of this fails (i.e. the list after selection is empty), return 0

Неверный, потому что он не обрабатывает цифру 0 как простое число (как указано в задании). Таким образом, он терпит неудачу для[2000, 2100]
г-н Xcoder

3

Pyth , 24 байта

Использование моего первоначального подхода оказывается короче.

.x,eKfP#I_M-+TjT;0}EQhKZ

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

(Я просто обновлялся до 23, но Стивен победил меня в этом )

?KfP#I_M-+TjT;0}FQhM_BK0

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

Естественно, hM_BKможно заменить на ,hKeK.

25 байт

.x,eKf.AmP_|d2+TjT;}EQhKZ

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

26 байт

|>2.<f.AmP_|d2+TjT;*2}EQ1Z

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

|>2.<fP#I_M|R2+TjT;*2}EQ1Z

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


Как они работают

.x,eKfP#I_M-+TjT;0}EQhKZ ~ Full program. Q, E = first, second inputs

.x                     Z ~ Try-catch block. If the code errors, output 0.
     f            }EQ    ~ Filter the range [E ... Q] for (uses a variable T):
            +TjT;          ~ Append T to the list of its digits.
           -     0         ~ Remove the zeros.
         _M                ~ Multiply each by -1 (for primality testing).
        I                  ~ Check if the result is invariant over...
      P#                   ~ Removing non-prime items.
    K                    ~ Assigned the filtered range to a variable K.
  ,e                     ~ Pair the last element of K with...
                     hK  ~ Its first element.

|>2.<f.AmP_|d2+TjT;*2}EQ1Z ~ Full program.

                   *2}EQ   ~ Inclusive range, repeated twice..
     f                     ~ Filter, using T as the current number.
                jT;        ~ Base-10 digits of T.
              +T           ~ Concatenated with T.
        mP_|d2             ~ Prime check after performing OR 2 (makes 0 be treated as prime)
      .A                   ~ Do all satisfy this condition?
   .<                   1  ~ Rotate by one place cyclically to the left.
 >2                        ~ Last two elements (ignored if there aren't enough)
|                        Z ~ Logical or with 0.


Этот не возвращает два экземпляра [73] в тестовом примере [70, 80].
Стивен Х.

Превзошел вас назад на 1, теперь в 25.
Стивен Х.

@StevenH. Превзошел вас в силе на 1, теперь на 24.
Mr. Xcoder

Конкуренция становится напряженной ... в 23 года!
Стивен Х.

2

Mathematica 85 байт

Я знаю, что уже есть подобный ответ, но подход здесь совсем другой.

MinMax@Cases[Range@##,x_/;PrimeQ@x&&DisjointQ@@IntegerDigits/@{x,14689}]/.{_,∞}->0&

Этот 83-символьный ответ будет вставлен и запущен в Mathematica. Сайт TIO не знает, как интерпретировать ∞.


2

Желе , 14 байт

Do2ÆPẠ
æRÇÐf.ị

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

æRÇÐf.ị            Main link
æR                 Prime range
   Ðf              Filter the range with...
  Ç                The helper link
      ị            At index (decimal, returns [xs[floor], xs[ceil]], otherwise 0)
     .             0.5

Do2ÆPẠ             Helper link
D                  For each decimal
 o2                Replace 0s with 2s, an actual prime prime (could be 3, 5, or 7).
   ÆP              Filter primes (1 if true, 0 if false)
     Ạ             Check if all are true

Спасибо Эрику Outgolfer за помощь в исправлении ошибки. Спасибо мистеру Xcoder за .ịтрюк.


Будет ли ṙ-ḣ2работать, Ḣ,Ṫчтобы исправить это (возможно, придется изменить немного больше)?
Zacharý

@ Zacharý, который дает вывод в неправильном порядке. И это, похоже, не работает: \
Ven

@ Mr.Xcoder Комната Желе привела меня к тому же решению. Благодарность!
Ven

.ịможет также сработать (вроде украдено у мистера XCoder)
Zacharý

Ты прав! Это мило.
Ven



1

Perl 6 ,  68 66 65 61  58 байт

{($_=($^a..$^b).grep({.is-prime&&/^<[02357]>+$/})[0,*-1])[1]??$_!!0}

Попытайся

{($_=($^a..$^b).grep({.is-prime&&!/<[14689]>/})[0,*-1])[1]??$_!!0}

Попытайся

{($_=($^a..$^b).grep({.is-prime*!/<[14689]>/})[0,*-1])[1]??$_!!0}

Попытайся

{($_=($^a..$^b).grep({.is-prime*!/<[14689]>/}))??.[0,*-1]!!0}

Попытайся

{($_=grep {.is-prime*!/<[14689]>/},$^a..$^b)??.[0,*-1]!!0}

Попытайся

Expanded:

{  # bare block lambda with two placeholder parameters 「$a」 and 「$b」

  (
    $_ =  # store the list in 「$_」 for later use

      grep {
          .is-prime

        *              # True * True == 1 (all others equal 0)

          !/<[14689]>/ # doesn't contain a non-prime other than 0
      },

      $^a .. $^b       # inclusive Range

  )            # is the list Truish (not empty)
  ?? .[0,*-1]  # if so output the first and last values (from 「$_」)
  !! 0         # otherwise return 0
}


1

Java 8, 165 164 байта

(a,b)->{for(;a<=b&!p(a);a++);for(;b>a&!p(b);b--);return a>b?"0":a+" "+b;}boolean p(int n){int N=n,i=2;for(;i<N;N=N%i++<1?0:N);return(n+"").matches("[02357]+")&N>1;}

Объяснение:

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

(a,b)->{            // Method with two integer parameters and String return-type
                    //  (Input `a` is the lowest input, input `b` is the highest input)
  for(;a<=b         //  Increase `a` as long as it's smaller than or equal to `b`,
       &!p(a);a++); //   and it's not a prime, and not all of its digits are prime-digits
  for(;b>a          //  Decrease `b` as long as it's larger than `a`,
       &!p(b);b--); //   and it's not a prime, and not all of its digits are prime-digits
  return a>b?       //  If `a` is now larger than `b`:
    "0"             //   Return 0, because nothing is found
   :                //  Else:
    a+" "+b;}       //   Return the resulting `a` and `b`

boolean p(int n){int N=n,i=2;for(;i<N;N=N%i++<1?0:N);return(n+"").matches("[02357]+")&N>1;}
                    // Separate method that returns whether the input integer is a prime,
                    //  and all of its digits are also primes (or 0)

1

Чисто , 142 131 125 байт

import StdEnv
@a b#l=[n\\n<-[a..b]|and[gcd p n<2&&or[c==k\\k<-:"02357"]\\p<-[1..n-1],c<-:toString n]]
|l>[]=[hd l,last l]=[0]

Ungolfed:

import StdEnv
fn start finish
    # primes
        = [ n
            \\
            n <- [start..finish]
            | and [ gcd p n == 1 && isMember c ['0','2','3','5','7'] 
                \\
                p <- [1..n-1],
                c <-: toString n
            ]
        ]
    | isEmpty primes
        = [0]
    = [hd primes, last primes]

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


1

Pyth, 28 25 23 байта

.xhM_BfP#I_M #+TjT;}FQ0

Тестирование. Возвращает [2003,2053] для последнего контрольного примера, поскольку 2053 является простым.


Хаха, инвалид Возвращает [0, 0]вместо0
мистер Xcoder

Ах, стреляй. Я исправлю это.
Стивен Х.

@ Mr.Xcoder Исправлено!
Стивен Х.

Черт побери, я тоже только что
обновил

Я думал, ты сказал, что идешь спать ... Ты обманул тебя: P
Стивен Х.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.