Đây có phải là số Cyclops không? "Không ai biết!


66

Bài tập, nhiệm vụ:

Đưa ra một đầu vào số nguyên, tìm hiểu xem đó có phải là Số Cyclops hay không.

Số Cyclops là gì, bạn có thể hỏi? Chà, đó là một con số mà đại diện nhị phân chỉ có một 0ở trung tâm!

Các trường hợp thử nghiệm:

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

Đầu vào:

  • Một số nguyên hoặc loại tương đương. ( int, long, decimal, Vv)

  • Giả sử rằng nếu đánh giá kết quả đầu vào trong một tràn số nguyên hoặc các vấn đề không mong muốn khác, thì đầu vào đó không phải được đánh giá.

Đầu ra:

  • Sự thật hay giả dối.

  • Đầu ra thật / giả phải đáp ứng các thông số kỹ thuật của ngôn ngữ được sử dụng cho tính trung thực / giả. (ví dụ C có 0sai, khác không là đúng)

Quy tắc thử thách:

  • Đầu vào nhỏ hơn 0 được coi là giả và do đó không phải đánh giá.

  • Nếu độ dài của biểu diễn nhị phân của số là chẵn thì số đó không thể là số Cyclops.

Quy tắc chung:


Đây là thử thách Lập trình & Câu đố Code Code đầu tiên của tôi , vì vậy mọi phản hồi về cách tôi nên cải thiện sẽ được đánh giá cao!


25
Lưu ý: Đây là A129868
tsh

35
+1 cho tài liệu tham khảo văn hóa nhạc pop muộn 2800 năm trong tiêu đề
Sanchise

số lượng tối đa được thử nghiệm là gì?
Serverfrog

@Serverfrog vì tôi không chỉ định giới hạn, giả sử rằng mọi số nguyên dương có thể được kiểm tra.
Tàu

Đầu vào nhị phân có được phép không?
Qwertiy

Câu trả lời:


11

Japt, 8 byte

1¥¢q0 äè

Chạy nó trực tuyến

Giải trình:

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                                         

Ý tưởng là phân tách chuỗi nhị phân tại 0, sẽ mang lại hai mục nếu chỉ có một 0. Sau đó, chúng tôi xem nếu mục đầu tiên phù hợp với thứ hai để đảm bảo nó là palindromic. Nếu chuỗi nhị phân chứa nhiều 0s, thì phần giảm sẽ trả về một mảng nhiều mục và điều đó sẽ không thành công ==1. Nếu chuỗi nhị phân có chứa một 0, nhưng không phải là palindromic, äèsẽ trả về 0bchứa 0kết quả khớp a.


1
Mất vài giây não đã bị caffein của tôi để xem những gì đang xảy ra ở đây! Hoàn thành tốt cũng nên làm việc
Shaggy

1
Tôi không biết Japt, nhưng nếu tôi hiểu chính xác thì nó sẽ như sau: ¤= convert thành nhị phân; q0= chia trên 0s; äèTôi không hoàn toàn chắc chắn ..; và cờ -Nchuyển đổi danh sách thành NaN, nhưng lá 01giống nhau. Về äèphần tôi có thể thấy đó 119[111,111]sau khi chia tách, nó äèthay đổi thành 1; và 85[1,1,1,1]sau khi chia tách, mà äèthay đổi thành [1,1,1]. Bạn có thể giải thích làm thế nào .ä("è")hoạt động?
Kevin Cruijssen

2
@KevinCruijssen Tôi đã thêm một lời giải thích. Tôi hy vọng điều đó sẽ giúp.
Oliver

1
NaNchim ưng trong Japt? (ví dụ: nếu bạn thực hiện một if-else với điều đó như điều kiện thực hiện nếu được thực hiện? "Truthy / đầu ra falsy phải đáp ứng thông số kỹ thuật ngôn ngữ sử dụng cho truthy / falsy") Ngoài ra 2sản lượng 2mà tôi nghi ngờ là falsey (nhưng có thể là nếu Japt giống như 05AB1E).
Jonathan Allan

1
JS giả định rằng bất kỳ số nguyên nào khác ngoài 0được coi là trung thực ... tuy nhiên, nếu 2trở lại 2là trung thực, thì bài nộp này có thể cần phải được làm lại.
Tàu

