ตรวจสอบว่าหมายเลข 2017-friable โดยไม่มีช่วงเวลาในซอร์สโค้ดของคุณ


41

จากหลายปีที่ผ่านมาฉันได้ทำเรื่องท้าทายนี้ปี 2017 เป็นปีแรกที่มีจำนวนมาก ดังนั้นคำถามจะเกี่ยวกับจำนวนเฉพาะและคุณสมบัติของพวกเขา

งานของคุณคือการสร้างโปรแกรมหรือฟังก์ชั่นที่จะใช้จำนวนเต็มบวกขนาดใหญ่โดยพลการเป็นอินพุตและเอาต์พุตหรือส่งคืนหรือไม่จำนวน2,017-friableนั่นคือไม่ว่าปัจจัยสำคัญที่ใหญ่ที่สุดในจำนวนนั้นคือ 2,017 หรือน้อยกว่า


ตัวอย่างอินพุตและเอาต์พุต:

1 (has no prime factors)
true

2 (= 2)
true

80 (= 2 x 2 x 2 x 2 x 5)
true

2017 (= 2017)
true

2019 (= 3 x 673)
true

2027 (= 2027)
false

11111 (= 41 x 271)
true

45183 (= 3 x 15061)
false

102349 (= 13 x 7873)
false

999999 (= 3 x 3 x 3 x 7 x 11 x 13 x 37)
true

1234567 (= 127 x 9721)
false

4068289 (= 2017 x 2017)
true

โปรแกรมของคุณไม่จำเป็นต้องแสดงผลออกมาอย่างแท้จริงtrueและfalse- ค่าจริงหรือเท็จใด ๆ และในความเป็นจริงผลลัพธ์ที่แตกต่างกันสองค่าที่สอดคล้องกันระหว่างกรณีจริงและเท็จนั้นใช้ได้


อย่างไรก็ตามคุณไม่สามารถใช้ช่วงเวลาใดก็ได้ในซอร์สโค้ดของคุณ ช่วงเวลามาในสองประเภท:

  • อักขระหรือลำดับของอักขระที่แสดงตัวอักษรจำนวนเฉพาะ

    • ตัวละคร2, 3, 5และ7ที่ผิดกฎหมายในภาษาที่ตัวเลขเป็นราชสกุลที่ถูกต้อง

    • หมายเลข141นั้นผิดกฎหมายเพราะมีอยู่41แม้ว่าจะเป็น1และ4ถูกต้องก็ตาม

    • อักขระBและD(หรือbและd) ผิดกฎหมายในภาษาที่มักใช้เป็น 11 และ 13 เช่น CJam หรือ Befunge

  • ตัวละครที่มีค่า Unicode สำคัญหรือมีจำนวนไบต์ที่สำคัญในการเข้ารหัสของพวกเขา

    • อักขระ%)+/5;=CGIOSYaegkmqนั้นผิดกฎหมายใน ASCII เช่นเดียวกับอักขระปัดแคร่

    • อักขระóผิดกฎหมายใน UTF-8 เนื่องจากมีการเข้ารหัส0xb3ในตัว อย่างไรก็ตามใน ISO-8859-1 การเข้ารหัสนั้นเรียบง่าย0xf3ซึ่งเป็นแบบประกอบจึงไม่เป็นไร

รหัสที่สั้นที่สุดที่จะทำดังกล่าวในภาษาใด ๆ ที่ชนะ


หมายเหตุด้านข้าง: "friable" เป็นการปรับปรุงที่นำมาใช้กับ "ราบรื่น" แบบเก่าและไม่มีคำอธิบายในบริบทนี้
Greg Martin

1
ค่าความจริงและเท็จจำเป็นต้องสอดคล้องกันหรือไม่? หรือพวกเขาสามารถเปลี่ยนแปลงได้ตราบใดที่พวกเขาเป็นจริงหรือเท็จ?
Luis Mendo

10
การที่ไม่มี=กฎออกมาเป็นภาษามาตรฐานส่วนใหญ่ ...
357 Neil

