มันเป็นหมายเลขไซคลอปส์หรือไม่? "ไม่มีใครรู้!


66

งาน:

กำหนดอินพุตจำนวนเต็มให้คิดออกว่าเป็นหมายเลขไซคลอปส์หรือไม่

หมายเลขไซคลอปส์คุณอาจถามคืออะไร มันคือตัวเลขที่การแสดงเลขฐานสองมีเพียงจุดเดียว0ในศูนย์!

กรณีทดสอบ:

Input | Output | Binary  | Explanation
--------------------------------------
0     | truthy | 0       | only one zero at "center"
1     | falsy  | 1       | contains no zeroes
5     | truthy | 101     | only one zero at center
9     | falsy  | 1001    | contains two zeroes (even though both are at the center)
10    | falsy  | 1010    | contains two zeroes
27    | truthy | 11011   | only one zero at center
85    | falsy  | 1010101 | contains three zeroes
101   | falsy  | 1100101 | contains three zeroes
111   | falsy  | 1101111 | only one zero, not at center
119   | truthy | 1110111 | only one zero at center

การป้อนข้อมูล:

  • ประเภทจำนวนเต็มหรือเทียบเท่า ( int, long, decimalฯลฯ )

  • สมมติว่าหากการประเมินผลการป้อนข้อมูลในจำนวนเต็มล้นหรือปัญหาที่ไม่พึงประสงค์อื่น ๆ แล้วการป้อนข้อมูลนั้นไม่ต้องมีการประเมิน

เอาท์พุท:

  • ความจริงหรือเท็จ

  • เอาต์พุต Truthy / falsy ต้องเป็นไปตามข้อกำหนดของภาษาที่ใช้สำหรับความจริง / เท็จ (เช่น C 0เป็นเท็จไม่เป็นศูนย์เหมือนจริง)

กฏท้าทาย:

  • อินพุตที่น้อยกว่า 0 ถือว่าเป็นเท็จดังนั้นจึงไม่จำเป็นต้องได้รับการประเมิน

  • หากความยาวของการแสดงเลขฐานสองเป็นเลขคู่จะไม่สามารถเป็นหมายเลขไซคลอปส์ได้

กฎทั่วไป:


นี่เป็นความท้าทายครั้งแรกของการเขียนโปรแกรมปริศนา & รหัสกอล์ฟดังนั้นข้อเสนอแนะใด ๆ เกี่ยวกับวิธีที่ฉันควรปรับปรุงจะได้รับการชื่นชมมาก!


25
หมายเหตุ: นี่คือA129868
TSH

35
+1 สำหรับการอ้างอิงวัฒนธรรมป๊อปปลายปี 2800 ในชื่อ
Sanchises

จำนวนสูงสุดที่จะทดสอบคือเท่าใด
Serverfrog

@Serverfrog ตั้งแต่ฉันไม่ได้ระบุขีด จำกัด สมมติว่าจำนวนเต็มบวกใด ๆ ที่สามารถทดสอบได้
เอกภาพ

อนุญาตให้ป้อนข้อมูลไบนารีหรือไม่
Qwertiy

คำตอบ:


11

Japtet, 8 ไบต์

1¥¢q0 äè

เปิดใช้งานออนไลน์

คำอธิบาย:

1¥¢q0 äè   
                                                              119
  ¢          // Convert the input into a binary string        "1110111"
   q0        // Split the string on "0"                       ["111","111"]
      ä      // Reduce each item by:                            a     b
       è     //   Seeing how many times a is found in b       [1]
 1¥          // == 1; See if the result equals 1              True                                         

แนวคิดคือการแยกสตริงไบนารีที่0ซึ่งจะให้ผลลัพธ์สองรายการหากมีเพียงหนึ่ง0รายการ จากนั้นเราจะดูว่ารายการแรกตรงกับที่สองหรือไม่ หากสตริงไบนารีมีหลาย0s การลดจะส่งคืนอาร์เรย์หลายไอเท็มและนั่นจะทำให้==1เงื่อนไขล้มเหลว ถ้าสตริงไบนารีจะมีหนึ่ง0แต่ไม่ได้เป็น palindromic, äèจะกลับมา0เพราะbมีการแข่งขันของ0a


1
เอาสมองที่เตรียมไว้ล่วงหน้าของฉันสองสามวินาทีเพื่อดูว่าเกิดอะไรขึ้นที่นี่! ทำได้ดีมาก ควรทำงานเช่นกัน
Shaggy

1
ฉันไม่รู้จัก Japtor แต่ถ้าฉันเข้าใจถูกต้องมันจะทำสิ่งต่อไปนี้: ¤= แปลงเป็นไบนารี; q0= แยกเป็น 0s; äèฉันไม่แน่ใจทั้งหมด .. ; และแฟ-Nล็กจะแปลงรายการเป็นNaNแต่ใบไม้0และ1เหมือนกัน สำหรับäèส่วนที่ฉันจะเห็นว่า119เป็น[111,111]หลังจากที่แยกซึ่งäèเปลี่ยนแปลงไป1; และ85เป็น[1,1,1,1]หลังจากที่แยกซึ่งเปลี่ยนแปลงไปäè [1,1,1]คุณอธิบาย.ä("è")ได้ไหมว่าทำงานอย่างไร
Kevin Cruijssen

