Чи розділяємо ми простий кластер?


10

Просте скупчення цілого числа N вище , ніж 2 , визначаються як пара утворена найвищим простим строго знизити , ніж N , а найнижчий прем'єр строго вище , ніж N .

Зауважимо, що слідуючи вищевикладеному визначенню, якщо ціле число є самим простим, то його простим кластером є пара простих простих чисел, що передують йому та є наступним .

Завдання

З урахуванням двох цілих чисел N , M ( N, M ≥ 3 ), виведіть значення truthy / false, залежно від того, чи мають N і M один і той же простий кластер.

Це , тому мета - максимально зменшити кількість байтів. Таким чином, виграє найкоротший код у кожній мові програмування .

Тестові приклади / Приклади

Наприклад, простим кластером 9 є [7, 11], тому що:

  • 7 - найвищий прайм, строго нижчий за 9 , і
  • 11 - найнижчий прайм строго вище 9 .

Аналогічно, простий кластер 67 - це [61, 71](зверніть увагу, що 67 - це простий).

Парочки з правдою

8, 10
20, 22
65, 65
73, 73
86, 84
326, 318
513, 518

Фальшиві пари

4, 5
6, 8
409, 401
348, 347
419, 418
311, 313
326, 305

Чи мають значення "truthy / falsy" бути двома різними значеннями, чи можна визначити відображення від результатів їх програми до значення truthy / falesy та виводити (потенційно нескінченно) безліч різних значень?
Джонатан Фрех

@JonathanFrech Truthy / Falsy за визначенням проблеми рішення , не обов'язково послідовне, але розрізнене і правдоподібне / фальшиве
пан Xcoder

Відповіді:


14

Желе , 6 4 3 5 4 байти

rÆPE

Спробуйте в Інтернеті! або Спробуйте всі тестові приклади .

Як це працює

