Найменший 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 у 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у синтаксисі currying (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-гармонія" (просто перейдіть до chrome: // прапорів і знайдіть цей варіант)
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

@Okx Ви знаєте, що можете завантажити Pyke та запустити його в автономному режимі, якщо хочете протестувати його повністю без обмеження часу?
Блакитний

Ой, вибачте. Я подумав, що це код. Виявляється, час очікування становить приблизно чотири секунди, що не дуже багато.
Okx

3

Математика, 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 шкода - не враховувати , що
Мартіну


2

JavaScript (ES6), 86 байт

Здійснює введення через синтаксис currying, наприклад, (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

Шавлія, 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
Я не думаю, що тобі потрібен ,кінець.
Райлі

@Riley приємний дзвінок!
Чарівний восьминога Урна

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 якщо такої простої не можна знайти.

Розширено:

->
  \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.