ตัวแปรหลัก“ ฝาแฝด”


18

ฉันเป็นฝาแฝดกับพี่ชายของฉัน 2/3 คือเกิดในวันเดียวกันของเดือนเดียวกัน แต่สิบสองปีต่อมา เมื่อฉันอายุ 5 ขวบเขาอายุ 17 ทั้งสองช่วง คู่สุดท้ายของอายุที่เราสามารถไว้ใจได้คือ [71, 83] โดยที่เราทั้งคู่ยังมีชีวิตอยู่และสามารถเฉลิมฉลองวโรกาสที่บังเอิญนี้ได้

งาน

สร้างรหัสที่

  • ใช้จำนวนเต็มสองจำนวนเป็นอินพุต: ความแตกต่างระหว่างตัวนับและ "แฝด" เป็นจำนวนเต็มบวกk (ดีใช่ฉันอายุน้อยกว่า) และขอบเขตบนเป็นจำนวนเต็มบวกu (การพิจารณารันไทม์)

  • และให้เอาต์พุตเป็นอาร์เรย์หรือรายการของตัวเลขiทั้งหมดที่ต่ำกว่าหรือเท่ากับuซึ่งiและi + kเป็นจำนวนเฉพาะ ไม่จำเป็นต้องเรียงลำดับผลลัพธ์

กรณีทดสอบ

12, 1000 -> [5, 7, 11, 17, 19, 29, 31, 41, 47, 59, 61, 67, 71, 89, 97, 101, 127, 137, 139, 151, 167, 179, 181, 199, 211, 227, 229, 239, 251, 257, 269, 271, 281, 337, 347, 367, 389, 397, 409, 419, 421, 431, 449, 467, 479, 487, 491, 509, 557, 587, 601, 607, 619, 631, 641, 647, 661, 727, 739, 757, 761, 797, 809, 811, 827, 907, 929, 941, 971, 997]
2, 999 -> [3, 5, 11, 17, 29, 41, 59, 71, 101, 107, 137, 149, 179, 191, 197, 227, 239, 269, 281, 311, 347, 419, 431, 461, 521, 569, 599, 617, 641, 659, 809, 821, 827, 857, 881]
3, 1500 -> [2]
30, 1500 -> [7, 11, 13, 17, 23, 29, 31, 37, 41, 43, 53, 59, 67, 71, 73, 79, 83, 97, 101, 107, 109, 127, 137, 149, 151, 163, 167, 181, 193, 197, 199, 211, 227, 233, 239, 241, 251, 263, 277, 281, 283, 307, 317, 337, 349, 353, 359, 367, 379, 389, 401, 409, 419, 431, 433, 449, 457, 461, 479, 491, 541, 547, 557, 563, 569, 571, 577, 587, 601, 613, 617, 631, 643, 647, 653, 661, 709, 727, 739, 743, 757, 797, 809, 823, 827, 829, 853, 857, 877, 881, 907, 911, 937, 941, 947, 953, 967, 983, 991, 1009, 1019, 1021, 1031, 1033, 1039, 1061, 1063, 1087, 1093, 1123, 1151, 1163, 1171, 1187, 1193, 1201, 1229, 1249, 1259, 1277, 1289, 1291, 1297, 1399, 1409, 1423, 1429, 1451, 1453, 1459, 1481, 1493]

แก้ไข

เนื่องจากฉันไม่สามารถระบุขอบเขตบนโซลูชันทั้งแบบรวมและแบบเอกสิทธิ์ยินดีต้อนรับ

แก้ไขหมายเลข 2

ความท้าทายสิ้นสุดลงในวันที่ 1 กันยายนหนึ่งสัปดาห์จากจุดเริ่มต้น
ดูเหมือนว่าเรามีผู้ชนะ แต่ในกรณีของความนิยมเสมอกันคือตัวผูกไทเกอร์ ในกรณีนี้ "ที่สอง" จะได้รับการชดเชยผ่านรางวัล


คำตอบ:



6

Brachylog , 27 23 ไบต์

:1f
hS,?tye.:S+:.L*$pL,