4
-1 สำหรับ a do X โดยไม่มีความท้าทาย Y มันเป็นเรื่องเล็กน้อยที่ซ่อนอยู่เบื้องหลังชุดอักขระที่ไม่จำเป็นค่อนข้าง จำกัด
Downgoat

1
ฉันไม่ชอบส่วนที่เกี่ยวกับพวกเขาที่มีขนาดใหญ่โดยพลการ มันจะดีกว่าถ้าพวกเขาขึ้นไป 2 ^ 31-1
Bijan

คำตอบ:


37

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

44‘²!*ḍ@

ลองออนไลน์! โปรดทราบว่ากรณีทดสอบ11111ขึ้นไปเป็น TIO เล็กน้อยเกินไป

การตรวจสอบ

$ source="34,34,fc,82,21,2a,d5,40"
$ xxd -ps -r > 2017.jelly <<< $source
$ xxd -g 1 2017.jelly
0000000: 34 34 fc 82 21 2a d5 40                          44..!*.@
$ eval printf '"%d "' 0x{$source}; echo # Code points in decimal
52 52 252 130 33 42 213 64
$ test_cases="1 2 80 2017 2019 2027 11111 45183 102349 999999 1234567 4068289"
$ for n in $test_cases; do printf "%11d: %d\n" $n $(jelly f 2017.jelly $n); done
      1: 1
      2: 1
     80: 1
   2017: 1
   2019: 1
   2027: 0
  11111: 1
  45183: 0
 102349: 0

กรณีทดสอบ999999ทำงานเป็นเวลา 13 ชั่วโมง ฉันพูดในแง่ร้ายเกี่ยวกับการคำนวณ2025! 4068289 ...

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

44‘²!*ḍ@  Main link. Argument: n

44        Yield 44.
  ‘       Increment to yield 45.
   ²      Square to yield 2025.
          Note that no integers in [2018, ..., 2025] are prime numbers.
    !     Take the factorial of 2025.
     *    Raise it to the n-th power.
          This repeats all prime factors in 2025! at least n times, so the result
          will be divisible by n if (and only if) all of its prime factors fall
          in the range [1, ..., 2025].
      ḍ@  Test the result for divisibility by n.

22
คุณโหดร้ายกับตัวเลข :)
Greg Martin

3
@ GregMartin บา ฉันเคยเห็นคำตอบ (ในภาษาที่แตกต่าง) ซึ่งการป้อนข้อมูลขนาด6จะทำให้หมูหน่วยความจำเป็นเวลาหลายชั่วโมงจากนั้นก็หยุดทำงาน (2^n)!ฉันเพียงแค่จะบอกว่า: สิ่งนี้ยังสนับสนุนสำหรับอินพุตหกขนาด แต่อย่างน้อยอินพุตจะเป็นตัวอักษรทศนิยมแทนที่จะเป็นเลขฐานสอง
John Dvorak

ไม่ใช่ 13 ไบต์ใช่ไหม เดนนิสคุณมีชื่อเสียงมากจนฉันแน่ใจว่าฉันเป็นคนทำผิดที่นี่ฮ่าฮ่า😬
Albert Renshaw

7
@AlbertRenshaw แน่นอนว่าจะเป็น 13 ไบต์ใน UTF-8 แต่ Jelly ใช้หน้ารหัสที่กำหนดเองซึ่งเข้ารหัสอักขระทั้งหมดที่เข้าใจเป็นไบต์เดียว
Dennis

3
@Dennis รู้ว่ามีคำอธิบาย; เด็ดมากที่จะเรียนรู้เกี่ยวกับขอบคุณ!
Albert Renshaw

11

เยลลี่ , 8 ตัวอักษร, 14 ไบต์ของ UTF-8

Æf½ṀḤ<90

ลองออนไลน์!

ปกติแล้ว Jelly จะใช้เพจรหัสของตัวเองสำหรับโปรแกรม อย่างไรก็ตามสิ่งก่อสร้างที่เกี่ยวข้องกับนายกส่วนใหญ่เริ่มต้นด้วยÆซึ่งก็คือ codepoint 13 ไม่ค่อยมีประโยชน์ โชคดีที่ล่ามยังรองรับ UTF-8 ซึ่งมีการเข้ารหัสที่เป็นมิตรกว่า

