Наименьшее n-значное простое число, содержащее только эти цифры


26

Вам нужно сгенерировать наименьшее простое число с nцифрами, и оно будет содержать только цифры, указанные в списке k.

Примеры:

Входные данные:

4
1 2

Для этого вы должны сгенерировать наименьшее простое число с 4цифрами, и это простое число должно содержать только цифры 1и 2.

Выход:

2111

Входные данные:

10
0 4 7 

Выход:

4000000007

Входные данные:

6
5 5 5 5 5 5 5 5 5 5 1 5 5 5 5 5 5 5 5 5 5

Выход:

115151

Вы можете гарантировать, что ввод всегда будет в указанном вами формате, и вы можете сделать что угодно, если получите неправильный ввод (например, ввод nбез цифры k).

Если такого решения для входа не существует, ваша программа может выполнить любое из следующих действий:

  • Распечатать banana
  • Выбросить ошибку
  • Бежать навсегда
  • Что-нибудь еще

Поскольку это , постарайтесь найти самый короткий код.

Ввод может быть в любом формате, который вы укажете. Например, если вы хотите, чтобы ваш ввод был похож на любой из следующих, это нормально.

4
[1, 2]

[1,2]4

1,2
4

4 12

Вы можете написать программу или функцию, и она должна либо вернуть правильное значение, либо распечатать его.

Пробелы разрешены где угодно.

Этот вызов вдохновлен A036229 .


