Apakah ini nomor Cyclops? "Tidak ada yang tahu!


66

Tugas:

Diberikan input integer, cari tahu apakah itu adalah Nomor Cyclops atau tidak.

Berapa nomor Cyclops, Anda mungkin bertanya? Ya, itu nomor yang representasi binernya hanya ada 0di tengah!

Kasus uji:

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

Memasukkan:

  • Jenis bilangan bulat atau setara. ( int, long, decimal, Dll)

  • Asumsikan bahwa jika mengevaluasi input menghasilkan integer overflow atau masalah lain yang tidak diinginkan, maka input tersebut tidak harus dievaluasi.

Keluaran:

  • Benar atau salah.

  • Keluaran kebenaran / kepalsuan harus memenuhi spesifikasi bahasa yang digunakan untuk kebenaran / kepalsuan. (mis. C memiliki 0false, non-zero true)

Aturan Tantangan:

  • Input yang kurang dari 0 diasumsikan palsu dan dengan demikian tidak perlu dievaluasi.

  • Jika panjang representasi biner dari angka itu genap, maka angka itu tidak bisa menjadi angka Cyclops.

Aturan umum:


Ini tantangan Pemrograman & Golf Code saya yang pertama , jadi umpan balik tentang bagaimana saya harus meningkatkan akan sangat dihargai!


25
Catatan: Ini A129868
tsh

35
+1 untuk referensi budaya pop terlambat 2800 tahun dalam judul
Sanchises

berapakah jumlah maksimum yang diuji?
Serverfrog

@Serverfrog karena saya tidak menentukan batas, asumsikan bilangan bulat positif apa pun dapat diuji.
Tau

Apakah input biner diizinkan?
Qwertiy

Jawaban:


11

Japt, 8 byte

1¥¢q0 äè

Jalankan secara online

Penjelasan:

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                                         

Idenya adalah untuk membagi string biner di 0, yang akan menghasilkan dua item jika hanya ada satu 0. Kemudian kita melihat apakah item pertama cocok dengan item kedua untuk memastikan palindromik. Jika string biner berisi banyak 0s, maka pengurangan akan mengembalikan array multi-item dan itu akan gagal ==1kondisinya. Jika string biner memang mengandung satu 0, tetapi bukan palindromik, äèakan kembali 0karena bberisi 0kecocokan a.


1
Membutuhkan otak pra-kafein saya beberapa detik untuk melihat apa yang terjadi di sini! Bagus sekali. juga harus bekerja.
Shaggy

1
Saya tidak tahu Japt, tetapi jika saya mengerti benar itu tidak berikut: ¤= convert to binary; q0= berpisah pada 0s; äèSaya tidak sepenuhnya yakin ..; dan bendera -Nmengubah daftar menjadi NaN, tetapi pergi 0dan 1sama. Untuk äèbagian saya dapat melihat bahwa 119adalah [111,111]setelah split, yang äèberubah menjadi 1; dan 85adalah [1,1,1,1]setelah split, yang äèberubah menjadi [1,1,1]. Bisakah Anda menjelaskan cara .ä("è")kerjanya?
Kevin Cruijssen

2
@KevinCruijssen saya menambahkan penjelasan. Saya harap itu membantu.
Oliver

1
Apakah NaNfalsey ada di Japt? (Yaitu jika Anda melakukan if-else dengan itu sebagai syarat apakah jika dieksekusi? "Keluaran kebenaran / palsu harus memenuhi spesifikasi bahasa yang digunakan untuk kebenaran / kepalsuan") Juga 2menghasilkan 2yang saya ragu adalah falsey (tetapi mungkin jika Japt seperti 05AB1E).
Jonathan Allan

1
JS berasumsi bahwa bilangan bulat apa pun selain 0dianggap benar ... namun, jika 2dikembalikan 2sebagai benar, maka pengajuan ini mungkin perlu dikerjakan ulang.
Tau

21

Python 2 , 30 byte

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

