이 숫자 만 포함하는 가장 작은 n 자리 소수


26

n숫자로 가장 작은 소수를 생성해야 하며 list에 지정된 숫자 만 포함합니다 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
필수 질문 : 우리는 어떤 기초를 사용할 수 있습니까? (
단순한

0이 입력 숫자 중 하나 인 경우 솔루션에 선행 0이있을 수 있습니까?
Luis Mendo

물론 @flawr, 나는 그것이 표준 허점 아래에 올 수 있다고 생각합니다 (그렇지 않으면 추가해야합니다)
Okx

1
@LuisMendo 나는 그것을 '적절한'숫자로 계산하지 않을 것입니다.
Okx

목록을 리터럴로 설정할 수 있습니까? 그리고 정수 대신 문자? (@xnor의 Python 답변에서 사용 중)
mbomb007

답변:


4

Brachylog (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

파이썬 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'})받습니다.

파이썬에는 소수에 대한 기본 제공 기능이 없으므로 함수는 Wilson의 정리 를 사용하여 소수를 생성하여 각 잠재적 값을 k차례로 검사합니다 .

연쇄 불평등 10**~-n<p%k*k<s>=set(`k`)은 다음 세 가지 조건을 결합합니다 k.

  • 10**~-n<k: k최소 n자릿수를 포함합니다. 더 많은 자릿수에 도달하면 해결책이 없었으므로 정확하게 확인할 필요는 없습니다.
  • p%k>0: k와 윌슨 정리 조건을 통해 소수입니다 p=(n-1)!^2. 이후 p%k0 또는 1이고, 이것은 이전의 조건으로 결합 될 수있다10**~-n<p%k*k
  • s>=set(`k`):의 모든 숫자 k가 세트에 s있습니다. 파이썬 2는 집합을 숫자보다 큰 것으로 간주하기 때문에 이것이 접합 될 수 있습니다.

전류 k가 이들 모두를 만족하지 않으면 함수는로 반복되어 k+11을 결과 출력에 추가합니다. 출력하여 종료 이후 True에 해당하는 1k에서 시작 1출력이다 k. 이 k비트의 병렬 추적은 k성공시 직접 출력 됩니다.


와우-윌슨 정리의 굉장한 사용!
챈들러 왓슨

5

자바 스크립트 (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 자리로 제한했거나 일부 브라우저에서는 더 많을 수 있습니다.
Arnauld

재귀 솔루션에 대한 나의 첫 번째 생각은 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 나도 && 대신 &를 사용하고 싶었습니다. 그러나 성능면에서 이것은 매우 비용이 많이 드는 바이트입니다.
Arnauld

"enable-javascript-harmony"플래그를 활성화하면 Chrome의 현재 버전이 TCO를 지원합니다 (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

@Okx 시간 제한없이 Pyke를 다운로드하여 완전히 테스트하려면 오프라인으로 실행할 수 있다는 것을 알고 있습니까?
Blue

미안 나는 그것이 코드라고 생각했다. 시간 초과가 약 4 초인 것으로 나타났습니다.
Okx

3

Mathematica, 64 바이트

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

첫 번째 인수가 허용 된 자릿수의 (정렬 된) 목록이고 두 번째 인수가 허용 된 길이 인 순수 함수입니다. Tuples@##허용 된 길이의 허용 된 자릿수의 모든 목록을 계산 한 다음 첫 번째 숫자 가 아니고 정수 가 소수 가 되도록 FirstCase일치하는 것을 찾아서 바꿉니다 .x:{f_,___}f0y=FromDigits@xy


2
/;테스트를 사용하여 튜플을 선택 :>하고 원하는 출력 형식으로 변환 하는 방법이 멋집니다 . (문서에서 허용되지만이 답변을 읽은 후에 만 ​​알 수 있습니다!) 함수에서 허용 된 숫자를 정렬하도록 지정해야합니다 .로 호출 된 경우 3331대신 잘못된 답변을 제공합니다 . 3313[{3,1},4]
Greg Martin

@ngenisis 어때요 Select[FromDigits/@Tuples[Sort@#,#2],PrimeQ][[1]]&@@#&?
martin

@martin 시작하는 튜플을 설명하지 않고 중복 0되는 @@#&것으로 보입니다.
ngenisis

@ngenisis 죄송합니다-그것을 설명하지 않았습니다
martin

3

Brachylog , 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

자바 스크립트 (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를 지원합니다

나는 당신이 2 바이트를 절약 할 수 있다고 생각합니다F=i=>(P=j=>i%--j?P(j):1==j)(i)&&...
ETHproductions

@ETHproductions은 (피하기 스택 오버 플로우) 엄격 모드에서 실행되는이 때문에 수없고 그 전역 변수 P. 생성
조지 Reith는

오, 나는 엄격 모드에서만 적용되는 TCO를 몰랐다.
ETHproductions

@ETHproductions Aye는 내가 XD에 게시 한 사양을 읽을 때까지 대답의 첫 번째 변형이 잘못된 것을 알 때까지 해당 바로 가기를 사용했습니다.
George Reith

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

펄 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


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

펄 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

파이썬 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

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

상기 32 비트 수를 지원하여 +2 바이트 (변경 int으로 long)

입력 형식 : 정수 (ie 4) 및 문자열 (ie"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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.