ความท้าทายจำนวนเต็มเชิงลบของคำสั่งซื้อ แต่เป็นเวลาหลัก!


12

ฉันกำลังพูดถึงคำถามนี้ลองดูสิถ้าคุณสับสน

งานหลัก

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

ตัวอย่าง:

1
21
321
5321
75321
1175321
Valid output:
1213215321753211175321

อินพุต

รหัสของคุณอาจรับเพียงหนึ่งอินพุตเท่านั้น: ค่าสูงสุดที่จะพิมพ์ อินพุตนี้สามารถมาจากที่ใดก็ได้ (กราฟิก, STDIN) คุณมั่นใจได้ว่าการป้อนข้อมูลเป็นจำนวนเฉพาะ

เอาท์พุต

คุณจะต้องส่งออกหมายเลขผลลัพธ์ คุณสามารถรับหมายเลขนี้ได้โดยนับถอยหลังนับเฉพาะตัวเลขหากเป็นจำนวนเฉพาะแล้วเชื่อมต่อผลลัพธ์ทั้งหมดเข้าด้วยกันเป็นหนึ่งหมายเลข 7, 5, 3, 2, 1ต้องพิมพ์หมายเลข "แถว" สุดท้าย (เช่น) ทั้งหมด ผลลัพธ์อาจเป็นอะไรก็ได้ (ตัวเลขสตริงกราฟิก) ตราบใดที่สามารถอ่านได้ รูปแบบ Regex เดียวกันสำหรับตรวจสอบกรณีทดสอบของคุณจะนำไปใช้:

^(\D*(\d)+\D*|)$

หากผลลัพธ์ของคุณไม่ตรงกับรูปแบบนี้รหัสของคุณจะไม่ถูกต้อง

กฎระเบียบ

  • อินพุตมั่นใจได้ว่าจะดีเลิศไม่รวมถึงการจัดการข้อผิดพลาดเว้นแต่คุณต้องการ / จำเป็น
  • ผลลัพธ์อาจเป็นหมายเลขที่เชื่อมต่อเต็มเท่านั้นดังนั้นจึงไม่แยกตามอะไรเลยแม้แต่บรรทัดใหม่
  • อัลกอริทึมของคุณไม่ควรตรวจสอบตัวอย่างแรกของการNปรากฏ (ตัวอย่างเช่น17ใน1175321) แต่สำหรับตัวอย่างแรกของNจำนวนที่เกิดขึ้นจริง
  • ข้อมูลที่คุณป้อนเข้าสู่ระบบเป็นบวกอย่าเพิ่มการจัดการเว้นแต่คุณต้องการ / จำเป็น

กรณีทดสอบ

