Los australianos adoran los días festivos y la bebida. Ayer, 26 de enero, fue el día de Australia, que es un día festivo. ¡Me alegré de no estar en el trabajo ayer, y ansioso por saber la próxima vez que tenga un día festivo! Desafortunadamente, bebí demasiado y no puedo resolverlo por mí mismo.
Escriba un programa que tome una fecha en notación de fecha / hora australiana (dd / mm) como entrada, y envíe la cantidad de días hasta el próximo día festivo. Como soy residente de Queensland (QLD), solo me interesan los días festivos que afecten a Queenslanders :
25/03 | Viernes Santo
26/03 | Sábado de Pascua
28/03 | Lunes de Pascua
25/04 | Anzac Day
02/05 | Día del Trabajo
03/10 | Cumpleaños de la Reina
25/12 | Día de Navidad
26/12 | Boxing Day
27/12 | Vacaciones de navidad
Tenga en cuenta lo siguiente del sitio:
Vacaciones de navidad
Se agregará un feriado público adicional cuando el día de Año Nuevo, el día de Navidad o el día del boxeo caigan en un fin de semana.
Debido a que el día de Navidad es el domingo, hay un feriado público adicional . El día de Navidad sigue siendo un día festivo.
Como soy una persona madrugadora, debe incluir la fecha actual como un día (ya que esa es la hora más probable que verifique su programa para el próximo día festivo). Es decir, si se ingresa la fecha de un día festivo, su salida debería ser 0
; Si el día anterior a un feriado público se ingresa, su salida será 1
.
Solo me interesan las fechas entre ahora (el 27/01) hasta fin de año. La fecha final que deberá tener en cuenta es el 31/12, donde será su salida 1
(para el día de Año Nuevo).
Las lagunas estándar están prohibidas.
Entrada
- La entrada siempre tendrá 5 caracteres: 4 letras, separadas por un guión
-
o una barra inclinada/
- La entrada solo será una fecha entre el 27/01 y el 31/12
Salida
- El número de días hasta el próximo día festivo en Queensland, Australia, incluida la fecha de entrada: debe ser un número entre
0
y153
(el intervalo más largo) - No hay nuevas líneas ni errores.
Ejemplos
01-05 = 1
02-05 = 0
03-05 = 153
25/12 = 0
26-12 = 0
27/12 = 0
30/12 = 2
31-12 = 1
Esperemos que esto esté claro y no se pierda nada; Sin embargo, esta es mi segunda pregunta, así que agradeceré cualquier comentario y haré todo lo posible para solucionar los problemas lo antes posible.
Respuestas:
Pyth ,
98846267 BytesActualización: se guardaron 14 bytes acortando la lista del recuento de días para los 12 meses para el cálculo del número de días. No he encontrado una buena manera de comprimir la otra lista, ¡aún lo intento!
Actualización2: guardó otros 22 bytes al codificar la lista de los números de día como una cadena base256.
Pruébalo en línea!
Mismo algoritmo que en mi respuesta de Python. Y no tenía que hacer el día del año, así que tuve que hacerlo yo mismo. Crear esas 2 listas para el cálculo del día del año y para los días de vacaciones es bastante costoso ... voy a echarle un vistazo nuevamente e intentar generarlas en menos bytes.
fuente
Visual Basic para aplicaciones, 155 o 118 bytes
Versión 1: independiente del entorno local, 155 bytes
Versión 2: dependiente del entorno local, 118 bytes
El recuento de bytes es para el archivo final .BAS, incluidos los caracteres de salto de línea. Editado fuera del editor estándar de VBA (ya que impone espacios adicionales y formas detalladas de algunas palabras clave), pero importa y funciona sin problemas en cualquier aplicación de Office (para probar el tipo, por ejemplo
? h("10/08")
en una ventana inmediata, o en Excel, usar directamente en una fórmula de celda).(EDITADO) Inicialmente elegí usar
DateSerial
para hacer que la función fuera segura localmente (versión 1). Como vivo en Brasil y, por lo tanto, mi sistema está configurado para usar el formato "dd / mm / aa" para las fechas (al igual que Australia), podría escribir una versión aún más pequeña usando en suCDate
lugar (versión 2).CDate
utiliza la información del sistema local para convertir el texto en fecha. También asumí en esta versión que el código solo se ejecutaría durante 2016 (si se omite el año (-6 bytes)CDate
supone el año actual según el reloj del sistema).El número 42454 en la tercera línea es la suma de 42450 que es la representación numérica del 01/01/2016 en VBA, y 84 que es el día del año para las primeras vacaciones. La matriz contiene el día del año para cada día festivo (incluido 01/01/2017) compensado por -84, ya que esto elimina algunos dígitos. Usando 16 en lugar de 2016 en
DateSerial
quita dos bytes más.Crear una matriz idéntica nueve veces dentro de la iteración es un código "incorrecto", pero funciona y guarda 3 bytes más (uno para el nombre de la matriz y otro para el signo igual fuera del bucle, y uno más para hacer referencia a la matriz dentro del bucle).
Los espacios "faltantes" entre 0 y la siguiente palabra clave en la segunda y cuarta líneas no son necesarios, ya que VBE los reintroduce automáticamente cuando se importa el módulo. Usado desactualizado pero barato
If <...> Goto <linenumber>
para romper el bucle (ambosIf <...> Then Exit For
yIf <...> Then Exit Function
usar más caracteres).También aprovechó el hecho de que el nombre de la función en VBA se comporta como una variable local, y su valor es devuelto automáticamente por la función al final de la ejecución.
fuente
JavaScript (ES6),
131128bytesExplicación
Utiliza el JavaScript incorporado
Date
constructor para convertir la cadena de entrada en varios milisegundos desde la época, luego compara esto con el número de milisegundos para cada día festivo.Lo hace almacenando los días festivos en una matriz como el número de días desde una fecha de referencia. Elegí
2016-01-29
la fecha de referencia porque el número de milisegundos desde la época se puede condensar más corto para esta fecha. Cualquier número de milisegundos entre este día y el siguiente funciona porque el resultado se redondea hacia abajo y mantener el número en el medio evita los efectos del horario de verano (aunque la zona horaria del OP no tiene horario de verano). El número de este día es1453986000000
y redondeándolo a1454000000000
(sumando un par de horas) significa que se puede escribir como1454e9
.Prueba
Esta solución depende de la zona horaria del usuario. Esto funciona en la zona horaria del OP (y mi) (GMT +1000). Si desea probarlo en una zona horaria diferente, añadiendo
numberOfHoursDifferentFromGMT1000 * 60 * 60 * 1000
a la referencia de número de fecha debe trabajar. (por ejemplo, GMT +0430 sería-5.5 * 60 * 60 * 1000 + 1454e9+n*864e5
)Mostrar fragmento de código
fuente
separated with a hyphen - or slash /
es un poco ambigua. Para mí significa que tenemos que lidiar con ambos, pero definitivamente puedo ver tu lado. Supongo que el OP debería aclarar esto.T-SQL,
210,206, 194 bytes(Primera publicación aquí, espero que esto esté bien, pero por favor sé amable :)
La entrada entra
@i
, abastece a ambos/
y-
como separador. Estoy en Australia, así que mi formato de fecha es el mismo que @TasActualización
varchar
parachar
guardar 3 bytes más eliminado un espacio :)Actualización 2 declarar
@c
y asignar sin seleccionarfuente
T-SQL, 296 bytes
Creado como una función con valores de tabla
Usado de la siguiente manera
Una breve explicacion
fuente
JavaScript (ES6), 134 bytes
user81655 todavía me tiene superado por 3 bytes, pero no puedo encontrar ningún otro lugar para sacar algo de aquí. Funciona calculando el número de días transcurridos en lugar de usar Fecha, y luego comparándolo con una serie de compensaciones de vacaciones.
fuente
Python 2,
204185165166 BytesActualización: Golfed ~ 20 Bytes calculando el día del año por mí mismo. Ya no hay necesidad de las largas importaciones :)
Actualización 2: Otros 20 bytes menos al darme cuenta de que puedo tratar los años nuevos como el día 367 y hacer algunos otros pequeños ajustes.
Pruébalo en línea!
Sin golf:
Funciona almacenando el número de días festivos del año en una lista, filtrando los que están antes de la fecha dada, tomando el primer elemento en esa lista filtrada y restando el día del año, que se calculó a partir de la entrada.
fuente
PHP, 116 bytes
Enfoque bastante directo. Almacena los días del año para las vacaciones y los muestra mientras estén en el pasado. Finalmente se resta el día solicitado del año.
Pasado todos los casos de prueba. Se ejecuta desde la línea de comandos y acepta la entrada usando un guión, como:
fuente
Ruby 1.9.3,
155153 bytes¡Después del feriado del día de Navidad, necesitamos nuestro día súper especial 366! Caso similar al @DenkerAffe.
Uso:
fuente
05AB1E , 45 bytes
Puede que ya no sea 2016, pero lo que sea ...;) Todavía se supone que el año es 2016 por ser un año bisiesto
29
para febrero.Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
Vea esta sugerencia mía 05AB1E (secciones ¿Cómo comprimir enteros grandes? Y ¿Cómo comprimir listas enteras? ) Para comprender por qué
•9JRt€ª´Q®Ië•
es10549819042671399072072399
;•9JRt€ª´Q®Ië•368в
es[85,86,88,116,123,277,360,361,362,367]
; y•Σ₁t•
es5354545
.fuente