Trouvez la date la plus proche d'une date cible pour un jour de la semaine donné.
Par exemple, étant donné une date 20161219
et un jour de la semaine de Friday (6)
, la réponse est 20161216
.
Un autre exemple, étant donné une date 20161219
et un jour de semaine Wednesday (4)
, la réponse est 20161221
.
Un dernier exemple, étant donné une date 20161219
et un jour de semaine Monday (2)
, la réponse est 20161219
.
Règles:
- Le format de date pour l'entrée et la sortie doit correspondre. Dans les exemples, j'ai utilisé
yyyymmdd
, mais vous pouvez utiliser n'importe quel format tant que l'année (au moins deux chiffres), le mois et le jour du mois sont "lisibles par l'homme". - Le jour de la semaine est entré sous forme d'entier. Dans mon exemple, le dimanche est le premier jour de la semaine, c'est donc le jour du numéro de semaine
1
. Vous pouvez avoir n'importe quel numéro de jour de la semaine, tant que vous le notez lorsqu'il diffère de l'exemple. - Les années 1970 à 2030 doivent être adaptées.
- Les outils de date et les bibliothèques de langue commune sont autorisés, mais le crédit de rue est donné à ceux qui choisissent de ne pas les utiliser.
- Le moins d' octets gagne.
Réponses:
Perl 6 , 46 octets
Un lambda qui accepte deux arguments: une chaîne de date au
yyyy-mm-dd
format et un numéro de jour de semaine entre1
= lundi et7
= dimanche.Explication:
En utilisant le format de date et de jour de semaine utilisé dans les exemples, ce serait 88 octets:
la source
Perl 6 , 83 octets
Essayez-le
Étendu
la source
JavaScript (ES6), 93 octets
Utilise le
%Y-%m-%d
format de date. Si%a %b %d %Y
c'est un format de date acceptable, alors pour 82 octets:Je pourrais économiser 2 octets supplémentaires en exigeant dimanche = 10 à samedi = 16, mais c'est un jour stupide de la cartographie de la semaine. Version précédente de
142141 octets (merci à @Guedes) qui utilisait le format de date spécifique YYYYMMDD, avec son explication:Cela semble beaucoup trop long. Explication: Premièrement, insère
-
s dans la date pour la mettre au format ISO quinew Date
peut ensuite être analysée. Ensuite, compare le jour souhaité avec le jour réel pour obtenir une valeur entre-3
et3
pour le décalage réel. La magie9
vient de7
(parce qu'il%
s'agit du CPU modulo, pas du vrai modulo) plus3
(pour l'-3
offset) moins1
(parce qu'iln
est indexé 1 et indexégetDay
0). La date est ensuite reconvertie au format ISO et les caractères indésirables supprimés.la source
.replace(/(?=..(..)?$)/g,'-')
Python,
150149 octetsOouuf, 149. repl.it
Sans nom fonction qui prend une chaîne
s
, la date comme spécifié ( en utilisant la chaîne de formatt='%Y%m%d'
pour l'entrée et la sortie) et un certain nombre de [1,7],n
.Inspecte les sept jours, de trois jours avant à trois jours après celui donné pour le jour de la semaine demandé.
La semaine
datetime
commence le lundi et est basée sur zéro, donc le test est(n-2)%7==d.weekday()
.la source
Bash + coreutils, 50
Essayez-le en ligne .
date -d$1 +%u
donne le jour de la semaine (1..7); 1 est lundi3 + 7 - 1
. Le 3 ajuste la plage d'entrée pour la plage [-3, 3] et est à nouveau soustrait après le modulo. Le 7 est requis car bash modulo est le même que CPU modulo et peut donner des résultats -ve - en ajoutant 7 ajuste dans la bonne plage. Le -1 est parce que dans l'entrée, 1 est dimanche, mais avec la sortie% u, 1 est lundi.date
analyse ensuite<input date> + <magic factor>days
et le présente au format AAAAMMJJ.la source
Langage macro SAS, 110 octets
Un langage de golf terrible mais voici l'explication (de l'intérieur):
Créez une macro
s
qui accepte une entrée de dated
et un jour de semaine numériquea
.%eval(%sysfunc(putn(&d,8.))-4)
Convertit ensuite la date en une date numérique SAS et la diminue de 4 jours. Laintnx
fonction renvoie ensuite l'occurrence suivante du jour de la semaine spécifié.putn
formate ensuite la date en aaaammjj et%put
imprime la sortie dans le journal.la source
Mathematica,
8549 octetsLe format d'entrée pour les dates est soit une liste comme
{2016, 12, 16}
ou une réelleDateObject
(je pense que quelques autres fonctionnent aussi, mais je les ai testées). Dans les deux cas, le format de sortie correspondra automatiquement. La numérotation des jours commence1
le lundi.L'idée est de calculer la différence entre le jour de la semaine en entrée et le jour de la semaine cible avec
#2-#~DateValue~"ISOWeekDay"
, puis de le mapper en[-3, 3]
utilisant un modulo avec décalage (c.Mod[...,7,-3]
-à-d.). Le résultat est simplement ajouté à la date d'entrée (l'unité par défaut pour l'ajout d'objet de date est jours).la source
R,
119 7756 octetsFonction sans nom qui prend deux entrées, la date
D
(chaîne) et le jourd
(numérique).Utilise la fonction
wday()
dulubridate
package. Il peut facilement convertir desDate
objets en jours de la semaine en1
étant traité comme dimanche par défaut.Edit: I / O est maintenant la valeur par défaut de la
as.Date()
fonction:"YYYY-mm-dd"
Non golfé et expliqué
Modifier: crée maintenant une séquence de
+-3
jours pour laquelle un jour de semaine donné est garanti. Par la suite, nous n'avons à faire correspondre qu'un seul jour, ce qui a rendu le problème beaucoup plus facile.la source