2
@KevinCruijssen ฉันได้เพิ่มคำอธิบายแล้ว ฉันหวังว่าจะช่วย
Oliver

1
คือNaNfalsey ใน Japt? (เช่นถ้าคุณดำเนินการ if-else ด้วยว่าเป็นเงื่อนไขหากได้รับการดำเนินการหรือไม่ "เอาท์พุทความจริง / เท็จต้องเป็นไปตามข้อกำหนดของภาษาที่ใช้สำหรับความจริง / เท็จ") นอกจากนี้ยัง2ให้ผลตอบแทน2ที่ฉันสงสัยว่าเป็นเท็จ เหมือน 05AB1E)
Jonathan Allan

1
JS สันนิษฐานว่าจำนวนเต็มใด ๆ ที่นอกเหนือจาก0นั้นถือว่าเป็นความจริง ... อย่างไรก็ตามหาก2กลับมา2เป็นความจริงการส่งนี้อาจต้องทำใหม่
เอกภาพ

21

Python 2 , 30 ไบต์

lambda n:(2*n^2*n+3)**2==8*n+9

ลองออนไลน์!

โปรดทราบว่านั่น2*n^2*n+3คือค่าบิตของ xor 2*nและ2*n+3เนื่องจากเป็นตัวดำเนินการของ Python


1
มันจะเป็นที่ยอมรับที่จะกลับมาlambda n:(2*n^2*n+3)**2-8*n-9พร้อมกับค่าตอบแทน0สำหรับหมายเลขไซคลอปส์?
Eric Duminil

2
อัตราผลตอบแทนนี้TRUEสำหรับn = -1
2390246

3
@ user2390246 ปัญหานี้เห็นได้ชัดว่าไม่ได้มีไว้สำหรับเชิงลบ - ถ้าเป็นเช่นนั้นการแก้ปัญหาที่ยอมรับทั้งหมดจะต้องเป็นเชิงลบ (และวิธีการที่ไพ ธ อนใช้จำนวนเต็มจะหมายความว่าไม่ควรยอมรับวิธีแก้ปัญหาในไพ ธ อน)
DreamConspiracy

3
@SolomonUcko จำนวนลบมักจะถูกเก็บไว้ในการเป็นตัวแทนเติมเต็มสอง พิจารณาจำนวนเต็มขนาดคงที่ก่อน (ตัวอย่างเช่น 32 บิต) ในคุณสมบัติอื่น ๆ TCR ต้องการให้ MSB เป็น 1 ในจำนวนลบและ 0 เป็นบวก นี่จะต้องทันทีว่าผลลัพธ์ที่เป็นบวกทั้งหมดเป็นเท็จ ในไพ ธ อนเรามีปัญหามากกว่านี้ จำนวนลบโดยนัยมีลำดับที่ไม่มีที่สิ้นสุดของ 1s ในทิศทางที่สำคัญที่สุด ขอให้โชคดีที่พยายามค้นหาจุดกลางๆนั่น
DreamConspiracy

2
@ user2390246 ปัญหาได้รับการแก้ไขเพื่อให้ความกระจ่างว่ารหัสของเราไม่จำเป็นต้องใช้สำหรับเนกาทีฟ มันอาจจะได้รับการจัดการสำหรับ 2 >1ไบต์โดยท้าย
xnor

18

x86 รหัสเครื่อง, 17 ไบต์

8D 47 01 31 F8 89 C2 F7 D2 0F AF C2 8D 44 78 02 C3

ไบต์ข้างต้นกำหนดฟังก์ชั่นที่ยอมรับค่าอินพุตจำนวนเต็ม 32- บิต (ในการEDIลงทะเบียนสำหรับตัวอย่างนี้ตามหลักการทั่วไปของการเรียก System V แต่คุณสามารถเลือกอินพุตที่คุณต้องการได้โดยไม่กระทบกับขนาดของผลลัพธ์ รหัส) และส่งคืนผลลัพธ์ (ในEAXรีจิสเตอร์) ระบุว่าค่าอินพุตเป็นหมายเลขไซคลอปส์หรือไม่

อินพุตถือว่าเป็นจำนวนเต็มที่ไม่ได้ลงนามเนื่องจากกฎการท้าทายระบุว่าเราสามารถละเว้นค่าลบได้

ตรรกะการตัดสินใจถูกยืมมาจากคำตอบของนีล : เนื่องจากหมายเลขไซคลอปส์มีรูปแบบเราสามารถใช้ชุดของการดำเนินการแบบทวิบิตเพื่อตรวจสอบ อินพุตn=(2k+1)(2k11)

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

