Ce défi est assez simple. Vous allez prendre une entrée qui sera une année de 1801 à 2400 et une sortie si c'est une année bissextile ou non.
Votre entrée n'aura pas de nouvelles lignes ni d'espaces de fin:
1954
Vous allez sortir de la manière que vous aimez qui indique clairement à l'utilisateur s'il s'agit ou non d'une année bissextile (j'accepterai y ou n pour oui / non)
Vous pouvez obtenir une liste des années bissextiles ici: http://kalender-365.de/leap-years.php Je ferais remarquer que les années bissextiles ne sont pas toujours de quatre ans. 1896 est une année bissextile, mais 1900 ne l’est pas. Les années qui suivent ce "skip" sont:
1900
2100
2200
2300
Cas de test:
1936 -> y
1805 -> n
1900 -> n
2272 -> y
2400 -> y
EDIT: Ceci est basé sur un calendrier Grégorien standard: http://www.epochconverter.com/date-and-time/daynumbers-by-year.php
la source
(divisible by 4)∧((divisible by 100)→(divisible by 400))
.Réponses:
APL,
161412 caractèresRetours
0
pour une année bissextile,1
pour une année non bissextile.Essayez cette solution sur tryapl.org . Notez que j'ai changé la solution en dfn
{≥/⌽×4 25 4⊤⍵}
car tryapl.com ne prend pas en charge⎕
(prendre les entrées de l'utilisateur). Notez que⎕
c'est une case vide, pas un caractère manquant.La même solution en J:
Explication
Dyadic
⊤
(encode) représente son argument de droite dans la base spécifiée par son argument de gauche. J'utilise base4 25 4
dans cette solution. Ceci représente l'année y comme un polynômeSoit les propositions α, β et γ si a, b et c sont non nuls: La proposition γ est fausse si y est divisible par 4, β ∧ γ est fausse si y est divisible par 100 et α ∧ β ∧ γ est false si y est divisable par 400.
Une table de vérité (
*
représentant «peu importe») où la proposition Δ représente si y est une année bissextile obtient:L’énoncé suivant exprime Δ dans α , β et γ :
En raison de la structure de cette déclaration, on peut exprimer ¬Δ par la réduction
≥/⌽α β γ
où ≥ implémente ←. Cela conduit à la réponse que j'explique en ce moment.la source
Pyth, 11 octets
Ce programme complet est lu dans STDIN et affiche Vrai pour les années bissextiles et Faux dans le cas contraire.
Merci à @Jakube d’avoir suggéré Pyth et porté mon code CJam.
Vérifiez les cas de test vous-même dans le compilateur / exécuteur Pyth .
Comment ça marche
la source
CJam, 12 octets
Ce programme complet est lu dans STDIN et en affiche 1 pour les années bissextiles et 0 sinon.
Vérifiez les cas de test vous-même dans l' interpréteur CJam .
Comment ça marche
la source
r2/~~\e|i4%!
,r2/~~\~e|4%!
,r2/:~~\e|4%!
,r2/S*~\e|4%!
Et les 13 octetsr2/:~W%:e|4%!
r2/:i:\e|4%!
(12) etr2/:i(fe|~4%!
(13). J'ai même essayé GolfScript (ce qui ne nécessite pasr
), maisor4
est interprété comme un simple jeton. Si seulement l'entrée avait un retour à la ligne ...Javascript (ES6), 21 caractères
La règle standard est qu’il
y
s’agit d’une année bissextile si 4 divisenty
et si 100 ne divise pasy
ou 400 ne divise pasy
. Dans du code,100 et 400 ne sont pas nécessaires. Au lieu de cela, il suffit de vérifier si 16 ou 4 divise y, avec 16 choisi si 25 divise y, 4 sinon. Golfé, cela devient
Une fonction javascript qui implémente ceci est composée de 21 caractères:
Perl,
2826 caractèresMême idée, mais en Perl.
Exécuter en utilisant les
-lp
options. Par exemple,Avec le test configuré en entrée, cela produit
la source
y=>...
) est une fonctionnalité de l'ES6.Pip , 13 octets
Celui-ci était plus intéressant qu'il ne parut au début. Cela a pris du temps, mais j'ai finalement pu remplacer ces longues références à
400
with4
et à lah
variable (= 100).Sorties
1
pour l'année bissextile,0
pour l' année non bissextile. Explication:la source
Pyth,
191514 octetsBien trop facile. Essayez-le en ligne: démonstration ou test de harnais
edit: Missed, que vous pouvez imprimer les valeurs Truthy / Falsy au lieu de
n/y
. -4 octetsedit 2: Utilisé l'idée de racine carrée de Martin. -1 octet
Explication
la source
Regex,
836238Merci à Toby pour ses conseils sur la combinaison des deux moitiés de la regex.
Si nous nous concentrons uniquement sur la plage 1801..2400 et supposons que les entrées sont des entiers:
Testez en Ruby (
^
=\A
et$
=\Z
parce que Ruby) pour la plage souhaitée:(Bonus) pour quelque chose qui devrait fonctionner non seulement pour 1801..2400, mais pour toute année non négative:
Test en Ruby (
^
=\A
et$
=\Z
parce que Ruby) pour les 100 000 premières années:la source
(?!)
vous pouvez combiner les deux moitiés:(?!00)([02468][048]|[13579][26])(00)?$
- pour 38. Cela ne fonctionnera pas pour les années à un chiffre, cependant.JavaScript ( ES6 ) 27
La règle:
(y%4==0) && (y%100!=0 || y%400==0)
Golfé:
!(y%100<1&&y%400||y%4)
(utilisant principalement la loi de De Morgans )Une fonction implémentant la règle:
Un test (exécuté dans Firefox) juste pour être sûr:
la source
!(y%(y%25?4:16))
plutôt que!(y%100<1&&y%400||y%4)
. Pour ceux dérangés par l'opérateur ternaire, vous pouvez utiliser!(y%(4<<2*!(y%25)))
et sauvegarder trois caractères!(y%100<1&&y%400||y%4)
.TI-BASIC,
20 17 1613Du fait qu’il est sous forme de jetons, TI-BASIC est souvent compétitif face aux défis mathématiques simples, mais pas à celui-ci car il n’ya pas de commande "divisible".Peut-être que c'est après tout, mais c'est encore plus long que CJam et Pyth.Ceci utilise la méthode de David Hammond.
Ancien code à 16 octets:
Ungolfed:
fPart(
est "partie fractionnaire"; l'exponentiation a une priorité supérieure à la division. Dans TI-BASIC, les proches parents sont facultatifs.J'utilise un comportement non documenté de la
sub(
commande, généralement utilisé pour obtenir une sous-chaîne: lorsque son argument est un nombre au lieu d'une chaîne, il divise le nombre par 100. Il fonctionnera sur une calculatrice de la TI-83 ou de la série 84.20 -> 17 en réarrangeant le code pour permettre le retrait des proches parents; 17 -> 16 en remplaçant 400 par 16; 16 -> 13 en utilisant l'idée de David Hammond.
la source
Stackylogic, 226 octets (non concurrents)
Oui, c'est correcte. J'ai réalisé un programme en Stackylogic (non-TC), inventé par Helka Homba, pour le défi relevé ici . Ceci est fait après le challenge, donc non compétitif.
Stackylogic n’ayant qu’une entrée binaire, il faut utiliser 10 bits (ou plus, tous les chiffres étant ignorés). Le bit binaire doit être utilisé (le bit le moins significatif entré en premier). Toutes les dates en dehors de la plage spécifiée peuvent échouer, car il vérifie simplement le nombre entré: il ne couvre pas les dates inutiles
Non seulement c'est mon premier défi avec stackylogic, mais le premier défi avec stackylogic du tout.
Préparez-vous pour ce gâchis:
Cela m'a pris si longtemps, car Stackylogic est le langage le plus déroutant que j'ai rencontré et extrêmement illisible: vous devez savoir comment le reste du programme a été exécuté avant de pouvoir lire la section en cours d'édition. J'ai même dû ajouter des espaces pour la lisibilité lors de la création.
Explication maigre
Ceci est une explication simple de ce qu’il fait.
Stackylogic n’a aucune fonction mathématique, ce qui a rendu cela plus difficile. J'ai dû coder la plupart du temps, pour vérifier s'il s'agissait d'un numéro spécifique.
Premièrement, ce programme fera un NOR des bits les moins significatifs, en les rejetant au cours du processus. cela signifie que s'il est divisible par 4, il passera à la partie principale du programme, sinon la sortie 0.
Deuxièmement, le pointeur est reporté dans le labyrinthe de stackylogic. À partir de là, si les deux bits suivants sont nuls, il affichera instantanément 1 (car il est divisible par 16, et donc une année bissextile en dépit de toute autre condition), autre sage, il vérifiera si aucun des nombres n'est divisible par 4 mais pas une année bissextile, entre 1801 et 2400.
Pour expliquer en détail, impliquerait de faire ce poste plusieurs fois plus long qu'il ne l'est déjà
la source
Assembleur IBM System Z - 56 octets.
(96 octets de la source. Auparavant
712384202 octets de la source, 168 octets exécutables).Version plus petite encore. N'enregistre plus les registres de l'appelant, les modifications apportées au stockage littéral, le mode d'adressage modifié.
Nouvelle version. Cela ABEND avec un S0C1 s’il s’agit d’une année bissextile et une boucle si ce n’est pas le cas. Espérons que cela remplisse l'exigence d'indiquer le résultat.
OK, donc pas le plus court (bien que cela puisse être une fois que nous examinons le code réellement exécuté plus la taille de l'interpréteur ...)
Sortie:
ABENDER S0C1 pour une année bissextile, S222 (lorsque le temps CPU est écoulé) sinon.
1936 Y 1805 N 1900 N 2272 Y 2400 Y(lorsqu'il est exécuté plusieurs fois)la source
CJam,
1816 octetsDonne
1
(vérité) pour les années bissextiles et0
(fausseté) autrement.Exécutez tous les cas de test ici.
Explication
la source
Mathematica,
4027 octets, 17 caractèresUtilise 17 caractères, mais 27 octets. Merci à @alephalpha pour le tuyau. Notez que les barres verticales sont réellement U + 2223 pour les divisions. le
<U+F523>
devrait être remplacé par le caractère correspondant.la source
∣
pour représenterDivisible
:,#∣4&&(!#∣100||#∣400)&
21 caractères, 27 octets UTF-8.U+F523
(\[Implies]
) pour le rendre#∣4&&(#∣100<U+F523>#∣400)&
pour 19 caractères (mais toujours 27 octets).R, 29
Essai
la source
C, 81
Je peux faire plus court, mais celui-ci s'en tient parfaitement aux types 'char', sans analyser l'argument (par exemple avec
atoi
):Il doit être appelé avec un nom long de 4 caractères, car il est généralement admis que les arguments suivent immédiatement le nom du programme, séparés par des NUL. De plus, cela suppose que le seul argument est codé en ASCII et qu’il n’ya pas d’espace au début.
Explication:
*v+9
est la position du chiffre 'dizaines' dansv[1]+2
.Si les caractères 'dizaines' et 'unités' totalisent 96, nous terminons par
00
, sauvegardons donc deux caractères, de sorte que 'dizaines' et 'unités' désignent le nombre du siècle.Maintenant, xor "unités" avec deux fois les "dizaines", mod 4. Cela fonctionne parce que
10==±2 mod 4
, de sorte que le bit inférieur des "dizaines" peut simplement basculer le bit 1 des "unités". Nous utilisons le résultat comme index dans notre table des restes, en imprimanty
uniquement si le résultat modulaire est nul.la source
Befunge -98, (41 bytes)
La simplicité est géniale.
la source
sed, 55
Notez que les années non bissextiles peuvent être imprimées comme
n
ouN
selon leur caractère pair ou impair. J’estime qu’il s’agit d’une interprétation créative de la règle qui autorise les alternatives au "oui" et au "non" sans préciser qu’elles doivent être cohérentes.la source
Python2 - 37
g=lambda x:(x%4or x%400and x%100<1)<1
Notez que s’il
a
s’agit d’un nombre entier non négatif, laa<1
méthode d’écriture est courtenot bool(a)
. Ce dernier<1
convertit donc efficacement l'expression entre parenthèses en un booléen et annule le résultat.L'application de la fonction
g
à un nombre entiern
compris entre 1801 et 2400 renverraTrue
sin
est une année bissextile, etFalse
sinon.la source
KDB (Q), 27 octets
Explication
Tester
la source
Julia,
3028 octetsCela crée une fonction non nommée qui accepte un argument entier et renvoie une valeur booléenne. Pour l'appeler, donnez-lui un nom, par exemple
f=y->...
.Ungolfed:
Exemple:
la source
PHP - 45 octets
Rien d'aussi spécial, juste d'abuser du jonglage de caractères.
la source
C #, 23 octets
Essayez-le en ligne!
Source complète, y compris les cas de test:
la source
C,
373430 octetsBoîte à baguette
la source
T-SQL
3722 octetsSauvegardé 15 octets grâce au commentaire de BradC.
La variable habituelle codée en dur en l'absence de
stdin
.par exemple
Alors la solution est:
la source
1
ou0
directement:PRINT ISDATE(@+'0229')
Java 8,
49452220 octets-2 octets grâce à @ OlivierGrégoire .
Essayez-le en ligne.
Quelques solutions sur 22 octets:
Essayez-le en ligne.
Essayez-le en ligne.
Essayez-le en ligne.
Explication:
la source
java.time.Year::isLeap
.n->n%(n%25<1?16:4)<1
Haskell, 19 octets
Essayez-le en ligne!
la source
Javascript ES6, 32, 29, 26
Une des lignes suivantes fonctionne:
la source
C, 57 octets
Prend l'entrée de stdin, avec ou sans espaces de fin / nouvelle ligne. Ne fonctionne que sur des petites machines endian (oui, comme tout le monde est sur BE ces jours-ci). Sorties Y ou N.
Explication
Ungolfed:
Tout d'abord,
scanf
lit l'année comme un entier dans y. Ensuite, y est modulé avec 4 ou 400 selon que l’année est divisible par 100. Si le reste est égal à zéro, le code ASCII de Y est attribué à y, sinon il obtient le code ASCII de N. La valeur de y est maintenant0x000000??
, où0x??
est le caractère attribué. Étant sur une machine little-endian, cela est enregistré en mémoire?? 00 00 00
. C'est une chaîne C terminée par NULL, contenant uniquement les caractères attribués. L'adresse de y est transmise aux options de vente et le caractère est imprimé (avec une nouvelle ligne).la source
main(y){scanf("%d",&y);y=!(y%(y%100?4:400))+48;puts(&y);}
. Je peux descendre à 48 octets si je peux sortir une ligne vide pour les années bissextiles et n’importe quel caractère (ASCII 1-99) sinon, mais j’ai l’impression que cela enfreint un peu les règles. Qu'est-ce que tu penses?PowerShell, 31 octets
Je suis enthousiaste à l'idée de dire que j'ai joué au golf plus court que le jeu intégré!
Sorties true pour les années bissextiles et false sinon.
Intégré:
Cependant, si je voulais élargir la déclaration "indique clairement à l'utilisateur si c'est ou non une année bissextile" et si je fais quelque chose de non standard, je pourrais économiser 3 octets et utiliser:
Cette sortie
0
pour les années bissextiles et 1 ou plus pour les années non bissextiles, ce que je n'aime pas, car je préférerais obtenir une valeur de vérité plus standard pour les années bissextiles.la source
LOLCODE,
228202159 octetsUngolfed:
En Python sans golf, parce que LOLCODE est déroutant:
la source
WIN
..