หมายเลขกักกันหลัก (ฉบับกอล์ฟ)


21

นี่คือลำดับA054261

TH จำนวนบรรจุสำคัญเป็นจำนวนต่ำสุดที่มีคนแรกที่ตัวเลขที่สำคัญเป็นสตริง ตัวอย่างเช่นหมายเลขเป็นจำนวนต่ำสุดซึ่งมี 3 ช่วงแรกเป็นสตริงย่อยทำให้เป็นหมายเลขหลักสำรองลำดับที่ 3nn235

มันไม่สำคัญที่จะเข้าใจว่าตัวเลขกักกันสี่ตัวแรกนั้นคือ , ,และแต่มันก็น่าสนใจมากขึ้น เนื่องจากไพรม์ถัดไปคือ 11 หมายเลขการกักกันไพรม์ถัดไปไม่ใช่แต่เป็นเนื่องจากมันถูกกำหนดให้เป็นหมายเลขที่เล็กที่สุดพร้อมด้วยคุณสมบัติ2232352357235711112357

อย่างไรก็ตามความท้าทายที่แท้จริงมาเมื่อคุณไปไกลกว่า 11 จำนวนบรรจุที่สำคัญต่อไปคือ113257โปรดทราบว่าในจำนวนนี้สตริงย่อยและ ทับซ้อนกัน จำนวนนี้ยังเป็นที่ทับซ้อนกันด้วยหมายเลข1132571113313

มันง่ายที่จะพิสูจน์ว่าลำดับนี้เพิ่มขึ้นเนื่องจากจำนวนถัดไปต้องเป็นไปตามเกณฑ์ทั้งหมดของตัวเลขก่อนหน้านั้นและมีซับสตริงอีกหนึ่งรายการ อย่างไรก็ตามลำดับจะไม่เคร่งครัดเพิ่มขึ้นเป็นที่แสดงโดยผลการและn=10n=11

อินพุต

จำนวนเต็มเดียวn>0(ฉันคิดว่าคุณอาจมีดัชนี 0 แล้วสร้างได้n>=0)

เอาท์พุต

อาจเป็นnหมายเลขการบรรจุหลักเฉพาะหรือรายการที่มีnหมายเลขการบรรจุเฉพาะหลักตัวแรก

ตัวเลขที่ฉันได้พบคือ:

 1 =>             2
 2 =>            23
 3 =>           235
 4 =>          2357
 5 =>        112357
 6 =>        113257
 7 =>       1131725
 8 =>     113171925
 9 =>    1131719235
10 =>  113171923295
11 =>  113171923295
12 => 1131719237295

โปรดทราบว่าn = 10และn = 11มีหมายเลขเดียวกันตั้งแต่เป็นจำนวนต่ำสุดซึ่งมีตัวเลขทั้งหมดแต่ก็ยังมีวันที่ 31113171923295[2,3,5,7,11,13,17,19,23,29]วันที่ 31

เนื่องจากนี่คือการทำเครื่องหมายรหัสกอล์ฟรับกอล์ฟ! อนุญาตให้ใช้วิธีแก้ไขปัญหาแบบบังคับเดรัจฉานได้ แต่รหัสของคุณจะต้องใช้งานได้กับทุกทฤษฎี มีความสุขในการเล่นกอล์ฟ!

คำตอบ:


11

05AB1E , 8 ไบต์

∞.ΔIÅpåP

ลองออนไลน์!

คำอธิบาย

           # from
∞          # a list of infinite positive integers
 .Δ        # find the first which satisfies the condition:
       P   # all
   IÅp     # of the first <input> prime numbers
      å    # are contained in the number

ตัวPดำเนินการสร้างการแมปที่ชัดเจนเพื่อตรวจสอบหมายเลขเฉพาะในหมายเลข (แทนที่จะตรวจสอบว่าหมายเลขอยู่ในอาร์เรย์ของช่วงเวลา) หรือไม่ นี่เป็นวิธีแก้ปัญหาที่สวยงามฉันสงสัยว่าคุณสามารถแก้ปัญหาด้วยการใช้คำสั่งน้อยลง
maxb