Cobalah online!

Perhatikan bahwa itu 2*n^2*n+3adalah bitwise xor dari 2*ndan 2*n+3, karena itulah operator Python yang diutamakan.


1
Apakah bisa diterima untuk kembali lambda n:(2*n^2*n+3)**2-8*n-9, dengan nilai balik 0untuk nomor cyclop?
Eric Duminil

2
Ini menghasilkan TRUEuntukn = -1
user2390246

3
@ user2390246 masalah ini jelas tidak ditujukan untuk negatif-jika itu, semua solusi yang diterima harus negatif (dan cara python mengimplementasikan bilangan bulat berarti bahwa tidak ada solusi yang harus diterima dalam python)
DreamConspiracy

3
Bilangan negatif @SolomonUcko biasanya disimpan dalam representasi dua pasangan komplemen. Pertimbangkan bilangan bulat ukuran tetap pertama (32 bit misalnya). Di antara sifat-sifat lain, TCR mensyaratkan bahwa MSB adalah 1 dalam angka negatif, dan 0 dalam positif. Ini akan segera mengharuskan semua output positif salah. Dalam python kita memiliki lebih banyak masalah. Angka negatif secara implisit memiliki urutan tak terhingga dari 1s ke arah yang paling signifikan. Semoga berhasil menemukan tengahnya
DreamConspiracy

2
@ user2390246 Masalahnya sejak diedit untuk mengklarifikasi bahwa kode kami tidak perlu bekerja untuk yang negatif. Itu bisa ditangani selama 2 byte dengan menambahkan >1.
xnor

18

Kode Mesin x86, 17 byte

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

Byte di atas mendefinisikan fungsi yang menerima nilai input integer 32-bit (dalam EDIregister untuk contoh ini, mengikuti konvensi pemanggilan System V yang umum, tetapi Anda benar-benar dapat memilih hampir semua register input yang Anda inginkan tanpa mempengaruhi ukuran hasil yang dihasilkan kode), dan mengembalikan hasil (dalam EAXregister) yang menunjukkan apakah nilai input adalah nomor Cyclops.

Input diasumsikan bilangan bulat yang tidak ditandatangani, karena tantangannya menyatakan bahwa kita dapat mengabaikan nilai negatif.

Logika keputusan dipinjam dari jawaban Neil : karena nomor Cyclops memiliki bentuk , kita dapat menggunakan serangkaian operasi bit-twiddling untuk memeriksa memasukkan.n=(2k+1)(2k11)

Catatan: Nilai kembalinya adalah true / falsy, tetapi semantiknya terbalik, sehingga fungsinya akan mengembalikan falsy untuk nomor Cyclops. Saya mengklaim ini sah karena kode mesin tidak memiliki "spesifikasi untuk kebenaran / kepalsuan", yang merupakan persyaratan dalam pertanyaan. (Lihat di bawah untuk versi alternatif jika Anda pikir ini curang.)

Dalam mnemonik bahasa assembly, ini adalah:

; 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

Cobalah online!


Seperti yang dijanjikan, jika Anda pikir itu curang untuk membalikkan semantik kebenaran / kepalsuan bahkan dalam kode mesin di mana tidak ada standar atau konvensi yang sebenarnya, maka tambahkan tiga byte lagi, dengan total 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

Bagian pertama dari kode ini sama dengan yang asli (turun melalui imulinstruksi). Ini leahampir sama, tetapi alih-alih menambahkan konstanta 2, itu hanya menambahkan konstanta 1. Itu karena incinstruksi berikut ini menambah nilai dalam EAXregister dengan 1 untuk mengatur flag. Jika bendera "nol" disetel, setzinstruksi akan ditetapkan ALke 1; jika tidak, ALakan ditetapkan ke 0. Ini adalah cara standar bahwa kompiler C akan menghasilkan kode mesin untuk mengembalikan a bool.