การตรวจสอบ

โปรแกรมนี้ใน UTF-8 hexdumps เช่นนี้:

00000000: c386 66c2 bde1 b980 e1b8 a43c 3930  ..f........<90

การตรวจสอบว่าไบต์ทั้งหมดประกอบกัน:

$ for x in c3 86 66 c2 bd e1 b9 80 e1 b8 a4 3c 39 30; do factor $((0x$x)); done
195: 3 5 13
134: 2 67
102: 2 3 17
194: 2 97
189: 3 3 3 7
225: 3 3 5 5
185: 5 37
128: 2 2 2 2 2 2 2
225: 3 3 5 5
184: 2 2 2 23
164: 2 2 41
60: 2 2 3 5
57: 3 19
48: 2 2 2 2 3

การตรวจสอบว่า codepoints Unicode ทั้งหมดประกอบกัน:

$ perl -Mutf8 -E '$a = ord, print `factor $a` for split //, "Æf½ṀḤ<90"'
198: 2 3 3 11
102: 2 3 17
189: 3 3 3 7
7744: 2 2 2 2 2 2 11 11
7716: 2 2 3 643
60: 2 2 3 5
57: 3 19
48: 2 2 2 2 3

90โทเค็นเพียงแยกวิเคราะห์เป็นจำนวนเป็น ไม่มีของ9, 0และ90เป็นสำคัญ

คำอธิบาย

ข้อมูลเชิงลึกทางคณิตศาสตร์ที่สำคัญที่นี่คือ45²คือ 2025 ซึ่งอยู่ระหว่างปี 2017 (ปีปัจจุบัน) และ 2027 (นายกรัฐมนตรีคนต่อไป) อย่างเรียบร้อย ดังนั้นเราสามารถหาสแควร์รูทของจำนวนเฉพาะทั้งหมดของจำนวนและดูว่ามีอะไรเกิน 45 แต่น่าเสียดายที่เราไม่สามารถเขียนได้45เนื่องจากตัวอักษร5ดังนั้นเราจึงต้องเพิ่มเป็นสองเท่าและเปรียบเทียบกับ 90 แทน

Æf½ṀḤ<90
Æf        In the list of prime factors,
  ½       taking the square root of each element
   Ṁ      then taking the largest element
    Ḥ     and doubling it
     <90  produces a result less than 90.

2
เยลลี่ไม่จำเป็นต้องมีการตั้งค่าสถานะ (1 ไบต์) เพื่อใช้ UTF-8 หรือไม่
Luis Mendo

@LuisMendo: ล่ามบรรทัดคำสั่งทำ แต่ล่ามที่ Try It Online! มีการกำหนดค่าที่แตกต่างกันและไม่ต้องการมัน ดังนั้นนี่เป็นกรณีของการเลือกล่ามที่ตีความโปรแกรมของคุณในแบบที่คุณต้องการ (ไม่ว่าในกรณีใดธงที่เป็นปัญหาuนั้นประกอบไปด้วยดังนั้นมันจึงเป็นเพียงเรื่องของการเปลี่ยนแปลงคะแนนมากกว่าสิ่งที่ทำให้เป็นโมฆะ)

10

Mathematica, 62 58 55 ไบต์

สามไบต์สุดท้ายที่บันทึกไว้ทั้งหมดเกิดจาก Martin Ender!

#4<4||#<44*46&&#6[#^-1#4]&[Divisors[#][[6-4]],,,#,,#0]&

ฟังก์ชั่นที่ไม่มีชื่อการโต้แย้งจำนวนเต็มบวกและกลับมาหรือTrueFalse

อัลกอริทึมแบบเรียกซ้ำโดย#4<4เป็นเคสพื้นฐานที่แท้จริง (เราเพียงต้องการให้ส่งคืนTrueบน imput 1 แต่เคสพื้นฐานพิเศษนั้นใช้ได้) มิฉะนั้นเราจะคำนวณตัวหารที่เล็กที่สุดที่สอง (ซึ่งจำเป็นต้องมี) ของอินพุตด้วยDivisors[#][[6-4]]; ถ้ามันมากกว่า 2024 ( 44*46) แล้วเราออกด้วยFalseมิฉะนั้นเราเรียกใช้ฟังก์ชันซ้ำ (โดยใช้#6ชุด#0) กับการป้อนข้อมูลแบ่งตามปัจจัยสำคัญนี้มีขนาดเล็ก#(ซึ่งเราจะต้องแสดงเป็น#^-1ครั้งการป้อนข้อมูล#4เนื่องจาก/ไม่ได้รับอนุญาต)

