Trozo + Enumerar una lista de dígitos

12

Tengo una lista de dígitos decimales:

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

La lista de dígitos decimales se conoce como elementos. Podemos formar "fragmentos" a partir de estos elementos agrupando números idénticos y adyacentes. Quiero asignar a cada fragmento un número único, comenzando desde 1, y aumentando en 1 en el orden en que aparecen los fragmentos en la lista original. Entonces, la salida para el ejemplo dado se vería así:

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

Formato de entrada

Una lista de dígitos. (0-9) Puede usar sus idiomas incorporados para leer esta lista como quiera. Codificación: ASCII

Formato de salida

Una serie de números decimales, separados por un delimitador. Su programa siempre debe usar el mismo delimitador. El delimitador debe ser más largo que 0 bits. Codificación: ASCII

Se aplican lagunas estándar.

noɥʇʎԀʎzɐɹƆ
fuente
8
¿Alguna razón particular para el formato estricto de entrada y salida?
Cadena no relacionada
2
@UnrelatedString Hmm, los aflojaré.
noɥʇʎԀʎzɐɹƆ
8
El IO sigue siendo bastante estricto. ¿No puede simplemente decir "entrada y salida es como una lista" y dejar que los valores predeterminados del sitio se encarguen de usted?
Jo King
2
¿Podemos suponer que la lista no está vacía?
Jo King
1
Una lista por definición ya tiene delimitadores. Por eso es una lista. Tampoco entiendo a qué te refieres You may use your language built-ins to read this list however you want.. ¿Eso significa que debemos incluir un convertidor de cadena a lista en nuestro envío? ¿Y se nos permite salir como una lista?
Jo King

Respuestas:

7

Python 3.8 (prelanzamiento) , 41 bytes

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

Pruébalo en línea!

Alabado sea la morsa mágica :=de las expresiones de asignación.


Python 2 , 42 bytes

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

Pruébalo en línea!

xnor
fuente
¿Cuánto duraría esto en Pyth?
noɥʇʎԀʎzɐɹƆ
Huh, evité idporque tiene 2 bytes de largo ...
Erik the Outgolfer
Buena idea deid
U10-Forward
@ noɥʇʎԀʎzɐɹƆ 8 bytes para una traducción sencilla: ¡ Pruébelo en línea!
isaacg
3

Jalea , 6 5 bytes

ŒɠµJx

Pruébalo en línea!

¡Guardado un byte gracias a UnrelatedString !

Entradas y salidas como matriz (con paréntesis de apertura / cierre)

Cómo funciona

Œɠµ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
fuente
5 bytes
Cadena no relacionada
1
@UnrelatedString todos estos átomos nuevos y novedosos!
caird coinheringaahing
2

Perl 6 , 21 bytes

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

Pruébalo en línea!

Bloque de código anónimo que toma una lista y devuelve una lista. Esto funciona al comparar si cada par de elementos adyacentes no son iguales, que tomar la suma acumulativa de la lista.

Jo King
fuente
2

05AB1E , 4 bytes

γdƶ˜

Pruébalo en línea!

γ       # group adjacent equal digits together
 d      # replace all digits with 1
  ƶ     # multiply each group by its 1-based index
   ˜    # flatten
Mugriento
fuente
Sigo olvidando que 05ab1e tiene eso ƶ... +1
Sr. Xcoder
1
Aquí un 4-byter alternativo:ηεγg
Kevin Cruijssen
2

MATL , 8 bytes

Y'wn:wY"

Pruébalo en línea!

Explicación:

    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
Cerezas Naranjas
fuente
2

Jalea , 4 bytes

ŒgƤẈ

Pruébalo en línea!

¿Cómo?

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

Haskell , 46 43 bytes

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

Pruébalo en línea!

Función anónima sin puntos que toma una lista y devuelve una lista

Jo King
fuente
1

Perl 5 , 27 bytes

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

Pruébalo en línea!

La opción de línea de comando -phace que Perl lea la línea de entrada de STDIN en la "variable predeterminada" $_. Luego, la búsqueda reemplaza todos los dígitos $_con el contador $i. Y $ise incrementa para cada dígito que es diferente del dígito anterior, que también está en el primer dígito, por lo que el contador comienza en 1. El dígito anterior se almacena en $p.

Kjetil S.
fuente
1

Pyth , 13 11 bytes

s.e*]hkhbr8

Pruébalo en línea!

         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 gracias al Sr. Xcoder

ar4093
fuente
hMsM._+0nVtpara -2 bytes.
Sr. Xcoder
O si desea mantener su enfoque, rQ8es lo mismo r8y .npuede ser spara -2 también
Sr. Xcoder
Ah bueno, los documentos no mencionaron qué funciones tienen implícitoQ
ar4093
1

Scala , 75 bytes

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

Pruébalo en línea!

Si la entrada y la salida deben estar separadas por comas String (y no List) entonces 102 bytes.

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

Jalea , 5 bytes

nƝÄŻ‘

Pruébalo en línea!

Inicialmente apunté a un 4-byter (el mismo programa pero sin el Ż) pero luego me di cuenta rápidamente de que un 1 tenía que ser antepuesto cada vez debido a un descuido ... A pesar de que hay otro 5-byter en Jelly, voy a En realidad, guarde esto porque utiliza un método diferente.

LLiLi+1,1i<|L|

Sr. Xcoder
fuente
¿No lo creo?
Sr. Xcoder
1

JavaScript (ES6), 30 bytes

Toma datos como una matriz de enteros.

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

Pruébalo en línea!

Comentado

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

PHP , 52 bytes

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

Pruébalo en línea!

Entrada a través de línea de comando, salida a STDOUT.

Gracias a @ Night2 por la molesta corrección de errores de '0' == 0comparación.

640 KB
fuente
@ Night2 buena captura! Actualizado y arreglado. ¡Gracias!
640KB
0

Agregar ++ , 23 bytes

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

Pruébalo en línea!

Cómo funciona

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

Retina 0.8.2 , 34 bytes

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

Pruébalo en línea! Explicación:

\b\d+\b

Empareja cada número por turno.

(?<=(...)*)

Comienza a mirar hacia atrás en busca de la mayor cantidad de partidos posible. (Las siguientes entradas estarán en orden de derecha a izquierda, ya que así es como funciona mirar atrás).

\D*

Salta los separadores.

(\3|(\d+))

Intente hacer coincidir el mismo número que la última vez, pero si no lo hace, simplemente haga coincidir cualquier número, pero recuerde que teníamos que hacer coincidir un nuevo número.

\b

Asegúrese de que el número entero coincida.

$#3

Cuenta el número de nuevos números.

Neil
fuente
0

Stax , 10 bytes

▓ª2ªmD?Ä╧╖

Ejecutar y depurarlo

La salida usa el espacio como delimitador. La entrada sigue las especificaciones precisas usando comas como separadores, y ahora encierra llaves.

recursivo
fuente
0

C (gcc) , 62 61 bytes

¡Esta es una de las pocas entradas que he hecho donde un programa completo es más corto que una presentación de función!

En la primera pasada, no me importa el valor anterior, ¡así que puedo confiar en el hecho de que argves un puntero a algún lugar y es extremadamente improbable que esté entre [0..9]!

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

Pruébalo en línea!

ErikF
fuente
0

Scala , 114 bytes

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

Pruébalo en línea!

Jabonoso
fuente
0

C (gcc) , 62 bytes

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

Pruébalo en línea!

Una función que toma la lista y su longitud como argumentos.


C (gcc) , 60 bytes

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

Pruébalo en línea!

Salidas en unario, delimitadas por 0s

attinat
fuente