Chunk + Liste der Ziffern auflisten

11

Ich habe eine Liste mit Dezimalstellen:

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

Die Liste der Dezimalstellen wird als Elemente bezeichnet. Wir können aus diesen Elementen "Brocken" bilden, indem wir identische und benachbarte Zahlen zusammenfassen. Ich möchte jedem Block eine eindeutige Nummer zuweisen, beginnend mit 1, und um 1 in der Reihenfolge erhöhen, in der die Blöcke in der ursprünglichen Liste erscheinen. Die Ausgabe für das angegebene Beispiel würde also folgendermaßen aussehen:

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

Eingabeformat

Eine Liste der Ziffern. (0-9) Sie können Ihre integrierten Sprachen verwenden, um diese Liste zu lesen, wie Sie möchten. Codierung: ASCII

Ausgabeformat

Eine Reihe von Dezimalzahlen, die durch ein Trennzeichen getrennt sind. Ihr Programm muss immer das gleiche Trennzeichen verwenden. Das Trennzeichen muss länger als 0 Bit sein. Codierung: ASCII

Es gelten Standardlücken.

noɥʇʎԀʎzɐɹƆ
quelle
8
Gibt es einen besonderen Grund für das strenge Eingabe- und Ausgabeformat?
Nicht verwandte
2
@UnrelatedString Hmm, ich werde sie lösen.
noɥʇʎԀʎzɐɹƆ
8
Das IO ist immer noch ziemlich streng. Können Sie nicht einfach "Eingabe und Ausgabe ist als Liste" sagen und die Standardeinstellungen der Site für Sie erledigen lassen?
Jo King
2
Können wir annehmen, dass die Liste nicht leer ist?
Jo King
1
Eine Liste hat per Definition bereits Trennzeichen. Deshalb ist es eine Liste. Ich verstehe auch nicht, was du damit meinst You may use your language built-ins to read this list however you want.. Bedeutet das, dass wir einen String zum Auflisten des Konverters in unsere Einreichung aufnehmen müssen? Und dürfen wir als Liste ausgeben?
Jo King

Antworten:

7

Python 3.8 (Vorabversion) , 41 Byte

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

Probieren Sie es online aus!

Loben Sie das magische Walross :=der Zuweisungsausdrücke.


Python 2 , 42 Bytes

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

Probieren Sie es online aus!

xnor
quelle
Hmm, wie lange würde das in Pyth dauern?
noɥʇʎԀʎzɐɹƆ
Huh, ich habe es vermieden, idweil es 2 Bytes lang ist ...
Erik der Outgolfer
Oof schöne Idee vonid
U10-Forward
@ noɥʇʎԀʎzɐɹƆ 8 Bytes für eine einfache Übersetzung: Probieren Sie es online aus!
isaacg
3

Gelee , 6 5 Bytes

ŒɠµJx

Probieren Sie es online aus!

Ein Byte dank UnrelatedString gespeichert !

Ein- und Ausgänge als Arrays (mit öffnenden / schließenden Klammern)

Wie es funktioniert

Œɠµ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
quelle
5 Bytes
Nicht verwandte
1
@UnrelatedString all diese neuen Atome!
Caird Coinheringaahing
2

Perl 6 , 21 Bytes

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

Probieren Sie es online aus!

Anonymer Codeblock, der eine Liste aufnimmt und eine Liste zurückgibt. Dies funktioniert durch Vergleichen, ob jedes Paar benachbarter Elemente nicht gleich ist, als durch Berechnen der kumulierten Summe der Liste.

Scherzen
quelle
2

05AB1E , 4 Bytes

γdƶ˜

Probieren Sie es online aus!

γ       # group adjacent equal digits together
 d      # replace all digits with 1
  ƶ     # multiply each group by its 1-based index
   ˜    # flatten
Grimmy
quelle
Ich vergesse immer wieder, dass 05ab1e das hat ƶ... +1
Mr. Xcoder
1
Hier ein alternativer 4-Byter:ηεγg
Kevin Cruijssen
2

MATL , 8 Bytes

Y'wn:wY"

Probieren Sie es online aus!

Erläuterung:

    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
Orangenkirschen
quelle
2

Gelee , 4 Bytes

ŒgƤẈ

Probieren Sie es online aus!

Wie?

Œ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
quelle
1

Haskell , 46 43 Bytes

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

Probieren Sie es online aus!

