Liên tiếp 1-Bits được tăng


36

Cho một mẫu (định dạng chuỗi hoặc mảng) của Bits: [0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1]

Các tác vụ là thay thế bất kỳ số lượng 1-bit liên tiếp nào bằng một chuỗi số tăng dần bắt đầu từ 1.

Đầu vào

  • Mẫu (có thể được nhận dưới dạng chuỗi hoặc mảng) Ví dụ:
    • Chuỗi: 1001011010110101001
    • Mảng: [1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1]

Đầu ra

  • Chuỗi số tăng dần (có thể được trả về dưới dạng chuỗi hoặc mảng) Ví dụ:
    • Chuỗi: 1 0 0 1 0 1 2 0 1 0 1 2 0 1 0 1 0 0 1
    • Mảng: [1, 0, 0, 1, 0, 1, 2, 0, 1, 0, 1, 2, 0, 1, 0, 1, 0, 0, 1]

Quy tắc

  • (chỉ áp dụng cho chuỗi) Đầu vào sẽ không chứa khoảng trắng giữa 10
  • Giả sử đầu vào length > 0
  • (chỉ áp dụng cho chuỗi) Đầu ra được phân tách bằng dấu cách (sử dụng bất kỳ dấu phân cách nào khác nếu bạn cần miễn là không phải là số hoặc chữ cái trong bảng chữ cái)

Thí dụ:

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

Tiêu chí chiến thắng: Codegolf

Câu trả lời:


19

05AB1E , 4 byte

γ€ƶ˜

Hãy thử trực tuyến! hoặc như một bộ đồ thử nghiệm

Giải trình

γ      # split input into groups of consecutive equal elements
 €ƶ    # multiply each number in each sublist by its 1-based index in the sublist
   ˜   # flatten

1
Oof, tốt hơn của tôi. Tôi sẽ không bao giờ nghĩ về điều này.
Bạch tuộc ma thuật Urn

3
Tôi không quen thuộc 100% với các quy tắc đếm byte của codegolf (và googling chỉ tìm thấy bài đăng này mà không đưa ra kết luận). Mặc dù câu trả lời của bạn là 4 ký tự, nhưng ít nhất phải là 8 byte (ví dụ: utf-16-be không có BOM 03 B3 20 AC 01 B6 02 DC) hoặc 9 byte (utf-8 CE B3 E2 82 AC C6 B6 CB 9C:) hoặc 10 byte (ví dụ: UTF-16 bao gồm BOM 2 byte) trong bất kỳ mã hóa phi đồ chơi? (Có, người ta có thể xây dựng một đồ chơi mã hóa 8 bit tương tự như mã hóa iso-8859 với 4 ký hiệu này được biểu thị là 1 byte, nhưng điều đó có vẻ giống như gian lận.)
dr jimbob

6
@drjimbob Vâng, câu hỏi hay. Mã thực sự có thể được chuyển đổi thành tệp nhị phân bằng trang mã 05AB1E . Ví dụ, γ€ƶ˜sẽ được đại diện là 04 80 8F 98. Trang mã chủ yếu tồn tại để làm cho mã viết dễ dàng hơn. Để chạy tệp 4 byte này, bạn sẽ cần chạy trình thông dịch với --osabiecờ.
Ad Nam

18

Haskell , 15 byte

scanl1$(*).succ

Hãy thử trực tuyến!

Giải thích / Ungolfed

scanl1 lặp lại từ bên trái một danh sách bằng cách sử dụng hàm lấy kết quả cuối cùng và phần tử hiện tại tạo ra một danh sách mới với kết quả, để lại danh sách trống và singletons "không thay đổi".

(*).succ tương đương với \x y-> (x+1)*y

Sử dụng chức năng đó cùng với scanl1chỉ hoạt động vì các chuỗi tăng dần ( 1,2,3, .. ) bắt đầu bằng 1 và không có phần tử nào trước đó (trong trường hợp đó là phần tử đầu tiên trong danh sách sẽ không được "sửa đổi") hoặc họ có 0 hàng đầu .



14

Husk , 5 4 3 byte

ṁ∫g

Hãy thử trực tuyến!

Giải trình

ṁ∫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]

Chỉnh sửa lịch sử

