Правий та tfeL-скорочуваються праймери


11

Права truncatable головним є простим , де кожен префікс є первинним (в базі 10). Лівий truncatable прем'єр якраз навпаки, де кожен постфікси є простим (штрихи , які починаються з 0 не допускаються). Обидві ці послідовності є кінцевими (Є лише 83 праворубних, у той час як 4260 ліворубних).

Вам потрібно написати програму, яка приймає одне число як вхідне і створює n- й правий відсічний прайм. Однак, коли програма зчитується розташованою назад , вона повинна створювати n- й ліворучний прайм.

Щоб організувати програму назад, ми розділили програму на слова, а потім змінимо порядок слів. Слово може складатися з будь-якої кількості символів.

Наприклад, якщо ваша програма була такою:

hello world
1234567890

Дозволено наступне: як можливі зворотні домовленості:

Розділення кожного символу:

0987654321
dlrow olleh

Розщеплення на пробіл:

1234567890
world hello

Довільне розщеплення (труби додані для ясності):

hel|lo w|orld
1|23456|7|8|90

908723456orld
1lo whel

Впорядковуючи свою програму назад, все пробіли необхідно враховувати та змінювати, як і будь-який інший символ.

Вхідні тестові входи:

1:  2
2:  3
21: 379
60: 239933
83: 73939133

Зворотні тестові входи:

1:    2
2:    3
39:   647
187:  29173
4260: 357686312646216567629137

Програми повинні мати змогу запускатися у розумний проміжок часу (менше хвилини)

Це , тому програма з найменшими байтами виграє!


немає. Атом після lo wє orld\n1. Новий рядок не закінчує атома
Натан Меррілл

А, дякую. Зрозумів зараз. Видалення моїх попередніх коментарів, щоб уникнути плутанини
Луїс Мендо

Відповіді:


6

Желе , 26 23 байт

Вперед

Ѷp9¶7ÆR2ĿV€$ÆPÐf$ÐĿFị@

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

Слова

Ñ p 9 7ÆR2ĿV€$ÆPÐf$ÐĿFị@

Відсталий

7ÆR2ĿV€$ÆPÐf$ÐĿFị@¶9p¶Ñ

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

Слова

7ÆR2ĿV€$ÆPÐf$ÐĿFị@ 9 p Ñ

Як це працює

Усі програми Jelly складаються з посилань (Jelly's take функції), які розділені лінійками годування або подушками ( ). Остання з них є основною ланкою ; він викликається автоматично при запуску програми.

Програма вперед працює наступним чином.

Ñ                   Helper link. Unused.


p9                  Helper link. Take the Cartesian product with [1, ..., 9].


7ÆR2ĿV€$ÆPÐf$ÐĿFị@  Main link. Argument: n

7ÆR                 Yield all primes up to 7.
             ÐĿ     
            $ÐĿ     Combine the two quicklinks to the left into a monadic chain,
                    and call it repeatedly until the results are no longer unique.
                    Return the array of all intermediate results.
       $              Combine the two links to the left into a monadic chain.
   2Ŀ               Call the helper link on line 2.
     Ṿ€                 Eval each array in the product. This casts to string
                        before evaluating, thus concatenating both numbers.
        ÆPÐf        Filter by primality; keep only primes.
               F    Flatten the resulting array.
                ị@  Retrieve the element at index n.

Відстала програма робить майже точно так само; є лише дві відмінності.

  • Зараз є основною ланкою Ñ, яка просто називає посилання під ним (обгортання), тобто головне посилання програми переадресації.

  • 9pзамість p9повернення зворотного декартового продукту.


4

Пітон 2, 143 139 байт

I=1
a={2}
def f(s):
 for d in'123456789':u=d[I:]+s+d*I;z=int(u);z+=z<3;z%91>0<2==pow(2,z,z)>a.add(z)<f(u)
f('')
lambda n:sorted(a)[~-n]
I=0

Складається з п'яти частин:

  1. I=1
  2. Новий рядок
  3. a={2}…[~-n]
  4. Новий рядок
  5. I=0

Тож обернення просто перевертає значення I.

Пояснення

Функція fвиконує рекурсивний пошук або ліворубних прайменів (LTP), або праворубних прайменів (RTPs), залежно від загального значення I. Ці значення додаються до набору a. Потім, lambda n:sorted(a)[~-n]повертає n-му.

Давайте визначимо аркуш як LTP, RTP, деяка ненульова цифра + LTP, або RTP + деяка ненульова цифра. Це всі значення, які fможна було б хотіти перевірити на наявність первинності.

Я розробив тест на псевдокримію Ферма, який працює для всіх листя:

      

(63973 - номер Carmichael .)

Якщо цей тест повернеться істинним, то його zслід додати до набору, aі ми повинні повторити його str(z). Відповідальний біт коду:

z+=z<3;z%91>0<2==pow(2,z,z)>a.add(z)<f(u)

По-перше, ми хочемо розібратися зі справою z == 2. Ми робимо це, просто додаючи його сюди і жорстко кодуючи, 2коли ми спочатку визначаємо a! (EDIT: І нічого шкідливого не трапиться, якщо ми теж піймаємо z == 1.) Тож ми можемо припустити, що z ≥ 3зараз.

Я переклав деякі «і» с в ланцюгове порівняння короткого замикання: перші три порівняння повинні бути успішними раніше a.add(z)і f(u)коли-небудь оцінюватися. Ось усі їх ролі:

  1. z%91>0кодує нашу першу умову. (63973 ділиться на 91, що не є самим листом, тому ми так його розпізнаємо.)
  2. 0<2завжди правда, але ланцюжок коротший, ніж and.
  3. 2==pow(2,z,z) кодує нашу другу умову.
  4. pow(2,z,z)>a.add(z)запускає додавання і завжди відповідає дійсності, оскільки set.addвіддача Noneта цілі числа завжди більше, ніж None.
  5. a.add(z)<f(u)запускає рекурсію. Його значення правди неважливо.

Подяка

  • Денніс врятував чотири байти ( u=[d+s,s+d][I]u=d[I:]+s+d*I; z==2z<3і трюк мода 91 ). Дякую!
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.