1-Bit Berturutan Bertambah

36

Diberi pola (format string atau array) Bit: [0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1]

Tugasnya adalah mengganti sejumlah 1-Bit berturut-turut dengan urutan angka naik mulai dari 1.

Memasukkan

  • Pola (dapat diterima sebagai string atau larik) Contoh:
    • Tali: 1001011010110101001
    • Array: [1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1]

Keluaran

  • Urutan angka menaik (dapat dikembalikan sebagai string atau array) Contoh:
    • Tali: 1 0 0 1 0 1 2 0 1 0 1 2 0 1 0 1 0 0 1
    • Array: [1, 0, 0, 1, 0, 1, 2, 0, 1, 0, 1, 2, 0, 1, 0, 1, 0, 0, 1]

Aturan

  • (hanya berlaku untuk string) Input tidak akan berisi spasi antara 1dan0
  • Asumsikan Input length > 0
  • (hanya berlaku untuk string) Output dipisahkan oleh spasi (gunakan pemisah lain jika Anda perlu selama bukan angka atau huruf dari alfabet)

Contoh:

Given [0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1] 
Output [0,1,2,3,0,1,2,0,0,0,1,2,3,4,5,6]

--------------------------------------------------------------------------

Given 0110101111101011011111101011111111     
Output 0 1 2 0 1 0 1 2 3 4 5 0 1 0 1 2 0 1 2 3 4 5 6 0 1 0 1 2 3 4 5 6 7 8

---------------------------------------------------------------------------

Given 11111111111101    
Output 1 2 3 4 5 6 7 8 9 10 11 12 0 1

Kriteria kemenangan: Codegolf

Luis felipe De jesus Munoz
sumber

Jawaban:

19

05AB1E , 4 byte

γ€ƶ˜

Cobalah online! atau sebagai Suit Tes

Penjelasan

γ      # split input into groups of consecutive equal elements
 €ƶ    # multiply each number in each sublist by its 1-based index in the sublist
   ˜   # flatten
Emigna
sumber
1
Oh, lebih baik dari milikku. Saya tidak akan pernah memikirkan hal ini.
Magic Gurita Guci
3
Saya tidak 100% terbiasa dengan aturan penghitungan byte codegolf (dan googling hanya menemukan posting ini yang tidak sampai pada kesimpulan). Meskipun jawaban Anda adalah 4 karakter, paling tidak harus 8 byte (mis. Utf-16-be tanpa BOM 03 B3 20 AC 01 B6 02 DC) atau 9 byte (utf-8:) CE B3 E2 82 AC C6 B6 CB 9Catau 10 byte (mis., UTF-16 termasuk BOM 2 byte) dalam penyandian selain mainan? (Ya, orang bisa membuat mainan 8-bit yang mirip dengan iso-8859 dengan 4 simbol ini diwakili sebagai 1-byte, tapi itu sepertinya curang.)
dr jimbob
6
@drjimbob Ya, pertanyaan bagus. Kode sebenarnya dapat dikonversi ke file biner menggunakan halaman kode 05AB1E . Sebagai contoh, γ€ƶ˜akan direpresentasikan sebagai 04 80 8F 98. Halaman kode utamanya ada untuk memudahkan penulisan kode. Untuk menjalankan file 4-byte ini, Anda perlu menjalankan interpreter dengan --osabieflag.
Adnan
18

Haskell , 15 byte

scanl1$(*).succ

Cobalah online!

Penjelasan / Tidak Diundang

scanl1 beralih dari kiri daftar menggunakan fungsi yang mengambil hasil terakhir dan elemen saat ini menghasilkan daftar baru dengan hasilnya, meninggalkan daftar kosong dan lajang "tidak dimodifikasi".

(*).succ adalah setara dengan \x y-> (x+1)*y

