Se incrementan 1 bits consecutivos

36

Dado un patrón (formato de cadena o matriz) de Bits: [0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1]

La tarea es reemplazar cualquier número de 1-Bits consecutivos con una secuencia numérica ascendente que comience en 1.

Entrada

  • Patrón (se puede recibir como una cadena o matriz) Ejemplo:
    • Cuerda: 1001011010110101001
    • Formación: [1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1]

Salida

  • Secuencia numérica ascendente (se puede devolver como una cadena o matriz) Ejemplo:
    • Cuerda: 1 0 0 1 0 1 2 0 1 0 1 2 0 1 0 1 0 0 1
    • Formación: [1, 0, 0, 1, 0, 1, 2, 0, 1, 0, 1, 2, 0, 1, 0, 1, 0, 0, 1]

Reglas

  • (solo se aplican para cadenas) La entrada no contendrá espacios entre 1y0
  • Asumir entrada length > 0
  • (solo se aplican para cadenas) La salida está separada por espacio (use cualquier otro separador si lo necesita, siempre que no sea un número o una letra del alfabeto)

Ejemplo:

Given [0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1] 
Output [0,1,2,3,0,1,2,0,0,0,1,2,3,4,5,6]

--------------------------------------------------------------------------

Given 0110101111101011011111101011111111     
Output 0 1 2 0 1 0 1 2 3 4 5 0 1 0 1 2 0 1 2 3 4 5 6 0 1 0 1 2 3 4 5 6 7 8

---------------------------------------------------------------------------

Given 11111111111101    
Output 1 2 3 4 5 6 7 8 9 10 11 12 0 1

Criterios ganadores: Codegolf

Luis felipe De jesus Munoz
fuente

Respuestas:

19

05AB1E , 4 bytes

γ€ƶ˜

Pruébalo en línea! o como un traje de prueba

Explicación

γ      # split input into groups of consecutive equal elements
 €ƶ    # multiply each number in each sublist by its 1-based index in the sublist
   ˜   # flatten
Emigna
fuente
1
Oof, mejor que el mío. Nunca hubiera pensado en esto.
Urna de pulpo mágico
3
No estoy 100% familiarizado con las reglas de conteo de bytes de codegolf (y Google solo encontró esta publicación que no llegó a una conclusión). Si bien su respuesta es de 4 caracteres, ¿no debería ser al menos de 8 bytes (por ejemplo, utf-16-be sin BOM 03 B3 20 AC 01 B6 02 DC) o 9 bytes (utf-8:) CE B3 E2 82 AC C6 B6 CB 9Co 10 bytes (por ejemplo, UTF-16, incluida la lista de materiales de 2 bytes) en cualquier codificación que no sea de juguete? (Sí, uno podría construir una codificación de 8 bits de juguete similar a las codificaciones iso-8859 con estos 4 símbolos representados como 1 byte, pero eso parece una trampa.)
dr jimbob
66
@drjimbob Sí, buena pregunta. El código puede convertirse en un archivo binario utilizando la página de códigos 05AB1E . Por ejemplo, γ€ƶ˜se representaría como 04 80 8F 98. La página de códigos existe principalmente para facilitar la escritura de códigos. Para ejecutar este archivo de 4 bytes, deberá ejecutar el intérprete con la --osabiebandera.
Adnan
18

Haskell , 15 bytes

scanl1$(*).succ

Pruébalo en línea!

Explicación / Ungolfed

scanl1 itera desde la izquierda sobre una lista utilizando una función que toma el último resultado y el elemento actual que genera una nueva lista con los resultados, dejando listas vacías y singletons "sin modificar".

(*).succ es el equivalente de \x y-> (x+1)*y

Usar esa función junto con scanl1solo funciona porque las secuencias crecientes ( 1, 2, 3, ... ) comienzan con 1 y no tienen ningún elemento precedente (en cuyo caso es el primer elemento en la lista que no se "modificará") o tienen un 0 inicial .

ბიმო
fuente
14

Casco , 5 4 3 bytes

ṁ∫g

Pruébalo en línea!

Explicación

ṁ∫g  -- full function, example input: [1,1,1,0,1]
  g  -- group: [[1,1],[0],[1]]
ṁ    -- map the following and concatenate result (example with [1,1,1])
 ∫   -- | cumulative sum: [1,2,3]
     -- : [1,2,3,0,1]

Editar historial

-1 byte usando scanl1overzipWith

-1 byte al portar la solución de Dennis

ბიმო
fuente
12

APL (Dyalog Unicode) , 5 bytes

⊥⍨¨,\

Pruébalo en línea!

Cómo funciona

⊥⍨¨,\
   ,\   Convert to lists of first n elements