ใน mnemonics ภาษาแอสเซมบลีนี่คือ:

; EDI = input value
; EAX = output value (0 == Cyclops number)
8D 47 01           lea    eax, [edi + 1]          ; \ EAX = ((EDI + 1) ^ EDI)
31 F8              xor    eax, edi                ; /
89 C2              mov    edx, eax                ; \ EDX = ~EAX
F7 D2              not    edx                     ; /
0F AF C2           imul   eax, edx                ; EAX *= EDX
8D 44 78 02        lea    eax, [eax + edi*2 + 2]  ; EAX  = (EAX + (EDI * 2) + 2)
C3                 ret                            ; return, with EAX == 0 for Cyclops number

ลองออนไลน์!


ตามที่สัญญาไว้หากคุณคิดว่าการโกงเพื่อสลับความหมายของความจริง / ความเท็จแม้ในรหัสเครื่องที่ไม่มีมาตรฐานหรือการประชุมที่แท้จริงให้เพิ่มอีกสามไบต์รวม21 ไบต์ :

; EDI = input value
; AL  = output value (1 == Cyclops number)
8D 47 01           lea    eax, [edi + 1]          ; \ EAX = ((EDI + 1) ^ EDI)
31 F8              xor    eax, edi                ; /
89 C2              mov    edx, eax                ; \ EDX = ~EAX
F7 D2              not    edx                     ; /
0F AF C2           imul   eax, edx                ; EAX *= EDX
8D 44 78 01        lea    eax, [eax + edi*2 + 1]  ; EAX  = (EAX + (EDI * 2) + 1)
40                 inc    eax                     ; EAX += 1
0F 94 C0           setz   al                      ; AL = ((EAX == 0) ? 1 : 0)
C3                 ret                            ; return, with AL == 1 for Cyclops number

ครึ่งแรกของรหัสนี้เหมือนกันกับต้นฉบับ (ผ่านimulคำสั่ง) leaเกือบจะเหมือนกัน แต่แทนที่จะเพิ่มคงที่ 2 ก็เพียง แต่เพิ่มอย่างต่อเนื่อง 1. นั่นเป็นเพราะต่อไปนี้incการเรียนการสอนเพิ่มค่าในการEAXลงทะเบียนภายในวันที่ 1 เพื่อที่จะตั้งธง หากตั้งค่าสถานะ "ศูนย์" setzคำสั่งจะตั้งค่าALเป็น 1 มิฉะนั้นALจะถูกตั้งค่าเป็น 0 นี้เป็นวิธีมาตรฐานที่คอมไพเลอร์ C boolจะสร้างรหัสเครื่องกลับ

การเปลี่ยนค่าคงที่ที่เพิ่มในleaคำสั่งนั้นไม่เปลี่ยนขนาดรหัสและincคำสั่งนั้นเล็กมาก (เพียง 1 ไบต์) แต่setzคำสั่งนั้นค่อนข้างใหญ่ 3 ไบต์ น่าเสียดายที่ฉันไม่สามารถคิดถึงวิธีการเขียนที่สั้นกว่านี้ได้


4
นี่เป็นไปอย่างรวดเร็วฉันคิดว่ามันสมควรที่จะถูกแสดงออกมาโดยการทดสอบตัวเลขทั้งหมดที่มีค่ามาก: ลองออนไลน์!
Deadcode

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

ตามมติฉันทามติไม่สามารถคืนค่าสถานะในการส่ง asm codegolf.stackexchange.com/a/165020/84624และstackoverflow.com/questions/48381234/ … ถ้าเป็นเช่นนั้นคุณสามารถ - 3 จากคำตอบที่สองของคุณ
640KB

9

Regex (ECMAScript), 60 58 57 60 58 ไบต์

อินพุตอยู่ในสภาวะเดียวกันเนื่องจากความยาวของสตริงของsnx

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

-2 bytes โดยอนุญาตให้ backtracking ในการค้นหาz -1 byte ขอบคุณ Grimyโดยค้นหาจากน้อยที่สุดไปหามากที่สุดแทนที่จะเป็นตรงกันข้ามในทางกลับกัน+3 ไบต์เพื่อจัดการศูนย์-2 ไบต์โดยการย้ายการจับรากที่สองนอก lookaheadz
z

นี้ทำงานโดยการหาอำนาจตารางที่สมบูรณ์แบบของ 2 ที่nเฉพาะกำลังสองที่สมบูรณ์แบบที่ใหญ่ที่สุดที่ 2 ไม่เกินสามารถตอบสนองสิ่งนี้ได้ แต่เนื่องจากการเพิ่มประสิทธิภาพของกอล์ฟ Regex จึงพยายามทั้งหมดของพวกเขาเริ่มต้นด้วยขนาดที่เล็กที่สุด เนื่องจากแต่ละอันสอดคล้องกับหมายเลขไซคลอปส์มีเพียงอันที่ใหญ่ที่สุดเท่านั้นที่สามารถส่งผลให้เกิดการแข่งขันzn=2(nz)+z+1n