Mengubah konstanta yang ditambahkan dalam leainstruksi jelas tidak mengubah ukuran kode, dan incinstruksinya sangat kecil (hanya 1 byte), tetapi setzinstruksinya agak 3 kekalahan. Sayangnya, saya tidak bisa memikirkan cara penulisan yang lebih pendek.


4
Ini sangat cepat, saya pikir pantas untuk diperlihatkan dengan menguji semua angka hingga nilai yang besar: Coba online!
Deadcode

Seharusnya sebenarnya lebih cepat, @Deadcode. :-) Mendemonstrasikannya dengan inline assembly menambahkan beberapa overhead, tetapi trik lama saya untuk melompat ke string byte (lihat misalnya, jawaban ini ) telah berhenti bekerja dengan kompiler TIO, dan menulis kode untuk mencetak hasil langsung di assembly terlalu banyak bekerja untuk mengganggu. Ini adalah salah satu kasus yang tidak biasa, di mana mengoptimalkan ukuran tidak bertentangan dengan mengoptimalkan kecepatan. Ini cukup banyak cara Anda akan menulis kode dalam asm jika Anda pergi untuk kecepatan lebih dari ukuran.
Cody Grey

Dengan konsensus, tidak dapat diterima untuk mengembalikan bendera status dalam kiriman aseg codegolf.stackexchange.com/a/165020/84624 dan stackoverflow.com/questions/48381234/… . Jika demikian, Anda dapat - 3 dari jawaban kedua.
640KB

9

Regex (ECMAScript), 60 58 57 60 58 byte

Input adalah unary, sebagai panjang string s.nx

PERINGATAN SPOILER : Untuk akar kuadrat, regex ini menggunakan varian dari algoritma multiplikasi umum, yang tidak jelas dan bisa menjadi teka-teki yang bermanfaat untuk Anda kerjakan sendiri. Untuk informasi lebih lanjut, lihat penjelasan untuk bentuk algoritma ini di Temukan nomor Rocco .

-2 byte dengan membolehkan penelusuran dalam pencarianz -1 byte berkat Grimy , dengan mencari dari yang terkecil hingga terbesar dan bukan sebaliknya +3 byte untuk menangani nol -2 byte dengan memindahkan tangkapan akar kuadrat di luar lookaheadz
z

Ini bekerja dengan menemukan , kekuatan kuadrat sempurna dari 2 di mana . Hanya kekuatan kuadrat sempurna terbesar 2 yang tidak melebihi dapat memenuhi ini, tetapi karena optimalisasi golf, regex mencoba semuanya dimulai dengan yang terkecil. Karena masing-masing sesuai dengan nomor cyclop, hanya yang terbesar yang dapat menghasilkan pertandingan.zn=2(nz)+z+1n

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

Cobalah online!

^                 # 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 mengklarifikasi bahwa 0 harus benar, sehingga saat ini tidak menyelesaikan tantangan.
Grimmy

1
Bukankah ini ^(1*)0\1$cukup sederhana ?
Perwujudan Ketidaktahuan

4
@EmbodimentofIgnorance Hanya jika input dalam biner. Itu akan meremehkan banyak tantangan; secara konsisten menggunakan input unary yang berlaku jauh lebih menarik.
Deadcode

9

JavaScript (Node.js) , 20 byte

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

Cobalah online!

Mungkin ini benar, mungkin.

Terima kasih Grimy, 1 byte disimpan.


JavaScript (Node.js) , 32 byte

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

Cobalah online!


JavaScript (Node.js) , 34 byte

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

Cobalah online!



Tes, tidak cocok
edc65

1
@ edc65 Apakah Anda menemukan testcase yang gagal?
tsh

2
@tsh .testnot.match
ASCII-only

@ Khusus ASCII Wow, kedengarannya masuk akal ... Bagaimana Anda bisa membaca ini?
tsh



7

Mathematica (Bahasa Wolfram), 32 31 byte

1 byte disimpan berkat J42161217!

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

Cobalah online!

