Простые числа в большом количестве


11

Учитывая большое число (в базе 10), например, 1234567891011121314151617, найдите в нем простые «субномера».
Простое «субномер» - это последовательная последовательность цифр (взятая из ввода), которая представляет простое число (в базе 10).

  • Ввод : число (строка, файл или что угодно).
  • Вывод : все простые субнамеры разделены каким-либо образом (либо в списке, либо в файле, либо через строки, разделенные запятыми ...). Если результат пустой, вы можете принять любое соглашение, которое вам нравится (жестко закодированная строка, пустая строка, бред, но программа не должна врезаться.
  • Пример
    1234 -> 2, 3, 23
    6542 -> 5, 2
    14 -> [.. пустой вывод]

Это код-гольф. Самая короткая программа выигрывает!
[править]: дополнительное правило, программа должна быть объяснена! Не все свободно говорят на желе :)


3
Добро пожаловать в PPCG!
Луис Филипе Де Иисус Муньос


1
не определен. Делай что хочешь.
Реджис Порталез,

1
Совет: слишком рано принимать ответ; это может отговорить других от публикации решений.
лохматый

2
@RegisPortalez добро пожаловать, и хороший вызов! Я обнаружил, что функция «принять» уже не так часто используется в PPCG, как на других сайтах в сети. Мы склонны ценить хорошие ответы на любом языке.
нгм

Ответы:


6

05AB1E (legacy) , 3 байта

Œʒp

Попробуйте онлайн!

Подстроки ввода, которые являются простыми.


Это будет трудно сделать короче :)
Regis Portalez

Правильный язык для этой задачи
Джонатан Аллан

5
@mob Это зависит от кодировки. В кодировке 05AB1E этот ответ имеет длину 3 байта.
Денис

2
В соответствии с этим 34567 = 13 * 2659 простое число, кажется неправильным: tio.run/##yy9OTMpM/f//6KRTkwr@/zc2MTUzBwA
frosqh

2
@frosqh На самом деле это ошибка функции p (prime) в новой версии 05AB1E: tio.run/##yy9OTMpM/f//6KRTkwr@/zc2MTUzBwA. Она уже исправлена ​​в репозитории, но не была добавлена ​​в TIO. Тем временем я переключил свой ответ на устаревшую версию.
Кальдо

6

Perl 6 , 28 байт

{grep &is-prime,+«m:ex/.+/}

Попробуйте онлайн!

:ex( «Исчерпывающий») флаг оператора матча mделает вернуть все возможное совпадение .+(то есть, каждый подстроки одного или более символов), даже перекрытие из них. Гипероператор превращает этот список Matchобъектов в числа, которые затем фильтруются по простоте grep &is-prime.


Здесь я собирался пойти с{+«m:ex/(.+)<?{$0.is-prime}>/}
Брэд Гилберт b2gills

@ BradGilbertb2gills Я тоже это попробовал! Я немного разочарован, оказалось, что это дольше.
Шон

Спасибо за объяснение - всегда полезно для Perl 4 динозавров, как я!
Тоби Спейт


5

Python 2 , 66 65 байт

P=k=1
n=input()
while~n+k:
 if`k`in`n`>0<P%k:print k
 P*=k*k;k+=1

Попробуйте онлайн!


Должно быть while k<=nили, чтобы стоить 0 байтов,while~n+k
Джонатан Аллан

@JonathanAllan спасибо. Сначала я думал, что само число должно быть исключено из вывода, но кажется, что это не так.
Ов

@JonathanAllan Можете ли вы объяснить, пожалуйста, код из whileзаявления? Я не видел этот тип кодов раньше. Также не видел использования `` , что он делает?
Тарит Госвами

1
@taritgoswami while stmt:будет работать до тех пор, пока stmtимеет значение, которое Python считает правдивым. Единственное ложное целое число в Python это 0. Поэтому код будет работать как ~n+k != 0. ~является побитовым оператором дополнения и ~nэквивалентен -n - 1. ~n + k != 0<=> -n - 1 + k != 0<=> k != n + 1. Поскольку мы увеличиваем значение kна 1в каждой операции, k != n + 1в этом случае эквивалентно k <= n.
овс

1
@taritgoswami И `n`такой же, как repr(n)в Python 2. (не работает в Python 3).
овс


