Nomor Lipat

37

Diberi nomor menentukan apakah itu nomor lipat.

Angka lipat adalah angka sedemikian rupa sehingga jika Anda mengambilnya representasi biner dan "melipatnya" menjadi dua, yaitu mengambil hasil perkalian XNOR dari bagian pertama dari angka dan bagian kedua dengan angka-angka secara terbalik, Anda akan mendapatkan nol.

Jika angka tersebut memiliki angka ganjil dalam biner, digit tengahnya harus 1 dan diabaikan saat dilipat.

Karena itu mungkin agak membingungkan saya akan memberikan beberapa contoh:

178

Representasi biner dari 178 adalah

10110010

Untuk melipat ini kita pertama membaginya menjadi dua

1011 0010

Kami membalikkan babak kedua

1011
0100

Dan kami XNOR dua bagian:

0000

Ini nol jadi ini adalah angka lipat.

1644

Representasi biner 1644 adalah

11001101100

Untuk melipat ini kita pertama membaginya menjadi dua

11001 1 01100

Bit tengah adalah 1 jadi kami membuangnya.

11001 01100

Kami membalikkan babak kedua

11001
00110

Dan kami XNOR dua bagian:

00000

Ini nol jadi ini adalah angka lipat.

4254

Representasi biner dari 4254 adalah

1000010011110

Untuk melipat ini kita pertama membaginya menjadi dua

100001 0 011110

Bit tengah adalah 0 jadi ini bukan angka lipat.

Tugas

Tugas Anda adalah mengambil angka positif dan mengembalikan kebenaran jika angka itu lipat dan palsu jika bukan. Ini adalah kode golf jadi cobalah untuk menjaga hitungan byte tetap rendah.

Uji Kasus

Berikut adalah 99 nomor lipat pertama:

[1, 2, 6, 10, 12, 22, 28, 38, 42, 52, 56, 78, 90, 108, 120, 142, 150, 170, 178, 204, 212, 232, 240, 286, 310, 346, 370, 412, 436, 472, 496, 542, 558, 598, 614, 666, 682, 722, 738, 796, 812, 852, 868, 920, 936, 976, 992, 1086, 1134, 1206, 1254, 1338, 1386, 1458, 1506, 1596, 1644, 1716, 1764, 1848, 1896, 1968, 2016, 2110, 2142, 2222, 2254, 2358, 2390, 2470, 2502, 2618, 2650, 2730, 2762, 2866, 2898, 2978, 3010, 3132, 3164, 3244, 3276, 3380, 3412, 3492, 3524, 3640, 3672, 3752, 3784, 3888, 3920, 4000, 4032, 4222, 4318, 4462, 4558]
Wisaya Gandum
sumber
Apakah 4 bukan angka lipat?
Adnan
1
@ Adnan Bit tengahnya 0, jadi tidak. (Mungkin patut memiliki contoh ketiga yang bekerja seperti ini.) Sama berlaku untuk 18.
Martin Ender
@ MartinEnder Ahh, saya melewatkan bagian itu. Terima kasih :)
Adnan
1
mengapa angka tengah harus satu (dalam digit biner ganjil #)? apakah itu sewenang-wenang atau adakah alasan?
greyShift
3
@timrxd jika Anda mencoba melipat angka dengan menambahkan angka yang berlawanan, angka dengan angka di tengah Anda akan mendapatkan string dari semua yang ada. Jika memiliki nol di tengah Anda akan berakhir dengan nol di hasilnya.
Wheat Wizard

Jawaban:

12

Jelly , 9 byte

Bœs2µḢ^UȦ

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

Bœs2µḢ^UȦ  Main link. Argument: n

B          Binary; convert n to base 2.
 œs2       Evenly split 2; split the base 2 array into chunks of equal-ish length.
           For an odd amount of digits, the middle digit will form part of the
           first chunk.
    µ      Begin a new, monadic chain. Argument: [A, B] (first and second half)
     Ḣ     Head; remove and yield A.
       U   Upend; reverse the digits in [B].
      ^    Perform vectorized bitwise XOR of the results to both sides.
           If A is longer than B, the last digit will remain untouched.
           n is a folding number iff the result contains only 1's.
        Ȧ  Octave-style all; yield 1 iff the result does not contain a 0.
Dennis
sumber
Cukup yakin saya mencobanya, oh well :)
Jonathan Allan
9

