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!
1-4 9-2
?149 150 151 152 153 154 155 156 157 178 159 160
?19-9
para19,20,...,29
y no19-29
como lo implica el texto. Entonces, ¿cuál es correcto?Respuestas:
LabVIEW, 97 * 0.8 * 0.75 * 0.5 = 29.1 Primitivas de LabVIEW
esto funciona contando hacia arriba si los elementos sucesivos están separados por 1 y luego crea una cadena a partir del número y el módulo de conteo de números 10 y algunas multiplicaciones causan que los negativos sean una perra.
El gif muestra una entrada
8,9,10,11
y salidas8-1
. Para la entrada-5,-4,-3,1,3,4,5
-5--3,1,3-5
sale.fuente
C ++ 11, 451 * 80% * 75% * 50% = 135.3 bytes
Guardado 9 bytes gracias a @ kirbyfan64sos.
Ahorró 19 bytes gracias a @JosephMalle y @cat.
Guardado 11 bytes gracias a @ pinkfloydx33.
Esto califica para todos los bonos.
Prueba de parámetro de muestra y resultado:
fuente
int
lugar deunsigned int
? Ahorra 9 bytes.gcc
di:a.cpp: In function ‘std::string f(std::vector<int>)’: a.cpp:8:83: error: ‘to_string’ was not declared in this scope
-std=c++11
; > = 5.0 lo tiene activado por defecto (en realidad es-std=gnu11
, pero lo suficientemente cerca).Ruby,
120118 * 0,8 * 0,75 * 0,5 = 35,4 bytesToma argumentos de línea de comandos como entrada (las comas están bien); imprime un rango por línea a la salida estándar.
Con espacios en blanco / comentarios:
Casos de prueba
Características no cubiertas por casos de prueba
Entrada desordenada y rangos de un solo elemento:
Rangos negativos (no es posible abreviar el número mayor con estos):
Abreviatura de números arbitrarios de dígitos (expansión de bash ordinaria utilizada para la entrada aquí):
fuente
((n=c.shift-1)>m)
conm<n=c.shift-1
Javascript ES6, 229 * 80% * 75% * 50% = 68.7 bytes
Prueba de entrada
Estoy usando los siguientes datos de prueba:
Básico: 229 bytes
Esta versión satisface los requisitos de la pregunta (a) con todos los bonos (c, d, e), pero se cuelga en páginas individuales. También puede manejar duplicados (f). Maneja páginas negativas hasta -10,000, que se pueden aumentar fácilmente con una pérdida de velocidad (grande).
(La salida anterior muestra espacios en lugar de nuevas líneas reales por brevedad)
Páginas individuales: 233 bytes
Esta versión un poco más larga satisface adicionalmente (e) y muestra páginas individuales como un rango con los mismos límites inferior y superior
fuente
GAP , 355 Bytes * 0.8 * 0.75 * 0.5 = 106.5
Esto satisface todos los bonos. Me costó casi 100 bytes adicionales hacer que todo funcione bien. Esta función solo omite los dígitos iniciales si el espacio no desborda los que se colocan una vez. Por ejemplo
9 10 11
salidas9-1
pero9 10 11 12 .. 20 21
salidas9-21
.Si GAP fuera un poco menos detallado, podría haberlo hecho bastante corto (también podría haber ahorrado muchos bytes si no hubiera seguido la sintaxis exacta). Probablemente intentaré jugar al golf un poco más difícil mañana. Vea a continuación los casos de prueba.
sin golf:
Tenga en cuenta que en la sintaxis GAP,
[a..b]
es equivalente a[a,a+1,...,b]
. Creo que estos casos de prueba demuestran que este programa cumple con todos los requisitos. Si algo está mal, hágamelo saber.fuente
Lua, 322 * 80% * 75% * 50% = 96.6 Bytes
Finalmente hecho con los 3 desafíos, Puntajes de menos de 100 bytes: D
Golfed
Sin golf
Puede probar lua en línea , para ver cómo funciona en los casos de prueba, copie y pegue la función, seguido de este código:
fuente
Java, 252 * 80% * 75% * 50% = 75.6 bytes
He decidido optar por un método (es mucho más pequeño en Java), aquí está la versión de golf:
Golfed
Y aquí está la versión legible:
Cuando se prueban estos son los resultados:
Salida:
Actualizar:
Ahora también puede manejar números negativos, lo que se suma al bono.
fuente
p=s=c=0;c--;
ap=s=0;c=-1;
?c=~(p=s=0)
por puntos de estilo.Japt, 127 bytes * 80% * 75% * 50% = 38.1
Wow, ese fue un gran desafío para incluir todas las bonificaciones. Probablemente podría hacerse más corto.
Pruébalo en línea!
Cómo funciona
La explicación es muy tosca; no dude en hacer cualquier pregunta que pueda tener.
fuente
R, 167 bytes x 80% x 75% x 50% -> 50.1
Sangrado, con nuevas líneas:
Casos de prueba:
Funciona para la bonificación de -50%:
Acepta entradas sin clasificar:
Acepta números negativos:
fuente
sh, 135 * .8 * .75 * .5 = 40.5
script de shell
guión awk
donde
s
es el comienzo de la secuencia actual yo
es el valor de entrada anterior.fuente
-31, -30, -29, -28
increases in the 10's place from-3
to-2
and shall therefore be condensed to-31-8
. I also see the ambiguity it creates, but that's what is asked for.