Descargo de responsabilidad: aunque he estado en este sitio con fines de entretenimiento por un tiempo, esta es mi primera pregunta, así que perdone cualquier error menor.
Fondo
Cuando nos asigna tarea, mi maestro es realmente molesto y escribe todos los problemas que tenemos que hacer individualmente. Como tal, me lleva una eternidad copiar los problemas que tengo que resolver. Pensé en hacerme la vida más fácil, le enviaría un programa que podría hacer que la lista de problemas ocupara menos espacio.
Mientras escribimos una lista de números de página o problema, usamos un guión para denotar un rango. Por ejemplo, se 19-21
convierte 19, 20, 21
. Si hay un espacio intermedio, se utilizan dos rangos separados por comas: se 19-21, 27-31
convierte en 19, 20, 21, 27, 28, 29, 30, 31
.
Ahora mismo, probablemente estés pensando: "esto parece bastante trivial". De hecho, esto ya ha sido respondido aquí y aquí .
Sin embargo, hay una trampa. Si tenemos un rango con dígitos consecutivos iguales, los dígitos repetidos pueden omitirse. Por ejemplo: se 15, 16, 17
convierte 15-7
y se 107, 108, 109
vuelve 107-9
. Para obtener una bonificación, si el último dígito igual consecutivo es 1 mayor y el último dígito del límite superior es menor o igual que el inferior, se puede omitir lo siguiente (perdón si eso sonó confuso; quizás algunos ejemplos lo aclaren) . 109-113
se convierte 109-3
, ya que un último dígito más bajo implica aumentar el lugar de 10 segundos.
Reto
Su programa debe tomar una lista de enteros por entrada (lo que sea estándar para su idioma o una función). Puede decidir si esta lista está separada por comas, por espacios o como una lista / matriz real.
Salida de la manera más corta (primero ordenada por número de rangos, luego la suma de los caracteres incluidos en los rangos) para representar esa lista usando esta notación. Cada rango discontinuo debe estar en la misma línea, pero los rangos pueden estar separados por comas o líneas nuevas (se permiten líneas o comas finales). Estos rangos deben estar en orden.
Como el wifi de nuestra escuela es terrible , tengo que hacer que el archivo sea lo más pequeño posible para enviárselo. El código más corto (en bytes) gana.
Bonos
Mi maestro es descuidado, así que hay algunas cosas que podrían ayudarlo. Las bonificaciones múltiples se acumulan mediante la multiplicación, por ejemplo, una bonificación de -10% (x 90%) y una bonificación de -25% (x 75%) = 90% * 75% = x 67.5% (bonificación de -32.5%).
- A veces los pone en el orden incorrecto (no es un profesor de matemáticas). Obtenga un bono de -20% si su programa puede aceptar enteros que no están ordenados de menor a mayor.
- Nuestro libro es extraño, y cada sección comienza a contar los problemas en -10. Si su programa puede aceptar números negativos, tome un -25%.
- Si acepta la bonificación de un último dígito inferior que aumenta el lugar de 10, por ejemplo,
25-32
reduciendo a25-2
, tome una bonificación de -50%.
Casos de prueba
In: 1, 2, 3, 4, 5
Out: 1-5
In: 3, 4, 5, 9, 10, 11, 12
Out: 3-5, 9-12
In: 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160
Out: 149-60
In: 1 2 3 4
Out: 1-4
For bonuses:
In: 109, 110, 111, 112, 113
Out: 109-3
In: 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29
Out: 19-9
In: -3, -2, -1, 0, 1, 2
Out: -3-2
In: -3, -2, -1
Out: -3--1
Se aceptará una respuesta el sábado 19 de diciembre de 2015.
GLHF!
149 150 151 152 153 154 155 156 157 178 159 160
?
19-9
para 19,20,...,29
y no 19-29
como lo implica el texto. Entonces, ¿cuál es correcto?
1-4 9-2
?