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

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==2z<3и трюк мода 91 ). Благодаря!
Линн
источник