Це Паскаль Прем'єр?


18

Добре відомо, що непарні прайми з’являться в трикутнику Паскаля рівно вдвічі. Однак, не всі числа, що з’являються рівно двічі у трикутнику Паскаля, є простими. Ми будемо називати ці числа Паскаль простими.

Праймелі Паскаля - це складові числа, які рівно двічі з’являються в трикутнику Паскаля. Перші кілька приміток Паскаля

4, 8, 9, 12, 14, 16, 18, ...

Ваша задача полягає в тому, щоб прийняти натуральне число n як вхідне та вихідне значення true або false, залежно від того, чи n є простим чистим чи Паскалем. Це код-гольф, тому найкоротша програма виграє!



2
Чи можемо ми вивести True, якщо він не є простим Паскалем, а помилковим, якщо він є?
caird coinheringaahing


@cairdcoinheringaahing ні, це повинно бути в заданій вимозі.
Просто красиве мистецтво

Я здивований, що ніхто не опублікував відповіді на Паскалі. Я буду, якщо знайду час (і якщо зможу знайти свій старий компілятор Pascal).
manassehkatz-Reinstate Моніка

Відповіді:


10

Мова Вольфрама (Mathematica) , 45 байт

CompositeQ@#&&Binomial~Array~{#-1,#}~FreeQ~#&

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

Кожне складене число n з’являється рівно двічі на рядку n і не може з’являтися після цього. Тож умовою для праймерів Паскаля є те, що вони взагалі не з’являються протягом перших n-1 рядів.

Наскільки я можу сказати, це коротше, ніж перевірка того, що воно з’являється рівно двічі протягом перших n рядків і його можна використовувати !PrimeQзамість цього.


4

Python 2 , 93 байт

def f(n):l=[1];exec"(n in l)>=any(n%k<1for k in range(2,n))>q;l=map(sum,zip([0]+l,l+[0]));"*n

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

Це названа функція f , яка виводить за допомогою коду виходу , 0 для Pascal Primes, 1 інакше.

Як це працює?

def f(n):l=[1];                       # Define a function f (arg. n) and a list l = [1].
exec"..."*n                           # Execute n times.
(n in l)                              # Boolean: "n is in l?" is greater than...
   >=any(n%k<1for k in range(2,n))    # the boolean: "Is n composite?"?
            >q;                       # If the boolean comparison returns a falsy
                                      # result, then continue on without any difference.
                                      # Otherwise, evaluate the other part of the
                                      # inequality, thus performing "is greater than q".
                                      # Since we have no variable "q", this terminates
                                      # with exit code 1, throwing a "NameError".
l=map(sum,zip([0]+l,l+[0]));          # Generate the next row in Pascal's triangle,
                                      # By zipping l prepended with a 0 with l appended
                                      # with a 0 and mapping sum over the result.

Це в основному перевіряє, чи виникає n в перших n - 1 рядках трикутника Паскаля, чи він є простим, і видає помилку, якщо будь-яка з цих двох умов виконана.

Збережено 1 байт завдяки ов .



@ovs: o Це розумно! Спасибі.
Містер Xcoder

4

Желе , 11 10 9 байт

