จำนวนเฉพาะด้วยจำนวนบิตที่สำคัญ


23

งาน

ค้นหาจำนวนเต็มที่ไม่เป็นลบทั้งหมดจนถึงและรวมถึงจำนวนเต็มบวกที่ไม่เป็นศูนย์ที่กำหนดnที่มีความสำคัญและนับ1'sและ0'sในการเป็นตัวแทนของพวกเขาไบนารี (ไม่มีเลขศูนย์นำ) มีความสำคัญมากเกินไป

นี่คือห้าช่วงแรกเช่นนั้น

17, 19, 37, 41, 79

10001, 10011, 100101, 101001, 1001111

คำอธิบายและกฎ

  • ยอมรับวิธีการเริ่มต้นของ I / Oวิธีการได้รับการยอมรับ
  • คำตอบอาจเป็นโปรแกรมหรือฟังก์ชั่น
  • หากไม่มีช่วงเวลาดังกล่าวให้ส่งออกขยะหรือไม่มีอะไร
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • 2 3 5 7ไม่ได้ทำให้มันอยู่ในรายการเพราะในจำนวนที่เป็นตัวแทนของพวกเขาเกิดขึ้น0'sและ1'sไม่ได้เป็นจำนวนเฉพาะ ลองพิจารณาดูว่า7ใครเป็นตัวแทนไบนารีอยู่111ที่นี่0เกิดขึ้นที่ศูนย์ครั้งและศูนย์ไม่สำคัญ
  • อนุญาตให้มีบิวด์อิน

  • รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!

กรณีทดสอบ

10
[]

100
[17, 19, 37, 41, 79]

150
[17, 19, 37, 41, 79, 103, 107, 109, 131, 137]


1
คุณขอเวลาทั้งหมดภายใต้ n ที่กำหนด แต่คุณยังบอกว่ารวม คุณหมายถึงอะไร
Riley

@Riley ว่าผมหมายถึงคือ all the numbers from 1....n... ฉันไม่ทราบวิธีการใช้ถ้อยคำใหม่ในวิธีที่ง่าย
Gurupad Mamadapur


3
@ mbomb007 เห็นได้ชัดว่าสำหรับการสั่งซื้อทั้งหมดของลำดับเลขจำนวนเต็มลำดับเลขจำนวนเต็มที่น้อยที่สุดนั้นน่าสนใจและน่าสนใจซึ่งรวมอยู่ใน OEIS Ergo, OEIS มีลำดับจำนวนเต็มทั้งหมดของดอกเบี้ยที่แท้จริงใด ๆ หรือคิด :-)
Iwillnotexist Idonotexist

9
ฉันสงสัยว่า Mathematica มี builtins มากกว่า OEIS หรือไม่
Neil

คำตอบ:


5

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

RBċþd`ÆPPTfÆR

ลองออนไลน์!

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

RBċþd`ÆPPTfÆR  Main link. Argument: n

R              Range; yield [1, ..., n].
 B             Binary; convert each integer to base 2.
    d`         Divmod self; yield [n : n, n % n], i.e., [1, 0].
  ċþ           Count table; count the occurrences of 1 and 0 in each binary
               representation, yielding a pair of lists of length n.
      ÆP       Test each count for primality.
        P      Product; multiply the corresponding Booleans.
         T     Truth; get all indices of 1, yielding the list of integers in
               [1, ..., n] that have a prime amount of 0's and 1's.
           ÆR  Prime range; yield all primes in [1, ..., n].
          f    Filter; intersect the lists.

2
ว่าd`​เคล็ดลับคือบางสิ่งบางอย่างอื่น ...
ETHproductions

10

Python 2 , 106 102 100 ไบต์

k=m=1;p={0}
exec"p^={m%k*k,0};c=bin(k).count\nif{k,c('1'),c('0')-1}<p:print k\nm*=k*k;k+=1;"*input()

ลองออนไลน์!

พื้นหลัง

ในการระบุช่วงเวลาเราใช้ทฤษฎีบทของวิลสัน :

ข้อพิสูจน์ทฤษฎีบทของวิลสัน

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

เราเริ่มต้นด้วยการเริ่มต้นkและmเป็น1และ Pเป็นชุด{0} โปรดทราบว่าม. = 1 = 0 ² = (k - 1)! หลังจากนั้นทันทีรหัสต่อไปนี้จะถูกเรียกใช้งานnครั้งโดยที่nคือจำนวนเต็มอ่านจากอินพุตมาตรฐาน

