Fragment + Wymień listę cyfr

12

Mam listę cyfr dziesiętnych:

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

Lista cyfr dziesiętnych nazywana jest pozycjami. Możemy tworzyć „fragmenty” z tych przedmiotów, grupując razem identyczne i sąsiednie liczby. Chcę przypisać każdemu fragmentowi unikalny numer, zaczynając od 1 i zwiększając go o 1 w kolejności, w jakiej fragmenty pojawiają się na oryginalnej liście. Dane wyjściowe dla podanego przykładu wyglądałyby następująco:

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

Format wejściowy

Lista cyfr. (0-9) Możesz użyć wbudowanych języków, aby przeczytać tę listę, jak chcesz. Kodowanie: ASCII

Format wyjściowy

Szereg liczb dziesiętnych oddzielonych separatorem. Twój program musi zawsze używać tego samego separatora. Separator musi być dłuższy niż 0 bitów. Kodowanie: ASCII

Obowiązują standardowe luki.

noɥʇʎԀʎzɐɹƆ
źródło
8
Czy jest jakiś konkretny powód ścisłego formatu wejściowego i wyjściowego?
Niepowiązany ciąg
2
@ UnlatedString Hmm, poluzuję je.
noɥʇʎԀʎzɐɹƆ
8
IO jest nadal dość surowa. Czy nie możesz po prostu powiedzieć „dane wejściowe i wyjściowe są jak lista” i pozwolić, aby domyślne ustawienia witryny zajęły się Tobą?
Jo King
2
Czy możemy założyć, że lista nie jest pusta?
Jo King
1
Lista z definicji ma już ograniczniki. Dlatego to jest lista. Nie rozumiem też, co masz na myśli You may use your language built-ins to read this list however you want.. Czy to oznacza, że ​​musimy dołączyć konwerter ciągu do listy w naszym zgłoszeniu? I wolno nam wyjście w postaci listy?
Jo King

Odpowiedzi:

3

Galaretka , 6 5 bajtów

ŒɠµJx

Wypróbuj online!

Oszczędność jednego bajtu dzięki UnrelatedString !

Wejścia i wyjścia jako tablice (z nawiasami otwierającymi / zamykającymi)

Jak to działa

Œɠµ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]
Cairney Coheringaahing
źródło
5 bajtów
niepowiązany ciąg
1
@ UnlatedString wszystkie te nowomodne atomy!
caird coinheringaahing
2

05AB1E , 5 bajtów

¥Ā.¥>

Wypróbuj online!

Pan Xcoder
źródło
Drobna 5-bajtowa alternatywa: ¥Āmoże być również üÊ.
Kevin Cruijssen
1
4 bajty
Grimmy
2

Perl 6 , 21 bajtów

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

Wypróbuj online!

Anonimowy blok kodu, który pobiera listę i zwraca listę. Działa to poprzez porównanie, czy każda para sąsiednich elementów nie jest równa, niż pobranie skumulowanej sumy listy.

Jo King
źródło
2

05AB1E , 4 bajty

γdƶ˜

Wypróbuj online!

γ       # group adjacent equal digits together
 d      # replace all digits with 1
  ƶ     # multiply each group by its 1-based index
   ˜    # flatten
Ponury
źródło
Ciągle zapominam, że 05ab1e ma to ƶ... +1
Mr. Xcoder
1
Oto alternatywny 4-bajter:ηεγg
Kevin Cruijssen
2

R , 33 bajty

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

Wypróbuj online!

Używa tej samej metody sumowania, co Luis Mendo i inni.

użytkownik2390246
źródło
2

MATL , 8 bajtów

Y'wn:wY"

Wypróbuj online!

Wyjaśnienie:

    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
Wiśnie Pomarańczowe
źródło
2

Galaretka , 4 bajty

ŒgƤẈ

Wypróbuj online!

W jaki sposób?

Œ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
źródło
1

Haskell , 46 43 bajtów

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

Wypróbuj online!

Anonimowa funkcja pointfree, która pobiera listę i zwraca listę

Jo King
źródło
1

Perl 5 , 27 bajtów

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

Wypróbuj online!

Opcja wiersza poleceń -ppowoduje, że perl odczytuje wiersz wejściowy ze STDIN do „zmiennej domyślnej” $_. Następnie wyszukiwanie zastępuje wszystkie cyfry $_licznikiem $i. I $ijest zwiększany dla każdej cyfry, która jest inna niż poprzednia cyfra, która jest również na pierwszej cyfrze, więc licznik zaczyna się od 1. Poprzednia cyfra jest przechowywana w $p.