^(x*)(?!(x(xx)+)\2*$)(x(x*))(?=(?=(\4*)\5+$)\4*$\6)x\1$|^$

ลองออนไลน์!

^                 # N = tail
(x*)              # tail = Z, with the smallest value that satisfies the following
                  # assertions (which is no different from the largest value that
                  # would satisfy them, since no more than one value can do so);
                  # \1 = N - Z

(?!(x(xx)+)\2*$)  # Assert Z is a power of 2

# Assert Z is a perfect square, and take its square root
(x(x*))           # \4 = square root of Z; \5 = \4 - 1; tail = N - \1 - \4
(?=(\4*)\5+$)     # iff \4*\4 == Z, then the first match here must result in \6==0
(?=\4*$\6)        # test for divisibility by \4 and for \6==0 simultaneously

# Assert that N == \1*2 + \4 + 1. If this fails, then due to a golf optimization,
# the regex engine will backtrack into the capturing of \4, and try all smaller
# values to see if they are the square root of Z; all of these smaller values will
# fail, because the \4*\4==Z multiplication test only matches for one unique value
# of \4.
x\1$

|^$               # Match N==0, because the above algorithm does not

OP ชี้แจงว่า 0 ควรเป็นจริงดังนั้นในปัจจุบันนี้ไม่สามารถแก้ปัญหาได้
Grimy

1
ไม่ง่าย^(1*)0\1$พอใช่ไหม
ศูนย์รวมแห่งความไม่รู้

4
@EmbodimentofIgnorance เฉพาะหากอินพุตอยู่ในรูปแบบไบนารี นั่นจะทำให้ความท้าทายเป็นเรื่องไม่สำคัญมาก ใช้อินพุตแบบยูนารีอย่างสม่ำเสมอซึ่งมีความน่าสนใจมากกว่า
Deadcode

9

JavaScript (Node.js)ขนาด 20 ไบต์

p=>~p==(p^=p+1)*~p/2

ลองออนไลน์!

บางทีนี่อาจจะถูกต้องบางที

ขอบคุณ Grimy บันทึก 1 ไบต์


JavaScript (Node.js)ขนาด 32 ไบต์

f=(p,q)=>p&1?f(p/2,q+q|2):!(p^q)

ลองออนไลน์!


JavaScript (Node.js)ขนาด 34 ไบต์

p=>/^(1*)0\1$/.test(p.toString(2))

ลองออนไลน์!



ทดสอบไม่ตรงกัน
edc65

1
@ edc65 คุณค้นพบ testcase ที่ล้มเหลวหรือไม่?
tsh

2
@tsh .testไม่ใช่.match
ASCII เท่านั้นเท่านั้น

@ ASCII-only ว้าวเสียงดี ... คุณอ่านนี่ได้อย่างไร
tsh



7

Mathematica (ภาษา Wolfram), 32 31 ไบต์

บันทึก 1 ไบต์ต้องขอบคุณ J42161217!

OddQ@Log2[#+Floor@Sqrt[#/2]+2]&

ลองออนไลน์!

ฟังก์ชั่นการถ่ายเพียวจำนวนเต็มเป็น input และกลับมาหรือTrue Falseขึ้นอยู่กับความจริง (สนุกที่จะพิสูจน์!) ว่าตัวเลขnคือไซคลอปส์ถ้าและถ้าnบวกสแควร์รูทของn/2บวก2รอบลงไปด้วยพลังแปลก ๆ ของ 2 (หนึ่งสามารถแทนที่Floorด้วยอย่างใดอย่างหนึ่งCeilingหรือRoundตราบใดที่หนึ่งแทนที่+2ด้วย+1) ผลตอบแทนกับการป้อนข้อมูลTrue0


1
คุณสามารถบันทึก 1 ไบต์โดยใช้Log2[#+Floor@Sqrt...
J42161217

และอีก 1 การใช้√()แทนSqrt[]
attinat

จำนวนไบต์ถูกต้องหรือไม่ TIO ให้ 32 ไบต์สำหรับโปรแกรมปัจจุบัน
mbomb007

@ mbomb007 aha TIO ไม่ได้รวมการประหยัด 1 ไบต์ของ J42161217 แก้ไขแล้ว.
เกร็กมาร์ติน

มีเหตุผลที่คุณไม่ได้ใช้สิ่งที่แนะนำหรือไม่
mbomb007


5

Japtet, 8 ไบต์

¢ðT ¥¢Êz

ขอบคุณ Luis felipe de Jesus Munoz สำหรับการแก้ไขการส่งของฉัน!

ลองออนไลน์!

โซลูชันที่ใช้ regex แบบเก่า 15 ไบต์

¤f/^(1*)0\1$/ l

ส่งคืน 1 สำหรับจริง, 0 สำหรับเท็จ

ลองออนไลน์!


เล่นได้ดีฉันควรเรียนรู้การแสดงออกปกติบางครั้ง :) +1
Quintec

1
@Quintec Regex ยอดเยี่ยม :)
ศูนย์รวมของความไม่รู้

