Una lista de números se llama monotónicamente creciente (o no decreciente) si cada elemento es mayor o igual al elemento anterior.
Por ejemplo, 1, 1, 2, 4, 5, 5, 5, 8, 10, 11, 14, 14
está aumentando monotónicamente.
Dada una lista monótonamente creciente de enteros positivos que tiene un número arbitrario de puntos vacíos denotados por ?
, complete los espacios vacíos con enteros positivos de modo que haya tantos enteros únicos como sea posible presentes en la lista, pero sigue siendo monotónicamente creciente.
Puede haber múltiples formas de lograr esto. Cualquiera es valido.
Salida de la lista resultante.
Por ejemplo , si la entrada es
?, 1, ?, 1, 2, ?, 4, 5, 5, 5, ?, ?, ?, ?, 8, 10, 11, ?, 14, 14, ?, ?
se garantiza que sin los espacios vacíos la lista aumentará monotónicamente
1, 1, 2, 4, 5, 5, 5, 8, 10, 11, 14, 14
y su tarea es asignar números enteros positivos a cada uno
?
para maximizar el número de números enteros distintos en la lista mientras se mantiene sin disminución.Una tarea que no es válida es
1, 1, 1, 1, 2, 3, 4, 5, 5, 5, 5, 5, 5, 5, 8, 10, 11, 14, 14, 14, 14, 14
porque, aunque no es decreciente, solo tiene un número entero más que la entrada, a saber
3
.En este ejemplo, es posible insertar seis enteros positivos únicos y mantener la lista no decreciente.
Un par de formas posibles son:1, 1, 1, 1, 2, 3, 4, 5, 5, 5, 6, 7, 8, 8, 8, 10, 11, 12, 14, 14, 15, 16 1, 1, 1, 1, 2, 3, 4, 5, 5, 5, 5, 6, 6, 7, 8, 10, 11, 13, 14, 14, 20, 200
Cualquiera de estos (y muchos otros) sería una salida válida.
Todos los espacios vacíos deben llenarse.
No hay límite superior en los enteros que se pueden insertar. Está bien si se imprimen enteros muy grandes en notación científica.
El cero no es un entero positivo y nunca debe insertarse.
En lugar de ?
que puede utilizar cualquier valor constante que no es un entero positivo, como por ejemplo 0
, -1
, null
, False
, o ""
.
El código más corto en bytes gana.
Más ejemplos
[input]
[one possible output] (a "*" means it is the only possible output)
2, 4, 10
2, 4, 10 *
1, ?, 3
1, 2, 3 *
1, ?, 4
1, 2, 4
{empty list}
{empty list} *
8
8 *
?
42
?, ?, ?
271, 828, 1729
?, 1
1, 1 *
?, 2
1, 2 *
?, 3
1, 3
45, ?
45, 314159265359
1, ?, ?, ?, 1
1, 1, 1, 1, 1 *
3, ?, ?, ?, ?, 30
3, 7, 10, 23, 29, 30
1, ?, 2, ?, 3, ?, 4
1, 1, 2, 3, 3, 3, 4
1, ?, 3, ?, 5, ?, 7
1, 2, 3, 4, 5, 6, 7 *
1, ?, 3, ?, 5, ?, ?, 7
1, 2, 3, 4, 5, 6, 7, 7
1, ?, ?, ?, ?, 2, ?, ?, ?, ?, 4, ?, 4, ?, ?, 6
1, 1, 1, 1, 1, 2, 3, 4, 4, 4, 4, 4, 4, 5, 6, 6
98, ?, ?, ?, 102, ?, 104
98, 99, 100, 101, 102, 103, 104 *
fuente
Respuestas:
Haskell , 41 bytes
f
toma una lista y devuelve una lista, donde 0 representa?
s.Básicamente, la primera lista de exploración desde la izquierda, reemplazando 0 por uno más que el elemento anterior (o 0 al inicio); luego escanee desde la derecha reduciendo elementos demasiado grandes para igualar el de su derecha.
Pruébalo en línea! (con envoltorio para convertir
?
s.)fuente
Mathematica, 84 bytes
Función pura que toma una lista como argumento, donde los espacios vacíos se denotan por
Null
(como en{1, Null, Null, 2, Null}
) o se eliminan por completo (como en{1, , , 2, }
), y devuelve una lista adecuada (en este caso{1, 2, 2, 2, 3}
).Resulta que estoy usando el mismo algoritmo que en la respuesta de Haskell de Ørjan Johansen : primero reemplace cada
Null
uno por uno más que el número a su izquierda (//.{a___,b_,,c___}:>{a,b,b+1,c}
), luego reemplace cualquier número demasiado grande por el número a su derecha (//.{a___,b_,c_,d___}/;b>c:>{a,c,c,d}
). Para tratar con posiblesNull
s al comienzo de la lista, comenzamos anteponiendo a0
({0,##}&@@#
), haciendo el algoritmo y luego eliminando el inicial0
(Rest
).Sí, elegí en
Null
lugar deX
o algo así para guardar literalmente un byte en el código (el que de otro modo estaría entre comasb_,,c___
).fuente
?, 2
. Sospecho que luego producirías en2, 2
lugar de lo correcto1, 2
.C 160
Esto nunca ganará pero:
Toma la lista de los argumentos de la línea de comando.
fuente
05AB1E ,
312313 bytesGuardado 10 bytes gracias a Grimy
Pruébalo en línea!
Explicación
fuente
}}
pueden ser]
para ahorrar 2 bytes; yõ-)R
puede ser)˜R
para guardar un byte adicional.Pip ,
252321 bytesToma datos como múltiples argumentos de línea de comandos separados por espacios. Emite la lista de resultados un número por línea. Pruébalo en línea! (He eludido la cuestión de los argumentos múltiples de la línea de comandos porque sería difícil agregar 25 argumentos en TIO, pero también funciona como se anuncia).
Explicación
Procedemos en dos pases. Primero, reemplazamos cada ejecución de
?
s en la entrada con una secuencia que comienza desde el número anterior en la lista y aumenta en uno cada vez:Luego volvemos a recorrerlo; para cada número, imprimimos el mínimo y todos los números a su derecha. Esto reduce los números demasiado altos para mantener la monotonicidad.
fuente
Python 2 con NumPy, 163 bytes
Guardado 8 bytes gracias a @wythagoras
Los ceros solían marcar espacios vacíos
Más legible con comentarios:
fuente
if l[a]>l[b]:l[a]=l[b]
puede serl[a]=min(l[a],l[b])
y luego puede estar en la línea antes de eso. Además, esto significa que toda la línea se puede poner después dewhile
. Y creol=input()
yl=[1]+l
puede serl=[1]+input()
(Además, en general: si usa dos niveles de sangría, puede usar un espacio y una pestaña en lugar de un espacio y dos espacios en Python 2 (ver codegolf.stackexchange.com/a/58 ) )len(z)-i:f(z[i-1],z[i]);i+=1
al comenzar con i = 1.PHP,
9577716968 bytestoma datos de los argumentos de la línea de comandos, imprime una lista separada por espacios. Corre con
-nr
.Descompostura
$n
es verdadero para cualquier cadena que no sea la cadena vacía y"0"
.$n>0
es verdadero para números positivos y cadenas que los contienen.fuente
Perl 6 , 97 bytes
La entrada es una lista de valores o una cadena separada por espacios, donde
?
se usa para reemplazar los valores que se reemplazarán.La salida es una cadena separada por espacios con un espacio final.
Intentalo
Expandido:
fuente
$"
lugar de' '
afeitarte un byte. ¿Eso funciona aquí?$!
. ($/
existe pero se usa para$1
→$/[1]
y$<a>
→$/{ qw< a > }
)JavaScript (ES6), 65 bytes
Porque quería usarlo
reduceRight
. Explicación: Elmap
reemplaza cada valor falso por uno más que el valor anterior, luego elreduceRight
trabajo retrocede desde el final asegurando que ningún valor exceda el siguiente valor.fuente
Q, 63 bytes
{1_(|){if[y>min x;y-:1];x,y}/[(|){if[y=0;y:1+-1#x];x,y}/[0,x]]}
Esencialmente el mismo algoritmo que la respuesta de Haskell de Ørjan Johansen .
El uso de min vs last se usó para guardar un byte, ya que se puede suponer que el último elemento será el elemento min dado el tipo descendente de la matriz.
fuente
TI-Basic (TI-84 Plus CE), 81 bytes
Un puerto simple de la respuesta de Haskell de Ørjan Johansen a TI-Basic. Utiliza 0 como valor nulo. Toma información de L 1 .
Explicación:
fuente
Java 8,
199164 bytesModifica la matriz de entrada en lugar de devolver una nueva para guardar bytes.
Usos en
0
lugar de?
.Pruébalo en línea.
Explicación:
fuente
Python 2 ,
144124119 bytesPruébalo en línea!
Usos en
0
lugar de?
fuente
b=filter(abs,l[n:])
es igual ab=l[n:]
?JavaScript (ES6), 59
Una función con una matriz entera como entrada. Los espacios vacíos están marcados con
0
Prueba
fuente
C # (.NET Core) , 182 bytes
Usando la misma estrategia que Ørjan Johansen.
Utiliza 0 en la lista de entrada para marcar la var.
Pruébalo en línea!
fuente
Perl 5
-p
, 99 bytesPruébalo en línea!
fuente