Menggunakan fungsi itu bersama-sama scanl1hanya berfungsi karena urutan meningkat ( 1,2,3, .. ) mulai dengan 1 dan keduanya tidak memiliki elemen sebelumnya (dalam hal ini elemen pertama dalam daftar yang tidak akan "dimodifikasi") atau mereka memiliki 0 terkemuka .

ბიმო
sumber
14

Sekam , 5 4 3 byte

ṁ∫g

Cobalah online!

Penjelasan

ṁ∫g  -- full function, example input: [1,1,1,0,1]
  g  -- group: [[1,1],[0],[1]]
ṁ    -- map the following and concatenate result (example with [1,1,1])
 ∫   -- | cumulative sum: [1,2,3]
     -- : [1,2,3,0,1]

Edit riwayat

-1 byte dengan menggunakan scanl1lebih darizipWith

-1 byte oleh porting Dennis 's solusi

ბიმო
sumber
12

APL (Dyalog Unicode) , 5 byte

⊥⍨¨,\

Cobalah online!

Bagaimana itu bekerja

⊥⍨¨,\
   ,\   Convert to lists of first n elements
⊥⍨¨     Map "Count trailing ones" to each list
Bubbler
sumber
Penggunaan ⊥⍨trik yang bagus.
Zacharý
11

JavaScript (ES6), 22 byte

Mengambil input sebagai array.

a=>a.map(s=n=>s=n*-~s)

Cobalah online!

Yang lebih pendek a=>a.map(n=>a=n*-~a)(20 byte) sayangnya akan gagal [1]karena paksaan array singleton ke integer yang mereka pegang.

Arnauld
sumber
10

J , 4 byte

#.~\

Sebuah port dari solusi APL Bubbler

Cobalah online!

J , 8 byte

i.&0@|.\

Bagaimana?

Hanya jarak ke pendahulunya 0

       \  for each prefix
     |.   reverse it
    @     and
i.&0      find the index of the first 0

Cobalah online!

Galen Ivanov
sumber
8

Python 2 , 39 38 byte

-1 byte terima kasih kepada Erik the Outgolfer

i=1
for x in input():i*=x;print i;i+=1

Cobalah online!

tongkat
sumber
1
Saya tidak berpikir Anda membutuhkannya ,.
Erik the Outgolfer
@EriktheOutgolfer sepertinya lebih cantik dengan cara ini c:
Rod
1
Maaf, tetapi terkadang, dalam hidup, Anda harus berkorban.
Erik the Outgolfer
9
RIP ,Anda tidak berada dalam kode lagi, tetapi Anda akan berada di hati saya selamanya
Rod
6

Jelly , 4 byte

‘×¥\

Cobalah online!

‘×¥\
   \   Accumulate the input with:
  ¥   The dyad
‘      Increment the left element
 ×    Multiply by the second element (1 or 0)
       The result always begins with the first element unchanged
dylnan
sumber
6

K (oK) , 11 8 byte

Larutan:

{y*1+x}\

Cobalah online!

Penjelasan:

Iterate atas daftar. Akumulator kenaikan, kalikan dengan item saat ini (yang me-reset akumulator jika item adalah 0):

{y*1+x}\ / the solution
{     }\ / iterate (\) over lambda function
     x   / accumulator
   1+    / add 1
 y*      / multiply by current item
streetster
sumber
5

Jelly , 4 byte

ŒgÄF

Cobalah online!

Bagaimana itu bekerja

ŒgÄF  Main link. Argument: A (bit array)

Œg    Group adjacent, identical bits.
  Ä   Accumulate; take the cumulative sum of each chunk.
   F  Flatten.
