Najmniejsza liczba n-cyfr zawierająca tylko te cyfry


26

Będziesz musiał wygenerować najmniejszą nliczbę pierwszą za pomocą cyfr i będzie ona zawierać tylko cyfry określone na liście k.

Przykłady:

Wkład:

4
1 2

W tym celu musisz wygenerować najmniejszą 4liczbę pierwszą za pomocą cyfr, a ta liczba pierwsza musi zawierać tylko cyfry 1i 2.

Wydajność:

2111

Wkład:

10
0 4 7 

Wydajność:

4000000007

Wkład:

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

Wydajność:

115151

Możesz zagwarantować, że dane wejściowe będą zawsze w określonym przez ciebie formacie, i możesz zrobić wszystko, jeśli dostaniesz nieprawidłowe dane wejściowe (takie jak dane wejściowe nbez cyfr k).

Jeśli nie ma takiego rozwiązania dla danych wejściowych, twój program może wykonać dowolną z następujących czynności:

  • Wydrukować banana
  • Zgłaszaj błąd
  • Biegnij wiecznie
  • Coś jeszcze

Ponieważ jest to , staraj się znaleźć najkrótszy kod.

Dane wejściowe mogą mieć dowolny określony format. Na przykład, jeśli chcesz, aby dane wejściowe były podobne do poniższych, nie ma problemu.

4
[1, 2]

[1,2]4

1,2
4

4 12

Możesz napisać program lub funkcję i musi ona zwrócić poprawną wartość lub ją wydrukować.

Białe znaki są dozwolone w dowolnym miejscu.

To wyzwanie zainspirowane A036229 .


2
Obowiązkowe pytanie: czy możemy skorzystać z dowolnej bazy? (Wyzwanie jest
jednoosobowe

Czy rozwiązanie może mieć zera na początku, jeśli zero jest jedną z cyfr wejściowych?
Luis Mendo,

@ flawr oczywiście nie, myślę, że może mieć standardowe luki (jeśli nie, należy go dodać)
Okx

1
@LuisMendo nie liczyłbym tego jako „właściwej” liczby, więc nie.
Okx,

Czy lista może być literałem ustawionym? A postacie zamiast liczb całkowitych? (Odpowiedź @ xnor na Python używa tych)
mbomb007

Odpowiedzi:


4

Brachylog (2), 8 bajtów

j₍oᵐ∋ᵐcṗ

Wypróbuj online!

Bardzo powolny w przypadku problemów, które mają wiele możliwych cyfr lub które zawierają 0 w zestawie możliwych cyfr ( w tym przypadku to działa ; po prostu jest o tyle wolniejszy, że TIO przekracza limit czasu, chyba że problem jest bardzo prosty). Jak zwykle w przypadku Brachylog, jest to funkcja, a nie pełny program.

Dane wejściowe są pobierane w formacie [ndigits,[list of digits]]np [10,[[0,4,7]]].

Wyjaśnienie

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

Patrząc z czysto deklaratywnego punktu widzenia, mówi to: „znajdź liczbę pierwszą o podanej liczbie cyfr, gdzie wszystkie cyfry są jedną z podanych cyfr”. Aby znaleźć najmniejszą taką liczbę, korzystamy ze wskazówek dotyczących oceny, aby upewnić się, że kolejność, w której testujemy liczby, jest najmniejsza do największej; w tym przypadku sprawia , że decyzje na początku listy są mniej podatne na zmiany niż decyzje na końcu (jest to jego naturalny porządek, który jest taki sam jak leksykograficzny, a tym samym porządek liczbowy na liczbach całkowitych), a zatem {o∋}ᵐma dwa porządki oceny podpowiedzi: „najpierw zmieniaj kilka ostatnich cyfr” (z naturalnego porządku) jako ważniejszą wskazówkę i „sprawdzaj mniejsze cyfry przed dużymi cyframi” (z oprzed, która działa w tym kontekście jako wskazówka) jako rozstrzygnięcie remisu. {o∋}ᵐmożna zapisać jako ekwiwalent oᵐ∋ᵐzapisu bajtu.


12

Pakiet Bash + bsd-games, 28 bajtów

  • 18 bajtów zapisanych dzięki @Dennis.
primes 1|egrep -wm1 [$2]{$1}

Dane wejściowe podane w wierszu poleceń jako n, po których następuje k jako nieograniczona lista cyfr.

Wypróbuj online.


9

Python 2 , 66 bajtów

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)

Wypróbuj online!

