Probablemente haya visto estas señales en las puertas de varias tiendas:
HORARIO DE APERTURA
lunes-viernes 0900-1800
sábado- domingo 1100-1530
La tarea aquí es generar un signo como ese, agrupando días consecutivos con el mismo horario de apertura, a partir de una lista de horarios de apertura para toda la semana. Tenga en cuenta que la semana se "ajusta" a lo que se considera consecutivo.
Entrada:
- 7 elementos, que representan el horario de apertura de cada día de una semana, comenzando con el lunes.
- Cada elemento es una cadena, en el formulario XXXX-XXXX
Entrada de ejemplo:
0900-1800 0900-1800 0930-1730 0930-1730 0900-1500 1100-1500 1100-1500
- Está bien enviar la entrada como una matriz (por ejemplo, como entrada a una función si no lee desde stdin)
Salida:
- Una lista de horas de apertura, donde los días consecutivos con las mismas horas de apertura se muestran como un rango. Tenga en cuenta que el domingo (el último día) y el lunes (el primer día) también son días consecutivos.
- Un día donde el día no tiene horarios de apertura similares a los días anteriores o posteriores se imprime solo
- Los días se especifican en tres letras minúsculas: lun mar mié jue vie sáb dom
- Recuerde que el primer elemento en la entrada corresponde a mon, al lado de tue, etc.
- Los horarios de apertura se muestran como en la entrada
Dos ejemplos
mon-fri 0900-1800, sat-sun 1100-1500 mon-wed 1030-1530, thu 100-1800, fri-sun 1200-1630
La salida debe ordenarse, de modo que los rangos aparezcan en el orden en que lo hacen los días de la semana. Se prefiere que el lunes sea el primero, pero puede suceder que no sea el primero en un grupo porque la semana termina. En este caso, tue es el primer rango.
tue-fri 0900-1800, sat-mon 1100-1500
No se agrupe a menos que sean consecutivos, aquí el miércoles y el viernes tienen el mismo horario de apertura, pero están separados por un jueves con diferentes horarios de apertura, por lo que se enumeran por sí mismos.
mon-tue 1000-1200, wed 0900-1500, thu 1000-1800, fri 0900-1500, sat-sun 1000-1500
- La salida puede estar separada por comas como los ejemplos aquí, o separada por una nueva línea como en el ejemplo de arriba.
Casos de prueba
La primera línea es entrada, la segunda línea es salida esperada
0900-1800 0900-1800 0900-1800 0900-1800 0900-1800 1100-1500 1100-1500
mon-fri 0900-1800, sat-sun 1100-1500
0900-1800 0900-1800 0900-1800 0930-1700 0900-1800 1100-1500 1100-1500
mon-wed 0900-1800, thu 0930-1700, fri 0900-1800, sat-sun 1100-1500
1100-1500 0900-1800 0900-1800 0900-1800 0900-1800 1100-1500 1100-1500
tue-fri 0900-1800, sat-mon 1100-1500
1100-1500 1100-1500 0900-1800 0900-1800 0900-1800 0900-1800 1100-1500
wed-sat 0900-1800, sun-tue 1100-1500
1200-1500 1100-1500 0900-1800 0900-1800 0900-1800 0900-1800 1100-1500
mon 1200-1500, tue 1100-1500, wed-sat 0900-1800, sun 1100-1500
Reglas
Este es el código de golf, por lo que gana la respuesta más corta en bytes.
Respuestas:
JavaScript (ES6),
182173170163157 bytesGuardado 6 bytes con la ayuda de edc65
Toma datos como una matriz de cadenas e imprime directamente el resultado en la consola:
Formateado y comentado
Casos de prueba
fuente
D='montuewedthufrisatsun'.match(/.../g)
el usoD
como una matriz en lugar de una función debería ahorrar algún byteD()
se puede llamar con-1
(cuando buscamos 'el día antes del lunes'), que funcionasubstr()
pero no funcionaría con una matriz.Lote, 334 bytes
Toma la entrada como parámetros de línea de comando, emite cada grupo en una línea separada. Funciona comparando las horas de cada día con el día anterior, rastreando
f
como el primer día en el grupo,h
como las horas para ese grupo,l
como el último día en el grupo yw
para cuándo el último grupo regresa al comienzo de la semana. Cuando se encuentra una falta de coincidencia, el grupo anterior se imprime a menos que el ajuste semanal esté vigente. Finalmente, cuando se procesan todos los días, el último grupo se ajusta para cualquier ajuste semanal y si todas las horas resultaron iguales antes de salir.0
se usa como marcador de posición porque las cadenas vacías cuestan más bytes para comparar en Batch.fuente
Gelatina ,
87 84 8075 bytes'
rápido, "plano")Estoy bastante seguro de que hay una mejor manera, pero por ahora:
TryiItOnline
¿Cómo?
fuente
JavaScript (ES6),
171169 bytesToma la entrada como una matriz y las salidas a la consola en líneas separadas. Esto es casi exactamente un puerto de mi respuesta Batch;
f
ahora, por defecto, es una cadena vacía, mientras que también puedo usar el valor predeterminadol
yw
para'sun'
(el uso de un valor centinela me ahorró 3 bytes en Batch porque pude fusionar la inicialización enset/a
).fuente
El tocino ,
514496455 bytesEl programa BÁSICO a continuación se muestra con su sangría. Pero sin la sangría, consta de 455 bytes.
La idea es utilizar los horarios como índices de una matriz asociativa. Entonces, cada día representa un bit: lunes = bit 0, martes = bit 1, miércoles = bit 2 y así sucesivamente. Los valores reales para los miembros de la matriz asociativa se calculan por los bits respectivos de los días utilizando un OR binario.
Después de eso, se trata de verificar cuántos bits consecutivos están presentes en los miembros de la matriz asociativa, comenzando con el bit 0.
En caso de que el bit 0 y el bit 6 estén configurados, hay un ajuste de semana. En ese caso, comience a buscar el inicio de la siguiente secuencia de bits, memorizando esta posición de inicio. Imprima el resto de las secuencias, y tan pronto como se alcanza el bit 6, el rango del día debe finalizar con la posición memorizada antes.
Usando las siguientes llamadas para invocar el SUB:
Salida :
fuente