อัปเดต: พบวิธีที่สั้นกว่า :)
Quintec


1
@LuisfelipeDejesusMunoz ขอบคุณนั่นเป็นการใช้งานที่ดีของ==ผู้ดำเนินการ!
ศูนย์รวมแห่งความไม่รู้

4

เยลลี่ ,  8  7 ไบต์

-1 ต้องขอบคุณ Erik the Outgolfer (ใช้ isPalindrome ในตัวŒḂ, แทน⁼Ṛ$)

B¬ŒḂ⁼SƊ

Monadic Link ยอมรับจำนวนเต็มซึ่งให้1(ความจริง) หรือ0(เท็จ)

ลองออนไลน์!

อย่างไร?

B¬ŒḂ⁼SƊ - Link: integer             e.g. 1    9          13         119
B       - to base 2                      [1]  [1,0,0,1]  [1,1,0,1]  [1,1,1,0,1,1,1]
 ¬      - logical NOT (vectorises)       [0]  [0,1,1,0]  [0,0,1,0]  [0,0,0,1,0,0,0]
      Ɗ - last three links as a monad:
  ŒḂ    -   is a palindrome?             1    1          0          1
     S  -   sum                          0    2          1          1
    ⁼   -   equal?                       0    0          0          1

ดูเหมือนว่าคุณจะมีความคิดที่ฉลาดต่อหน้าฉัน แต่ความฉลาดของมันไม่ชัดเจน ( Bċ0⁼1ȧŒḂคือ 8 ไบต์) ⁼Ṛ$เช่นเดียวกับŒḂ-1 นอกจากนี้คุณไม่จำเป็นต้องจัดการกับจำนวนลบ
Erik the Outgolfer

ขอบคุณ Erik ที่เป็น palindrome ในตัวลื่นใจของฉันด้วยเหตุผลบางอย่าง!
Jonathan Allan

ที่จริงแล้วคุณยังสามารถใช้ṚƑแทนได้ทุกวันนี้ดังนั้นคุณอาจต้องการที่จะจำมันแบบนั้น (สิ่งที่สำคัญที่สุดƑ)
Erik the Outgolfer


4

Regex (ECMAScript), 53 47 ไบต์

-6 ไบต์ขอบคุณทั้ง Deadcode และ Grimy

^((?=(x*?)(\2((x+)x(?=\5$))+x$))(?!\2{6})\3x)*$

ลองออนไลน์!


ในระหว่างการแสดงความคิดเห็นและพิสูจน์ regex ของคุณ (ยังไม่เสร็จ) ฉันได้รับมันที่ 50 ไบต์: ^((?=(x(x*?))(\3((x+)(?=\6$))+xx$))(?!\2{6})x\4)*$( ลองออนไลน์! )
Deadcode

4

Brachylogขนาด 8 ไบต์

ḃD↔Dḍ×ᵐ≠

นี่เป็นเพรดิเคตที่ทำสำเร็จหากอินพุตเป็นหมายเลขไซคลอปส์และล้มเหลวหากอินพุตไม่ใช่หมายเลขไซคลอปส์ ความสำเร็จ / ความล้มเหลวเป็นแนวคิดพื้นฐานของความจริง / เท็จที่สำคัญที่สุดใน Brachylog

ลองออนไลน์! หรือหาผล truthy ทั้งหมดขึ้นอยู่กับ 10000

คำอธิบาย

          Input is an integer
ḃ         Get its binary representation, a list of 1's and 0's
 D        Call that list D
  ↔       When reversed...
   D      It's the same value D
    ḍ     Dichotomize: break the list into two halves
          One of these halves should be all 1's; the other should contain the 0
     ×ᵐ   Get the product of each half
       ≠  Verify that the two products are not equal

สิ่งนี้จะประสบความสำเร็จก็ต่อเมื่อได้รับหมายเลขไซคลอปส์เพราะ:

  • หากการเป็นตัวแทนไบนารีไม่ใช่ palindrome D↔Dจะล้มเหลว ในสิ่งต่อไปนี้เราสามารถสันนิษฐานได้ว่าเป็น Palindrome
  • หากมีมากกว่าหนึ่งศูนย์ทั้งสองส่วนจะมีอย่างน้อยหนึ่งศูนย์ ดังนั้นผลิตภัณฑ์ทั้งคู่จะเป็นศูนย์และ×ᵐ≠จะล้มเหลว
  • หากไม่มีศูนย์ทั้งสองส่วนจะมีเพียงครึ่งเดียว ดังนั้นผลิตภัณฑ์จะเป็นหนึ่งเดียวและ×ᵐ≠จะล้มเหลว
  • กรณีนี้มีค่าเท่ากับศูนย์ เนื่องจากเรารู้แล้วว่าเรามี Palindrome นี่ต้องเป็นจุดศูนย์กลาง จะปรากฏในครึ่งเดียวทำให้ผลิตภัณฑ์ของครึ่งนั้นเป็นศูนย์ อีกครึ่งหนึ่งจะบรรจุทั้งหมดดังนั้นผลิตภัณฑ์จะเป็นหนึ่ง จากนั้นเรามี 1 ≠ 0 ×ᵐ≠สำเร็จและภาคแสดงทั้งหมดประสบความสำเร็จ