Kjetil S.
źródło
1

Pyth , 13 11 bajtów

s.e*]hkhbr8

Wypróbuj 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 bajty dzięki Mr. Xcoder

ar4093
źródło
hMsM._+0nVtdla -2 bajtów.
Pan Xcoder,
Lub jeśli chcesz zachować swoje podejście, rQ8jest takie samo r8i .nmoże być również sdla -2
Mr. Xcoder
Ach miło, Q
doktorzy
1

Scala , 75 bajtów

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

Wypróbuj online!

Jeśli dane wejściowe i wyjściowe muszą być oddzielone przecinkami Łańcuch (a nie Lista), to 102 bajty.

s=>s.split(", ").scanLeft(("",0))((x,y)=>(y,x._2+(if(x._1!=y)1 else 0))).tail.map(_._2).mkString(", ")
Dr Y Wit
źródło
1

Galareta , 5 bajtów

nƝÄŻ‘

Wypróbuj online!

Początkowo dążyłem do 4-bajtowego (ten sam program, ale bez Ż), ale potem szybko zdałem sobie sprawę, że a 1 trzeba było za każdym razem przygotować z powodu niedopatrzenia ... Mimo że w Galaretce jest jeszcze 5-bajterowy, faktycznie zachowaj to, ponieważ używa innej metody.

Dla każdej pary sąsiednich elementów listy wprowadzania L., sprawdź, czy L.jaL.ja+1,1ja<|L.|i zapisz te wyniki na liście. Następnie weź skumulowaną sumę tej listy i zwiększ ją o 1, aby dopasować do systemu indeksowania porcji. TL; DR. Za każdym razem, gdy napotykamy różne sąsiadujące przedmioty, zwiększamy indeks porcji o 1 .

Pan Xcoder
źródło
Nie wydaje mi się
Pan Xcoder,
1

JavaScript (ES6), 30 bajtów

Pobiera dane wejściowe jako tablicę liczb całkowitych.

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

Wypróbuj online!

Skomentował

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
źródło
1

PHP , 52 bajty

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

Wypróbuj online!

Wejście za pomocą wiersza poleceń, wyjście do STDOUT.

Dzięki za @ Night2 za nieznośny błąd w '0' == 0porównaniu!

640 KB
źródło
@ Night2 dobry połów! Zaktualizowano i naprawiono. Dzięki!
640 KB
1

Julia 1.0 , 56 bajtów

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

Wypróbuj online!

Simeon Schaub
źródło
0

Dodaj ++ , 23 bajty

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

Wypróbuj online!

Jak to działa

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]
Cairney Coheringaahing
źródło
0

Retina 0.8.2 , 34 bajty

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

Wypróbuj online! Wyjaśnienie:

\b\d+\b

Dopasuj kolejno każdą liczbę.

(?<=(...)*)

Zacznij spoglądać wstecz, aby znaleźć jak najwięcej meczów. (Następne wpisy będą w kolejności od prawej do lewej, ponieważ tak działa lookbehind).

\D*

Pomiń separatory.

(\3|(\d+))

Spróbuj dopasować ten sam numer co poprzednio, ale w przeciwnym razie po prostu dopasuj dowolny numer, ale pamiętaj, że musieliśmy dopasować nowy numer.

\b

Upewnij się, że cały numer jest dopasowany.

$#3

Policz liczbę nowych liczb.

Neil
źródło
0

Stax , 10 bajtów

▓ª2ªmD?Ä╧╖

Uruchom i debuguj

Dane wyjściowe używają spacji jako separatora. Dane wejściowe są zgodne z dokładnymi specyfikacjami, używając przecinków jako separatorów, a teraz otaczają nawiasy klamrowe.

rekurencyjny
źródło
0

C (gcc) , 62 61 bajtów

To jeden z niewielu wpisów, które napisałem, gdy kompletny program jest krótszy niż przesłanie funkcji!

Przy pierwszym przejściu nie dbam o poprzednią wartość, więc mogę polegać na fakcie, że argvjest to wskazówka gdzieś i jest bardzo mało prawdopodobne, aby była między [0..9]!

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

Wypróbuj online!

ErikF
źródło
0

Scala , 114 bajtów

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

Wypróbuj online!

Mydlany
źródło
0

C (gcc) , 62 bajty

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

Wypróbuj online!

Funkcja, która przyjmuje listę i jej długość jako argumenty.


C (gcc) , 60 bajtów

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

Wypróbuj online!

Wyjścia są jednostkowe, ograniczone przez 0s

attinat
źródło