@maxb Pเป็นผลิตภัณฑ์ มันเป็นพื้นคูณค่าทั้งหมดในรายการ Åpจะสร้างรายการกับครั้งแรกnปริมาณของจำนวนเฉพาะที่nเป็นการป้อนข้อมูลIในกรณีนี้ åจะตรวจสอบแต่ละหมายเลขในรายการของช่วงเวลานี้ถ้าพวกเขาอยู่ในปัจจุบันจำนวนของรายการที่ไม่มีที่สิ้นสุดที่จะให้1สำหรับ truthy และ0สำหรับ falsey ดังนั้นผลิตภัณฑ์โดยทั่วไปจะตรวจสอบว่าทั้งหมดเป็นจริงหรือไม่; หากจำนวนทั้งหมดอยู่ในจำนวนปัจจุบัน หากมีค่าใด 0 Pผลลัพธ์จะเป็นเท็จเช่นกัน แต่ถ้าเป็น1เช่นนั้นPผลลัพธ์จะเป็นจริงและ-loop จะหยุด
Kevin Cruijssen

@KevinCruijssen ฉันเห็นแล้วขอบคุณสำหรับคำอธิบาย!
สูงสุด

1
ทางออกที่ดีมากที่ใช้เวอร์ชั่นใหม่! ผมมี 8 ไบต์เช่นกัน แต่ในรุ่นมรดกของ 1µNIÅpåP05AB1E: สำหรับผู้ที่ไม่ทราบว่า 05AB1E คำอธิบายสำหรับฉันเช่นกัน: - จนกระทั่งตัวแปรตัวนับถึง 1 (เริ่มต้นที่ 0 เพิ่มขึ้นNทีละ 1 และดำเนินการ: NIÅpåP- ตรวจสอบว่าช่วง <input> แรกทั้งหมดปรากฏในNและหรือไม่ ถ้าเป็นเช่นนั้นให้เพิ่มตัวแปรตัวนับอัตโนมัติคืนค่าสุดท้ายของ N.
Mr. Xcoder

@ Mr.Xcoder: นั่นเป็นจริงรุ่นแรกของฉันเช่นกัน (กับXแทน1, เพราะเหตุผล) แต่ฉันเปลี่ยนไปนี้ตั้งแต่ฉันไม่เคยมีโอกาสที่จะใช้ก่อน :)
Emigna

5

เยลลี่ 11 ไบต์

³ÆN€ẇ€µẠ$1#

ลองออนไลน์!

แรงเดรัจฉานง่าย ๆ ไม่แน่ใจว่า#arity ทำงานอย่างไรดังนั้นอาจมีห้องสำหรับการปรับปรุง

มันทำงานอย่างไร

³ÆN€ẇ€µẠ$1#    Main link. Input: Index n.
         1#    Find the first natural number N that satisfies:
³ÆN€             First n primes...
    ẇ€           ...are substrings of N
      µẠ$        All of them are true

"แก้ไขภายใต้ตัวกรองพร้อมเงื่อนไข" อาจทำงานแทน "เงื่อนไขจริงสำหรับทุกคน"
user202729

2
wⱮẠ¥1#ÆN€บันทึกสองไบต์
เดนนิส

5

Java 8, 143 ไบต์

n->{int r=1,f=1,c,i,j,k;for(;f>0;r++)for(i=2,f=c=n;c>0;c-=j>1?1+0*(f-=(r+"").contains(j+"")?1:0):0)for(j=i++,k=2;k<j;)j=j%k++<1?0:j;return~-r;}

ลองออนไลน์
หมายเหตุ:

  1. n=7หมดเวลาดังกล่าวข้างต้น
  2. ให้เวลาและทรัพยากรอย่างเพียงพอจะใช้งานได้สูงสุดn=9เนื่องจากขนาด จำกัดint(สูงสุด2,147,483,647)
    • ด้วยการเปลี่ยน +4 ไบต์intเป็น alongค่าสูงสุดจะเพิ่มขึ้นเป็นเอาต์พุตด้านล่าง9,223,372,036,854,775,807(ประมาณn=20ฉันคิดว่า?)
    • โดยการใช้java.math.BigIntegerค่าสูงสุดสามารถเพิ่มขนาดใดก็ได้ (ในทางทฤษฎี) แต่มันจะอยู่ที่ประมาณ 200 ไบต์อย่างน้อยเนื่องจากการใช้คำฟุ่มเฟื่อยของjava.math.BigIntegerวิธีการ ..

