Chunk + Enumera un elenco di cifre


12

Ho un elenco di cifre decimali:

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

L'elenco delle cifre decimali è noto come elementi. Possiamo formare "pezzi" da questi elementi raggruppando insieme numeri identici e adiacenti. Voglio assegnare a ciascun blocco un numero univoco, a partire da 1 e aumentando di 1 nell'ordine in cui i blocchi vengono visualizzati nell'elenco originale. Quindi, l'output per l'esempio dato sarebbe simile al seguente:

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

Formato di input

Un elenco di cifre. (0-9) È possibile utilizzare i componenti incorporati della lingua per leggere questo elenco come desiderato. Codifica: ASCII

Formato di output

Una serie di numeri decimali, separati da un delimitatore. Il tuo programma deve sempre utilizzare lo stesso delimitatore. Il delimitatore deve essere più lungo di 0 bit. Codifica: ASCII

Si applicano scappatoie standard.


8
Qualche motivo particolare per il rigoroso formato di input e output?
Corda non correlata

2
@UnrelatedString Hmm, li allenterò.
noɥʇʎԀʎzɐɹƆ

8
L'IO è ancora piuttosto severo. Non puoi semplicemente dire "input e output sono come un elenco" e lasciare che le impostazioni predefinite del sito se ne occupino per te?
Jo King,

2
Possiamo supporre che l'elenco non sia vuoto?
Jo King,

1
Un elenco per definizione ha già delimitatori. Ecco perché è un elenco. Inoltre non capisco cosa intendi per You may use your language built-ins to read this list however you want.. Ciò significa che dobbiamo includere una stringa per elencare il convertitore nella nostra presentazione? E ci abbiamo permesso ad output come un elenco?
Jo King,

Risposte:





3

Gelatina , 6 5 byte

ŒɠµJx

Provalo online!

Salvato un byte grazie a UnrelatedString !

Ingressi e uscite come array (con parentesi aperte / chiuse)

Come funziona

Œɠµ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 tutti questi atomi nuovi!
caird coinheringaahing il




2

Perl 6 , 21 byte

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

Provalo online!

Blocco di codice anonimo che accetta un elenco e restituisce un elenco. Questo funziona confrontando se ogni coppia di elementi adiacenti non è uguale, piuttosto che prendere la somma cumulativa dell'elenco.




2

MATL , 8 byte

Y'wn:wY"

Provalo online!

Spiegazione:

    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

Gelatina , 4 byte

ŒgƤẈ

Provalo online!

Come?

Œ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

Provalo online!

L'opzione della riga di comando -pconsente a perl di leggere la riga di input da STDIN nella "variabile predefinita" $_. Quindi cerca-sostituisce tutte le cifre $_con il contatore $i. Ed $iè aumentato per ogni cifra che è diversa dalla cifra precedente, che è anche alla prima cifra, quindi inizia il contatore 1. La cifra precedente è memorizzata in $p.


1

Pyth , 13 11 byte

s.e*]hkhbr8

Provalo 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 grazie a Mr. Xcoder


hMsM._+0nVt per -2 byte.
Mr. Xcoder,

O se vuoi mantenere il tuo approccio, rQ8è lo stesso r8e .npuò essere anche sper -2
Mr. Xcoder

Ah bene, i dottori non hanno menzionato le funzioni impliciteQ
ar4093

1

Scala , 75 byte

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

Provalo online!

Se input e output devono essere separati da virgola String (e non List), quindi 102 byte.

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

1

Gelatina , 5 byte

nƝÄŻ‘

Provalo online!

Inizialmente miravo a un 4-byter (lo stesso programma ma senza il Ż ) ma poi capito rapidamente che un 1 doveva essere anteposto ogni volta a causa di una svista ... Anche se c'è un altro 5-byter in Jelly, io effettivamente mantenere questo perché utilizza un metodo diverso.

Per ogni coppia di elementi vicini dell'elenco di input L, prova se LioLio+1,1io<|L|e salva questi risultati in un elenco. Quindi prendere la somma cumulativa di questo elenco e incrementarli di 1 in modo che corrispondano al sistema di indicizzazione dei blocchi. TL; DR. Ogni volta che incontriamo diversi oggetti vicini, incrementiamo l'indice del blocco di 1 .



1

JavaScript (ES6), 30 byte

Accetta l'input come una matrice di numeri interi.

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

Provalo online!

Commentate

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,' ';

Provalo online!

Input da riga di comando, output a STDOUT .

Grazie a @ Night2 per il fastidioso '0' == 0bugfix di confronto!


@ Night2 buona cattura! Aggiornato e riparato. Grazie!
640 KB



0

Aggiungi ++ , 23 byte

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

Provalo online!

Come funziona

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

Provalo online! Spiegazione:

\b\d+\b

Abbina ogni numero a turno.

(?<=(...)*)

Inizia a guardare indietro per quante più partite possibili. (Le prossime voci saranno nell'ordine da destra a sinistra poiché è così che funziona lookbehind.)

\D*

Salta i separatori.

(\3|(\d+))

Prova ad abbinare lo stesso numero dell'ultima volta, ma in caso contrario, abbina qualsiasi numero, ma ricorda che abbiamo dovuto abbinare un nuovo numero.

\b

Assicurarsi che il numero intero sia abbinato.

$#3

Conta il numero di nuovi numeri.



0

C (gcc) , 62 61 byte

Questa è una delle poche voci che ho fatto in cui un programma completo è più breve di un invio di funzione!

Al primo passaggio, non mi interessa il valore precedente, quindi posso fare affidamento sul fatto che argvè un puntatore da qualche parte ed è estremamente improbabile che sia compreso tra [0..9]!

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

Provalo online!



0

C (gcc) , 62 byte

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

Provalo online!

Una funzione che accetta l'elenco e la sua lunghezza come argomenti.


C (gcc) , 60 byte

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

Provalo online!

Uscite in unario, delimitate da 0s

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.