Перші та останні прості числа з простими цифрами діапазону


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, але всі інші цифри є простими)

Це , тому найкоротший код у байтах виграє!

Застосовуються всі стандартні лазівки.

Вхідні дані

  • Ви можете вільно приймати два цілі числа як вхідні дані, однак ви можете бачити потрібне, стек, аргументи (аргументи), аргумент 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] в синтаксисі currying (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 та будь-яка інша цифра до себе).
      ÆP ~ Чи є простим (елементом)?
        Ạ ~ Перевірте, чи всі цифри відповідають умові.
            .ị ~ Отримайте елемент за модульним показником 0,5. Деякі деталі:
                 ~ Желе є 1-індексованим, тому 1 дає нам перший елемент, тоді як 0
                   дає нам останній елемент.
                 ~ Якщо стеля і підлога заданого числа N не збігаються, 
                   потім Jelly повертає елементи за індексами (N) та ceil (N).
                 ~ Якщо список порожній, це дає 0, отже, це дуже зручно.

Якщо прийняття всього діапазону буде дозволено (хоча, я думаю, цього не повинно бути), то 12 байт:

Do2,ÆPȦµÐf.ị

Спробуйте в Інтернеті!


13 байт Хоча це не дуже схоже. Чи повинен я просто опублікувати його сам? Ви можете взяти його, якщо хочете, але повідомте мені, чи збираєтесь ви зберегти своє рішення.
ділнан

ОП каже For a given positive integers range.
Попрошу

@dylnan зауважте, що ваша версія все-таки недійсна (0 це виняток із виклику, оскільки вона з певних причин повинна трактуватися як проста цифра). У всякому разі, я опублікував більш коротку та дійсну версію
містер 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

Піт , 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.
Містер Xcoder

Змагання посилюються ... о 23!
Стівен Х.

2

Математика 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

Дякуємо Еріку Аутгольферу за допомогу у вирішенні помилки. Дякую містеру Xcoder за .ịтрюк.


Чи ṙ-ḣ2вдасться Ḣ,Ṫвиправити це (можливо, доведеться трохи змінити)?
Zacharý

@ Zacharý, але дає результат у неправильному порядку. І це, здається, не працює: \
Вен

@ Mr.Xcoder Желе кімната привела мене до того ж рішення. Дякую!
Вен

.ịможе також працювати (вид вкрадений у пана XCoder)
Zacharý

Ти правий! Це мило.
Вен



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}

Спробуй це

Розширено:

{  # 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]

Безголівки:

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 Виправлено!
Стівен Х.

Чорт забирай мене, я просто оновлювався і з 23
містер Xcoder

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