Combien de jours dans un mois?


25

Étant donné une représentation textuelle (nom complet insensible à la casse ou abréviation à 3 caractères) d'un mois, renvoyer le nombre de jours du mois.

Par exemple, december, DECet decdevraient tous revenir 31.

Février peut avoir 28 ou 29 jours.

Supposons que l'entrée est un mois sous l'une des formes correctes.


19
Vous devriez probablement énumérer toutes les variantes des noms de mois que nous devrions pouvoir accepter.
Giuseppe

1
Pour tous ceux qui peuvent l'utiliser, les sommes ordinales ASCII des 3 premiers caractères abaissés sont uniques.
2017 totalement humain

19
C'était beaucoup, beaucoup trop tôt pour accepter une solution.
Shaggy

5
je pense que ce serait plus agréable si l'entrée n'était que le mois dans un format fixe, car le format nécessite maintenant essentiellement la conversion en cas fixe et en ne regardant que les 3 premières lettres.
2017

4
En l'état actuel , il semble que vous voulez des réponses à gérer toutes les formes énumérées - « Par exemple, december, DECet decdevrait tout retour 31 » - Est - ce que l'intention?
Jonathan Allan

Réponses:


4

Pyke , 9 octets

l4C9@~%R@

Essayez-le ici!

l4        -   input.title()
    @     -  v.index(^)
  C9      -   ['PADDING', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
        @ - v[^]
     ~%R  -  ['Padding', 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

Ou 15 octets si tous les formats d'entrée sont requis

l43<C9 3L<@~%R@

Essayez-le ici!

l43<            -   input.title()[:3]
          @     -  v.index(^)
    C9 3L<      -   ['PAD', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
              @ - v[^]
           ~%R  -  ['Padding', 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

6
Cela renvoie 31 pour FEB.
Laikoni

2
Je crois @ point de Laikoni est valide (elle retourne aussi 31 pour Apr, Jun, Sepet Nov) , mais pense aussi qu'il faut une petite précision dans l'OP (voir ma question ).
Jonathan Allan

@JonathanAllan Eh bien, le PO a accepté cette réponse, donc je suppose qu'elle est valable?
Erik the Outgolfer

4
@EriktheOutgolfer Je ne sauterais pas à cette conclusion personnellement.
Jonathan Allan

J'avais l'impression qu'il ne fallait travailler que pour une seule forme d'entrées
Blue

33

JavaScript (ES6),  48 47 44 43  42 octets

m=>31^'311'[parseInt(m[1]+m[2],34)*3%49%8]

Démo

Comment?

Ces opérations conduisent à une table de correspondance de 8 entrées, ce qui ne serait pas très intéressant si les valeurs étaient réparties aléatoirement. Mais tout résultat supérieur à 2 est mappé à 31 jours. Par conséquent, seules les 3 premières entrées doivent être stockées explicitement.

Month | [1:2] | Base 34 -> dec. | * 3  | % 49 | % 8 | Days
------+-------+-----------------+------+------+-----+-----
  JAN |    AN |             363 | 1089 |   11 |   3 |  31
  FEB |    EB |             487 | 1461 |   40 |   0 |  28
  MAR |    AR |             367 | 1101 |   23 |   7 |  31
  APR |    PR |             877 | 2631 |   34 |   2 |  30
  MAY |    AY |              10 |   30 |   30 |   6 |  31
  JUN |    UN |            1043 | 3129 |   42 |   2 |  30
  JUL |    UL |            1041 | 3123 |   36 |   4 |  31
  AUG |    UG |            1036 | 3108 |   21 |   5 |  31
  SEP |    EP |             501 | 1503 |   33 |   1 |  30
  OCT |    CT |             437 | 1311 |   37 |   5 |  31
  NOV |    OV |             847 | 2541 |   42 |   2 |  30
  DEC |    EC |             488 | 1464 |   43 |   3 |  31

14
Honnêtement, comment diable continuez-vous à faire ces incroyables soumissions étranges avec des trucs de maths fous D: avez-vous un programme pour les trouver ou êtes-vous tout simplement trop bon pour le reste d'entre nous
HyperNeutrino

1
@HyperNeutrino La première chose que j'essaie est toujours de trouver une conversion de base, suivie d'une multiplication optionnelle suivie d'une ou plusieurs opérations modulo. Celui-ci a été trouvé rapidement de cette façon. Mais j'ai mal lu le défi et j'ai d'abord pensé que ce .substr(0,3)n'était pas nécessaire. Donc, après réflexion, ce n'est peut-être pas la meilleure approche.
Arnauld

substr? slice!
Neil

Mon approche triviale ne fait que <s> 2 </s> 3 octets de plus, ce qui n'est peut-être plus optimal à cause de cela, mais reste très impressionnant :)
HyperNeutrino

1
La modification de quelqu'un a supprimé cette partie, mais l'une des raisons pour lesquelles je l'ai initialement refusée, c'est que je voulais voir des réponses comme celle-ci. J'adore l'utilisation de la base 34 pour contourner le problème de la capitalisation et des différents formats.
qw3n

15

Javascript (ES6), 36 33 octets

-3 octets grâce à @JustinMariner et @Neil

m=>31-new Date(m+31).getDate()%31

Désolé @Arnauld, abuser de la bizarrerie JavaScript est plus court que vos conversions de base fantaisistes.

Comment ça marche

Pour une raison quelconque, JavaScript permet de saisir des dates en dehors du mois spécifié. Le code compte le nombre de jours en dehors du mois de la date pour déterminer le nombre de jours dans le mois. Exemples:
"FEB31"Thu Mar 02 200031 - 2 % 3129
"October31"Tue Oct 31 200031 - 31 % 3131

Cas de test


MS Excel le fait également. Le 0 janvier est toujours le dernier jour de décembre, donc = JOUR ("00/01/2017") donnera 31
DavChana

Il semble que Javascript n'autorise que les chaînes de date où le jour est jusqu'à 31. Si vous essayez d'entrer "feb 32", cela se traduit par 2032-02-01, et si vous essayez de le forcer avec "0-feb-32" (ou une chaîne similaire), elle indique simplement "Date non valide". Curieusement, si vous définissez le jour sur 0 ("feb 0"), cela se traduit par 2000-02-01 plutôt que 2000-01-31.
TehPers

Vous pourrez peut-être enregistrer un octet en supprimant l'espace avant 31. Il semble fonctionner dans Chrome comme new Date("feb31")par exemple.
Justin Mariner

En fait, vous pourriez probablement utiliser une +31sauvegarde globale de trois octets. Cependant, rien de tout cela ne fonctionne dans Firefox.
Neil


7

Bash , 21 octets

cal $1|xargs|tail -c3

Essayez-le en ligne!

Prend l'entrée comme argument de ligne de commande et sort avec un retour à la ligne de fin. Le nombre de jours pour février dépend de celui de l'année en cours

Nécessite la version util-linux 2.29 de cal, qui est celle disponible sur TIO . Dépend également des paramètres régionaux, LC_TIME doit donc être modifié sur les systèmes non anglais (merci @Dennis pour la clarification).

L'idée de la canalisation à travers la sortie de xargstrim calprovient de cette réponse SO .


2
Ce n'est pas seulement bash. En général, c'est sh, mais c'est probablement presque toutes les implémentations de shell qui prennent en charge les recherches de chemin et les tuyaux, sur un système avec cal, tail et xargs.
kojiro

5

Proton , 50 octets

k=>31-((e=k.lower()[1to3])in"eprunov")-3*(e=="eb")

Essayez-le en ligne!

-14 octets grâce à Jonathan Frech

Trente jours ont septembre, avril, juin et novembre. Tout le reste avait du beurre d'arachide. Tous sauf ma grand-mère; elle avait un petit tricycle rouge, mais je l'ai volé. muahahahahaha

(J'attendais de raconter cette blague (source: mon professeur de mathématiques) depuis des lustres sur ce site: D: D: D)


@Riker oh whoops qui n'était pas là quand j'ai commencé à écrire ceci: /
HyperNeutrino

1
Il y a une nouvelle règle que vous devez vérifier pour un mois non valide et renvoyer 0. J'espère qu'elle sera supprimée
Level River St


Je pense que vous pouvez utiliser une seule chaîne 'sepaprjunnov'au lieu d'une liste de chaînes.
Jonathan Frech

@JonathanFrech peut-être; Je vais essayer ça, merci
HyperNeutrino

4

C # (.NET Core) , 52 + 13 = 65 38 + 24 = 62 octets

m=>D.DaysInMonth(1,D.Parse(1+m).Month)

Essayez-le en ligne!

+24 pour using D=System.DateTime;

Remerciements

-3 octets grâce à Grzegorz Puławski.


Est-ce que cela fonctionne sans using System;? Ou pouvez-vous exclure cela du nombre d'octets?
Matty

@Matty C'est un bon point; maintenant ajouté.
Ayb4btu

Astuce tardive, mais -3 octets: using D=System.DateTime;et m=>D.DaysInMonth(1,D.Parse(1+m).Month)comme ici: tio.run/##jc5BSwMxEAXgs/…
Grzegorz Puławski




2

Python 3 - 93 86 84 82 octets

Variantes de réponse (montrant la progression du temps et des octets pour chacune, avec des liens TIO):

Réponse originale (93 octets)

-7 octets grâce à Jonathan Frech.(86 octets)

-2 octets de plus grâce à mes propres tests supplémentaires des monthrangerésultats, la deuxième valeur étant toujours la valeur la plus élevée. (84 octets) 1

-2 de plus en l'utilisant import calendar as cet en le référençant avec c.monthrange. (82 octets, révision en cours )


lambda x:c.monthrange(1,time.strptime(x[:3],'%b')[1])[1];import time,calendar as c

Évidemment, pas aussi agréable que la réponse d'HyperNeutrino qui n'utilise pas de fonctionnalités intégrées, mais cela fonctionne toujours.


Notes de bas de page

1 : Cas de test via TIO.run montrant la preuve de la façon dont je gère ces monthrangevaleurs, pour un nombre variable de cas de test de mois.



@JonathanFrech Merci. Encore révisé à la baisse en ayant testé davantage le fonctionnement de monthrange, et en l'utilisant import ...,calendar as cpour ne pas avoir à taper "calendrier" deux fois.
Thomas Ward,


2

Haskell , 65 63 62 octets

f.map((`mod`32).fromEnum)
f(_:b:c:_)|c<3=28|c>13,b>3=30
f _=31

Essayez-le en ligne!

Approche d'appariement de motifs. La première ligne consiste à gérer l'insensibilité à la casse. Ensuite, nous revenons 28si la troisième lettre est plus petite que C (numéro 3), 30si la deuxième lettre est plus grande que C et la troisième plus grande que M, ou31 autrement.

Edit: -1 octet grâce à Leo


Alternative ( 65 64 octets)

f s|let i#n=n<mod(fromEnum$s!!i)32=sum$29:[2|2#2]++[-1|2#13,1#3]

Essayez-le en ligne!


1
Intelligent! Vous pouvez enregistrer un octet en vérifiant au c<3lieu de a==6(février est le premier mois si vous les commandez par leur troisième lettre, suivie de décembre)
Leo

2

APL (Dyalog) , 32 octets *

Fonction de préfixe tacite. Suppose ⎕IO( I ndex O rigin) 0, qui est par défaut sur de nombreux systèmes.

31 28 30⊃⍨∘⊃'.p|un|no|f'S 11

Essayez-le en ligne!

⍠1 cas insensible

1 retourner la longueur du

⎕S PCRE S Earch pour

'.p|un|no|f' any-char, "p" ou "un" ou "no" ou "f"

⊃⍨∘⊃ et utiliser le premier élément de celui-ci (0 si aucun) pour choisir parmi

31 28 30 cette liste

Ainsi:

  • Ap r, S ep , J un et No v sélectionneront le nombre à l'index 2, à savoir 30

  • F eb sélectionnera le nombre à l'indice 1, soit 28

  • toute autre chose sélectionnera le nombre à l'index 0, à savoir 31


* Utiliser Classic et compter comme ⎕OPT.


2

Modèle Mediawiki, 19 octets

{{#time:t|{{{1}}}}}

1

MATL , 22 octets

14L22Y2c3:Z)Z{kj3:)km)

Essayez-le en ligne!

Explication

14L    % Push numeric array of month lengths: [31 28 ... 31]
22Y2   % Push cell array of strings with month names: {'January', ..., 'December'}
c      % Convert to 2D char array, right-padding with spaces
3:Z)   % Keep first 3 columns
Z{     % Split into cell array of strings, one each row
k      % Convert to lower case
j      % Input string
3:)    % Keep first 3 characcters
k      % Convert to lower case
m      % Ismember: gives a logical index with one match
)      % Use that as index into array of month lengths. Implicit display

1

Wolfram Language (Mathematica) , 46 30 octets

#~NextDate~"Month"~DayCount~#&

Essayez-le en ligne!

Donnera soit 28ou 29pour février selon que l'année en cours est une année bissextile.

Comment ça marche

Toutes les commandes de date dans Mathematica interpréteront entrée tels April, APR, ApRiLet ainsi de suite que le premier jour du mois correspondant de l'année en cours. (En prime, des entrées telles que "February 2016"ou{2016,2} fonctionne également comme prévu.)

#~NextDate~"Month"donne le premier jour du mois suivant, et DayCountdonne le nombre de jours entre ses deux arguments. Le nombre de jours entre le 1er avril et le 1er mai est de 30, le nombre de jours en avril.




1

q / kdb +, 36 octets

Solution:

28 30 31@2^1&(*)"ebeprunov"ss(_)1_3#

Exemples:

q)28 30 31@2^1&(*)"ebeprunov"ss(_)1_3#"January"
31
q)28 30 31@2^1&(*)"ebeprunov"ss(_)1_3#"FEB"
28
q)28 30 31@2^1&(*)"ebeprunov"ss(_)1_3#"jun"
30