การก่อสร้างในช่วงครึ่งแรก#4<4||#<44*46&&#6[#^-1#4]&เป็นฟังก์ชั่นที่ไม่ระบุชื่อหกข้อโต้แย้งถูกเรียกว่ามีข้อโต้แย้งDivisors[#][[6-4]], Null, Null, #, Nullและ#0; นี้คือการได้รับรอบข้อห้ามเกี่ยวกับตัวละคร2, และ35

รุ่นก่อนหน้านี้ซึ่งบันทึกสี่ไบต์ด้วยการแทนที่8018-6000ด้วย44*46แรงบันดาลใจจากคำตอบ Jelly ของ ais523 (Martin Ender ก็ดูเหมือนได้แรงบันดาลใจจากความคิดเห็น ais523):

#<4||Divisors[#][[6-4]]<44*46&&#0[Divisors[#][[6-4]]^-1#]&

มันค่อนข้างน่ารังเกียจ: ฉันยังไม่รู้วิธีตั้งค่าตัวแปรใน Mathematica ภายใต้ข้อ จำกัด เหล่านี้! ทั้งสอง=และeในSetไม่ได้รับอนุญาต การหลีกเลี่ยง+และ)เป็นปัญหา แต่ไม่ยากเกินไปที่จะหลีกเลี่ยงค่าใช้จ่ายที่มากขึ้นของไบต์


คุณอาจตั้งค่าพารามิเตอร์แลมบ์ดาแทนที่จะเป็นตัวแปร (ที่กล่าวว่า#2จะไม่ได้รับอนุญาตด้วยดังนั้นคุณต้องระวังด้วยว่าลูกแกะของคุณซ้อนกันอย่างไรและการขาดวงเล็บอาจทำให้มันยาก)

การปฏิบัติตามข้อเสนอแนะของ @ ais523 จะช่วยประหยัดสามไบต์: #4<4||#<44*46&&#6[#^-1#4]&[Divisors[#][[6-4]],,,#,,#0]&ส่งคำเตือนเป็นจำนวนมากเนื่องจากจะพยายามDivisors[#][[2]]ก่อนที่จะมั่นใจว่าอินพุตมีค่ามากกว่า 1 (หรือ 3) แต่ผลลัพธ์ยังคงถูกต้อง
Martin Ender

โอ้มนุษย์นั่นเจ้าเล่ห์ไหวพริบ
Greg Martin

7

Haskell, 48 47 ไบต์

\n->[snd$[product[1..44*46]^n]!!0`divMod`n]<[1]

โดยทั่วไปคำแปลของเดนนิสคำตอบของวุ้น xnor บันทึกไบต์

ใช้[…]!!0เป็นวงเล็บเนื่องจาก)ถูกแบนและsnd+ divModเพราะใส่mในmodและremถูกแบน


เคล็ดลับที่ดีกับ divMod! ฉันคิดว่าคุณสามารถแทนที่ด้วย!!0<1 <[1]แต่ดูเหมือนว่ามันก็ shorted กับการใช้เป็นdiv [\p n->p^n`div`n*n>p^n-1]!!0$product[1..44*46]
xnor

นอกจากนี้ยังมี\n->[0|p<-[product[1..44*46]^n],0<-[p,p-n..0]]ซึ่งใช้เอาต์พุตที่จำเป็นเท่านั้นเพื่อให้สอดคล้อง
xnor

@xnor รู้สึกอิสระที่จะโพสต์คำตอบเหล่านั้นแยกจากกันฉันคิดว่าพวกเขาแตกต่างจากของฉันมากพอ ^^
Lynn


5

Brachylogขนาด9 10 ไบต์

*$ph$r*<90

ลองออนไลน์!