Завдяки:

  • Мартін Ендер на -1 байт! (інший підхід, використовувати (+1), уникати використання n2(-2), так -1 загалом.
  • Джонатана Аллана для виправлення помилок.
  • Денніс ще на -1 байт.
Ḷc€ḶFċ=ÆP

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

Альтернативний підхід , по Jonathan Allan . (хибно)

----------- Explanation -----------
Ḷ            Lowered range. [0, 1, ..., n-1]
 c€Ḷ           `c`ombination `€`ach with `Ḷ`owered range [0...n-1]
    F        Flatten.
     ċ       Count the number of occurences of (n) in the list.
       ÆP    Returns 1 if (n) is a prime, 0 otherwise.
      =      Check equality.

Пояснення останнього рядка:

  • Як вказував Мартін Ендер, " nвідображається двічі в трикутнику Паскаля" еквівалентно " nне з'являється в перших n-1рядках".
  • Ми хочемо повернутися, trueякщо число не є простим (тобто ÆP == 0), і кількість cдорівнює нулю. З цього ми можемо зробити висновок про це ÆP == c.
    Можна довести, що якщо вони рівні, то вони дорівнюють 0, тому що:
    • ÆP повернути булеве значення, яке може бути лише 0 або 1.
    • Якщо він повертає 1, то nвін є простим, тому він не може відображатися в перших n-1рядках (тобто c == 0)

1не є прем'єр Паскаля; це говорить, що це так.
Джонатан Аллан

Ḷc€ḶFċoÆP¬працював би я думаю.
Джонатан Аллан

ċ=ÆPповинні працювати.
Денніс

FYI Я знайшов недолік у своєму підході та видалив його.
Джонатан Аллан

BTW Ḷcþ`Fċ=ÆPтеж повинна працювати.
Містер Xcoder

4

Haskell , 86 84 байт

p=[]:[zipWith(+)(1:x)x++[1]|x<-p]
f n=all((>0).rem n)[2..n-1]==any(elem n)(take n p)

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

Пояснення

Функція pрекурсивно визначає вироджений трикутник Паскаля:

[]
[1]
[2,1]
[3,3,1]
[4,6,4,1]
[5,10,10,5,1]

Як ми бачимо (у цьому рішенні 1є дещо особливим) кожне число nз’являється рівно двічі у n+1другому ряду, і всі елементи наступних рядків тільки nзбільшуються , тому нам потрібно лише перевірити, чи є десь до першого nряду, щоб побачити, чи елемент дискваліфікується:

any(elem n)(take(n-1)p)

Тепер у нас є Trueвсі елементи, які з’являються більше ніж удвічі (крім 1), тому все, що нам потрібно, - це мати несправну isPrimeфункцію, яка повертається Trueдля 1:

all((>0).rem n)[2..n-1]

4

APL (Діалог) , 44 34 24 19 байт

5 байт збережено завдяки @Cowsquack

(~0∊⊢|⍨2↓⍳)⍱⊢∊⍳∘.!⍳

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

Як?

Ми впевнені, що це не робить

- дальність 0.. n-1,

⍳∘.! - на декартовому двочленні з самості

⊢∊- містять n,

- ні

⊢|⍨- nмодуль кожного елемента

2↓⍳- дальність 2..n-1

~0∊- не містити 0(він же нероздільний)


Перетворити його на поїзд (∨/1↓1≠⊢∨⍳)∧(~⊢∊⍳∘.!⍳)коротше на два байти
Kritixi Lithos

@Cowsquack hmm Я не помітив, що він настільки короткий, що поїзд міг би поміститися (стартував 40 байт). Спасибі!
Уріель

(0∊⊢|⍨2↓⍳)∧∘~⊢∊⍳∘.!⍳ще для двох я змінив алгоритм перевірки
первинності

@Cowsquack oo розумний. Я ніколи не бачив такої зміни первинності
Уріель

Перегрупування ~дає (~0∊⊢|⍨2↓⍳)⍱⊢∊⍳∘.!⍳на один менше байт.
Kritixi Lithos



2

R , 55 байт

function(n)sum(!n%%1:n)>2&!n%in%outer(1:n-1,1:n,choose)

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

sum(!n%%1:n)>2це композитні тестові і outer(1:n-1,1:n,choose)обчислює рядки 0для n-1трикутника Паскаля, тому переконайтеся , що nне виникає там.


2

05AB1E , 10 байт

ÝDδcI¢IpÌQ

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

Пояснення

Ý            # push range [0 ... input]
 D           # duplicate
  δc         # double vectorized command binomial
    I¢       # count occurrences of input
      Ip     # check input for primality
        Ì    # add 2
         Q   # compare for equality

Перевірки, які nтрапляються рівно двічі в перших n + 1 рядах трикутників паскалів і не є простими.
Порівняння працює, оскільки в трикутнику немає простих простирадлів, які можуть трапитися 3 рази.





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