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.


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!


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]


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.




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

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]




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.


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


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

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|



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

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!


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


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.



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!



Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.