2
Обязательный вопрос: Можем ли мы использовать какую-либо базу? (Задача намного проще в
унарном

Может ли решение иметь начальные нули, если ноль является одной из входных цифр?
Луис Мендо

@ Flawr, конечно, нет, я думаю, что это может подойти под стандартные лазейки (если нет, это нужно добавить)
Okx

1
@ LuisMendo я бы не посчитал это «правильным» числом, так что нет.
Okx

Может ли список быть заданным литералом? А символы вместо целых чисел? (@Xnor's Python ответ использует их)
mbomb007

Ответы:


4

Брахилог (2), 8 байт

j₍oᵐ∋ᵐcṗ

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

Очень медленно для задач, которые имеют много возможных цифр, или которые содержат 0 в наборе возможных цифр (это работает в этом случае; просто это намного медленнее, чем время ожидания TIO, если проблема не очень проста). Как обычно для Brachylog, это функция, а не полная программа.

Ввод принимается в формате [ndigits,[list of digits]], например [10,[[0,4,7]]].

объяснение

j₍oᵐ∋ᵐcṗ
j₍        Make a number of copies of the second element equal to the first element
  oᵐ      Sort each (ᵐ) of those copies (evaluation order hint)
    ∋ᵐ    Take one element from each of those copies
      c   Concatenate those elements to form an integer (asserts no leading 0)
       ṗ  producing a prime number

При взгляде с чисто декларативной точки зрения это говорит: «найдите простое число с заданным количеством цифр, где все цифры являются одной из заданных цифр». Чтобы найти наименьшее такое число, мы используем подсказки порядка оценки, чтобы обеспечить порядок, в котором мы тестируем числа, от наименьшего к наибольшему; в этом случае решения в начале списка менее подвержены изменениям, чем решения в конце (это естественный порядок, который совпадает с лексикографическим и, следовательно, числовой порядок целых чисел), и поэтому {o∋}ᵐимеет два порядка оценки подсказки, «измените последние несколько цифр в первую очередь» (из естественного порядка) в качестве более важной подсказки и «проверьте меньшие цифры перед большими цифрами» (от oдо, который выступает в качестве подсказки в этом контексте) как тай-брейк. {o∋}ᵐможет быть записан как эквивалент oᵐ∋ᵐдля сохранения байта.



9

Python 2 , 66 байт

f=lambda n,s,k=1,p=1:10**~-n<p%k*k<s>=set(`k`)or-~f(n,s,k+1,p*k*k)

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

Принимает участие как f(3,{'9','3','8'}).

Python не имеет встроенных модулей для простых чисел, поэтому функция генерирует их, используя теорему Вильсона, чтобы проверить каждое потенциальное значение, kв свою очередь, на предмет простоты.

Цепное неравенство 10**~-n<p%k*k<s>=set(`k`)объединяет три условия k:

  • 10**~-n<k: kсодержит как минимум nцифры. Нам не нужно точно проверять, потому что, если мы достигнем большего количества цифр, не должно быть никакого решения
  • p%k>0: kпростое, через условие теоремы Вильсона с p=(n-1)!^2. Так p%kкак 0 или 1, это может быть объединено с предыдущим условием как10**~-n<p%k*k
  • s>=set(`k`): Все цифры kв наборе s. Это может быть объединено, потому что Python 2 считает наборы больше, чем числа.

Если ток kне удовлетворяет всем этим, функция возвращается к k+1, добавляя 1 к полученному результату. Так как выход заканчивается с Trueкоторого равно 1и kначинается в 1, выход равен k. Это параллельное отслеживание kударов, выводимых kнепосредственно на успех.


Ух ты - потрясающее использование теоремы Уилсона!
Чендлер Уотсон

5

JavaScript (ES7), 100 байт

Вводит в виде количества цифр nи строки разрешенных цифр sв синтаксисе каррирования (n)(s). Возвращает, undefinedесли решение не найдено.

Работает довольно быстро до 6 цифр, может работать до 7 и определенно слишком медленно - и требует много памяти - сверх этого.

n=>s=>(a=[...Array(10**n).keys()]).find(i=>eval(`/[${s}]{${n}}/`).test(i)&&a.every(j=>j<2|j==i|i%j))

Тест


Именно то, что я бы сделал, за исключением, может быть, другого теста на первичность. Я посмотрю, как мой путь сравнивается с твоим ...
ETHproductions

@ETHproductions Я начал с рекурсивного теста на простоту, но он бы ограничил его до 4 цифр (или, может быть, чуть больше в некоторых браузерах?)
Арно

Моя первая мысль о рекурсивном решении была на четыре байта короче, но она выдает ошибку для больших чисел. Я имелn=>s=>[...Array(10**n).keys()].find(i=>eval(`/[${s}]{${n}}/`).test(i)&(p=j=>i%--j?p(j):j==1)(i))
ETHproductions

@ETHproductions Мне тоже хотелось использовать & вместо &&. Но с точки зрения производительности, это очень дорогой байт.
Арно

Текущая версия Chrome поддерживает TCO, если вы включите флаг «enable-javascript-harmony» (просто зайдите в chrome: // flags и найдите эту опцию)
ETHproductions

4

Желе , 12 байт

DL×ÆP
ṗḌÇÐṀṂ

Принимает набор и целое число в качестве аргументов командной строки. Печатает 0, если решения не существует.

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

Как это работает

ṗḌÇÐṀṂ  Main link. Left argument: A (digit set/array). Right argument: n (integer)

ṗ       Cartesian power; yield all arrays of length n that consist only of elements
        of the array A.
 Ḍ      Undecimal; convert all generated digit arrays to integers.
  ÇÐṀ   Keep only elements for which the helper link returns a maximal result.
     Ṃ  Take the minimum.


DL×ÆP   Helper link. Argument: k (integer)

D       Decimal; convert k into the array of its base 10 digits.
 L      Take the length.
   ÆP   Test if k is a prime number. Yields 1 or 0.
  ×     Multiply the length and the Boolean.

3

Пайк, 18 16 байт

j;~p#`ljqi`Q-!)h

Попробуй это здесь!

Работает вечно, если не найдено значений


@Okx теперь должен быть достаточно быстрым, чтобы выполнять большинство, если не все тестовые случаи, сейчас
Blue

@ Хорошо, вы знаете, что вы можете загрузить Pyke и запустить его в автономном режиме, если вы хотите протестировать его полностью без ограничения по времени?
Синий,

Ой, извини. Я думал, что это был код. Оказывается, время ожидания составляет около четырех секунд, что не очень много.
Okx

3

Mathematica, 64 байта

FirstCase[Tuples@##,x:{f_,___}/;f>0&&PrimeQ[y=FromDigits@x]:>y]&

Чистая функция, где первый аргумент - это (отсортированный) список разрешенных цифр, а второй аргумент - это допустимая длина. Tuples@##вычисляет все списки разрешенных цифр разрешенной длины, затем мы находим те, FirstCaseкоторые совпадают x:{f_,___}, так что первая цифра fне является, 0а целое число y=FromDigits@xявляется простым и заменяет его на y.


2
Это здорово, как вы используете /;тест, чтобы выбрать кортеж, но также и :>конвертировать в желаемый выходной формат. (Я вижу в документации, что это разрешено, но только после прочтения этого ответа!) Вы должны указать, что ваша функция требует сортировки разрешенных цифр: она дает неправильный ответ 3331вместо 3313вызова с [{3,1},4].
Грег Мартин

@ngenisis как насчет Select[FromDigits/@Tuples[Sort@#,#2],PrimeQ][[1]]&@@#&?
мартин

@martin Это не учитывает кортежи, начинающиеся с, 0и @@#&кажется излишним.
ngenisis

@ngenisis жаль - не учитывать , что
Мартину

3

Брахилог , 15 байт

tL∧?h~lṗ.dẹp⊆L∧

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

Это довольно медленно.

объяснение

tL                Input = [H, L]
  ∧
   ?h~l .         The Output is a variable of length H
       ṗ.         The Output is a prime number
          ẹ       The Output's digits...
        .d        ...when removing duplicate digits...
           p      ...is a permutation...
            ⊆L    ...of an ordered subset of L
              ∧

2

JavaScript (ES6), 86 байт

Принимает ввод через синтаксис карри, например, (4)('12')

n=>(d,F=(i,P=j=>i%--j?P(j):1==j)=>P(i)&&`${i}`.match(`^[${d}]{${n}}$`)?i:F(i+1))=>F(2)

'use strict';

const G=n=>(d,F=(i,P=j=>i%--j?P(j):1==j)=>P(i)&&`${i}`.match(`^[${d}]{${n}}$`)?i:F(i+1))=>F(2)

const submit = () => {
  console.clear();
  console.log(G(+n.value)(d.value));
}

button.onclick = submit;
submit();
<input id="n" type="number" min="1" value="4" />
<input id="d" type="text" value="12" />
<button id="button">Submit</button>

Для запуска в строгом режиме (для оптимизации хвостового вызова [TCO] ). Если ваша среда не поддерживает TCO, это приведет к ошибке переполнения стека для простых чисел, превышающих стек сред.

Для неверных вводов он будет работать вечно.

Заметка:

  • Пользователи Chrome (> = 51) могут перейти chrome://flags/#enable-javascript-harmonyи включить этот флаг для запуска приведенного выше фрагмента с поддержкой TCO.
  • Safari (> = 10) поддерживает TCO

Я думаю, что вы можете сохранить два байта сF=i=>(P=j=>i%--j?P(j):1==j)(i)&&...
ETHproductions

@ETHproductions не может, потому что он должен быть запущен в строгом режиме (чтобы избежать переполнения стека), и это создает глобальную переменную P.
Джордж Райт

О, я не понял, что TCO применяется только в строгом режиме.
ETHproductions

@ETHproductions Да, и я не делал, пока я не прочитал спецификацию, которую я опубликовал XD, мой первый вариант ответа использовал этот ярлык, пока я не понял, что он недействителен.
Джордж Райт,

2

MATL, 17 байт

wlwX"1GXNUStZp)l)

Эта функция принимает два ввода: целое число, указывающее количество цифр, и массив символов, указывающий возможные значения. В случае отсутствия простых чисел отображается ошибка.

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

объяснение

        % Implicitly grab two inputs. First as an integer (N), second as a string (OPTS)
w       % Reverse the order of the inputs
l       % Push the literal 1 to the stack
w       % Pull N back to the top of the stack
X"      % Repeat OPTS N times 
1G      % Explicitly grab N again
XN      % Get all N-character combinations of the repeated version of OPTS
U       % Convert each row from a string to a number
S       % Sort them in ascending order
tZp)    % Grab only those that are primes
l)      % Retrieve the first prime
        % Implicitly print the result


2

Sage, 62 байта

lambda l,d:[p for p in primes(10^(l-1),10^l)if set(`p`)<=d][0]

Принимает ввод формы: f( 4 , {'1','2'} )


1

Perl 6 , 43 байта

->\n,@k {first *.is-prime&/^@k**{n}$/,^∞}

Работает вечно, если решения не существует.


какой формат ввода?
Okx

1
@Okx: это лямбда, которая принимает два аргумента: число n и список k.
Smls

1

05AB1E , 17 байт

[¾Øмg¹QiS²Kg0Qiq

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

[¾Ø ¼             # Infinite loop over all primes
   Ð              # Push two extra copies on the stack
     g¹Qi         # If the length of this prime == the first input...
         S²K      # Push this prime without any of the digits in the second input
            g0Qi  # If the length of what remains is 0...
                q # quit
                  # implicitly print this prime

1

05AB1E , 22 19 18 байт (-1 @Riley)

[NØ©S¹Kg0Q®g²Q&i®q

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

[                   # infinite loop.
 NØ©                # push nth prime.
    S¹Kg0Q          # see if, without banned digits, it's 0 length.
          ®g²Q&     # see if, it is originally also the length specified.
               i®q  # if true, print result and exit.

1
Я не думаю, что вам нужно ,в конце.
Райли

@ Райли хороший звонок!
Волшебная Урна Осьминога

0

Perl5, 77 байт

($n,$d)=@ARGV;/^[$d]{$n}$/&&("x"x$_)!~/^(..+?)\1+$/&&print&&die for 2..10**$n

Запустите так:

perl -le '($n,$d)=@ARGV;/^[$d]{$n}$/&&("x"x$_)!~/^(..+?)\1+$/&&print&&die for 2..10**$n' 4 12

0

Рубин, 77 76 байт

->n,l{(10**~-n..10**n).find{|n|(2...n).none?{|x|n%x<1}&&!n.to_s[/[^#{l}]/]}}

Формат ввода: число и строка.

Пример:

->n,l{...see above...} [6,"555555555515555555555"]
=> 115151

0

Perl 6 , 68 байт

->\n,\k{first {.is-prime&&/.**{n}/},+«[X~] 0,|(k.unique.sort xx n)}

Попытайся

Возвращает, Nilесли не найдено такое простое число.

Expanded:

->
  \n, # number of digits
  \k  # list of digits
{

  first

    {
        .is-prime
      &&
        / . ** {n} / # exactly 「n」 digits ( in case 「k」 has a 0 )
    },

    \          # turn the following into a list of numbers

    [X[~]]       # cross the following with &infix:<~>

    0,           # append a 0 in case 「n」 was 1
    |(           # slip this list in (flatten)

        k        # the input list of possible digits
        .unique  # only one of each to reduce the search space (optional)
        .sort    # sort it so that the cross meta op returns them sorted

      xx         # list repeat

        n        # 「n」 times
    )
}

0

Python 2 + primefac , 91 85 байт

import primefac as P
n,k=input()
p=10**~-n
while set(`p`)!=k:p=P.nextprime(p)
print p

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

Ввод похож 4,{'1','2'}.


1,{'1'}неверный ввод (потому что 1 не простое число), поэтому вы можете делать там все, что захотите.

О верно. Спасибо.
mbomb007

0

PHP, 82 байта

for($n=10**--$argv[1];$i-1||a&trim($n,$argv[2]);)for($i=++$n;--$i&&$n%$i;);echo$n;

Принимает число и строку цифр из аргументов командной строки. Беги с -nr.

сломать

for($n=10**--$argv[1];  // $n = smallest number with (argument1) digits
    $i-1||                  // loop while $n is not prime or
    a&trim($n,$argv[2]);    // $n without all digits from (argument2) is not empty
)
    for($i=++$n;--$i&&$n%$i;);  // $i=largest divisor of $n smaller than $n (1 for primes)
echo$n;                 // print

0

Java 7, 139 141 байт

long c(int a,String b){for(long n=2,i,x;;n++){for(x=n,i=2;i<x;x=x%i++<1?0:x);if(x>1&(n+"").length()==a&(n+"").matches("["+b+"]+"))return n;}}

+2 байта, поддерживая числа выше 32-битных (изменено int на long)

Формат ввода: целое число (т.е. 4) и строка (т.е."12" )

Объяснение:

long c(int a, String b){                  // Method with the two input parameters specified above
  for(long n = 2, i, x; ; n++){           // Loop from 2 going upwards
    for(x = n, i = 2; i < x; x = x % i++ < 1 ? 0 : x);  // Prime check for `n` 
    if (x > 1                             // if `n` is a prime (if `x` > 1 after the loop above it means `n` is a prime)
         & (n+"").length() == a           // AND if `n` has a length equal to the input integer
         & (n+"").matches("["+b+"]+")){   // AND if `n` only contains the specified digits of the input String (using a regex)
      return n;                           // Then we have our answer
    }
  }                                       // If no answer is available for the given input, it continues looping
}

Тестовый код:

Попробуй это здесь.
ПРИМЕЧАНИЕ. Второй контрольный пример отключен, поскольку он зацикливается очень долго.

class M{
  static long c(int a,String b){for(long n=2,i,x;;n++){for(x=n,i=2;i<x;x=x%i++<1?0:x);if(x>1&(n+"").length()==a&(n+"").matches("["+b+"]+"))return n;}}

  public static void main(String[] a){
    System.out.println(c(4, "12"));
    //System.out.println(c(10, "047"));
    System.out.println(c(6, "555555555515555555555"));
  }
}

Выход:

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