Explication:

Il existe un million de façons d'écorcher un chat. Je pense que c'est légèrement différent des autres. Prenez les 2e et 3e lettres de l'entrée, mettez-les en minuscules, puis recherchez-les dans la chaîne "ebeprunov". S'ils sont à l'emplacement 0, alors c'est février, s'ils sont à un emplacement> 0, ils sont 30 jours, s'ils ne sont pas dans la chaîne, ils sont 31 jours.

28 30 31@2^1&first"ebeprunov"ss lower 1_3# / ungolfed solution
                                        3# / take first 3 items from list, January => Jan
                                      1_   / drop the first item from the list, Jan => an
                                lower      / lower-case, an => an
                  "ebeprunov"ss            / string-search in "ebeprunov", an => ,0N (enlisted null)
             first                         / take the first, ,0N => 0N
           1&                              / take max (&) with 1, 0N => 0N
         2^                                / fill nulls with 2, 0N => 2
        @                                  / index into
28 30 31                                   / list 28,30,31

1

Excel VBA, 47 43 octets

Fonction de fenêtre immédiate VBE anonyme qui prend l'entrée, comme nom de mois, abréviation ou numéro, de la plage [A1] et renvoie la longueur de ce mois de l'année 2001 à la fonction de fenêtre immédiate VBE.