21

Python 2 , 30 byte

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

Hãy thử trực tuyến!

Lưu ý rằng đó 2*n^2*n+3là xor bitwise của 2*n2*n+3, bởi vì đó là ưu tiên toán tử của Python.


1
Có thể chấp nhận trả lại lambda n:(2*n^2*n+3)**2-8*n-9, với giá trị trả về của 0số cyclops không?
Eric Duminil

2
Điều này mang lại TRUEchon = -1
user2390246

3
@ user2390246 vấn đề này rõ ràng không nhằm mục đích phủ định - nếu có, tất cả các giải pháp chấp nhận sẽ cần phải là phủ định (và cách mà python thực hiện các số nguyên có nghĩa là không có giải pháp nào nên chấp nhận trong python)
DreamConspiracy

3
Số âm @SolomonUcko thường được lưu trữ trong biểu diễn bổ sung twos. Xem xét các số nguyên kích thước cố định đầu tiên (ví dụ 32 bit). Trong số các thuộc tính khác, TCR yêu cầu MSB là 1 ở số âm và 0 ở số dương. Điều này sẽ ngay lập tức yêu cầu tất cả các đầu ra tích cực là sai. Trong python chúng ta thậm chí còn có nhiều vấn đề hơn. Các số âm hoàn toàn có một chuỗi vô hạn 1s theo hướng có ý nghĩa nhất. Chúc may mắn khi cố gắng tìm ra giữa đó
DreamConspiracy

2
@ user2390246 Vấn đề đã được chỉnh sửa để làm rõ rằng mã của chúng tôi không cần phải làm việc cho các phủ định. Nó có thể được xử lý cho 2 byte bằng cách nối thêm >1.
xnor

18

Mã máy x86, 17 byte

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

Các byte ở trên xác định hàm chấp nhận giá trị đầu vào số nguyên 32 bit (trong thanh EDIghi cho ví dụ này, theo quy ước gọi System V chung, nhưng bạn thực sự có thể chọn bất kỳ thanh ghi đầu vào nào bạn muốn mà không ảnh hưởng đến kích thước của kết quả mã) và trả về một kết quả (trong thanh EAXghi) cho biết giá trị đầu vào có phải là số Cyclops hay không.

Đầu vào được coi là một số nguyên không dấu, vì quy tắc thách thức nói rằng chúng ta có thể bỏ qua các giá trị âm.

n=(2k+1)(2k11)

Lưu ý: Giá trị trả về là true / falsy, nhưng ngữ nghĩa bị đảo ngược, do đó hàm sẽ trả về giá trị giả cho số Cyclops. Tôi khẳng định đây là hợp pháp vì mã máy không có "thông số kỹ thuật cho sự thật / giả mạo", đây là yêu cầu trong câu hỏi. (Xem bên dưới để biết phiên bản thay thế nếu bạn nghĩ rằng điều này là gian lận.)

Trong thuật ngữ ngôn ngữ lắp ráp, đây là:

; 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

Hãy thử trực tuyến!


Như đã hứa, nếu bạn nghĩ rằng gian lận để đảo ngược ngữ nghĩa của sự thật / giả mạo ngay cả trong mã máy không có tiêu chuẩn hoặc quy ước thực sự, thì hãy thêm ba byte nữa, với tổng số 21 byte :

; 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

Nửa đầu của mã này giống như bản gốc (thông qua imulhướng dẫn). Điều leanày gần như giống nhau, nhưng thay vì thêm hằng số 2, nó chỉ thêm một hằng số 1. Đó là vì inchướng dẫn sau đây tăng giá trị trong thanh EAXghi lên 1 để đặt cờ. Nếu cờ "không" được đặt, setzhướng dẫn sẽ được đặt ALthành 1; nếu không, ALsẽ được đặt thành 0. Đây là cách tiêu chuẩn mà trình biên dịch C sẽ tạo mã máy để trả về a bool.

Thay đổi hằng số được thêm vào trong leahướng dẫn rõ ràng không thay đổi kích thước mã và inchướng dẫn rất nhỏ (chỉ 1 byte), nhưng setzhướng dẫn chỉ là 3 byte. Thật không may, tôi không thể nghĩ ra bất kỳ cách viết ngắn hơn.


