Dada la entrada de una lista de enteros positivos con algunos reemplazados por 0
, envíe la lista con los números faltantes que se cambiaron por 0
reemplazados.
Características de la lista de entrada:
La lista siempre tendrá una longitud de al menos 2.
Definamos la lista de entrada como
a
y la "lista original" (es decir, la lista antes de que los números fueran reemplazados por0
s) comob
. Para cualquieran
,a[n]
esb[n]
o0
.Para cualquiera
n
,b[n]
esb[n-1] + 1
ob[n-1] - 1
. Es decir, los números enb
siempre cambiarán1
en cada índice de su anterior. El primer elemento está, por supuesto, exento de esta regla.Para cada ejecución de ceros en
a
(es decir, elementos consecutivos reemplazados0
), conx
lo que representa el índice del inicio de la carrera yy
que representa el final,a[x-1]
quea[y+1]
siempre será bien únicamente aumentando o disminuyendo exclusivamente. Por lo tanto, solo habrá una forma posible de completar los ceros.- Esto también significa que ni el primer ni el último elemento de la matriz pueden ser ceros.
En términos más simples, para completar una serie de ceros, simplemente reemplácelo con un rango desde el número anterior al siguiente. Por ejemplo, una entrada de
1 2 0 0 0 6 7
debe salir
1 2 3 4 5 6 7
Como se trata de code-golf , ganará el código más corto en bytes.
Casos de prueba:
In Out
-----------------------------------------------------
1 0 0 0 5 6 0 4 0 0 1 | 1 2 3 4 5 6 5 4 3 2 1
7 6 0 0 3 0 0 0 7 0 5 | 7 6 5 4 3 4 5 6 7 6 5
1 0 3 0 5 0 3 0 5 0 7 | 1 2 3 4 5 4 3 4 5 6 7
14 0 0 0 0 0 0 0 0 23 | 14 15 16 17 18 19 20 21 22 23
fuente
0
puede nuestro programa tomar otro valor comonull
?0
.Respuestas:
JavaScript (ES6),
72 66 64 5453 bytes¡Guardado 12 bytes gracias a @Neil!
Guardado 1 byte gracias a @IsmaelMiguel
Bastante bueno para JavaScript.
Pruébelo en línea (todos los navegadores funcionan)
Explicación
fuente
a.find((q,r)=>r>i&&q)>b?++b:--b
es lo mismo queb+=a.find((q,r)=>r>i&&q)>b||-1
MATL , 11
12bytesFunciona con la versión actual (13.0.0) del lenguaje / compilador.
Pruébalo en línea!
fuente
Haskell,
686158 bytesEjemplo de uso:
g.filter(>0) $ [7,6,0,0,3,0,0,0,7,0,5]
->[7,6,5,4,3,4,5,6,7,6,5]
.Cómo funciona: elimine los ceros de la entrada, luego llame
g
. Dejea
ser el primer yb
luego el segundo elemento de la lista restante. Concatene las listas dea
arriba hacia abajob-1
ya
hacia abajob+1
(una de ellas estará vacía) y una llamada recursiva cona
caída.Editar: @Zgarb guardó 3 bytes. ¡Gracias!
fuente
Mathematica, 59 bytes
Caso de prueba
fuente
Perl,
4745443937 bytesIncluye +1 para
-p
Espera la lista en stdin. Ejemplo: echo 1 0 3 0 1 | perl -p archivo.pl
fuente
Jalea,
1211 bytesPruébalo en línea!
Versión alternativa, 8 bytes (no competitiva)
Desafortunadamente, Jelly's
pop
no se lanzó a iterable, en la última versión anterior a este desafío. Esto se ha solucionado y lo siguiente funciona en la versión actual.Pruébalo en línea!
Cómo funciona
En la versión alternativa, se
ḢWW;
vuelve innecesario. Sin embargo, dado que el primer elemento se convierte en iterable antes de aparecer, en realidad no se modifica. El finalḊ
elimina el duplicado del primer elemento.fuente
Retina,
393431 bytes3 bytes guardados gracias a @Martin.
Toma entrada y da salida en unario.
El código llena iterativamente cada lugar vacío (0)
previous_number - 1 + 2 * if_next_nonzero_number_bigger
.previous_number - 1
es$1
yif_next_nonzero_number_bigger
es$3
.Con E / S decimal, el código tiene 51 bytes de longitud, como puede ver en el intérprete en línea con todos los casos de prueba .
fuente
1
en la búsqueda anticipada.GNU Sed (con
exec
extensión usando bash), 61La puntuación incluye +1 para la
-r
opción de sed.0
s y reemplázalas..
{1..4}
para los puntos finales locales. La belleza de las expansiones de llaves bash aquí es que la secuencia generada siempre se ejecutará en la dirección correcta, independientemente de si el inicio o el final son más grandes.e
opción dels
comando para llamar a bash para evaluar esta expansión de llaves0
s, vuelva al inicio.Ideona
fuente
Python 2,
195111 bytes (¡gracias Alex !)Entrada: debe ser
[list]
de entradasSalida:
[list]
de entradasfuente
Perl,
8582 bytesincluye +1 para
-p
Espera la lista en stdin. Ejemplo:
echo 1 0 3 0 1 | perl -p file.pl
.Esto usa una expresión regular anidada. Algo legible:
fuente
Python 2,
9288 bytes(Variable intermedia eliminada)
fuente
Pyth, 17 bytes
La forma en que funciona:
En otras palabras: todos los ceros se eliminan de la entrada, luego se inserta un rango exclusivo entre cada elemento. Este rango es de longitud cero en elementos solo uno aparte.
fuente
05AB1E , 3 bytes (no competitivos)
Esta fue una característica agregada después del desafío. Código:
Explicación:
Pruébalo en línea! o Verifique todos los casos de prueba!
fuente
Vim: 231 comandos clave
Tenga en cuenta que cualquier ^ que precede a un carácter significa que debe mantener el control mientras escribe ese carácter
¡Pasos para que puedas ejecutar esto también!
:s/\^V/<Ctrl-V><Ctrl-V>/g
y presione Intro (los dos s deberían darle un ^ V azul):s/\^R/<Ctrl-V><Ctrl-R>/g
y presione Intro (debería ver azul ^ Rs ahora):s/\^X/<Ctrl-V><Ctrl-X>/g
y presione Intro (debería ver las ^ Xs azules ahora):s/\^O/<Ctrl-V><Ctrl-O>/g
y presiona enter:s/\^A/<Ctrl-V><Ctrl-A>/g
y presiona enter:s/\^\[/<Ctrl-V><Ctrl-[>/g
y presione Intro (este comando es ligeramente diferente porque necesitaba escapar del [)0"yy$
. El comando ahora está almacenado en el registro y@y
Si alguien conoce una mejor manera de compartir el comando, hágamelo saber. Sé que esto es largo, pero es lo mejor que se me ocurrió.
De entrada y salida
La cadena de entrada debe estar sola en cualquier línea del archivo. 1 0 0 4 3 0 0 0 7
La salida simplemente sobrescribirá la cadena de entrada 1 2 3 4 3 4 5 6 7
Explicación
Algoritmo
Macros utilizadas
@e: compruebe el final. El último número tendrá una e adjunta. Si el número debajo del cursor tiene una e al final, elimine la e y detenga la ejecución. De lo contrario, comience un ciclo de interpolación con @b.
@b - Comienza el ciclo de interpolación. Guarde el número debajo del cursor para una operación de resta (@s) y luego encuentre el siguiente término distinto de cero (@f)
@s: almacena el comando de resta para usar en @d. Es simplemente
(val)^X
dónde(val)
está el número al comienzo del paso de interpolación. Esto se establece mediante el comando @b.@f - Encuentra el siguiente término distinto de cero. Escriba el valor actual en el registro sin nombre, luego escriba
@f @d
en la línea siguiente y luego ejecute @z. Esto repetirá este comando si el número es cero y ejecutará @d si no lo es.@z: ejecución condicional si el registro sin nombre es 0. Este comando espera dos comandos en una nueva línea en el formato
command1 command2
. Si el registro sin nombre es 0,command1
se ejecuta, de lo contrariocommand2
se ejecuta. Tenga en cuenta que ninguno de los comandos puede tener espacios.@t: registro de comando temporal. Almacena varios comandos por un corto tiempo antes de ejecutarlos. Se usa principalmente en declaraciones if.
@d: determina la dirección de interpolación. Resta el primer número de la secuencia del número debajo del cursor (usando @s). Si el resultado es negativo, la interpolación debe disminuir para que ^ X se guarde en @a. De lo contrario, deberíamos incrementar para que ^ A se guarde en @a. Una vez guardado esto, retroceda al comienzo de este ciclo de interpolación y ejecute @i para interpolar realmente
@a: almacena
^A
o^X
para incrementar o disminuir durante el paso de interpolación. Esto se establece mediante el comando @d.@i - Interpolar. Copie el número en la ubicación actual a @x y pase al siguiente número. Si ese número es cero, reemplácelo con @x y ejecute @a para modificarlo correctamente hacia arriba o hacia abajo, luego repita este comando. Si el número no es cero, hemos llegado al final de este ciclo de interpolación. Se debe comenzar uno nuevo con este número como principio, así que ejecute @e para verificar el final y vuelva a ejecutar.
@x: registro de almacenamiento temporal. Utilizado en el comando interpolar (@i)
Desglosando las pulsaciones del teclado
fuente
Python 3.5, 159 bytes
una solución recursiva
Sin golf
En la solución de golf, reemplazo las condiciones usando el hecho de que
h*True=h
yh*False=[]
Resultado
fuente
Perl 6 , 54 bytes
fuente
MATLAB,
393837 bytesFunción anónima que interpola linealmente entre los puntos en
a
.find(a)
es una matriz de índices de elementos distintos de cero ena
ya(a>0)
son los valores positivos. Guardado 1 byte gracias a la sugerencia de un amigo en>
lugar de~=
.fuente