ลองออนไลน์!

ตรวจสอบการทดสอบทั้งหมด

กริยา 0 (เพรดิเคตหลัก)

:1f                     Find all solutions of predicate 1
                        given Input as Input,
                        Unify Output with the set of all solutions.

ภาคที่ 1 (ภาคเสริม)

hS,?tye.:S+:.L*$pL,

hS                      the first element of Input is S,
   ?tye.                Output is an element between 0 and
                        the last element of Input,
       .:S+:.L          The list [Output+S,Output] is L,
             L*$pL      The product of L, prime-factorized, is still L



4

คู่, 34 33 ไบต์

@(k,u)(a=primes(u))(isprime(a+k))

วิธีการที่ยอดเยี่ยม! มันทำให้ฉันลดขนาดหน้า 11 ถึง 8 ไบต์ในคำตอบของฉัน
Luis Mendo

4

MATL , 8 ไบต์

ให้เครดิต @alephalpha สำหรับวิธีการของเขาซึ่งช่วยฉันประหยัดได้ 3 ไบต์

Zqti+Zp)

ลองออนไลน์!

Zq    % Take input implicitly. Vector of primes up to that. Call this vector A
ti+   % Duplicate, take second input, add element-wise. Call this vector B
Zp    % Vector containing true for prime numbers in B
)     % Use as an index into A. Display implicitly

4

Python 3, 114 92 90 ไบต์

ขอบคุณ @Dennis สำหรับ -2 ไบต์

def f(k,u):
 i=P=1;l={0}
 while i<u+k:l|={P%i*i};P*=i*i;i+=1
 return{i-k for i in l}&l-{0}

ฟังก์ชันที่รับอินพุตผ่านอาร์กิวเมนต์และส่งคืนชุดที่ไม่เรียงลำดับ นี่เป็นเอกสิทธิ์ที่เกี่ยวกับขอบบน

นี่ใช้วิธีการในคำตอบของ @ xnor ที่นี่เพื่อค้นหาช่วงเวลา

ลองใช้กับ Ideone

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

ค้นหานายกรัฐมนตรี

ก่อนอื่นเรา initialise ค่าการทดสอบiและผลิตภัณฑ์ที่Pเป็น1และรายการของจำนวนเฉพาะเป็นชุดที่มีl 0จากนั้นจะทำการประมวลผลwhileลูปที่ทดสอบค่าทั้งหมดiในช่วงของค่า[1, u+k-1]ดั้งเดิม แนวคิดคือการคูณPด้วยi^2ในตอนท้ายของการวนซ้ำแต่ละครั้งPรับค่า(i-1)!^2ในขณะที่ทำการทดสอบiนั่นคือผลคูณของจำนวนเต็ม[1, i+1]กำลังสอง การทดสอบ primality ที่เกิดขึ้นจริงจะดำเนินการแล้วโดยคำนวณP mod i; ถ้าสิ่งนี้ส่งกลับค่าศูนย์แล้วiไม่สามารถเป็นไพรม์ได้เนื่องจากนี่หมายถึงการiหารด้วยค่าอย่างน้อยหนึ่งค่าที่ประกอบเป็นผลิตภัณฑ์ ถ้าสิ่งนี้คืนกลับ1มาiต้องมีความสำคัญเพราะไม่สามารถหารด้วยค่าใด ๆ ในผลิตภัณฑ์ ถ้าiเป็นไพรม์มันจะถูกผนวกเข้ากับlและหากไม่ใช่0จะถูกต่อท้าย squaring ของผลิตภัณฑ์ป้องกันบัตรประจำตัวปลอม4เป็นสำคัญและเป็นประโยชน์ที่นี่ตั้งแต่มันรับประกันว่ามีเพียง0หรือจะถูกส่งกลับปล่อยให้ทางเลือกของความคุ้มค่าที่จะผนวกที่จะทำโดยเพียงแค่คูณผลโดย1i

การระบุช่วงเวลา 'แฝด'

