Potongan + Menghitung daftar digit

12

Saya memiliki daftar angka desimal:

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

Daftar angka desimal dikenal sebagai item. Kami dapat membentuk "potongan" dari item-item ini dengan mengelompokkan angka-angka yang identik dan berdekatan. Saya ingin memberi setiap potongan nomor unik, mulai dari 1, dan bertambah 1 dalam urutan potongan muncul dalam daftar asli. Jadi, output untuk contoh yang diberikan akan terlihat seperti ini:

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

Masukkan format

Daftar digit. (0-9) Anda dapat menggunakan bahasa bawaan untuk membaca daftar ini sesuka Anda. Pengkodean: ASCII

Format output

Serangkaian angka desimal, dipisahkan oleh pembatas. Program Anda harus selalu menggunakan pembatas yang sama. Pembatas harus lebih dari 0 bit. Pengkodean: ASCII

Celah standar berlaku.

noɥʇʎԀʎzɐɹƆ
sumber
8
Adakah alasan khusus untuk format input dan output yang ketat?
String Tidak
2
@UnrelatedString Hmm, saya akan melonggarkan mereka.
noɥʇʎԀʎzɐɹƆ
8
IO masih agak ketat. Tidak bisakah Anda mengatakan "input dan output adalah sebagai daftar" dan biarkan default situs mengurusnya untuk Anda?
Jo King
2
Bisakah kita menganggap daftar ini tidak kosong?
Jo King
1
Daftar menurut definisi sudah memiliki pembatas. Itu sebabnya daftar. Saya juga tidak mengerti maksud Anda You may use your language built-ins to read this list however you want.. Apakah itu berarti kita harus memasukkan string ke daftar konverter dalam kiriman kami? Dan apakah kita diizinkan untuk menampilkan sebagai daftar?
Jo King

Jawaban:

7

Python 3.8 (pra-rilis) , 41 byte

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

Cobalah online!

Puji walrus ajaib :=ekspresi penugasan.


Python 2 , 42 byte

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

Cobalah online!

Tidak
sumber
Hmm, berapa lama ini di Pyth?
noɥʇʎԀʎzɐɹƆ
Huh, saya menghindari idkarena panjangnya 2 byte ...
Erik the Outgolfer
Oof ide bagusid
U10-Forward
@ noɥʇʎԀʎzɐɹƆ 8 byte untuk terjemahan langsung: Coba online!
isaacg
6

Python 2 , 44 byte

l=input()
n=0
for i in l:n+=i!=l;l=i;print n

Cobalah online!

Erik the Outgolfer
sumber
3

Jelly , 6 5 byte

ŒɠµJx

Cobalah online!

Disimpan satu byte berkat UnrelatedString !

Input dan output sebagai array (dengan kurung buka / tutup)

Bagaimana itu bekerja

Œɠµ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]
caird coinheringaahing
sumber
5 byte
String Tidak Terkait
1
@UnrelatedString semua atom baru-ketinggalan jaman!
caird coinheringaahing
2

05AB1E , 5 byte

¥Ā.¥>

Cobalah online!

Tuan Xcoder
sumber
Alternatif minor 5-byte: ¥Ābisa juga üÊ.
Kevin Cruijssen
1
4 byte
Grimmy
2

Perl 6 , 21 byte

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

Cobalah online!

Blok kode anonim yang mengambil daftar dan mengembalikan daftar. Ini bekerja dengan membandingkan apakah setiap pasangan elemen yang berdekatan tidak sama, daripada mengambil jumlah kumulatif daftar.

Jo King
sumber
2

05AB1E , 4 byte

γdƶ˜

Cobalah online!

γ       # group adjacent equal digits together
 d      # replace all digits with 1
  ƶ     # multiply each group by its 1-based index
   ˜    # flatten
Grimmy
sumber
Saya selalu lupa bahwa 05ab1e memiliki ƶ... +1
Tn. Xcoder
1
Berikut alternatif 4-byter:ηεγg
Kevin Cruijssen
2

R , 33 byte

function(x)cumsum(c(1,!!diff(x)))

Cobalah online!

Menggunakan metode penjumlahan kumulatif yang sama dengan Luis Mendo dan lainnya.

pengguna2390246
sumber
2

MATL , 8 byte

Y'wn:wY"

Cobalah online!

Penjelasan:

    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
OrangeCherries
sumber
2

Jelly , 4 byte

ŒgƤẈ

Cobalah online!

Bagaimana?

Œ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]
Jonathan Allan
sumber
1

Haskell , 46 43 byte

scanl(+)1.map fromEnum.(zipWith(/=)=<<tail)

Cobalah online!

Fungsi pointfree anonim yang mengambil daftar dan mengembalikan daftar

Jo King
sumber
1

Perl 5 , 27 byte

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

Cobalah online!