3

Желе ,  5  4 байта

-1 спасибо Кевину Круйссену ( это псевдоним ÆP)

ẆḌẒƇ

Монадическая ссылка, принимающая список цифр *, который выдает список простых целых чисел.

* переходя к «либо строке, файлу, либо как вам угодно» - чтобы взять целое число, добавьте к коду префикс D

Попробуйте онлайн!

Как?

ẆḌẒƇ - Link: list of integers (digits)   e.g. [1,2,3,4]
Ẇ    - non-empty contiguous substrings        [[1],[2],[3],[4],[1,2],[2,3],[3,4],[1,2,3],[2,3,4],[1,2,3,4]]
 Ḍ   - convert to decimal (vectorises)        [1,2,3,4,12,23,34,123,234,1234]
   Ƈ - filter keep if:
  Ẓ  -   is prime?                            [2,3,23]

ÆPможет быть если я не ошибаюсь?
Кевин Круйссен

Ах да, это один из новых псевдонимов - спасибо!
Джонатан Аллан

2

Java 8, 148 147 байт

n->{for(int l=n.length(),i=l,j;i-->0;)for(j=l;j>i;){long k=2,x=new Long(n.substring(i,j--));for(;k<x;x=x%k++<1?0:x);if(x>1)System.out.println(x);}}

Попробуйте онлайн.

Объяснение:

n->{                     // Method with String parameter and no return-type
  for(int l=n.length(),  //  Length of the input-String
          i=l,j;         //  Temp-integers
      i-->0;)            //  Loop `i` in the range [length, 0)
    for(j=l;j>i;){       //   Inner loop `j` in the range [length, 0)
      for(long k=2,      //    Set `k` to 2
               x=new Long(n.substring(i,j--)
                         //    Take the substring [`i`, `j`) from the input,
            );           //    convert it to a long, and set it as `x`
          k<x;           //    Inner loop as long as `k` is still smaller than `x`
        x=x%k++<1?       //     If `x` is divisible by `k`:
           0             //      Set `x` to 0
          :              //     Else:
           x);           //      Leave `x` unchanged
      if(x>1)            //    If `x` is now larger than 1 (a.k.a. If `x` is a prime):
        System.out.println(x);}}
                         //     Print `x` with a trailing newline to STDOUT


2

Bash + GNU Core Утилиты: 80 77 байт

for i in $(seq `tee a|wc -c`)
{
grep -oE .{$i}<a|factor|grep -oP ': \K\d+$'
}

Это не может быть самым коротким, но у меня проблемы с придумыванием чего-то лучшего. Требуется помощь!

Придерживаясь только POSIX, я получил 82:

for i in $(seq `tee a|wc -c`)
{
grep -oE .{$i}<a|factor|awk -F\  'NF<3{print$2}'
}

Может ли Bash нарезка строк помочь? Обидно, что диапазоны скобок расширены до параметров ...
Тоби Спейт

@TobySpeight, который потребовал бы двух циклов (один для начала, один для конца), не говоря уже о том, что вы не можете использовать переменные внутри подрезки среза. Zsh это позволяет, хотя! На мой взгляд, основной путь к краткости - использовать Awk для генерации всех подстрок.
markasoftware





0

Pyth, 8 байт

fP_TsM.:

Тестирование

Принимает входные данные в виде строки, выводит список целых чисел. Может также принимать входные данные int , добавляя `в конце дополнительный байт.

Объяснение:
fP_TsM.:  | Full code
fP_TsM.:Q |  with implicit variables added
          | Print (implicit)
      .:Q |  list of all substrings of the input
    sM    |   converted to integers
fP_T      |    filtered for prime numbers

И `просто преобразуется intв str.


0

Wolfram Language (Mathematica) , 40 байт

Select[PrimeQ@*FromDigits]@*Subsequences

Попробуйте онлайн!

Вход и выход представляют собой списки цифр. В случае отсутствия простых чисел {}возвращается пустой список .

Использует @*для Compositionфункций. Subsequencesдает список всех подпоследовательностей входных данных и Select[PrimeQ@*FromDigits]является операторной формой, Selectкоторая возвращает список всех элементов, для которых PrimeQ@*FromDigitsвозвращается True.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.