โดยทั่วไปใช้อัลกอริทึมเดียวกันกับคำตอบอื่นของฉัน $phค้นหาhปัจจัยหลัก ( $p) ตัวแรก( ); นี่เป็นปัจจัยสำคัญที่สุดเนื่องจากรายชื่อปัจจัยสำคัญของ Brachylog เปลี่ยนจากใหญ่ที่สุดไปหาน้อยที่สุด จากนั้นฉันใช้สแควร์รูท ( $r), double ( *) และทดสอบเพื่อดูว่ามันน้อยกว่า 90 ( <90)

ฉันต้องป้อนข้อมูลเป็นสองเท่าก่อนเพราะ 1 ไม่มีปัจจัยหลัก (และไม่มีปัจจัยหลักอันดับแรก) สิ่งนี้เป็นการเพิ่มปัจจัยสำคัญพิเศษ 2 ซึ่งไม่สามารถส่งผลกระทบต่อว่าหมายเลข 2017-friable แต่ป้องกันความล้มเหลวเมื่อจัดการ 1


5

ที่จริงแล้ว 9 ไบต์

τyM:44u²≥

ขอบคุณเดนนิสสำหรับจำนวนไบต์!

ลองออนไลน์!

คำอธิบาย:

τyM:44u²≥
τyM        largest prime factor of 2*input (doubled to deal with edge case of n = 1)
   :44u²   2025 (2027 is the next prime after 2017, so any number in [2017, 2026] can be used here - 2025 is very convenient)
        ≥  is 2025 greater than or equal to largest prime factor?

5

Mathematica, 66 74 ไบต์

ขอบคุณเดนนิสที่ชี้ให้เห็นว่าU+F4A1เป็นสิ่งต้องห้าม