4
Điều này quá nhanh, tôi nghĩ rằng nó xứng đáng được thể hiện bằng cách thử nghiệm tất cả các con số lên đến một giá trị lớn: Hãy thử trực tuyến!
Deadcode

Nó thực sự sẽ nhanh hơn nữa, @Deadcode. :-) Chứng minh nó với lắp ráp nội tuyến thêm một số chi phí, nhưng thủ thuật cũ của tôi là nhảy vào một chuỗi byte (xem ví dụ, câu trả lời này ) đã ngừng hoạt động với trình biên dịch của TIO và viết mã để in kết quả trực tiếp trong quá trình lắp ráp là quá nhiều làm việc để bận tâm với. Tuy nhiên, đây là một trong những trường hợp bất thường, trong đó, tối ưu hóa kích thước không phải là mâu thuẫn với tối ưu hóa tốc độ. Đây là cách bạn viết mã bằng mã asm nếu bạn muốn tăng tốc độ.
Cody Grey

Theo sự đồng thuận, không thể chấp nhận trả lại cờ trạng thái trong mã đệ trình asm codegolf.stackexchange.com/a/165020/84624stackoverflow.com/questions/48381234/ . Nếu vậy, bạn có thể - 3 từ câu trả lời thứ hai của bạn.
640KB

9

Regex (ECMAScript), 60 58 57 60 58 byte

nx

CẢNH BÁO SPOILER : Đối với căn bậc hai, regex này sử dụng một biến thể của thuật toán nhân tổng quát, không rõ ràng và có thể là một câu đố bổ ích để tự mình giải quyết. Để biết thêm thông tin, hãy xem giải thích cho dạng thuật toán này trong Tìm số Rocco .

z
z

zn=2(nz)+z+1n

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

Hãy thử trực tuyến!

^                 # 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 đã làm rõ rằng 0 nên là sự thật, vì vậy điều này hiện không giải quyết được thách thức.
Grimmy

1
Không ^(1*)0\1$đủ đơn giản ?
Hiện thân của sự thiếu hiểu biết

4
@EmbodimentofIgnorance Chỉ khi đầu vào ở dạng nhị phân. Điều đó sẽ tầm thường hóa rất nhiều thách thức; nhất quán sử dụng đầu vào đơn nhất khi áp dụng là thú vị hơn nhiều.
Deadcode

9

JavaScript (Node.js) , 20 byte

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

Hãy thử trực tuyến!

Có lẽ điều này là chính xác, có thể.

Cảm ơn Grimy, đã lưu 1 byte.


JavaScript (Node.js) , 32 byte

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

Hãy thử trực tuyến!


JavaScript (Node.js) , 34 byte

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

Hãy thử trực tuyến!



Kiểm tra, không khớp
edc65

1
@ edc65 Bạn đã tìm ra bất kỳ testcase thất bại?
tsh

2
@tsh .testkhông.match
ASCII chỉ

@ Chỉ có ASCII Wow, nghe có vẻ hợp lý ... Làm thế nào bạn có thể đọc cái này?
tsh



7

Mathicala (ngôn ngữ Wolfram), 32 31 byte

1 byte được lưu nhờ vào J42161217!

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

Hãy thử trực tuyến!

Hàm thuần túy lấy một số nguyên làm đầu vào và trả về Truehoặc False. Dựa trên thực tế (thú vị để chứng minh!) Rằng một số nlà Cyclops khi và chỉ khi ncộng với căn bậc hai của phép n/2cộng với 2số lượng lẻ là 2. (Người ta có thể thay thế Floorbằng một Ceilinghoặc Roundmiễn là người ta cũng thay thế +2bằng +1.) Trả Truevề đầu vào 0.


1
bạn có thể tiết kiệm 1 byte bằng cách sử dụngLog2[#+Floor@Sqrt...
J42161217

và thêm 1 lần sử dụng √()thay vìSqrt[]
attinat

Số byte có đúng không? TIO cung cấp 32 byte cho chương trình hiện tại.
mbomb007

@ mbomb007 aha, TIO không kết hợp tiết kiệm 1 byte của J42161217. Đã sửa.
Greg Martin

Có một lý do bạn không sử dụng những gì attinat đề nghị?
mbomb007


5

Japt, 8 byte

¢ðT ¥¢Êz

Cảm ơn Luis felipe de Jesus Munoz vì đã sửa bài dự thi của tôi!

Hãy thử trực tuyến!

Giải pháp dựa trên regex cũ, 15 byte

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

Trả về 1 cho đúng, 0 cho sai.

Hãy thử trực tuyến!


Chơi tốt, đôi khi tôi thực sự nên học các biểu thức chính quy. :) +1
Quintec