ตอนนี้เราสร้างชุด Furter ที่มีองค์ประกอบทั้งหมดของl-kองค์ประกอบที่ชาญฉลาด จุดตัดของชุดนี้และlพบว่าใช้&ซึ่งจะปล่อยชุดที่มีองค์ประกอบที่ใช้ร่วมกันสำหรับทั้งสองชุดเท่านั้น ตัวเลขiมีทั้งสองชุดหากทั้งคู่iและi+kเป็นไพร์มซึ่งหมายความว่าจะปล่อยเอาต์พุตที่ต้องการ อย่างไรก็ตามหากkมีความสำคัญ0จะปรากฏในทั้งสองชุดซึ่งหมายความว่าจะต้องลบออกก่อนที่จะกลับมา


2
k,u=input();i=P=1;l={0};exec'l|={P%i*i};P*=i*i;i+=1;'*(u+k);print{i-k for i in l}&lใช้ได้กับ 83 ไบต์ใน Python 2 แม้ใน 3 การสร้างชุดด้วยวิธีนี้ควรบันทึกบางไบต์
เดนนิส

@Dennis ขอบคุณ - นี้ไม่ประหยัดไม่กี่ไบต์ในหลาม 3 อย่างไรก็ตามผมไม่ต้องเอา0จากชุดสุดท้ายเพราะถ้าkเป็นสำคัญนี้ผิดพลาดได้รับกลับมา
TheBikingViking

3

R, 98 ไบต์

function(k,u){v=c();for(i in 1:u)if(sum(i%%(1:i)==0)==2&&sum((i+k)%%(1:(i+k))==0)==2){v=c(v,i)};v}

Ungolfed:

function(k,u)
v=c()                                                    #Empty vector

for(i in 1:u)
    if(sum(i%%(1:i)==0)==2&&sum((i+k)%%(1:(i+k))==0)==2) #If both i and i+k only have 
                                                         #2 divisors such as the rest of the 
                                                         #euclidian division is 0 
                                                         #(i.e., they're both prime) :
        v=c(v,i)
v


2

Java 7, 185 175 ไบต์

import java.util.*;List c(int k,int u){List l=new ArrayList();for(int i=1;++i<u;)if(p(i)&p(i+k))l.add(i);return l;}boolean p(int n){for(int i=2;i<n;)n=n%i++<1?0:n;return n>1;}

Ungolfed & รหัสการทดสอบ:

ลองที่นี่

import java.util.*;
class M{
  static List c(int k, int u){
    List l = new ArrayList();
    for(int i = 1; ++i < u; ){
      if(p(i) & p(i+k)){
        l.add(i);
      }
    }
    return l;
  }

  static boolean p(int n){
    for(int i = 2; i < n; ){
      n = n % i++ < 1
           ? 0
           : n;
    }
    return n>1;
  }

  public static void main(String[] a){
    System.out.println(c(12, 1000));
    System.out.println(c(2, 999));
    System.out.println(c(3, 1500));
    System.out.println(c(30, 1500));
  }
}

เอาท์พุท:

[5, 7, 11, 17, 19, 29, 31, 41, 47, 59, 61, 67, 71, 89, 97, 101, 127, 137, 139, 151, 167, 179, 181, 199, 211, 227, 229, 239, 251, 257, 269, 271, 281, 337, 347, 367, 389, 397, 409, 419, 421, 431, 449, 467, 479, 487, 491, 509, 557, 587, 601, 607, 619, 631, 641, 647, 661, 727, 739, 757, 761, 797, 809, 811, 827, 907, 929, 941, 971, 997]
[3, 5, 11, 17, 29, 41, 59, 71, 101, 107, 137, 149, 179, 191, 197, 227, 239, 269, 281, 311, 347, 419, 431, 461, 521, 569, 599, 617, 641, 659, 809, 821, 827, 857, 881]
[2]
[7, 11, 13, 17, 23, 29, 31, 37, 41, 43, 53, 59, 67, 71, 73, 79, 83, 97, 101, 107, 109, 127, 137, 149, 151, 163, 167, 181, 193, 197, 199, 211, 227, 233, 239, 241, 251, 263, 277, 281, 283, 307, 317, 337, 349, 353, 359, 367, 379, 389, 401, 409, 419, 431, 433, 449, 457, 461, 479, 491, 541, 547, 557, 563, 569, 571, 577, 587, 601, 613, 617, 631, 643, 647, 653, 661, 709, 727, 739, 743, 757, 797, 809, 823, 827, 829, 853, 857, 877, 881, 907, 911, 937, 941, 947, 953, 967, 983, 991, 1009, 1019, 1021, 1031, 1033, 1039, 1061, 1063, 1087, 1093, 1123, 1151, 1163, 1171, 1187, 1193, 1201, 1229, 1249, 1259, 1277, 1289, 1291, 1297, 1399, 1409, 1423, 1429, 1451, 1453, 1459, 1481, 1493]