Anonyme punktfreie Funktion, die eine Liste erstellt und eine Liste zurückgibt

Scherzen
quelle
1

Perl 5 , 27 Bytes

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

Probieren Sie es online aus!

Mit der Befehlszeilenoption -pliest Perl die Eingabezeile von STDIN in die "Standardvariable" $_. Anschließend werden alle Ziffern $_durch den Zähler ersetzt $i. Und $iwird für jede Ziffer erhöht, die sich von der vorherigen Ziffer unterscheidet, die sich auch bei der ersten Ziffer befindet, sodass der Zähler bei beginnt 1. Die vorherige Ziffer wird in gespeichert $p.

Kjetil S.
quelle
1

Pyth , 13 11 Bytes

s.e*]hkhbr8

Probieren Sie es online aus!

         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 Bytes dank Mr. Xcoder

ar4093
quelle
hMsM._+0nVtfür -2 Bytes.
Herr Xcoder
Oder wenn Sie Ihren Ansatz rQ8r8.ns
beibehalten
Ah schön, die Dokumente haben nicht erwähnt, welche Funktionen implizit sindQ
ar4093
1

Scala , 75 Bytes

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

Probieren Sie es online aus!

Wenn ein- und ausgegeben werden müssen Komma getrennt String (und nicht Liste) , dann 102 Bytes.

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

Gelee , 5 Bytes

nƝÄŻ‘

Probieren Sie es online aus!

Ich strebte zunächst einen 4-Byter an (dasselbe Programm, aber ohne Ż), merkte dann aber schnell, dass aufgrund eines Versehens jedes Mal eine 1 vorangestellt werden musste ... Auch wenn es in Jelly noch einen 5-Byter gibt, werde ich Behalten Sie dies tatsächlich bei, da eine andere Methode verwendet wird.

LLiLi+1,1i<|L|

Mr. Xcoder
quelle
Ich glaube nicht?
Herr Xcoder
1

JavaScript (ES6), 30 Byte

Nimmt die Eingabe als Array von Ganzzahlen auf.

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

Probieren Sie es online aus!

Kommentiert

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
quelle
1

PHP , 52 Bytes

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

Probieren Sie es online aus!

Eingabe über Befehlszeile, Ausgabe an STDOUT.

Danke an @ Night2 für den nervigen '0' == 0Vergleich Bugfix!

640 KB
quelle
@ Night2 guter Fang! Aktualisiert und behoben. Danke!
640 KB
0

Add ++ , 23 Bytes

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

Probieren Sie es online aus!

Wie es funktioniert

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
quelle
0

Retina 0,8,2 , 34 Bytes

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

Probieren Sie es online aus! Erläuterung:

\b\d+\b

Ordnen Sie jede Zahl der Reihe nach zu.

(?<=(...)*)

Suchen Sie rückwärts nach so vielen Übereinstimmungen wie möglich. (Die nächsten Einträge werden in der Reihenfolge von rechts nach links angezeigt, da Lookbehind so funktioniert.)

\D*

Überspringen Sie die Trennzeichen.

(\3|(\d+))

Versuchen Sie, dieselbe Nummer wie beim letzten Mal zu finden, aber wenn dies nicht der Fall ist, stimmen Sie einfach mit einer beliebigen Nummer überein, aber denken Sie daran, dass wir eine neue Nummer finden mussten.

\b

Stellen Sie sicher, dass die gesamte Nummer übereinstimmt.

$#3

Zählen Sie die Anzahl der neuen Nummern.

Neil
quelle
0

Stax , 10 Bytes

▓ª2ªmD?Ä╧╖

Führen Sie es aus und debuggen Sie es

Die Ausgabe verwendet Leerzeichen als Trennzeichen. Die Eingabe folgt den genauen Spezifikationen, wobei Kommas als Trennzeichen verwendet werden und jetzt geschweifte Klammern eingeschlossen werden.

rekursiv
quelle
0

C (gcc) , 62 61 Bytes

Dies ist einer der wenigen Einträge, die ich gemacht habe, bei denen ein vollständiges Programm kürzer ist als eine Funktionsübermittlung!

Beim ersten Durchgang ist mir der vorherige Wert egal, daher kann ich mich auf die Tatsache verlassen, dass dies argvein Zeiger auf irgendwo ist und es äußerst unwahrscheinlich ist, dass er zwischen [0..9] liegt!

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

Probieren Sie es online aus!

ErikF
quelle