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]
- Cuerda:
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]
- Cuerda:
Reglas
- (solo se aplican para cadenas) La entrada no contendrá espacios entre
1
y0
- 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
03 B3 20 AC 01 B6 02 DC
) o 9 bytes (utf-8:)CE B3 E2 82 AC C6 B6 CB 9C
o 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.)γ€ƶ˜
se representaría como04 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--osabie
bandera.Haskell , 15 bytes
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
scanl1
solo 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
Python 2 , 36 bytes
Pruébalo en línea!
fuente
Casco ,
5 43 bytesPruébalo en línea!
Explicación
Editar historial
-1 byte usando
scanl1
overzipWith
-1 byte al portar la solución de Dennis
fuente
APL (Dyalog Unicode) , 5 bytes
Pruébalo en línea!
Cómo funciona
fuente
⊥⍨
truco.JavaScript (ES6), 22 bytes
Toma la entrada como una matriz.
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.fuente
J , 4 bytes
Un puerto de la solución APL de Bubbler
Pruébalo en línea!
J , 8 bytes
¿Cómo?
Es simplemente la distancia al precedente
0
Pruébalo en línea!
fuente
Python 2 ,
3938 bytes-1 byte gracias a Erik the Outgolfer
Pruébalo en línea!
fuente
,
.,
ya no estás en el código, pero siempre estarás en mi corazónJalea , 4 bytes
Pruébalo en línea!
fuente
K (oK) ,
118 bytesSolución:
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)
fuente
Jalea , 4 bytes
Pruébalo en línea!
Cómo funciona
fuente
R ,
4631 bytesPruébalo en línea!
sequence
, que "existe principalmente en reverencia a la historia muy temprana de R" , es bastante útil aquí.fuente
RAD, 8 bytes
Pruébalo en línea!
¿Cómo?
(⊢×1+⊣)
, si el argumento correcto es0
, regresar0
, de lo contrario, incremente el argumento izquierdo⍂
, Escaneo LTR (en(A f B) f C
lugar deA f (B f C)
), aplique esto en toda la matrizfuente
Japt,
765 bytesIntentalo
Explicación
fuente
Java 8,
5548 bytesModifica 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:
fuente
a->{int p=0,i=0;for(int b:a)a[i++]=b<1?p=0:++p;}
a->{int i=0;for(int v:a)a[i]+=v*i++<1?0:a[i-2];}
TIS , 68 + 33 = 101 bytes
Código (68 bytes):
Diseño (33 bytes):
Pruébalo en línea!
Explicación:
fuente
Gaia , 5 bytes
Pruébalo en línea!
Explicación
Ugh, pensé que las fuentes del código SE eran monoespaciales ...
fuente
C (gcc) ,
454438 bytesPruébalo en línea!
¡Ahorre un byte gracias a Toby Speight!
Ahorre 6 bytes usando * = y una condición while más inteligente.
fuente
*(a-1)
→a[-1]
Perl 6 ,
29 2418 bytes-6 bytes gracias a Sean!
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:
fuente
*.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.*.map:{...}
.Jalea , 5 bytes
Pruébalo en línea!
fuente
Haskell , 19 bytes
Pruébalo en línea!
Explicación: El código es equivalente a
scanl1(\b a->(b+a)*a)
, dondeb
está el bit actual ya
es el acumulador.scanl1
toma 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 .
fuente
Pyth , 6 bytes
Pruébalo aquí!
Cómo funciona
fuente
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
Pruébalo en línea!
fuente
Wolfram Language (Mathematica) , 16 bytes
Pruébalo en línea!
fuente
QBasic, 60 bytes
Toma la entrada como una cadena; da la salida como números separados por nuevas líneas.
Explicación
Leemos la cadena
s$
y lazoi
de1
la altura de su longitud.MID$(s$,i)
obtiene la subcadena desde el carácteri
(1 indexado) hasta el final de la cadena. Si esto comienza con a1
, será lexicográficamente>=
la cadena"1"
; si comienza con a0
, no lo será. Así seb
obtiene0
si el carácter en el índicei
es0
, o-1
si el carácter es1
.A continuación, actualizamos el valor actual
v
. Si solo leemos un0
, queremosv
llegar a ser0
; de lo contrario, queremos aumentarv
en uno. En otras palabrasv = (-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, imprimimosv
y repetimos.fuente
Brain-Flak , 60 bytes
Pruébalo en línea!
Explicación:
fuente
Retina , 14 bytes
Pruébalo en línea!
fuente
C (gcc),
575251 bytesLa respuesta JavaScript del puerto de Arnauld modifica la matriz en el lugar. Pruébelo en línea aquí .
fuente
f(a,l,c)int*a;{for(c=0;l--;)c=*a++*=c+1;}
Shakespeare, 365 bytes
pruébalo aquí
versión menos golfizada
fuente
C ++, 47 bytes
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):
fuente