Chunk + liệt kê một danh sách các chữ số


11

Tôi có một danh sách các chữ số thập phân:

4, 4, 4, 7, 7, 9, 9, 9, 9, 2, 2, 2, 4, 4

Danh sách các chữ số thập phân được gọi là các mục. Chúng ta có thể tạo thành "khối" từ các mục này bằng cách nhóm các số giống nhau và liền kề nhau. Tôi muốn gán cho mỗi khối một số duy nhất, bắt đầu từ 1 và tăng 1 theo thứ tự các khối xuất hiện trong danh sách ban đầu. Vì vậy, đầu ra cho ví dụ đã cho sẽ như thế này:

1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5

định dạng đầu vào

Một danh sách các chữ số. (0-9) Bạn có thể sử dụng ngôn ngữ tích hợp để đọc danh sách này theo cách bạn muốn. Mã hóa: ASCII

Định dạng đầu ra

Một dãy số thập phân, được phân tách bằng dấu phân cách. Chương trình của bạn phải luôn luôn sử dụng cùng một dấu phân cách. Dấu phân cách phải dài hơn 0 bit. Mã hóa: ASCII

Tiêu chuẩn áp dụng.


8
Bất kỳ lý do cụ thể cho các định dạng đầu vào và đầu ra nghiêm ngặt?
Chuỗi không liên quan

2
@UnrelatedString Hmm, tôi sẽ nới lỏng chúng.
noɥʇʎԀʎzɐɹƆ

8
IO vẫn còn khá nghiêm ngặt. Bạn không thể chỉ nói "đầu vào và đầu ra là một danh sách" và để mặc định trang web chăm sóc nó cho bạn chứ?
Jo King

2
Chúng ta có thể giả sử danh sách là không trống?
Jo King

1
Một danh sách theo định nghĩa đã có dấu phân cách. Đó là lý do tại sao nó là một danh sách. Tôi cũng không hiểu ý của bạn là gì You may use your language built-ins to read this list however you want.. Điều đó có nghĩa là chúng tôi phải bao gồm một chuỗi để liệt kê trình chuyển đổi trong trình của chúng tôi? Và được chúng tôi cho phép đầu ra như một danh sách?
Jo King

Câu trả lời:


7

Python 3,8 (tiền phát hành) , 41 byte

lambda l,n=0:[n:=n+(l!=(l:=x))for x in l]

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

Ca ngợi những con hải mã ma thuật :=của các biểu thức chuyển nhượng.


Python 2 , 42 byte

n=0
for x in input():n+=x!=id;id=x;print n

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


Hmm, điều này sẽ kéo dài bao lâu ở Pyth?
noɥʇʎԀʎzɐɹƆ

Huh, tôi đã tránh idvì nó dài 2 byte ...
Erik the Outgolfer 14/08/19

Ý tưởng tuyệt vời củaid
U10-Forward

@ noɥʇʎԀʎzɐɹƆ 8 byte cho bản dịch đơn giản: Hãy thử trực tuyến!
isaacg



3

Thạch , 6 5 byte

ŒɠµJx

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

Đã lưu một byte nhờ UnrelatedString !

Đầu vào và đầu ra dưới dạng mảng (với dấu ngoặc mở / đóng)

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

ŒɠµJx - Main link, takes one argument:                       [7, 7, 5, 5, 5, 1]
Œɠ    - Get the lengths of consecutive elements:             [2, 3, 1]
  µ   - Call these lengths A
   J  - range(length(A))                                     [1, 2, 3]
    x - Repeat each element by the corresponding value in A: [1, 1, 2, 2, 2, 3]


1
@UnrelatedString tất cả các nguyên tử có răng cưa mới này!
caird coinheringaahing




2

Perl 6 , 21 byte

{+<<[\+] $,|$_ Zne$_}

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

Khối mã ẩn danh nhận danh sách và trả về danh sách. Điều này hoạt động bằng cách so sánh xem mỗi cặp phần tử liền kề không bằng nhau, hơn là lấy tổng tích lũy của danh sách.




2

MATL , 8 byte

Y'wn:wY"

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

Giải trình:

    Y'      % run-length encoding
    w       % swap elements in stack
    n       % number of elements in array / size along each dimension
    :       % range; vector of equally spaced values
    w       % swap elements in stack
    Y"      % replicate elements of array
            % (implicit) convert to string and display

2

Thạch , 4 byte

ŒgƤẈ

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

Làm sao?

ŒgƤẈ - Link: list of integers  e.g. [7,7,2,7,7]
  Ƥ  - for prefixes:     [7]   [7,7]   [7,7,2]      [7,7,2,7]        [7,7,2,7,7]
Œg   -   group runs      [[7]] [[7,7]] [[7,7],[2]]  [[7,7],[2],[7]]  [[7,7],[2],[7,7]]
   Ẉ - length of each    [1,   1,      2,           3,               3]




1

Perl 5 , 27 byte

s/\d/$i+=$&!=$p;$p=$&;$i/ge

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

Tùy chọn dòng lệnh -plàm cho perl đọc dòng đầu vào từ STDIN vào "biến mặc định" $_. Sau đó, nó tìm kiếm - thay thế tất cả các chữ số trong $_bộ đếm $i. Và $iđược tăng cho mỗi chữ số khác với chữ số trước đó, nó cũng ở chữ số đầu tiên để bộ đếm bắt đầu 1. Các chữ số trước được lưu trữ trong $p.


1

Bình thường , 13 11 byte

s.e*]hkhbr8

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

         r8  # Run-length encode (implicit argument is the input) (-> [[frequency, char], ...]
 .e          # Enumerated map (current element is b, index is k) over rQ8
   *]hk      # [ k+1 ] *
       hb    #           b[0]
