Inspirado en esta publicación sobre Puzzling. Spoilers de ese rompecabezas están a continuación.
Dados tres enteros positivos como entrada, (x, y, z)
construya el rango inclusivo [x, y]
, concatene ese rango juntos, luego elimine z
dígitos no necesariamente consecutivos para producir los enteros positivos más grandes y más pequeños posibles. Los ceros iniciales no están permitidos (es decir, los números deben comenzar con [1-9]
). Emite esos dos números en cualquier orden.
Para el ejemplo de la publicación Puzzling, para la entrada (1, 100, 100)
, el número más grande posible es 99999785960616263646566676869707172737475767778798081828384858687888990919293949596979899100
,
y el número más pequeño es 10000012340616263646566676869707172737475767778798081828384858687888990919293949596979899100
,
siguiendo la lógica a continuación de la respuesta de jafe publicada allí:
- No podemos influir en la longitud del número (hay un número fijo de dígitos), por lo que para maximizar el valor tomamos el primer dígito máximo, luego el segundo dígito, etc.
- Elimine los 84 primeros no nueves (quedan 16 dígitos para eliminar):
999995051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
- El número más grande dentro de los siguientes 17 dígitos es 7, por lo que a partir de aquí, el siguiente dígito en la respuesta puede ser como máximo 7 (no podemos eliminar más de 16 dígitos). Entonces, elimine 15 no 7 ... (queda 1 dígito para eliminar):
999997585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
- A partir de aquí, el siguiente dígito puede ser como máximo 8, así que elimine uno que no sea 8 del medio:
99999785960616263646566676869707172737475767778798081828384858687888990919293949596979899100
- Lógica similar, pero invertida (es decir, queremos una
1
s principal en lugar de una9
s inicial ) para el número más pequeño.
Aquí está un ejemplo más pequeña: (1, 10, 5)
.
Construimos el rango 12345678910
y determinamos qué 5
dígitos podemos eliminar dejando el mayor número posible. Obviamente, eso significa que queremos maximizar el dígito inicial, ya que no podemos influir en la longitud de la salida. Entonces, si eliminamos 12345
, nos quedamos 678910
, y eso es lo más grande que podemos hacer. Hacer el más pequeño es un poco más complicado, ya que podemos extraer los números del medio en su lugar, dejando 123410
el más pequeño posible.
Para (20, 25, 11)
, el resultado es bastante aburrido, como 5
y 1
.
Finalmente, descartar respuestas que intentan poner ceros a la izquierda, (9, 11, 3)
da lo 91011
que a su vez rinde 91
y 10
es el más grande y el más pequeño.
E / S y reglas
- Si es más fácil / más corto, puede codificar dos programas / funciones, uno para el más grande y otro para el más pequeño, en cuyo caso su puntaje es la suma de ambas partes.
- La entrada y salida se pueden dar por cualquier método conveniente .
- Se puede suponer que la entrada encaja en el tipo de número nativo de su idioma, sin embargo , no se puede suponer que el número concatenado ni la salida lo hagan.
- Un programa completo o una función son aceptables. Si es una función, puede devolver el resultado en lugar de imprimirlo.
- Las lagunas estándar están prohibidas.
- Este es el código de golf, por lo que se aplican todas las reglas habituales de golf, y gana el código más corto (en bytes).
fuente
9, 11, 3
lo haría.Respuestas:
Haskell , 162 bytes
Pruébalo en línea!
Utiliza el algoritmo descrito por jafe. Puede ser más corto usar un método menos eficiente, pero fue más divertido escribirlo :)
La
%
operación toma 4 argumentos (en realidad 3, pero lom
que sea): que es una función que selecciona el miembro "óptimo" de una lista (ya seamaximum
ominimum
según lo que queramos);f
que es una función de "filtro";n
el número de dígitos que quedan para soltar; ys
la cuerda Primero verificamos si n es igual al número de dígitos que quedan en la cadena (lo usé>=
por seguridad) y descartamos el resto des
si es así. De lo contrario, verificamos si aún necesitamos soltar dígitos (n>0
), luego usamosspan
para dividir nuestra cadena en tres partes:p
los dígitos para soltar,c
el dígito óptimo alcanzable yr
la cuerda restante Hacemos esto al pasar un predicado que verifica la igualdad contra nuestro dígito óptimo. Para encontrar ese dígito tomamos los primerosn+1
dígitos de la cadena, lo filtramos y luego lo pasamos a nuestra función "selector". Ahora solo producimos nuestro dígito óptimo y repetimos, restando la longitud dep
(la cantidad de dígitos eliminados) den
. Tenga en cuenta que no pasamos nuestra función de filtrado a la llamada recursiva y, en su lugar, la reemplazamos conid
. Esto se debe a que el filtro solo está ahí para evitar seleccionar ceros iniciales en elminimum
caso, que solo es relevante en la primera iteración. Después de eso ya no necesitamos ningún filtro.%
es en realidad sólo una función de ayuda para los#
que es nuestra función "real", tomandox
,y
yz
. Utilizamos una lista de comprensión solo para evitar un poco de repetición, iterando sobre nuestras tuplas de funciones y pasándolas%
junto conz
y la cadena concatenada. Esa cadena se crea utilizando el operador de mónada mágica(=<<)
que, en este contexto, funciona comoconcatMap
.fuente
Jalea , 17 bytes
Pruébalo en línea!
Calcula todas las posibilidades y luego mantiene la más grande y la más pequeña.
Argumento a la izquierda:
x,y
para construir el rango. Argumento correcto:z
dígitos a eliminar.fuente
Python 2 , 143 bytes
Pruébalo en línea!
Esto funciona calculando todas las combinaciones del tamaño objetivo (se preserva el orden del elemento) y obteniendo los números más pequeños / más grandes
fuente
Carbón , 56 bytes o 21 +
4635 =6756 bytesPruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Ingrese
x
yy
, cree un rango inclusivo y una los números en una cadena.Haga un bucle por cada dígito que se eliminará.
Cree una lista de cadenas formadas eliminando cada posible carácter de la cadena actual y tome el máximo.
Imprime el resultado.
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Ingrese
x
yy
, cree un rango inclusivo y una los números en una cadena.Ingrese
z
e increméntelo. Luego creo una lista de esa longitud: necesito poder incrementarz
dentro del siguiente filtro, pero solo los comandos pueden incrementar variables; hay una laguna en esoPushOperator
aumenta la longitud de la lista.Filtre los caracteres que desee comprobando que no haya caracteres más bajos en la región divisible. La región comienza con el primer
z+1
caracteres (ya que es posible cortar el primeroz
si es necesario) y el punto final se incrementa para cada carácter que se mantiene. Se tiene cuidado de no elegir un cero para el primer personaje.El algoritmo más rápido es de 30 bytes cuando se usa para calcular el mayor número posible:
Pruébalo en línea! El enlace es a la versión detallada del código. Editar: desde entonces pude combinar los dos anteriores en una segunda solución de 56 bytes que genera ambos resultados:
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Genera la cadena inicial.
Representar
z+1
como la longitud de la lista.Invierta la lista clonándola y guarde el resultado.
Imprima los dos resultados en líneas separadas. (Otra forma de hacerlo es separar los resultados con un
\r
carácter literal ).Genera el mayor número posible.
Genere el número más pequeño posible utilizando la lista clonada para realizar un seguimiento
z
.fuente
Jalea ,
1918 bytesPruébalo en línea!
Muy ineficiente, definitivamente no tiene sentido ir( 19292) =305812874887035355118559193163641366325011573739619723360
1, 100, 100
comofuente
05AB1E , 16 bytes
Pruébalo en línea!
Programa completo, leyendo entradas en este orden: y, x, z . Emite una lista de dos listas de caracteres.
Explicación
fuente
Ć`‚
es bastante inteligente, buena respuesta!Matlab, 95 bytes
Pruébalo en línea!
Devuelve una matriz 1x2 con min y max.
Cómo funciona
fuente