Fungsi murni mengambil integer sebagai input dan return Trueatau False. Berdasarkan fakta (asyik untuk membuktikan!) Bahwa angka nadalah Cyclops jika dan hanya jika nditambah akar kuadrat dari n/2plus 2membulatkan ke kekuatan ganjil 2. (Seseorang dapat mengganti Floordengan salah satu Ceilingatau Roundselama seseorang juga menggantikan +2dengan +1.) Pengembalian Trueinput 0.


1
Anda dapat menghemat 1 byte dengan menggunakanLog2[#+Floor@Sqrt...
J42161217

dan 1 lagi menggunakan √()bukannyaSqrt[]
attinat

Apakah jumlah byte benar? TIO memberikan 32 byte untuk program saat ini.
mbomb007

@ mbomb007 aha, TIO tidak memasukkan penghematan 1 byte J42161217. Tetap.
Greg Martin

Apakah ada alasan mengapa Anda tidak menggunakan apa yang disarankan attinat?
mbomb007


5

Japt, 8 byte

¢ðT ¥¢Êz

Terima kasih kepada Luis felipe de Jesus Munoz karena telah memperbaiki kiriman saya!

Cobalah secara Online!

Solusi berbasis regex lama, 15 byte

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

Mengembalikan 1 untuk true, 0 untuk false.

Cobalah secara Online!


Dimainkan dengan baik, saya harus benar-benar belajar ekspresi reguler kapan-kapan. :) +1
Quintec

1
@Quintec Regex is awesome :)
Perwujudan Ketidaktahuan

Pembaruan: ditemukan dengan cara yang lebih singkat :)
Quintec


1
@LuisfelipeDejesusMunoz Terima kasih, itu penggunaan yang sangat bagus dari ==operator!
Perwujudan Ketidaktahuan

4

Jelly ,  8  7 byte

-1 berkat Erik the Outgolfer (gunakan isPalindrome bawaan ŒḂ,, bukan ⁼Ṛ$)

B¬ŒḂ⁼SƊ

Tautan monadik yang menerima bilangan bulat yang menghasilkan 1(kebenaran) atau 0(falsey).

Cobalah online!

Bagaimana?

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

Sepertinya Anda benar-benar memiliki ide cerdik sebelum saya, tetapi kepintarannya tidak jelas ( Bċ0⁼1ȧŒḂjuga 8 byte), ⁼Ṛ$sama dengan ŒḂ-1. Juga, Anda tidak perlu menangani angka negatif.
Erik the Outgolfer

Terima kasih Erik, palindrome bawaan menyelinap di pikiran saya untuk beberapa alasan!
Jonathan Allan

Sebenarnya, Anda juga dapat menggunakannya ṚƑdi tempatnya saat ini, jadi Anda mungkin ingin mengingatnya seperti itu (yang paling penting Ƒ).
Erik the Outgolfer


4

Regex (ECMAScript), 53 47 byte

-6 byte berkat Deadcode dan Grimy

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

Cobalah online!


Dalam mengomentari sepenuhnya dan membuktikan regex Anda (belum selesai), saya mendapatkannya hingga 50 byte: ^((?=(x(x*?))(\3((x+)(?=\6$))+xx$))(?!\2{6})x\4)*$( Coba online! )
Deadcode

4

Brachylog , 8 byte

ḃD↔Dḍ×ᵐ≠

Ini adalah predikat yang berhasil jika inputnya adalah nomor Cyclops dan gagal jika inputnya bukan nomor Cyclops. Keberhasilan / kegagalan adalah konsep kebenaran / falsey yang paling mendasar di Brachylog.

Cobalah online! Atau, temukan semua keluaran yang benar hingga 10.000 .

Penjelasan

          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