⊥⍨¨     Map "Count trailing ones" to each list
Bubbler
fuente
Buen uso del ⊥⍨truco.
Zacharý
11

JavaScript (ES6), 22 bytes

Toma la entrada como una matriz.

a=>a.map(s=n=>s=n*-~s)

Pruébalo en línea!

a=>a.map(n=>a=n*-~a)Desafortunadamente, el más corto (20 bytes) fallará [1]debido a la coerción de matrices singleton al entero que están sosteniendo.

Arnauld
fuente
10

J , 4 bytes

#.~\

Un puerto de la solución APL de Bubbler

Pruébalo en línea!

J , 8 bytes

i.&0@|.\

¿Cómo?

Es simplemente la distancia al precedente 0

       \  for each prefix
     |.   reverse it
    @     and
i.&0      find the index of the first 0

Pruébalo en línea!

Galen Ivanov
fuente
8

Python 2 , 39 38 bytes

-1 byte gracias a Erik the Outgolfer

i=1
for x in input():i*=x;print i;i+=1

Pruébalo en línea!

Barra
fuente
1
No creo que necesites el ,.
Erik the Outgolfer
@EriktheOutgolfer se ve más bonito de esta manera c:
Rod
1
Lo siento, pero a veces, en la vida, tienes que hacer sacrificios.
Erik the Outgolfer
99
RIP, ,ya no estás en el código, pero siempre estarás en mi corazón
Rod
6

Jalea , 4 bytes

‘×¥\

Pruébalo en línea!

‘×¥\
   \   Accumulate the input with:
  ¥   The dyad
‘      Increment the left element
 ×    Multiply by the second element (1 or 0)
       The result always begins with the first element unchanged
dylnan
fuente
6

K (oK) , 11 8 bytes

Solución:

{y*1+x}\

Pruébalo en línea!

Explicación:

Iterar sobre la lista. Incremente el acumulador, multiplique por el elemento actual (que restablece el acumulador si el elemento es 0)

{y*1+x}\ / the solution
{     }\ / iterate (\) over lambda function
     x   / accumulator
   1+    / add 1
 y*      / multiply by current item
callejero
fuente
5

Jalea , 4 bytes

ŒgÄF

Pruébalo en línea!

Cómo funciona

ŒgÄF  Main link. Argument: A (bit array)

Œg    Group adjacent, identical bits.
  Ä   Accumulate; take the cumulative sum of each chunk.
   F  Flatten.