Przyjmuje dane wejściowe jak f(3,{'9','3','8'}).

Python nie ma wbudowanych liczb pierwszych, więc funkcja generuje je za pomocą Twierdzenia Wilsona, aby z kolei sprawdzić każdą potencjalną wartość kjako pierwszą.

Łańcuchowa nierówność 10**~-n<p%k*k<s>=set(`k`)łączy trzy warunki k:

  • 10**~-n<k: kzawiera co najmniej ncyfry. Nie musimy dokładnie sprawdzać, ponieważ jeśli osiągniemy więcej cyfr, to nie mogło być rozwiązania
  • p%k>0: kjest liczbą pierwszą, poprzez warunek Twierdzenia Wilsona z p=(n-1)!^2. Ponieważ p%kjest to 0 lub 1, można to połączyć z poprzednim warunkiem jako10**~-n<p%k*k
  • s>=set(`k`): Wszystkie cyfry ksą w zestawie s. Można to połączyć, ponieważ Python 2 uważa, że ​​zestawy są większe niż liczby.

Jeśli prąd knie spełnia wszystkich z nich, funkcja powraca na k+1, dodając 1 do wynikowego wyniku. Ponieważ wyjście kończy się tym, Trueco jest równe 1i kzaczyna się od 1, wyjście jest k. To równoległe śledzenie kuderzeń generuje kbezpośrednio sukces.


Wow - niesamowite wykorzystanie Twierdzenia Wilsona!
Chandler Watson,

5

JavaScript (ES7), 100 bajtów

Pobiera dane wejściowe jako liczbę cyfr ni ciąg dozwolonych cyfr sw składni curry (n)(s). Zwraca, undefinedjeśli nie znaleziono rozwiązania.

Działa dość szybko dla maksymalnie 6 cyfr, może działać dla 7 i zdecydowanie zbyt wolno - i głodny pamięci - poza tym.

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

Test


Dokładnie to, co bym zrobił, może z innym testem pierwotności. Zobaczę, jak moja droga
wypada w

@ETHproductions Zacząłem od rekurencyjnego testu pierwotności, ale ograniczyłby go do 4 cyfr (a może nieco więcej w niektórych przeglądarkach?)
Arnauld

Moja pierwsza myśl o rozwiązaniu rekurencyjnym jest cztery bajty krótsza, ale generuje błąd dla dużych liczb. Miałemn=>s=>[...Array(10**n).keys()].find(i=>eval(`/[${s}]{${n}}/`).test(i)&(p=j=>i%--j?p(j):j==1)(i))
ETHproductions

@ETHproductions Ja też chciałem użyć & zamiast &&. Ale pod względem wydajności jest to bardzo kosztowny bajt.
Arnauld

