Le lundi 31 octobre, c'est Halloween. Et cela m'a fait réfléchir - je me demande quels autres mois le dernier jour du mois est aussi un lundi?
Contribution
- Un entier positif dans n'importe quel format pratique représentant une année
10000 > y > 0
,. - L'entrée peut être complétée par des zéros (par exemple,
0025
pour l'année25
) si nécessaire.
Sortie
- Une liste des mois de cette année où le dernier jour du mois est un lundi.
- Il peut s'agir de noms de mois (par exemple,
January, March, October
), ou de noms abrégés (Jan, Mar, Oct
), ou de nombres (1, 3, 10
), de lignes distinctes ou d'une liste ou délimités, etc., tant que cela n'est pas ambigu pour le lecteur. - Le format de sortie doit être cohérent:
- Pour toutes les entrées (ce qui signifie que vous ne pouvez pas générer de noms de mois pour certaines entrées et de numéros de mois pour d'autres entrées)
- Ainsi que cohérent par sortie (ce qui signifie que vous ne pouvez pas produire
1
pourJanuary
dans la même sortie queJul
pourJuly
) - Fondamentalement, choisissez un format et respectez-le.
Règles
- Supposons le calendrier grégorien pour les entrées / sorties, même jusqu'à
y = 1
. - Les années bissextiles doivent être correctement prises en compte (pour rappel: chaque année divisible par 4, sauf les années non divisibles par 100, sauf si elles sont également divisibles par 400 - 1700, 1800, 1900, toutes n'étaient pas des années bissextiles, mais 2000 l'était).
- Vous pouvez utiliser tous les outils intégrés ou autres outils de calcul de date que vous aimez.
- 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.
- 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.
Exemples
1 --> Apr, Dec
297 --> May
1776 --> Sep
2000 --> Jan, Jul
2016 --> Feb, Oct
3385 --> Jan, Feb, Oct
Réponses:
Dyalog APL avec le cal de dfns , version 15.0: 22; Version 16.0: 19 octets
La fonction cal est livrée avec une installation par défaut, entrez simplement
)copy dfns
.Version 15.0:
∊⎕{⍵/⍨2=≢⍎⊢⌿cal⍺⍵}¨⍳12
∊
enrôler (aplatir)⎕{
...}¨
entrée numérique comme argument de gauche pour la fonction anonyme suivante, en prenant chacune des valeurs du côté droit comme argument de droite à son tour⍵/⍨
l'argument if (donne une liste vide sinon)2=
deux (à savoir dimanche et lundi) est égal à≢
le décompte de⍎
les chiffres⊢⌿
la rangée la plus basse decal
le calendrier pour⍺⍵
année argument de gauche, mois argument de droite, ce dernier étant⍳12
1 à 12Version 16.0:
⍸2=⎕{≢⍎⊢⌿cal⍺⍵}¨⍳12
⍸
les indices où2=
deux égaux (à savoir dimanche et lundi)⎕{
...}¨
entrée numérique comme argument de gauche pour la fonction anonyme suivante, en prenant chacune des valeurs du côté droit comme argument de droite à son tour≢
le décompte de⍎
les chiffres⊢⌿
la rangée la plus basse decal
le calendrier pour⍺⍵
année argument de gauche, mois argument de droite, ce dernier étant⍳12
1 à 12la source
JavaScript (Firefox 30+),
11210910395 95 octetsRegardez ma, pas intégré!
Voici une version ES6 de 107 octets:
Et voici ma précédente tentative,
123113 octets d'ES6:Explication
Le jour de la semaine d'une année particulière est calculé comme suit:
En d'autres termes:
y
.y
(y>>2
).y
(y/100|0
).y
; c'est 1/4 dey/100|0
, donc nous utilisons*3/4|0
.Ensuite, nous modulons le résultat par 7. Si nous laissons
0
le dimanche,1
le lundi, etc., le résultat correspond au jour de la semaine du 31 décembre de cette année. Par conséquent, pour décembre, nous voulons vérifier si le résultat est1
. Cela nous donne le dernier caractère de la chaîne.Le dernier jour de novembre est 31 jours avant le dernier jour de décembre. Cela signifie que pour que le dernier jour de novembre soit un lundi, le 31 décembre doit être un
(1 + 31) % 7 = 4
= jeudi.Cette procédure est répétée jusqu'à ce que nous revenions au mois de mars (a
3
). Qu'il y ait ou non un jour bissextile, le dernier jour de février est 31 jours avant le dernier jour de mars, nous pouvons donc le calculer aussi (c'est(3 + 31) % 7 = 6
). La partie délicate consiste à trouver la valeur correcte pour janvier:(6 + 29) % 7 = 0
.(6 + 28) % 7 = 6
.Nous pouvons calculer s'il s'agit ou non d'une année bissextile avec l'extrait de code suivant:
Cela donne
0
siy
n'est pas une année bissextile et un entier positif sinon. Cela nous amène àpour calculer le jour de janvier. Cependant, nous pouvons faire mieux en inversant les conditions:
Comme le résultat de la fausse est toujours 0 de toute façon, nous pouvons le réduire à
sauver un octet de plus précieux.
En rassemblant le tout, nous parcourons chaque caractère de la chaîne, vérifiant si chacun est égal au jour de la semaine du 31 décembre. Nous gardons les index de ceux qui correspondent, renvoyant ce tableau à la fin. Et c'est ainsi que vous effectuez des calculs d'année bissextile sans fonctions intégrées.
la source
!(y%4)*y%100|!(y%400)
. chaque année divisible par 4, sauf les années non divisibles par 100, sauf si divisible également par 400y+(y>>2)+(z=y/25>>2)+(z>>2)
vous économiserez encore un octet.(y*5/4-(y/100)*3/4)
.JavaScript (Firefox 30-57),
6765646361 octetsEnregistré
246 octets grâce à @ETHproductions.Enregistrement d'un autre octet en affichant les mois dans l'ordre inverse.la source
.keys()
y=>[for(_ of(m=0,Array(12)))if(new Date(y+400,++m).getDay()==2)m]
Array(12)
complètement:y=>[for(_ of(m=0,1e11+""))if(new Date(y+400,++m).getDay()==2)m]
MySQL,
183134129106 octetsRemplacez
2016
par l'année souhaitée. Courir.Rév. 2: utilisé la
help_topics
table dans l'installation par défaut au lieu de créer une table temporaire.Rev.3: J'ai
-
adopté l' astuce d' aross et j'ai remarqué que je pouvais également omettre les guillemets pour"-1"
.Cependant,
-1
est requis dans MySQL: j'ai besoin d'une date complète.Rev.4: La restriction
m BETWEEN 1 AND 12
peut être effectuée en tant quem>0 AND m<13
(-6), mais n'est pas nécessaire du tout - les valeurs invalides seront ignorées; les avertissements seront comptés mais non répertoriés.la source
FROM help_topic
sansmysql.
travail? Je n'ai pas essayéUSE mysql;
La base de données correcte doit être sélectionnée d'une manière ou d'une autre.Perl, 64 octets
Comprend +1 pour
-n
Donnez votre avis sur STDIN:
mon.pl
:la source
Lot,
160152 octetsRéponse de Port of @ ETHproduction. Avec les abréviations des mois pour
197189 octets:la source
J,
483433 octets15 octets enregistrés avec l'aide de @ Adám .
Utilise le calendrier intégré pour générer un tableau de chaînes représentant les mois, puis analyse chaque chaîne pour déterminer si le dernier lundi est le dernier jour du mois. Il génère chaque mois comme numéro de mois de chacun. C'est
Jan = 0
,Feb = 1
...,Dec = 11
.La sortie de
calendar
estUsage
Explication
la source
calendar
est un tableau de 12 cases où chaque case contient un tableau 2d de caractèresI.7=;#&.>".&.>,&.>_2{.&.>calendar 2016
si vous combinez tous les "under-open", vous devriez pouvoir le faire assez court.Mathematica,
6257 octetsFonction anonyme. Prend un nombre en entrée et renvoie une liste de listes de nombres à élément unique en sortie. Honnêtement, je ne sais plus trop comment ça fonctionne.
la source
Perl + cal, 46 octets
Exemple:
la source
Java 7,
186 182172 octetsMerci à Kevin d'avoir économisé 4 octets
Merci à @cliffroot d'avoir économisé 10 octets
non golfé
Cette version est fournie par @cliffroot ( 168 octets )
échantillon de sortie
la source
n%4==0
àn%4<1
;n%400==0
versn%400<1
etint c=...;int[]b=...,a=...
versint c=...,b[]=...,a[]=...
.b
eta
peut être défini dans laint
partie comme ceci:int ... ,b[]=...,a[]=...
int[]f(int n){int x=--n*365+n/4+n/400-n++/100,k=0,b[]={1,(n%4<1&n%100>0)|n%400<1?-1:-2,1,0,1,0,1,1,0,1,0,1},a[]=new int[12];for(int i:b)a[k++]=(x+=i+30)%7==1?1:0;return a;}
quelques octets enregistrésb
àb[]={3,(n%4<1&n%100>0)|n%400<1?1:0,3,2,3,2,3,3,2,3,2,3}
eti+30
ài+28
pour 2 octetsint[]f(int n){int b=13561787|((n%4<1&n%100>0)|n%400<1?1<<20:0),x=--n*365+n/4+n/400-n/100,a[]=new int[12],k=0;while(k<12)a[k++]=(x+=(b>>24-k*2&3)+28)%7==1?1:0;return a;}
Python 2, 100 octets
Pouah. Les mathématiques avec les dates ne sont pas aussi simples que je le voudrais.
Essayez-le en ligne
Même longueur:
la source
MATL , 21 octets
Les mois sont affichés sous forme de nombres.
Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
Cela utilise des fonctions intégrées de conversion de date. Pour l'année donnée, il teste le dernier jour du mois qui est le lundi.
Au lieu de spécifier explicitement le dernier jour du mois
k
(qui peut être 28, 29, 30 ou 31), nous spécifions le0
-ème jour du moisk+1
, qui est équivalent et ne dépend pas du mois ou de l'année.la source
Utilitaires Bash + GNU, 56 octets
Semble nécessiter la
date
version 8.25. La version 8.23 dans Ideone ne le coupe pas.la source
Excel, 537 octets
Parce que - vous savez - Excel!
Prend l'année d'entrée dans A1. Renvoie la liste hexadécimale des mois; 1 = janvier, C = décembre. Étant donné que chaque mois est un chiffre unique, aucun séparateur n'est nécessaire.
Exemple: A1 contient 2016. B1 contient la formule ci-dessus et s'affiche sous la forme de
2A
février et octobre.la source
PHP, 109
180159octetswhile
enfor
car c'est maintenant une seule année (encore une fois, merci Titus)Vieux 2
Prend en charge toutes les années du point à 10000, s'est également débarrassé d'un avertissement var non défini que je ne connaissais pas sur un PC. Oui, elle est plus longue que l'ancienne version, mais elle est plus robuste.
Vieux 1
Si vous utilisez Windows ou un système 32 bits, il y aura le redoutable bug 2038, mais sur un système Linux 64 bits, ça va.
J'ai essayé d'utiliser
date("t"...
ce qui est censé représenter la dernière date du mois donné, mais les résultats ne correspondent pas à ceux mentionnés précédemment dans ce fil.la source
$z
, pas de guillemets pourN
) -1:for
au lieu dewhile
-43 : prendre l'entrée comme demandé au lieu de parcourir les années -3:join
au lieu deimplode
-16: sortie directe:for($z=$argv[1];$m++<12;)if(date(N,strtotime(sprintf("%04d-$m-",$z).cal_days_in_month(0,$m,$z)))<2)echo"$m,";
+9 si vous insistez pour ne pas avoir de virgule de fin:echo$o=$o?",$m":$m;
PHP, 92 octets
vérifier 12 fois 1 mois après le premier jour de l'année est un mardi. Si c'est le cas, c'est la veille du dernier jour du mois est un lundi.
la source
C, 214 octets
Compiler
Non golfé
Avec des crédits aux gourous concernés.
Michael Keith et Tom Craver pour le programme C pour trouver le jour de la semaine en fonction de la date .
Collin Biedenkapp pour Q&A: Comment savoir quel est le dernier jour du mois?
la source
if
direction, pour avoir votreelse
retour31
, et donc vous pouvez éliminer la grosse==
chaîne?C, 119 octets
Celui-ci utilise un tableau qui contient le décalage des jours de la semaine du dernier jour de chaque mois pour une année bissextile, encodé dans un mot signé de 32 bits en utilisant la base 7. Si ce n'est pas une année bissextile, nous ajoutons 1 au décalage de janvier (comme vous pouvez le voir
y&3||y%25<1&&y&15
est utilisé pour vérifier les années sans jours bissextiles). Ensuite, nous parcourons simplement chaque mois et vérifions si son dernier jour est un lundi. Assez simple en fait, pas de hacks ou de trucs laids. Ici, il est légèrement non golfé:Je pourrais revisiter cela pour le réécrire comme une fonction pour enregistrer quelques caractères. Le
printf
prend également un peu trop de place ...la source
PHP,
96957671696461 octetsRemarque: les numéros d'année doivent être remplis à 4 caractères, comme
0070
.Courez comme ceci:
Explication
Itère de -1 à -12. Créez une date en utilisant mktime, day
0
(le dernier jour du mois précédent) et month2..13
. Formatez la date en tant que numéro de jour et si le résultat est 1, imprimez le numéro actuel. Le signe négatif-
est utilisé comme délimiteur.Le bogue du millénaire frappe à nouveau!
Notez qu'avec cette version, la plage
0..100
est interprétée comme1970..2069
. Ce n'est pas un problème pour la plage0..69
, car les semaines ont un modèle qui se répète tous les 400 ans (146097 jours, exactement 20871 semaines), mais pour la plage70..99
, 1900 est ajouté au numéro de l'année, qui n'est pas un multiple de 400. Pour corriger ce problème JUSTE pour les numéros de 30 ans dans une plage de 10k, le moyen le plus simple est d'ajouter 400 au numéro de l'année pour empêcher l'interprétation à 2 chiffres ( +4 octets ):Tweaks
!~-$i
pour comparer$i
avec1
(-1
binaire nié est0
, logiquement nié esttrue
; chaque autre nombre estfalse
), donc les parenthèses ne sont pas nécessaireslast day ofYYYY-m
notation pour créer la datedate
etstrtotime
au lieu dedate_create
YYYY-m
partie de la datemktime
au lieu destrtotime
. Revient à l'utilisation du jour0
(mktime
prend également en charge le mois 13, donc0-13
==31-12
)-R
pour rendre$argn
disponiblela source
mktime
supprime la nécessité de garnir l'année, n'est-ce pas?mktime
c'est contre-intuitif , car les arguments sont considérés comme l'INT
al. Cela signifie que vous ne pouvez pas remplir l'année ... donc tout dans la plage0..100
est interprété comme1970..2070
. Ce n'est pas un problème pour la gamme0..70
car 400 ans ont un nombre exact de semaines (donc les calendriers répètent le modèle tous les 400 ans), mais70..99
ajoute 1900 (pas un multiple de 400!). Par conséquent, le nouveau ver. a un bug.$argv[1]+400
... à moins que les jours de semaine juliens et grégoriens diffèrent.Excel,
4289796 octetsEntrée en A1. Afficher des valeurs hexadécimales non séparées (janvier = 0, décembre = B)
Ajout de 10 octets ("+2000") pour permettre la gestion des dates antérieures à 1990.
Sauvegardé 11 octets grâce à @ Engineer Toast .
Première tentative (428 octets), empruntant fortement à la solution de @ Adám .
la source
297 -> May
revient6
avec cette formule. Ne devrait-il pas être 4?1776
donne7A
au lieu de seulement8
pour septembre.Date(A1,3,0)
au lieu deEOMONTH(DATE(A1,2,1),0)
Bash + cal, 58 octets
la source
cal
(par exemple OSX), mais surveillez les espaces de fin sur GNUcal
.Python 2, 94 octets
repl.it
Une fonction sans nom, prend une année entière, affiche une liste des numéros de mois
[1-12]
.J'ai également essayé de battre le nombre d'octets avec arithmétique sans succès (110 octets). :
Une fonction sans nom qui renvoie une liste de valeurs booléennes indiquant si les mois [janvier-décembre] se terminent un lundi
la source
Java 7,
200249 octetsEn Java,
GregorianCalendar
c'est un mélange entre un calendrier grégorien et julien. Pour cette raison, l'année a1
donné des résultats incorrects. ChangerCalendar c=Calendar.getInstance();
pourGregorianCalendar c=new GregorianCalendar();c.setGregorianChange(new Date(1L<<63));
résoudre ce problème en forçant une utilisation du calendrier grégorien uniquement. Merci à @JonSkeet sur stackoverflow.com de m'avoir expliqué cela.Code non testé et testé:
Essayez-le ici.
Sortie:
la source
C # 6C #,171167135 octets-32 octets grâce à Shebang
Imprimer les mois en chiffres; avec espace délimité; avec espace de fuite. Maintenant, cette réponse fonctionne également pour les versions antérieures de C #.
Ancien, 167 octets
-4 octets grâce à TimmyD
Les mois en sortie sont des nombres dans la chaîne de retour, séparés par des virgules
Non golfé
la source
void q(int y){for(int m=1;m<13;m++){if((int)new DateTime(y,m,DateTime.DaysInMonth(y,m)).DayOfWeek==1){Console.WriteLine(m);}}}
) De plus, il serait plus court de lancer leDayOfWeek
toint
que de leint
faireDayOfWeek
Action<int>
pour économiser quelques octetsRuby, 54 + 6 = 60 octets
6 octets pour
-rdate
sur la ligne de commande pour obtenir la classe Date de la bibliothèque standard.Explication: assez simple grâce à la grande
Date
classe du Ruby stdlib . Non seulement at - il des méthodes telles quemonday?
,tuesday?
, etc, le constructeur prendra des nombres négatifs pour tout champ passé l' année signifie «compter ce champ arrière à partir de la fin de la période représentée par le champ précédent.$*
est un raccourci pourARGV
,$*[0]
est donc un moyen rapide pour obtenir le premier argument de ligne de commande.la source
PHP, 84 octets
Mon premier Code Golf. C'est le PHP le plus court à ce jour sur cette question.
EDIT: ne semble pas fonctionner pour la première année. Je vais devoir comprendre pourquoi, mais pour l'instant je dois y aller.
la source
for(;$m++<12;)strftime("%w",strtotime($argv[1]+($m/12^0)."-".($m%12+1)."-1"))!=2?:print"$m ";
R,
106999583787774 octetsLa séquence des derniers jours de chaque mois est donnée par
seq(as.Date(paste0(x,-2,-1)),,'m',12)-1
:paste0
contraint -2 et -1 aux caractères. Six
c'était 2016 par exemple,paste0(x,-2,-1)
donne"2016-2-1"
qui est ensuite converti au 1er février 2016 paras.Date
.seq
appliqué à un objet POSIXct ou Date estseq(from, to , by, length.out)
: icito
n'est pas donné,by
est donné comme'm'
qui est mis en correspondance'month'
grâce à la mise en correspondance partielle, etlength.out
est bien sûr 12.-1
nous donne alors le dernier jour des 12 mois commençant par janvier de l'année en question.Cas de test:
Ancienne version à 95 octets, affichant les noms des mois au lieu de leurs seuls numéros:
la source
seq
avoir une méthode pourDate
-objects et cela résout le problème deas.Date
ne pas gérer les années ci-dessus10000
dans ma réponse supprimée.seq.Date
etseq.POSIXt
sont assez impressionnants: ils peuvent même traiter des commandes telles queseq(time1, time2, by="10 min")
ouseq(date1, date2, by="quarter")
. Très utile pour tracer une série chronologique.Japt, 24 octets
Testez-le en ligne! Produit un tableau de nombres, avec
false
à la place des mois qui ne se terminent pas un lundi.Il y avait un bug dans l'interpréteur qui ne me permettait pas d'utiliser
Ð
dans le corps de la fonction£
. Après la correction du bogue et un autre ajout de fonctionnalité, cela fait 18 octets dans le commit actuel:la source
Java,
143129 octetsCela utilise la nouvelle API temporelle de Java 8.
Sortie
Notez que chaque ligne a un espace supplémentaire à la fin.
Non golfé et test
Rasage
DayOfWeek::ordinal
pour comparer avec une constante numérique au lieu de la constante enum.Merci @TimmyD pour l'idée générale sinon la solution exacte! ;-)
la source
getValue()
méthode qui permettrait d'économiser quelques octets.ordinal()
enregistre 1 octet de plus par rapport àgetValue()
, même s'il est suggéré de ne jamais l'utiliser.GNU awk, 80 octets
Exemple
la source