Les Australiens adorent les jours fériés et boire. Hier, le 26 janvier, c'était le jour de l'Australie, qui est un jour férié. J'étais content de ne pas être au travail hier, et impatient de savoir la prochaine fois que j'aurai un jour férié! Malheureusement, j'avais un peu trop à boire et je ne suis pas en mesure de m'en sortir moi-même.
Écrivez un programme qui prendra une date en notation date / heure australienne (dd / mm) en entrée et affichera le nombre de jours jusqu'au prochain jour férié. Parce que je suis un résident du Queensland (QLD), je ne suis intéressé que par les jours fériés qui affectent les Queenslanders :
25/03 | Vendredi Saint
26/03 | Samedi de Pâques
28/03 | Lundi de Pâques
25/04 | Jour de l'Anzac
02/05 | Fête du travail
03/10 | Anniversaire de la Reine
25/12 | Jour de Noël
26/12 | Boxing Day
27/12 | Vacances de Noël
Notez ce qui suit sur le site:
Vacances de Noël
Un jour férié supplémentaire à ajouter lorsque le jour de l'An, le jour de Noël ou le lendemain de Noël tombe un week-end.
Parce que le jour de Noël est le dimanche, il y a un jour férié supplémentaire . Le jour de Noël est toujours un jour férié.
Parce que je suis une personne du matin, vous devez inclure la date actuelle comme un jour (car c'est le moment le plus probable pour lequel je vérifierai votre programme pour le prochain jour férié). Autrement dit, si la date d'un jour férié est entrée, votre sortie devrait être 0
; si la veille d'un jour férié est entré, votre sortie sera 1
.
Je ne m'intéresse qu'aux dates d' ici (le 27/01) jusqu'à la fin de l'année. La date finale dont vous devrez tenir compte est le 31/12 où votre sortie sera 1
(pour le jour de l'an).
Les failles standard sont interdites.
Contribution
- L'entrée sera toujours de 5 caractères: 4 lettres, séparées par un trait d'union
-
ou une barre oblique/
- L'entrée ne sera qu'une date entre le 27/01 et le 31/12
Production
- Le nombre de jours avant le prochain jour férié dans le Queensland en Australie, y compris la date d'entrée: doit être un nombre compris entre
0
et153
(l'écart le plus long) - Aucune nouvelle ligne ou erreur
Exemples
01-05 = 1
02-05 = 0
03-05 = 153
25/12 = 0
26-12 = 0
27/12 = 0
30/12 = 2
31-12 = 1
Espérons que ce soit clair et que rien ne manque; cependant, c'est ma deuxième question, donc j'apprécierai tout commentaire et ferai de mon mieux pour résoudre les problèmes dès que possible.
Réponses:
Pyth ,
98846267 octetsMise à jour: économisé 14 octets en raccourcissant la liste du nombre de jours pour les 12 mois pour le calcul du nombre de jours. Je n'ai pas trouvé un bon moyen de compresser l'autre liste, tout en essayant!
Update2: enregistré 22 octets supplémentaires en codant à la fin la liste des numéros de jour sous forme de chaîne base256.
Essayez-le en ligne!
Même algorithme que dans ma réponse Python. Et pas de fonction intégrée pour avoir le jour de l'année, j'ai donc dû le faire moi-même. La création de ces 2 listes pour le calcul du jour de l'année et pour les jours de vacances est assez coûteuse ... je vais y jeter un coup d'œil et essayer de les générer en moins d'octets.
la source
Visual Basic pour Applications, 155 ou 118 octets
Version 1 - indépendante des paramètres régionaux, 155 octets
Version 2 - dépendante des paramètres régionaux, 118 octets
Le nombre d'octets correspond au fichier .BAS final, y compris les caractères de saut de ligne. Édité en dehors de l'éditeur VBA standard (car il impose des espaces supplémentaires et des formes verbeuses de certains mots clés) - mais importe et s'exécute sans problème sur n'importe quelle application Office (pour tester le type, par exemple
? h("10/08")
dans une fenêtre immédiate ou dans Excel, utiliser directement dans une formule de cellule).(MODIFIÉ) Au départ, j'ai choisi d'utiliser
DateSerial
pour rendre la fonction locale sûre (version 1). Comme je vis au Brésil et donc mon système est configuré pour utiliser le format "jj / mm / aa" pour les dates (comme en Australie), je pourrais écrire une version encore plus petite en utilisant à laCDate
place (version 2).CDate
utilise les informations sur les paramètres régionaux du système pour convertir le texte en date. J'ai également supposé dans cette version que le code ne serait exécuté qu'en 2016 (si l'année est omise (-6 octets)CDate
suppose l'année en cours selon l'horloge système).Le nombre 42454 sur la troisième ligne est la somme de 42450 qui est la représentation numérique du 01/01/2016 sur VBA, et 84 qui est le jour de l'année pour le premier jour férié. Le tableau contient le jour de l'année pour chaque jour férié (y compris le 01/01/2017) compensé par -84 car cela enlève quelques chiffres. L'utilisation de 16 au lieu de 2016 sur
DateSerial
supprime deux octets supplémentaires.Créer un tableau identique neuf fois à l'intérieur de l'itération est un "mauvais" code, mais fonctionne et enregistre 3 octets supplémentaires (un pour le nom du tableau et un pour le signe égal à l'extérieur de la boucle, et un de plus pour référencer le tableau à l'intérieur de la boucle).
Les espaces "manquants" entre 0 et le mot-clé suivant sur les deuxième et quatrième lignes ne sont pas nécessaires car ils sont réintroduits automatiquement par VBE lors de l'importation du module. Utilisé obsolète mais bon marché
If <...> Goto <linenumber>
pour rompre la boucle (les deuxIf <...> Then Exit For
etIf <...> Then Exit Function
utiliser plus de caractères).A également profité du fait que le nom de la fonction dans VBA se comporte comme une variable locale, et sa valeur est automatiquement retournée par la fonction en fin d'exécution.
la source
JavaScript (ES6),
131128 octetsExplication
Utilise le constructeur intégré JavaScript
Date
pour convertir la chaîne d'entrée en un nombre de millisecondes depuis l'époque, puis compare cela avec le nombre de millisecondes pour chaque jour férié.Pour ce faire, il stocke les jours fériés dans un tableau en tant que nombre de jours depuis une date de référence. J'ai choisi
2016-01-29
la date de référence car le nombre de millisecondes depuis l'époque peut être condensé le plus court pour cette date. N'importe quel nombre de millisecondes entre ce jour et le suivant fonctionne car le résultat est arrondi vers le bas, et garder le nombre au milieu évite les effets de l'heure d'été (bien que le fuseau horaire de l'OP n'ait pas d'heure d'été). Le nombre de cette journée est1453986000000
et arrondi à1454000000000
(en ajoutant quelques heures) signifie qu'il peut être écrit comme1454e9
.Tester
Cette solution dépend du fuseau horaire de l'utilisateur. Cela fonctionne dans le fuseau horaire de l'OP (et mon) (GMT +1000). Si vous souhaitez le tester dans un autre fuseau horaire, l'ajout
numberOfHoursDifferentFromGMT1000 * 60 * 60 * 1000
au numéro de date de référence devrait fonctionner. (par exemple, GMT +0430 serait-5.5 * 60 * 60 * 1000 + 1454e9+n*864e5
)Afficher l'extrait de code
la source
separated with a hyphen - or slash /
est un peu ambigüe. Pour moi, cela signifie que nous devons faire face aux deux, mais je peux certainement voir votre côté. Je suppose que le PO devrait clarifier cela.T-SQL,
210,206, 194 octets(Premier post ici, j'espère que ça va, mais soyez gentil :)
L'entrée entre
@i
, s'adresse aux deux/
et-
comme séparateur. Je suis en Australie, donc mon format de date est le même que @TasMettre
varchar
à jour pourchar
enregistrer 3 octets et supprimer un espace :)Mettre à jour 2 déclarer
@c
et attribuer sans sélectionla source
T-SQL, 296 octets
Créé comme une fonction de valeur de table
Utilisé de la manière suivante
Une brève explication
la source
JavaScript (ES6), 134 octets
user81655 m'a toujours battu de 3 octets, mais je ne trouve nulle part ailleurs pour presser quoi que ce soit d'ici. Fonctionne en calculant le nombre de jours écoulés au lieu d'utiliser Date, puis en le comparant à un tableau de compensations de vacances.
la source
Python 2,
204185165 165166 octetsMise à jour: golfé par ~ 20 octets en calculant le jour de l'année par moi-même. Plus besoin d'importations longues :)
Mise à jour 2: encore 20 octets de moins en réalisant que je peux traiter les nouvelles années comme le jour 367 et en faisant d'autres petits ajustements.
Essayez-le en ligne!
Non golfé:
Fonctionne en stockant le nombre de jours fériés de l'année dans une liste, en filtrant ceux qui sont avant la date donnée, en prenant le premier élément de cette liste filtrée et en soustrayant le jour de l'année, qui obtenu calculé à partir de l'entrée.
la source
PHP, 116 octets
Approche assez simple. Il stocke les jours de l'année pour les vacances et les affiche tant qu'ils sont dans le passé. Enfin, le jour de l'année demandé est soustrait.
Passé tous les cas de test. S'exécute à partir de la ligne de commande et accepte l'entrée à l'aide d'un trait d'union, comme:
la source
1.9.3 rubis,
155153 octetsAprès les vacances de Noël, nous avons besoin de notre 366 super spécial! Cas similaire à @DenkerAffe.
Usage:
la source
05AB1E , 45 octets
Ce n'est peut-être plus 2016, mais peu importe ..;) Suppose toujours que l'année est 2016 pour être une année bissextile avec
29
pour février.Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
Voir cette astuce de mes 05AB1E (sections Comment compresser les grands entiers? Et comment les listes entières Compresser? ) Pour comprendre pourquoi
•9JRt€ª´Q®Ië•
est10549819042671399072072399
;•9JRt€ª´Q®Ië•368в
est[85,86,88,116,123,277,360,361,362,367]
; et•Σ₁t•
est5354545
.la source