(Inspiré par le Riddler de la semaine dernière sur FiveThirtyEight.com. Publication Sandbox .)
Étant donné une année entre 2001 et 2099, calculez et renvoyez le nombre de jours au cours de cette année civile où mm * dd = yy
(où yy
est l' année à deux chiffres ).
2018, par exemple, en a 5:
- 18 janvier (1 * 18 = 18)
- 9 février (2 * 9 = 18)
- 6 mars (3 * 6 = 18)
- 3 juin (6 * 3 = 18)
- 2 septembre (9 * 2 = 18)
L'entrée peut être une année numérique à 2 ou 4 chiffres.
La sortie doit être un entier. L'espace de fuite ou le retour facultatif est très bien.
Liste complète des entrées / sorties:
Input = Output
2001 = 1 2021 = 3 2041 = 0 2061 = 0 2081 = 2
2002 = 2 2022 = 3 2042 = 4 2062 = 0 2082 = 0
2003 = 2 2023 = 1 2043 = 0 2063 = 3 2083 = 0
2004 = 3 2024 = 7 2044 = 3 2064 = 2 2084 = 5
2005 = 2 2025 = 2 2045 = 3 2065 = 1 2085 = 1
2006 = 4 2026 = 2 2046 = 1 2066 = 3 2086 = 0
2007 = 2 2027 = 3 2047 = 0 2067 = 0 2087 = 1
2008 = 4 2028 = 4 2048 = 6 2068 = 1 2088 = 3
2009 = 3 2029 = 1 2049 = 1 2069 = 1 2089 = 0
2010 = 4 2030 = 6 2050 = 3 2070 = 3 2090 = 5
2011 = 2 2031 = 1 2051 = 1 2071 = 0 2091 = 1
2012 = 6 2032 = 3 2052 = 2 2072 = 6 2092 = 1
2013 = 1 2033 = 2 2053 = 0 2073 = 0 2093 = 1
2014 = 3 2034 = 1 2054 = 4 2074 = 0 2094 = 0
2015 = 3 2035 = 2 2055 = 2 2075 = 2 2095 = 1
2016 = 4 2036 = 6 2056 = 4 2076 = 1 2096 = 4
2017 = 1 2037 = 0 2057 = 1 2077 = 2 2097 = 0
2018 = 5 2038 = 1 2058 = 0 2078 = 2 2098 = 1
2019 = 1 2039 = 1 2059 = 0 2079 = 0 2099 = 2
2020 = 5 2040 = 5 2060 = 6 2080 = 4
Il s'agit d'un défi de golf de code , le nombre d'octets le plus bas dans chaque langue gagne.
Le pré-calcul et la simple recherche des réponses sont normalement exclus selon nos règles sur les échappatoires , mais je l'autorise explicitement pour ce défi. Il permet des stratégies alternatives intéressantes, bien qu'il soit peu probable qu'une liste de recherche de 98 à 99 éléments soit la plus courte.
Réponses:
Excel, 48 octets
Hourra! Enfin, quelque chose qu'Excel est vraiment bon.
Prend l'entrée de A1 sous la forme d'un entier 1-99 représentant l'année, et sort à l'endroit où vous entrez cette formule. C'est une formule matricielle, utilisez donc Ctrl-Maj-Entrée au lieu de Entrée pour la saisir.
Cela tire parti du fait que les
COUNT
erreurs sont ignorées , de sorte que toutes les erreurs causées par le mois ne divisant pas l'année (conduisant Excel à analyser quelque chose comme2/12.5/25
ou par la date non valide, comme2/29/58
, sont simplement ignorées silencieusement.la source
A1
. La saisie d'une année à 4 chiffres revient simplement0
.Python 2 , 44 octets
Essayez-le en ligne!
Une fonction anonyme donnée comme objet de méthode. Produit tous les produits de
(month, day)
paires(m, d)
telle que codée park=32*m+d
avec0≤m≤12
,0≤d≤31
enveloppant autour. Élimine les 29 et 31 février en les excluant de la plage.la source
Java (JDK 10) , 65 octets
Essayez-le en ligne!
Crédits
la source
29*n
, donc pas besoin du chèque(m==2?29:32)
à29+m%2*3
semble toujours donner tous lesOK
résultats. Crédit @AsoneTuhid réponse Ruby s » .PowerShell , 94 octets
Essayez-le en ligne!
Prend l'entrée comme une année à deux chiffres, puis construit une
for
boucle de1/1/year
à12/9/year
(car 12/10 et au-delà ne compteront jamais et cela économise un octet). À chaque itération, nous incrémentons$z
si le nombre de.Month
fois.Day
est égal à notre année d'entrée. En dehors de la boucle,$z
est laissé sur le pipeline et la sortie est implicite.Modifier - cela dépend de la culture. Le code ci-dessus fonctionne pour
en-us
. Le format de la date peut devoir changer pour d'autres cultures.la source
Rubis ,
4642 octetsEssayez-le en ligne!
la source
JavaScript (Node.js) ,
484443 octetsEssayez-le en ligne!
JavaScript (Node.js) ,
5958 octetsEssayez-le en ligne!
la source
Gelée , 15 octets
Essayez-le en ligne!
Prenez un nombre dans la plage
[0,100[
en entrée.la source
JavaScript (ES6), 91 octets
J'étais curieux de savoir comment le codage en dur se comparerait à un calcul itératif. C'est définitivement plus long (voir la réponse de @ Shaggy ), mais pas terriblement plus long.
Edit : Elle est cependant beaucoup plus longue qu'une formule plus directe (voir réponse @ l4m2 ).
Prend l'entrée comme un entier dans [1..99] .
Essayez-le en ligne!
Comment?
Les années impaires ont significativement moins de chances d'avoir mm * jj = aa que les années paires. Plus concrètement, les années impaires ont 0 à 3 correspondances, tandis que les années paires ont 0 à 7 correspondances. Cela nous permet de coder chaque paire d'années avec seulement 5 bits, qui peuvent commodément être représentés comme un seul caractère dans la base 36.
la source
Perl 6 , 40 octets
Essayez-le en ligne!
la source
Python 2 et 3 ,
5552 octetsEssayez-le en ligne!
la source
Utilitaires Bash + GNU , 57
Notez que le
seq
commande produit toujours une liste de 366 dates - pour les années non bissextiles, le 1er janvier de l'année suivante sera inclus. Cependant, dans la plage de dates 2001..2099, MM * DD ne sera jamais YY pour le 1er janvier de l'année suivante pour aucune de ces années, donc ce jour supplémentaire n'affectera pas le résultat.Essayez-le en ligne!
la source
date
je ferais des calculs de datation comme ça pendant l'analyse.seq
n'a pas besoin d'espace après le-f
, vous pouvez donc y enregistrer un octet.T-SQL,
123121 octetsConformément à nos règles d'E / S , l'entrée est effectuée via la table préexistante t avec un champ entier y , qui contient une année à 2 chiffres.
Le saut de ligne est uniquement pour la lisibilité. Inspiré en grande partie par la solution Excel de Sophia .
CONCAT()
, ce quivarchar
entraîne des conversions de type de données implicites . Sinon, je devrais faire un tas deCAST
ouCONVERT
déclarations .ISDATE()
, qui renvoie 1 pour les dates valides et 0 pour les dates non valides.y%m=0
) dans laWHERE
clause pour enregistrer 2 octets, merci @RazvanSocol.Malheureusement, elle n'est pas beaucoup plus courte que la version de la table de recherche (en utilisant la chaîne de la version d' osdavison ):
Recherche T-SQL, 129 octets
ÉDITER : Laissant mon original ci-dessus, mais nous pouvons économiser quelques octets en utilisant quelques nouvelles fonctions:
STRING_SPLIT
est disponible dans MS SQL 2016 et supérieur.CONCAT_WS
est disponible dans MS SQL 2017 et supérieur.IIF
parWHERE
MS-SQL 2017,
121118octetsMS-SQL 2017, édition extra cheaty: 109 octets
Vous oblige à être dans la
master
base de données, qui contient une table systèmespt_values
qui (lorsqu'elle est filtrée parTYPE='P'
), vous donne des nombres de comptage de 0 à 2048.la source
m/d/y
) dépend des paramètres de localité de l'instance SQL. D'autres localités peuvent nécessiter un ordre différent ou un séparateur différent, mais je ne pense pas que cela affecterait la longueur du code.SPLIT_STRING
au lieu d'un CTE le ramène à 120 octets. Utiliser à laCONCAT_WS
place deCONCAT
sauvegarde un autre caractère, le portant à 119 octets.IIF
parWHERE
.Julia 0,6 ,
494442 octetsEssayez-le en ligne!
-5 octets inspirés de la réponse Ruby d'Asone Tuhid.
-2 octets remplaçant count par sum
Explication:
Pour chaque mois
i
de 1 à 12, calculezy/i
et vérifiez s'il s'agit de l'un des jours de ce mois. Les mois avec 31 jours sont 1, 3, 5, 7, 8, 10, 12 - donc ils sont impairs en dessous de 8 et même au-dessus de 8. Donc soiti%2
oui÷8
(qui est 0 pour i <8 et 1 pour i> = 8 ici) devrait être 1, mais pas les deux - nous les avons donc XOR. Si le résultat xor est vrai, nous vérifions les dates1:28+3
c.1:31
-à- d. , Sinon nous vérifions uniquement les dates1:28
.1:28
est suffisant pour le reste des mois (cette amélioration inspirée de la réponse Ruby d'Asone Tuhid ) car:pour février, la seule possibilité aurait été
2*29 = 58
, mais ce2058
n'est pas une année bissextile, nous pouvons donc supposer que février a toujours 28 jours.les autres mois avec 30 jours sont le mois 4 et plus - pour lequel
i*29
(eti*30
) serait supérieur à 100, ce qui peut être ignoré.Enfin, nous comptons le nombre de fois
y/i
appartient à cette liste de jours (en utilisant booléensum
ici), et retournons cela.la source
JavaScript,
9185828177 octetsPrend l'entrée comme une chaîne à 2 chiffres (ou un entier à 1 ou 2 chiffres).
Profite du fait que
new Date
le report au mois suivant et continue ainsi, si vous lui passez une valeur de jour qui dépasse le nombre de jours du mois que vous lui passez, donc, lors de la première itération, il essaie de construire le dateyyyy-01-345
qui devientyyyy-12-11
, ouyyyy-12-10
sur les années bissextiles. Nous n'avons pas besoin de vérifier les dates après cela, car cela12*11+
donne un nombre à 3 chiffres.3 octets économisés grâce à Arnauld .
Essaye-le
la source
Python 2 ,
89846858 octetsEssayez-le en ligne!
la source
Excel, 83 octets
L'entrée est dans la cellule
A1
au formatyyyy
. Il s'agit d'une formule matricielle entrée avec Ctrl+ Shift+Enter pour obtenir les accolades{}
. C'est assez simple et sans aucune intelligence.Dans une formule matricielle,
DATE(A1,1,0)+ROW(1:366)
nous donne un tableau de 366 valeurs de date. Les années non bissextiles, cela inclura le 1er janvier de l'année suivante, mais ce n'est pas un problème car1*1=1
et ne serait considéré comme un faux positif que si l'année suivante est2001
mais, puisque la plage d'années requise est2001 - 2099
, elle ne se présentera problème.Si vous avez raccourci ce bit en simplement
~
, la formule est beaucoup plus facile à suivre:J'ai essayé d'utiliser
COUNTIF()
au lieu deSUM(IF())
mais Excel ne me permettait même pas de le saisir sous forme de formule de tableau, encore moins de me donner un résultat. Je l' ai trouver une Sheets Google solution en utilisant ,CountIf()
mais la même méthode autrement que avéré être 91 octets, principalement parce qu'il utilise auArrayFormula()
lieu de simplement{ }
.la source
Retina 0.8.2 , 55 octets
Essayez-le en ligne! Prend une année à deux chiffres; ajoutez 1 octet pour prendre en charge les années à 4 chiffres. Explication: La première étape se transforme simplement en unaire. La deuxième étape commence par faire correspondre 1 à 12 caractères avant la position de correspondance, ce qui représente le mois, puis essaie d'anticiper un nombre entier de répétitions de ce mois. Cependant, l'anticipation contient un conditionnel, qui choisit entre 27 ou 30 répétitions supplémentaires selon le mois. Le nombre de positions de match est alors le résultat souhaité.
la source
R ,
22122 octetsEssayez-le en ligne!
A décidé d'adopter une approche de table de correspondance. L'année d'entrée doit être composée de 2 chiffres.
la source
if
, car l'entrée peut être à 2 ou 4 chiffres, votre choix (vous pouvez donc choisir d'accepter uniquement l'entrée à 2 chiffres). Mais il semble que le code considère que chaque mois contient 31 jours, donc par exemple, 62 (pour 2062) renvoie 1 où il devrait retourner 0.C (gcc),
656059 octetsPort de la réponse Java de user202729 . Essayez-le en ligne ici . Merci à Jonathan Frech d' avoir joué au golf 1 octet.
la source
a=0,m=13;for(;
~>for(a=0,m=13;
.J , 29 octets
Essayez-le en ligne!
Comment ça fonctionne
J'ai essayé dur d'obtenir moins de 2 fois la solution de gelée :)
Note latérale
Si quelqu'un veut vraiment coder en dur les données à 99 chiffres, voici quelques informations:
Divisez les 99 chiffres en morceaux de 2 chiffres. Ensuite, le premier chiffre est
<4
et le second<8
, ce qui signifie que cinq bits peuvent coder deux nombres. Ensuite, les données entières peuvent être codées en 250 bits ou 32 octets.la source
Python 3 , 158
162 162215241octetsSupprimé 4 Merci à Stephen d'avoir joué au conditionnel.
Supprimé 53 merci Stephen pour avoir souligné l'espace blanc
Supprimé 26 grâce au lien fourni par caird
Je suis assez nouveau dans ce domaine. Je ne pouvais pas penser à comment faire cela sans avoir décrit les jours d'un mois.
Essayez-le en ligne!
la source
(28if Y%4else 29)
can be shortened to[29,28][Y%4>0]
. Also, the long list can be shortened to[a,...]+2*[a,b,a,b,a]
.a,b,c
can be added in the parameter list to save a line.int(str(Y)[2:])
can be shortened toY%100
. Finally, counter variables can mostly be shortened tolen
s of list comprehensions, this also allowsn
to be made alambda
. This makes 118.Forth (gforth),
6059 bytesTry it online!
Cette version tire parti du fait qu'il ne peut pas y avoir plus d'un jour de correspondance par mois et que l'année doit être divisible par le mois pour qu'elle corresponde.
Explication
Itère au fil des mois, vérifie si l'année est divisible par mois et si le quotient est <31 (28 pour février) Les mois après mars ne peuvent pas correspondre aux jours supérieurs à 25, nous pouvons donc supposer tous les mois (autres que février) avoir 31 jours pour le casse-tête.
Explication du code
[1] - Forth a le concept de nombres à double longueur, qui sont stockés sur la pile sous la forme de deux nombres à longueur unique (de la forme xy, où la valeur du double =
y * 2^(l) + x
où l est la taille en bits d'un simple dans le quatrième implémentation avec laquelle vous travaillez).Dans ce cas, j'ai comparé le quotient et le reste à 32 (ou 29) 0. Si le reste était supérieur à 0 (année non divisible par mois), le premier double serait automatiquement supérieur à 32 (ou 29) 0 et le résultat serait faux. Si le reste est égal à 0, il résout efficacement un contrôle régulier du quotient <= 32 (ou 29)
Forth (gforth) , 61 octets
Essayez-le en ligne!
Saved some bytes by realizing that only February matters in terms of having the correct number of days in the month
Explanation
Forth (at least gforth) comparisons return -1 for true and 0 for false
la source
Java (JDK 10),
797270 bytesTry it online!
la source
d
ays)&&
to&
it's the same answer as OlivierGrégoire's Java answer, although he has answered 19 minutes earlier.JavaScript (Node.js), 108 bytes
la source
Perl 5, 68 bytes
Try it online!
la source
Python 3, 132 bytes
This is really quite long of a program but I thought it might be of interest.
All the values are between 0-7 so I encode each number with 3 bits in a long binary string. I tried pasting a raw binary string into my python program but I couldn't get it to work, so I settled on base64 in the file.
I used the following string as a lookup table (ending 7 used for padding):
01223242434261334151533172234161321260115040331061312042410060032130113060021220420051013051110140127
The program takes this string and decodes it as a number, then uses bit shifting to extract the result.
66 bytes + 37 byte file = 103 bytes
This reads a binary file called
e
and avoids using base64.Here is a hexdump of the read file (without padding):
la source
Haskell,
6151 bytesTry it online!
Inspired by xnor's Python 2 answer and Laikoni.
la source
f y=sum[1|i<-[1..12],mod y i<1,div y i<29+mod i 2*3]
Try it online!Oracle SQL, 115 bytes
We may note that it does not really matter how many days in April (and later months), since 100/4 < 28. Also it's not necessary to check whether year is leap or not. We just have to specify that there are 28 days in February (not 29 because that validation will be executed only for 2058 which is not leap) otherwise it may be just 31 for any month.
Other approaches
Oracle SQL (12c Release 2 and later), 151 bytes
Oracle SQL (12c Release 2 and later), 137 bytes
Both solution could have been 8 bytes shorter if we replace
(select level l from dual connect by level<=12)
withxmltable('1to 12'columns l int path'.')
but Oracle throws an exception because of the bug (tested on versions 12.2.0.1.0, 18.3.0.0.0).The only case in both solution when year does matter is 2058 which is non-leap so literal '-1' was used to specify non-leap year.
Oracle SQL, 128 bytes
Oracle SQL, 126 bytes
Update
Oracle SQL, 110 bytes
Oracle SQL, 108 bytes
Spark SQL, 137 bytes
Spark 2.3+ SQL, 126 bytes
(
replace
function becomes available)la source
PHP, 73 bytes
Using pipe input and
php -nR
:Try it online!
PHP, 76 bytes
Using command line arg input
php dm.php 18
:Try it online!
Iterative approach. Since the only leap year to look at is 2 * 29 = 58, and 2058 is not a leap year there's no need to consider leap year in the Feb days. And since wraparound is not a concern -- from April on, any day greater than 25 will exceed 100 we just say the rest of the months only have 25 days.
Input is 2 digit year via command line (-10 bytes as program, thx to suggestion from @Titus).
OR:
PHP, 101 bytes
Try it online!
Still iterative but using PHP's timestamp functions. Accepts year as four digit number. Thx to @Titus for suggestion of using
strtotime()
instead ofmktime()
.la source
$m<5?$m-2?31:28:25
for the first and$d=strtotime("$y-1")
for the secondy
in the eval in quotes?strtotime()
instead ofmktime()
and re-implemented as program, -7 bytes. Also, I looked at the majority of the submissions, including the top voted ones, will only accept year as either 2 or 4 digits, so I'm going to take that to mean it is up to submitter. Thx again for the suggestions!PHP,
7470 bytesaccepts two-digit years only.
I adopted gwaugh´s considerations and golfed them; my 1st approach was longer than his (92 bytes):
%100
allows to use 4-digit years.Run as pipe with
-nR
or try them online.la source