เครื่องกำเนิดจำนวนดัชนีการเปลี่ยนแปลงที่น่าสนใจของบรรณารักษ์ของ Crazy Librarian


13

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

เริ่มต้นด้วยลำดับของตัวเลขธรรมชาติใน base-10, N

0, 1, 2, 3, 4, 5, 6 ...

ไม่รวม0และ1ทุกหมายเลขในลำดับนี้จะเป็นจำนวนเฉพาะP

2, 3, 5, 7, 11, 13 ...

หรือคอมโพสิตC

4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20 ...

สะท้อนให้เห็นถึงวิธีการที่บรรณารักษ์คิดที่จะใส่ตัวเลขจำนวนเต็มในการขยายทศนิยมของตัวเลขจากPครูสอนคณิตศาสตร์ได้สร้างฟังก์ชั่นG (x, y)ที่ใช้ตัวเลขxจากNด้วย1 <= x <= 9และจำนวนyจากCและแทรกxลงใน การขยายทศนิยมyในทุกตำแหน่งตามลำดับจากซ้ายไปขวาเลือกเฉพาะหมายเลขที่ไม่ซ้ำกัน

ยกตัวอย่างเช่นG (3,14)314, 134, 143คือ อย่างไรก็ตามG (1,14)เป็นเพียงแค่114, 141ว่าคุณเติมหรือใส่1เข้าไป14ในหมายเลขเดียวกัน114จะถูกสร้างขึ้น

ครูคณิตศาสตร์สงสัยว่ากี่ครั้งที่คุณต้องทำพีชคณิตเหล่านี้ก่อนที่คุณจะได้ตัวเลขที่เป็นPถ้าคุณxเพิ่มขึ้นตามลำดับ ครูคณิตศาสตร์นี้เรียกว่าดัชนีคอมโพสิตนายกรัฐมนตรีของจำนวนและเขียนเป็นดัชนีราคาผู้บริโภค (y)

ยกตัวอย่างเช่น4เพียงต้องการที่จะทำครั้งที่สอง: 14, 41ตั้งแต่41เป็นสำคัญดังนั้นดัชนีราคาผู้บริโภค (4)2คือ แต่8ต้องทำ 6 ครั้ง18, 81, 28, 82, 38, 83ก่อนที่จะถึง83เป็นจำนวนเฉพาะดังนั้นดัชนีราคาผู้บริโภค (8)6เป็น

งานของคุณคือการเขียนโค้ดที่จะแสดงดัชนีคอมโพสิต - ไพร์มนี้โดยระบุหมายเลขอินพุต

อินพุต

  • เลขจำนวนเต็มเดี่ยวyเช่นที่yอยู่ในCอินพุตผ่านฟังก์ชันอาร์กิวเมนต์ STDIN หรือเทียบเท่า
  • สำหรับวัตถุประสงค์ในการคำนวณคุณสามารถสมมติว่าyจะพอดีในช่วงจำนวนเต็มปกติ (เช่นสมมติว่า 2 31 -1 เป็นขอบเขตบน)
  • พฤติกรรมที่yไม่ได้อยู่ในCนั้นไม่ได้กำหนดไว้

เอาท์พุต

Composite-Prime Indexผลลัพธ์ซึ่งคำนวณตามที่อธิบายไว้ข้างต้นเอาต์พุตไปยัง STDOUT หรือเทียบเท่าโดยมีข้อยกเว้นสองประการ:

  • หากสุดท้ายการเปลี่ยนแปลง (เช่นการผนวก9การy) -1เป็นหนึ่งที่ส่งผลให้นายกเอาท์พุท y=14ตัวอย่างขยายตัวด้านล่างคือ
  • ถ้าไม่มีการเปลี่ยนแปลง (เช่นG (x, y)เป็นส่วนหนึ่งของCทั้งหมด1 <= x <= 9) 0เอาท์พุท y=20ตัวอย่างขยายตัวด้านล่างคือ

ตัวอย่าง

 y -> operations             : output
 4 -> 14, 41                 : 2
 6 -> 16, 61                 : 2
 8 -> 18, 81, 28, 82, 38, 83 : 6
 9 -> 19                     : 1
10 -> 110, 101               : 2
12 -> 112, 121, 212, 122, 312, 132, 123, 412, 142, 124, 512, 152, 125, 612, 162, 126, 712, 172, 127 : 19
14 -> 114, 141, 214, 124, 142, 314, 134, 143, 414, 144, 514, 154, 145, 614, 164, 146, 714, 174, 147, 814, 184, 148, 914, 194, 149 : -1
15 -> 115, 151               : 2
16 -> 116, 161, 216, 126, 162, 316, 136, 163 : 8
18 -> 118, 181               : 2
20 -> 120, 210, 201, 220, 202, 320, 230, 203, 420, 240, 204, 520, 250, 205, 620, 260, 206, 720, 270, 207, 820, 280, 208, 920, 290, 209 : 0

ข้อ จำกัด

  • นี่คือรหัสกอล์ฟเนื่องจากคุณจะต้องคัดลอกสิ่งนี้ไปยังบัตรดัชนีเพื่อให้บรรณารักษ์สามารถแสดงครูคณิตศาสตร์และมือของคุณเป็นตะคริวได้ง่าย
  • มีข้อ จำกัด ช่องโหว่มาตรฐาน บรรณารักษ์ไม่ยอมให้คนขี้โกง

ลีดเดอร์บอร์ด


สำหรับ 9 19คือไพร์มดังนั้นเอาต์พุตไม่ควรเป็น 1?
isaacg

