Comme aujourd'hui marque l'occasion de la 26e seconde intercalaire à se produire, votre défi sera d'afficher la date et l'heure de chaque seconde intercalaire en GMT ou UTC qui s'est produite jusqu'à présent, ainsi que celle qui se produira aujourd'hui.
Contribution
Il n'y a aucune entrée.
Sortie
1972-06-30 23:59:60
1972-12-31 23:59:60
1973-12-31 23:59:60
1974-12-31 23:59:60
1975-12-31 23:59:60
1976-12-31 23:59:60
1977-12-31 23:59:60
1978-12-31 23:59:60
1979-12-31 23:59:60
1981-06-30 23:59:60
1982-06-30 23:59:60
1983-06-30 23:59:60
1985-06-30 23:59:60
1987-12-31 23:59:60
1989-12-31 23:59:60
1990-12-31 23:59:60
1992-06-30 23:59:60
1993-06-30 23:59:60
1994-06-30 23:59:60
1995-12-31 23:59:60
1997-06-30 23:59:60
1998-12-31 23:59:60
2005-12-31 23:59:60
2008-12-31 23:59:60
2012-06-30 23:59:60
2015-06-30 23:59:60
Règles
Étant donné que je doute qu'il existe de nombreux éléments intégrés qui permettent des secondes intercalaires, je les autorise.
Les failles standard ne sont pas autorisées.
Le code le plus court gagne.
Le format de la date doit avoir un mois à zéro et une année à 4 chiffres, ainsi que l'heure militaire et un espace séparant l'heure de la date. La mise UTC
à la fin est facultative. Votre choix de tirets ou de barres obliques.
EDIT: Oui, comme prévu, cela est devenu un défi d'encodage. Si seulement l'encodage pouvait résoudre le problème de la seconde intercalaire, ... alors tout notre code serait beaucoup plus pratique. Peut-être que nous avons besoin d'idées pour des défis plus amusants avec des utilisations pratiques?
la source
Réponses:
CJam,
72706964 octetsEssayez-le en ligne dans l' interpréteur CJam .
Idée
Nous commençons par encoder chaque seconde intercalaire en 2 * (Y - 1972) + D , où D est 1 s'il se produit en décembre et 0 sinon.
Le tableau de toutes les secondes intercalaires codées est le suivant:
Appelons ce tableau L .
Étant donné que le tableau est en ordre croissant, nous pouvons stocker les différences consécutives au lieu des nombres réels:
En traitant ce tableau comme les chiffres d'un nombre de base 15, nous obtenons l'entier
dont les chiffres de la base 240 (convertis en caractères) sont
Code
la source
R,
7875 octetsIntégrés, dites-vous? Bien...
R a une variable automatique
.leap.seconds
qui contient la date et l'heure de chaque insertion de seconde intercalaire, données dans l'heure locale du système. À partir de la version R 3.2.0, cela ne comprend pas aujourd'hui, donc je l'ai ajouté manuellement.Non golfé + explication:
Vous pouvez l' essayer en ligne !
la source
HTML, 594 octets
¯ \ _ (ツ) _ / ¯
la source
working
code htmlcode golf
contestations.C,
160146141140 octetsPremière publication, je ne sais pas ce que sont les "failles standard". J'ai des avertissements printf bien sûr.
160 octets:
L'idée originale est d'encoder les secondes intercalaires en utilisant deux bits par an: un pour juin et un pour décembre. Le codage est consommé un bit à la fois par la boucle while interne. Sans un entier de 128 bits, la boucle while externe est nécessaire. Le reste est entièrement comptable et mathématique. :-)
141 octets:
L'application des conseils suggérés le ramène à 146 octets. Ensuite, j'ai trouvé un moyen de simplifier la condition while externe (de Y <2000 à seulement Z), en la ramenant à 141 octets. Si proche d'un tweet!
140 octets:
J'ai remarqué que le tiret de la date pouvait être éliminé en rendant la journée négative. Je ne peux pas le faire avec le mois également en raison du zéro en juin. Mais au moins, ça tient dans un tweet maintenant!
Jolie version:
Version bonus:
J'ai éliminé la boucle externe en décalant les bits d'un entier 64 bits dans un autre, mais c'est 150 octets, en raison du plutôt long "unsigned long long"; si je pouvais utiliser quelque chose comme "uint64", ce serait 138 octets.
la source
for
boucle permettra d'économiser quelques octets. BTW,int main()
->main()
. Vous pourriez trouver cela très utile.X>>=1
est le même queX/=2
,6*(2-Z)
est le même que12-6*Z
et4362608640
est un octet plus court que0x104082000
. Leint
devantmain()
n'est pas nécessaire, et si vous passezmain()
àmain(Z)
alors vous pouvez supprimer la déclarationZ=1
.if(X&1)printf(...);
avecX&1?printf(...):1;
ce qui économise 1 octetwhile(X){...}
utiliser des virgules afin que vous puissiez supprimer les accolades -while(X)X&1?printf("%d-%02d-%d 23:59:60\n",Y,6*(2-Z),31-Z):1,Y+=Z^=1,X>>=1;
économiser encore 2 octetsPython 3, 91
Utilise l'encodage et le formatage des chaînes par Sp3000 , mais stocke les valeurs dans un objet Python 3 octets plutôt qu'un nombre magique.
Le codage n'a besoin que de 86 des 256 valeurs possibles d'un octet, donc une plage de caractères imprimables est utilisée pour le rendre plus agréable.
la source
Brainfuck, 806
Vous pouvez l' exécuter sur cet interprète en ligne.
la source
Python 2,
111104 octetsEncodage de base et plus d'encodage de base.
la source
GNU sed + date: 112
Les distributions Linux courantes ont également des secondes intercalaires intégrées. Utilisation de GNU sed et date:
GNU sed + date: 90
Sécuriser quelques personnages en coupant le chemin:
GNU sed + date réglé par Toby Speight: 84
Version profondément golfée proposée dans les commentaires:
la source
date
(GNU 8.23) les affiche comme la première seconde de la minute suivante. Qu'utilisez-vous qui comprend la minute de 60 secondes?-r
drapeau, en remplaçantdate
avec les///e
modificateur, et en remplaçant%Y-%m-%d
avec%F
dansdate
: TZ = UTCsed -nr 's/^([0-9]+).*/date -d "1900-1-1 \1sec" "+%F %T"/ep' /u*/s*/z*/leap*
1899-12-31 \1sec
la date et le codage23:59:60
en dur comme heure:sed -nr 's/^([0-9]+).*/date -d "1899-12-31 \1sec" "+%F 23:59:60"/ep' /u*/s*/z*/leap*
JavaScript ( ES6 ) 125
La nouvelle ligne à l'intérieur `` est significative et comptée.
Pour tester, exécutez l'extrait ci-dessous (étant EcmaScript 6, Firefox uniquement)
la source
PHP, 198 octets
Malheureusement, je ne sais pas si je peux insérer
\n
dans la fonction date. Si c'est le cas, c'est 3 octets de moins à cause de.""
.la source
(int)
supprimer les deux et supprimer des espaces. La date renvoie une erreur.Si le fuseau horaire par défaut n'est pas défini, désactivez-le avec un@
. 187 octets:foreach([.5,1,2,3,4,5,6,7,8,9.5,10.5,11.5,13.5,16,18,19,20.5,21.5,22.5,24,25.5,27,34,37,40.5,43.5]as$d){$h=$d-ceil($d);echo@date("Y-m-d 23:59:60",mktime(0,0,0,-6*$h,31+$h,$d+1972))."\n";}
8086 code machine + DOS, 92 octets
Hexdump du code:
Pour l'exécuter, écrivez les 92 octets dans un
com
fichier et exécutez sous Windows 32 bits ou DOSBox.Le code utilise une image bitmap de 87 bits, une par semestre. Les bits sont organisés en groupes de 16, à partir de MSB.
Décodage du bitmap:
En raison de la structure du code, certains bits sont perdus lors du décodage, j'ai donc dû les répéter. Cette répétition ne gonfle pas le bitmap parce que j'ai quand même dû remplir 87 bits à 96 bits.
Après avoir imprimé (ou non imprimé) la seconde intercalaire, le code augmente la date d'un semestre, en utilisant des manipulations sur les codes ASCII du message de sortie.
Code source (peut être assemblé avec
tasm
):la source
Pyth -
8884 octetsConvertit en char pour compresser les données et enregistre les données
06-30
versus en12-31
tant que nombre binaire.(il y a un espace à la fin)
Essayez-le ici en ligne .
la source
Python 2,
123121116 116114111J'ai réussi à le faire assez court, mais je ne sais pas combien de temps il peut devenir plus court. J'ai essayé d'utiliser
exec
, mais le formatage devient trop coûteux.J'ai utilisé un encodage base 16 de la table à partir de la page Wikipédia liée.
Edit: L'utilisation de l'encodage hexadécimal est plus courte que la base 36 (voir la version la moins jouée.)
Essayez-le ici
Moins golfé:
la source
C,
155149147 octetsVoici une autre approche en C, utilisant des chaînes et un encodage de longueur d'exécution. Pas aussi concis que mon autre solution C, mais peut-être peut-il être amélioré?
155 octets:
Utilisation d'une chaîne pour contenir le mois / jour.
149 octets:
Suppression de la chaîne mois / jour.
147 octets:
Suppression de l'initialisation de l'année.
144 octets:
Si j'ai réencodé le tampon pour que le nombre de sauts s'applique avant (et non après) l'exécution, je pourrais réorganiser les instructions dans la boucle while externe, utiliser l'opérateur virgule et éliminer les accolades, en économisant 2 octets.
Je peux enregistrer un autre octet en rendant la journée négative (comme dans mon autre solution).
Joli:
Explication:
Les exécutions sont codées en octets. Chaque octet a un bit pour dire si c'est juin ou décembre, 3 bits pour un comptage de longueur, 3 bits pour un comptage de saut et 1 bit haut inutilisé.
Le nombre de sauts est le nombre d'années à sauter après une course; il est compensé par -1 pour permettre deux secondes intercalaires en 1972. La durée correspond au nombre d'années consécutives; il pourrait probablement être compensé par +1, mais ce n'est pas le cas actuellement.
Ainsi, un octet signifie: "Faites des années de LONGUEUR en JUIN (ou DÉCEMBRE) en secondes intercalaires, puis sautez SKIP-1 ans" avant de passer à l'octet suivant.
Les octets sont décalés de 33 pour les rendre lisibles et éviter un encodage sophistiqué.
Cela signifie que bien que nous ayons suffisamment de bits de saut pour couvrir 1998-2005, nous sommes hors de portée ASCII, nous avons donc une longueur supplémentaire nulle. De plus, 1979 apparaît tout seul parce que la longueur 1972-1979 est trop longue.
Il y a suffisamment de bits dans les octets, donc ces problèmes pourraient être résolus en fin de compte.
la source
q / kdb +,
959493 octetsExplication
Pour chaque année + 1 , codez pour les années depuis 1905 en tant que caractère ASCII, par exemple:
6h$x
tours"D"
dos à68
. Puisqueq
l'époque de la date est2000.01.01
, nous soustrayons95
et effectuons la conversion des nombres entiers en date"d"$"m"$-12*95-6h$x
.La raison pour laquelle nous + 1 ci-dessus est de soustraire le nombre de jours à partir du début de l'année prochaine pour obtenir le 31 décembre ou le 30 juin de l' année réelle , à savoir 1 ou 185 jours. Par conséquent,
"DEFGHIJKSUV[^eh"
représente les années avec une seconde intercalaire en décembre, et"DMNOQXYZ]lo"
pour celles de juin. L'appariement-soustraction se fait via(a;b){x-y}'(c;d)
, oùa
etb
sont les années qui seront soustraites parc
et led
nombre de jours respectivement." "0:([]...)
prépare les résultats pour nous donner la mise en forme correcte, avec une petite mise en garde qu'un en-tête de colonne sera généré.1_
supprime cet en-tête et applique finalementasc
pour obtenir la commande correcte.edit : 're-base' pour soustraire 95 ans au lieu de 100 (sauver 1 caractère).
edit 2 : réordonner le positionnement des opérandes à l'intérieur de la fonction de conversion des nombres entiers en date.
la source
Python,
204201Vous pouvez jouer avec elle sur repl.it .
Edit: Complètement battu! Les réponses de compression sont incroyablement courtes.
la source
PHP, 164 octets
Ceci n'est qu'une modification de l'idée de @ Voitcus
la source
Python,
221217Quelques aperçus
Fondamentalement,
d(x)
décompresse un vecteur de 3 entiers à partir d'un seul entier à 2 chiffres.d(x)
est construit comme la fonction inverse (sur les heures de 26 secondes bissextiles) dec(v)
, qui à son tour est une fonction de compression qui transforme un triplet tel que (1998,12,31) en un nombre comme 85. Pour dériver la liste [20 , 21 ... 28,58] J'ai conçu un autre algorithme pour vérifier que la fonction de compression est bijective sur le domaine. Autrement dit, je me suis assuré que le programme suivant ne produit pas de doublons, et j'ai utilisé sa sortie comme liste du programme ci-dessus.La fonction de compression a
c(v)
été conçue pour être bijective en utilisant un schéma très simple. Prenons un exemple (1998,12,31).J'ai écrit le programme pour vérifier que cela est vrai, puis je l'ai défini
d(x)
comme l'inverse dec(v)
. Dans notre exemple, c ((1998,12,31)) est 85 et d (85) s'imprime correctement1998-12-31 23:59:60
.la source
q=x%10
et remplacezq
avecx%10
partout. C'est plus court. Je donne également une description utile de quelques golf supplémentaires sur votre programme ici . Je recommande de consulter la page Conseils pour jouer au golf en Python .gzip, 114 octets
Hexdump:
1f8b080853f9975502006c006dd04b0a80300c84e1bde01dbc40218fa6697aff8309e2a6fa6f3f86cc10adb426a3b95ce62b6a0d398f07d59aeb8e4ed80983701026e1242cc0a9307e1aa11306615211b59710527b3961270cba9994fc7fc944829092faeedc313e7803993cfafb20020000
Créez un fichier avec les octets décrits ci-dessus.
Extraire en utilisant gunzip ou un autre programme de décompression pour obtenir un nouveau fichier nommé "l". Ce fichier contient la sortie souhaitée.
la source