Membusuk biner menjadi bilangan berikutnya


30

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 0dan 1bergantian.

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\n3mana \nyang 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)/3atau 2*(2^k-1)/3. Yaitu 0 1 2 5 10 21, 42, 85, 170, ...,, yang A000975 di OEIS.


@DigitalTrauma: Hmmm ...... tidak, saya tidak berpikir itu dalam semangat tantangan.
El'endia Starman

Baik. |tacakan tetap dalam jawaban saya kemudian :)
Digital Trauma

Jawaban:


11

Pyth, 17 16 byte

1 byte berkat Jakube

iR2cJ.BQx1qVJ+dJ

Demonstrasi

Solusi yang bagus dan cerdas. Menggunakan beberapa fitur Pyth yang kurang dikenal, seperti x<int><list>dan c<str><list>.

iR2cJ.BQx1qVJ+dJ
                    Q = eval(input())
    J.BQ            Store in J the input in binary.
          qV        Vectorize equality function over
            J+dJ    J and J with a leading dummy char, to get the offset right.
                    This calculates whether each element matches its successor.
        x1          Find all of the indexes of 1 (True) in this list.
   cJ                Chop J at those locations.
iR2                  Convert from binary back to base ten and output.

1
Jika Anda mengganti tJdengan +dJAnda dapat menghapus hM.
Jakube

@ Jakube Bagus sekali!
isaacg

7

Mathematica, 47 byte

#+##&~Fold~#&/@#~IntegerDigits~2~Split~Unequal&

Tidak Disatukan:

