บางช่วงเวลาเหงา


10

ฉันรู้ฉันรู้ แต่เป็นอีกช่วงเวลาที่ท้าทาย ...

ที่เกี่ยวข้อง

โดดเดี่ยว A (หรือแยก) ที่สำคัญเป็นจำนวนที่สำคัญpดังกล่าวว่าp-2, p+2, p-4, p+4... p-2k, p+2kสำหรับบางคนkเป็นคอมโพสิตทั้งหมด เราเรียกนายกคนนี้ว่านายกนายกk- โดดเดี่ยวครั้ง

ตัวอย่างเช่นนายกที่แยกได้ครั้งที่ 5 คือ211เนื่องจากทั้งหมด201, 203, 205, 207, 209, 213, 215, 217, 219, 221ประกอบด้วยคอมโพสิต ( p-2*5=201, p-2*4=203ฯลฯ )

ท้าทาย

ได้รับสองจำนวนเต็มการป้อนข้อมูลn > 3และk > 0การส่งออกที่เล็กที่สุดkที่สำคัญ nTH-ครั้งแยกว่าเป็นอย่างเคร่งครัดมีขนาดใหญ่กว่า

ตัวอย่างเช่นสำหรับk = 5ใด ๆ และnในช่วงที่4 ... 210ผลผลิตที่ควรจะเป็น211ตั้งแต่ที่ 5 nครั้งแยกนายกเล็กที่สุดอย่างเคร่งครัดมีขนาดใหญ่กว่าการป้อนข้อมูล

ตัวอย่าง

n=55 k=1
67

n=500 k=1
503

n=2100 k=3
2153

n=2153 k=3
2161

n=14000 k=7
14107

n=14000 k=8
14107

กฎระเบียบ

  • หากเป็นไปได้คุณสามารถสันนิษฐานได้ว่าอินพุต / เอาต์พุตจะพอดีกับภาษาของคุณ Integer
  • อินพุตและเอาต์พุตจะได้รับโดยวิธีการที่สะดวกใด
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น หากฟังก์ชั่นคุณสามารถส่งคืนผลลัพธ์มากกว่าการพิมพ์
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการตีกอล์ฟตามปกติและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

นายกที่โดดเด่นครั้งที่ 3 เป็นนายกรัฐมนตรีที่โดดเด่นครั้งที่ 2 หรือไม่?
Erik the Outgolfer

@EriktheOutgolfer สองกรณีทดสอบสุดท้ายดูเหมือนว่าจะยืนยันอย่างแน่นอน
Kevin Cruijssen

1
@KevinCruijssen กรณีทดสอบไม่ได้เป็นส่วนหนึ่งของข้อกำหนดความท้าทาย
Erik the Outgolfer

1
@EriktheOutgolfer ใช่, kth-times-isolated ยังตามนิยาม, k-1th, k-2th, ฯลฯ
AdmBorkBork

@AdmBorkBork แค่ต้องการตรวจสอบขอบคุณ
Erik the Outgolfer

คำตอบ:


3

เยลลี่ , 17 13 ไบต์

_æR+⁼ḟ
‘ç1#Ḥ}

ลองออนไลน์!

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

‘ç1#Ḥ}  Main link. Left argument: n. Right argument: k

‘       Increment; yield n+1.
    Ḥ}  Unhalve right; yield 2k.
 ç1#    Call the helper link with arguments m = n+1, n+2, ... and k until 1 one
        them returns a truthy value. Return the matching [m].


_æR+⁼ḟ  Helper link. Left argument: m. Right argument: k

_       Subtract; yield m-2k.
   +    Add; yield m+2k.
 æR     Prime range; yield the array of primes in [m-2k, ..., m+2k].
     ḟ  Filterfalse; yield the elements of [m] that do not occur in [k], i.e., [m]
        if m ≠ 2k and [] otherwise.
        The result to the left will be non-empty when m = 2k, as there always is
        a prime in [0, ..., 2m], since m > n > 3.
    ⁼   Test the results to both sides for equality.
        This yields 1 iff m is the only prime in [m-2k, ..., m+2k].

3

Husk , 13 ไบต์

ḟ§=;ofṗM+ṡD⁰→

ลองออนไลน์!

คำอธิบาย

ค่อนข้างตรงไปตรงมา

ḟ§=;ofṗM+ṡD⁰→  Inputs are k and n.
            →  Increment n
ḟ              and find the first number m >= n+1 such that:
         ṡD⁰    Take symmetric range [-2k,..,2k].
       M+       Add m to each.
    ofṗ         Keep those that are prime.
 §=             Check equality with
   ;            the singleton [m].

2

Java 8, 144 143 ไบต์

(n,k)->{for(k*=2;;)if(p(++n)>1){int i=-k;for(;i<=k&p(n+i)<2|i==0;i+=2);if(i>k)return n;}}int p(int n){for(int i=2;i<n;n=n%i++<1?0:n);return n;}

คำอธิบาย:

ลองออนไลน์