p^={m%k*k,0};c=bin(k).count
if{k,c('1'),c('0')-1}<p:print k
m*=k*k;k+=1

โดยการพิสูจน์m% kจะเป็น1ถ้า kเป็นจำนวนเฉพาะและ0 เป็นอย่างอื่น ดังนั้น{m%k*k,0}จะส่งคืนชุด{k, 0}ถ้าkเป็นจำนวนเฉพาะและชุด{0} เป็นอย่างอื่น

หาก (และเฉพาะในกรณี) kเป็นจำนวนเฉพาะเนื่องจากpไม่สามารถมีkณ จุดนี้ความแตกต่างแบบสมมาตรในสถานที่p^={m%k*k,0}จะเพิ่มkไปยังชุดpหน้านอกจากนี้หน้าจะมี0หลังจากการปรับปรุงและถ้าหากมันไม่ได้มี0ก่อนดังนั้น0 εพีและถ้าหากkคือแม้

ในบรรทัดเดียวกันเรากำหนดฟังก์ชั่นcผ่านc=bin(k).countซึ่งจะนับการเกิดขึ้นของการโต้แย้งในการเป็นตัวแทนไบนารีของk

บรรทัดที่สองสร้างเอาต์พุตจริง {k,c('1'),c('0')-1}ส่งคืนชุดที่ประกอบด้วยkเองจำนวนชุดบิตในkและจำนวนของบิตไม่มีการตั้งค่าในk ตั้งแต่ผลลัพธ์ของbin(k)เริ่มต้นด้วย0bเราต้องลดค่าลงc('0')ไปสำหรับค่า0 ที่นำหน้า

หากพวกเขาทั้งหมดเป็นนายกพวกเขาทั้งหมดจะเป็นของpซึ่งตอนนี้มีจำนวนเฉพาะทั้งหมดถึงk (และอาจเป็น0 ) ถ้าkเป็นตัวเลข Mersenne (เช่นถ้ามีชุดบิตเท่านั้น) c('0')-1จะได้ผลลัพธ์ 0 ตั้งแต่หมายเลข Mersenne มีแปลกหน้าจะไม่ได้มี0เพื่อให้อยู่ในสภาพที่จะล้มเหลว

หลังจากที่ (อาจ) พิมพ์kเราคูณเมตรโดยk² ตั้งแต่m = (k-1)! ²ก่อนการอัพเดทm = k! ²หลังจากนั้น หลังจากเพิ่มขึ้น kแล้วความสัมพันธ์m = (k-1)! ²ถืออีกครั้งและเราพร้อมแล้วสำหรับการทำซ้ำครั้งถัดไป


9

Mathematica, 80 68 54 ไบต์