Opsi baris perintah -pmembuat perl membaca baris input dari STDIN ke "variabel default" $_. Itu kemudian mencari-menggantikan semua digit $_dengan penghitung $i. Dan $imeningkat untuk setiap digit yang berbeda dari digit sebelumnya, yang juga di digit pertama sehingga penghitung dimulai 1. Digit sebelumnya disimpan di $p.

Kjetil S.
sumber
1

Pyth , 13 11 byte

s.e*]hkhbr8

Cobalah online!

         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 terima kasih kepada Tn. Xcoder

ar4093
sumber
hMsM._+0nVtuntuk -2 byte.
Tn. Xcoder
Atau jika Anda ingin mempertahankan pendekatan Anda, rQ8sama dengan r8dan .nbisa juga suntuk -2
Tn. Xcoder
Ah bagus, dokumen tidak menyebutkan fungsi apa yang mengambil implisitQ
ar4093
1

Scala , 75 byte

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

Cobalah online!

Jika input dan output harus dipisahkan String koma (dan bukan Daftar) maka 102 byte.

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

Jelly , 5 byte

nƝÄŻ‘

Cobalah online!

Saya awalnya bertujuan untuk 4-byter (program yang sama tetapi tanpa Ż) tetapi kemudian dengan cepat menyadari bahwa a 1 harus ditambahkan setiap kali karena pengawasan ... Meskipun ada 5-byter lain di Jelly, saya akan sebenarnya menyimpan ini karena menggunakan metode yang berbeda.

L.L.sayaL.saya+1,1saya<|L.|

Tuan Xcoder
sumber
Saya kira tidak?
Tn. Xcoder
1

JavaScript (ES6), 30 byte

Mengambil input sebagai array bilangan bulat.

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

Cobalah online!

Berkomentar

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()
Arnauld
sumber
1

PHP , 52 byte

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

Cobalah online!

Input melalui baris perintah, output ke STDOUT.

Thx to @ Night2 untuk '0' == 0bugfix perbandingan sial !

640KB
sumber
@ Night2 tangkapan yang bagus! Diperbarui dan diperbaiki. Terima kasih!
640KB
1

Julia 1.0 , 56 byte

l->foldl(l,init=(0,0))do(p,i),c
println(i+=p!=c)
c,i
end

Cobalah online!

Simeon Schaub
sumber
0

Tambahkan ++ , 23 byte

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

Cobalah online!

Bagaimana itu bekerja

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]
caird coinheringaahing
sumber
0

Retina 0.8.2 , 34 byte

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

Cobalah online! Penjelasan:

\b\d+\b

Cocokkan setiap angka secara bergantian.

(?<=(...)*)

Mulailah mencari ke belakang untuk sebanyak mungkin pertandingan. (Entri berikutnya akan berada di urutan kanan-ke-kiri karena begitulah tampilan bekerja.)

\D*

Lewati pemisah.

(\3|(\d+))

Cobalah untuk mencocokkan nomor yang sama seperti terakhir kali, tetapi gagal itu, cukup cocokkan nomor apa pun, tetapi ingat bahwa kami harus mencocokkan nomor baru.

\b

Pastikan seluruh nomor cocok.

$#3

Hitung jumlah nomor baru.

Neil
sumber
0

Stax , 10 byte

▓ª2ªmD?Ä╧╖

Jalankan dan debug itu

Keluaran menggunakan ruang sebagai pembatas. Input mengikuti spesifikasi tepat menggunakan koma sebagai pemisah, dan sekarang melampirkan kawat gigi.

rekursif
sumber
0

C (gcc) , 62 61 byte

Ini adalah salah satu dari sedikit entri yang saya lakukan di mana program lengkap lebih pendek dari pengiriman fungsi!

Pada pass pertama, saya tidak peduli dengan nilai sebelumnya, jadi saya bisa mengandalkan fakta bahwa itu argvadalah pointer ke suatu tempat dan sangat tidak mungkin berada di antara [0..9]!

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

Cobalah online!

ErikF
sumber
0

Scala , 114 byte

s.split(", ").zipWithIndex.scan(s.head,0){(a,b)=>if(a._1==b._1)a else b._1->(a._2+1)}.tail.unzip._2.mkString(", ")

Cobalah online!

Bersabun
sumber
0

C (gcc) , 62 byte

f(_,l)int*_;{printf("%d ",l=--l?f(_,l)+(_[l]!=_[l-1]):1);_=l;}

Cobalah online!

Fungsi yang mengambil daftar dan panjangnya sebagai argumen.


C (gcc) , 60 byte

f(_,l)int*_;{_=printf("%*d",--l?f(_,l)+(_[l]!=_[l-1]):2,0);}

Cobalah online!

Keluaran dalam unary, dibatasi oleh 0s

attinat
sumber