(n,k)->{                      // Method with two integer parameters and integer return-type
  for(k*=2;                   //  Multiply `k` by 2
      ;)                      //  Loop indefinitely
    if(p(++n)>1){             //   Increase `n` by 1 before every iteration with `++n`
                              //   And if it's a prime:
      int i=-k;for(;i<=k      //    Loop `i` from `-k` to `k` (inclusive)
        &p(n+i)<2|i==0;       //    As long as `n+i` is not a prime (skipping `n` itself)
        i+=2);                //    And iterate in steps of 2 instead of 1
      if(i>k)                 //    If we've reached the end of the loop:
        return n;}}           //     We've found our result, so return it

// Separated method to check if `n` is a prime
// `n` is a prime if it remained unchanged, and not when it became 0 or 1
int p(int n){for(int i=2;i<n;n=n%i++<1?0:n);return n;}


2

Stax , 14 ไบต์

åΣ▀ë F▬&■º↔╔^∞

เรียกใช้และแก้ไขข้อบกพร่อง

นี่คือตัวแทน ASCII ที่สอดคล้องกัน

w^x:r{Hn+|p_!=m0#

w                   while; run the rest of the program until a falsy value remains
 ^                  increment candidate value.
  x:r               [-x, ..., -1, 0, 1, ... x] where x is the first input
     {        m     map using block, using k from -x to x
      Hn+           double and add to candidate value - this is "p+2k"
         |p         is it prime? produces 0 or 1
           _!       k is zero?
             =      two values are equal; always true for a passing candidate
               0#   any falses left after mapping? if so, continue running

2

JavaScript (Node.js) , 94 92 89 ไบต์

f=(n,k)=>(Q=y=>y<-k||(P=(a,b=2)=>a>b?a%b&&P(a,b+1):1)(n+2*y)^!!y&&Q(--y))(k,++n)?n:f(n,k)

ลองออนไลน์!

สนามกอล์ฟต่อไปจะจบลงอย่างล้นหลาม ใช้งานได้เฉพาะขนาด 14000 เท่านั้น

ในที่สุดหนึ่งกอล์ฟที่จะไม่จบลงด้วยสแต็คล้นที่ 14000

คำอธิบาย

f=(n,k)=>            // Two inputs
 (Q=y=>              // Function checking whether all numbers in 
                     // [n-2*k, n+2*k] except n are all composite
  y<-k               // The counter runs from k to -k
                     // If none breaks the rule, return true
  ||(P=(a,b=2)=>     // Function checking primality
   a>b?              // Check if a>b
   a%b&&P(a,b+1)     // If a>b and a%b==0 return false, else proceed
   :1                // If a<=b return 1 (prime)
  )(n+2*y)^!!y       // If n+2*y is prime, then y must be 0
                     // If n+2*y is not prime, then y must be non-zero
                     // If none of the conditions are met, return false
  &&Q(--y)           // Else proceed to the next counter
 )
 (k,++n)?            // Add 1 to n first, then start the check
 n                   // If conditions are met, return n
 :f(n,k)             // Else proceed to the next n.


1

Ruby + -rprime, 73 71 61 57 ไบต์

->n,k{n+=1;(-k..k).all?{|i|(i*2+n).prime?^(i!=0)}?n:redo}

ลองออนไลน์!

รู้สึกดีที่ได้เรียนรู้! ฉันใช้Integer#[]และredoเทคนิคที่ฉันเรียนรู้ที่นี่ใน PPCG การหลงทางในเทคนิควัชพืชที่สนุกสนาน ...

-1 ไบต์: ใช้n%2แทนn[0]เพื่อให้ได้บิตที่สำคัญน้อยที่สุด ขอบคุณAsone Tuhid !

-1 ไบต์: ใช้ตัวดำเนินการที่ประกอบไปด้วยแทนนิพจน์บูลีน ขอบคุณAsone Tuhid !

-10 ไบต์: ใช้ตัวดำเนินการ XOR เพื่อหลีกเลี่ยงการพิมพ์.prime?สองครั้ง ... นี่เป็นคำตอบเดียวกับAsone Tuhidเช่นเดียวกับฉันตอนนี้ :)

-4 ไบต์: nไม่มีอันตรายในการตรวจสอบแม้กระทั่งค่าของ Asone Tuhidไม่หยุดนิ่ง

Ungolfed:

->n,k{
  n += 1;                   # Increment n
  (-k..k).all?{|i|          # In the set [n-2*k, n+2*k], is every number
    (i*2+n).prime? ^ (i!=0) #    EITHER prime XOR different from n itself?
  } ? n                     # If yes, return the current value of n
  : redo                    # Otherwise, restart the block
}

1
การตั้งค่าสถานะไม่จำเป็นต้องรวมอยู่ในจำนวนไบต์อีกต่อไป แต่ละภาวนาแยกต่างหากจากธงถือว่าแทนภาษาที่แตกต่างกัน ดังนั้นคำตอบนี้ควรเป็นRuby + -rprime, 73 bytes
Mr. Xcoder

โอ้น่ารัก! ขอบคุณที่ทำให้ฉันอยู่กับ meta, @ Mr.Xcoder
benj2240

1
71 ไบต์ n%2สั้นกว่าn[0]ในกรณีนี้และ?...:สามารถสั้นกว่า&&...||
Asone Tuhid




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