05AB1E , 13 12 byte

Kode:

bS2ä`R0¸«s^P

Menggunakan pengkodean CP-1252 . Cobalah online!

Penjelasan:

Pertama, kami mengonversi angka menjadi biner menggunakan b. 1644 menjadi 11001101100 . Kami membagi ini menjadi dua bagian dengan . Misalnya, 11001101100 akan menjadi:

[1, 1, 0, 0, 1, 1]
[0, 1, 1, 0, 0]

Jika ada jumlah bit yang tidak merata, bagian pertama akan menerima bit tambahan. Kami Rmembalik string terakhir dan menambahkan nol menggunakan 0¸«. Alasan untuk ini adalah hanya memberikan hasil yang benar ketika bit tengah adalah 1 ( 1 XOR 0 = 1 dan 0 XOR 0 = 0 ). Jika tidak ada bit tengah, 05AB1E hanya akan mengabaikan bit terakhir (nol yang ditambahkan):

[1, 1, 0, 0, 1, 1]
[0, 0, 1, 1, 0, 0]

Hal terakhir yang perlu kita lakukan adalah melakukan XOR elemen-bijaksana dan mengambil produk dari hasilnya. Jika ada satu elemen terlalu banyak, program hanya akan meninggalkan elemen terakhir ( [1, 0, 0] XOR [0, 1] = [1, 1]) Misalnya:

[1, 1, 0, 0, 1, 1]
[0, 0, 1, 1, 0, 0] XOR

Menjadi:

[1, 1, 1, 1, 1, 1]

Dan produk dari itu adalah 1 , yang benar.

Adnan
sumber
Sangat bagus! Sayang sekali sdiperlukan.
Emigna
@ Emigna Ya, saya harus memperbaikinya beberapa waktu. Ini juga memberi saya beberapa inspirasi untuk perintah-perintah lain: p
Adnan
Awwh, saya sudah setengah jalan, mencoba 05AB1E untuk pertama kalinya, yang ini agak sulit. bÐg;ôadalah sejauh yang saya dapatkan sebelum menyegarkan dan melihat Anda berhasil. Jawaban yang bagus, membantu saya belajar!
Magic Octopus Mm
@cococuting Terima kasih! Selalu menyenangkan melihat orang baru tertarik pada 05AB1E :). Jika Anda memiliki pertanyaan, Anda selalu dapat bertanya di ruang obrolan ini .
Adnan
Oh sial! Ini pertanyaan yang berbeda! Saya pada pertanyaan "super lipat". Saya mencoba memperluas jawaban untuk solusi itu juga, tetapi iterasi bahkan lebih menantang.
Magic Octopus Mm
9

Java 7, 152 145 142 138 134 byte

boolean f(Long a){byte[]b=a.toString(a,2).getBytes();int i=0,l=b.length,z=l%2<1?1:b[l/2]-48;for(;i<l/2;)z*=b[i]-b[l-++i];return z!=0;}

Loops di atas tali seperti itu untuk palindrome, mencari nol. Terus melacak dengan mengalikan berulang kali, jadi yang harus Anda lakukan adalah memastikan bahwa itu bukan nol pada akhirnya.

Tanpa bilah gulir:

boolean f(Long a){
    byte[]b=a.toString(a,2).getBytes();
    int i=0,l=b.length,z=l%2<1?1:b[l/2]-48;
    for(;i<l/2;)
        z*=b[i]-b[l-++i];
    return z!=0;
}
Geobit
sumber
" tapi pasti bisa diturunkan " Saya tidak berpikir jawaban Anda saat ini bisa lebih banyak bermain golf, tetapi saya ingin terbukti salah. +1 (PS: Bagian tanpa kulit Anda mengandung dua tanda kurung penutup.)
Kevin Cruijssen
byte[]b=(a+"").getBytes();lebih pendek dari char[]b=a.toString(a,2).toCharArray();dan tampaknya masih berfungsi (-12 byte).
Kevin Cruijssen
1
@KevinCruijssen Itu bukan string biner AFAICT, tapi saya pikir getBytesmungkin masih bisa digunakan pada char []. Terima kasih :)
Geobits
@KevinCruijssen Ya, menyadari itu dan menghapus komentar> _ <.
Magic Octopus Mm
@ Geobits: Karena metode ini dapat mengembalikan nilai kebenaran atau falsy, Anda bisa kembali zsebagai int ( 0untuk falsy, yang lainnya untuk truthy) - akan menghemat beberapa byte.
shooqie
9

JavaScript (ES6), 61 57 52 byte

Menghitung secara rekursif:

(bit(N) XOR bit(0)) AND (bit(N-1) XOR bit(1)) AND (bit(N-2) XOR bit(2)) etc.

di mana Npangkat bit tertinggi ditetapkan dalam input.

Jika input memiliki jumlah bit ganjil, bit tengah XOR'ed dengan undefined (nilai dikembalikan oleh pop()pada array kosong), yang memungkinkannya tidak berubah. Jadi, 0bit tengah membersihkan output dan 1bit tengah tidak mengubah hasil operasi lain - yang konsisten dengan definisi tantangan nomor lipat.

f=(n,[a,...b]=n.toString(2))=>a?(a^b.pop())&f(n,b):1

// testing integers in [1 .. 99]
for(var i = 1; i < 100; i++) {
  f(i) && console.log(i);
}

Arnauld
sumber
Bagus! Bisakah Anda jelaskan bagaimana hal ini memperhitungkan bit tengah?
ETHproduk
@ ETHproductions - Tentu. Saya telah menambahkan catatan tentang itu.
Arnauld
9

Python 2, 57 byte

s=bin(input())[2:]
while''<s!='1':s[-1]==s[0]<_;s=s[1:-1]

Keluaran melalui kode keluar : kesalahan untuk Falsey, dan tidak ada kesalahan untuk Truthy.

Mengubah input menjadi biner. Cek apakah karakter pertama dan terakhir tidak sama, simpan dan ulangi ini setelah menghapus karakter tersebut.

Perbandingan s[-1]==s[0]<_memberikan kesalahan jika karakter pertama dan terakhir tidak sama dengan mencoba mengevaluasi variabel yang belum ditetapkan namanya _. Jika mereka sama, rantai ketidaksetaraan akan mengalami hubungan pendek. Ketika kita sampai ke elemen tengah 1, whileloop diakhiri dengan huruf besar-kecil sebagai OK.

Saya menduga pendekatan aritmatika murni akan lebih pendek dengan rekursi seperti f=lambda n,r=0:...f(n/2,2*r+~n%2)...mengunyah digit biner dari ujungnya terbalik dan dibalik, dan mendeteksi kapan ndan rsama hingga pusat 1. Ada kehalusan meskipun dengan nol terkemuka dan pusat.

Tidak
sumber
8

Python 2, 94 79 72 67 byte

F=lambda s:s in'1'or(s[0]!=s[-1])*F(s[1:-1])
lambda n:F(bin(n)[2:])

Disimpan 12 byte berkat @xnor

Menentukan fungsi yang tidak disebutkan namanya pada baris kedua.

Penjelasan (dengan beberapa spasi putih ditambahkan):

F = lambda s:                                        # We define a function, F, which takes one argument, the string s, which returns the following:
             s in'1'                                 # Gives true if s is '' or s is '1', the first case is a base case and the second is for the middle bit case.
                     or(s[0] != s[-1])               # Or the first and last are different
                                      * F(s[1:-1])   # And check if s, without the first and last element is also foldable.
lambda n: F(bin(n)[:-2])                             # The main function, which calls F with the argument in binary form.

Coba di sini!

Loovjo
sumber
4
s==''or s=='1'dapats in'1'
xnor
Oh begitu mirip - pikiran besar ...
Jonathan Allan
1
The anddapat aritmatika *. Juga, fdiizinkan untuk tidak disebutkan namanya.
xnor
6

Haskell, 89 88 86 byte

f n|n<2=[n]|1>0=mod n 2:f(div n 2)
g n=elem(product$zipWith(+)(f n)$reverse$f n)[1,2]

Bekerja dengan menjumlahkan bitwise representasi bit dengan kebalikannya dan mengambil produk. Jika 1 atau 2, angkanya adalah angka lipat (1 jika ada bit yang terlipat, 2 jika ada bit aneh dan satu di tengah).

Angs
sumber
5

Python 2, 100 99 95 94 Bytes

Ini terasa agak lama, tapi saya akan terus bekerja :) Mencetak 1jika angkanya bisa dilipat, 0jika tidak.

a=bin(input())[2:]
b=len(a)
print(a[b/2]>=`b%2`)*all(c!=d for c,d in zip(a[:b/2],a[:~b/2:-1]))

Uji di sini!

terima kasih kepada Wheat Wizard untuk save 1-byte :)

terima kasih kepada Rod untuk save 5-byte! :)

Kade
sumber
Anda dapat menggantinya b-1dengan~b
Wheat Wizard
@ Heatheizard Luar Biasa, terima kasih!
Kade
Anda dapat mengganti [1,a[b]>'0'][len(a)%2]dengan(a[b]>=`len(a)%2`)
Rod
Anda juga dapat menambahkan e=len(a)untuk mengubah b=e/2 `e%2`, menghemat 1 byte. Dan kemudian kedua jawaban python akan diikat c:
Batang
2
@Rod Awesome: D Kecuali sekarang jawaban yang lain menghancurkan saya;)
Kade
4

> <> , 37 + 3 = 40 byte

<,2-@:%2:v!?:
=2lrv?=1l<+={$r0?
0=n;>

Input diharapkan ada pada stack pada awal program, jadi +3 byte untuk -vflag.

Cobalah online!

Sok
sumber
4

Jelly , 13 byte

Bœs2U0¦z0^/€Ạ

TryItOnline
Atau ketentuan yang cocok hingga 4558

Bagaimana?

Bœs2U0¦z0^/€Ạ - Main link: n
B             - binary
 œs2          - split into 2 slices (odd length will have first longer than second)
     0¦       - apply to index 0 (the right hand one)
    U         - reverse
       z0     - zip together with filler 0 (thus central 1 or 0 will pair with 0)
          /€  - reduce with for each
         ^    -     XOR
            Ạ - All truthy?
Jonathan Allan
sumber
4

Perl, 46 byte

Termasuk +1 untuk -p

Jalankan dengan nomor di STDIN

folding.pl <<< 178

folding.pl:

#!/usr/bin/perl -p
$_=($_=sprintf"%b",$_)<s%.%!/\G1$/^$&^chop%eg

Saya menganggapnya sebagai bug perl yang ini bahkan berfungsi. Internal $_seharusnya tidak mendapatkan pembaruan posisi pertandingan setelah diubah. Dalam program ini posisi pertandingan benar-benar bergerak melampaui akhir$_

Ton Hospel
sumber
Bagus Yang terbaik yang bisa saya lakukan adalah 59 perl -pe '$_=sprintf("%b",$_)=~/^(.*)1?(??{reverse$^N=~y%01%10%r})$/':: /
Dada
4

Brachylog , 16 byte

ḃḍ{↔|h1&b↔}ᵗz₂≠ᵐ

Ini tidak berfungsi secara online ...

Membawa input melalui variabel input dan output melalui keberhasilan atau kegagalan. Ini sangat bergantung pada z₂, yang telah ada dalam bahasa tersebut sejak 30 April, tetapi kami lupa untuk memintanya menggunakan TIO sehingga untuk sementara ini ini hanya bekerja pada pemasangan lokal bahasa tersebut. Apa pun itu, itu mungkin pendekatan yang terlalu naif.

                    The input
ḃ                   's binary representation
 ḍ                  split in half
  {       }ᵗ        with its second half
   ↔|               either reversed, or
     h1             if it starts with 1
       &b           relieved of its first element
         ↔          and then reversed
              ≠     has no duplicate elements
            z  ᵐ    in any pair of elements zipped from the two halves
             ₂      which are equal in length.

Brachylog (di TIO), 19 byte

ḃḍ{↔|h1&b↔}ᵗlᵛ↖Lz≠ᵐ

Cobalah online!

lᵛ↖Lzsecara fungsional setara dengan z₂(jika Anda tidak menggunakan variabel L di tempat lain), tetapi juga tiga byte lebih lama.

String yang tidak terkait
sumber
3

Python 2, 76 71 69 byte

-5 byte terima kasih kepada @Dennis ( ''hadir '1', jadi ganti in('','1')dengan in'1')
-2 byte terima kasih kepada @xnor (gunakan multiplikasi, (...)*sebagai pengganti and)

f=lambda n:f(bin(n)[2:])if n<''else n in'1'or(n[0]!=n[-1])*f(n[1:-1])

Ideone

Fungsi rekursif, pada panggilan pertama nadalah angka sehingga mengevaluasi sebagai kurang dari string kosong, dengan if n<'', dan fungsi dipanggil lagi tetapi dengan ndilemparkan ke string biner; ekornya adalah string kosong (bahkan bit-panjang) atau bit tengah, yang mengembalikan true untuk kosong atau a '1'; pada jalan turun itu menguji bit luar untuk ketidaksetaraan (setara dengan XOR) dan berulang pada bit dalam n[1:-1],.

Jonathan Allan
sumber
1
Saya pikir n in'1'berhasil.
Dennis
Cemerlang, saya tidak akan berpikir ''hadir 'blah', tapi ya itu :)
Jonathan Allan
1
The anddapat aritmatika *.
xnor
3

Python 2, 63 byte

s=bin(input())[2:]
while s[0]!=s[-1]:s=s[1:-1]or'1'
print'1'==s

Cetakan Trueatau False. Mengambil representasi biner sdan berulang kali menghapus karakter pertama dan terakhir selama mereka tidak setara. Cek apakah yang tersisa adalah string kosong atau pusat 1. Hal ini dilakukan dengan mengkonversi ''ke '1'dan memeriksa jika hasilnya sama '1', yang juga menghindari kesalahan indeks pada string kosong.

Tidak
sumber
3

PowerShell v2 +, 143 byte

Dua pendekatan yang mungkin, keduanya jumlah byte yang sama.

Metode 1:

param($n)if($n-eq1){$n++}$o=1;0..(($b=($n=[convert]::ToString($n,2)).length-1)/2-!($b%2))|%{$o*=$n[$_]-ne$n[$b-$_]};$o*(+"$($n[$b/2])",1)[$b%2]

Dibutuhkan input $n, jika itu adalah -equntuk 1(kasus khusus untuk algoritma ini), tambahkan itu. Tetapkan $output menjadi 1(yaitu, asumsikan benar), lalu loop dari 0ke titik tengah nomor input yang telah [convert]diedit ke biner. Perhatikan -!($b%2)untuk menghitung angka biner panjang ganjil.

Setiap iterasi, kami membandingkan digit saat ini $n[$_]dengan digit yang sama panjang dari ujung $n[$b-$_], dan mengalikan hasil Boolean menjadi $o(pada dasarnya melakukan -andsemua itu). Setelah loop selesai, kita perlu memperhitungkan digit biner tengah, itulah pseudo-ternary di akhir (array diindeks via $b%2). Itu 1atau 0ditinggalkan di pipa, dan output tersirat.


Metode 2:

param($n)for($n=[convert]::ToString($n,2);$n.Length-gt2){if($n[0]-ne$n[-1]){$n=$n[1..($n.Length-2)]}else{0;exit}}($n-join'+'|iex)-eq1-or$n-eq10

Mengambil input dan melakukan proses yang sama ke [convert]nomor ke biner. Lalu kita berada dalam satu forlingkaran selama .lengthstring biner adalah -greater than 2. Ketika kita berada di loop, jika digit pertama $n[0]dan terakhir $n[-1]adalah -not equal, potong dua digit dari $ndan simpan kembali $n. Kalau tidak, output 0dan exit. Begitu kita keluar dari loop, kita juga harus (array 1, 1,0, 0,1, 1,1, atau 0,0), atau string biner untuk dua 10, atau 3 11. Jadi, kita perlu menguji dua kemungkinan itu. Untuk yang pertama, kami -join $nbersama-sama dengan +dan mengevaluasi hasil dan menguji apakah itu1(ini berlaku untuk array 1,, 1,0dan 0,1, tetapi $falseuntuk array 0,0dan 1,1atau string 10atau 11). Setengah lainnya dari -orpengujian $nadalah apakah -equal to 10(yaitu, input 2). Boolean itu ditinggalkan di jalur pipa, dan hasilnya tersirat.

AdmBorkBork
sumber
3

CJam , 13 byte

ri2b_W%.+:*3&

Cobalah online! atau buat daftar nomor lipat hingga nomor yang diberikan.


ri2b   e# convert input to binary
_W%.+  e# flip and sum (if folding all bits are 1 except middle)
:*     e# product is 0 or power of 2 (2 if middle folds)
3&     e# keep only 1 or 2, everything else becomes 0 (false)
Linus
sumber
2

MATL , 16 byte

tBn2/kW&\hBZ}P=~

Truthy adalah array dengan semua yang ada. Periksa kriteria kebenaran / kepalsuan di sini .

Cobalah online! Atau Verifikasi 20 kasus uji pertama .

Penjelasan

Mari kita gunakan input 1644sebagai contoh.

t     % Imolicitly take input. Duplicate
      %   STACK: 1644, 1644
Bn    % Number of digits of binary expansion
      %   STACK: 1644, 11
2/k   % Divide by 2 and round down
      %   STACK: 1644, 5
W     % 2 raised to that
      %   STACK: 1644, 32
&\    % Divmod
      %   STACK: 12, 51
h     % Concatenate horizontally
      %   STACK: [12 51]
B     % Binary expansion. Each numnber gives a row, left-padded with zeros if needed
      %   STACK: [0 0 1 1 0 0; 1 1 0 0 1 1]
Z}    % Split into rows
      %   STACK: [0 0 1 1 0 0], [1 1 0 0 1 1]
P     % Reverse
      %   STACK: [0 0 1 1 0 0], [1 1 0 0 1 1]
=~    % True for entries that have different elements
      %   STACK: [1 1 1 1 1 1]
      % Implicitly display
Luis Mendo
sumber
2

PHP, 101 Bytes

for($r=1;$i<($l=strlen($b=decbin($argv[1])))>>1;)$r*=$b[$i]^1^$b[$l-++$i]^1;$r*=$l%2?$b[$i]:1;echo$r;

atau dengan log

for($r=1,$s=log($n=$argv[1],2)^0;2*$i<$s;)$r*=($n>>$i)%2^($n>>$s-$i++)%2;$s%2?:$r*=($n>>$i)%2;echo$r;

108 Bytes dengan array

for($r=1,$a=str_split(decbin($argv[1]));$a;)$r*=array_pop($a)!=($a?array_shift($a):0);$r*=$a?$a[0]:1;echo$r;

Nilai sebenarnya <10000

1,2,6,10,12,22,28,38,42,52,56,78,90,108,120,142,150,170,178,204,212,232,240,286,310,346,370,412,436,472,496,542,558,598,614,666,682,722,738,796,812,852,868,920,936,976,992,1086,1134,1206,1254,1338,1386,1458,1506,1596,1644,1716,1764,1848,1896,1968,2016,2110,2142,2222,2254,2358,2390,2470,2502,2618,2650,2730,2762,2866,2898,2978,3010,3132,3164,3244,3276,3380,3412,3492,3524,3640,3672,3752,3784,3888,3920,4000,4032,4222,4318,4462,4558,4726,4822,4966,5062,5242,5338,5482,5578,5746,5842,5986,6082,6268,6364,6508,6604,6772,6868,7012,7108,7288,7384,7528,7624,7792,7888,8032,8128,8318,8382,8542,8606,8814,8878,9038,9102,9334,9398,9558,9622,9830,9894
Jörg Hülsermann
sumber
2

Julia , 66 byte

c(s)=s==""||s=="1"||(s[1]!=s[end]&&c(s[2:end-1]))
f(x)=c(bin(x))

Golf pertamaku! bekerja dengan cara yang sama dengan solusi Python dengan panjang yang sama, perbedaan kecil karena bahasa (saya memang membuatnya sendiri, meskipun ...).

Penjelasan:

c(s) = s == "" || # Base case, we compared all the digits from 
                  # both halves.
       s == "1" || # We compared everything but left a 1 in the middle
       (s[1] != s[end] &&  # First digit neq last digit (XNOR gives 0).
        c(s[2:end-1]))     # AND the XNOR condition is satisfied for the  
                           # 2nd to 2nd to last digit substring.
f(x) = c(bin(x))  # Instead of a string f takes an integer now.
Sean McBane
sumber
2

C, 223 201 189 194 178 Bytes

i,j,m,l,r;f(n){for(m=j=1,i=n;i/=2;++j);for(l=r=i=0;i<j/2;i++)r|=n&m?1<<j/2-i-1:0,m*=2;i=(j&1&&n&m)?i+1:(j&1)?l=r:i;n>>=i;for(m=1;i<j;i++)l|=n&m,m*=2;return !(~(l^r)&(1<<j/2)-1);}

Algoritma brute force. Mari kita lihat sejauh mana golf itu bisa.

Perbaikan bug pengaturan penyiapan yang lebih baik ...

 main()
 {
    int t, s, u, testSet[] = 
    {
    1, 2, 6, 10, 12, 22, 28, 38, 42, 52, 56, 78, 90, 108, 120,
    142, 150, 170, 178, 204, 212, 232, 240, 286, 310, 346, 370,
    412, 436, 472, 496, 542, 558, 598, 614, 666, 682, 722, 738,
    796, 812, 852, 868, 920, 936, 976, 992, 1086, 1134, 1206,
    1254, 1338, 1386, 1458, 1506, 1596, 1644, 1716, 1764, 1848,
    1896, 1968, 2016, 2110, 2142, 2222, 2254, 2358, 2390, 2470,
    2502, 2618, 2650, 2730, 2762, 2866, 2898, 2978, 3010, 3132,
    3164, 3244, 3276, 3380, 3412, 3492, 3524, 3640, 3672, 3752,
    3784, 3888, 3920, 4000, 4032, 4222, 4318, 4462, 4558
    };


    for (u=s=0,t=1;t<=4558;t++)
    {
        if (f(t))
        {
          u++;            
          if (testSet[s++]!=t)
              printf("BAD VALUE %d %d\n", testSet[s-1], t);
        }
    }

    printf("%d == %d Success\n", u,
           sizeof(testSet)/sizeof(testSet[0]));

}
Cleblanc
sumber
2

MATL , 13 byte

BttP=<~5Ms2<*

Truthy adalah array dengan semua yang ada. Periksa kriteria kebenaran / kepalsuan di sini .

Cobalah online!Atau verifikasi 20 kasus uji pertama .

Penjelasan

Menggunakan input 1644sebagai contoh:

B     % Implicit input. Convert to binary
      %   STACK: [1 1 0 0 1 1 0 1 1 0 0]
t     % Duplicate
      %   STACK: [1 1 0 0 1 1 0 1 1 0 0], [1 1 0 0 1 1 0 1 1 0 0]
tP=   % Element-wise compare each entry with that of the reversed array
      %   STACK: [1 1 0 0 1 1 0 1 1 0 0], [0 0 0 0 0 1 0 0 0 0 0]
<~    % True (1) if matching entries are equal or greater
      %   STACK: [1 1 1 1 1 1 1 1 1 1 1]
5M    % Push array of equality comparisons again
      %   STACK: [1 1 1 1 1 1 1 1 1 1 1], [0 0 0 0 0 1 0 0 0 0 0]
s     % Sum of array
      %   STACK: [1 1 1 1 1 1 1 1 1 1 1], 1
2<    % True (1) if less than 2
      %   STACK: [1 1 1 1 1 1 1 1 1 1 1], 1
*     % Multiply
      %   STACK: [1 1 1 1 1 1 1 1 1 1 1]
      % Implicitly display
Luis Mendo
sumber
1

JavaScript, 71 byte

(i,n=i.toString(2))=>/^(1*)2?\1$/.test(+n+ +n.split``.reverse().join``)

Menentukan fungsi anonim.

Metode ini mungkin bukan yang terpendek, tetapi sejauh yang saya tahu, ini unik Itu menambahkan angka dalam biner untuk dirinya sendiri terbalik, memperlakukan mereka sebagai desimal, kemudian memeriksa apakah hasilnya valid menggunakan regex.

DanTheMan
sumber
1

Retina, 92 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1.

.+
$*
+`(1+)\1
${1}0
01
1
^((.)*?)1??((?<-2>.)*$.*)
$1¶$3
O$^`.(?=.*¶)

T`01`10`^.*
^(.*)¶\1