Input: -2, 0
Output: Any, or none (number isn't positive)

Input: 9
Output: Any, or none (number isn't prime)

Input: 1
Output: 1

Input: 7
Output: 121321532175321

Input: 23
Output: 1213215321753211175321131175321171311753211917131175321231917131175321

ผู้ชนะ

นี่คือดังนั้นผู้เขียนรหัสที่มีความยาวน้อยที่สุดเป็นไบต์จะชนะ!


8
ฉันจะไม่แนะนำให้เปลี่ยนความท้าทาย แต่ฉันไม่คิดว่า1มันจะเป็นคำนิยามที่ดีที่สุด
Erik the Outgolfer

3
1. การมีกรณีทดสอบ1ขัดแย้งกับสเป็คโดยตรงซึ่ง " มั่นใจ " ว่าหมายเลขอินพุตจะเป็นไพรม์ 2. สเป็คเอาท์พุทดูเหมือนจะมีความขัดแย้งและความกำกวมหลายอย่าง " แถวสุดท้าย" แถว "(เช่น 7, 5, 3, 2, 1) จะต้องพิมพ์เต็ม " - ดังนั้นคนอื่นจะไม่? " รูปแบบ Regex เดียวกันสำหรับตรวจสอบกรณีทดสอบของคุณใช้ " แต่ " ผลลัพธ์อาจเป็นตัวเลขที่เชื่อมต่อเต็มเท่านั้นดังนั้นจึงไม่แยกจากสิ่งใด " ขัดแย้งกับ regex แต่เร็กคอร์ดนั้นหลบอย่างชัดเจนเพราะมันอนุญาตให้มีสตริงว่างและไม่มีอินพุตที่สามารถให้สิ่งนั้นได้
Peter Taylor

1
1. " อนุญาตให้ขึ้นบรรทัดใหม่ที่ต่อท้ายหนึ่งบรรทัด " ซ้ำซ้อน / ไม่สอดคล้องกับรูปแบบ regex ที่อนุญาตให้ใช้อักขระต่อท้ายจำนวนเท่าใดก็ได้ 2. ประโยคคำนำ " งานของคุณคือส่งออกจำนวนเต็ม " ทำให้เข้าใจผิดเนื่องจากคุณขอให้ส่งออกหมายเลขเดียวในภายหลัง 3. คำอธิบายทั้งหมดของลำดับและผลลัพธ์นั้นทำให้เกิดความสับสน - โดยทั่วไปผู้คนจะต้องย้อนกลับวิศวกรรมสิ่งที่คุณหมายถึงโดยการศึกษาตัวอย่าง (รายชื่อลำดับและกรณีทดสอบ) ความท้าทายครั้งสุดท้ายก็มีปัญหาเหล่านี้เช่นกันและฉันก็พูดถึงสิ่งเหล่านี้ในการแก้ไขที่แนะนำซึ่งคุณปฏิเสธ ... :(
smls

5
อะไรคือจุดมุ่งหมายในการทำให้ 1 เป็นนายก?
Xanderhall

1
จำนวนเต็มคำสั่งเชิงลบที่มีความท้าทาย แต่ทุกครั้งที่มันเป็นนายกมันจะเร็วขึ้น;)
SplittyDev

คำตอบ:


5

เยลลี่ขนาด 9 ไบต์

ÆR1;;\UFV

ลองออนไลน์!

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

ÆR1;;\UFV  Main link. Argument: n

ÆR         Prime range; yield all primes up to n.
  1;       Prepend the "prime" 1.
    ;\     Cumulative concatenation; yield all prefixes of the prime range.
      U    Upend; reverse each prefix.
       F   Flatten the resulting 2D array.
        V  Eval. This casts the integer array to string first, thus concatenating
           the integers.

ฉันรู้ว่าฉันเรียนรู้การตีกอล์ฟลึกเกินไปเมื่อฉันอ่านเยลลี่เพื่อทำความเข้าใจกับคำถามแทนที่จะเป็นรอบ ๆ (อันที่จริงแล้วมันเป็นโปรแกรม Jelly ที่อ่านง่ายทีเดียวที่พวกเขาไปจุดที่สับสนเพียงอย่างเดียวสำหรับฉันคือกรณีพิเศษแปลก ๆVในรายการ)

5

กำลังประมวลผล 161 ไบต์

int p(int n){for(int k=1;++k<=sqrt(n);)if(n%k<1)return 0;return 1;}void t(int n){for(int i=1,j;i<=n;i++){if(p(i)<1)continue;for(j=i;j>0;j--)print(p(j)<1?"":j);}}

ฟังก์ชั่นหนึ่งทำการตรวจสอบแบบดั้งเดิม เรียกมันว่าt(7)

Ungolfed

ฟังก์ชั่นแรกทำการตรวจสอบเบื้องต้น มันจะส่งกลับintแทนbooleanเพราะวิธีนี้จะถูกบันทึกไว้ไบต์มากขึ้น ( intแทนboolean, 0แทนfalse, 1แทนtrue)

int Q103891p(int n){
  for(int k=1;++k<=sqrt(n);)
    if(n%k<1)return 0;
  return 1;
}

ฟังก์ชั่นที่สองพิมพ์สตริง มันวนซ้ำทุกหมายเลขหากไม่ใช่จำนวนเฉพาะให้ข้ามไปยังรอบถัดไป ถ้ามันเป็นสิ่งที่สำคัญมันยังคงดำเนินต่อไปจนถึงการพิมพ์ภายใน - forลูปอื่น อีกครั้งถ้าจำนวนนั้นเป็นจำนวนมากเราจะพิมพ์ออกมาไม่ใช่อย่างนั้น

void Q103891(int n){
  for(int i=1,j;i<=n;i++){
    if(p(i)<1)continue;
    for(j=i;j>0;j--)
      print(p(j)<1?"":j);
  }
}

5

เยลลี่ 12 ไบต์

ÆR;@1
ÇÇ€UVV

ลองออนไลน์!

ถ้ามันไม่ได้เป็นสำหรับ1รหัสของฉันจะเป็นเพียงÆRÆRUVV7 ไบต์

ปรับปรุงคำอธิบาย:

ÇÇ€UVV Main link. Arguments: z.
Ç      Run link1 on z.
 ǀ    Run link1 on z's elements.
   U   Reverse z's elements.
    V  Flatten z.
     V Concatenate z's elements.

ÆR;@1 Link 1. Arguments: z.
ÆR    Range of primes [2..z].
    1 Integer: 1.
  ;@  Concatenate x to y.

ผู้ชายไอริช (เรียกว่า Dennis?) อย่างใดอย่างหนึ่งฉันoutgolfed lol


4

05AB1E , 19 ไบต์

LDpÏX¸ì€Lí˜ÐXQsp+ÏJ

ลองออนไลน์!

คำอธิบาย

L                     # range [1 ... input]
 DpÏ                  # keep only primes
    X¸ì               # prepend a 1
       €L             # map: range [1 ... n]
         í            # reverse each sublist
          ˜           # flatten list to 1D
           Ð          # triplicate
            XQ        # check elements in one copy for equality with 1
              sp      # check elements in one copy for primality
                +     # add the above lists giving a list with true values at indices
                      # comtaining 1 or a prime
                 Ï    # keep only those elements of the unmodified copy of the list
                  J   # join

ทึ่งกับDpÏคำสั่ง เยี่ยมมาก!
devRicher

2

Brachylogขนาด 17 ไบต์

y:{e1|e#p}f@[rcw\

ลองออนไลน์!

ดูเหมือนจะไม่สั้นกว่านั้น ...

คำอธิบาย

y                      The list [0, ..., Input]
 :{      }f            Find all...
   e1                     ...elements that are 1 (there is 1)...
     |                    ...or...
      e#p                 ...elements that are prime...
           @[          Take a prefix of the result
             rc        Reverse it and concatenate it into a number
               w       Write to STDOUT
                  \    Backtrack: try another prefix

2

GameMaker Language ขนาด 169 ไบต์

ฟังก์ชั่นหลัก (68 ไบต์)

b=""for(i=1;i<=argument0;i++){c=i while(j)b+=string(p(c--))}return b

ฟังก์ชั่น p (46 ไบต์)

for(a=0;a<argument0;a++)while q(++b){}return b

ฟังก์ชั่น q (55 ไบต์)

n=argument0 for(i=2;i<n;i++)if!(n mod i)p=1return p|n=1

ดีคนที่ใช้ GML
FireCubez

@FireCubez ขอบคุณ :) ฉันเคยใช้มันมาก มันเป็นภาษาโปรแกรมแรกที่ฉันเรียนรู้
Timtech


1

Perl 6 , 41 ไบต์

{[~] flat [\R,] 1,|grep *.is-prime,2..$_}

( ลองออนไลน์ )

คำอธิบาย:

  • 1, |grep(*.is-prime, 2..$_): ลำดับที่ 1 และช่วงเวลา ... (1 2 3 5)
  • [,] ...: ย่อ ("หมอบ") เหนือเครื่องหมายจุลภาค ... (1 2 3 5)
  • [\,] ...: ด้วยผลลัพธ์ระดับกลาง (การลดรูปสามเหลี่ยม ) ...((1) (1 2) (1 2 3) (1 2 3 5))
  • [\R,] ...: ใช้การย้อนกลับของตัวดำเนินการเมตากับเครื่องหมายจุลภาค ...((1) (2 1) (3 2 1) (5 3 2 1))
  • [~] flat ...: ลบการซ้อนรายชื่อและพับตัวดำเนินการ concat สตริง ... 1213215321

(นี่คือคำตอบของฉันสำหรับความท้าทายก่อนหน้านี้ )


1

Mathematica, 61 ไบต์

ToString/@(1<>Prime@Range[Range@PrimePi@#,0,-1]/.Prime@0->1)&

ฟังก์ชั่นที่ไม่ได้ตั้งชื่อจะรับอาร์กิวเมนต์จำนวนเต็มและส่งคืนสตริง (หากอินพุตไม่ใช่ไพร์มเพียงแค่ "ปัดเศษมันลง" เป็นไพร์มที่ใกล้ที่สุดถ้าอินพุตไม่เชิงลบก็จะแกล้งเป็น 1)

การใช้งานนี้ใช้เคล็ดลับที่น่ารังเกียจจากคำตอบของ Martin Ender สำหรับความท้าทายก่อนหน้านี้ที่คล้ายกัน (ใครบอกว่าสุนัขแก่ตัวนี้ไม่สามารถเรียนรู้เทคนิคใหม่ได้?): การเหยียดหยาม<>รายการจำนวนเต็มซ้อนกัน

รายการที่อยู่ในคำถามเริ่มต้นด้วยการสร้างรายการที่ซ้อนกันที่คล้ายกันเช่นเดียวกับในคำตอบนั้นด้วยความยาวที่เหมาะสม (กำหนดโดยPrimePi@#จำนวนของจำนวนเฉพาะถึงและรวมถึงการป้อนข้อมูล); จากนั้นPrimeนำไปใช้กับทุกองค์ประกอบ ตัวอย่างเช่นสำหรับอินพุต5ซึ่งเป็นไพรม์อันดับที่ 3 โค้ดRange[Range@PrimePi@#,0,-1]ให้ผลตอบแทน{{1,0},{2,1,0},{3,2,1,0}}และการใช้Primeกับแต่ละอิลิเมนต์ให้ผลตอบแทน{{2,Prime[0]},{3,2,Prime[0]},{5,3,2,Prime[0]}}ตั้งแต่ช่วงที่ 1, 2 และ 3 คือ 2, 3 และ 5 ตามลำดับ ผมรู้สึกภาคภูมิใจที่ฉันจัดการเพื่อเพิ่มข้อผิดพลาดมากขึ้นเพื่อมาร์ตินพลิกแนวทาง Mathematica Prime[0]บ่นทุกครั้งที่มันเขียน

Prime[0]ไม่ใช่สิ่ง แต่ไม่เป็นไร: /.Prime@0->1เปลี่ยนพวกเขาทั้งหมดเป็น1s และเราต้องการ1ด้านหน้าด้วยดังนั้นเราจึงแทนที่""คำตอบของ Martin Ender ด้วยคำง่ายๆ1ซึ่งจริง ๆ แล้วช่วยประหยัดไบต์


0

PHP, 72 ไบต์

for(;$n<$argv[1];print$s=$n.$s)for($i=2;$i>1;)for($i=++$n;--$i&&$n%$i;);

เรียกใช้ปัญญา -r

แตกหัก

for(;$n<$argv[1];               // loop $n up to argument:
    print$s=$n.$s)                  // 2. prepend $n to $s, print $s
    for($i=2;$i>1;)                 // 1. find next prime: break if $i<2
        for($i=++$n;--$i&&$n%$i;);      // if $n is prime, $i is 1 after loop (0 for $n=1)

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