Fold[Function[{x,d},And[x,Tr[Divisors@d^0]>6-4||d<44*46]],0<1,Divisors@#]&

คำอธิบาย:

Divisors@#: #รายชื่อตัวหารจำนวนเต็มของอาร์กิวเมนต์แรก

0<1: เล่นกอล์ฟเพื่อTrue(หลีกเลี่ยงการใช้ตัวอักษรe)

Divisors@d^0: รายชื่อของรูปแบบที่มีความยาวเท่ากับจำนวนของตัวหารของ{1, 1, ..., 1}d

Tr: สำหรับรายการแบบเรียบTrส่งกลับผลรวมของรายการนั้น จึงส่งกลับจำนวนของตัวหารของTr[Divisors@d^0]d

Function[{x,d},And[x,Tr[Divisors@d^0]>6-4||d<44*46]]: ฟังก์ชั่นที่ไม่เปิดเผยตัวกับสองข้อโต้แย้งและx dแนวคิดนี้dคือตัวหาร#และเราทดสอบเพื่อดูว่ามันเป็นคอมโพสิตหรือน้อยกว่าหรือเท่ากับ2017(รวม) 2017- ความน่าเชื่อถือนั้นเทียบเท่ากับตัวหารทั้งหมดที่เป็นไปตามเงื่อนไขนี้ ในฐานะที่เป็นais523ค้นพบเป็นสำคัญน้อยกว่าหรือเท่ากับเทียบเท่ากับการเป็นนายกน้อยกว่า2017 2025ในฐานะที่เป็นเกร็กมาร์ติน2024=44*46ชี้ให้เห็นก็พอเพียงที่จะทดสอบว่าจะเป็นน้อยกว่า อาร์กิวเมนต์xทำหน้าที่เป็นตัวสะสมสำหรับตัวหารทั้งหมดที่พบเพื่อตอบสนองคุณสมบัตินี้ จากนั้นเราก็ปล่อยให้Foldฟังก์ชันนี้ผ่านตัวหารทั้งหมดของ#ด้วยค่าเริ่มต้นTrueเนื่องจากเรามีการเข้าถึงค่ามิได้Map/@


1
วิธีการต่อสู้ผ่านข้อ จำกัด !
Greg Martin

2

05AB1E , 10 ไบต์

fθ46n99-›È

ส่งคืน 1 ถ้าเป็นจริงมิฉะนั้นจะเป็น 0

ลองออนไลน์!

คำอธิบาย

f          # Push the list of prime factors (ordered)
 θ         # Get the last element
  46n99-   # Push 2017 (46² - 99)
        >  # Push 1 if the last prime factor is greater than 2017, 0 otherwise
         È # Is the resulting number even ? Transforms 1 to 0 and 0 to 1.
           # Implicit display

ยินดีต้อนรับสู่ PPCG!
Martin Ender

1

MATL , 15 ไบต์

t:\~ftZp*44QU<A

เอาต์พุต0สำหรับ non-2017-friable หรือ1for 2017-friable

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

โปรแกรมนี้ตรวจสอบว่าทุกไบต์ประกอบกัน

คำอธิบาย

t       % Implicit input n. Duplicate
:       % Range [1 2 ... n]
\       % Modulo. Gives 0 for divisors of n
~f      % Indices of zero values
t       % Duplicate
Zp      % Is-prime. Gives 1 for primes, 0 for composites
*       % Multiply
44QU    % 44, add 1, square: 2025
<       % Less than, element-wise
A       % True (1) if all entries are nonzero

1

Bash, 144 ไบต์

การเข้ารหัส ASCII:

{
printf '[ '
`tr D-Z _-z <<<KFH`tor $1|tr -d :|`tr B-Z _-z <<<JUH`p -o '[0-9]*$'
printf ' -lt $[24*86-46] ]'
}|tr \\n \ |`tr B-Z _-z <<<EDVK`

ตามปกติสำหรับเชลล์รหัสทางออกบ่งชี้ความสำเร็จ (0) หรือความล้มเหลว (ไม่ใช่ -0)

นี่คือการสะกดที่แตกต่างกันของ

[ factor $1|tr -d :|grep -o '[0-9]*$' -lt 2018 ]

เราได้รับปัจจัยที่ใหญ่ที่สุดด้วยfactor $1|grep -o '[0-9]*$'; tr -d :คือการกรณีพิเศษสำหรับการป้อนข้อมูล 1=

นิพจน์$[6*6*69-466]ประเมินค่าเป็น 2018

มันยากที่จะใช้trสำหรับชื่อคำสั่งและยังคงใช้การทดแทนคำสั่ง - ฉันไม่สามารถใช้แบบฟอร์มซ้อนได้$( )ดังนั้นฉันจึงวางท่อไปยัง Bash อื่นเพื่อประเมินผลลัพธ์

ผลการทดสอบ:

$ for i in 1 2 80 2017 2019 2027 11111 45183 102349 999999 1234567 4068289; do printf '%d %s\n' $i `./105241.sh $i  && echo true || echo false`; done
1 true
2 true
80 true
2017 true
2019 true
2027 false
11111 true
45183 false
102349 false
999999 true
1234567 false
4068289 true

การยืนยันรหัสอักขระ:

$ grep -v '^#' ./105241.sh | perl -n -Mutf8 -E '$a = ord, print `factor $a` for split //, $_' | grep -v ': .* ' | wc -l
0




0

Braingolf 11 ไบต์ [ไม่ลงแข่งขันมาก]

VRp#ߢ-?0:1

ลองออนไลน์!

ไม่สามารถอ่านได้เนื่องจากߢสกรูตัวใดที่มีตัวเลขอยู่ แต่ยังคงใช้งานได้ในล่าม

ฉันไม่ได้สังเกตเห็นข้อ จำกัด ของตัวละครเมื่อฉันเขียนสิ่งนี้ แต่สิ่งที่ฉันต้องทำคือเปลี่ยนตัวละครยูนิโค้ดที่แปลกจาก 2017 เป็น 2018

ได้รับ 2018 ไม่ได้เป็นนายกที่สำคัญ ๆ<= 2018นอกจากนี้ยังมี<= 2017

คำอธิบาย

VRp#ߢ-?0:1  Implicit input from command-line args
VR            Create stack2, return to stack1
  p           Split last item into prime factors, push each one to stack in asc order
   #ߢ         Push 2018
     -      Subtract last 2 items (highest prime factor - 2017)
      ?     If last item > 0..
       0    ..push 1
        :   Else..
         1  ..Push 1
            Implicit output of last item on stack
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.