Dennis
fuente
Con el grupo corriendo rápido, Erik había sugerido que serían tres bytes (Si entendiera lo que haría correctamente)
dylnan
@dylnan El problema es que es difícil decidir un comportamiento tan rápido. :( Es por eso que el rápido todavía está en pausa.
Erik the Outgolfer
Podría haber múltiples rápidos para las principales implementaciones posibles
dylnan
5

RAD, 8 bytes

(⊢×1+⊣)⍂

Pruébalo en línea!

¿Cómo?

  • (⊢×1+⊣), si el argumento correcto es 0, regresar0 , de lo contrario, incremente el argumento izquierdo
  • , Escaneo LTR (en (A f B) f Clugar de A f (B f C)), aplique esto en toda la matriz
Zacharý
fuente
4

Japt, 7 6 5 bytes

åÏ*°X

Intentalo


Explicación

åÏ        :Cumulatively reduce
   °X     :  Increment the current total (initially 0)
  *       :  Multiply by the current element
Lanudo
fuente
4

Java 8, 55 48 bytes

a->{int p=0,i=0;for(int v:a)a[i++]=v<1?p=0:++p;}

Modifica la matriz de entrada en lugar de devolver una nueva para guardar bytes.

-7 bytes gracias a @TimSeguine .

Pruébalo en línea.

Explicación:

a->{             // Method with integer-array parameter and no return-type
  int p=0,       //  Previous integer, starting at 0
      i=0;       //  Index-integer, starting at 0
  for(int v:a)   //  Loop over the values of the input-array:
    a[i++]=v<1?  //   If the current value is 0:
          p=0    //    Reset the previous integer to 0
         :       //   Else:
          ++p;}  //    Increase `p` by 1 first with `++p`
                 //    and set the current item to this new value of `p`
Kevin Cruijssen
fuente
1
Puede a->{int p=0,i=0;for(int b:a)a[i++]=b<1?p=0:++p;}
reducirlo
@TimSeguine ¡Gracias! Ahora que lo veo, no puedo creer que no lo haya pensado.
Kevin Cruijssen
1
Pude deshacerme de p, pero es del mismo tamaño :(a->{int i=0;for(int v:a)a[i]+=v*i++<1?0:a[i-2];}
Tim Seguine
4

TIS , 68 + 33 = 101 bytes

Código (68 bytes):

@0
MOV UP ACC
SUB 47
MOV ACC ANY
@1
ADD 1
JRO UP
SUB ACC
MOV ACC ANY

Diseño (33 bytes):

2 1 CC I0 ASCII - O0 NUMERIC - 32

Pruébalo en línea!

Explicación:

|    Input 0    |    Input is given in ASCII (`0` is 48, `1` is 49)
+--------+------+
| Node 0 |      |    This node prepares the input data
+--------+      |
| MOV UP ACC    |    Read in a character
| SUB 47        |    Subtract 47 to map [48, 49] to [1, 2]
| MOV ACC ANY   |    Send the 1 or 2 to the next node
|               |    Implicitly wrap back to top of node
+--------+------+
| Node 1 |      |    This node does the incrementing/printing
+--------+      |
| ADD 1         |    Increment counter (starts at zero)
| JRO UP        |    Get value from above, and jump forward that many lines  (skip next line or not)
| SUB ACC       |    Reset counter to zero (if input was zero)
| MOV ACC ANY   |    Send the counter value downward to be printed
|               |    Implicitly wrap back to top of node
+---------------+
|   Output 0    |    Output is space-delimited numeric values
Phlarx
fuente
4

Gaia , 5 bytes

ẋ+⊣¦_

Pruébalo en línea!

Explicación

ẋ+⊣¦_     Full program
ẋ         Split into chunks of equal adjacent values.
   ¦_     And for each chunk, flattening the result afterwards...
 +⊣       Reduce it cumulatively on + (addition); aka cumulative sums

Ugh, pensé que las fuentes del código SE eran monoespaciales ...

Sr. Xcoder
fuente
Son monoespacios ... Falta un espacio en la primera línea.
micsthepick
Mira la edición. Todavía está desalineado.
Sr. Xcoder
Debes estar mirando desde un dispositivo móvil o algo así - Me parece bien
micsthepick
@micsthepick No soy ...
Sr. Xcoder
4

C (gcc) , 45 44 38 bytes

f(a,i)int*a;{while(--i)*++a*=-~a[-1];}

Pruébalo en línea!

¡Ahorre un byte gracias a Toby Speight!

Ahorre 6 bytes usando * = y una condición while más inteligente.

Matej Mulej
fuente
Puede guardar 1 byte: *(a-1)a[-1]
Toby Speight
Bienvenido a PPCG! :)
Shaggy
4

Perl 6 , 29 24 18 bytes

-6 bytes gracias a Sean!

*.map:{($+=1)*=$_}

Pruébalo en línea!

La función interna podría por ($+=1)*=* , pero la variable anónima persistiría en las llamadas de función. Obtenemos esto envolviéndolo en un bloque de código explícito.

Explicación:

*.map:               # Map the array to
      {($+=1)    }   # The anonymous variable incremented
             *=$_    # Multiplied by the element
Jo King
fuente
Tengo el mismo enfoque básico a la baja a 16 bytes: *.map(($+=1)*=*). Esta solución tiene la condición de que la variable de estado $persista entre las llamadas a la función, por lo que si el elemento final pasado a una llamada y el primer elemento pasado a la siguiente llamada son ambos distintos de cero, entonces el conteo comenzará con el número incorrecto.
Sean
@Sean, sí, recuerdo haber luchado con eso cuando originalmente respondí. Afortunadamente, he aprendido una forma de evitar eso desde entonces
Jo King, el
Puede golpear una más fuera de bytes: *.map:{...}.
Sean
3

Haskell , 19 bytes

scanl1$((*)=<<).(+)

Pruébalo en línea!

Explicación: El código es equivalente a scanl1(\b a->(b+a)*a), donde bestá el bit actual y aes el acumulador. scanl1toma una lista, crea una instancia del primer elemento de la lista como acumulador, se pliega sobre la lista y recopila los valores intermedios en una nueva lista.

Editar: BMO me ganó por unos segundos y 4 bytes .

Laikoni
fuente
3

Pyth , 6 bytes

m=Z*hZ

Pruébalo aquí!

Cómo funciona

m = Z * hZ - Programa completo. Q = la entrada evaluada.
m - Para cada número entero d en Q.
 = Z - Asignar la variable Z (preinicializada a 0) a ...
   * hZ - (Z + 1) * d; (d está implícito al final).
Sr. Xcoder
fuente
3

Quería obtener una respuesta al usar expresiones regulares. Probablemente hay una solución más fácil que dejo como ejercicio para el lector.

PowerShell Core , 86 bytes

Filter F{($_-split"(0)(\B|\b)"|?{$_-ne''}|%{$_-replace'(1+)',(1..$_.Length)})-join' '}

Pruébalo en línea!

Jeff Freeman
fuente
3

QBasic, 60 bytes

INPUT s$
FOR i=1TO LEN(s$)
b=MID$(s$,i)>="1
v=-b*v-b
?v
NEXT

Toma la entrada como una cadena; da la salida como números separados por nuevas líneas.

Explicación

Leemos la cadena s$y lazo ide 1la altura de su longitud.

MID$(s$,i)obtiene la subcadena desde el carácter i(1 indexado) hasta el final de la cadena. Si esto comienza con a 1, será lexicográficamente >=la cadena "1"; si comienza con a 0, no lo será. Así se bobtiene 0si el carácter en el índice ies 0, o -1si el carácter es 1.

A continuación, actualizamos el valor actual v. Si solo leemos un 0, queremos vllegar a ser 0; de lo contrario, queremos aumentar ven uno. En otras palabras v = (-b) * (v+1),; La simplificación de las matemáticas da la expresión más corta que se ve en el código. Finalmente, imprimimos vy repetimos.

DLosc
fuente
3

Brain-Flak , 60 bytes

([]){{}<>(())<>{{}<>({}({}))(<>)}{}([])}{}<>{({}[()]<>)<>}<>

Pruébalo en línea!

Explicación:

([]){  For each element in the input
    {}
    <>(())<>  Push a one to the other stack
    { If the element is one,
       {}<>({}({}))(<>)  Add the one to a copy of the previous number in the series
    }{}  Pop the element
([])}  End loop
{}<>   Pop extra zero
{({}[()]<>)<>}<>   And reverse the output stack, subtracting one from each element
Jo King
fuente
3

C (gcc), 57 52 51 bytes

f(a,l,c,i)int*a;{for(c=i=0;i<l;)a[i++]=c=a[i]*-~c;}

La respuesta JavaScript del puerto de Arnauld modifica la matriz en el lugar. Pruébelo en línea aquí .

OOBalance
fuente
¿No sería más exacto decir que esto es K&R C?
Tim Seguine 01 de
Posiblemente, pero eso sería cierto para muchas respuestas. No soy un experto, pero es muy posible que ni siquiera sea válido K&R C. La cuestión es que realmente no nos importan los estándares de idiomas en este sitio. Si gcc le permite mezclar K&R C con cosas más modernas, entonces es válido C para jugar golf porque gcc lo compilará. Ver también: codegolf.stackexchange.com/questions/2203/tips-for-golfing-in-c
OOBalance
Hasta ahora no me di cuenta de que C11 todavía admite la antigua sintaxis de la función de lista de identificadores, así que no importa. Pero su punto se mantiene independientemente.
Tim Seguine
1
Sugerirf(a,l,c)int*a;{for(c=0;l--;)c=*a++*=c+1;}
3

Shakespeare, 365 bytes

I.Ajax,.Ford,.Act I:.Scene I:.[enter Ajax and Ford]Ajax:Open mind!Scene V:.Ford:Am I nicer than the sum of a big red old cute hard cat a big red old cute joy?Ford:If so,you is the sum of thyself a son!Ford:If not,you is zero!Ford:Open heart!Ajax:you is a big red old cute hard cat.Ajax:Speak mind!Ajax:Open mind!Ford:Am I nicer than zero?Ajax:If so, let us Scene V.

pruébalo aquí

versión menos golfizada

I.Ajax,.Ford,.
Act I:.
Scene I:.
[enter Ajax and Ford]
Ajax:Open mind!
Scene V:.
Ford:Am I nicer than the sum of a big red old cute hard cat a big red old cute joy?     <- smallest way to 48 (ascii "0") I could think of
Ford:If so,you is the sum of thyself a son!
Ford:If not,you is zero!
Ford:Open heart!
Ajax:you is a big red old cute hard cat.    <- get value of 32 or space
Ajax:Speak mind!                            <- then output it
Ajax:Open mind!
Ford:Am I nicer than zero?
Ajax:If so, let us Scene V.                 <- loop through inputs
Al R
fuente
3

C ++, 47 bytes

[](int*a,int*b){for(int c=0;a!=b;)c=*a++*=1+c;}

Una lambda que modifica una matriz en su lugar, dados los punteros de inicio y fin.


Pruébalo en línea! (requiere Javascript)


Versión genérica de 55 bytes (esto funciona para cualquier contenedor con elementos de tipo aritmético):

[](auto a,auto b){for(auto c=*a-*a;a!=b;)c=*a++*=1+c;};
Toby Speight
fuente