2

Mathematica, 43 ไบต์

(Prime@Range@PrimePi@#2+#)~Select~PrimeQ-#&

สร้างจำนวนเฉพาะทั้งหมดน้อยกว่าหรือเท่ากับขอบเขตบน เพิ่มความแตกต่างของอายุลงในผลลัพธ์ เลือกหมายเลขเฉพาะในหมู่พวกเขา ลบความแตกต่างของอายุกับผลลัพธ์


2

Swift, 142 ไบต์

func f(a:Int,b:Int)->Array<Int>{let p={(n:Int)->Int in([Int]()+(2..<n)).filter{n%$0<1}.count}
return([Int]()+(2...b)).filter{p($0)+p($0+a)<1}}

2

Perl 6 ,  39  37 ไบต์

->\k,\u{grep {($_&$_+k).is-prime},2..u}
->\k,\u{grep {($_&$_+k).is-prime},^u}

คำอธิบาย:

-> \k, \u {

  # find all the values
  grep

  # where
  {
    # 「all」 junction of the two values
    ( $_   &   $_ + k ) # 「 all( $_, $_ + k ) 」

    # autothread a method call against the junction
    .is-prime
  },

  # from the values up to (and excluding) 「u」
  ^ u # short for 「 0 ..^ u 」
  # for inclusive use 「 2 .. u 」

}


1

จริงแล้ว 12 ไบต์

การป้อนข้อมูลเป็นแล้วu kยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ ลองออนไลน์!

╖R`;p@╜+p*`░

Ungolfing:

╖              Store k in register 0.
 R             Range [1..u]
  `       `░   Start a function f and push values i of the range where f(i) is truthy.
   ;p@         Duplicate i, check if i is prime, and swap with the other i.
      ╜+p      Push k, add to i, check if i+k is prime.
         *     Multiply the two if results together.
                 Similar to logical AND. 1 if both are true, else 0.

1

R, 104 ไบต์

ต่างจากโซลูชัน R อื่น ๆ ที่โพสต์อันนี้ใช้ข้อมูลจาก stdin

s=scan();sapply(1:s[2],function(i){j=i+s[1];if((all(i%%(3:i-1)!=0)|i==2)&all(j%%(3:j-1)!=0))cat(i," ")})

Ungolfed:

s=scan();        # Read from stdin
sapply(1:s[2],   # For i from 1 to u,
    function(i){     # apply this function:
        j=i+s[1];                # Define i+k
        if((all(i%%(3:i-1)!=0)   # Test if i is prime
           | i==2)               # (i is prime if i==2)
           & all(j%%(3:j-1)!=0)) # Test if i+k is prime
        cat(i," ")               # If i and i+k are prime, print i
    }
)


1

Pyth, 13 ไบต์

f&P_TP_+ThQSe

โปรแกรมที่รับอินพุตของรายการฟอร์ม[k, u]และพิมพ์รายการ

ลองออนไลน์

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

f&P_TP_+ThQSe  Program. Input: Q
           Se  1-indexed range up to Q[1], yielding [1, 2, 3, ..., u]
f              Filter that, using variable T, by:
  P_T           T is prime
 &              and
     P_+ThQ     T+Q[0], i.e. T+k, is prime
               Implicitly print
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.