คำอธิบาย:

n->{                   // Method with integer as both parameter and return-type
  int r=1,             //  Result-integer, starting at 1
      f=1,             //  Flag-integer, starting at 1 as well
      c,               //  Counter-integer, starting uninitialized
      i,j,k;           //  Index integers
  for(;f>0;            //  Loop as long as the flag is not 0 yet
      r++)             //    After every iteration, increase the result by 1
    for(i=2,           //   Reset `i` to 2
        f=c=n;         //   Reset both `f` and `c` to the input `n`
        c>0;           //   Inner loop as long as the counter is not 0 yet
        c-=            //     After every iteration, decrease the counter by:
           j>1?        //      If `j` is a prime:
            1          //       Decrease the counter by 1
            +0*(f-=    //       And also decrease the flag by:
                   (r+"").contains(j+"")?
                       //        If the result `r` contains the prime `j` as substring
                    1  //         Decrease the flag by 1
                   :   //        Else:
                    0) //         Leave the flag the same
           :           //      Else:
            0)         //       Leave the counter the same
      for(j=i++,       //    Set `j` to the current `i`,
                       //    (and increase `i` by 1 afterwards with `i++`)
          k=2;         //    Set `k` to 2 (the first prime)
          k<j;)        //    Inner loop as long as `k` is smaller than `j`
        j=j%k++<1?     //     If `j` is divisible by `k`
           0           //      Set `j` to 0
          :            //     Else:
           j;          //      Leave `j` the same
                       //    (If `j` is unchanged after this inner-most loop,
                       //     it means `j` is a prime)
  return~-r;}          //  Return `r-1` as result

5

JavaScript (ES6),  105 ... 92  91 ไบต์

n=>(k=1,g=(s,d=k++)=>n?k%d--?g(s,d):g(d?s:s+`-!/${n--,k}/.test(n)`):eval(s+';)++n'))`for(;`

ลองออนไลน์!

อย่างไร?

n

"-!/2/.test(n)-!/3/.test(n)-!/5/.test(n)-!/7/.test(n)-!/11/.test(n)..."

n

eval('for(;' + <conditions> + ';)++n')

แสดงความคิดเห็น

n => (                             // main function taking n
  k = 1,                           // k = current prime candidate, initialized to 1
  g = (s,                          // g = recursive function taking the code string s
          d = k++) =>              //     and the divisor d
    n ?                            // if n is not equal to 0:
      k % d-- ?                    //   if d is not a divisor of k:
        g(s, d)                    //     recursive call to test the next divisor
      :                            //   else:
        g(                         //     recursive call with s updated and d undefined:
          d ?                      //       if d is not equal to 0 (i.e. k is composite):
            s                      //         leave s unchanged
          :                        //       else (k is prime):
            s +                    //         decrement n and add to s
            `-!/${n--,k}/.test(n)` //         the next condition based on the prime k
                                   //       the lack of 2nd argument triggers 'd = k++'
        )                          //     end of recursive call
    :                              // else (n = 0):
      eval(s + ';)++n')            //   complete and evaluate the code string
)`for(;`                           // initial call to g with s = [ "for(;" ]


4

Pyth , 14 ไบต์

n>5

f@I`M.fP_ZQ1y`

ลองออนไลน์!

f@I`M.fP_ZQ1y`     Full program. Q is the input.
f                  Find the first positive integer that fulfils the condition.
 @I`M.fP_ZQ1y`     Filtering condition, uses T to refer to the number being tested.
     .f   Q1       Starting at 1, find the first Q positive integers (.f...Q1) that
       P_Z         Are prime.
   `M              Convert all of those primes to strings.
  I                Check whether the result is invariant (i.e. doesn't change) when...
 @          y`     Intersecting this list with the powerset of T as a string.

Pyth , 15 ไบต์

เร็วขึ้นเล็กน้อย แต่อีก 1 ไบต์

f.A/L`T`M.fP_ZQ

ลองออนไลน์!

f.A/L`T`M.fP_ZQ     Full program. Q is the input.
f                   Find the first positive integer that fulfils the condition.
 .A/L`T`M.fP_ZQ     Filtering condition, uses T to refer to the number being tested.
         .f   Q     Starting at 1, find the first Q positive integers (.f...Q) that
           P_Z      Are prime.
       `M           Convert all of those primes to strings.
 .A/L               And make sure that they all (.A) occur in (/L)...
     `T             The string representation of T.


