Chunk + Rakamların listesini numaralandırma


12

Ondalık basamakların bir listesi var:

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

Ondalık basamakların listesi öğeler olarak bilinir. Aynı ve bitişik sayıları gruplandırarak bu öğelerden "parçalar" oluşturabiliriz. Her parçaya, 1'den başlayarak ve parçaların orijinal listede görünme sırasına göre 1 oranında artarak benzersiz bir sayı atamak istiyorum. Yani, verilen örneğin çıktısı şöyle görünecektir:

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

Giriş biçimi

Rakamların listesi. (0-9) Dil listesini dilediğiniz zaman bu listeyi okumak için kullanabilirsiniz. Kodlama: ASCII

Çıkış biçimi

Sınırlayıcı ile ayrılmış ondalık sayılar dizisi. Programınız her zaman aynı sınırlayıcıyı kullanmalıdır. Sınırlayıcı 0 bit'ten uzun olmalıdır. Kodlama: ASCII

Standart boşluklar geçerlidir.


8
Katı girdi ve çıktı formatının özel bir nedeni var mı?
İlişkisiz String

2
@UrereString Hmm, onları gevşeteceğim.
noɥʇʎԀʎzɐɹƆ

8
ES hala oldukça katı. Sadece "girdi ve çıktı bir liste olarak" diyebilir ve site varsayılanlarının sizin yerinize ilgilenmesine izin veremez misiniz?
Jo King

2
Listenin boş olmadığını varsayabilir miyiz?
Jo King

1
Tanıma göre bir listede zaten sınırlayıcılar var. Bu yüzden bir liste. Ne demek istediğini de anlamıyorum You may use your language built-ins to read this list however you want.. Bu, gönderimimize listeye bir dize eklemek zorunda olduğumuz anlamına mı geliyor? Ve edilir bir liste olarak çıkışa izin?
Jo King

Yanıtlar:





3

Jöle , 6 5 bayt

ŒɠµJx

Çevrimiçi deneyin!

UnrelatedString sayesinde bir bayt kaydedildi !

Diziler olarak giriş ve çıkışlar (açma / kapama braketleri ile)

Nasıl çalışır

Œɠµ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
Tüm bu yeni-atomlu atomları sokmak!
caird coinheringaahing




2

Perl 6 , 21 bayt

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

Çevrimiçi deneyin!

Liste alan ve liste döndüren anonim kod bloğu. Bu, bitişik elemanların her bir çiftinin, listenin kümülatif toplamını almaktan eşit olup olmadığını karşılaştırarak çalışır.


2

05AB1E , 4 bayt

γdƶ˜

Çevrimiçi deneyin!

γ       # group adjacent equal digits together
 d      # replace all digits with 1
  ƶ     # multiply each group by its 1-based index
   ˜    # flatten

05ab1e'nin buna sahip olduğunu unutmaya devam ediyorum ƶ... +1
Bay

1
İşte alternatif bir 4 byter:ηεγg
Kevin Cruijssen


2

Matl , 8 bayt

Y'wn:wY"

Çevrimiçi deneyin!

Açıklama:

    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

Jöle , 4 bayt

ŒgƤẈ

Çevrimiçi deneyin!

Nasıl?

Œ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 bayt

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

Çevrimiçi deneyin!

Komut satırı seçeneği -p, perl'in STDIN'den "varsayılan değişken" in giriş satırını okumasını sağlar $_. Daha sonra-arama yerine tüm haneleri $_sayacı ile $i. Ve bir $iönceki basamaktan farklı olan her bir basamak için artar, ki bu aynı zamanda ilk basamaktadır, böylece sayaç başlar 1. Önceki basamakta saklanır $p.


1

Pyth , 13 11 bayt

s.e*]hkhbr8

Çevrimiçi deneyin!

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

Bay Xcoder sayesinde -2 bayt


hMsM._+0nVt-2 bayt için.
Bay Xcoder

Eğer yaklaşım tutmak istiyorsanız Veya, rQ8aynı r8ve .nolabilir siçin -2 yanı
Sn Xcoder

Ah güzel, dokümanlar hangi işlevlerin örtülü olduğunu söylediQ
ar4093

1

Scala , 75 bayt

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

Çevrimiçi deneyin!

Giriş ve çıkışın virgülle ayrılmış olması gerekiyorsa String (Liste değil) ise 102 bayt.

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

1

Jöle , 5 bayt

nƝÄŻ‘

Çevrimiçi deneyin!

Başlangıçta 4 byter (aynı program ama olmadan Ż) hedefledim ama sonra hemen bir 1 bir gözetim nedeniyle her seferinde yapılması gerektiğini ... Jelly'de 5 byter daha olmasına rağmen, aslında farklı bir yöntem kullandığından bunu saklayın.

Giriş listesindeki her bir komşu öğe çifti için L, test edin LbenLben+1,1ben<|L|ve bu sonuçları bir listeye kaydedin. Ardından, bu listenin kümülatif toplamını alın ve yığın indeksleme sistemiyle eşleştirmek için bunları 1 artırın. TL; DR. Farklı komşu öğelerle karşılaştığımızda, yığın dizinini 1 arttırırız .



1

JavaScript (ES6), 30 bayt

Girdiyi tamsayılar dizisi olarak alır.

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

Çevrimiçi deneyin!

Yorumlananlar

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 bayt

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

Çevrimiçi deneyin!

Komut satırı üzerinden giriş, STDOUT .

Sinir bozucu '0' == 0karşılaştırma bugfix için @ Night2 için teşekkürler !


@ Night2 iyi yakala! Güncellenmiş ve düzeltilmiştir. Teşekkür!
640KB



0

++ , 23 bayt ekle

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

Çevrimiçi deneyin!

Nasıl çalışır

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 bayt

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

Çevrimiçi deneyin! Açıklama:

\b\d+\b

Her sayıyı sırayla eşleştirin.

(?<=(...)*)

Mümkün olduğunca çok sayıda maç için geriye doğru bakmaya başlayın. (Sonraki girişler, görünümün arkasındaki gibi sağdan sola sıralanır.)

\D*

Ayırıcıları atlayın.

(\3|(\d+))

Son sayıyla aynı sayıyı eşleştirmeye çalışın, ancak başarısız olursa, herhangi bir sayıyla eşleştirin, ancak yeni bir sayıyla eşleşmemiz gerektiğini unutmayın.

\b

Tam sayının eşleştiğinden emin olun.

$#3

Yeni sayıların sayısını sayın.



0

C (gcc) , 62 61 bayt

Bu, tam bir programın bir işlev gönderiminden daha kısa olduğu yerlerde yaptığım birkaç girişten biridir!

İlk geçişte, önceki değeri umursamıyorum, bu yüzden argvbir yere bir işaretçi olduğu ve [0..9] arasında olması pek mümkün olmadığına güveniyorum !

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

Çevrimiçi deneyin!



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.