Cobalah online

Konversikan ke unary. Ubah itu menjadi biner. Potong jumlahnya menjadi dua dan lepaskan tengah 1jika ada. Membalik babak pertama. Ganti satu dan nol. Cocokkan jika kedua bagiannya sama.

mbomb007
sumber
1

Retina, 71 70 60 byte

.+
$*
+`^(1*)\1(1?)\b
$1 $.2
+`^ (.)(.*) (?!\1).$
$2
^( 1)?$

Saya mungkin masih harus banyak belajar tentang Retina (misalnya regex rekursif?). Penjelasan: Langkah 1 mengkonversi dari desimal ke unary. Langkah 2 mengkonversi dari unary ke pseudo-binary. Langkah 3 menghapus digit dari kedua ujungnya selama tidak cocok. Langkah empat cocok dengan final central 1 opsional jika perlu. Sunting: Disimpan 1 byte berkat @ mbomb007. Disimpan 10 byte dengan meningkatkan konversi unary ke binary saya.

Neil
sumber
Baris pertama bisa .*atau .+.
mbomb007
1

Python 2, 61 59 byte

Menyimpan dua byte untuk mengubah shift menjadi multiplikasi

m=n=input()
i=0
while m:i*=2;i+=m&1;m/=2
print(n+i+1)&(n+i)

Pengembalian 0untuk nomor lipat dan apa pun untuk non-lipat. Menggunakan pendekatan bit-twiddling.

Karl Napf
sumber
0

C, 65 63 byte

Dua byte untuk mengubah shift menjadi multiplikasi

i,m;
f(n){
 m=n;i=0;
 while(m)i*=2,i+=m&1,m/=2;
 return(n+i+1)&(n+i);
}

Spasi sudah dikecualikan dari bytecount, menghasilkan 0 untuk nomor lipat dan apa pun untuk non-lipat. Menggunakan pendekatan bit-twiddling.

Karl Napf
sumber
0

k, 77 byte

{X:2 0N#X@&:|\X:0b\:x;c:#:'X;$[(~*X 1)|(=). c;~|/(=).(::;|:)@'(-&/ c)#'X;0b]}

melalui penjelasan, terjemahan ke q

{X:2 0N#X where maxs X:0b vs x;
  c:count each X;
  $[(not first last X)or(=). c;
    not any(=).(::;reverse)@'(neg min c)#'X;0b]
  };
skeevey
sumber