Dada una lista de actividades y su fecha / hora de inicio, elabore un calendario de arte ASCII que muestre las actividades en los días apropiados. Se garantiza que todas las actividades se realizarán en el mismo mes, no habrá dos actividades el mismo día, y se garantiza que todas las actividades encajan en el cuadro del calendario.
El calendario tiene la fecha en la esquina superior izquierda de cada cuadro, los cuadros tienen 9 espacios de ancho por 5 espacios de alto, rodeados por -
y |
. La abreviatura de dos letras para el día de la semana está centrada sobre la primera fila, y las semanas comienzan con el domingo.
Por ejemplo, dadas las siguientes actividades:
10/5/2018 - 9:00am - Sandbox calendar challenge
10/9/2018 - 9:00am - Post challenge to main
10/10/2018 - 10:00am - Profit
10/31/2018 - 7:30pm - Halloween party
Salida de este calendario correspondiente:
Su Mo Tu We Th Fr Sa
-----------------------------------------------------------------------
| |1 |2 |3 |4 |5 |6 |
| | | | | |9:00am | |
| | | | | |Sandbox | |
| | | | | |calendar | |
| | | | | |challenge| |
-----------------------------------------------------------------------
|7 |8 |9 |10 |11 |12 |13 |
| | |9:00am |10:00am | | | |
| | |Post |Profit | | | |
| | |challenge| | | | |
| | |to main | | | | |
-----------------------------------------------------------------------
|14 |15 |16 |17 |18 |19 |20 |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
-----------------------------------------------------------------------
|21 |22 |23 |24 |25 |26 |27 |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
-----------------------------------------------------------------------
|28 |29 |30 |31 | | | |
| | | |7:30pm | | | |
| | | |Halloween| | | |
| | | |party | | | |
| | | | | | | |
-----------------------------------------------------------------------
Aclaraciones
- Las palabras de programación (que coinciden con [A-Za-z] +) se delimitarán con un solo espacio entre ellas (como en el ejemplo).
- Dividir el texto en límites de palabras es suficiente. No hay necesidad de separar palabras.
- Si febrero comienza un domingo en un año no bisiesto, solo tendrá cuatro filas de calendario.
- Si un mes de 31 días (por ejemplo, agosto) comienza tarde en la semana, es posible que deba generar seis filas de calendario.
E / S y reglas
- Su código debe manejar fechas al menos entre
0001-01-01
y9999-12-31
en el calendario gregoriano, incluidos los años bisiestos, según corresponda. Por ejemplo, si se le da entrada2016-02-13 9:00am Test
, el calendario de salida debería tener el 29 de febrero. - El formato de fecha de entrada puede estar en cualquier formato deseado. ISO 8601, un
datetime
objeto, una cadena con un formato particular, etc. El análisis de entrada no es la parte interesante de este desafío. - La entrada y salida pueden ser por cualquier método conveniente .
- Las nuevas líneas iniciales / finales u otros espacios en blanco son opcionales, siempre que los caracteres se alineen adecuadamente.
- Un programa completo o una función son aceptables. Si es una función, puede devolver el resultado en lugar de imprimirlo.
- La salida puede ser a la consola, devuelta como una lista de cadenas, devuelta como una sola cadena, etc.
- Las lagunas estándar están prohibidas.
- Este es el código de golf, por lo que se aplican todas las reglas habituales de golf, y gana el código más corto (en bytes).
1752-09-02 - 09:00am - Wife's Birthday Tomorrow (14th!)
Respuestas:
JavaScript (ES8),
380...321320 bytesToma entrada como
(y,m,e)
donde:y
es el añom
es el mes, 0 indexadoe
es un objeto cuyas claves son los días y cuyos valores son los eventos en[hour, task]
formatoPruébalo en línea!
¿Cómo?
A continuación hay algunas partes importantes en el código.
Encabezamiento
La línea de encabezado se genera con:
Cuando
split()
se usa con una expresión regular que contiene un grupo de captura, este grupo se incluye en la matriz de salida. En este caso, da:Unimos esta matriz con 4 espacios, lo que lleva a:
que es exactamente lo que queremos
Estructura del mes
Formateo de eventos
El siguiente código se usa para formatear un evento.
fuente
Python 2 ,
326324315312307 bytesPruébalo en línea!
La misma entrada que la respuesta JS de Arnauld :
Toma entrada como
(y,m,e)
donde:y
es el añom
es el mes, 1 indexadoe
es un objeto cuyas claves son los días y cuyos valores son los eventos en(hour, task)
formatofuente
Carbón ,
215206 bytesPruébalo en línea! El enlace es a la versión detallada del código. Toma fechas en formato d / m / aaaa. Explicación:
Ingrese el primer evento.
Extraer la fecha y dividir en
/
s.Convertir a meses desde marzo, 1 a. C. Quiero calcular el día de la semana del primero del mes próximo y del mes actual, y trabajar en meses es más fácil que mantener los meses y años separados y llevarlos al final del año, además de que también me permite comenzar a contar meses que comienzan en marzo en lugar de enero, lo cual es requerido por la congruencia de Zeller.
Use una congruencia de Zeller modificada para extraer el día de la semana del primer día del próximo mes y este mes. La parte básica se basa en el hecho de que el número de días desde el 30 de octubre del año anterior hasta el 1 de un mes dado donde
m = 4
para marzo ym = 14
enero del año siguiente viene dado por la fórmulam * 153 / 5
, sin embargo, podemos restar 140 porque solo preocuparse por el día de la semana. Luego queda hacer ajustes debido al año; cada año agrega un día, cada 4to año agrega un día adicional, cada 100 años resta un día y cada 400 años agrega un día nuevamente. (Como estoy trabajando en meses, estos valores se multiplican por 12). Más bien convenientemente, esto me da directamente la respuesta en términos de una semana indexada el domingo (normalmente agregaría el día del mes y comenzaría a contar el sábado).Niegue el día de la semana y guárdelo como el día actual del mes.
Calcule el número de días en el mes a partir del día de la semana de los dos meses.
Salida de los encabezados del día.
Imprima la fila superior de
-
s.Lazo hasta el último día del mes ha salido.
Mueva el cursor al inicio de la siguiente fila.
Procesar 7 días a la vez.
Imprima la columna de
|
s a la izquierda.Incremente el día actual del mes.
Si el día actual del mes es el día del evento actual, ...
... extraer las otras partes del evento, ...
... rellene el tiempo con 9 espacios y guárdelo con una cadena vacía como una lista, ...
... dividir la descripción en espacios y recorrerlos, ...
... agregando cada palabra a la palabra anterior si cabe; ...
... muestra el tiempo y la descripción (
Pδ
no funciona, ¿podría ser un error de carbón?), ...... e ingrese el próximo evento.
Si el día actual del mes está comprendido entre 1 y el último día del mes, imprímalo, de lo contrario, solo genere suficientes espacios para pasar al día siguiente.
Al final de la semana, imprima la columna derecha de
|
sy la fila inferior de-
s.fuente
year-1
deben usarse en lugar deyear
ymonth+12
deben usarse en lugar demonth
. ¿O simplificó de alguna manera el algoritmo que mencioné en esta respuesta 05AB1E que es igual al de Wikipedia ?Java (JDK) ,
538439428425 bytesPosiblemente la solución de Code Golf más larga que he publicado. Todavía trato de jugar golf desde aquí, pero es una lucha.
Se las arregló para eliminar 99 bytes cambiando el formato de entrada y utilizando algunos análisis de expresiones regulares y otros 11 de bits varios.
¡3 bytes adicionales de descuento gracias a Kevin!
Inspirándose en otras respuestas, toma datos como el año, mes y un Mapa de días para una Cadena que representa la hora y el evento en el formato
<time>-<event>
.Pruébalo en línea!
Sin golf
fuente
&&(i=1)<2?7:0
puede ser?7*(i=1):0
para guardar 3 bytes.b>x|i++<6?0:7*(i=1)
lugar deb<=x&++i>6?7*(i=1):0
y enc*i>1|b<1|b>x?c<2&e!=null?e.split("-")[i-2]:" ":b+""
lugar dec*i<2&b>0&b<=x?b+"":c<2&e!=null?e.split("-")[i-2]:" "
Rojo ,
674651bytesPruébalo en línea!
Más legible:
fuente
if e = 0[e: 7]
se puede quitar, ¿verdad? Usase: 1 + c/weekday % 7
, pore
lo que siempre estará en el rango[1, 7]
.1 +
Primero sucede ... Ok, veo mi error Estoy acostumbrado%
y/
tengo prioridad sobre el operador+
.