3

ถ่าน 42 ไบต์

≔¹ηW‹LυIθ«≦⊕η¿¬Φυ¬﹪ηκ⊞υη»≔¹ηWΦυ¬№IηIκ≦⊕ηIη

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

≔¹ηW‹LυIθ«≦⊕η¿¬Φυ¬﹪ηκ⊞υη»

สร้างnหมายเลขเฉพาะตัวแรกโดยแบ่งการทดลองของจำนวนเต็มทั้งหมดโดยจำนวนเฉพาะทั้งหมดที่พบก่อนหน้านี้

≔¹ηWΦυ¬№IηIκ≦⊕η

วนซ้ำจำนวนเต็มทั้งหมดจนกว่าเราจะพบหนึ่งซึ่งประกอบด้วยช่วงเวลาทั้งหมดเป็นสตริงย่อย

Iη

ส่งผลลัพธ์เป็นสตริงและพิมพ์โดยนัย

ความเร็วของโปรแกรมสามารถเพิ่มเป็นสองเท่าด้วยค่าไบต์โดยแทนที่ค่าสุดท้าย≦⊕ηด้วย≦⁺²ηแต่ก็ยังช้าเกินกว่าจะคำนวณn>6ได้


3

Perl 6 , 63 59 ไบต์

-4 ไบต์ต้องขอบคุณ nwellnhof

{+(1...->\a{!grep {a~~!/$^b/},(grep &is-prime,2..*)[^$_]})}

ลองออนไลน์!

การแก้ปัญหากำลังดุร้ายที่หมดเวลากับ TIO สำหรับตัวเลขที่สูงกว่า 5 แต่ฉันค่อนข้างมั่นใจว่ามันทำงานได้อย่างถูกต้อง ค้นหาตัวเลขบวกแรกที่มีnจำนวนเฉพาะ นี่เป็นวิธีการแก้ปัญหาn=6ที่ไม่ได้หมดเวลาสำหรับ

คำอธิบาย:

{                                                             } # Anonymous code block
 first                                                    2..*  # Find the first number
       ->\a{                                            }       # Where:
            !grep     # None of
                                                   [^$_]  # The first n
                              (grep &is-prime,2..*)       # primes
                  {a~~!/$^b/},   # Are not in the current number

คุณมีวิธีการตรวจสอบผลลัพธ์สำหรับตัวเลขที่มากขึ้นหรือเพิ่มคำอธิบายหรือไม่? ฉันไม่คล่องแคล่วใน Perl และแน่นอนฉันไม่คล่องในการเล่นกอล์ฟ Perl ฉันหมดเวลากับ TIO สำหรับอินพุต 5 ดังนั้นฉันจึงไม่สามารถตรวจสอบได้จริง ๆ ว่ามันไม่ได้เป็นเพียงการต่อเชื่อมกับช่วงเวลา
สูงสุด

@maxb ฉันได้เพิ่มลิงก์ไปยังโซลูชันที่สร้างช่วงเวลาล่วงหน้าแทนที่จะทำซ้ำแล้วซ้ำเล่าและคำอธิบาย
Jo King


2

Python 2 , 91 ไบต์

n=input();l=[]
P=k=1
while~-all(`x`in`k`for x in(l+[l])[:n]):P*=k*k;k+=1;l+=P%k*[k]
print k

ลองออนไลน์!


หากฉันไม่ทราบว่ารหัสของคุณสร้างหมายเลขเฉพาะฉันจะไม่สามารถทราบได้ว่าเป็นเช่นนั้น เยี่ยมมาก!
สูงสุด

2

SAS, 149 ไบต์

data p;input n;z:i=1;a=0;v+1;do while(a<n);i+1;do j=2 to i while(mod(i,j));end;if j=i then do;a+1;if find(cat(v),cat(i))=0 then goto z;end;end;cards; 

อินพุตถูกป้อนตามcards;คำสั่งดังนี้:

data p;input n;z:i=1;a=0;v+1;do while(a<n);i+1;do j=2 to i while(mod(i,j));end;if j=i then do;a+1;if find(cat(v),cat(i))=0 then goto z;end;end;cards; 
1
2
3
4
5
6
7