-1 byte bằng cách sử dụng scanl1hơnzipWith

-1 byte bằng cách chuyển giải pháp của Dennis



11

JavaScript (ES6), 22 byte

Đưa đầu vào như một mảng.

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

Hãy thử trực tuyến!

Không may a=>a.map(n=>a=n*-~a)(20 byte) ngắn hơn sẽ không thành công [1]do ép buộc các mảng đơn lẻ với số nguyên mà chúng đang giữ.




6

Thạch , 4 byte

‘×¥\

Hãy thử trực tuyến!

‘×¥\
   \   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

Dung dịch:

{y*1+x}\

Hãy thử trực tuyến!

Giải trình:

Lặp lại danh sách. Bộ tích lũy tăng dần, nhân với mục hiện tại (sẽ đặt lại bộ tích lũy nếu mục bằng 0):

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

5

Thạch , 4 byte

ŒgÄF

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Œg    Group adjacent, identical bits.
  Ä   Accumulate; take the cumulative sum of each chunk.
   F  Flatten.

Với nhóm chạy nhanh, Erik đã gợi ý rằng đây sẽ là ba byte! (Nếu tôi hiểu những gì nó sẽ làm chính xác)
dylnan

@dylnan Vấn đề là thật khó để quyết định một hành vi nhanh như vậy. :( Đó là lý do tại sao sự nhanh chóng vẫn bị gián đoạn.
Erik the Outgolfer

Có thể có nhiều cách nhanh chóng để triển khai chính có thể
dylnan


5

RAD, 8 byte

(⊢×1+⊣)⍂

Hãy thử trực tuyến!

Làm sao?

  • (⊢×1+⊣), nếu đối số bên phải là 0, trả về 0, nếu không thì tăng đối số bên trái
  • , LTR Scan ( (A f B) f Cthay vì A f (B f C)), áp dụng điều này trên toàn mảng

4

Japt, 7 6 5 byte

åÏ*°X

Thử nó


Giải trình

åÏ        :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;}

Sửa đổi mảng đầu vào thay vì trả về một mảng mới để lưu byte.

-7 byte nhờ @TimSeguine .

Hãy thử trực tuyến.

Giải trình:

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
Bạn có thể cạo nó xuống 48:a->{int p=0,i=0;for(int b:a)a[i++]=b<1?p=0:++p;}
Tim Seguine

@TimSeguine Cảm ơn! Bây giờ tôi nhìn thấy nó, tôi không thể tin rằng tôi đã không nghĩ về nó.
Kevin Cruijssen

