Số nguyên tố n chữ số nhỏ nhất chỉ chứa các chữ số này


26

Bạn sẽ cần tạo số nguyên tố nhỏ nhất có nchữ số và nó sẽ chỉ chứa các chữ số được chỉ định trong danh sách k.

Ví dụ:

Đầu vào:

4
1 2

Đối với điều này, bạn phải tạo số nguyên tố nhỏ nhất có 4chữ số và số nguyên tố đó chỉ phải chứa các chữ số 12.

Đầu ra:

2111

Đầu vào:

10
0 4 7 

Đầu ra:

4000000007

Đầu vào:

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

Đầu ra:

115151

Bạn có thể đảm bảo rằng đầu vào sẽ luôn ở định dạng bạn chỉ định và bạn có thể làm bất cứ điều gì nếu bạn nhận được đầu vào không hợp lệ (chẳng hạn như đầu vào là một chữ số n, không có k.)

Nếu không có giải pháp nào cho đầu vào tồn tại, chương trình của bạn được phép thực hiện bất kỳ thao tác nào sau đây:

  • In banana
  • Ném lỗi
  • Chạy mãi
  • Còn gì nữa không

Vì đây là , hãy cố gắng nhắm đến đoạn mã ngắn nhất.

Đầu vào có thể ở bất kỳ định dạng nào bạn chỉ định. Ví dụ, nếu bạn muốn đầu vào của bạn giống như bất kỳ điều nào sau đây, điều đó là tốt.

4
[1, 2]

[1,2]4

1,2
4

4 12

Bạn có thể viết một chương trình hoặc một hàm và nó phải trả về giá trị đúng hoặc in nó.

Khoảng trắng được phép ở bất cứ đâu.

Thử thách này lấy cảm hứng từ A036229 .


2
Câu hỏi bắt buộc: Chúng tôi có thể sử dụng bất kỳ cơ sở? (Thử thách dễ dàng hơn nhiều trong unary.)
flawr

Giải pháp có thể có các số 0 đứng đầu không nếu 0 là một trong các chữ số đầu vào?
Luis Mendo

@flawr tất nhiên là không, tôi nghĩ nó có thể xuất hiện dưới những sơ hở tiêu chuẩn (nếu không, nó cần phải được thêm vào)
Okx

1
@LuisMendo tôi sẽ không tính đó là số 'thích hợp', nên không.
Okx

Danh sách có thể là một tập hợp theo nghĩa đen? Và nhân vật thay vì số nguyên? (Câu trả lời Python của @ xnor đang sử dụng những câu đó)
mbomb007 17/2/2017

Câu trả lời:


4

Brachylog (2), 8 byte

j₍oᵐ∋ᵐcṗ

Hãy thử trực tuyến!

Rất chậm về các vấn đề mà có rất nhiều khả năng con số, hoặc có chứa một 0 trong tập hợp các thể chữ số (nó làm việc trong trường hợp này, nó chỉ là nó quá chậm nhiều mà TIO lần ra trừ của vấn đề rất đơn giản). Như thường lệ đối với Brachylog, đây là một chức năng, không phải là một chương trình đầy đủ.

Đầu vào được lấy theo định dạng [ndigits,[list of digits]], ví dụ [10,[[0,4,7]]].

Giải trình

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

Nhìn từ quan điểm khai báo thuần túy, điều này nói rằng "tìm một số nguyên tố, với số chữ số đã cho, trong đó tất cả các chữ số là một trong các chữ số đã cho". Để tìm số nhỏ nhất như vậy, chúng tôi sử dụng gợi ý thứ tự đánh giá để đảm bảo thứ tự kiểm tra các số từ nhỏ nhất đến lớn nhất; trong trường hợp này, làm cho các quyết định gần đầu danh sách ít bị thay đổi hơn các quyết định gần cuối (đây là thứ tự tự nhiên của nó, xảy ra giống như từ vựng và do đó là số thứ tự trên các số nguyên), và do đó {o∋}ᵐcó hai thứ tự đánh giá gợi ý, "thay đổi vài chữ số cuối trước" (từ thứ tự tự nhiên) là gợi ý quan trọng hơn và "kiểm tra các chữ số nhỏ hơn trước các chữ số lớn hơn" (từ otrước, hoạt động như một gợi ý trong bối cảnh này) như là tiebreak. {o∋}ᵐcó thể được viết là tương đương oᵐ∋ᵐđể lưu một byte.



9

Python 2 , 66 byte

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)

Hãy thử trực tuyến!

Đưa đầu vào như thế nào f(3,{'9','3','8'}).