Select[p=PrimeQ;Range@#,p@#&&And@@p/@#~DigitCount~2&]&

คำอธิบาย

Select[p=PrimeQ;Range@#,p@#&&And@@p/@#~DigitCount~2&]&

       p=PrimeQ                                        (* Store prime check func. in p *)
Select[                                             ]  (* Select *)
                Range@#                                (* from a list {1..n} *)
                        p@#                            (* numbers that are prime *)
                           &&                          (* And *)
                                     #~DigitCount~2    (* whose digit counts in binary *)
                             And@@p/@                  (* are prime as well *)

8

JavaScript (ES6), 123 118 115 111 104 96 ไบต์

บันทึกแล้ว 4 ไบต์ขอบคุณ @Arnauld

G=n=>n?G(n>>1,++a[n%2]):a.some(n=>(P=x=>n%--x?P(x):x)(n)-1)
F=n=>F(n-1,G(n,a=[0,0,n])||alert(n))

การรวมกันของสามฟังก์ชั่นวนซ้ำโดยทั่วไป แจ้งเตือนลำดับในลำดับย้อนกลับและยุติข้อผิดพลาด "การเรียกซ้ำมากเกินไป"

ตัวอย่างการทดสอบ

(แก้ไขเพื่อส่งออกไปยังหน้า)

ฟังก์ชั่นหลักสามารถส่งกลับอาร์เรย์สำหรับ 104 ไบต์:

G=n=>n?G(n>>1,++a[n%2]):a.some(n=>(P=x=>n%--x?P(x):x)(n)-1)
F=n=>n?F(n-1).concat(G(n,a=[0,0,n])?[]:n):[]

นอกจากนี้ยังสามารถเรียกใช้ซ้ำได้โดยเสียค่าใช้จ่ายของไบต์อื่น:

G=n=>n?G(n>>1,++a[n%2]):a.some(n=>(P=x=>n%--x?P(x):x)(n)-1)
n=>[for(_ of Array(n))if(!G(--n,a=[0,0,n]))n]

นี่คือสิ่งที่ฉันเริ่มด้วย: (บันทึก 6 ไบต์ขอบคุณ @Arnauld)

P=(n,x=n)=>n>1&--x<2||n%x&&P(n,x)
G=n=>n?G(n>>1,o+=n%2,t++):P(o)&P(t-o)
F=n=>n?F(n-1).concat(P(n)&G(n,o=t=0)?n:[]):[]

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

ความพยายามแบบไม่เรียกซ้ำที่ฟังก์ชันหลัก (อีกครั้งจำนวนไบต์เดียวกัน):

n=>[for(i of Array(n))if(P(--n)&G(n,o=t=0))n]

อันนี้ใช้เส้นทางที่ง่ายในการนับจำนวน 0 และ 1 ในการแทนเลขฐานสอง:

F=n=>n?F(n-1).concat([n,(G=x=>n.toString(2).split(x).length-1)(0),G(1)].some(n=>(P=x=>n%--x?P(x):x)(n)-1)?[]:n):[]

สิ่งเดียวกันกับอาร์เรย์ความเข้าใจ:

n=>[for(_ of Array(n))if(![--n,(G=x=>n.toString(2).split(x).length-1)(0),G(1)].some(n=>(P=x=>n%--x?P(x):x)(n)-1))n]

เส้นทางนี้ใช้เส้นทางที่ยากกว่าเล็กน้อยในการทำสิ่งเดียวกัน:

F=n=>n?F(n-1).concat([n,(G=(x,w=n)=>w&&G(x,w>>1)+(w%2==x))(0),G(1)].some(n=>(P=x=>n%--x?P(x):x)(n)-1)?[]:n):[]

และเส้นทางนี้ใช้เส้นทางอื่นที่เกี่ยวข้องซึ่งสั้นเท่ากับต้นฉบับ:

F=n=>n?F(n-1).concat([n,o=(G=x=>x&&x%2+G(n>>++t))(n,t=0),t-o].some(n=>(P=x=>n%--x?P(x):x)(n)-1)?[]:n):[]

อีกครั้งคุณสามารถเล่นกอล์ฟ 8 ไบท์โดยแจ้งเตือนให้ทราบถึงลำดับที่กลับกัน:

F=n=>F(n-1,[n,o=(G=x=>x&&x%2+G(n>>++t))(n,t=0),t-o].some(n=>(P=x=>n%--x?P(x):x)(n)-1)||alert(n))

aคุณไม่จำเป็นจริงๆที่จะผ่านซ้ำ Gเพียงแค่เริ่มต้นมันอยู่ในสายที่จะเริ่มต้น (นั่นควรประหยัด 4 ไบต์)
Arnauld

@Arnauld โอ้ใช่ขอบคุณ! นี่คือความสนุก :-)
ETHproductions

1
ว้าวเรื่องนี้ลดลงมาก การทำงานที่ดี
George Reith

6

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

BĠL€µ;LÆPẠ
ÆRÇÐf

ลองออนไลน์!

อย่างไร?

BĠL€µ;LÆPẠ - Link 1, hasPrimeBits: n  e.g. 7         or 13
B          - convert to binary        e.g. [1,1,1]  or [1,1,0,1]
 Ġ         - group indices            e.g. [1,2,3]  or [3,[1,2,4]]
  L€       - length of €ach           e.g. 3          or [1,3]
    µ      - monadic chain separation
     ;L    - concatenate length       e.g. [3,1]      or [1,3,2]
           -     this caters for the edge case of Mersenne primes (like 7), which have
           -     no zero bits, the length will be 1, which is not prime.
       ÆP  - isPrime?                 e.g. [1,0]      or [0,1,1]
         Ạ - All?                     e.g. 0          or 0

ÆRÇÐf - Main link: N
ÆR    - prime range (primes up to and including N)
   Ðf - filter keep those satisfying
  Ç   - last link (1) as a monad

1
อ่าขอบคุณฉันเห็นคุณมีการเปลี่ยนแปลงที่จะบันทึกไบต์
Jonathan Allan

1
คุณมีตัวอักษรไปที่นั่น ẠBÇЀfĠ...
mbomb007

2
@ mbomb007 ใช่LƵ;Pบิตทำให้ฉันสับสนอยู่เสมอ
Jonathan Allan

6

05AB1E , 14 ไบต์

ƒNpNbSD_‚OpP&–

ลองออนไลน์!

คำอธิบาย

ƒ               # for N in [0 ... input]
 Np             # push N is prime
   Nb           # push N converted to binary
     S          # split into individual digits
      D_        # push an inverted copy
        ‚       # pair the 2 binary lists
         O      # sum them
          p     # elementwise check for primality
           P    # product of list
            &   # and with the primality of N
             –  # if true, print N

ฉันยังไม่พบการใช้งานความท้าทายนี้ดูดีสำหรับมัน แต่จะนานกว่านี้:FNb{.¡€gpONp+3QiN}})
Magic Octopus Urn