1
@Quintec Regex thật tuyệt vời :)
Hiện thân của sự thiếu hiểu biết

Cập nhật: tìm thấy cách ngắn hơn :)
Quintec


1
@LuisfelipeDejesusMunoz Cảm ơn, đó là một cách sử dụng thực sự tốt đẹp của ==nhà điều hành!
Hiện thân của sự thiếu hiểu biết

4

Thạch ,  8  7 byte

-1 nhờ Erik the Outgolfer (sử dụng isPalindrom tích hợp ŒḂ, thay vì ⁼Ṛ$)

B¬ŒḂ⁼SƊ

Một liên kết đơn nguyên chấp nhận một số nguyên mang lại 1(trung thực) hoặc 0(falsey).

Hãy thử trực tuyến!

Làm sao?

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

Có vẻ như bạn thực sự đã có ý tưởng thông minh trước tôi, nhưng sự thông minh của nó không rõ ràng ( Bċ0⁼1ȧŒḂcũng là 8 byte), ⁼Ṛ$giống như ŒḂvới -1. Ngoài ra, bạn không cần phải xử lý số âm.
Erik the Outgolfer

Cảm ơn Erik, vì một số lý do được tích hợp sẵn trong tâm trí tôi!
Jonathan Allan

Trên thực tế, ṚƑngày nay bạn cũng có thể sử dụng vị trí của nó, vì vậy bạn có thể muốn ghi nhớ nó như thế ( Ƒs quan trọng nhất ).
Erik the Outgolfer


4

Regex (ECMAScript), 53 47 byte

-6 byte nhờ cả Deadcode và Grimy

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

Hãy thử trực tuyến!


Trong quá trình bình luận đầy đủ và chứng minh regex của bạn (chưa hoàn thành), tôi đã giảm xuống còn 50 byte: ^((?=(x(x*?))(\3((x+)(?=\6$))+xx$))(?!\2{6})x\4)*$( Hãy thử trực tuyến! )
Deadcode

4

Brachylog , 8 byte

ḃD↔Dḍ×ᵐ≠

Đây là một vị từ thành công nếu đầu vào của nó là số Cyclops và không thành công nếu đầu vào của nó không phải là số Cyclops. Thành công / thất bại là khái niệm chân thực / falsey cơ bản nhất trong Brachylog.

Hãy thử trực tuyến! Hoặc, tìm tất cả các đầu ra trung thực lên đến 10000 .

Giải trình

          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

Điều này chỉ thành công khi được cung cấp số Cyclops, bởi vì:

  • Nếu biểu diễn nhị phân không phải là một bảng màu, D↔Dsẽ thất bại; trong những gì tiếp theo, chúng ta có thể giả sử nó là một bảng màu.
  • Nếu có nhiều hơn một số không, cả hai nửa sẽ chứa ít nhất một số không. Vì vậy, các sản phẩm sẽ bằng không, và ×ᵐ≠sẽ thất bại.
  • Nếu không có số 0, cả hai nửa sẽ chỉ chứa một nửa. Vì vậy, các sản phẩm sẽ là một, và ×ᵐ≠sẽ thất bại.
  • Điều đó khiến cho trường hợp có chính xác một số không; vì chúng ta đã biết chúng ta có một bảng màu, đây phải là bit trung tâm. Nó sẽ xuất hiện trong một nửa, làm cho sản phẩm của một nửa bằng không; nửa còn lại sẽ chứa tất cả những cái đó, vì vậy sản phẩm của nó sẽ là một. Sau đó, chúng ta có 1 ≠ 0, ×ᵐ≠thành công và toàn bộ vị ngữ thành công.

3

Ruby , 27 24 byte

Chuyển đổi thành nhị phân và kiểm tra với một regex. Trả về 0nếu đúng, nilnếu sai.