Dennis
sumber
Dengan berjalannya grup dengan cepat, Erik menyarankan ini akan menjadi tiga byte! (Jika saya mengerti apa yang akan dilakukan dengan benar)
dylnan
@ Dylnan Masalahnya adalah sulit untuk memutuskan perilaku yang cepat. :( Itu sebabnya quick masih dalam hiatus.
Erik the Outgolfer
Mungkin ada beberapa quicks untuk kemungkinan implementasi utama
dylnan
5

R , 46 31 byte

function(a)sequence(rle(a)$l)*a

Cobalah online!

sequence, yang "terutama ada dalam penghormatan terhadap sejarah awal R" , cukup berguna di sini.

function(a)                       # function, taking a vector as argument
                    rle(a)$l      # take the lengths of the run-length encoding
           sequence(        )     # and generate the list [1:x for x in lengths]
                             *a   # multiply by a to maintain 0s, and return
Giuseppe
sumber
5

RAD, 8 byte

(⊢×1+⊣)⍂

Cobalah online!

Bagaimana?

  • (⊢×1+⊣), jika argumen yang benar adalah 0, kembali 0, jika tidak, tambahkan argumen kiri
  • , LTR Scan ( (A f B) f Cbukan A f (B f C)), terapkan ini melintasi array
Zacharý
sumber
4

Japt, 7 6 5 byte

åÏ*°X

Cobalah


Penjelasan

åÏ        :Cumulatively reduce
   °X     :  Increment the current total (initially 0)
  *       :  Multiply by the current element
Shaggy
sumber
4

Java 8, 55 48 byte

a->{int p=0,i=0;for(int v:a)a[i++]=v<1?p=0:++p;}

Memodifikasi array input alih-alih mengembalikan yang baru untuk menghemat byte.

-7 byte terima kasih kepada @TimSeguine .

Cobalah online.

Penjelasan:

a->{             // Method with integer-array parameter and no return-type
  int p=0,       //  Previous integer, starting at 0
      i=0;       //  Index-integer, starting at 0
  for(int v:a)   //  Loop over the values of the input-array:
    a[i++]=v<1?  //   If the current value is 0:
          p=0    //    Reset the previous integer to 0
         :       //   Else:
          ++p;}  //    Increase `p` by 1 first with `++p`
                 //    and set the current item to this new value of `p`
Kevin Cruijssen
sumber
1
Anda dapat mencukurnya hingga 48:a->{int p=0,i=0;for(int b:a)a[i++]=b<1?p=0:++p;}
Tim Seguine
@TimSeguine Terima kasih! Sekarang saya melihatnya, saya tidak percaya saya tidak memikirkannya sendiri.
Kevin Cruijssen
1
Saya bisa menyingkirkan p, tapi itu ukuran yang sama :(a->{int i=0;for(int v:a)a[i]+=v*i++<1?0:a[i-2];}
Tim Seguine
4

TIS , 68 + 33 = 101 byte

Kode (68 byte):

@0
MOV UP ACC
SUB 47
MOV ACC ANY
@1
ADD 1
JRO UP
SUB ACC
MOV ACC ANY

Tata Letak (33 byte):

2 1 CC I0 ASCII - O0 NUMERIC - 32

Cobalah online!

Penjelasan:

|    Input 0    |    Input is given in ASCII (`0` is 48, `1` is 49)
+--------+------+
| Node 0 |      |    This node prepares the input data
+--------+      |
| MOV UP ACC    |    Read in a character
| SUB 47        |    Subtract 47 to map [48, 49] to [1, 2]
| MOV ACC ANY   |    Send the 1 or 2 to the next node
|               |    Implicitly wrap back to top of node
+--------+------+
| Node 1 |      |    This node does the incrementing/printing
+--------+      |
| ADD 1         |    Increment counter (starts at zero)
| JRO UP        |    Get value from above, and jump forward that many lines  (skip next line or not)
| SUB ACC       |    Reset counter to zero (if input was zero)
| MOV ACC ANY   |    Send the counter value downward to be printed
|               |    Implicitly wrap back to top of node
+---------------+
|   Output 0    |    Output is space-delimited numeric values
Phlarx
sumber
4

Gaia , 5 byte

ẋ+⊣¦_

Cobalah online!

Penjelasan

ẋ+⊣¦_     Full program
ẋ         Split into chunks of equal adjacent values.
   ¦_     And for each chunk, flattening the result afterwards...
 +⊣       Reduce it cumulatively on + (addition); aka cumulative sums

Ugh, saya pikir font kode SE adalah monospace ....

Tuan Xcoder
sumber
Mereka adalah monospace ... Ada ruang yang hilang di baris pertama.
micsthepick
Lihatlah hasil edit. Itu masih tidak selaras.
Tn. Xcoder
Anda harus melihat dari perangkat seluler atau sesuatu - Kelihatannya baik bagi saya
micsthepick
@ micsthepick aku bukan ...
Tn. Xcoder
4

C (gcc) , 45 44 38 byte

f(a,i)int*a;{while(--i)*++a*=-~a[-1];}

Cobalah online!

Simpan satu byte berkat Toby Speight!

Hemat 6 byte dengan menggunakan * = dan kondisi saat lebih pintar.

Matej Mulej
sumber
Anda dapat menyimpan 1 byte: *(a-1)a[-1]
Toby Speight
Selamat datang di PPCG! :)
Shaggy
4

Perl 6 , 29 24 18 byte

-6 byte terima kasih kepada Sean!

*.map:{($+=1)*=$_}

Cobalah online!

Fungsi dalam bisa lewat ($+=1)*=*, tetapi variabel anonim akan tetap ada di seluruh panggilan fungsi. Kami mendapatkannya dengan membungkusnya dalam blok kode eksplisit.

Penjelasan:

*.map:               # Map the array to
      {($+=1)    }   # The anonymous variable incremented
             *=$_    # Multiplied by the element
Jo King
sumber
Aku punya pendekatan bawah dasar yang sama untuk 16 byte: *.map(($+=1)*=*). Solusi ini memiliki ketentuan bahwa variabel status $tetap ada di seluruh panggilan ke fungsi, jadi jika elemen terakhir yang diteruskan ke satu panggilan dan elemen pertama yang diteruskan ke panggilan berikutnya sama-sama tidak nol, maka penghitungan akan dimulai dengan nomor yang salah.
Sean
@Sean, Ya saya ingat berjuang dengan itu ketika saya awalnya menjawab. Untungnya saya sudah belajar cara mengatasinya sejak saat itu
Jo King
Anda dapat mengetuk satu lagi byte off: *.map:{...}.
Sean
3

Pyth , 6 byte

m=Z*hZ

Coba di sini!

Bagaimana itu bekerja

m = Z * hZ - Program lengkap. Q = input yang dievaluasi.
m - Untuk setiap bilangan bulat d di Q.
 = Z - Tetapkan variabel Z (diinisialisasi ke 0) ke ...
   * hZ - (Z +1) * d; (d tersirat pada akhirnya).
Tuan Xcoder
sumber
3

Ingin mendapatkan jawaban dalam menggunakan ekspresi reguler. Mungkin ada solusi yang lebih mudah yang saya tinggalkan sebagai latihan untuk pembaca.

Core PowerShell , 86 byte

Filter F{($_-split"(0)(\B|\b)"|?{$_-ne''}|%{$_-replace'(1+)',(1..$_.Length)})-join' '}

Cobalah online!

Jeff Freeman
sumber
3

QBasic, 60 byte

INPUT s$
FOR i=1TO LEN(s$)
b=MID$(s$,i)>="1
v=-b*v-b
?v
NEXT

Mengambil input sebagai string; memberikan output sebagai angka yang dipisahkan oleh baris baru.

Penjelasan

Kami membaca string s$dan loop idari 1panjangnya.

MID$(s$,i)mendapatkan substring dari karakter i(1-diindeks) ke akhir string. Jika ini dimulai dengan a 1, itu akan menjadi >=string leksikografis "1"; jika dimulai dengan 0, itu tidak akan. Jadi bdidapat 0jika karakter pada indeks iadalah 0, atau -1jika karakter 1.

Selanjutnya, kami memperbarui nilai saat ini v. Jika kita hanya membaca a 0, kita ingin vmenjadi 0; jika tidak, kami ingin menambah vsatu. Dengan kata lain, v = (-b) * (v+1); menyederhanakan matematika memberikan ekspresi lebih pendek yang terlihat dalam kode. Akhirnya, kami mencetak vdan mengulang.

DLosc
sumber
3

Brain-Flak , 60 byte

([]){{}<>(())<>{{}<>({}({}))(<>)}{}([])}{}<>{({}[()]<>)<>}<>

Cobalah online!

Penjelasan:

([]){  For each element in the input
    {}
    <>(())<>  Push a one to the other stack
    { If the element is one,
       {}<>({}({}))(<>)  Add the one to a copy of the previous number in the series
    }{}  Pop the element
([])}  End loop
{}<>   Pop extra zero
{({}[()]<>)<>}<>   And reverse the output stack, subtracting one from each element
Jo King
sumber
3

C (gcc), 57 52 51 byte

f(a,l,c,i)int*a;{for(c=i=0;i<l;)a[i++]=c=a[i]*-~c;}

Port of JavaScript jawaban Arnauld , memodifikasi array di tempat. Cobalah online di sini .

Ketidakseimbangan
sumber
Bukankah lebih tepat mengatakan ini adalah K&R C?
Tim Seguine
Mungkin saja, tapi itu benar dari banyak jawaban. Saya bukan ahli, tapi sangat mungkin itu bahkan tidak valid K&R C. Masalahnya, kami tidak terlalu peduli dengan standar bahasa di situs ini. Jika gcc memungkinkan Anda untuk mencampur K&R C dengan barang-barang yang lebih modern, maka itu berlaku C untuk tujuan bermain golf karena gcc akan mengompilasinya. Lihat juga: codegolf.stackexchange.com/questions/2203/tips-for-golfing-in-c
OOBalance
Saya tidak menyadari sampai mencari sekarang bahwa C11 masih mendukung sintaks fungsi daftar pengenal lama, jadi nevermind. Tapi poin Anda tetap berlaku.
Tim Seguine
1
Sarankanf(a,l,c)int*a;{for(c=0;l--;)c=*a++*=c+1;}
3

Shakespeare, 365 byte

I.Ajax,.Ford,.Act I:.Scene I:.[enter Ajax and Ford]Ajax:Open mind!Scene V:.Ford:Am I nicer than the sum of a big red old cute hard cat a big red old cute joy?Ford:If so,you is the sum of thyself a son!Ford:If not,you is zero!Ford:Open heart!Ajax:you is a big red old cute hard cat.Ajax:Speak mind!Ajax:Open mind!Ford:Am I nicer than zero?Ajax:If so, let us Scene V.

coba di sini

versi kurang golf

I.Ajax,.Ford,.
Act I:.
Scene I:.
[enter Ajax and Ford]
Ajax:Open mind!
Scene V:.
Ford:Am I nicer than the sum of a big red old cute hard cat a big red old cute joy?     <- smallest way to 48 (ascii "0") I could think of
Ford:If so,you is the sum of thyself a son!
Ford:If not,you is zero!
Ford:Open heart!
Ajax:you is a big red old cute hard cat.    <- get value of 32 or space
Ajax:Speak mind!                            <- then output it
Ajax:Open mind!
Ford:Am I nicer than zero?
Ajax:If so, let us Scene V.                 <- loop through inputs
Al R
sumber
280 byte . Lihat halaman tips SPL untuk tips golf.
Jo King
3

C ++, 47 byte

[](int*a,int*b){for(int c=0;a!=b;)c=*a++*=1+c;}

Sebuah lambda yang memodifikasi array di tempat, diberikan petunjuk awal dan akhir.


Cobalah online! (membutuhkan Javascript)


Versi generik pada 55 byte (ini berfungsi untuk wadah apa pun dengan elemen tipe aritmatika):

[](auto a,auto b){for(auto c=*a-*a;a!=b;)c=*a++*=1+c;};
Toby Speight
sumber