Diberikan bilangan bulat n > 0
, menampilkan panjang urutan berdekatan terpanjang 0
atau 1
dalam representasi binernya.
Contohnya
6
ditulis110
dalam biner; urutan terpanjang adalah11
, jadi kita harus kembali2
16
→10000
→4
893
→1101111101
→5
1337371
→101000110100000011011
→6
1
→1
→1
9965546
→100110000000111111101010
→7
code-golf
sequence
binary
subsequence
Arnaud
sumber
sumber
Jawaban:
Python 2 ,
4645 byteCobalah online!
Bagaimana itu bekerja
Dengan XORing n dan n / 2 (membaginya dengan 2 pada dasarnya memotong bit terakhir), kita mendapatkan bilangan bulat baru m yang bit-bit yang tidak diset menunjukkan bit-bit yang berdekatan yang cocok dengan n .
Misalnya, jika n = 1337371 , kami memiliki yang berikut ini.
Ini mengurangi tugas untuk menemukan angka nol terpanjang. Karena representasi biner dari bilangan bulat positif selalu dimulai dengan angka 1 , kami akan mencoba mencari string angka 10 * terpanjang yang muncul dalam representasi biner dari m . Ini bisa dilakukan secara rekursif.
Inisialisasi k sebagai 1 . Setiap kali f dieksekusi, pertama-tama kita menguji apakah representasi desimal k muncul dalam representasi biner m . Jika ya, kita kalikan k dengan 10 dan panggil f lagi. Jika tidak, kode di sebelah kanan
and
tidak dijalankan dan kami mengembalikan False .Untuk melakukan ini, pertama-tama kita menghitung
bin(k)[3:]
. Dalam contoh kami,bin(k)
pengembalian'0b111100101110000010110'
, dan0b1
di awal dihapus dengan[3:]
.Sekarang,
-~
sebelum kenaikan rekursif panggilan False / 0 satu kali untuk setiap kali f disebut rekursif. Setelah 10 {j} ( 1 diikuti oleh pengulangan j dari 0 ) tidak muncul dalam representasi biner k , jangka panjang nol yang terpanjang dalam k memiliki panjang j - 1 . Karena j - 1 nol berurutan dalam k menunjukkan j yang cocok dengan bit yang berdekatan dalam n , hasil yang diinginkan adalah j , yang adalah apa yang kita peroleh dengan menambahkan False / 0total j kali.sumber
Python 2, 46 byte
Cobalah online
Ekstrak digit biner
n
secara terbalik dengan mengambiln/2
dann%2
. Lacak panjang jangka berjalanr
dari digit yang sama dengan mengatur ulang ke 0 jika dua digit terakhir tidak sama, lalu tambahkan 1.Ekspresi
~-n/2%2
adalah indikator apakah dua digit terakhir sama, yaitun
0 atau 3 modulo 4. Memeriksa dua digit terakhir bersama-sama ternyata lebih pendek daripada mengingat digit sebelumnya.sumber
05AB1E , 6 byte
Cobalah online!
Penjelasan
sumber
.¡
, saya bisa berhenti memaksa diri untuk mencoba menggunakannya.Mathematica, 38 byte
atau
sumber
Python, 53 byte
Fungsi lambda anonim.
sumber
Jelly , 6 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Ruby,
4140 byteTemukan urutan terpanjang dari '1' di b atau kebalikannya.
Berkat manatwork karena telah menghemat 1 byte.
sumber
%b
.JavaScript (ES6), 54 byte
Solusi rekursif dengan banyak manipulasi bit.
n
menyimpan input,r
menyimpan panjang lari saat ini,l
menyimpan panjang lari terpanjang, dand
menyimpan digit sebelumnya.Cuplikan tes
sumber
f=(x,b,n,m)=>x?f(x>>1,x&1,n=x&1^b||-~n,m>n?m:n):m
Ruby,
514443 byteSolusi fungsi.
@manatwork terbuat dari sihir
sumber
0
s berturut-turut ?->s{s.to_s(2).scan(/0+|1+/).map(&:size).max}
.Python 2, 57 byte
Solusi rekursif. Mungkin ada bentuk yang lebih pendek untuk bit magic.
sumber
Perl, 43 byte
Menghitung shebang sebagai satu, input diambil dari stdin.
Cobalah online!
sumber
#!perl
diperhitungkan sebagai nol, bukan#!perl -p
.-p
Biaya 1, dengan asumsi bahwa baris perintah Perl Anda tetap memiliki argumen (misalnya-e
atau-M5.010
), sehingga Anda dapat memasukkan sebuahp
hanya setelah salah satu tanda hubung. Ini#!perl
gratis (walaupun tidak perlu).Pip , 16 byte
Sepertinya harus ada cara yang lebih singkat untuk mendapatkan angka yang sama ...
Mengambil input sebagai argumen baris perintah. Cobalah online!
Penjelasan
sumber
Perl 6 , 36 byte
Penjelasan:
Cobalah online .
sumber
Haskell, 79 karakter
dimana
Atau dalam versi yang tidak dikoleksi:
Penjelasan:
intToBin
mengonversi int ke daftar digit biner (lsb dulu).group
kelompok urutan yang berdekatan, sehingga[1, 1, 0, 0, 0, 1]
menjadi[[1, 1],[0, 0, 0],[1]]
.maximum . map length
menghitung untuk setiap daftar bagian dalam panjangnya dan mengembalikan panjang yang terpanjang.Sunting: Terima kasih kepada @xnor dan @Laikoni karena menyimpan byte
sumber
group
tidak ada di Prelude secara default, Anda harus lakukanimport Data.List
untuk menggunakannyalet
:i n|(q,r)<-n`quotRem`2=r:i q
. Lihat tips golf Haskell kami .quotRem
bisadivMod
. Saya pikir Anda dapat menggunakani 0=[]
sebagai alas kasus.div
danmod
langsung bahkan lebih pendek:i n=mod n 2:i(div n 2)
.Pyth, 7 byte
Lakukan pengkodean panjang run pada string biner, lalu urutkanlah sehingga run terpanjang datang terakhir, lalu ambil elemen pertama (panjang) dari elemen terakhir (run terpanjang) dari daftar.
Dalam pseudocode:
sumber
J , 21 byte
Cobalah online!
Penjelasan
sumber
MATLAB 71 byte
Ini mengkonversi variabel integer 'a' ke array binary int8 kemudian menghitung berapa kali hasilnya harus dibedakan sampai tidak ada nol dalam hasilnya.
Saya baru disini. Apakah input dan one-liner semacam ini diizinkan oleh aturan PCG?
sumber
a
dengana=input('');
. Juga, beberapa saran golf:~a
bukannyaa==0
. Apakah Anda benar-benar membutuhkanint8
)?Oktaf , 31 byte
Cobalah online!
Penjelasan
Ini adalah terjemahan dari jawaban MATL saya. Rencana awal saya adalah pendekatan yang berbeda, yaitu
@(n)max(diff(find(diff([0 +dec2bin(n) 0]))))
. Tetapi ternyata Oktaf memilikirunlength
fungsi (yang baru saya ketahui). Secara default itu hanya output array run-length, jadi hasil yang diinginkan adalahmax
array itu. Output daridec2bin
, yang merupakan array char (string) yang berisi'0'
dan'1'
, perlu dikonversi ke array numerik menggunakan+
, karenarunlength
mengharapkan input numerik.sumber
Utilitas Bash / Unix,
666542 byteTerima kasih kepada @DigitalTrauma untuk peningkatan signifikan (23 byte!).
Cobalah online!
sumber
Bash (+ coreutils, + GNU grep),
33, 32 byteEDIT:
Golf
Dijelaskan
Cobalah secara Online!
sumber
Brachylog , 9 byte
Cobalah online!
Penjelasan
sumber
C #, 106 byte
Versi yang diformat:
Dan pendekatan alternatif mengakses string dengan indeks pada 118 byte, dengan spasi dihapus:
sumber
Javascript, 66 Bytes
Berkat manatwork untuk kodenya.
Penjelasan
Konversi angka menjadi string biner.
Pisahkan setiap karakter yang berbeda (0 atau 1) (regex ini menangkap ruang kosong tetapi mereka dapat diabaikan)
Untuk setiap elemen array, dapatkan panjangnya dan masukkan ke dalam array yang dikembalikan.
Konversi array ke daftar argumen ([1,2,3] -> 1,2,3)
Dapatkan jumlah terbesar dari argumen.
sumber
x=>x.toString(2).split(/(0+|1+)/g).map(y=>y.length).sort().pop()
. Atau sama panjang:x=>Math.max(...x.toString(2).split(/(0+|1+)/g).map(y=>y.length))
.sort((a,b)=>b-a)
. Secara default, fungsi sortir menempatkan10
di antara1
dan2
.Bertanya-tanya , 27 byte
Pemakaian:
Konversi ke biner, mencocokkan setiap urutan 0 dan 1, mendapatkan panjang setiap pertandingan, dan mendapatkan maksimum.
sumber
Batch, 102 byte
Port jawaban @ edc65.
%2
..%4
akan kosong pada panggilan pertama, jadi saya harus menulis ekspresi sedemikian rupa sehingga mereka akan tetap berfungsi. Kasus yang paling umum adalah%3
yang harus saya tulis(%3+0)
.%2
lebih mudah, karena hanya bisa0
atau1
, yang sama dalam oktal, jadi0%2
bekerja di sini.%4
ternyata menjadi lebih mudah, karena saya hanya perlu mengurangi itu.(%4-r>>5)
digunakan untuk membandingkanl
denganr
karena Batchset/a
tidak memiliki operator pembanding.sumber
Dyalog APL , 22 byte
Kereta fungsi anonim
⌈/∘(
... Maksimum hasil dari kereta fungsi anonim berikut ...≢¨
penghitungan masing-masing⊢⊂⍨
partisi argumen, di mana partisi ditentukan oleh yang ada di1,
satu ditambahkan ke2≠/
tidak sama berpasangan⊢
argumen)
diaplikasikan ke2⊥⍣¯1
from-base-2 diterapkan negatif satu kali (yaitu ke-base-2, sekali) ke⊢
argumenTryAPL online!
sumber
Japt, 15 byte
Uji secara online! atau Verifikasi semua kasus uji sekaligus .
Bagaimana itu bekerja
sumber
R,
4534 byteMemperbaiki kesalahpahaman yang konyol berkat @rturnbull dan @plannapus.
sumber
0
atau1
tidak0
, bukan?PowerShell ,
787473 byteCobalah online!
Ugh metode .Net itu.
Ini hanya menggunakan regex untuk menemukan (dan mencocokkan) urutan yang berdekatan dari satu dan nol, kemudian mengambil
Length
properti (dengan pola baru yang saya temukan yang menggunakan set parameter yang sedikit diketahuiForEach-Object
, untuk menyimpan 1 byte) dari objek pencocokan yang dihasilkan, mengurutkan mereka, dan menampilkan yang terakhir (yang terbesar).sumber
J, 27 byte
Pendekatan yang sedikit berbeda (dan sayangnya lebih lama) untuk jawaban miles .
Pemakaian:
Penjelasan
sumber