@carusocomputing: ฉันมีวิธีการแก้ปัญหาที่คล้ายกันฉันคิดว่าเช่นกัน แต่มันก็จบลงด้วยความยาวกว่านี้เล็กน้อย
Emigna


4

MATL , 16 15 ไบต์

:"@tB!t~hshZp?@

ลองออนไลน์!

:         % Input n (implicit). Push range [1 2 ... n]
"         % For each k in [1 2 ... n]
  @       %   Push k
  tB!     %   Duplicate. Binary expansion as an m×1 vector
  t~      %   Duplicate. Negate
  hs      %   Concatenate horizontally into an m×2 matrix. Sum of each column.
          %   This gives a 1×2 vector. However, for k==1 this gives the sum of
          %   the original 1×2 matrix (m==1). But fortunately it doesn't matter
          %   because 1 is not a prime anyway
  h       %   Concatenate horizontally into a 1×3 row vector
  Zp      %   Isprime function applied on each of those three numbers
  ?       %   If all gave true
    @     %     Push k
          %   End (implicit)
          % End (implicit)
          % Display (implicit)

4

Perl, 101 ไบต์

99 ไบต์ของรหัสเมือง + -nlธง

$r=q/^1?$|^(11+)\1+$/;for$@(2..$_){$_=sprintf"%b",$@;print$@if(1x$@)!~$r&y/01/1/dr!~$r&s/0//gr!~$r}

วิธีเรียกใช้:

perl -lne '$r=q/^1?$|^(11+)\1+$/;for$@(2..$_){$_=sprintf"%b",$@;print$@if(1x$@)!~$r&y/01/1/dr!~$r&s/0//gr!~$r}' <<< 150

คำอธิบายสั้น ๆ บางอย่าง
$rถือการตรวจสอบเฉพาะนายกคลาสสิก ( q/^1?$|^(11+)\1+$/)
สำหรับตัวเลขทั้งหมดระหว่าง 2 และการป้อนข้อมูล
(1x$@)!~$rการตรวจสอบถ้าจำนวนเป็นสำคัญ
y/01/1/dr!~$rการตรวจสอบถ้าจำนวนของ0ในแทน binary เป็นสำคัญ,
s/0//gr!~$rการตรวจสอบถ้าตัวเลข1ในฐานเป็นตัวแทนเป็นสำคัญ
(หากตรงตามเงื่อนไข 3 ข้อให้print$@พิมพ์ออกมา)


ขอบคุณสำหรับคำอธิบาย ที่น่าตื่นตาตื่นใจมากสิ่งที่คุณสามารถทำอะไรกับสิ่งที่เป็น regex พื้นและตรรกะบาง :)
Emigna

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

1
ในฐานะที่เป็นคนที่ไม่รู้จัก Perl ฉันรู้สึกขอบคุณทุกคำอธิบายที่ฉันสามารถหาได้ มันจะไม่ช่วยให้ฉันสร้างโปรแกรม Perl แต่ฉันเข้าใจเหตุผลบางประการของวิธีการที่ใช้ซึ่งน่าสนใจอยู่เสมอ
Emigna