ว้าวแผนภูมิคำตอบที่ยอดเยี่ยม!
แบบเรียงซ้อน

1
@ ซ้อนสไตล์ถ้าคุณหมายถึงลีดเดอร์บอร์ดที่ส่วนใหญ่มาร์ตินฝีมือ
AdmBorkBork

คำตอบ:



2

Haskell, 166 161 ไบต์

p n=mod(product[1..n-1]^2)n>0
q=p.read
n#c=[h++c:t|i<-[0..length n],(h,t)<-[splitAt i n]]
[y]%i|q y= -1|1<2=0
(y:z)%i|q y=i|1<2=z%(i+1)
f n=((n#)=<<['1'..'9'])%1 

ตัวอย่างการใช้งาน: f "8"-> 6, f "14"-> -1, ->f "20"0

มันทำงานอย่างไร: pเป็นการทดสอบเบื้องต้น (ถูกขโมยจากคำตอบของ @Mauris ในความท้าทายที่แตกต่าง) qwrapper สำหรับpการแปลงชนิดจากสตริงเป็นจำนวนเต็ม n # cแทรกในทุกตำแหน่งc รับรายการของตัวเลขและดัชนี เมื่อองค์ประกอบแรกของรายการเป็นสำคัญผลตอบแทนอื่น recure กับหางของรายการและ หยุดเมื่อมีองค์ประกอบเดียวที่เหลือและกลับมาถ้ามันเป็นนายกและอื่น ๆn%iii+1-10


1

Minkolang 0.11 , 85 ไบต์

n1(l*$d`)d9[i3G(0c2c$%$r2c*l*2c3c1+*++2gl:d2G)2gx1c2G3gx]r3XS(2M4&I)N.ikI1-4&1~N.1+N.

ลองที่นี่

คำอธิบาย (เร็ว ๆ นี้)

n            Take integer from input (say, n)
1(           Calculate smallest power of 10 greater than n (say, a)
  l*         Multiply by 10
    $d`      Duplicate stack and push n>a
       )     Close while loop (ends when n<=a)
        d    Duplicates a (let's call it b)

9[                                                 For loop that runs 9 times 
  i1+                                              Loop counter + 1 (say, i)
     3G                                            Puts the loop counter in position 3
       (                                           Opens while loop
        0c2c$%                                     Copies n and b and pushes n//b, n%b
              $r                                   Swaps top two elements of stack
                2c*l*                              Copies b and multiplies by 10
                     2c3c*                         Copies b and i and multiplies them
                          ++                       Adds it all together (inserts i)
                            2gl:                   Gets b and divides by 10
                                d2G                Duplicates and puts one copy back
                                   )               Closes while loop (breaks when b=0)
                                    2gx            Gets and dumps b
                                       1c2G        Copies a and puts it in b's place
                                           3gx     Get and dumps i
                                              ]    Close for loop

r       Reverses stack
 3X     Dumps the top three elements (namely, n, a, and b)
   S    Removes duplicates

(                           Opens while loop
 2M                         Pushes 1 if top of stack is prime, 0 otherwise
   4&                       Jump four spaces if prime
     I)N.                   If the loop actually finishes, then all were composite,
                             so output 0 and stop.
         ik                 Pushes loop counter and breaks
           I1-              Pushes length of stack minus 1 (0 if last one was prime)
              4&1~N.        If this is 0, pushes -1, outputs as integer, and stops.
                    1+N.    Adds 1, outputs as integer, and stops.

1

Javascript, 324 ไบต์

y=>(p=(n,c)=>n%c!=0?c>=n-1?1:p(n,++c):0,u=a=>a.filter((c,i)=>a.indexOf(c)==i),g=(x,y)=>u(((x,y,z)=>z.map((c,i)=>z.slice(0,i).join("")+x+z.slice(i).join("")).concat(y+x))(x,y,y.split(''))),h=(x,y)=>g(x,y).concat(x==9?[]:h(++x,y)),i=h(1,y).reduce((r,c,i)=>r?r:p(c,2)?i+1:0,0),console.log(p(y,2)||y<2?'':i==h(1,y).length?-1:i))

หากไม่ได้อยู่ใน C เอาต์พุต STDOUT จะว่างเปล่า

คำอธิบาย

y=>(
    //Prime Test function
    p=(n,c)=>n%c!=0?c>=n-1?1:p(n,++c):0,

    //Unique function
    u=a=>a.filter((c,i)=>a.indexOf(c)==i),

    //Generates numbers from a couple x and y
    g=(x,y)=>u(((x,y,z)=>z.map((c,i)=>z.slice(0,i).join("")+x+z.slice(i).join("")).concat(y+x))(x,y,y.split(''))),

    //Generates all possible numbers from y using recusion
    h=(x,y)=>g(x,y).concat(x==9?[]:h(++x,y)),

    //Check if any prime in the generated numbers
    i=h(1,y).reduce((r,c,i)=>r?r:p(c,2)?i+1:0,0),

    console.log(
        //Is Y in C ?
        p(y,2)||y<2?
            ''
            :
            // Check if the answer is not the last one
            i==h(1,y).length?-1:i)
    )

อาจจะดึกมากในการแสดงความคิดเห็นนี้ แต่คุณไม่สามารถบันทึกไม่กี่ไบต์โดยการแทนที่n%c!=0ด้วยn%c; c>=n-1ด้วยc>n-2; และx==9ด้วยx-9?
Zacharý
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.