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.


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:





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]


1
@UnrelatedString semua atom baru-ketinggalan jaman!
caird coinheringaahing




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.




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

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]




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.


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


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(", ")

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



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

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 !


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



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]


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.


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.


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!



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

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.