Défi
Votre tâche consiste à écrire un programme qui, une fois par seconde (y compris immédiatement au démarrage de votre programme), imprime le temps écoulé depuis le démarrage de votre programme.
Règles
- L'heure doit être imprimée au
hh:mm:ss
format. (zéros non significatifs pour les valeurs à un chiffre) - Les horodatages doivent être séparés par CR, LF ou CRLF. (pas d'espace blanc de tête)
- Une nouvelle heure doit apparaître chaque seconde. (stdout ne peut pas être mis en mémoire tampon pendant une seconde)
- Le comportement du programme s'il est exécuté après 23:59:59 n'est pas défini.
- Vous pouvez utiliser
sleep(1)
même si une seconde spécifique peut être ignorée chaque fois que la surcharge pour imprimer, calculer, boucler, etc. s'accumule en une seconde.
Exemple de sortie:
00:00:00
00:00:01
00:00:02
00:00:04
00:00:05
⋮
Notez qu'il 00:00:03
manque ici en raison de la surcharge de traitement. Les valeurs ignorées réelles (le cas échéant) dépendent bien sûr de l'implémentation et / ou du système.
Implémentation de référence en C: (systèmes compatibles POSIX uniquement)
#include <unistd.h> // sleep()
#include <tgmath.h>
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#ifndef __STDC_IEC_559__
#error "unsupported double"
#endif
static_assert(sizeof(double) == 8, "double must have double precision");
#define MAX_PRECISE_DOUBLE ((double)(1ULL << 52))
int main(void) {
time_t start = time(NULL);
if (start == (time_t)-1) return EXIT_FAILURE;
while (1) {
time_t now = time(NULL);
if (now == (time_t)-1) return EXIT_FAILURE;
double diff = difftime(now, start);
if (isnan(diff) || diff < 0) return EXIT_FAILURE;
if (diff > MAX_PRECISE_DOUBLE) return EXIT_FAILURE;
unsigned long long seconds = diff;
unsigned long long h = seconds / 3600;
seconds %= 3600;
unsigned long long m = seconds / 60;
seconds %= 60;
unsigned long long s = seconds;
(void)printf("\r%02llu:%02llu:%02llu", h, m, s);
(void)fflush(stdout);
(void)sleep(1);
}
}
Critères gagnants
C'est le code-golf , le code le plus court en octets gagne!
Réponses:
MATL ,
1716 octetsEssayez-le sur MATL Online!
Comment ça marche
la source
Langage de script Operation Flashpoint ,
174171 octetsEn action:
158 octets, si l'heure précédente est remplacée par l'heure suivante:
Techniquement, aucun retour chariot n'est utilisé, donc je ne sais pas si cette version se limite aux règles.
la source
CR
ne remplacera pas la ligne. En fait,CRLF
,LFCR
etLF
sont tous sémantiquement équivalent.Bash + coreutils,
2826 octetsLe caractère non imprimable entre
+
et%
est un octet ESC .Cela définit l'heure système à 00:00:00 et nécessite donc des privilèges root. Il suppose également que le fuseau horaire est UTC et qu'aucun autre processus n'interférera avec l'horloge système.
Chaque nouveau timing réinitialise le terminal, écrasant ainsi le précédent.
Bash + coreutils,
3829 octetsLes mêmes restrictions que précédemment s'appliquent. Chaque nouveau chronométrage est affiché sur une nouvelle ligne.
la source
date
du reste avec un joli petit saut de ligne. Mais cela pourrait être trop agréable pour quelqu'un capable de trouver quelque chose comme votre deuxième solution> :-(date -s0
imprime la nouvelle heure sur STDOUT; J'utilise le tuyau pour couper cette sortie.APL (Dyalog Unicode) , 51 octets
Corps de programme complet.
Essayez-le en ligne! (Appuyez sur Ctrl + Entrée pour démarrer et à nouveau pour arrêter.)
⎕AI
A ccount I nformation (ID utilisateur, temps de calcul, temps de connexion, temps de saisie)s←
affecter às
(pour s temps tarte)⎕AI-s
soustraients
de⎕AI
3⊃
choisissez le troisième élément (temps de connexion en millisecondes)0 60 60 1E3⊤
convertissez en ce mélange-radix3↑
prenez les 3 premiers (supprime les millisecondes)100+
cent ajoutés à chacun (pour ajouter des zéros)':'@1∘⍕¨
modifiez avec deux points au premier caractère de la représentation de chaîne de chaque∊
ϵ nlist (flatten)1↓
supprime le premier deux-points (et l'imprime implicitement sur stdout)⎕DL 1
D e l ay une seconde→2
aller à la ligne numéro deuxla source
R ,
5944 octetsF
dans R par défautFALSE
, mais c'est une variable régulière et peut être redéfinie. Lorsqu'il est utilisé en arithmétique,FALSE
est contraint0
. DemanderF+1
revient donc1
. Nous assignonsF
à êtreF+1
, formatez-le bien, imprimez et attendez une seconde. Continue indéfiniment.Ne fonctionne pas sur TIO (en raison du manque de
hms
package), mais voici un exemple de sortie de ma machine:la source
bash + sleep + date,
également 504947464541 octetsPour prendre un temps au tour, appuyez rapidement sur ^ C, exécutez-le puis réexécutez ce qui précède:
Réinitialiser:
La syntaxe $ [s ++] semble toujours fonctionner, mais n'est plus (AFAICS) documentée dans la
bash
page de manuel. Et c'est toujours un octet plus court que d'utiliser la boucle for ((...)), une fois que j'ai supprimé les guillemets qui l'entourent.la source
$[]
est une forme obsolète / non documentée mais toujours prise en charge$(())
. Je ne sais pas s'il est couramment utilisé dans les réponses de code-golf, mais la règle générale est que votre code ne doit fonctionner que sur au moins une version de l'interpréteur pour votre langue. OMI ça va.s=0
n'est pas requis, car la substitution arithmétique traitera une variable non définie comme 0 .-u
n'est également pas nécessaire si vous supposez simplement le fuseau horaire par défaut (UTC).Swift , 144 octets
Explication
la source
JavaScript (ES6), 99 octets
la source
Matlab (R2016b), 50 octets
Explication:
Version alternative (50 octets aussi: P):
la source
:)
t
? De plus, l'entrée àdatestr
est en jours, donc je devrais diviser par86400
, ce qui augmenterait le nombre d'octets de deux ...Julia 0,6 ,
7568 octetsEssayez-le en ligne!
Avec sleep (1) autorisé, les boucles for imbriquées simples sont plus courtes que l'utilisation des méthodes de gestion du temps intégrées de Julias.
Ancienne solution sans sommeil (1) utilisant DateTime
t
est le temps écoulé entre le «jour 0» et le démarrage du programme.now()-t
est un moment dans le temps , qui est ensuite formaté en utilisantDates.format()
.t0=now(); ...; now()-t0
donnerait une différence de temps , qui ne peut pas être utilisée avecDates.format()
.Le timing lui-même est trivial avec le build-in
Timer
.la source
Python 2 , 85 octets
Crédits
la source
"%02d:%02d:%02d"
par(":%02d"*3)[1:]
%24
, le comportement n'est pas défini après23:59:59
.JavaScript (ES6), 88 octets
Essentiellement la même approche que la réponse de @ darrylyeo , mais fonctionne pour tous les fuseaux horaires et utilise une manière légèrement différente pour arriver à 0.
[Modifier] La réponse de Darryl a été corrigée. C'est encore plus court, cependant.
la source
> <> , 82 + 7 = 89 octets
Essayez-le en ligne!
+7 octets pour utiliser l'indicateur
-t.0125
pour que chaque instruction prenne 1 / 80e de seconde. Chaque boucle contient 80 instructions, ce qui fait que chaque boucle dure une seconde. En raison du temps de calcul, cela est en fait plus long en pratique.En fait, j'ai dû tamponner cela jusqu'à 100 jusqu'à ce que je voie la réponse de @Not A Tree qui avait 7 octets de meilleure façon que la mienne pour générer les heures et les minutes, en la coupant en dessous de 80. Ils ont également inspiré l'utilisation de ceux-ci
\/
qui sont exécutés deux fois par boucle.Comment ça marche
Prime:
Une version une ligne de la même taille, 80 + 9 octets:
Cela utilise l'
-a
indicateur pour ajouter des graduations pour les instructions ignorées.la source
PHP 4+,
7064 octetsPHP 5.3+,
6963 octetsla source
Python 3 , 112 octets
En supposant que l'utilisation de délais d'une seconde est acceptable, même si elle (rarement) peut sauter une seconde.
la source
VBA, 90
exécuter dans la fenêtre immédiate: point de défaillance prévu quelque part autour de 23 millions d'années (la résolution en virgule flottante échoue ~ 8,5 e9 jours)
la source
Gelée , 23 octets
Essayez-le en ligne!
la source
AWK ,
1108786 octetsNe fonctionne pas dans TIO.
la source
00:00:00
au moment où il a démarré.APL (Dyalog) , 37 octets
Essayez-le en ligne!
Programme complet.
Assez similaire à la réponse d'Adám, cependant écrite indépendamment et utilise une
⎕AI
approche non basée.la source
Bash + coreutils + date GNU, 50 octets
Inspirée par @Dennis, cette solution ne nécessite pas de changement de temps. Il stocke le décalage initial à partir de maintenant à l'époque UNIX (1er janvier 1970 00:00:00 UTC), en «o», puis affiche [-ud options] (l'heure actuelle - décalage), en date UTC, mais uniquement [option +% X] HH: MM: SS. Cela devrait fonctionner dans les pays où le fuseau horaire actuel n'est pas UTC.
la source
Nettoyer ,
173172168 168 octetsCelui-ci ne fonctionne que sous les bundles Windows Clean.
Ajoutez 3 octets si vous voulez qu'il fonctionne sous Linux, comme Clean's
CLK_PER_TICK :== 1000000
on * nix. Si vous souhaitez qu'il soit multiplateforme, ajoutez plutôt 8 octets, car vous devez utiliser à laCLK_PER_TICK
place de la valeur sur laquelle il est défini. (Le lien TIO est plus grand en raison de ce qui précède )Essayez-le en ligne!
la source
Python 2 , 69 + 3 (
TZ=
) = 72 octetsCela fonctionne en boucle continue, sans sommeil, mettant à jour l'heure sur la même ligne plutôt que d'imprimer une nouvelle ligne chaque seconde. (Toujours autorisé par les règles, j'espère.)
Cette version légèrement plus longue (72 + 3 = 75 octets) s'imprime à la place sur une nouvelle ligne toutes les secondes:
Les deux nécessitent que vous soyez dans le fuseau horaire UTC. Sous Linux, vous pouvez y parvenir en définissant la
TZ
variable d'environnement. Par exempleTZ= python
.la source
> <> ,
106 octets82 + 9 = 91 octetsMerci à Jo King d'avoir suggéré le
-a
drapeau! Découvrez également leur réponse .Essayez-le en ligne! (mais vous devrez attendre le délai d'attente de 60 secondes).
J'ai dû utiliser une fonctionnalité de> <> dont je n'avais jamais eu besoin auparavant: ce code nécessite l'indicateur
-t.0125
, qui définit la vitesse d'exécution à 0,0125 seconde par tick, ou 80 ticks par seconde. Il y a aussi le-a
drapeau, qui fait que les espaces comptent comme une tique (dans certains cas - l'interprète est un peu bizarre à ce sujet).Fondamentalement, le code conserve un compteur qui est incrémenté chaque fois que le poisson traverse la boucle, et le reste de la boucle convertit le compteur en
hh:mm:ss
format et l'imprime. La boucle prend exactement 80 ticks.Cela devrait fonctionner en théorie, mais en pratique, chaque tick est légèrement plus long que 0,0125 seconde, en raison du temps de calcul. Changer le
\\
sur la deuxième ligne pour<<
donner des timings plus précis sur TIO.Vous pouvez également regarder le code en action au terrain de jeu de poissons , sauf que cet interprète traite les espaces légèrement différemment de l'interprète officiel. Alternativement, vous pouvez supprimer les indicateurs sur TIO pour faire fonctionner le code à vitesse maximale, pour vérifier le comportement pendant des temps après une minute.
la source
\!
et en supprimant deux des supplémentaires<
. Un autre couple d'octets si vous utilisez le-a
drapeau, qui compte les espaces blancs et les instructions ignorées comme des tiques-a
drapeau m'a laissé jouer un peu plus, merci! Je pense que vous pouvez aussi utiliser l'\!
astuce dans votre code: essayez-le en ligne!Java 8, programme complet, 150 octets
Essayez-le ici (expire après 60 secondes, j'ai donc mis le sommeil à 1 pour voir plus de sortie).
Explication:
Java 8, fonction, 94 octets
Essayez-le ici (expire après 60 secondes, j'ai donc mis le sommeil à 1 pour voir plus de sortie).
Explication:
Voici un petit gif pour voir qu'il fonctionne comme prévu lorsque 1000 ms sont utilisées:
la source
PHP,
5948 octetsInspiré par la réponse de Darren H .
Ancienne version :
la source
-3600
tout, ce qui économiserait 5 octets.Shell , 177 octets
Notez que ce n'est pas entièrement conforme à POSIX car il utilise
date +%s
, qui est unedate
extension courante .la source
Rubis,
192117octets (crédit à Dada)Comment ça marche?
Vous allez utiliser la version étendue (la conversion en une heure est donnée comme une fonction distincte et utilise un format de sortie différent):
la source
printf
au lieu deputs
peut économiser quelques octets supplémentaires: Essayez-le en ligne! . Bon golf sur PPCG!APL NARS,
109 6357 caractères3 + 3 + 48 + 3 = 57 (vu les autres solutions Apl aussi)
convertir l'INT ⍵ dans la chaîne de chiffres d'une manière si la longueur de cette chaîne est 1 que d'ajouter un '0' devant
combiner le tableau dans ⍵ avec le tableau «::»
la source
Code machine x86-64 (appel système Linux): 78 octets
Synchronisation en boucle spin RDTSC ,
sys_write
appel système Linux .x86-64 ne fournit pas un moyen pratique d'interroger la fréquence de "l'horloge de référence" RDTSC au moment de l'exécution. Vous pouvez lire un MSR (et faire un calcul basé sur cela) , mais cela nécessite le mode noyau, ou root + ouverture
/dev/cpu/%d/msr
, j'ai donc décidé de faire de la fréquence une constante de temps de construction. (AjustezFREQ_RDTSC
si nécessaire: toute constante 32 bits ne changera pas la taille du code machine)Notez que les processeurs x86 ont depuis plusieurs années une fréquence RDTSC fixe, il est donc utilisable comme source de temps, pas comme compteur de performances de cycle d'horloge de base, sauf si vous prenez des mesures pour désactiver les changements de fréquence. (Il existe des compteurs de performances réels pour compter les cycles CPU réels.) Habituellement, il coche à la fréquence nominale de l'autocollant, par exemple 4,0 GHz pour mon i7-6700k, indépendamment du turbo ou de l'économie d'énergie. Quoi qu'il en soit, cette temporisation d'attente ne dépend pas de la moyenne de la charge (comme le ferait une boucle de retard calibrée), et n'est pas non plus sensible à l'économie d'énergie du processeur.
Ce code fonctionnera pour tout x86 avec une fréquence de référence inférieure à 2 ^ 32 Hz, soit jusqu'à ~ 4,29 GHz. Au-delà de cela, les 32 bas de l'horodatage se termineraient en 1 seconde, donc je devrais aussi regarder les
edx
32 bits élevés du résultat.Résumé :
pousser
00:00:00\n
sur la pile. Puis en boucle:sys_write
appel systèmecmp
/cmov
, le résultat CF fournissant le report pour le chiffre suivant.rdtsc
et enregistrez l'heure de début.rdtsc
jusqu'à ce que le delta soit> = ticks par seconde de la fréquence RDTSC.Liste NASM:
Décommentez l'
pause
instruction d'économiser une puissance significative: cela chauffe un cœur de ~ 15 degrés C sanspause
, mais seulement de ~ 9 avecpause
. (Sur Skylake, où ilpause
dort pendant ~ 100 cycles au lieu de ~ 5. Je pense que cela économiserait plus s'ilrdtsc
n'était pas aussi lent, donc le CPU ne fait pas beaucoup de temps).Une version 32 bits serait plus courte de quelques octets, par exemple en utilisant une version 32 bits pour pousser la chaîne initiale 00: 00: 00 \ n.
Et en utilisant également 1 octet
dec edx
. L'int 0x80
appel système ABI n'utiliserait pas esi / edi, donc la configuration du registre pour syscall vs lodsb / stosb pourrait être plus simple.la source
nanosleep
appel système, mais c'était plus intéressant. Avec root sur Linux, il est possible de lire le bon MSR et d'obtenir par programmation la fréquence RDTSC.q / kdb + , 40 octets
Solution:
Exemple:
Explication:
Il y a trois commandes en cours d'exécution ici:
.z.ts:{-1($)18h$a+:1}; / override timer function
a:-1; / initialise variable a to -1
(.)"\\t 1000" / start the timer with 1000ms precision
Répartition de la fonction minuterie:
Prime:
Alternative 1 pour 41 octets :
Alternative 2 pour 26 + 7 octets = 33 octets
et en ajoutant
-t 1000
comme arguments au q binaire.la source