Yalnızca bu basamakları içeren en küçük n basamaklı asal sayı


26

nRakamlarla en küçük üssü oluşturmanız gerekir ve yalnızca listede belirtilen sayıları içerir k.

Örnekler:

Giriş:

4
1 2

Bunun için, en küçük 4rakamı rakamlarla oluşturmalısınız ve bu sadece rakamları 1ve rakamlarını içermelidir 2.

Çıktı:

2111

Giriş:

10
0 4 7 

Çıktı:

4000000007

Giriş:

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

Çıktı:

115151

Girişin her zaman belirttiğiniz biçimde olacağını garanti edersiniz ve geçersiz girdi alırsanız her şeyi yapabilirsiniz (giriş n, olmadan tek basamaklı olan gibi k).

Bir girdi için böyle bir çözüm mevcut değilse, programınızın aşağıdakilerden herhangi birini yapmasına izin verilir:

  • baskı banana
  • Bir hata at
  • Sonsuza dek koş
  • Başka herhangi bir şey

Bu , en kısa kodu hedeflemeye çalışın.

Giriş belirttiğiniz herhangi bir biçimde olabilir. Örneğin, girişinizin aşağıdakilerden herhangi biri gibi olmasını istiyorsanız, bu iyi.

4
[1, 2]

[1,2]4

1,2
4

4 12

Bir program veya fonksiyon yazabilirsiniz ya da doğru değeri döndürmeli ya da yazdırmalıdır.

Boşluğa her yere izin verilir.

Bu zorluk A036229'dan ilham aldı .