Python không có sẵn các số nguyên tố, do đó, hàm tạo ra chúng bằng Định lý Wilson để kiểm tra lần lượt từng giá trị tiềm năng để ktrở thành số nguyên tố.

Bất đẳng thức 10**~-n<p%k*k<s>=set(`k`)kết hợp ba điều kiện trên k:

  • 10**~-n<k: kchứa ít nhất các nchữ số. Chúng tôi không cần kiểm tra chính xác vì nếu chúng tôi đạt được nhiều chữ số hơn, chắc chắn không có giải pháp nào
  • p%k>0: klà số nguyên tố, thông qua điều kiện Định lý Wilson với p=(n-1)!^2. Vì p%klà 0 hoặc 1, điều này có thể được kết hợp với điều kiện trước đó là10**~-n<p%k*k
  • s>=set(`k`): Tất cả các chữ số trong ktập hợp s. Điều này có thể được ghép vào vì Python 2 coi các tập hợp lớn hơn số.

Nếu dòng điện kkhông thỏa mãn tất cả những thứ này, thì hàm sẽ lặp lại k+1, thêm 1 vào đầu ra kết quả. Vì đầu ra kết thúc Truebằng 1kbắt đầu từ 1, đầu ra là k. Theo dõi song song các knhịp xuất ktrực tiếp vào thành công.


Wow - công dụng tuyệt vời của Định lý Wilson!
Chandler Watson

5

JavaScript (ES7), 100 byte

Lấy đầu vào là số chữ số nvà chuỗi chữ số được phép strong cú pháp currying (n)(s). Trả về undefinednếu không tìm thấy giải pháp.

Hoạt động khá nhanh với tối đa 6 chữ số, có thể hoạt động trong 7 và chắc chắn là quá chậm - và bộ nhớ đói - vượt quá điều đó.

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

Kiểm tra


Chính xác những gì tôi sẽ làm, ngoại trừ có thể với một bài kiểm tra nguyên thủy khác. Tôi sẽ thấy cách của tôi so sánh với bạn ...
Sản phẩm ETH

@ETHproductions Tôi đã bắt đầu với một bài kiểm tra tính nguyên thủy đệ quy nhưng nó sẽ giới hạn ở 4 chữ số (hoặc có thể thêm một chút trên một số trình duyệt?)
Arnauld

Suy nghĩ đầu tiên của tôi cho một giải pháp đệ quy ngắn hơn bốn byte, nhưng nó gây ra lỗi cho số lượng lớn. Tôi đã cón=>s=>[...Array(10**n).keys()].find(i=>eval(`/[${s}]{${n}}/`).test(i)&(p=j=>i%--j?p(j):j==1)(i))
ETHproductions

@ETHproductions Tôi cũng bị cám dỗ sử dụng & thay vì &&. Nhưng hiệu suất khôn ngoan, đây là một byte rất tốn kém.
Arnauld

