Inspirado por esta pregunta SO
Como entrada, se le dará una lista no entera de enteros, donde se garantiza que el primer valor no sea cero. Para construir la salida, camine desde el principio de la lista, generando cada valor distinto de cero en el camino. Cuando encuentre un cero, repita el valor que agregó más recientemente a la salida.
Puede escribir un programa o función, y hacer que la entrada / salida tome cualquier formato conveniente que no codifique información adicional, siempre y cuando siga siendo una secuencia ordenada de enteros. Si sale de un programa, puede imprimir una nueva línea final. Excepto por esta nueva línea final, su salida debe ser una entrada aceptable para su envío.
El código más corto en bytes gana.
Casos de prueba
[1, 0, 2, 0, 7, 7, 7, 0, 5, 0, 0, 0, 9] -> [1, 1, 2, 2, 7, 7, 7, 7, 5, 5, 5, 5, 9]
[1, 0, 0, 0, 0, 0] -> [1, 1, 1, 1, 1, 1]
[-1, 0, 5, 0, 0, -7] -> [-1, -1, 5, 5, 5, -7]
[23, 0, 0, -42, 0, 0, 0] -> [23, 23, 23, -42, -42, -42, -42]
[1, 2, 3, 4] -> [1, 2, 3, 4]
[-1234] -> [-1234]
code-golf
array-manipulation
FryAmTheEggman
fuente
fuente
[0,0]
?[1,01]
? Usando la respuesta Pyth de issac, compare esto y esto .01
no es un número entero válido en la entrada de Pyth, por lo que Isaac no tiene que dar cuenta de eso. Otras respuestas pueden aceptar entradas como esa si lo desean, siempre y cuando sean consistentes (como la respuesta deRespuestas:
Pyth, 6 bytes
Demostración
m ... Q
significa que esto asigna una función sobre la entrada. La función que se está mapeando esJ|dJ
. Eso significaJ = d or J
en Python, ya queJ
es implícitamente asignado al siguiente valor en el primer uso. A diferencia de Python, las expresiones de asignación devuelven el valor asignado en Pyth, por lo que el mapa devuelve cada valor sucesivo deJ
, según se desee.fuente
Gelatina , no competidora
3 bytes Esta respuesta no es competitiva, ya que utiliza características que son posteriores al desafío.
Pruébalo en línea!
Cómo funciona
fuente
Rubí, 25 bytes.
Esto es realmente muy malvado.
Específicamente, el fragmento
x==0 ? a : (a=x)
.Si hubiera utilizado cualquier otro nombre de variable para
a
(el valor anterior distinto de cero), digamos:y
tendría que declararlo fuera demap
(porquey=x
solo tendría un alcance dentro de esa únicamap
iteración). Eso usaría cuatro caracteres más (y=0;
).Pero si uso el nombre de la variable
a
... sí, lo has adivinado. Realmente estoy reasignando al argumento que obtuvimos como entrada (la matriz original).map
no le importa porque solo le importa el valor original de la cosa a la que se llama, por lo que esto realmente funciona.fuente
Haskell, 21 bytes
La función (anónima) que hacemos está en la última línea. Las dos primeras líneas definen una función auxiliar.
La función binaria
%
genera el segundo argumento, a menos que sea0
, en cuyo caso genera el primer argumento.scanl1
itera esta función sobre la lista de entrada, generando el resultado en cada paso.fuente
J, 8 bytes
Esta es una función unaria, invocada de la siguiente manera.
Explicación
fuente
{:@(#~|)\
, así que un byte más.Sed, 8
/^0$/
coincide con un cero en una línea; si es así,g
copia el espacio de espera en el espacio del patrónh
copia el espacio del patrón en el espacio de esperaLos enteros están separados por una nueva línea. p.ej:
fuente
Javascript ES6, 19 bytes
Solución directa, bucle a través de la entrada, asignar
p
al elemento actuali
op
sii
es0
y generarlo.Ejemplo ejecutado (asignando una función anónima a
f
):fuente
Retina , 15 bytes
Pruébalo en línea.
Reemplaza repetidamente un número seguido de un cero con el doble de ese número hasta que la cadena deja de cambiar.
fuente
Dyalog APL,
12109 bytesInspirado por la respuesta J de @ Zgarb.
Probarlo aquí .
fuente
Pyth, 8 bytes
Usos
.u
(reducción acumulativa) por|
(Pythonor
), con el caso base 0.fuente
.u
es más largo, incluso siJ
yK
están atados. ¿Alguna vez es óptimo?Python 2, 29 bytes
Toma la entrada como números dados uno por línea, y las salidas en el mismo formato. Termina con error después de terminar.
Usando la naturaleza de cortocircuito de
or
, la variablex
se actualiza a la entrada, a menos que esa entrada sea 0 (que es Falsey), en cuyo caso permanece su valor actual. Entonces,x
se imprime. Tenga en cuenta que, dado que el primer valor de la lista no es cero,x
no se evalúa en el lado derecho antes de ser asignado.fuente
#\nJ|EJ
Mathematica 38 bytes
La coincidencia de patrones reemplaza repetidamente
...a,0,...
con...a,a...
fuente
Matlab, 41
46bytesEsto está inspirado en mi respuesta original , con las siguientes diferencias:
nonzeros
.0
.Gracias a Tom Carpenter por el ítem 4, y por su sugerencia de usar un programa en lugar de una función; juntos permitieron una reducción de 5 bytes.
Ejemplo:
fuente
x=input('')
lugar de la declaración de función y endisp(u(t)
lugar dely=
bit. Además, puede guardar cuatro bytes más al deshacerse de lat
variable, produciendox=input('');u=x(~~x);disp(u(cumsum(~~x)))
41.@(x)x(~~x)(cumsum(~~x))
funciona en Octave.Gol> <> , 8 bytes
Entrada y salida son números separados por nueva línea.
Explicación:
Pruébelo en línea aquí.
fuente
Japt,
87 bytesBastante simple. Toma entradas separadas por comas. Pruébalo en línea!
Sin golfos y explicación
Versión de 4 bytes no competitiva : (
å
comando y!
función automática añadidos después del desafío)Explicación:
Pruébalo en línea!
fuente
ª
es OR, en lugar deº
? ¿º
Y es por casualidad?º
es((
. Fueron asignados por valor Unicode ya que encontré la necesidad de ellos: Pª
nd andº
r es genial, aunque podría usar eso para Japt 2.0 ...Java, 78
Aquí solo hacemos un seguimiento del último valor distinto de cero y lo introducimos donde corresponda. Parece la forma obvia de hacerlo.
fuente
Prólogo (SWI) , 54 bytes
Pruébalo en línea!
Explicación
Estoy realmente feliz con esta respuesta.
Primero decimos que la lista vacía es la solución de la lista vacía:
Luego decimos que esa
[X,X|Y]
es la solución[X,0|T]
, si eliminamos la segunda entrada de cada una de las soluciones restantes.Por último, decimos que cualquier cosa sobrante es válida si comienzan con el mismo valor y el resto de las dos listas coinciden entre sí.
Si esa explicación no funciona para usted, aquí está el código traducido a Haskell:
Pruébalo en línea!
fuente
GolfScript, 10 bytes
Este programa toma la entrada de stdin, en forma de una matriz de GolfScript literal (por ejemplo
[1 0 2 0]
), y escribe su salida en stdout en el mismo formato (por ejemplo[1 1 2 2]
).Pruébalo en línea.
Una función (tomar y devolver una matriz GolfScript) sería tres bytes más larga, debido a la necesidad de envolverla en un bloque y asignarla a un símbolo:
Por supuesto, si solo se cuenta el cuerpo de la función (es decir,
[{1$or}*]
), entonces puedo guardar un byte en comparación con el programa independiente.fuente
Minkolang 0.14 ,
1210 bytesPruébalo aquí La entrada se puede dar como en la pregunta, pero sin corchetes .
Explicación
Minkolang es toroidal, por lo que gira hasta el principio y continúa hasta que golpea
.
y se detiene.fuente
𝔼𝕊𝕄𝕚𝕟, 7 caracteres / 12 bytes
Try it here (Firefox only).
Explicación
fuente
O , 31 bytes
Esto toma una entrada separada por
,
y genera la misma lista[]
.Explicación:
17 bytes
Toma datos como una lista de números separados por espacios usando notación postfix y solo puede manejar números hexadecimales de un solo dígito. Los negativos se posponen con
_
.Explicación:
fuente
I~]{n.{:V}{;V}?}d
. Me pregunto sid
debería poner el valor en la pila en lugar den
...-42
, pero agrega corchetes alrededor de la salida.R,
393733 bytesEsta es una función sin nombre que acepta un vector y devuelve un vector. Requiere
zoo
que se instale el paquete. Tenga en cuenta que no es necesariozoo
que se adjunte al espacio de nombres ya que lo estamos haciendo referencia directamente.El nombre de esta operación en el mundo de las estadísticas es imputación de LOCF, donde LOCF significa última observación llevada adelante. Para lograr esto en R, podemos usarlo
na.locf
desde elzoo
paquete, que reemplaza losNA
valores con el último noNA
valor conocido . Solo tenemos que reemplazar los ceros en la entrada conNA
s primero.Para hacer eso, usamos
x|NA
, que seráTRUE
cuandox != 0
y deNA
otra manera. Si multiplicamos esto porx
, losTRUE
elementos se reemplazan por los elementos correspondientes dex
y losNA
s permanecenNA
, reemplazando así todos los ceros. Esto se pasa a lozoo::na.locf
que nos da exactamente lo que queremos.¡Guardado 4 bytes gracias a flodel!
fuente
Óxido, 100 bytes
Tropecé con este desafío, pensé en probarlo en mi idioma favorito. Intenté usarlo
[T]::windows_mut()
al principio, antes de descubrir que no existe . Y en realidad podría haber sido más largo que esto. De todos modos, resulta que el Rust golfizado es muy feo y no es muy competitivo (¡especialmente con todos esos esotéricos anticuados!) 1La nueva línea no está incluida en el bytecount; solo está ahí para que no tenga que desplazarse hacia los lados. No cambia el significado del código.
Sin golf:
[1] Al menos no es tan malo como Java.
fuente
public static void main
placa repetitiva ...Vía Láctea 1.2.1 , 33 bytes
Esto supone que la lista de enteros está únicamente en la pila.
Explicación
fuente
Julia, 33 bytes
Esta es una función
g
que acepta una matriz y devuelve una matriz. Comenzamos una variable temporala
en 0. Para cada elementoi
de la entrada, sii
no es 0, entonces asignamosa
ai
. Sii
es 0,a
no cambia en esa iteración. Usamosa
como el valor en esa posición en la matriz de salida.fuente
Perl 6 , 21 bytes
uso:
fuente
R, 36 bytes
Veamos cómo funciona esto usando
x=
como ejemplo. Aquí,
!!x
será el vector lógico (Verdadero / Falso):Además,
seq(a=x)
proporciona un vector de índices siempre quex
:Multiplicamos ambos, dando:
Tomamos el máximo acumulativo:
Finalmente, usamos ese último vector como los índices para extraer de
x
:fuente
CJam, 11 bytes
Pruébalo en línea.
Cómo funciona
fuente
Powershell, 32 bytes
$x|%{...}
hace el bloque de script para cada elemento en$x
.($_,$t)
es una matriz de elementos actuales$t
y[!$_]
significa que usamos!$_
para indexar en la matriz. El índice será0
(falso) para elementos distintos de cero y1
(verdadero) cuando el elemento actual sea cero, por$t
lo que será el elemento actual o$t
. Los paréntesis rodean la expresión de asignación para que se emita su valor. Sin paréntesis, sería una tarea "silenciosa"$t
.fuente
param($x)
que convierte esto en un programa. El resultado es una colección de enteros que puede enviar como parámetro al programa, por ejemplo,$a = .\program.ps1 1,2,3,4,0,0,5
y luego.\program.ps1 $a
funciona como se espera.$args|%{($p=($_,$p)[!$_])}
- 26 bytes usando $ args.Japt , 3 bytes
Intentalo
fuente