จำนวน n หลักที่เล็กที่สุดที่มีเฉพาะตัวเลขเหล่านี้


26

คุณจะต้องสร้างนายกเล็กที่สุดด้วยตัวเลขและมันจะมีตัวเลขที่ระบุไว้ในรายการnk

ตัวอย่าง:

การป้อนข้อมูล:

4
1 2

สำหรับนี้คุณต้องสร้างนายกเล็กที่สุดด้วย4ตัวเลขและที่สำคัญต้องมีเพียงตัวเลขและ12

เอาท์พุท:

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
คำถามบังคับ: เราสามารถใช้ฐานใด ๆ ได้หรือไม่ (ความท้าทายนั้นง่ายกว่ามากในฝ่ายเดียว)
ข้อบกพร่อง

วิธีการแก้ปัญหาสามารถมีศูนย์นำถ้าศูนย์เป็นหนึ่งในตัวเลขหลัก?
Luis Mendo

@ flawr แน่นอนไม่ฉันคิดว่ามันอาจมาภายใต้ช่องโหว่มาตรฐาน (หากไม่จำเป็นต้องเพิ่ม)
Okx

1
@ LuisMendo ฉันจะไม่นับว่าเป็นหมายเลข 'ถูกต้อง' ดังนั้นไม่
Okx

รายการสามารถตั้งค่าตามตัวอักษรได้หรือไม่? และตัวอักษรแทนจำนวนเต็ม? (คำตอบ Python ของ @ xnor ใช้คำเหล่านั้นอยู่)
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ᵐ∋ᵐกับการบันทึกไบต์


12

แพคเกจ Bash + bsd-game ขนาด 28 ไบต์

  • บันทึกแล้ว 18 ไบต์ด้วย @Dennis
primes 1|egrep -wm1 [$2]{$1}

อินพุตที่กำหนดที่บรรทัดรับคำสั่งเป็น n ตามด้วย k เป็นรายการหลักที่ไม่มีการคั่น

ลองออนไลน์


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 ไม่มี built-in สำหรับ primes ดังนั้นฟังก์ชั่นจึงสร้างขึ้นโดยใช้ทฤษฎีบทของ 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%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 หลัก (หรืออาจจะมากกว่าในเบราว์เซอร์บางส่วน?)
Arnauld

ความคิดแรกของฉันสำหรับโซลูชันแบบเรียกซ้ำนั้นสั้นกว่าสี่ไบต์ แต่มันจะทำให้เกิดข้อผิดพลาดสำหรับจำนวนมาก ฉันมี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

Chrome เวอร์ชันปัจจุบันสนับสนุน TCO หากคุณเปิดใช้งานการตั้งค่าสถานะ "enable-javascript-harmony" (เพียงไปที่ 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

Pyke, 18 16 ไบต์

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

ลองที่นี่!

รันตลอดไปหากไม่พบค่าใด ๆ


@Okx ตอนนี้น่าจะเร็วพอที่จะรันได้มากที่สุดถ้าไม่ใช่ทุกกรณีทดสอบตอนนี้
Blue

@Okx คุณรู้หรือไม่ว่าคุณสามารถดาวน์โหลด Pyke และเรียกใช้แบบออฟไลน์หากคุณต้องการทดสอบอย่างเต็มที่โดยไม่ จำกัด เวลา
บลู

โอ้ขอโทษ. ฉันคิดว่ามันเป็นรหัส ปรากฎว่าหมดเวลาประมาณสี่วินาทีซึ่งไม่มาก
Okx

3

Mathematica, 64 ไบต์

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

ฟังก์ชั่นบริสุทธิ์ที่อาร์กิวเมนต์แรกคือรายการ (เรียง) ของตัวเลขที่อนุญาตและอาร์กิวเมนต์ที่สองคือความยาวที่อนุญาต Tuples@##คำนวณรายชื่อทั้งหมดของตัวเลขที่ได้รับอนุญาตของความยาวที่ได้รับอนุญาตแล้วเราพบว่าFirstCaseที่ตรงx:{f_,___}ดังกล่าวว่าหลักแรกfไม่ได้0และจำนวนเต็มคือนายกรัฐมนตรีและแทนที่มันด้วยy=FromDigits@xy


2
มันยอดเยี่ยมมากที่คุณใช้การ/;ทดสอบเพื่อเลือกสิ่งอันดับ แต่ยัง:>แปลงเป็นรูปแบบผลลัพธ์ที่ต้องการ (ผมเห็นในเอกสารที่ที่ได้รับอนุญาต แต่หลังจากที่ได้อ่านคำตอบนี้) คุณควรระบุว่าการทำงานของคุณต้องใช้ตัวเลขที่ได้รับอนุญาตเพื่อจะแยก: มันจะช่วยให้คำตอบที่ผิด3331แทนถ้าเรียกว่ามี3313 [{3,1},4]
เกร็กมาร์ติน

@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

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

เพื่อให้ทำงานในโหมดเข้มงวด (สำหรับการปรับtail call [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
George Reith

โอ้ฉันไม่ได้ตระหนักถึง TCO ที่ใช้ในโหมดเข้มงวดเท่านั้น
ETHproductions

@ETHproductions ใช่ฉันไม่ได้จนกว่าฉันจะอ่านข้อมูลจำเพาะที่ฉันโพสต์ 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

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

@Riley โทรดี!
Magic Octopus Urn

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

Ruby, 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 bytes

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.