Phiên bản hiện tại của Chrome hỗ trợ TCO nếu bạn bật cờ "enable-javascript-hòa hợp" (chỉ cần truy cập chrome: // flags và tìm tùy chọn đó)
ETHproductions 9/2/2017

4

Thạch , 12 byte

DL×ÆP
ṗḌÇÐṀṂ

Lấy một tập hợp và một số nguyên làm đối số dòng lệnh. In 0 nếu không có giải pháp tồn tại.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

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

Hãy thử nó ở đây!

Chạy mãi mãi nếu không tìm thấy giá trị


@Okx bây giờ phải đủ nhanh để chạy hầu hết nếu không phải tất cả các trường hợp thử nghiệm ngay bây giờ
Blue

@Okx bạn có biết rằng bạn có thể tải xuống Pyke và chạy ngoại tuyến nếu bạn muốn kiểm tra đầy đủ mà không giới hạn thời gian không?
Màu xanh

Ồ xin lỗi. Tôi nghĩ đó là mã. Hóa ra thời gian chờ là khoảng bốn giây không nhiều lắm.
Okx

3

Toán học, 64 byte

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

Hàm thuần túy trong đó đối số thứ nhất là danh sách (được sắp xếp) các chữ số được phép và đối số thứ hai là độ dài được phép. Tuples@##tính toán tất cả các danh sách các chữ số được phép có độ dài cho phép, sau đó chúng tôi tìm thấy các chữ số FirstCasekhớp với x:{f_,___}chữ số đầu tiên fkhông phải 0là số nguyên và y=FromDigits@xlà số nguyên tố và thay thế nó bằng y.


2
Thật tuyệt vời khi bạn sử dụng /;thử nghiệm để chọn một tuple nhưng cũng :>chuyển đổi sang định dạng đầu ra mong muốn. (Tôi thấy trong tài liệu được phép, nhưng chỉ sau khi đọc câu trả lời này!) Bạn nên xác định rằng hàm của bạn yêu cầu các chữ số được phép được sắp xếp: nó đưa ra câu trả lời sai 3331thay vì 3313nếu được gọi bằng [{3,1},4].
Greg Martin

@ngenisis thì sao Select[FromDigits/@Tuples[Sort@#,#2],PrimeQ][[1]]&@@#&?
martin

@martin Điều đó không giải thích cho các bộ dữ liệu bắt đầu bằng 0@@#&có vẻ dư thừa.
ngenisis

@ngenisis xin lỗi - không tính đến điều đó
martin

3

Brachylog , 15 byte

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

Hãy thử trực tuyến!

Điều này khá chậm.

Giải trình

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 byte

Đưa đầu vào thông qua cú pháp currying, ví dụ: (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>

Được chạy ở chế độ nghiêm ngặt (để tối ưu hóa cuộc gọi đuôi [TCO] ). Nếu môi trường của bạn không hỗ trợ TCO, nó sẽ dẫn đến lỗi tràn ngăn xếp đối với các số nguyên tố lớn hơn ngăn xếp môi trường.

Đối với đầu vào không hợp lệ, nó sẽ chạy mãi mãi.

Chú thích:

  • Người dùng Chrome (> = 51) có thể truy cập chrome://flags/#enable-javascript-harmonyvà bật cờ này để chạy đoạn trích trên với sự hỗ trợ của TCO.
  • Safari (> = 10) hỗ trợ TCO

Tôi nghĩ bạn có thể lưu hai byte vớiF=i=>(P=j=>i%--j?P(j):1==j)(i)&&...
ETHproductions

@ETHproductions Không thể vì nó phải được chạy ở chế độ nghiêm ngặt (để tránh tràn ngăn xếp) và điều đó tạo ra một biến toàn cầu P.
George Reith

Ồ, tôi đã không nhận ra TCO chỉ được áp dụng ở chế độ nghiêm ngặt.
Sản xuất ETH

@ETHproductions Aye tôi cũng vậy, cho đến khi tôi đọc thông số tôi đã đăng XD, biến thể đầu tiên của câu trả lời đã sử dụng phím tắt đó cho đến khi tôi nhận ra nó không hợp lệ.
George Reith

2

MATL, 17 byte

wlwX"1GXNUStZp)l)

Hàm này chấp nhận hai đầu vào, một số nguyên chỉ định số chữ số và mảng ký tự chỉ ra các giá trị có thể. Trong trường hợp không có số nguyên tố, một lỗi được hiển thị.

Hãy thử trực tuyến!

Giải trình

        % 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 byte

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

Có đầu vào của mẫu: f( 4 , {'1','2'} )


1

Perl 6 , 43 byte

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

Chạy mãi nếu không có giải pháp tồn tại.


định dạng đầu vào là gì?
Okx

1
@Okx: Đó là một lambda có hai đối số: Một số n và một danh sách k.
smls

1

05AB1E , 17 byte

[¾Øмg¹QiS²Kg0Qiq

Hãy thử trực tuyến!

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

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

Chạy như thế này:

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

0

Ruby, 77 76 byte

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

Định dạng đầu vào: một số và một chuỗi.

Thí dụ:

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

0

Perl 6 , 68 byte

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

Thử nó

Trả về Nilnếu không có số nguyên tố như vậy có thể được tìm thấy.

Mở rộng:

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

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

Dùng thử trực tuyến

Đầu vào là như thế 4,{'1','2'}.


1,{'1'}không phải là đầu vào hợp lệ (vì 1 không phải là số nguyên tố), vì vậy bạn có thể làm bất cứ điều gì bạn thích ở đó.

Ô đung rôi. Cảm ơn.
mbomb007

0

PHP, 82 byte

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

Lấy một số và một chuỗi các chữ số từ các đối số dòng lệnh. Chạy với -nr.

phá vỡ

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 byte

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 byte bằng cách hỗ trợ các số trên 32 bit (đã đổi intthành long)

Định dạng đầu vào: Một số nguyên (tức là 4) và Chuỗi (tức là "12")

Giải trình:

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
}

Mã kiểm tra:

Hãy thử nó ở đây.
LƯU Ý: Trường hợp thử nghiệm thứ hai bị vô hiệu hóa vì nó lặp trong một thời gian rất dài ..

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

Đầu ra:

2111
115151
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.