Правильные и усекаемые простые числа


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), которые разделены переводом строки или тачкой ( ). Последний из них является главной ссылкой ; он вызывается автоматически при запуске программы.

Форвардная программа работает следующим образом.

Ñ                   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

Python 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), либо усекаемых справа простых чисел (RTP), в зависимости от значения global I. Эти значения добавляются в набор a. Затем lambda n:sorted(a)[~-n]возвращает n-ое.

Давайте определим лист как LTP, RTP, некоторую ненулевую цифру + LTP или RTP + некоторую ненулевую цифру. Это все значения, которые fкогда-либо захотят проверить на простоту.

Я разработал тест псевдопраймера Ферма, который работает для всех листьев:

      

(63973 - число Кармайкла .)

Если этот тест возвращает значение true, его zследует добавить в набор, aи мы должны продолжить str(z). Ответственный бит кода:

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

Во-первых, мы хотим разобраться с этим делом z == 2. Мы делаем это, просто уклоняясь от этого, и жестко программируем, 2когда мы изначально определяем a! (РЕДАКТИРОВАТЬ: И ничего вредного не произойдет, если мы также поймаем 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)запускает сложение и всегда имеет значение true, поскольку set.addвозвращает None, а целые числа всегда больше, чем None.
  5. a.add(z)<f(u)запускает рекурсию. Его истинное значение неважно.

Подтверждения

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