Dada una lista sin clasificar de enteros positivos únicos, genera la lista más corta de los rangos más largos posibles de enteros secuenciales.
ENTRADA
- Una lista sin clasificar de enteros positivos únicos
- p.ej
9 13 3 11 8 4 10 15
- p.ej
- La entrada puede tomarse de cualquiera de los siguientes:
stdin
- argumentos de línea de comandos
- argumentos de función
SALIDA
- Una lista ordenada de rangos o valores individuales impresos en una línea para stdout o la salida similar más cercana a su idioma.
- Si hay dos o más enteros secuenciales (secuenciales por valor, no por ubicación en la lista), se denotarán como un rango inclusivo usando -, por ejemplo
8-11
- Todos los demás enteros se imprimen simplemente sin otra notación.
- Un solo espacio delimitará la salida
- Si hay dos o más enteros secuenciales (secuenciales por valor, no por ubicación en la lista), se denotarán como un rango inclusivo usando -, por ejemplo
- Los números que no están presentes en la entrada no deben estar en la salida, por ejemplo,
3 5 6
no se pueden acortar3-6
porque4
no están presentes
EJEMPLOS
Exitoso:
IN> 9 13 3 11 8 4 10 15 6
OUT> 3-4 6 8-11 13 15
IN> 11 10 6 9 13 8 3 4 15
OUT> 3-4 6 8-11 13 15
IN> 5 8 3 2 6 4 7 1
OUT> 1-8
IN> 5 3 7 1 9
OUT> 1 3 5 7 9
Incorrecto:
IN> 9 13 3 11 8 4 10 15
OUT> 3-15
El rango contiene valores que no están en la entrada
IN> 9 13 3 11 8 4 10 15
OUT> 3 4 8 9 10 11 13 15
Todos los valores secuenciales deben representarse como un rango
IN> 9 13 3 11 8 4 10 15
OUT> 3-4 8-9 10-11 13 15
Rango dividido, 8-9
y 10-11
debe ser8-11
IN> 9 13 3 11 8 4 10 15
OUT> 8-9 13 10-11 3-4 15
Salida no ordenada correctamente
REGLAS
- Las lagunas estándar no están permitidas
- Si su idioma tiene una función para hacer esto, no está permitido
- Puedes escribir un programa completo o una función
- el espacio en blanco al final no importa
PUNTUACIÓN
- Menos bytes gana
Respuestas:
Python 2,
123120bytesSi la entrada puede ser una lista como argumento de función, entonces (gracias mbomb007 y xnor por los condicionales)
939081 bytes(77 bytes si el espacio en blanco inicial es aceptable; descarte el final
[1:]
)fuente
str(n)
a`n`
para guardar algunos bytes, si cambia a Python 2.raw_input()
, y puede cambiar'-'+`n`
a`-n`
. Y como ahora está usando Python 2, puede eliminar los paréntesis después deprint
.def f(N):print''.join([' '+`n`,`-n`*(n+1 not in N)][n-1 in N]for n in sorted(N))[1:]
(que se puede jugar más).set(N)
lugar desorted(N)
; esto iterará correctamente de menor a menor cuando use cPython, pero no se garantiza que funcione para todas las implementaciones, por lo que hay algunas dudas sobre si esto es válido o no.JavaScript (ES6):
171154140137bytes¡Gracias edc65 y vihan1086 por los consejos!
pero no funciona en estos casos debido a números de varios dígitos.[...n]
es muy agradableVariantes ES5,
198184183174 bytesMostrar fragmento de código
fuente
[...n]
es mejorRuby,
8684 bytesEsta es una versión ligeramente golfizada de un ejemplo en los documentos para slice_when .
fuente
CJam, 35 bytes
Pruébelo en línea en el intérprete de CJam .
Cómo funciona
fuente
Ruby, 70 bytes
Problemas como estos tienden a hacer que revise la API de Ruby para ver los métodos adecuados, y hoy descubrí uno nuevo:
Array#slice_when
recientemente introducido en Ruby v2.2 y aparentemente destinado a esta situación exacta :)Después de ordenar y dividir adecuadamente la matriz, toma cada sub-matriz y crea una cadena a partir del elemento más alto y más bajo, y luego une toda esta matriz en una cadena.
Ejemplo:
f.call [9,13,3,11,8,4,10,15,6]
huellas dactilares3-4 6 8-11 13 15
fuente
SWI-Prolog,
165162159 bytesBastante mal pero, de nuevo, Prolog es un lenguaje de golf terrible
Ejemplo:
a([9,13,3,11,8,4,10,15,6]).
salidas3-4 6 8-11 13 15
fuente
CJam,
3833 bytesNueva versión, usando ideas y fragmentos de código sugeridos por @Dennis:
Pruébalo en línea
El formato de entrada es una matriz CJam entre corchetes.
La idea básica aquí es que primero resto una secuencia monotónica de la secuencia de entrada ordenada:
En esta diferencia, los valores que forman parte del mismo intervalo tienen el mismo valor. La aplicación del operador CJam RLE a esta diferencia enumera directamente los intervalos.
Los valores secuenciales restados deben agregarse nuevamente durante la salida. No estoy del todo contento con cómo se hace eso en mi código. Sospecho que podría guardar algunos bytes con una forma más elegante de entregar eso.
Para generar la salida de los intervalos, esto utiliza la idea de Dennis de generar un número negativo para el valor final, que se encarga de producir un
-
, y también simplifica la lógica porque solo se necesita agregar / omitir un valor dependiendo del tamaño del intervalo .Explicación:
fuente
l~$_,,.-e`{~T+\_T+:T;,f+(\W>Wf*S}/
-
a la salida sin que aparezca en el código y sin una condición. Ahora lo entiendo: ¡viene de convertir el valor final en un número negativo! Nunca se me habría ocurrido esto, así que me sentiría mal por copiarlo. ¡Trataré de aprender de eso la próxima vez! :)l~$_,,.-e
{~ T + _T +: T; (_ 2 $ + W * Q? S} / `aunque? Eso es mucho más similar a su propio código y pesa solo 33 bytes.CoffeeScript,
178161bytesAl igual que mi respuesta de JavaScript. Necesito averiguar si usar las comprensiones resultará en un código más corto.
Original:
fuente
Python 2,
126122121 BytesSé que esto puede acortarse, simplemente no sé dónde ... Requiere entrada en forma
[#, #, #, #, ..., #]
.fuente
exec
bastante frecuencia.while x<len(l)
conwhile l[x:]
para guardar algunos bytes.Java, 191 bytes
Comprueba los rangos y los imprime en consecuencia. Desafortunadamente, tuve que hacer un caso especial para el último elemento en la matriz ya que el programa terminaría sin imprimir el último número o rango.
fuente
Java,
171162 bytesToma la entrada como una matriz int, devuelve la salida como una lista de cadenas separadas por espacios
fuente