rÆPE    Main link. Arguments: N, M
r       Yield the range of integers between N and M, inclusive.
 ÆP     For each integer, yield 1 if it is prime, 0 otherwise.
   E    Yield 1 if all items are equal (none in the range were prime,
        or there's only one item).

Працює тому, що два числа мають різні прості кластери, якщо між ними є просте, або будь-яке число є простим; якщо обидва числа не збігаються, у цьому випадку все одно Eповертається 1(всі елементи в масиві з одним елементом рівні).


7
Джерело ваших програм не виглядає доброзичливим ...
Stan Strum

2

Perl 6 , 52 байти

{[eqv] @_».&{(($_...0),$_..*)».first(*.is-prime)}}

Перевірте це

Розширено:

{  # bare block lambda with implicit slurpy input 「@_」

  [eqv]               # see if each sub list is equivalent

    @_».&{            # for each value in the input

      (

        ( $_ ... 0 ), # decreasing Seq
          $_ ..  *    # Range

      )».first(*.is-prime) # find the first prime from both the Seq and Range

    }
}


2

Рубін , 57 54 байти

->n,m{[*n..m,*m..n].all?{|x|?1*x=~/^(11+)\1+$/}||n==m}

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

З моєї відповіді (про яку я забув, поки не натиснув на неї) на відповідне запитання використовується жахливий тест первинності виразів, чи це число просте? . Оскільки у нас є N, M ≥ 3, перевірку на 1 можна зняти з шаблону, що робить кількість байтів меншою, ніж використання вбудованого.

Примітка: Тест первинності регулярних виразів патологічно, весело неефективний. Я вважаю, що це хоча б O (n!), Хоча я зараз не маю часу зрозуміти це. На це знадобилося дванадцять секунд, щоб перевірити 100,001, і перемелював п'ять-десять хвилин на 1000,001, перш ніж я його скасував. Використовуйте / зловживайте на свій страх і ризик.


1
З такою швидкістю це ймовірно . Ви знаєте, на 100001! = 2824257650254427477772164512240315763832679701040485762827423875723843380680572028502730496931545301922349718873479336571104510933085749261906300669827923360329777024436472705878118321875571799283167659071802605510878659379955675120386166847407407122463765792082065493877636247683663198828626954833262077780844919163487776145463353109634071852657157707925315037717734498612061347682956332369235999129371094504360348686870713719732258380465223614176068 ... (Warning: The output exceeded 128 KiB and was truncated.)що пітимуть тисячоліття.
користувач202729

2

Сітківка , 58 байт

\b(.+)¶\1\b

.+
$*
O`
+`\b(1+)¶11\1
$1¶1$&
A`^(11+)\1+$
^$

Спробуйте в Інтернеті! Пояснення:

\b(.+)¶\1\b

Якщо обидва вхідні дані однакові, просто видаліть усе та пропадайте до виводу 1 наприкінці.

.+
$*

Перетворити в одинарне.

O`

Сортувати за порядком.

+`\b(1+)¶11\1
$1¶1$&

Розгорніть діапазон усіх чисел.

A`^(11+)\1+$

Видалити всі складені числа.

^$

Якщо не залишилося чисел, виведіть 1, інакше 0.


2

PARI / GP, 28 байт

v->s=Set(v);#s<2||!primes(s)

Спробуйте в Інтернеті з усіма тестовими кейсами!

Повертається 0 або 1(звичайні значення "PAR" / GP "булеві").

Пояснення:

vповинен бути вектор (або вектор стовпця або список) з двома числами Nта Mяк координати. Наприклад [8, 10]. Тоді sбуде "набір", зроблений з цих чисел, який є або однокоординатним вектором (якщо N==M), або двокоординатним вектором з відсортованими записами в іншому випадку.

Тоді, якщо кількість #sкоординат у sлише одна, ми отримуємо 1(truthy). В іншому випадку primesповерне вектор усіх простих чисел у закритому інтервалі від s[1]до s[2]. Заперечення !цього дасть, 1якщо вектор порожній, тоді як заперечення вектора однієї або декількох ненульових записів (тут один або більше праймів) дасть 0.


2

JavaScript (ES6), 57 56 байт

Здійснює введення в синтаксис currying (a)(b). Повертається 0або 1.

a=>b=>a==b|!(g=k=>a%--k?g(k):k<2||a-b&&g(a+=a<b||-1))(a)

Тестові справи

Як?

a => b =>                 // given a and b
  a == b |                // if a equals b, force success right away
  !(g = k =>              // g = recursive function taking k
    a % --k ?             //   decrement k; if k doesn't divide a:
      g(k)                //     recursive calls until it does
    :                     //   else:
      k < 2 ||            //     if k = 1: a is prime -> return true (failure)
      a - b &&            //     if a equals b: neither the original input integers nor
                          //     any integer between them are prime -> return 0 (success)
      g(a += a < b || -1) //     else: recursive call with a moving towards b
  )(a)                    // initial call to g()

2

R , 63 46 байт

-17 Джузеппе

function(a,b)!sd(range(numbers::isPrime(a:b)))

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

Досить просте застосування желе-розчину ETHProductions . Головний цікавий винос в тому , що з R булеві векторами any(x)==all(x)еквівалентно min(x)==max(x).



Крім того , так як min(x)==max(x)рівносильна перевірка , що всі елементи is_prime(a:b)рівні, ми можемо використовувати цей останній трюк , щоб отримати його до 46 байт або з primesабо numbersпакетом.
Джузеппе

2

C (gcc), 153 146 байт

i,B;n(j){for(B=i=2;i<j;)B*=j%i++>0;return!B;}
#define g(l,m,o)for(l=o;n(--l););for(m=o;n(++m););
a;b;c;d;h(e,f){g(a,b,e)g(c,d,f)return!(a-c|b-d);}

-7 від Джонатана Фреха

Визначає функцію, hяка займає дві секунди і intповертає 1для truthy та 0for falsey

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

n це функція, яка повертає 1, якщо її аргумент не є простим.

g є макросом, який встановлює свій перший та другий аргументи наступному простим розмірам менше та більше, ніж (відповідно) - третій аргумент

hробить gдля обох входів і перевіряє, чи однакові виходи.


return a==c&&b==d;може бути return!(a-c|b-d);.
Джонатан Фрех


@JonathanFrech Виправлено посилання TIO.
pizzapants184


1

APL (Dyalog Unicode) , 18 + 16 = 34 24 байти

CY'dfns'
∧/=/4 ¯4∘.pco

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

Завдяки Адаму за 10 байт.

Рядок ⎕CY'dfns'( C OP Y ) необхідний для імпорту колекції dfns ( d ynamic f unctio ns ), включеної до встановлених програм встановлення APL Dyalog за замовчуванням.

Як це працює:

∧/=/4 ¯4∘.pco  Main function. This is a tradfn body.
               The 'quad' takes the input (in this case, 2 integers separated by a comma.
          pco   The 'p-colon' function, based on p: in J. Used to work with primes.
    4 ¯4∘.      Applies 4pco (first prime greater than) and ¯4pco (first prime smaller than) to each argument.
  =/            Compares the two items on each row
∧/              Applies the logical AND between the results.
                This yields 1 iff the prime clusters are equal.




0

Математика, 39 27 26 байт

Equal@@#~NextPrime~{-1,1}&

Розширено:

                         &  # pure function, takes 2-member list as input
       #~NextPrime~{-1,1}   # infix version of NextPrime[#,{-1,1}], which
                            # finds the upper and lower bounds of each
                              argument's prime clusters
Equal@@                     # are those bounds pairs equal?

Використання:

Equal@@#~NextPrime~{-1,1}& [{8, 10}]
(*  True  *)

Equal@@#~NextPrime~{-1,1}& [{6, 8}]
(*  False  *)

Equal@@#~NextPrime~{-1,1}& /@ {{8, 10}, {20, 22}, {65, 65}, 
    {73, 73}, {86, 84}, {326, 318}, {513, 518}}
(*  {True, True, True, True, True, True, True}  *)

Equal@@#~NextPrime~{-1,1}& /@ {{4, 5}, {6, 8}, {409, 401}, 
    {348, 347}, {419, 418}, {311, 313}}
(*  {False, False, False, False, False, False}  *)

Внески: -12 байт Jenny_mathy , -1 байт Мартіна Ендера


Це лише перевіряє наступний прайм. Спробуйте NextPrime [#, {- 1,1}]
J42161217

@Jenny_mathy: Я бачу, ти маєш рацію. Натрапив на тестовий випадок "348, 347", який зараз демонструється.
Ерік Тауерс

27 байт: Equal@@NextPrime[#,{-1,1}]&приймає як вхідний текст [{N,M}]або якщо ви хочете зберегти початковий вхід, використовуйте ці 30 байт:Equal@@NextPrime[{##},{-1,1}]&
J42161217

@Jenny_mathy: Ну, ..., вказаний вхід - це два цілі числа, а не список, так що ...
Ерік Тауерс

1
@EricTowers взяти список добре . Крім того, ви можете зберегти байт, використовуючи позначення infix #~NextPrime~{-1,1}.
Мартін Ендер

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