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

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

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 .



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



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.



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!


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

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

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.

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

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

4

Japt, 7 6 5 byte

åÏ*°X

Cobalah


Penjelasan

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

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`

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

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


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

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

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

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!



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.


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


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 .


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

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