Ini hanya berhasil ketika diberi nomor Cyclops, karena:

  • Jika representasi biner bukan palindrom, D↔Dakan gagal; dalam apa yang berikut, kita dapat menganggap itu sebuah palindrom.
  • Jika ada lebih dari satu nol, kedua bagian akan mengandung setidaknya satu nol. Jadi produk keduanya akan nol, dan ×ᵐ≠akan gagal.
  • Jika tidak ada nol, kedua bagian hanya akan berisi satu. Jadi produk keduanya akan menjadi satu, dan ×ᵐ≠akan gagal.
  • Itu meninggalkan kasus di mana ada tepat satu nol; karena kita sudah tahu bahwa kita memiliki palindrom, ini pasti yang paling penting. Ini akan muncul dalam satu setengah, menyebabkan produk setengah menjadi nol; setengah lainnya akan berisi semua, jadi produknya akan menjadi satu. Kemudian kita memiliki 1 ≠ 0, ×ᵐ≠berhasil, dan keseluruhan predikat berhasil.

3

Ruby , 27 24 byte

Konversikan ke biner dan periksa dengan regex. Mengembalikan 0jika benar, niljika salah.

-3 byte berkat GB .

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

Cobalah online!

Untuk dua byte lebih, ada port langsung dari solusi Python:

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

@ GB Terima kasih banyak!
Eric Duminil

3

05AB1E , 8 (atau 9) byte

bD0¢sÂQ*

Cobalah secara online atau verifikasi semua kasus uji .

Kembali 1jika benar; 0atau bilangan bulat positif selain 1sebagai falsey. Di 05AB1E hanya 1benar dan yang lainnya falsey, tapi saya tidak yakin apakah ini adalah output yang diperbolehkan, atau apakah output harus dua nilai yang konsisten dan unik. Jika yang kedua, sebuah trailing Θdapat ditambahkan sehingga semua output selain 1menjadi 0:

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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)

Pendekatan aritmatika akan 10 byte:

LoD<s·>*Iå

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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)

Memiliki 1kebenaran dan semua angka lain sebagai kepalsuan dapat diterima untuk tantangan ini, karena bahasa lain (misalnya C dan TI-BASIC) memiliki definisi kebenaran / kepalsuan yang sama (0 / tidak nol untuk keduanya). Selama apa yang dianggap benar atau salah cocok dengan spesifikasi bahasa, maka itu adalah permainan yang adil.
Tau

3

Excel, 97 63 Bytes

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

Menghitung 2 angka:

Dua kali Kekuatan terdekat dari 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 Ditambah akar kuadrat dari Kekuatan terdekat 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

Kemudian kurangi angka kedua dari yang pertama:

>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

Dan bandingkan hasil ini dengan nomor aslinya

Metode lama

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

Mulai dengan Log-base-2 dari A1 dan bulatkan ke bawah dengan nomor genap terdekat, kemudian tambahkan 1.

Selanjutnya buat string sebanyak itu "1"s, dan ganti karakter tengah dengan a "0"untuk membuat nomor Cyclops dengan panjang biner yang selalu ganjil, dan sama dengan atau 1 kurang dari panjang biner A1

Kemudian, bandingkan dengan representasi Biner dari A1


3

R , 37 33 byte

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

Cobalah online!

R tidak memiliki bawaan untuk mengonversi ke biner, jadi saya cukup menggunakan salah satu rumus dari OEIS untuk menghitung daftar istilah dari urutan.

n<-0:xmenghasilkan daftar nilai awal yang murah hati. 2*4^(n<-0:x^2)-2^n-1)adalah rumus dari OEIS, dan kemudian memeriksa apakah input muncul dalam urutan itu menggunakan %in%.

-2 byte dengan tidak harus menangani input negatif. -2 byte dengan mengingat saya bisa berubah <-menjadi =.


3

C (gcc), 26 byte

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

Cobalah online!

Jawaban Port of Neil . Bergantung pada pemesanan operasi yang ditentukan implementasi.

C ++ (dentang), 38 byte

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

Cobalah online!

Tidak bisa menghilangkan tipe dalam C ++, tidak bisa menghilangkan kembalinya di dentang, jika tidak identik.