s            # Reduce list on + ([a]+[b] = [a,b])

-2 byte nhờ ông Xcoder


hMsM._+0nVtcho -2 byte.
Ông Xcoder

Hoặc nếu bạn muốn giữ cách tiếp cận của mình, rQ8cũng giống như r8.ncó thể sdành cho -2
Ông Xcoder

Thật tuyệt, các tài liệu đã không đề cập đến những chức năng nào ẩn ýQ
ar4093

1

Scala , 75 byte

s=>s.scanLeft(("",0))((x,y)=>(y,x._2+(if(x._1!=y)1 else 0))).tail.map(_._2)

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

Nếu đầu vào và đầu ra phải được phân tách bằng dấu phẩy Chuỗi (và không phải Danh sách) thì 102 byte.

s=>s.split(", ").scanLeft(("",0))((x,y)=>(y,x._2+(if(x._1!=y)1 else 0))).tail.map(_._2).mkString(", ")

1

Thạch , 5 byte

nƝÄŻ‘

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

Ban đầu, tôi nhắm đến 4 -terter (cùng một chương trình nhưng không có Ż) nhưng sau đó nhanh chóng nhận ra rằng 1 phải được chuẩn bị trước mỗi lần do bị giám sát ... Mặc dù có một 5 -terter khác trong Jelly, tôi sẽ thực sự giữ điều này bởi vì nó sử dụng một phương pháp khác

Đối với mỗi cặp mục lân cận của danh sách đầu vào L, kiểm tra nếu LTôiLTôi+1,1Tôi<|L|và lưu các kết quả này trong một danh sách. Sau đó lấy tổng số tích lũy của danh sách này và tăng chúng lên 1 để phù hợp với hệ thống lập chỉ mục khối. TL; DR. Bất cứ khi nào chúng tôi gặp các mục lân cận khác nhau, chúng tôi sẽ tăng chỉ số chunk lên 1 .



1

JavaScript (ES6), 30 byte

Đưa đầu vào như một mảng các số nguyên.

a=>a.map(p=n=>i+=p!=(p=n),i=0)

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

Đã bình luận

a =>                // a[] = input array
  a.map(p =         // initialize p to a non-numeric value
  n =>              // for each value n in a[]:
    i +=            //   increment i if:
      p != (p = n), //     p is not equal to n; and update p to n
    i = 0           //   start with i = 0 (chunk counter)
  )                 // end of map()

1

PHP , 52 byte

while(''<$d=$argv[++$x])echo$i+=$argv[$x-1]!=$d,' ';

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

Nhập qua dòng lệnh, đầu ra STDOUT.

Thx đến @ Night2 cho '0' == 0lỗi so sánh pesky !


@ Night2 bắt tốt! Cập nhật và sửa lỗi. Cám ơn!
640KB



0

Thêm ++ , 23 byte

D,f,@*,BGd€bL$bLRz€¦XBF

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

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

D,f,@*,     - Define a function, f, that takes one argument:  [7 7 5 5 5 1]
       BG   - Group neighbouring elements together:           [[[7 7] [5 5 5] [1]]]          
       d    - Duplicate:                                      [[[7 7] [5 5 5] [1]] [[7 7] [5 5 5] [1]]]
       €bL  - Get the length of each:                         [[[7 7] [5 5 5] [1]] [2 3 1]]
       $bLR - Length, then range of length:                   [[2 3 1] [1 2 3]]
       z    - Zip together:                                   [[2 1] [3 2] [1 3]]
       €¦X  - Reduce each by repetition:                      [[1 1] [2 2 2] [3]]
       BF   - Flatten:                                        [1 1 2 2 2 3]
            - Due to the * in the function definition,
                 return the whole stack:                      [1 1 2 2 2 3]


0

Võng mạc 0.8.2 , 34 byte

\b\d+\b(?<=(\b(\3|(\d+))\D*)*)
$#3

Hãy thử trực tuyến! Giải trình:

\b\d+\b

Ghép từng số lần lượt.

(?<=(...)*)

Bắt đầu nhìn về phía sau để có càng nhiều trận đấu càng tốt. (Các mục tiếp theo sẽ theo thứ tự từ phải sang trái vì đó là cách hoạt động của lookbehind.)

\D*

Bỏ qua các dải phân cách.

(\3|(\d+))

Cố gắng khớp số tương tự như lần trước, nhưng không thành công, chỉ khớp bất kỳ số nào, nhưng hãy nhớ rằng chúng ta phải khớp với một số mới.

\b

Đảm bảo toàn bộ số được khớp.

$#3

Đếm số lượng số mới.


0

Stax , 10 byte

▓ª2ªmD?Ä╧╖

Chạy và gỡ lỗi nó

Đầu ra sử dụng không gian như một dấu phân cách. Đầu vào tuân theo các thông số kỹ thuật chính xác bằng cách sử dụng dấu phẩy làm dấu phân cách và hiện bao quanh dấu ngoặc.


0

C (gcc) , 62 61 byte

Đây là một trong số ít mục tôi đã thực hiện khi một chương trình hoàn chỉnh ngắn hơn chức năng gửi!

Ở lượt đi đầu tiên, tôi không quan tâm đến giá trị trước đó, vì vậy tôi dựa vào thực tế đó argvlà một con trỏ đến một nơi nào đó và cực kỳ khó có thể nằm trong khoảng [0..9]!

s;main(i,j){for(;~scanf("%d,",&i);j=i)printf("%d ",s+=j!=i);}

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



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.