1
Tôi đã có thể thoát khỏi p, nhưng nó có cùng kích thước :(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

Mã (68 byte):

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

Bố cục (33 byte):

2 1 CC I0 ASCII - O0 NUMERIC - 32

Hãy thử trực tuyến!

Giải trình:

|    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

ẋ+⊣¦_

Hãy thử trực tuyến!

Giải trình

ẋ+⊣¦_     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, tôi nghĩ phông chữ SE là không gian ....


Chúng là không gian vũ trụ ... Có một khoảng trống bị thiếu trên dòng đầu tiên.
micsthepick

Nhìn vào bản chỉnh sửa. Nó vẫn bị sai lệch.
Ông Xcoder

Bạn phải tìm kiếm từ một thiết bị di động hoặc một cái gì đó - Nó trông ổn đối với tôi
micsthepick



4

Perl 6 , 29 24 18 byte

-6 byte nhờ Sean!

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

Hãy thử trực tuyến!

Các chức năng bên trong có thể bởi ($+=1)*=* , nhưng sau đó biến ẩn danh sẽ tồn tại trên các lệnh gọi hàm. Chúng tôi có được điều này bằng cách gói nó trong một khối mã rõ ràng.

Giải trình:

*.map:               # Map the array to
      {($+=1)    }   # The anonymous variable incremented
             *=$_    # Multiplied by the element

Tôi có cách tiếp cận cơ bản tương tự xuống 16 byte : *.map(($+=1)*=*). Giải pháp này có một điều kiện là biến trạng thái $vẫn tồn tại trong các lệnh gọi đến hàm, vì vậy nếu phần tử cuối cùng được chuyển cho một cuộc gọi và phần tử đầu tiên được chuyển sang cuộc gọi tiếp theo đều là số khác, thì việc đếm sẽ bắt đầu bằng số sai.
Sean

@Sean, Yeah tôi nhớ đấu tranh với điều đó khi tôi trả lời ban đầu. May mắn thay, tôi đã học được một cách xung quanh đó kể từ đó
Jo King

Bạn có thể loại bỏ thêm một byte nữa : *.map:{...}.
Sean



3

Bình thường , 6 byte

m=Z*hZ

Hãy thử nó ở đây!

Làm thế nào nó hoạt động

m = Z * hZ - Chương trình đầy đủ. Q = đầu vào được đánh giá.
m - Với mỗi số nguyên d trong Q.
 = Z - Gán biến Z (preinitialised thành 0) cho ...
   * hZ - (Z + 1) * d; (d là ẩn ở cuối).

3

Muốn có được một câu trả lời trong việc sử dụng các biểu thức thông thường. Có lẽ có một giải pháp dễ dàng hơn mà tôi để lại như một bài tập cho người đọc.

Lõi PowerShell , 86 byte

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

Hãy thử trực tuyến!



3

QBasic, 60 byte

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

Lấy đầu vào là một chuỗi; đưa ra đầu ra dưới dạng số được phân tách bằng dòng mới.

Giải trình

Chúng tôi đọc chuỗi s$và vòng lặp itừ 1chiều dài của nó.

MID$(s$,i)lấy chuỗi con từ ký tự i(1-index) đến cuối chuỗi. Nếu điều này bắt đầu bằng a 1, nó sẽ là từ vựng >=theo chuỗi "1"; nếu nó bắt đầu bằng a 0, nó sẽ không như vậy. Vì vậy, bnhận được 0nếu nhân vật tại chỉ mục i0, hoặc -1nếu nhân vật là1 .

Tiếp theo, chúng tôi cập nhật giá trị hiện tại v. Nếu chúng ta chỉ đọc một 0, chúng ta muốn vtrở thành 0; mặt khác, chúng tôi muốn tăng thêm vmột. Nói cách khác , v = (-b) * (v+1); đơn giản hóa toán học cho biểu thức ngắn hơn được thấy trong mã. Cuối cùng, chúng tôi in vvà lặp.


3

Brain-Flak , 60 byte

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

Hãy thử trực tuyến!

Giải trình:

([]){  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;}

Câu trả lời JavaScript của Port of Arnauld , sửa đổi mảng tại chỗ. Hãy thử trực tuyến tại đây .


Sẽ không chính xác hơn nếu nói đây là K & R C?
Tim Seguine

Có thể, nhưng điều đó sẽ đúng với rất nhiều câu trả lời. Tôi không phải là chuyên gia, nhưng hoàn toàn có thể nó thậm chí không hợp lệ K & R C. Vấn đề là, chúng tôi không thực sự quan tâm đến các tiêu chuẩn ngôn ngữ trên trang web này. Nếu gcc cho phép bạn kết hợp K & R C với những thứ hiện đại hơn, thì C hợp lệ cho mục đích chơi gôn vì gcc sẽ biên dịch nó. Xem thêm: codegolf.stackexchange.com/questions/2203/tips-for-golfing-in-c
OOBalance

Tôi đã không nhận ra cho đến khi tìm kiếm ngay bây giờ rằng C11 vẫn hỗ trợ cú pháp hàm danh sách định danh cũ, vì vậy đừng bận tâm. Nhưng quan điểm của bạn giữ bất kể.
Tim Seguine

1
Đề xuấtf(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.

thử nó ở đây

phiên bản ít chơi gôn

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 . Kiểm tra trang mẹo SPL để biết mẹo chơi gôn.
Jo King

3

C ++, 47 byte

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

Một lambda sửa đổi một mảng tại chỗ, con trỏ bắt đầu và kết thúc.


Hãy thử trực tuyến! (yêu cầu Javascript)


Phiên bản chung ở 55 byte (điều này hoạt động cho bất kỳ vùng chứa nào có các yếu tố thuộc loại số học):

[](auto a,auto b){for(auto c=*a-*a;a!=b;)c=*a++*=1+c;};
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.