Ini terinspirasi oleh Soal 13 - Biner Tidak Berulang dari kompetisi HP CodeWars baru-baru ini.
Mari kita ambil angka desimal acak, katakanlah
727429805944311
dan lihat representasi binernya:
10100101011001011111110011001011101010110111110111
Sekarang pisahkan representasi biner itu ke dalam urutan di mana digit 0
dan 1
bergantian.
1010 010101 10 0101 1 1 1 1 1 10 01 10 0101 1 1010101 101 1 1 1 101 1 1
Dan ubah setiap urutan kembali menjadi desimal.
10 21 2 5 1 1 1 1 1 2 1 2 5 1 85 5 1 1 1 5 1 1
Tugas
Ambil satu, bilangan bulat positif sebagai input dan output urutan bilangan bulat positif yang diperoleh oleh proses di atas.
Detail
- Input dan output harus dalam desimal atau unary.
- Angka-angka dalam output harus dipisahkan dengan cara yang masuk akal, dapat dibaca manusia, dan harus dalam desimal atau unary. Tidak ada batasan pada ruang putih. Hari gaya keluaran:
[1,2,3]
,1 2 3
,1\n2\n3
mana\n
yang baris literal, dll
Uji kasus
Input | Output
0 | 0
1 | 1
2 | 2
3 | 1 1
4 | 2 0
5 | 5
6 | 1 2
7 | 1 1 1
8 | 2 0 0
9 | 2 1
10 | 10
50 | 1 2 2
100 | 1 2 2 0
1000 | 1 1 1 1 10 0 0
10000 | 2 1 1 2 0 2 0 0 0
12914 | 1 2 2 1 1 2 2
371017 | 5 42 10 2 1
Catatan tambahan: semua angka dalam output harus dalam bentuk (2^k-1)/3
atau 2*(2^k-1)/3
. Yaitu 0 1 2 5 10 21, 42, 85, 170, ...
,, yang A000975 di OEIS.
code-golf
sequence
base-conversion
binary
subsequence
El'endia Starman
sumber
sumber
|tac
akan tetap dalam jawaban saya kemudian :)Jawaban:
Pyth,
1716 byte1 byte berkat Jakube
Demonstrasi
Solusi yang bagus dan cerdas. Menggunakan beberapa fitur Pyth yang kurang dikenal, seperti
x<int><list>
danc<str><list>
.sumber
tJ
dengan+dJ
Anda dapat menghapushM
.Mathematica, 47 byte
Tidak Disatukan:
Split[list,f]
membagi daftar menjadi beberapa daftar, memecah pada posisi antaraa
danb
ifff[a,b]
tidak kembaliTrue
.FromDigits[n,2] => Fold[#+##&,n]
adalah ujung rapi dari alephalpha.sumber
Python, 86 byte
Karena saya sangat terkalahkan di Pyth, mari kita lakukan dengan Python lagi.
Coba di sini!
Penjelasan
Kami mulai dengan mengubah nomor input
n
menjadi string biner.bin(n)[2:]
urus itu. Kita perlu membuang 2 karakter pertama dari string ini karenabin()
mengembalikan string dalam format0b10101
.Selanjutnya kita perlu mengidentifikasi perbatasan dari urutan. Ini dapat dilakukan dengan regex
(?<=(.))(?=\1)
yang cocok dengan posisi panjang nol dalam string yang memiliki nomor yang sama di kiri dan kanan.Cara yang jelas untuk mendapatkan daftar semua urutan adalah dengan menggunakan
re.split()
yang membagi string pada regex tertentu. Sayangnya fungsi ini tidak berfungsi untuk pencocokan panjang nol. Tapi untungnyare.sub()
, jadi kami hanya mengganti kecocokan panjang nol dengan spasi dan membagi string pada yang setelah itu.Kemudian kita hanya perlu menguraikan masing-masing dari urutan tersebut kembali ke angka desimal dengan
int(s,2)
dan selesai.sumber
Jelly, 12 byte
Cobalah online! atau verifikasi semua kasus uji .
Bagaimana itu bekerja
sumber
Utilitas Bash + GNU, 51
Masukan diambil dari STDIN.
dc -e2o?p
membaca input integer dari STDIN dan menghasilkan string base 2sed -r ':;s/(.)\1/\1 \1/;t'
Memisahkan string basis 2 dengan spasi di mana-mana ada digit yang sama berturut-turutdc -e2i?f
membaca biner split dalam sekali jalan, meletakkan setiap bagian pada tumpukan, laluf
membuang seluruhdc
tumpukan (nomor keluaran dalam urutan terbalik) ...tac
.sumber
JavaScript (ES6) 58
62 63Edit 1 byte disimpan thx @ETHproduksi
Edit 4 byte disimpan thx @Neil
sumber
/(01)*0?|(10)*1?/g
, atau akankah itu mengacaukan sesuatu ??x=>'0b'+x-0+' '
untuk menghemat satu byte./((.)(?!\2))*./g
menghemat 4 byte keren.Pyth, 26 byte
Coba di sini!
Penjelasan
Karena fungsi split () Python tidak terpecah pada kecocokan zero-length, saya harus mengganti kecocokan itu dengan spasi dan membagi hasilnya.
sumber
Pyth,
2221 byteCobalah online: Demonstrasi
Benar-benar tugas yang membosankan di Pyth.
Penjelasan:
sumber
05AB1E , 18 byte
Kode:
Penjelasan:
Cobalah online!
Menggunakan pengodean CP-1252 .
sumber
MATL ,
1817 byteCobalah online!
sumber
zsh,
676355 byteSaya tidak tahu mengapa, tetapi ini tidak berhasil di Bash.
Terima kasih kepada Dennis untuk 8 byte!
sumber
for
sintaksisnya. ... Tunggu, bukanfor
?for i in `grep -oP '1?(01)*0?'<<<$[[##2]$1]`;<<<$[2#$i]
.PHP,
Tampilan meledak171168162160158121120131124118116113112 byteGunakan
d(int)
dan Anda tidak aktif, output adalahecho
string ed yangint
dipisahkan oleh spasi.Suntingan:
-3:
$b
Definisi pindah kestrlen()
panggilan.-6:
$c
Instansiasi dihapus .-2: Akhirnya memperbaiki masalah penggabungan.
-2: Tidak ada tanda kurung untuk satu baris
for()
.-37: Perombakan total. Pergi dengan
Array
chunklets bukannya mengulangiArray
->String
->Array
panggilan.-1: Penyetelan
$c
ulang secara licik .+11: Perbaikan bug. Ada potongan terakhir yang hilang. Tidak lagi.
-7: Tidak perlu instantiate
$d
sama sekali? Bagus.-6:
return
->echo
.-2: Mengunyah
$c
.-3:Ternary, cinta pertamaku.
-1: Sneaky sneaky
$u
.sumber
function d($i){for(;$d<$l=strlen($b=decbin($i));print$u==$b[++$d]||$d==$l?bindec($c).$c=" ":"")$c.=$u=$b[$d];}
.Cembung 0,2+, 25 byte
Convex adalah bahasa baru yang saya kembangkan yang sangat didasarkan pada CJam dan Golfscript. Interpreter dan IDE dapat ditemukan di sini . Input adalah bilangan bulat ke argumen baris perintah. Ini menggunakan pengkodean CP-1252 .
Penjelasan:
sumber
Java 8,
127119 byteMungkin ada ekspresi reguler yang lebih baik di luar sana untuk memisahkan string. Saya tidak mahir di regex, tapi saya akan terus bereksperimen.
-8 byte terima kasih kepada @FryAmTheEggman
sumber
APL (APL) ,
2125 byteSekarang menangani 0 juga.
Cobalah online!
2⊥⍣¯1⊢
konversikan ke basis-2, menggunakan bit sebanyak yang diperlukan (lit. konversi terbalik dari-basis-2){
...}
terapkan fungsi anonim berikut0::
jika terjadi kesalahan:0
kembali 0⋄
sekarang coba:2=/⍵
persamaan argumen berpasangan (akan gagal representasi biner 0 panjang-0)1,
tambahkan 1⍵⊂⍨
gunakan itu untuk mempartisi argumen (mulai bagian baru pada setiap 1)2⊥¨
konversi masing-masing dari basis-2sumber
⊂
sangat berguna di sini. Saya harus menambahkan itu ke Jelly.R←X⊂Y
: Dengan⎕ML<3
(yaitu gaya Dyalog), partisi baru dimulai pada hasil yang sesuai dengan masing-masing 1 dalam X hingga posisi sebelum 1 berikutnya di X (atau elemen terakhir X) menjadi item-item berurutan dari R. With⎕ML=3
(yaitu gaya IBM), sebuah partisi baru dimulai di hasilnya setiap kali elemen yang sesuai dalam X lebih besar dari yang sebelumnya. Item dalam Y yang sesuai dengan 0s di X tidak termasuk dalam hasil. Jadi⎕ML←1 ⋄ 1 0 0 1 0 1 1 ⊂ ⍳7
sama dengan⎕ML←3
⋄ 4 3 2 4 4 5 7 ⊂ ⍳7`Japt , 7 byte
Menguji
Penjelasan
sumber
Python 3, 115 byte
Penjelasan
Hasil
solusi sebelumnya (118 byte)
sumber
Haskell,
147, 145 bytemap(sum.zipWith((*).(2^))[0..]).([]%).b
adalah fungsi tanpa nama yang menghitung daftar.Kurang bermain golf:
sumber
Perl, 53 byte
Termasuk +1 untuk
-p
Jalankan dengan nomor di STDIN
alterbits.pl
:sumber
PowerShell, 103 byte
Karena saya mengerikan di regex, saya menggunakan ungkapan yang sama dengan jawaban edc65 .
Benar-benar dihancurkan oleh panggilan .NET yang panjang untuk melakukan konversi ke / dari biner, dan panggilan .NET untuk mendapatkan pencocokan regex. Kalau tidak cukup mudah. Membawa input
$args[0]
,convert
s ke biner, mengumpankannyaMatches
, mengambil resultan.Value
, menyalurkannya melalui loop|%{...}
danconvert
s kembali ke nilai-nilai tersebutint
. Keluaran dibiarkan pada pipa dan secara implisit dicetak dengan baris baru.Untuk kredit ekstra - versi (kebanyakan) non-regex pada 126 byte
Kami lagi mengambil input
$args[0]
danconvert
ke biner. Kami melakukan casting ulang sebagai char-array, menyimpan karakter pertama$l
dan karakter lainnya$r
. Kami kemudian mengirimkan$r
melalui loop di|%{...}
mana setiap iterasi yang kami pilih dari salah satu karakter diawali dengan spasi atau hanya karakter, tergantung pada hasil dari xor biner dengan$l
, dan kemudian set$l
sama dengan karakter. Ini secara efektif memastikan bahwa jika kita memiliki karakter yang sama dua kali berturut-turut, kita menambahkan spasi di antara mereka.Output dari loop
-join
diedit bersama dan ditambahkan ke karakter pertama$l
, lalu-split
pada spasi (yang secara teknis merupakan regex, tapi saya tidak akan menghitungnya). Kami kemudian melakukan loop yang sama dengan jawaban regexconvert
dan output integer.sumber
Java 345 byte
Uji
Keluaran
sumber
package
danclass
, dan menghapus spasi yang tidak perlu. Beri tahu saya jika Anda memiliki pertanyaan!Julia,
7057 byteIni adalah fungsi anonim yang menerima integer dan mengembalikan array integer. Untuk menyebutnya, tetapkan ke variabel.
Pendekatan di sini mirip dengan jawaban Python DenkerAffe yang bagus . Kami mendapatkan representasi biner dari
n
penggunaanbin(n)
, dan membagi string yang dihasilkan pada semua kecocokan dari ekspresi reguler(?<=(.))(?=\1)
. Ini sebenarnya adalah pertandingan nol panjang;(?<=(.))
adalah tampilan positif di belakang yang menemukan karakter tunggal, dan(?=\1)
tampilan positif di bawah yang menemukan karakter yang cocok dalam tampilan di belakang. Ini menempatkan tempat-tempat di mana angka diikuti dengan sendirinya dalam representasi biner. Hanyaparse
masing-masing sebagai bilangan bulat di basis 2 menggunakanmap
dan voila!sumber
C,
137129 byteInput dan output berada pada aliran standar.
sumber
puts
, meskipun itu tidak menyenangkan untuk digunakan, spek tidak memerlukan baris baru.J , 16 byte
Cobalah online!
Penjelasan
sumber
q / kdb +, 52 byte
Larutan:
Contoh:
Penjelasan:
q
ditafsirkan dari kanan ke kiri.Keluarkan input ke biner, potong nol di depan, temukan indeks di mana berbeda, balikkan untuk mendapatkan indeks di mana sama, daftar terpecah pada indeks ini, konversikan kembali ke basis-10. Tampak agak berat dibandingkan dengan solusi APL meskipun ...
sumber
PHP, 147
Perlu memberi ruang ekstra pada keluaran karena tidak ada batasan. Pemberitahuan ditampilkan untuk pengkodean singkat.
Versi tidak disatukan
sumber
Retina, 60
Cobalah online! Atau coba versi yang sedikit dimodifikasi untuk semua kasus uji (dengan desimal I / O).
Sayangnya, nol pertandingan panjang tampaknya memiliki dua "sisi", yang menyebabkan duplikasi ketika digunakan dengan regex dari tahap ketiga. Hanya biaya satu byte.
Mengambil input sebagai unary, output sebagai unary. Tidak benar-benar yakin tentang menggunakan nilai unary in / out yang berbeda, tetapi itu akan menghemat 4 byte.
sumber
Jelly , 9 byte (tidak bersaing?)
Cobalah online!
sumber