1
Saya lebih suka bahwa jawaban C ++ dibedakan dari jawaban C dengan menggunakan returnalih-alih eksploitasi nilai kembali akumulator implisit yang rapuh dan bergantung platform.
Deadcode

2
Saya juga ingin aturan yang mensyaratkan kepatuhan standar, tetapi mereka tidak melakukannya, jadi tidak menggunakan ini hanya akan menjadi golf yang buruk. C ++ (dentang) membutuhkan pengembalian, membuat ini 38 byte.
Grimmy

Maka Anda bisa menyiasatinya dengan memiliki C (gcc) dan C ++ (dentang) dalam jawaban Anda alih-alih C (gcc) dan C ++ (gcc). Sekarang saya sudah melakukannya.
Deadcode


3

J , 22 19 17 15 14 byte

-3 byte terima kasih kepada BolceBussiere!

-4 byte terima kasih kepada ngn!

-1 byte berkat Traws!

J , 14 byte

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

Cobalah online!


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

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

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

1
saya tidak cukup tahu untuk menggunakannya tetapi menyenangkan untuk belajar dari kode orang lain dengan mencoba mempersingkatnya
ngn

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


2

Attache , 22 byte

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

Cobalah online!

Alternatif

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

Retina 0.8.2 , 38 37 byte

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

Cobalah online! Tautan termasuk kasus uji. Sunting: Setelah klarifikasi, solusi sebelumnya tidak menangani nol dengan benar. Penjelasan:

.+
$*

Konversi dari desimal ke unary.

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

Konversi dari unary ke binary, menggunakan metode dari wiki Retina.

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

Periksa jumlah 1s yang sama sebelum dan sesudah 0, atau string kosong (yang merupakan bagaimana konversi di atas menangani nol).


1

Batch, 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 terima kasih kepada @Chronocidal.

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

Melakukan 3 pemeriksaan:

  • Panjang ganjil
ISEVEN(LOG(A1,2))
  • Karakter tengah adalah 0
MID(DEC2BIN(A1),LEN(DEC2BIN(A1))/2+1,1)="0"
  • Ada satu 0
LEN(SUBSTITUTE(DEC2BIN(A1),1,))=1

1
Simpan 6 byte dengan mengubah ISODD(LEN(DEC2BIN(A1)))keISEVEN(LOG(A1,2))
Chronocidal

1

Regex (ECMAScript), 65 59 57 58 byte

+1 byte untuk menangani 0 dengan benar

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

Cobalah online!

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


1

VBA, 41 36 Bytes

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

Jalankan di jendela Immediate, dengan Deklarasi eksplisit dimatikan. Input adalah sel A1dari lembar aktif. Output Benar / Salah ke jendela langsung.

Menggunakan logika yang sama dengan Jawaban Excel saya untuk menemukan nomor Cyclops dari jumlah bit yang sama (atau 1 bit lebih pendek jika ada nomor genap!) Dan kemudian membandingkannya dengan input.

Menghemat beberapa byte saat menghitung angka Cyclops dengan menguranginya ke dalam form y = 2x^2 - x - 1(di mana x = n-1untuk nomor Cyclops ke - n , atau x = 2^Int(Log([A1])/Log(4))untuk menemukan nomor Cyclops terbesar dengan jumlah bit yang lebih sedikit atau sama) dan menyimpan x dalam variabel

(-5 Bytes berkat Taylor Scott !)


1
Alih-alih mengonversi basis log menggunakan divisi log, Anda dapat mengubahnya langsung menggunakan [...]notasi sebagai[(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];}

Cobalah online!

Benar-benar naif pendekatan non-matematika, hanya string.

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

Atau 60 byte berdasarkan algoritma @ Chronocidal di atas .

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

Cobalah online!


1

Haskell, 82 byte

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

Dan port solusi Python xnor:

Haskell, 47 byte

import Data.Bits
\n->(2*n`xor`(2*n+3))^2==8*n+9
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.