3

งูหลาม, 129 125 123 ไบต์

ถ้ามีเพียงศูนย์เท่านั้น ...

p=lambda n:all(n%m for m in range(2,n))*n>1
lambda n:[i for i in range(n+1)if p(i)*all(p(bin(i)[2:].count(x))for x in'01')]

ลองออนไลน์

ฟังก์ชั่นpเป็นนายกตรวจสอบฟังก์ชั่นที่มีในตอนท้ายเพื่อที่จะทำงานให้เป็นศูนย์เช่นกันซึ่งจะเป็นอย่างอื่นกลับมา>0 -1แลมบ์ดานิรนามคือแลมบ์ดาที่ตรวจสอบทุกเงื่อนไขที่จำเป็น


นี่เป็นวิธีที่แตกต่างกันเล็กน้อยโดยใช้ชุดความเข้าใจ ผลลัพธ์จะเป็นชุด ( 124 ไบต์ ):

p=lambda n:all(n%m for m in range(2,n))*n>1
lambda n:{i*p(i)*all(p(bin(i)[2:].count(x))for x in'01')for i in range(n+1)}-{0}

3

Perl 6 , 65 ไบต์

{grep {all($^a,|map {+$a.base(2).comb(~$_)},0,1).is-prime},0..$_}

ลองมัน

ขยาย:

{           # bare block lambda with implicit parameter 「$_」

  grep      # find all of the values where

  {         # lambda with placeholder parameter 「$a」

    all(    # all junction ( treat multiple values as a single value )

      $^a,  # declare parameter to block

      |\    # slip the following list into the outer list

      # get the count of 0's and 1's in the binary representation
      map

      {             # bare block lambda with implicit parameter 「$_」

        +           # turn to numeric ( count the values in the list )
        $a          # the outer parameter
        .base(2)    # in base 2
        .comb(~$_)  # find the characters that are the same as
      },0,1         # 0 or 1

    # ask if $a, count of 0's, count of 1's are all prime
    ).is-prime

  },

  0 .. $_ # Range from 0 to the input inclusive

}

3

ระดับแปดเสียง 73 ไบต์