Obecna wersja Chrome obsługuje TCO, jeśli włączysz flagę „enable-javascript-harmony” (przejdź do chrome: // flags i znajdź tę opcję)
ETHproductions

4

Galaretka , 12 bajtów

DL×ÆP
ṗḌÇÐṀṂ

Bierze zestaw i liczbę całkowitą jako argumenty wiersza poleceń. Wyświetla 0, jeśli nie ma rozwiązania.

Wypróbuj online!

Jak to działa

ṗḌÇÐṀṂ  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

Pyke, 18 16 bajtów

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

Wypróbuj tutaj!

Działa wiecznie, jeśli nie znaleziono żadnych wartości


@Okx powinien być teraz wystarczająco szybki, aby uruchomić większość, jeśli nie wszystkie przypadki testowe, teraz
Blue

@Okx wiesz, że możesz pobrać Pyke i uruchomić go offline, jeśli chcesz go w pełni przetestować bez limitu czasu?
Niebieski

Przepraszam. Myślałem, że to kod. Okazuje się, że limit czasu wynosi około czterech sekund, a to niewiele.
Okx,

3

Mathematica, 64 bajty

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

Czysta funkcja, w której pierwszy argument to (posortowana) lista dozwolonych cyfr, a drugi argument to dozwolona długość. Tuples@##oblicza wszystkie listy dozwolonych cyfr o dozwolonej długości, a następnie znajdujemy te, FirstCasektóre pasują x:{f_,___}tak, że pierwsza cyfra fnie jest, 0a liczba całkowita y=FromDigits@xjest liczbą pierwszą i zamienia ją na y.


2
To fajne, jak używasz /;testu, aby wybrać krotkę, ale także :>przekonwertować na żądany format wyjściowy. (Widzę w dokumentacji, że jest to dozwolone, ale dopiero po przeczytaniu tej odpowiedzi!) Powinieneś określić, że twoja funkcja wymaga sortowania dozwolonych cyfr: daje złą odpowiedź 3331zamiast, 3313jeśli zostanie wywołana za pomocą [{3,1},4].
Greg Martin

@ngenisis co powiesz na Select[FromDigits/@Tuples[Sort@#,#2],PrimeQ][[1]]&@@#&?
martin

@martin To nie uwzględnia krotek zaczynających się od 0i @@#&wydaje się zbędne.
ngenisis,

@ngenisis przepraszam - nie uwzględniłem tego
martin

3

Brachylog , 15 bajtów

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

Wypróbuj online!

To jest dość powolne.

Wyjaśnienie

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 bajtów

Pobiera dane wejściowe za pomocą składni curry, np. (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>

Do uruchomienia w trybie ścisłym (w celu optymalizacji wezwania ogona [TCO] ). Jeśli twoje środowisko nie obsługuje TCO, spowoduje błąd przepełnienia stosu dla liczb pierwszych większych niż stos środowisk.

W przypadku nieprawidłowych danych wejściowych będzie działać wiecznie.

Uwaga:

  • Użytkownicy Chrome (> = 51) mogą przejść chrome://flags/#enable-javascript-harmonyi włączyć tę flagę, aby uruchomić powyższy fragment kodu z obsługą TCO.
  • Safari (> = 10) obsługuje TCO

Myślę, że możesz zaoszczędzić dwa bajty za pomocąF=i=>(P=j=>i%--j?P(j):1==j)(i)&&...
ETHproductions

@ETHproductions Nie może, ponieważ musi być uruchomiony w trybie ścisłym (aby uniknąć przepełnienia stosu), a to tworzy zmienną globalną P.
George Reith

Och, nie zdawałem sobie sprawy, że całkowity koszt posiadania zastosowano tylko w trybie ścisłym.
ETHprodukcje

@ETHproductions Tak, ja też nie zrobiłem, dopóki nie przeczytałem specyfikacji, którą zamieściłem XD. Mój pierwszy wariant odpowiedzi używał tego skrótu, dopóki nie zorientowałem się, że jest nieprawidłowy.
George Reith,

2

MATL, 17 bajtów

wlwX"1GXNUStZp)l)

Ta funkcja przyjmuje dwa wejścia, liczbę całkowitą określającą liczbę cyfr oraz tablicę znaków wskazującą możliwe wartości. W przypadku braku liczb pierwszych wyświetlany jest błąd.

Wypróbuj online!

Wyjaśnienie

        % 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

Szałwia, 62 bajty

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

Pobiera dane z formularza: f( 4 , {'1','2'} )


1

Perl 6 , 43 bajtów

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

Działa wiecznie, jeśli nie ma rozwiązania.


jaki jest format wejściowy?
Okx,

1
@Okx: Jest to lambda, która wymaga dwóch argumentów: liczby n i listy k.
smls,

1

05AB1E , 17 bajtów

[¾Øмg¹QiS²Kg0Qiq

Wypróbuj online!

[¾Ø ¼             # 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


0

Perl5, 77 bajtów

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

Uruchom tak:

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

0

Rubinowy, 77 76 bajtów

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

Format wejściowy: liczba i ciąg.

Przykład:

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

0

Perl 6 , 68 bajtów

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

Spróbuj

Zwraca, Niljeśli nie można znaleźć takiej liczby pierwszej.

Rozszerzony:

->
  \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 bajtów

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

Wypróbuj online

Dane wejściowe są jak 4,{'1','2'}.


1,{'1'}nie jest prawidłowym wejściem (ponieważ 1 nie jest liczbą pierwszą), więc możesz robić, co chcesz.

Och, racja. Dzięki.
mbomb007

0

PHP, 82 bajty

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

Pobiera liczbę i ciąg cyfr z argumentów wiersza poleceń. Uruchom z -nr.

awaria

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 bajtów

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 bajty, obsługując liczby powyżej 32-bitów (zmieniono intna long)

Format wejściowy: liczba całkowita (tj. 4) I ciąg (tj. "12")

Wyjaśnienie:

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
}

Kod testowy:

Wypróbuj tutaj.
UWAGA: Drugi przypadek testowy jest wyłączony, ponieważ zapętla się przez bardzo długi czas.

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"));
  }
}

Wydajność:

2111
115151
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.