-3 byte nhờ GB .

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

Hãy thử trực tuyến!

Để có thêm hai byte, có một cổng trực tiếp của giải pháp Python:

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

@GB Cảm ơn bạn rất nhiều!
Eric Duminil

3

05AB1E , 8 (hoặc 9) byte

bD0¢sÂQ*

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Trả về 1nếu trung thực; 0hoặc bất kỳ số nguyên dương nào khác ngoài 1falsey. Trong 05AB1E chỉ có sự 1thật và mọi thứ khác là falsey, nhưng tôi không chắc đây có phải là đầu ra được phép hay không, nếu đầu ra phải là hai giá trị nhất quán và duy nhất. Nếu thứ hai, một dấu vết Θcó thể được thêm vào để tất cả các kết quả đầu ra ngoài 1trở thành 0:

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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)

Một cách tiếp cận số học sẽ là 10 byte:

LoD<s·>*Iå

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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)

1tính trung thực và tất cả các số khác là giả mạo đều được chấp nhận cho thử thách này, vì các ngôn ngữ khác (ví dụ C và TI-BASIC) có định nghĩa trung thực / giả mạo tương tự (0 / khác không cho cả hai). Miễn là những gì được coi là trung thực hoặc giả dối phù hợp với đặc điểm của ngôn ngữ, thì đó là trò chơi công bằng.
Tàu

3

Excel, 97 63 byte

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

Tính 2 số:

Hai lần sức mạnh gần nhất của 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 Cộng với căn bậc hai của Công suất 4 gần nhất
>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

Sau đó trừ số thứ hai từ số thứ nhất:

>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

Và so sánh kết quả này với số ban đầu

Phương pháp cũ

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

Bắt đầu với Log-base-2 của A1 và làm tròn nó xuống số chẵn gần nhất, sau đó thêm 1.

Tiếp theo, tạo một chuỗi gồm nhiều "1"s và thay thế ký tự giữa bằng một "0"để tạo số Cyclops có độ dài nhị phân luôn là số lẻ và bằng hoặc nhỏ hơn 1 so với độ dài nhị phân của A1

Sau đó, so sánh nó với biểu diễn nhị phân của A1


3

R , 37 33 byte

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

Hãy thử trực tuyến!

R không có sẵn để chuyển đổi thành nhị phân, vì vậy tôi chỉ cần sử dụng một trong các công thức từ OEIS để tính toán danh sách các thuật ngữ từ chuỗi.

n<-0:xtạo ra một danh sách hào phóng các giá trị bắt đầu. 2*4^(n<-0:x^2)-2^n-1)là công thức từ OEIS, và sau đó nó kiểm tra xem đầu vào có xuất hiện trong chuỗi đó hay không %in%.

-2 byte bằng cách không phải xử lý đầu vào tiêu cực. -2 byte bằng cách nhớ tôi có thể thay đổi <-thành =.


3

C (gcc), 26 byte

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

Hãy thử trực tuyến!

Câu trả lời của cảng Neil . Dựa vào thứ tự thực hiện được xác định của các hoạt động.

C ++ (tiếng kêu), 38 byte

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

Hãy thử trực tuyến!

Không thể bỏ qua các loại trong C ++, không thể bỏ qua trả lại bằng tiếng kêu, nếu không thì giống hệt.


1
Tôi muốn các câu trả lời C ++ được phân biệt với các câu trả lời C bằng cách sử dụng returnthay vì khai thác giá trị trả về hàm tích lũy ẩn phụ thuộc vào nền tảng và mong manh.
Deadcode

2
Tôi cũng muốn các quy tắc yêu cầu tuân thủ tiêu chuẩn, nhưng chúng không, vì vậy không sử dụng điều này sẽ chỉ là golf xấu. C ++ (clang) yêu cầu trả về, tạo 38 byte này.
Grimmy

Sau đó, bạn có thể giải quyết vấn đề này bằng cách có C (gcc) và C ++ (clang) trong câu trả lời của bạn thay vì C (gcc) và C ++ (gcc). Bây giờ tôi đã làm điều đó.
Deadcode


3

J , 22 19 17 15 14 byte

-3 byte nhờ BolceBussiere!

-4 byte nhờ ngn!

-1 byte nhờ Traws!

J , 14 byte

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