?31-Day(DateValue("1 "&[A1]&" 1")+30)Mod 31

Ancienne version

d=DateValue(["1 "&A1&" 1"]):?DateAdd("m",1,d)-d

1

PHP, 38 33 + 1 32 + 1 octets

5 octets enregistrés grâce à Titus

<?=date(t,strtotime("$argn 1"));

Exécuter en tant que tuyau avec -nF

Essayez-le en ligne!


1
Hé, je ne pense pas que vous ayez besoin .' 1', il semble fonctionner sur TIO sans lui!
Dom Hastings

1
28 + 1 octets: <?=date(t,strtotime($argn));(exécuté en tant que pipe avec -nF)
Titus

3
@DomHastings - donc, avant de poster, j'avais testé pour voir si cela fonctionnerait sans .' 1', mais cela ne fonctionnait pas. Après avoir vu votre commentaire, j'ai essayé de comprendre ce que j'avais fait de mal. Parce que je l'exécutais le 31 du mois, il prenait le 31e jour (actuel) pour tout mois que je mettais, ce qui le mettrait au-delà du mois en cours. Le 31 février se transforme en 3 mars, le code renvoie donc 31 (le nombre de jours en mars). Pour cette raison, chaque mois revenait à 31. Donc, cela fonctionne sans .' 1'n'importe quel jour <= 28 du mois.
Jo.

Ahhh, j'oublie comment PHP remplit les blancs! Merci d'avoir expliqué!
Dom Hastings

@Titus Merci. Je suis un débutant en golf! Je ne sais pas pourquoi je n'ai pas réalisé le 't'-> t. De plus, j'ai dû faire un tas de recherches pour trouver comment "fonctionner comme une pipe avec -nF" mais je l'ai compris (je pense). :)
Jo.


0

QBIC , 49 35 octets

?31-(instr(@aprjunsepnov feb`,;)%3)

Significativement plus court avec quelques ruses.

Explication

?                          PRINT
31-(                       31 minus
  instr(                   the position of
                      ,;   our input string
    @aprjunsepnov feb`  )  in the string cntaining all non-31 months                                
    %3)                    modulo 3 (this yields a 1 for each month except feb=2)


0

Rubis , 45 octets

->m{((Date.parse(m)>>1)-1).day}
require'date'

Essayez-le en ligne!

Ruby's Date.parseaccepte seul un nom de mois. Ce qui serait normalement un décalage à droite ( >>) ajoute en fait au mois de l' Dateobjet. La soustraction affecte le jour du mois, qui revient en arrière au dernier jour du mois précédent.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.