3

Ruby , 27 24 ไบต์

แปลงเป็นไบนารี่และตรวจสอบด้วย regex ส่งคืน0ถ้าเป็นจริงnilหากเป็นเท็จ

-3 ไบต์ต้องขอบคุณGB

->n{"%b"%n=~/^(1*)0\1$/}

ลองออนไลน์!

สำหรับอีกสองไบต์จะมีพอร์ตโดยตรงของโซลูชัน Python:

->n{(2*n^2*n+3)**2==8*n+9}

@GB ขอบคุณมาก!
Eric Duminil

3

05AB1E , 8 (หรือ 9) ไบต์

bD0¢sÂQ*

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

ผลตอบแทน1ถ้าความจริง; 0หรือจำนวนเต็มบวกใด ๆ นอกเหนือจากที่1เป็นเท็จ ใน 05AB1E 1นั้นเป็นความจริงเท่านั้นและทุกอย่างอื่นเป็นเท็จ แต่ฉันไม่แน่ใจว่านี่เป็นเอาต์พุตที่อนุญาตหรือถ้าผลลัพธ์ควรเป็นค่าที่สอดคล้องและเป็นค่าสองค่า ถ้าที่สองต่อท้ายΘสามารถเพิ่มเพื่อเอาท์พุทอื่น ๆ ทั้งหมดกว่า1กลายเป็น0:

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

คำอธิบาย:

b     # Convert the (implicit) input-integer to a binary-string
 D    # Duplicate it
  0¢  # Count the amount of 0s
 s    # Swap to get the binary again
  ÂQ  # Check if it's a palindrome
 *    # Multiply both (and output implicitly)

  Θ   # Optionally: check if this is truthy (==1),
      # resulting in truthy (1) or falsey (0)

วิธีการทางคณิตศาสตร์จะมีขนาด 10 ไบต์:

LoD<s·>*Iå

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

คำอธิบาย:

a(n)=(2n1)(22n+1)

L        # Create a list in the range [1, (implicit) input-integer]
 o       # For each integer in the list, take 2 to the power this integer
  D<     # Create a copy, and decrease each value by 1
  s·     # Get the copied list again, and double each value
    >    # Then increase each value by 1
  *      # Multiply the numbers at the same indices in both lists
     Iå  # Check if the input-integer is in this list
         # (and output the result implicitly)

การ1ยอมรับความจริงและตัวเลขอื่น ๆ เป็นเท็จนั้นเป็นสิ่งที่ยอมรับได้สำหรับความท้าทายนี้เนื่องจากภาษาอื่น (เช่น C และ TI-BASIC) มีคำจำกัดความความจริง / เท็จที่คล้ายกัน (0 / ไม่ใช่ศูนย์สำหรับทั้งคู่) ตราบใดที่สิ่งที่ถือว่าตรงกับความจริงหรือเท็จกับภาษาของ specifcations แล้วมันเป็นเกมที่ยุติธรรม
เอกสิทธิ์

3

Excel, 97 63 ไบต์

=A1=2*4^(ROUND(LOG(A1,4),0))-2^(ROUND(LOG(A1,4),0))-1

คำนวณ 2 ตัวเลข:

พลังที่ใกล้เคียงที่สุดเป็นสองเท่าของ 4
>Num|Binary|2*Power4|Binary
> 1| 1| 2* 1= 2| 10
> 2| 10| 2* 4= 8| 1000
> 4| 100| 2* 4= 8| 1000
> 20| 10100| 2*16=32|100000

 

1 บวกสแควร์รูทของกำลังที่ใกล้ที่สุด 4
>Num|Binary|1+√Power4|Binary
> 1| 1|1+ √1= 2| 10
> 2| 10|1+ √4= 3| 11
> 4| 100|1+ √4= 3| 11
> 20| 10100|1+ √16= 5| 101

จากนั้นลบจำนวนที่สองจากหมายเลขแรก:

>Num|Binary|2*Power4|Binary|1+√Power4|Binary|a-b|Binary
> 1| 1| 2* 1= 2| 10|1+ √1= 2| 10| 0| 0
> 2| 10| 2* 4= 8| 1000|1+ √4= 3| 11| 5| 101
> 4| 100| 2* 4= 8| 1000|1+ √4= 3| 11| 5| 101
> 20| 10100| 2*16=32|100000|1+ √16= 5| 101| 27| 11011