Hãy thử trực tuyến!


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

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

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

1
Tôi không biết đủ j để sử dụng nó nhưng thật thú vị khi học từ mã của người khác bằng cách rút ngắn nó
ngn

1
-1 byte1=1#.(*:|.)@#:
Traws


2

Tùy viên , 22 byte

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

Hãy thử trực tuyến!

Lựa chọn thay thế

27 byte: {BitXor[2*_,2*_+3]^2=8*_+9}

27 byte: {BitXor@@(2*_+0'3)^2=8*_+9}

27 byte: {Palindromic@_∧1=0~_}@Bin

28 byte: {BitXor[...2*_+0'3]^2=8*_+9}

28 byte: {BitXor[…2*_+0'3]^2=8*_+9}

28 byte: {Same@@Bisect@_∧1=0~_}@Bin

29 byte: {_[#_/2|Floor]=0∧1=0~_}@Bin

30 byte: Same@Bin@{_+2^Floor[Log2@_/2]}

30 byte: {_[#_/2|Floor]=0and 1=0~_}@Bin


2

Võng mạc 0.8.2 , 38 37 byte

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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Chỉnh sửa: Sau khi làm rõ, giải pháp trước đó không xử lý chính xác. Giải trình:

.+
$*

Chuyển đổi từ số thập phân sang đơn nguyên.

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

Chuyển đổi từ unary sang nhị phân, sử dụng phương thức từ wiki Retina.

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

Kiểm tra cùng một số 1s trước và sau 0chuỗi hoặc chuỗi rỗng (đó là cách chuyển đổi ở trên xử lý 0).


1

Mẻ, 39 37 byte

@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 byte

-6 byte nhờ @Chronocidal.

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

Thực hiện 3 kiểm tra:

  • Độ dài lẻ
ISEVEN(LOG(A1,2))
  • Nhân vật giữa là 0
MID(DEC2BIN(A1),LEN(DEC2BIN(A1))/2+1,1)="0"
  • Có một 0
LEN(SUBSTITUTE(DEC2BIN(A1),1,))=1

1
Lưu 6 byte bằng cách thay đổi ISODD(LEN(DEC2BIN(A1)))thànhISEVEN(LOG(A1,2))
Chronocidal

1

Regex (ECMAScript), 65 59 57 58 byte

+1 byte để xử lý 0 chính xác

^((((x*)xx)\3)x)?(?=(\1*)\2*(?=\4$)((x*)(?=\7$)x)*$)\1*$\5

Hãy thử trực tuyến!

(2k1)(2k+1+1)


1

VBA, 41 36 byte

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

Chạy trong cửa sổ Ngay lập tức, với Tuyên bố rõ ràng đã tắt. Đầu vào là ô A1của bảng hoạt động. Xuất ra True / false cho cửa sổ ngay lập tức.

Sử dụng logic giống như Câu trả lời Excel của tôi để tìm số Cyclops có cùng số bit (hoặc ngắn hơn 1 bit nếu có số chẵn!) Và sau đó so sánh với đầu vào.

Lưu một số byte khi tính toán số Cyclops bằng cách giảm chúng thành biểu mẫu y = 2x^2 - x - 1(trong đó x = n-1cho số Cyclops thứ n hoặc x = 2^Int(Log([A1])/Log(4))để tìm số Cyclops lớn nhất với số bit nhỏ hơn hoặc bằng nhau) và lưu trữ x trong một biến

(-5 byte nhờ Taylor Scott !)


1
Thay vì chuyển đổi cơ sở của nhật ký bằng cách sử dụng phân chia nhật ký, bạn có thể thay đổi trực tiếp bằng cách sử dụng [...]ký hiệu như[(Log(A1,4)]
Taylor Scott

1

PHP , 74 byte

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

Hãy thử trực tuyến!

Cách tiếp cận phi toán học hoàn toàn ngây thơ, chỉ là chuỗi.

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')
}

Hoặc 60 byte dựa trên thuật toán của @ Chronocidal ở trên .

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

Hãy thử trực tuyến!


1

Haskell, 82 byte

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

Và một cổng giải pháp Python của xnor:

Haskell, 47 byte

import Data.Bits
\n->(2*n`xor`(2*n+3))^2==8*n+9
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.