FromDigits[#,2]&/@Split[IntegerDigits[#,2],Unequal]&

Split[list,f]membagi daftar menjadi beberapa daftar, memecah pada posisi antara adan biff f[a,b]tidak kembali True.

FromDigits[n,2] => Fold[#+##&,n]adalah ujung rapi dari alephalpha.


7

Python, 86 byte

Karena saya sangat terkalahkan di Pyth, mari kita lakukan dengan Python lagi.

import re
lambda n:[int(s,2)for s in re.sub("(?<=(.))(?=\\1)"," ",bin(n)[2:]).split()]

Coba di sini!

Penjelasan

Kami mulai dengan mengubah nomor input nmenjadi string biner. bin(n)[2:]urus itu. Kita perlu membuang 2 karakter pertama dari string ini karena bin()mengembalikan string dalam format 0b10101.
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 untungnya re.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.


4

Jelly, 12 byte

BI¬-ẋż@BFṣ-Ḅ

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

BI¬-ẋż@BFṣ-Ḅ  Main link. Argument: n

B             Convert n to base 2.
 I            Compute the increments, i.e., the differences of consecutive digits.
  ¬           Apply logical NOT.
   -ẋ         Repeat -1 that many times, for the logical NOT of each difference.
              [0, 0] / [1, 1] ->   0    -> 1 -> [-1]
              [0, 1] / [1, 0] -> 1 / -1 -> 0 -> []
       B      Yield n in base 2.
     ż@       Zip the result to the right with the result to the left.
        F     Flatten the resulting list of pairs.
         ṣ-   Split at occurrences of -1.
           Ḅ  Convert each chunk from base 2 to integer.

Tentunya 12 karakter tetapi 20 byte. Atau apakah Anda menggunakan sistem dengan CHAR_BIT >> 8?
James Youngman

1
@JamesYoungman Jelly tidak menggunakan UTF-8 secara default. Bahkan, ia memiliki halaman kode sendiri yang mengkodekan masing-masing dari 256 karakter yang dipahami sebagai masing-masing byte tunggal.
Dennis

4

Utilitas Bash + GNU, 51

dc -e2o?p|sed -r ':;s/(.)\1/\1 \1/;t'|dc -e2i?f|tac

Masukan diambil dari STDIN.

  • dc -e2o?p membaca input integer dari STDIN dan menghasilkan string base 2
  • sed -r ':;s/(.)\1/\1 \1/;t' Memisahkan string basis 2 dengan spasi di mana-mana ada digit yang sama berturut-turut
  • dc -e2i?fmembaca biner split dalam sekali jalan, meletakkan setiap bagian pada tumpukan, lalu fmembuang seluruh dctumpukan (nomor keluaran dalam urutan terbalik) ...
  • ... yang dikoreksi oleh tac.

4

JavaScript (ES6) 58 62 63

Edit 1 byte disimpan thx @ETHproduksi

Edit 4 byte disimpan thx @Neil

x=>x.toString(2).replace(/((.)(?!\2))*./g,x=>'0b'+x-0+' ')

f=x=>x.toString(2).replace(/((.)(?!\2))*./g,x=>'0b'+x-0+' ')

 
console.log=x=>O.textContent+=x+'\n'

;[
[     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']
].forEach(t=>{
  var i=t[0],k=t[1],r=f(i)
  console.log(i+' -> '+r+(r.trim()==k.trim() ? ' ok':'ko (should be '+k+')'))
})
<pre id=O></pre>


Bisakah Anda menyimpan dua byte dengan regex /(01)*0?|(10)*1?/g, atau akankah itu mengacaukan sesuatu ??
ETHproduksi

1
Juga, saya pikir Anda bisa lakukan x=>'0b'+x-0+' 'untuk menghemat satu byte.
ETHproduk

@ ETHproductions Saya mencoba regexp yang lebih pendek, tidak baik :(. Thx untuk petunjuk lainnya
edc65

The Leadboard mengatakan Anda memiliki jawaban 1 byte. Saya berasumsi itu karena Anda memiliki nomor yang dikoreksi (62) sebelum nomor lama (63) alih-alih setelah.
Kyle Kanos

Saya pikir regex /((.)(?!\2))*./gmenghemat 4 byte keren.
Neil

3

Pyth, 26 byte

iR2c:.BQ"(?<=(.))(?=\\1)"d

Coba di sini!

Penjelasan

iR2c: .BQ "(? <= (.)) (? = \\ 1)" d # Q = nomor input

     .BQ # Ubah input menjadi biner
    : "(? <= (.)) (? = \\ 1)" d # menyisipkan spasi putih di antara urutan berikutnya
   c # pisahkan string pada spasi putih
iR2 # mengubah setiap urutan menjadi desimal

Karena fungsi split () Python tidak terpecah pada kecocokan zero-length, saya harus mengganti kecocokan itu dengan spasi dan membagi hasilnya.


3

Pyth, 22 21 byte

&Qu?q%G2H&
GH+yGHjQ2Z

Cobalah online: Demonstrasi

Benar-benar tugas yang membosankan di Pyth.

Penjelasan:

&Qu?q%G2H&\nGH+yGHjQ2Z   implicit: Q = input number
                  jQ2    convert Q to base 2
  u               jQ2Z   reduce ^: for each digit H update the variable G=0:
   ?q%G2H                   if G%2 == H:
          \nG                  print G
         &   H                 then update G with H
              +yGH           else: update G with 2*G+H
  u                      print the last G also
&Q                       handle Q=0 special: only print 0 once

3

05AB1E , 18 byte

Kode:

b2FNð«N«Dð-s:}ð¡)C

Penjelasan:

b                   # Convert input to binary
 2F          }      # Do the following twice ( with N as range variable)
   Nð«N«            #    N + space + N
        D           #    Duplicate this
         ð-         #    Delete spaces from the duplicate string
           s        #    Swap the top two elements
            :       #    Replace the first string with the second
              ð¡    # Split on spaces
                )   # Wrap into an array
                 C  # Convert all element back to decimal

Cobalah online!

Menggunakan pengodean CP-1252 .


3

MATL , 18 17 byte