และเปรียบเทียบผลลัพธ์นี้กับหมายเลขเดิม

วิธีเก่า

=DEC2BIN(A1)=REPLACE(REPT("1",1+2*INT(IFERROR(LOG(A1,2),0)/2)),1+IFERROR(LOG(A1,2),0)/2,1,"0")

เริ่มด้วย Log-base-2 ของ A1 และปัดเศษเป็นเลขคู่ที่ใกล้ที่สุดจากนั้นบวก 1

ถัดไปสร้างสตริงของ"1"s จำนวนมากและแทนที่อักขระกลางด้วย a "0"เพื่อสร้างหมายเลขไซคลอปส์ด้วยความยาวไบนารีที่คี่เสมอและเหมือนกับหรือ 1 น้อยกว่าความยาวไบนารีของ A1

จากนั้นเปรียบเทียบกับการแทนค่า Binary ของ A1


3

R , 37 33 ไบต์

(x=scan())%in%(2*4^(n=0:x)-2^n-1)

ลองออนไลน์!

R ไม่มี built-in สำหรับการแปลงเป็นไบนารี่ดังนั้นฉันจึงใช้สูตรใดสูตรหนึ่งจาก OEIS เพื่อคำนวณรายการคำศัพท์จากลำดับ

n<-0:xสร้างรายการค่าเริ่มต้นเผื่อแผ่ 2*4^(n<-0:x^2)-2^n-1)คือสูตรจาก OEIS จากนั้นจะตรวจสอบว่าอินพุตปรากฏในลำดับนั้นโดยใช้%in%หรือไม่

-2 ไบต์โดยไม่ต้องจัดการกับอินพุตเชิงลบ ไบต์ -2 โดยการจดจำฉันจะเปลี่ยนไป<-=


3

C (gcc), 26 ไบต์

f(n){n=~n==(n^=-~n)*~n/2;}

ลองออนไลน์!

ท่าเรือคำตอบของนีล อาศัยการจัดลำดับการดำเนินการที่กำหนดโดยการนำไปปฏิบัติ

C ++ (เสียงดังกราว), 38 ไบต์

int f(int n){return~n==(n^=-~n)*~n/2;}

ลองออนไลน์!

ไม่สามารถละเว้นประเภทใน C ++ ไม่สามารถละเว้นการส่งคืนเป็นเสียงดังกราวหรือไม่เหมือนกัน


1
ฉันต้องการให้คำตอบ C ++ แตกต่างจากคำตอบ C โดยใช้returnแทนการใช้ประโยชน์จากผลตอบแทนการสะสมโดยปริยายที่เปราะบางและขึ้นอยู่กับแพลตฟอร์ม
Deadcode

2
ฉันต้องการกฎที่จะต้องมีการปฏิบัติตามมาตรฐาน แต่พวกเขาไม่ทำดังนั้นการใช้สิ่งนี้จะไม่ดีนัก C ++ (เสียงดังกราว) ต้องการผลตอบแทนทำให้ 38 ไบต์นี้
Grimy

จากนั้นคุณสามารถหลีกเลี่ยงปัญหานี้ได้โดยให้ C (gcc) และ C ++ (เสียงดังกราว) ในคำตอบของคุณแทนที่จะเป็น C (gcc) และ C ++ (gcc) ฉันทำไปแล้ว
Deadcode


3

J , 22 19 17 15 14 ไบต์

-3 ไบต์ขอบคุณ BolceBussiere!

-4 ไบต์ต้องขอบคุณ ngn!

-1 ไบต์ขอบคุณ Traws!

J , 14 ไบต์

1=1#.(*:|.)@#:

ลองออนไลน์!


1
#=1++/­­­­­­­
ngn