2
Zorunlu soru: Herhangi bir üs kullanabilir miyiz? (
Zorluk unary'de

Sıfır, giriş rakamlarından biriyse, çözümün başında sıfır olabilir mi?
Luis Mendo,

Elbette @flawr, standart boşluklara girebileceğini düşünmüyorum (değilse de eklenmesi gerekiyor)
Okx

1
@ LouisMendo bunu 'uygun' sayı olarak saymazdım, yani hayır.
Okx

Liste hazır bilgi olabilir mi? Ve tamsayılar yerine karakterler? (@
xnor'ın

Yanıtlar:


4

Brachylog (2), 8 bayt

j₍oᵐ∋ᵐcṗ

Çevrimiçi deneyin!

Çok fazla muhtemel rakam içeren veya muhtemel rakamlar kümesinde 0 bulunan problemlerde çok yavaş ( bu durumda işe yarar; sorun çok basit olmadıkça TIO'nun zaman aşımına uğraması çok yavaş). Brachylog'da olduğu gibi, bu tam bir program değil, bir fonksiyondur.

Giriş [ndigits,[list of digits]], örneğin biçiminde alınır [10,[[0,4,7]]].

açıklama

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

Tamamen bildirici bir bakış açısıyla bakıldığında, bu "tüm rakamların verilen rakamlardan biri olduğu belirli sayı ile, asal bir sayı bul" diyor. Bu en küçük sayıyı bulmak için , sayıların en küçük ve en büyük sırasını test etmek amacıyla değerlendirme sırası ipuçlarını kullanırız; Bu durumda, listenin başlangıcındaki kararları, sona yaklaşılan kararlara göre değişime daha az eğilimli kılar (bu, doğal sıralamasıdır; bu, sözcükbilimsel ve dolayısıyla tamsayılar üzerindeki sayısal sıradır) ve dolayısıyla {o∋}ᵐiki değerlendirme sırasına sahiptir. tavsiyeleri, (dan "birinci son birkaç basamak farklı" dan ( 'büyük basamak önce daha küçük basamak kontrol' daha önemli ipucu olarak kendi doğal sırası), ve odaha önce, bu bağlamda bir ipucu olarak hareket eden) mafsallı olarak. Bir bayt kaydetmek {o∋}ᵐiçin eşdeğer olarak yazılabilir oᵐ∋ᵐ.


12

Bash + BSD oyunları paketi, 28 bayt

  • @Dennis sayesinde 18 bayt kaydedildi.
primes 1|egrep -wm1 [$2]{$1}

Komut satırında n olarak verilen giriş, ardından sınırlandırılmamış basamak listesi olarak k.

Çevrimiçi deneyin.


9

Python 2 , 66 bayt

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)

Çevrimiçi deneyin!

Gibi girdi alır f(3,{'9','3','8'}).

Python'un asal sayılar için yerleşik bir özelliği yoktur, bu nedenle işlev her asıl değeri sırayla kontrol etmek için Wilson Teoremini kullanarak üretir k.

Zincirleme eşitsizliği 10**~-n<p%k*k<s>=set(`k`), aşağıdaki üç koşulu birleştirmektedir k:

  • 10**~-n<k: ken az nrakam içeriyor . Tam olarak kontrol etmemize gerek yok çünkü daha fazla rakama ulaşırsak, çözüm olmamalı
  • p%k>0: kWilson'un Teoremi koşulu ile asaldır p=(n-1)!^2. Bu yana p%k, 0 ya da 1 'dir, bu, daha önceki durumda olduğu gibi birleştirilebilir10**~-n<p%k*k
  • s>=set(`k`): Tüm rakamlar ksettedir s. Python 2, kümeleri sayılardan daha büyük olarak düşündüğü için, buna eklenebilir.

Akım kbunların hepsini karşılamıyorsa, fonksiyon tekrar k+1elde eder ve elde edilen çıktıya 1 ekler. Çıkış ile sona erdiği yana Trueeşit olduğu 1ve kde başlar 1, çıkış olduğunu k. Bu paralel katımların kdoğrudan başarı ile sonuçlanması.


Vay - Wilson'ın Teoreminin harika kullanımı!
Chandler Watson

5

JavaScript (ES7), 100 bayt

Körme sözdiziminde girdi sayısı nve izin verilen sayı dizisi olarak girdiyi alır . Bir çözüm bulunamazsa döndürür .s(n)(s)undefined

6 haneye kadar hızlı bir şekilde çalışır, 7 için çalışabilir ve kesinlikle çok yavaş - ve hafızada aç - bunun ötesinde olabilir.

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

Ölçek


Aynen, belki de farklı bir primallik sınavı haricinde ne yapardım.
Yolumun seninle

@ETHproductions Özyinelemeli bir ilkelite testiyle başladım ancak 4 basamakla sınırlandırılabilirdi (ya da bazı tarayıcılarda belki biraz daha fazla olabilir?)
Arnauld

Özyinelemeli bir çözüm için ilk düşüncem dört bayt daha kısa, ancak büyük sayılar için hata veriyor. Ben vardın=>s=>[...Array(10**n).keys()].find(i=>eval(`/[${s}]{${n}}/`).test(i)&(p=j=>i%--j?p(j):j==1)(i))
ETHproductions

@ETHproductions Ben de yerine && kullanmak isteniyordu. Ancak performans bilge, bu çok pahalı bir bayt.
Arnauld,

"Enable-javascript-harmony" bayrağını etkinleştirirseniz, Chrome'un geçerli sürümü TCO'yu destekler (yalnızca chrome: // flags seçeneğine gidin ve bu seçeneği bulun)
ETHproductions

4

Jöle , 12 bayt

DL×ÆP
ṗḌÇÐṀṂ

Komut satırı argümanları olarak bir set ve bir tamsayı alır. Bir çözüm yoksa 0 yazdırır .

Çevrimiçi deneyin!

Nasıl çalışır

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

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

Burada dene!

Hiçbir değer bulunamazsa sonsuza kadar çalışır


@Okx şimdi tüm test durumlarının tümü değilse bile en hızlı şekilde çalışacak kadar hızlı olmalıdır
Blue

@Okx, bir zaman sınırı olmadan tam olarak test etmek istiyorsanız Pyke'yi indirip çevrimdışı çalıştırabileceğinizi biliyor musunuz?
Mavi,

Ay pardon. Kod olduğunu sanıyordum. Zaman aşımının yaklaşık dört saniye olduğu ve çok fazla olmadığı ortaya çıktı.
Okx

3

Mathematica, 64 bayt

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

İlk argümanın izin verilen sayıların (sıralanmış) listesi ve ikinci argümanın izin verilen uzunluk olduğu saf işlev. Tuples@##izin verilen uzunluktaki izin verilen basamakların tüm listelerini hesaplar, sonra FirstCasehangisinin x:{f_,___}ilk basamağın folmadığı 0ve tamsayının y=FromDigits@xasal olduğu ve onunla değiştirileceği şekilde eşleşenleri buluruz y.


2
/;Testi bir tuple seçmek için nasıl kullandığınız ve aynı zamanda :>istenen çıktı formatına dönüştürdüğünüzde harika bir şey. (! O izin verildiğini bu belgelerde görüyorum ama sadece bu cevabı okuduktan sonra) Eğer fonksiyon sıralanabilir izin basamak gerektirdiğini belirtmelidir: Yanlış cevap verir 3331yerine 3313olmadan çağrılırsa [{3,1},4].
Greg Martin,

@ngenisis nasıl Select[FromDigits/@Tuples[Sort@#,#2],PrimeQ][[1]]&@@#&?
martin,

@martin Bu, başlangıçtaki tupleri hesaba katmaz 0ve @@#&gereksiz görünüyor.
ngenis,

@ngenisis üzgünüm - hesaba katmadı
martin

3

Brachylog , 15 bayt

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

Çevrimiçi deneyin!

Bu oldukça yavaş.

açıklama

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 bayt

Körleme sözdizimi yoluyla girdi alır, örn. (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>

Sıkı modda çalıştırılmak üzere ( kuyruk çağrısı optimizasyonu [TCO] ). Ortamınız TCO'yu desteklemiyorsa, ortam yığınından daha büyük olan primerler için yığın taşması hatasına neden olur.

Geçersiz girişler için sonsuza dek çalışacaktır.

Not:

  • Chrome (> = 51) kullanıcıları chrome://flags/#enable-javascript-harmony, yukarıdaki snippet'i TCO desteğiyle çalıştırmasını sağlamak için bu bayrağa gidebilir ve bu bayrağını etkinleştirebilir.
  • Safari (> = 10) TCO'yu destekliyor

İki byte ile tasarruf edebileceğinizi düşünüyorumF=i=>(P=j=>i%--j?P(j):1==j)(i)&&...
ETHproductions

@ETHproductions Sıkı modda çalıştırılması gerektiğinden (yığın taşmasını önlemek için) ve bu global bir P değişkeni yarattığı için olamaz.
George Reith

Oh, TCO'nun sadece katı modda uygulandığını bilmiyordum.
ETHproductions

@ETHproductions Aye, XD'de yayınlanan teknik özellikleri okuyana kadar, cevaptaki ilk varyasyonum geçersiz olduğunu fark edinceye kadar bu kısayolu kullandı.
George Reith

2

MATL, 17 bayt

wlwX"1GXNUStZp)l)

Bu fonksiyon iki girişi kabul eder, rakam sayısını belirten bir tamsayı ve olası değerleri gösteren bir karakter dizisi. Asal olmaması durumunda, bir hata gösterilir.

Çevrimiçi Deneyin!

açıklama

        % 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

Adaçayı, 62 bayt

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

Formun girdisini alır: f( 4 , {'1','2'} )


1

Perl 6 , 43 bayt

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

Hiçbir çözüm yoksa sonsuza kadar çalışır.


giriş formatı nedir?
Okx

1
@Okx: İki argüman alan bir lambdadır: Bir sayı n ve bir liste k.
22

1

05AB1E , 17 bayt

[¾Øмg¹QiS²Kg0Qiq

Çevrimiçi deneyin!

[¾Ø ¼             # 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 bayt (-1 @Riley)

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

Çevrimiçi deneyin!

[                   # 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
,Sonunda ihtiyacın olduğunu sanmıyorum .
Riley,

@Riley güzel çağrı!
Magic Octopus Urn

0

Perl5, 77 bayt

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

Bu şekilde koş:

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

0

Ruby, 77 76 bayt

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

Giriş formatı: bir sayı ve bir dize.

Örnek:

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

0

Perl 6 , 68 bayt

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

Dene

NilBöyle bir üssü bulunamazsa döndürür .

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 bayt

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

Çevrimiçi deneyin

Giriş gibidir 4,{'1','2'}.


1,{'1'}geçerli bir giriş değil (1 asal olmadığından), bu yüzden orada ne istersen yapabilirsin.

Ah, doğru. Teşekkürler.
mbomb007

0

PHP, 82 bayt

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

Komut satırı argümanlarından bir sayı ve rakam dizisi alır. İle koş -nr.

Yıkmak

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 bayt

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

32-bit, yukarıda numaraları destekleyerek + 2 bayt (değiştirildi intiçin long)

Giriş formatı: Bir tamsayı (yani 4) ve bir Dize (yani "12")

Açıklama:

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
}

Test kodu:

Burada dene.
NOT: İkinci test durumu çok uzun süre döngüye girdiğinden devre dışı bırakılmıştır.

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

Çıktı:

2111
115151
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.