Étant donné une liste d'activités et leur date / heure de début, sortez un calendrier ASCII-art montrant les activités les jours appropriés. Toutes les activités sont garanties pour être dans le même mois, il n'y aura pas deux activités le même jour, et toutes les activités sont garanties pour s'inscrire dans la boîte de calendrier.
Le calendrier a la date dans le coin supérieur gauche de chaque boîte, les boîtes font 9 espaces de large sur 5 espaces de haut, entourées de -
et |
. L'abréviation à deux lettres du jour de la semaine est centrée au-dessus de la première ligne et les semaines commencent par le dimanche.
Par exemple, compte tenu des activités suivantes:
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
Sortez ce calendrier correspondant:
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 | | | |
| | | | | | | |
-----------------------------------------------------------------------
Clarifications
- Les mots de planification (correspondant à [A-Za-z] +) seront délimités par un seul espace entre eux (comme dans l'exemple).
- Le fractionnement du texte sur les limites des mots est suffisant. Pas besoin de couper les mots.
- Si février commence un dimanche d'une année non bissextile, vous n'aurez que quatre lignes de calendrier.
- Si un mois de 31 jours (par exemple, août) commence tard dans la semaine, vous devrez peut-être afficher six lignes de calendrier.
E / S et règles
- Votre code doit gérer les dates au moins entre
0001-01-01
et9999-12-31
dans le calendrier grégorien, y compris les années bissextiles, le cas échéant. Par exemple, si une entrée est donnée2016-02-13 9:00am Test
, le calendrier de sortie doit avoir le 29 février. - Le format de date d'entrée peut être dans n'importe quel format souhaité. ISO 8601, un
datetime
objet, une chaîne particulièrement formatée, etc. L'analyse syntaxique d'entrée n'est pas la partie intéressante de ce défi. - L'entrée et la sortie peuvent se faire par n'importe quelle méthode pratique .
- Les sauts de ligne de début / fin ou d'autres espaces sont facultatifs, à condition que les caractères s'alignent correctement.
- Un programme complet ou une fonction sont acceptables. S'il s'agit d'une fonction, vous pouvez renvoyer la sortie plutôt que de l'imprimer.
- La sortie peut être vers la console, retournée sous forme de liste de chaînes, retournée sous forme de chaîne unique, etc.
- Les failles standard sont interdites.
- Il s'agit de code-golf, donc toutes les règles de golf habituelles s'appliquent et le code le plus court (en octets) l'emporte.
1752-09-02 - 09:00am - Wife's Birthday Tomorrow (14th!)
Réponses:
JavaScript (ES8),
380…321320 octetsPrend l'entrée comme
(y,m,e)
où:y
est l'annéem
est le mois, indexé 0e
est un objet dont les clés sont les jours et dont les valeurs sont les événements au[hour, task]
formatEssayez-le en ligne!
Comment?
Voici quelques parties importantes du code.
Entête
La ligne d'en-tête est générée avec:
Lorsqu'il
split()
est utilisé avec une expression régulière contenant un groupe de capture, ce groupe est inclus dans le tableau de sortie. Dans ce cas, cela donne:Nous rejoignons ce tableau avec 4 espaces, conduisant à:
c'est exactement ce que nous voulons.
Structure du mois
La fonction d'assistance construit une date à partir de l'année d'entrée et du mois d'entrée (qui sont constants) et du jour (qui est dynamique). Son paramètre est un nom de méthode, qui permet d'extraire soit le jour de la semaine soit le mois.g y m ré
Il est d'abord utilisé pour identifier le jour de la semaine du premier jour du mois, afin que nous puissions revenir au dernier dimanche à partir de là. Il est ensuite utilisé pour détecter quand nous rentrons le mois correct et quand nous le quittons (ces informations sont stockées dans le booléen ).X
Formatage d'événement
Le code suivant est utilisé pour formater un événement.
la source
Python 2 ,
326324315312307 octetsEssayez-le en ligne!
Même entrée que la réponse JS d'Arnauld :
Prend l'entrée comme
(y,m,e)
où:y
est l'annéem
est le mois, indexé 1e
est un objet dont les clés sont les jours et dont les valeurs sont les événements au(hour, task)
formatla source
Charbon de bois ,
215206 octetsEssayez-le en ligne! Le lien est vers la version détaillée du code. Prend les dates au format j / m / aaaa. Explication:
Saisissez le premier événement.
Extraire la date et diviser sur
/
s.Convertir en mois depuis mars, 1 av. Je veux calculer le jour de la semaine du premier du mois suivant et du mois en cours, et travailler en mois est plus facile que de garder les mois et les années séparés et de les transporter à la fin de l'année, et cela me permet également de commencer à compter mois commençant en mars au lieu de janvier, ce qui est requis par la congruence de Zeller.
Utilisez une congruence de Zeller modifiée pour extraire le jour de la semaine du premier jour du mois suivant et ce mois-ci. La partie de base repose sur le fait que le nombre de jours entre le 30 octobre de l'année précédente et le 1er d'un mois donné où
m = 4
pour mars etm = 14
janvier de l'année suivante est donné par la formulem * 153 / 5
, cependant on peut soustraire 140 car on ne fait que attention au jour de la semaine. Il reste alors à procéder aux ajustements dus à l'année; chaque année ajoute un jour, chaque 4e année ajoute un jour supplémentaire, chaque 100e année soustrait un jour et chaque 400e année ajoute à nouveau un jour. (Comme je travaille en mois, ces valeurs sont toutes multipliées par 12.) De manière assez pratique, cela me donne directement la réponse en termes de semaine indexée le dimanche (normalement, vous ajoutez le jour du mois et commencez à compter le samedi).Annulez le jour de la semaine et enregistrez-le comme jour du mois en cours.
Calculez le nombre de jours du mois à partir du jour de la semaine des deux mois.
Sortez les en-têtes de jour.
Imprimez la rangée supérieure du par
-
.Boucle jusqu'au dernier jour du mois.
Déplacez le curseur au début de la ligne suivante.
Traitez 7 jours à la fois.
Imprimez la colonne de
|
s à gauche.Incrémentez le jour en cours du mois.
Si le jour actuel du mois est le jour de l'événement en cours, ...
... extraire les autres parties de l'événement, ...
... pad le temps à 9 espaces et l'enregistrer et une chaîne vide comme une liste, ...
... diviser la description sur les espaces et les parcourir, ...
... en ajoutant chaque mot au mot précédent s'il convient; ...
... afficher l'heure et la description (
Pδ
ne fonctionne pas, peut-être un bug de charbon de bois?), ...... et saisissez le prochain événement.
Si le jour actuel du mois est compris entre 1 et le dernier jour du mois, affichez-le, sinon affichez juste assez d'espaces pour passer au jour suivant.
À la fin de la semaine, imprimez la colonne de droite de
|
s et la ligne inférieure de-
s.la source
year-1
devraient être utilisés à la place deyear
etmonth+12
devraient être utilisés à la place demonth
. Ou avez-vous simplifié en quelque sorte l'algorithme que j'ai mentionné dans ma réponse 05AB1E qui est égale à celle de Wikipedia ?Java (JDK) ,
538439428425 octetsProbablement la plus longue solution Code Golf que j'ai jamais publiée. J'essaie toujours de jouer au golf à partir d'ici, mais c'est un combat.
Géré pour supprimer 99 octets en modifiant le format d'entrée et en utilisant une analyse syntaxique regex, et 11 autres à partir de bits divers.
3 octets de plus grâce à Kevin!
S'inspirant d'autres réponses, il prend comme année, mois et une carte des jours une chaîne représentant l'heure et l'événement dans le format
<time>-<event>
.Essayez-le en ligne!
Non golfé
la source
&&(i=1)<2?7:0
peut être?7*(i=1):0
d'économiser 3 octets.b>x|i++<6?0:7*(i=1)
placeb<=x&++i>6?7*(i=1):0
et à lac*i>1|b<1|b>x?c<2&e!=null?e.split("-")[i-2]:" ":b+""
place dec*i<2&b>0&b<=x?b+"":c<2&e!=null?e.split("-")[i-2]:" "
Rouge ,
674651 octetsEssayez-le en ligne!
Plus lisible:
la source
if e = 0[e: 7]
peut être retiré, non? Vous utiliseze: 1 + c/weekday % 7
, donce
sera toujours dans la plage[1, 7]
.1 +
premier arrive .. Ok, je vois mon erreur. J'ai l'habitude%
et la/
priorité des opérateurs est terminée+
.