1
(#=1++/)@(*|.)@#:
ngn

1
1=1#.1-(*|.)@#:
ngn

1
ฉันไม่ทราบ J พอที่จะใช้มัน แต่มันสนุกที่จะเรียนรู้จากรหัสของคนอื่นโดยพยายามที่จะตัดให้สั้นลง
NGN

1
-1 ไบต์1=1#.(*:|.)@#:
Traws


2

ทูต , 22 ไบต์

{Flip@_=_∧1=0~_}@Bin

ลองออนไลน์!

ทางเลือก

27 ไบต์: {BitXor[2*_,2*_+3]^2=8*_+9}

27 ไบต์: {BitXor@@(2*_+0'3)^2=8*_+9}

27 ไบต์: {Palindromic@_∧1=0~_}@Bin

28 ไบต์: {BitXor[...2*_+0'3]^2=8*_+9}

28 ไบต์: {BitXor[…2*_+0'3]^2=8*_+9}

28 ไบต์: {Same@@Bisect@_∧1=0~_}@Bin

29 ไบต์: {_[#_/2|Floor]=0∧1=0~_}@Bin

30 ไบต์: Same@Bin@{_+2^Floor[Log2@_/2]}

30 ไบต์: {_[#_/2|Floor]=0and 1=0~_}@Bin


2

เรติน่า 0.8.2 , 38 37 ไบต์

.+
$*
+`^(1+)\1
$+0
10
1
^((1+)0\2)?$

ลองออนไลน์! ลิงค์มีกรณีทดสอบ แก้ไข: หลังจากชี้แจงโซลูชั่นก่อนหน้านี้ไม่ได้จัดการศูนย์อย่างถูกต้อง คำอธิบาย:

.+
$*

แปลงจากทศนิยมเป็นเอก

+`^(1+)\1
$+0
10
1

แปลงจาก unary เป็นไบนารี่โดยใช้วิธีจาก Retina wiki

^((1+)0\2)?$

ตรวจสอบจำนวนเดียวกัน1ก่อนและหลัง0หรือสตริงว่าง (ซึ่งเป็นวิธีการแปลงข้างต้นจัดการศูนย์)


1

แบตช์39 37 ไบต์

@cmd/cset/a"m=%1^-~%1,!(m/2*(m+2)-%1)

n=(2k+1)(2k11)m=2k1n=m2(m+2)n


1

Excel, 101 107ไบต์

-6 ไบต์ขอบคุณ @Chronocidal

=AND(ISEVEN(LOG(A1,2)),MID(DEC2BIN(A1),LEN(DEC2BIN(A1))/2+1,1)="0",LEN(SUBSTITUTE(DEC2BIN(A1),1,))=1)

ทำการตรวจสอบ 3 ครั้ง:

  • ความยาวคี่
ISEVEN(LOG(A1,2))
  • ตัวอักษรกลางคือ 0
MID(DEC2BIN(A1),LEN(DEC2BIN(A1))/2+1,1)="0"
  • มีอยู่คนเดียว 0
LEN(SUBSTITUTE(DEC2BIN(A1),1,))=1

1
บันทึก 6 ไบต์โดยเปลี่ยนISODD(LEN(DEC2BIN(A1)))เป็นISEVEN(LOG(A1,2))
Chronocidal


1

VBA, 41 36 ไบต์

x=2^Int([Log(A1,4)]):?[A1]=2*x^2-x-1

เรียกใช้ในหน้าต่างทันทีด้วยการปิดการประกาศอย่างชัดเจน อินพุตคือเซลล์A1ของแผ่นงานที่ใช้งานอยู่ ส่งออกจริง / เท็จไปที่หน้าต่างทันที

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

บันทึกไบต์บางเมื่อคำนวณตัวเลขไซคลอปส์โดยการลดพวกเขาในรูปแบบy = 2x^2 - x - 1(ที่x = n-1สำหรับที่ nจำนวนไซคลอปส์หรือx = 2^Int(Log([A1])/Log(4))เพื่อหาจำนวนไซคลอปส์ที่ใหญ่ที่สุดที่มีจำนวนน้อยกว่าหรือเท่ากับบิต) และการจัดเก็บ x ในตัวแปร

(-5 ไบต์ขอบคุณTaylor Scott !)


1
แทนการแปลงฐานของบันทึกโดยใช้ส่วนการบันทึกคุณสามารถเปลี่ยนได้โดยตรงโดยใช้[...]สัญกรณ์เป็น[(Log(A1,4)]
Taylor Scott

1

PHP , 74 ไบต์

function($x){return($c=strlen($a=decbin($x)))&1&&trim($a,1)===$a[$c/2|0];}

ลองออนไลน์!

วิธีการที่ไม่ใช่คณิตศาสตร์ทั้งหมดเป็นเพียงแค่สตริง

function cyclops( $x ) {
    $b = decbin( $x );     // convert to binary string (non-zero left padded)
    $l = strlen( $b );     // length of binary string
    $t = trim( $b, 1 );    // remove all 1's on either side
    $m = $b[ $l / 2 |0 ];  // get the middle "bit" of the binary string
    return 
        $l & 1 &&          // is binary string an odd length?
        $t === $m;         // is the middle char of the binary string the same as
                           // the string with left and right 1's removed? (can only be '0')
}

หรือ60 ไบต์ขึ้นอยู่กับขั้นตอนวิธีการ @ Chronocidal ของดังกล่าวข้างต้น

function($x){return decbin($x)==str_pad(0,log($x,2)|1,1,2);}

ลองออนไลน์!


1

Haskell, 82 ไบต์

import Text.Printf
(`all`[(==)<*>reverse,("0"==).filter(<'1')]).flip($).printf"%b"

และพอร์ตของโซลูชัน Python ของ xnor:

Haskell, 47 ไบต์

import Data.Bits
\n->(2*n`xor`(2*n+3))^2==8*n+9
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.