YBTyd~Thhfd1wY{ZB

Cobalah online!

YB      % input number. Convert to binary string
T       % push true value
y       % duplicate binary string and push it at the top of the stack
d~      % true for each value that equals the previous one
T       % push true value
hh      % concatenate: true, indices, true
f       % find indices of true values
d       % consecutive differences: lenghts of alternating sequences
1wY{    % split binary string according to those lengths
ZB      % convert each substring into decimal number

3

zsh, 67 63 55 byte

for i in `grep -oP '1?(01)*0?'<<<$[[##2]$1]`;<<<$[2#$i]

Saya tidak tahu mengapa, tetapi ini tidak berhasil di Bash.

Terima kasih kepada Dennis untuk 8 byte!


Ini forsintaksisnya. ... Tunggu, bukan for?
CalculatorFeline

Ekspansi aritmatika Bash tidak memungkinkan Anda menentukan basis output. Untuk menghilangkan xargs, Anda bisa menggunakan for i in `grep -oP '1?(01)*0?'<<<$[[##2]$1]`;<<<$[2#$i].
Dennis

2

PHP, 171 168 162 160 158 121 120 131 124 118 116 113 112 byte

function d($i){for(;$d<$l=strlen($b=decbin($i));){$c.=$u=$b[$d];echo$u==$b[++$d]||$d==$l?bindec($c).$c=" ":"";}}
Tampilan meledak
function d($i) {
  for ( ; $d < $l = strlen($b = decbin($i)); ) {
    $c .= $u = $b[$d];
    echo $u == $b[++$d] || $d == $l ? bindec($c) . $c = " "
                                    : "";
  }
}

Gunakan d(int)dan Anda tidak aktif, output adalah echostring ed yang intdipisahkan oleh spasi.

Suntingan:
-3:$b Definisi pindah ke strlen()panggilan.
-6:$c Instansiasi dihapus .
-2: Akhirnya memperbaiki masalah penggabungan.
-2: Tidak ada tanda kurung untuk satu baris for().
-37: Perombakan total. Pergi dengan Arraychunklets bukannya mengulangi Array-> String-> Arraypanggilan.
-1: Penyetelan $culang secara licik .
+11: Perbaikan bug. Ada potongan terakhir yang hilang. Tidak lagi.
-7: Tidak perlu instantiate $dsama sekali? Bagus.
-6: return -> echo.
-2: Mengunyah $c.
-3:Ternary, cinta pertamaku.
-1: Sneaky sneaky $u.


Saya pikir Anda dapat menyimpan 2 bytes: function d($i){for(;$d<$l=strlen($b=decbin($i));print$u==$b[++$d]||$d==$l?bindec($c).$c=" ":"")$c.=$u=$b[$d];}.
Blackhole

2

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 .

2bs®(?<=(.))(?=\\1)"ö2fbp

Penjelasan:

2bs                         Convert to binary string
   ®(?<=(.))(?=\\1)"        Regex literal
                    ö       Split string on regex
                     2fb    Convert each split string into decimal integer
                        p   Print resulting array

2

Java 8, 127 119 byte

l->new java.util.ArrayList<Long>(){{for(String s:l.toBinaryString(l).split("(?<=(.))(?=\\1)"))add(l.parseLong(s,2));}};

Mungkin 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


2

APL (APL) , 21 25 byte

Sekarang menangani 0 juga.

{0::0⋄2⊥¨⍵⊂⍨1,2=/⍵}2⊥⍣¯1⊢

Cobalah online!

2⊥⍣¯1⊢ konversikan ke basis-2, menggunakan bit sebanyak yang diperlukan (lit. konversi terbalik dari-basis-2)

{... } terapkan fungsi anonim berikut

0:: 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-2


1
sangat berguna di sini. Saya harus menambahkan itu ke Jelly.
Dennis

@ Dennis Waspadai dua versi 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 ⊂ ⍳7sama dengan ⎕ML←3⋄ 4 3 2 4 4 5 7 ⊂ ⍳7`
Adám

2

Japt , 7 byte

¤ò¥ mn2

Menguji


Penjelasan

¤ò¥ mn2
           :Implicit input of integer U.
¤          :Convert to binary string.
 ò¥        :Split to an array by checking for equality.
    m      :Map over array.
     n2    :Convert to base-10 integer.

1

Python 3, 115 byte

def f(s):
 s=bin(s);r=[s[2]]
 for i in s[3:]:
  if i==r[-1][-1]:r+=[i]
  else:r[-1]+=i
 return[int(x,2)for x in r]

Penjelasan

def f(s):
 s=bin(s)                   # convert input in binary
 r=[s[2]]                   # initialize the result with the first char after the 'b' in binary string
 for i in s[3:]:            # loop on other element
  if i==r[-1][-1]:          # if the last element of the last string equal the current element 
   r+=[i]                   # we add the current element in a new string
  else:
   r[-1]+=i                 # we add the current element to the last sting
 return[int(x,2)for x in r] # convert binary string in integer 

Hasil

>>> [print(i,f(i)) for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 50, 100, 1000, 10000, 12914, 371017]]
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]

solusi sebelumnya (118 byte)

def f(s):
 s=bin(s);r=s[2]
 for i in s[3:]:
  if i==r[-1]:r+='a'+i
  else:r+=i
 return[int(x,2)for x in r.split('a')]

1

Haskell, 147 , 145 byte

x%[]=[x]
x%(y:z)|or.(zipWith(==)<*>tail)$y:x=x:[]%(y:z)|1<2=(y:x)%z
b x|x<2=[x]|1<2=b(div x 2)++[mod x 2]
map(sum.zipWith((*).(2^))[0..]).([]%).b

map(sum.zipWith((*).(2^))[0..]).([]%).b adalah fungsi tanpa nama yang menghitung daftar.

Kurang bermain golf:

alternating :: Eq a => [a] -> Bool
alternating = or . (zipWith (==) <*> tail)

-- (%) is the partitioning function
(%) :: Eq a => [a] -> [a] -> [[a]]
x % [] = [x]

x % (y:z) | alternating (y : x) = x : [] % (y:z)
          | otherwise = (y : x) % z

bits :: Integral t => t -> [t]
bits x | x < 2     = [x] 
       | otherwise = bits (div x 2) ++ [mod x 2]

unBits :: Num c => [c] -> c
unBits = sum . zipWith ((*) . (2^)) [0..]

f :: Integer -> [Integer]
f = map unBits . ([]%) . bits

1

Perl, 53 byte

Termasuk +1 untuk -p

Jalankan dengan nomor di STDIN

perl -p alterbits.pl <<< 371017

alterbits.pl:

$_=sprintf"0b%b",$_;s/(.)\K(?=\1)/ 0b/g;s/\S+/$&/eeg

1

PowerShell, 103 byte

[regex]::Matches([convert]::ToString($args[0],2),"(01)+0?|(10)+1?|.").Value|%{[convert]::toint32($_,2)}

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], converts ke biner, mengumpankannya Matches, mengambil resultan .Value, menyalurkannya melalui loop |%{...}dan converts kembali ke nilai-nilai tersebut int. Keluaran dibiarkan pada pipa dan secara implisit dicetak dengan baris baru.


Untuk kredit ekstra - versi (kebanyakan) non-regex pada 126 byte

$l,$r=[char[]][convert]::ToString($args[0],2);$l+-join($r|%{(" $_",$_)[$l-bxor$_];$l=$_})-split' '|%{[convert]::toint32($_,2)}

Kami lagi mengambil input $args[0]dan convertke biner. Kami melakukan casting ulang sebagai char-array, menyimpan karakter pertama $ldan karakter lainnya $r. Kami kemudian mengirimkan $rmelalui 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 $lsama 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 -joindiedit bersama dan ditambahkan ke karakter pertama $l, lalu -splitpada spasi (yang secara teknis merupakan regex, tapi saya tidak akan menghitungnya). Kami kemudian melakukan loop yang sama dengan jawaban regex convertdan output integer.


1

Java 345 byte

package com.ji.golf;
import java.util.regex.*;
public class Decompose {
  public static String decompose(long l) {
    String o="";
    String s=Long.toBinaryString(l);
    Matcher m=Pattern.compile("(01)+(0)?|(10)+(1)?|(1)|(0)").matcher(s);
    while(m.find()){String c=s.substring(m.start(),m.end());o+=Integer.parseInt(c, 2)+" ";}
    return o;
  }
}

Uji

package com.ji.golf;
public class DecompseTest {
  public static void main(String[] args) {
    String[] inOut = new String[]{
        "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"
    };
    for (String s : inOut) {
      String[] io = s.split(",");
      String result = Decompose.decompose(Long.parseLong(io[0]));
      System.out.println("in: " + io[0] + ", reusult: [" +  result.trim() + "], validates? " + result.trim().equals(io[1].trim()));
    }
  }
}

Keluaran

in: 0, reusult: [0], validates? true
in: 1, reusult: [1], validates? true
in: 2, reusult: [2], validates? true
in: 3, reusult: [1 1], validates? true
in: 4, reusult: [2 0], validates? true
in: 5, reusult: [5], validates? true
in: 6, reusult: [1 2], validates? true
in: 7, reusult: [1 1 1], validates? true
in: 8, reusult: [2 0 0], validates? true
in: 9, reusult: [2 1], validates? true
in: 10, reusult: [10], validates? true
in: 50, reusult: [1 2 2], validates? true
in: 100, reusult: [1 2 2 0], validates? true
in: 1000, reusult: [1 1 1 1 10 0 0], validates? true
in: 10000, reusult: [2 1 1 2 0 2 0 0 0], validates? true
in: 12914, reusult: [1 2 2 1 1 2 2], validates? true
in: 371017, reusult: [5 42 10 2 1], validates? true

4
Selamat Datang di Programming Puzzles & Code Golf! Karena ini adalah kompetisi kode-golf , Anda harus membuat kode sesingkat mungkin. Berikut beberapa tips untuk bermain golf di Jawa. Anda dapat mulai dengan mendefinisikan fungsi Anda tanpa pelat packagedan class, dan menghapus spasi yang tidak perlu. Beri tahu saya jika Anda memiliki pertanyaan!
Alex A.

1

Julia, 70 57 byte

n->map(i->parse(Int,i,2),split(bin(n),r"(?<=(.))(?=\1)"))

Ini 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 npenggunaan bin(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. Hanya parsemasing-masing sebagai bilangan bulat di basis 2 menggunakan mapdan voila!


1

C, 137 129 byte

main(){unsigned long a,b=scanf("%lu",&a),c=!!a;while(a>=b*2)b*=2;while(b)b/=2,c=c*(~(a^a/2)&b|!b?!printf("%lu\n",c):2)+!!(a&b);}

Input dan output berada pada aliran standar.


Saya tidak berpikir Anda memerlukannya puts, meskipun itu tidak menyenangkan untuk digunakan, spek tidak memerlukan baris baru.
FryAmTheEggman

@FryAmTheEggman Saya lebih suka tidak menghasilkan baris terakhir yang tidak lengkap. Tetapi untuk biaya satu byte (masih pengurangan bersih) saya dapat mengubah pemisah dari ruang ke baris baru.
Fox

1

J , 16 byte

#:#.;.1~1,2=/\#:

Cobalah online!

Penjelasan

#:#.;.1~1,2=/\#:  Input: integer n
              #:  Convert from decimal to list of binary digits
          2  \    For each overlapping sublist of size 2
           =/       Reduce using equals
        1,        Prepend 1
#:                Binary digits
    ;.1~          Partition those binary digits at the 1s in the previous list
  #.                Convert each partition from a list of binary digits to decimal

1

q / kdb +, 52 byte

Larutan:

{2 sv'cut[0,(&)(~)differ a]a:(63^(*)(&)a)_a:0b vs x}

Contoh:

q){2 sv'cut[0,(&)(~)differ a]a:(63^(*)(&)a)_a:0b vs x}0
,0
q){2 sv'cut[0,(&)(~)differ a]a:(63^(*)(&)a)_a:0b vs x}1
,1
q){2 sv'cut[0,(&)(~)differ a]a:(63^(*)(&)a)_a:0b vs x}3
1 1
q){2 sv'cut[0,(&)(~)differ a]a:(63^(*)(&)a)_a:0b vs x}8
2 0 0
q){2 sv'cut[0,(&)(~)differ a]a:(63^(*)(&)a)_a:0b vs x}10000
2 1 1 2 0 2 0 0 0
q){2 sv'cut[0,(&)(~)differ a]a:(63^(*)(&)a)_a:0b vs x}12914
1 2 2 1 1 2 2
q){2 sv'cut[0,(&)(~)differ a]a:(63^(*)(&)a)_a:0b vs x}371017
5 42 10 2 1
q){2 sv'cut[0,(&)(~)differ a]a:(63^(*)(&)a)_a:0b vs x}727429805944311
10 21 2 5 1 1 1 1 1 2 1 2 5 1 85 5 1 1 1 5 1 1

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 ...

{2 sv'cut[0,where not differ a]a:(63^first where a)_a:0b vs x} / ungolfed solution
{                                                            } / lambda function
      cut[                    ]                                / cut a list at indices, cut[indices]list
                                                      0b vs x  / converts to 64bit binary representation
                                                    a:         / save as a
                                                   _           / drop 'n' elements from a
                                 (                )            / evaluate this
                                     first where a             / returns first occurance of true in list a
                                  63^                          / fill result with 63 if null (to handle input of 0)
                               a:                              / save as a, we've stripped off all the left-most 0s
                      differ a                                 / whether or not item in list a is different to previous
                  not                                          / the inversion of this result
            where                                              / these are the points where we have 00 or 11
          0,                                                   / add the first index too!
  2 sv'                                                        / 2 sv converts binary back to base-10, ' for each list

0

PHP, 147

$b=decbin($argv[1]);$a=[$t=$b[0]];$k=0;for($i=1;$i<strlen($b);$i++){$v=$b[$i];if($v==$t)$k++;$t=$v;$a[$k].=$v;}foreach($a as$c)echo bindec($c).' ';

Perlu memberi ruang ekstra pada keluaran karena tidak ada batasan. Pemberitahuan ditampilkan untuk pengkodean singkat.

Versi tidak disatukan

$n=$argv[1];
$b=decbin($n);
$l=strlen($b);
$t=$b[0];
$a=[0=>$t];$k=0;
for($i=1;$i<$l;$i++){
    $v=$b[$i];
    if($v==$t){
        $k++;
    }
    $t=$v;$a[$k].=$v;    
}
foreach($a as $c){
    echo bindec($c).' ';
}

0

Retina, 60

+`(1+)\1
$1a
a1
1
(?<=(.))(?=\1)
¶
+`1(a*)\b
a$.1$*1;
a

;
1

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.


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.