เอาต์พุตชุดข้อมูลpพร้อมผลลัพธ์vพร้อมแถวเอาต์พุตสำหรับแต่ละค่าอินพุต เทคนิคควรใช้กับกรณีทดสอบที่กำหนดทั้งหมด (จำนวนเต็มสูงสุดที่มีความแม่นยำสูงสุดใน SAS คือ 9,007,199,254,740,992) แต่ฉันยอมแพ้หลังจากให้มันคิด 5 นาทีใน n = 8

คำอธิบาย:

data p;
input n; /* Read a line of input */

z: /* Jump label (not proud of this) */
    i=1; /* i is the current value which we are checking for primality */
    a=0; /* a is the number of primes we've found so far */
    v+1; /* v is the final output value which we'll look for substrings in */ 

    do while(a<n); /* Loop until we find the Nth prime */
        i+1; 
        do j=2 to i while(mod(i,j));end; /* Prime sieve: If mod(i,j) != 0 for all j = 2 to i, then i is prime. This could be faster by only looping to sqrt(i), but would take more bytes */
        if j=i then do; /* If i is prime (ie, we made it to the end of the prime sieve)... */
            a+1;
            if find(cat(v),cat(i))=0 then goto z; /* If i does not appear as a substring of v, then start all over again with the next v */
        end;
    end;

/* Input values, separated by newlines */
cards; 
1
2
3
4
5
6
7

1

Haskell , 102 ไบต์

import Data.List
f n|x<-[2..n*n]=[a|a<-[2..],all(`isInfixOf`show a).take n$show<$>x\\((*)<$>x<*>x)]!!0

ลองออนไลน์!

คำอธิบาย / Ungolfed

เนื่องจากเราได้Data.Listนำเข้าแล้วเราก็อาจใช้มันแทนของเก่าที่ดีtake n[p|p<-[2..],all((>0).mod p)[2..p-1]]เราสามารถใช้วิธีอื่นในการสร้างช่วงเวลาทั้งหมดที่เราต้องการ กล่าวคือเราสร้างคอมโพสิตในปริมาณที่เพียงพอและใช้สิ่งเหล่านี้ร่วมกับ(\\):

[2..n*n] \\ ( (*) <$> [2..n*n] <*> [2..n*n] )

n*nπ(n)<n2เข้าสู่ระบบ(n2)

[ a | a <- [2..], all (`isInfixOf` show a) . take n $ enoughPrimes ] !!0

1

Japt 20 20ไบต์

ไกลจากงานที่ดีที่สุดของฉันฉันแค่ดีใจที่ได้ทำงานหลังจากวันที่ฉันมี ฉันแน่ใจว่าฉันจะจบลงด้วยการเคาะลงไปที่เหล้าในภายหลัง!

_õ fj ¯U e!øZs}aUÄ

ลองใช้ - ใช้เวลา 13 วินาทีในการป้อนข้อมูล7และโยนสั่นไปเรื่อย ๆ หลังจากนั้น (เวอร์ชั่นที่อัปเดตออกมา5สำหรับฉัน แต่นั่นอาจเป็นเพียงโทรศัพท์ของฉัน)


@Oliver อืม ... ฉันเหมือนกัน มันทำงานได้แน่นอนเมื่อฉันโพสต์ เพิ่งรันการทดสอบด้วยF.h()ตนเองและดูเหมือนว่าจะพัง ETH จะต้องเปลี่ยนบางสิ่งบางอย่าง
Shaggy

@Oliver ไม่การกระทำครั้งสุดท้ายเมื่อ 2 วันที่แล้วดังนั้นไม่มีอะไรเปลี่ยนแปลงตั้งแต่ฉันโพสต์สิ่งนี้ แปลก!
Shaggy

มันใช้งานได้แล้ว! ¯ \ _ (ツ) _ / ¯
โอลิเวอร์

@Oliver ยังคงไม่ทำงานสำหรับฉัน Weirderer และ weirderer!
Shaggy

มันได้ผลสำหรับฉันตั้งแต่ฉันทำงานจากคอมพิวเตอร์ที่ทำงานไปยังคอมพิวเตอร์ที่บ้าน แปลกจริง ๆ !
โอลิเวอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.