@(n)(p=primes(n))(all(isprime([s=sum(dec2bin(p)'-48);fix(log2(p))+1-s])))

ลองออนไลน์!

@(n)
    (p=primes(n))                           generate prime numbers
        (all(                               from them select those that
            isprime(                        are prime both
                [s=sum(dec2bin(p)'-48);     sum of 1s
                fix(log2(p))+1-s])))        and sum of 0s

2

CJam , 26 27 ไบต์

ri){mp},{2b_1-,mp\0-,mp&},p

อัลกอริทึมตรงไปตรงมาจะเล่นกอล์ฟต่อไป

แก้ไข: ลืมรวม n

ลองออนไลน์!

เพื่อความสนุกนี่คล้ายกันมากและ 27 ไบต์:

ri){_mp\2b_1-,mp\0-,mp&&},p

คำอธิบาย

ri                          e# Take an int as input
  ){mp},                    e# Take the range up and including to the input, 
                            e#   including only prime numbers
       {                    e# For each prime...
        2b_                 e# Convert it to binary and copy it
           1-,mp            e# Take the top binary number, remove 1's, check if the length 
                            e#   is prime
                \           e# Swap top elements
                 0-,mp      e# Do the same but remove 0's
                      &     e# And
                       },   e# Filter out primes for which the above block was false
                         p  e# Print nicely

2

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

BċÆPðÐf
ÆRç0ç1

ลองออนไลน์!

น่าเสียดายที่ฉันสามารถผูกกับ @Dennis ได้เท่านั้น แต่อัลกอริทึมดูเหมือนจะค่อนข้างแตกต่างดังนั้นฉันจึงโพสต์สิ่งนี้

คำอธิบาย

ฟังก์ชั่นตัวช่วย (ลบองค์ประกอบของรายการที่ไม่มีจำนวนครั้งในบิตที่กำหนด):

BċÆPðÐf
     Ðf   Filter {the first argument}, looking for truthy returns from
    ð     the preceding code, which takes two arguments:
B         Convert {the element being checked} to binary
 ċ        Count the number of occurrences of {the second argument}
  ÆP      Return true if prime, false if not prime

โปรแกรมหลัก:

ÆRç0ç1
ÆR        Generate all primes from 2 to the input
  ç0      Call the subroutine to require a prime 0 count
    ç1    Call the subroutine to require a prime 1 count

2

Haxe, 169 171 ไบต์

function f(n,?p)return[for(j in(p=[for(i in 0...++n)i<2?0:i]))if(j>0){var x=j*2,y=0,z=0,k=j;while(k<n)p[k+=j]=0;while((x>>=1)>0)x&1>0?y++:z++;p[y]<1||p[z]<1?continue:j;}];

ไม่มีอะไรบ้า โดยพื้นฐานแล้วตะแกรงของ Eratosthenes ที่ได้รับการแก้ไขจะประเมินความเป็นอันดับแรกของการนับ 0/1 ในการทำซ้ำเช่นเดียวกับการข้ามผ่านค่าที่ไม่ใช่ช่วงเวลาที่สูงขึ้น ด้วยพื้นที่ว่างบางส่วน:

function f(n, ?p)
  return [ for (j in (p = [ for(i in 0...++n) i < 2 ? 0 : i ]))
    if (j > 0){
      var x = j * 2, y = 0, z = 0, k = j;
      while (k < n)
        p[k += j] = 0;
      while((x >>= 1) > 0)
        x & 1 > 0 ? y++ : z++;
      p[y] < 1 || p[z] < 1 ? continue : j;
    }
  ];

แต่วันนี้ฉันได้เรียนรู้ว่าฉันสามารถที่จะcontinueเป็นผู้ประกอบการโรงพยาบาลและ Haxe ก็ไม่สนใจ

แก้ไข: +2 เพราะnเป็นขอบบนแบบรวม!


เฮ้nรวมถึง
Gurupad Mamadapur

@GurupadMamadapur คุณถูกต้องคงที่!
Aurel Bílý

2

ยูทิลิตีBash + GNU, 129 126 123 114 111 109 ไบต์

seq '-fp()([ `factor|wc -w` = 2 ]);g()(dc -e2o${n}n|tr -cd $1|wc -c|p);n=%.f;p<<<$n&&g 0&&g 1&&echo $n' $1|sh

ลองออนไลน์!

สังเกตเห็นความคิดเห็นว่าผลลัพธ์ไม่จำเป็นต้องเพิ่มขึ้น - ลบออกไป 3 ไบต์โดยนับถอยหลังแทนที่จะนับ

แทนที่ grep ด้วย wc เพื่อบันทึก 3 ไบต์เพิ่มเติม

กำจัดตัวแปร (ปิดอีก 9 ไบต์)

เปลี่ยนการใช้ตัวประกอบวิธี - อีก 3 ไบต์

ทำให้นักเล่นกอล์ฟมี seq (2 ไบต์)


2

Python, 172 170 168 159 154 133 130 ไบต์

p=lambda n:[i for i in range(1,n)if n%i==0]==[1]
lambda n:[i for i in range(n+1)if p(i)*all(p(bin(i)[2:].count(x))for x in'10')]

การใช้งาน: โทรฟังก์ชั่นแลมบ์ดานิรนาม
วิธีการpตรวจสอบว่าตัวเลขเป็นนายก


บันทึก 2 +2 + 9 = 13 ไบต์ขอบคุณ Gurupad Mamadapur
บันทึก 5 ไบต์ขอบคุณ mbomb007


1
คุณสามารถประหยัดอีก 2 โดยใช้สิ่งนี้v-def v(n):a=bin(n)[2:];return p(n)and(p(a.count('1'))and p(a.count('0')))
Gurupad Mamadapur

1
สั้นกว่ามาก -v=lambda a:p(a)and all(p(bin(a)[2:].count(x))for x in['1','0'])
Gurupad Mamadapur

2
เงื่อนไขการทำซ้ำ for x in'01'ดังนั้นคุณสามารถใช้
mbomb007



1

Pyth , 18 ไบต์

f.APM_M+T/LSjT2U2S

ลองมันออนไลน์ได้ที่นี่


1
@GurupadMamadapur srry กำลังเปลี่ยนUเป็นS
Maltysen

@GurupadMamadapur เสร็จแล้ว
Maltysen

@GurupadMamadapureS
Maltysen

1
@GurupadMamadapur เพราะเราไม่อยู่ในกลุ่ม: P Pyth เป็นแอสทูอิเท่านั้น
Maltysen

1

Python 3 , 97 ไบต์

def f(n,k=2,m=1,p={0}):f(n-1,k+1,m*k*k,p^{m%k*k,{*map(bin(m%k%n*k)[2:].count,'01')}<p==print(k)})

นี่เป็นอัลกอริธึมแบบเดียวกับคำตอบ Python 2 ของฉันแต่การใช้งานนั้นแตกต่าง ฟังก์ชั่นพิมพ์ไปที่ STDOUT และยุติด้วยข้อผิดพลาด

ลองออนไลน์!


1

JavaScript (ES6), 110 bytes

B=n=>n?B(n>>1,v[n%2]++):v.every(n=>(P=i=>n%--i?P(i):1==i)(n))
F=(n,a=[])=>n?F(n-1,B(n,v=[0,0,n])?[n,...a]:a):a


That primality test function is... just amazing :-) Did you create it yourself?
ETHproductions

@ETHproductions You've seen it before codegolf.stackexchange.com/a/91309/11182 modified from here. I also borrowed your 1 and 0 counting code (whooped anything I could come up with) but alas I couldn't beat your byte count.
George Reith

@ ETHproductions ขอบคุณมาก เป็นสิ่งประดิษฐ์ของรุ่นก่อนหน้านี้
George Reith


1

Haxe, 158 147 bytes

function p(n,x=1)return n%++x<1||n<2?x==n:p(n,x);function f(n){var q=n,t=0,o=0;while(q>0){t++;o+=q%2;q>>=1;}p(n)&&p(o)&&p(t-o)?trace(n):0;f(n-1);};

ส่งออกไปยัง STDOUT และยุติข้อผิดพลาด "การเรียกซ้ำมากเกินไป" f(1000);โทรด้วยเช่น คุณสามารถใช้การwhileวนซ้ำโดยไม่มีข้อผิดพลาด 156 ไบต์:

function p(n,x=1)return n%++x<1||n<2?x==n:p(n,x);function f(n){while(n>0){var q=n,t=0,o=0;while(q>0){t++;o+=q%2;q>>=1;}p(n)&&p(o)&&p(t-o)?trace(n):0;n--;}};

การใช้ช่วงเปิดใช้งานสามไบต์นานขึ้น:

function p(n,x=1)return n%++x<1||n<2?x==n:p(n,x);function f(n){for(i in 0...n+1){var q=i,t=0,o=0;while(q>0){t++;o+=q%2;q>>=1;}p(i)&&p(o)&&p(t-o)?trace(i):0;}};

ทดสอบออนไลน์!


1

สนิม 147 ไบต์

fn f(x:u32){let p=|n|n>1&&(2..n).all(|x|n%x!=0);for n in 9..x+1{if p(n)&&p(n.count_ones())&&p(n.count_zeros()-n.leading_zeros()){print!("{} ",n)}}}

ลิงค์สนามเด็กเล่น

The count_ones, count_zerosและleading_zerosวิธีต่างๆมีประโยชน์

เวอร์ชันที่จัดรูปแบบแล้ว

fn f(x: u32) {
    // primality test closure using trial division
    let p = |n| n > 1 && (2..n).all(|x| n % x != 0);

    for n in 9..x + 1 {
        if p(n) && p(n.count_ones()) && p(n.count_zeros() - n.leading_zeros()) {
            print!("{} ", n)
        }
    }
}

1

Perl 6 , 50 ไบต์

{grep {($_&+.base(2).comb(~0&~1)).is-prime},0..$_}

การแปรผันของคำตอบ b2gills 'โดยใช้ตัวดำเนินการ& แยกเพื่อผลที่ยอดเยี่ยม

ลองออนไลน์!

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

{                                                }  # Lambda
                                            0..$_   # Range from 0 to the lambda argument.
 grep {                                   },        # Filter values satisfying:
       ($_                      ).is-prime          #  a) The Number itself is prime.
       (   +.base(2).comb(~0   )).is-prime          #  b) The count of 0's is prime.
       (   +.base(2).comb(   ~1)).is-prime          #  c) The count of 1's is prime.
          &                 &                       # Junction magic! :)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.