Votre tâche consiste à créer un programme qui mesure à quelle vitesse vous pouvez taper les lettres de l’alphabet anglais.
- Le programme ne doit accepter les lettres minuscules
a
àz
dans l' ordre alphabétique. - Chaque lettre est répercutée sur la même ligne (sans nouvelle ligne ni autre séparateur entre les lettres).
- Si vous tapez un caractère invalide, le programme doit sortir
Fail
sur une nouvelle ligne et sortir. - Si vous tapez toutes les 26 lettres, le programme doit, sur une nouvelle ligne , afficher le temps en millisecondes écoulé de la première à la dernière lettre et quitter.
- La minuterie démarre lorsque vous tapez la première lettre,
a
.
Exemple de sorties:
b
Fail
abcdefgg
Fail
abcdefghijklmnopqrstuvwxyz
6440
C'est du code-golf , donc la réponse la plus courte en octets est gagnante.
code-golf
date
alphabet
interactive
Danko Durbić
la source
la source
Fail
sans une nouvelle ligne? (par exempleabdFail\n
ouabd Fail\n
))Fail
ou les millisecondes) doit figurer sur une nouvelle ligne, comme dans l'exemple. La plupart des réponses supposent déjà cela.Réponses:
HTML (JavaScript (ES6)),
129126117 octetsCliquez dans l'entrée et commencez à taper! De plus, ma dactylographie est nulle; Je prends environ 5 secondes, même avec la pratique. Edit: 2 octets enregistrés grâce à @HermanLauenstein en changeant de langue. Sauvegardé 3 octets grâce à @ qw3n. Sauvegardé 9 octets grâce à @tsh.
la source
<input id=i><script>l=0;n=Date.now;i.onkeypress=e=>e.charCode-97-l?i.outerHTML='Fail':l>24?i.outerHTML=n()-t:t=l++?t:n()</script>
-11 octets si la balise de fermeture n'est pas nécessaire<input id=i onkeypress=event.which-97-l?i.outerHTML='Fail':24<l?i.outerHTML=n()-t:t=l++?t:n() onfocus=l=0,n=Date.now>
6502 code machine (C64 PAL),
189165 octetsDémo en ligne (Utilisation:
sys49152
)Explication:
Ce serait un programme minuscule sans le problème de la mesure exacte en millisecondes sur le C64. L'interruption du système se produit environ 60 fois par seconde, ce qui n'est même pas proche. Nous devons donc utiliser ici une minuterie matérielle qui tire ses ticks d’entrée de l’horloge système.
Sur une machine PAL, l’horloge système est exactement de 985248 Hz. Initialiser le minuteur sur 985 donne donc un résultat proche des millisecondes, mais c’est un peu trop rapide, il faudrait compter 986 cycles par quart de temps ou maintenir le chronomètre un cycle à la fois. Ceci est impossible, mais nous pouvons maintenir la minuterie pour 6 cycles avec la séquence
DEC $DD0E
,INC $DD0E
:$DD0E
est le registre de commande de minuterie avec le bit 0 commutation sur et en dehors, et les deux instructions prennent 6 cycles, donc les écritures exactes que arrêter et démarrer le minuterie sont exactement 6 cycles d'intervalle. Nous devons donc exécuter cette séquence tous les 6 * 4 = 24ème ticks. Ce n'est toujours pas absolumentexact, le retardateur prendra 1 milliseconde de retard après 8 minutes et 12 secondes, mais c’est probablement assez bon - compenser cela prendrait beaucoup de code.edit : La valeur de départ du minuteur doit être 984 et non 985, car ces minuteries se déclenchent "en aval", donc une valeur de 0 comptera un cycle supplémentaire avant le déclenchement. Code fixe, nombre d'octets inchangé.
Voici la liste de désassemblage commentée:
la source
.starttimer
- je le ferai bientôt :) (et même plus loin en utilisant le systèmeTI
comme cette réponse BASIC , mais je ne suis pas sûr que cela soit valide, car vous pouvez faire mieux en code machine )Bash + coreutils,
1039998 bytesDoit être exécuté dans un terminal.
Essai
la source
3479
c'est assez rapide! bien fait :)a
immédiatement me donneline 1: ((: r=15094100773N: value too great for base (error token is "15094100773N")
et quitte.date
force. Le mien provient de GNU coreutils 8.23. Qu'est-ce que l'date +%s%3N
impression sur votre système?15094104833N
- voici l’date
utilitaire intégré à macOS, si cela fait une différence.date
semblent utiliser strftime, ce qui ne se reconnaît pas%N
.Python 2 + getch , 116 octets
Merci à ovs et à ElPedro d’avoir corrigé le code et économisé 57 octets.
la source
SOGL V0.12 , 35 octets
Essayez-le ici! - Cliquez sur Exécuter et entrez l’alphabet dans la zone de saisie. Notez que cela peut être un peu lent, car SOGL ne met en pause que toutes les 100 jetons exécutés (et que SOGL est assez lent). Si cela vous dérange, lancez-vous
sleepBI=true
dans la console.remarque: ne lancez pas ceci en mode de compatibilité - ça va juste boucler pour toujours.
Explication:
la source
Pascal (FPC) , 176 octets
Essayez-le en ligne!
Quelques astuces utilisées dans le code pour le golf:
Real
comme alternative plus courte àTDateTime
, parce que tel que défini ici ,TDateTime
=Double
, qui est un type à virgule flottante.MilliSecondsBetween
pour calculer l'intervalle de temps, ce code multiplie la différence entre deux valeurs à virgule flottante par864e5
, ce qui fonctionne à cause de la manière dont Free Pascal code l'encodageTDateTime
décrit ici .Remarque:
ReadKey
Cette fonction n’imprime pas réellement la clé sur la console. Une écriture manuelle sur la consoleWrite(c)
est donc nécessaire.0
pour avoir tapé l'alphabet pour une raison évidente.la source
for c:='a'to'z'do
sur la même ligne quea:=Time;
.Now
au lieu deTime
le raccourcir.86398338
?? Je peux comprendre si vous multipliez 864e5 puisqu'il y a 864e5 millisecondes dans une journée. mais comment vient ce nombre magique?TDateTime
commeDouble
.864e5
semble plus correct, je vais résoudre les problèmes.Java,
404388354348320318 octetsEt ici, je pensais que la console Java était déjà prolixe.
Comme Java n’a aucun moyen de faire une écoute brute des touches sur la console autant que je sache, j’utilise une interface graphique avec
java.awt
.-78 octets grâce à @ OlivierGrégoire .
Explication:
Exemple de réussite: (Oui, je tape l’alphabet assez lentement ici ..)
Remarque: il s’agit d’un ancien gif. La version actuelle n’imprime plus les touches sur la console. Et il n’imprime plus l’heure avec les chiffres après le point décimal.
Exemple gif d'échec:
Remarque: Ceci est un ancien gif. La version actuelle n’imprime plus les touches sur la console.
la source
setVisible(false)
au lieu de quitter.show
etdispose
, qui est encore plus court quesetVisible
. Je n'utilise presque jamais l'interface graphique de Java .. Et intelligent d'utiliser l'initialisation de classe au lieu de la mettre dans la méthode main. Je devrais m'en souvenir.TextField
. En outre, vous pouvez utiliserTextArea
au lieu deTextField
deux octets. Enfin,KeyEvent
a unegetWhen
méthode qui donne le temps entre l'époque et l'événement en millisecondes. Juste besoin d'utiliser ceux-ci au lieu deSystem.nanoTime()
gagner encore plus d'octets.C # (.NET Core),
245 + 13183 + 41177 + 41 octets+41 octets pour
using System;using static System.Console
.Non testé car je suis sur mobile et cela ne fonctionne pas sur TIO.
la source
int x=0;
et puis fairex=1/x;
. Cela devrait économiser 14 octets. Malheureusement vous avez besoinx
. Si vous essayez de faire cela,1/0
vous obtenez une erreur du compilateur Division par constante zéro . 2) -5 octets pour combiner la déclaration dec
avec la premièreReadKey
. 3) Modifiez la condition à l'intérieurif
deReadKey!=++c
et supprimez-lac++;else
pour un autre -9 octets.x=1/x
peut être réduit àx/=x
. Et j'ai ajoutéusing static System.Console;
pour économiser encore plus d'octets :)i
et en utilisantc
plutôt la condition de boucle.MSX-BASIC, 126 caractères
TIME
est une variable interne MSX-BASIC qui augmente d'une unité toutes les 20 millisecondes.la source
C # (.NET Core) ,
184 + 13 = 197173 + 13 = 186 octetsEssayez-le en ligne!
Malheureusement, TIO ne peut pas l'exécuter, mais c'est pratique pour obtenir le nombre d'octets.
+13 pour
using System;
-1 en changeant
i==123
pouri>122
. J'ai été tenté de faire celai>'z'
.Remerciements
-10 octets grâce à @raznagul
Ungolfed
la source
ReadKey
condition sur la boucle afin de pouvoir supprimer le premierif
et lebreak
.Node.js,
240213 octetsEDIT: 27 octets sauvés grâce à Jordan
Version non-golfée:
la source
C (gcc) , 303 octets
Fonctionne sur les systèmes * nix. Code autonome supprimant le mode canonique du terminal actuel pour permettre la lecture de caractères sans attendre les nouvelles lignes:
/! \ L'exécution de ce programme rend le terminal presque inutilisable.
Ungolfed et commenté:
Solution alternative (218 octets):
Si la configuration préalable du terminal est autorisée, nous pouvons supprimer la partie du code qui traite cette partie.
Voici le même code sans manipulation de terminal:
Pour que cela fonctionne:
exemple d'exécution:
la source
Commodore BASIC v2 - 113 octets
Les lettres majuscules doivent être déplacées.
Merci à Felix Palmen pour avoir signalé quelques fautes de frappe, les spécifications l’
essaient
la source
TI
est incrémenté dans celui-ci). J’ai jugé impropre à cause de son manque de précision, mais je suppose que c’est juste, car il n’ya aucun moyen de faire mieux en BASIC :). une erreur de syntaxe dans1
- toute aide?1on-(f=26)gO4:gEa$:ifa$=""tH1
Nitpicks: 1.) la sortie est sur la même ligne, 2.) la sortie est en majuscule - Je pense que vous devriez les corriger, cela ne prendra pas beaucoup d'octets de toute façon :)Perl 5,
7993 +31 (-MTerm :: ReadKey -MTime :: HiRes = time) octets$|=1
n'est pas suffisant pour définir le terminal en mode brut,stty -icanon
doit être exécuté avant oupour afficher des caractères dans le terminal après l'exécution de la commande:
stty echo
oustty echo icanon
la source
ReadKey
! Vous pouvez enregistrer quelques octets ici et là,1e3
pour1000
,$s||=time
et si vous définissez d'$s
abord et ensuite appelezReadKey
, vous pouvez échanger lemap
vers un suffixefor
. J'aimerais diredie
au lieu deexit print
, mais je pense que vous avez raison ... J'ai bricolé avecprintf"\n%i"
mais ça a fini par être plus gros, et j'ai pensé à utiliser$-
au lieu de$s
, mais c'était stupide! :)$|=1;
, $ s || = le temps ne peut pas être échangé sur la carte car le minuteur doit démarrer après la première pression sur la touche, etdie
echoFail
sur stderr au lieu de stdout.exit print
c'est si long! Désolé, je ne pense pas avoir expliqué ma pensée pour lefor
bien:$s||=time,ReadKey eq$_||exit print" Fail"for a..z
devrait fonctionner, je pense ... Peut-être même$|=$s||=...
ou$|=map...
si vous préférez cette approche! Pensez-vous plutôt bien cloué!$|=map..
ne définit pas l'entrée non tamponnée dans le nouveau terminal (j'avais l'erreur lors de la suppression, ReadMode 3, car je testais au cours de la même session), et$s||=time
avant la première lecture, ReadKey démarrait trop tôt$|
, mais encore une fois, c'est stocker après la boucle, ce qui est trop tard! Vous avez une longueur d'avance!Aceto , 70 octets
Je commence par définir un point d'accrochage et une mise en miroir horizontale (
@|
), si la valeur de la pile est véracité. Ce n'est pas initialement, et le sera toujours plus tard. Nous reviendrons ici plus tard si une mauvaise clé est entrée. Ensuite, nous plaçons un a sur la pile ('a
), puis nous le dupliquons et lisons un seul caractère de l'utilisateur (d,
). Si les deux caractères ne sont pas égaux (=!
), nous nous "plantons" ($
) et retournons à la cible. Sinon, on pousse un autre "a" et on l’imprime, puis on règle l’heure actuelle ('apT
).Ensuite, nous entrons dans notre "boucle principale": nous "incrémentons" le caractère actuel et "incrémentons" le caractère (
'apToIc
), puis nous le dupliquons, lisons un nouveau caractère, le comparons et "crashons" si les caractères ne sont pas identiques (d,=!$
) Si nous ne sommes pas bloqués, nous comparons le caractère actuel à "z" (d'z=|
). Si ce n'est pas égal, nous imprimons le caractère, puis nous poussons un 1 et sautons "conditionnellement" (dans ce cas: toujours) au seulemento
dans le code (le début de notre boucle principale). S'il était égal à z, nous avons inversé horizontalement un espace vide au-dessus. Nous imprimons "z", puis appuyons sur l'heure actuelle (moins l'heure de début;t
) puis multiplions le nombre 1000 (obtenu en élevant 10 à la troisième puissance;91+3F
) par ce chiffre (car nous obtenons des secondes, millisecondes). Ensuite, nous imprimons une nouvelle ligne, l'heure, et quittons (pX
).En cas de plantage (mauvaise saisie de la part de l'utilisateur), nous sautons jusqu'au début. Puisque nous aurons maintenant une valeur de vérité sur la pile, nous refléterons horizontalement le
u
, ce qui inversera la direction dans laquelle nous nous déplaçons.n
Imprime un caractère de nouvelle ligne, puis nous poussons"Fail"
sur la pile, l’imprimons et quittons (pX
).la source
Mathematica (expression bloc-notes), 248 octets
Comment ça marche
Un
DynamicModule
avec unEventHandler
qui répond aux lettres minuscules. Les variablesx
,s
ett
maintenez les lettres appuyées jusqu’à présent, l’heure de début et l’heure de fin, respectivement. Dès que nous remarquonsx
être égal à{"a"}
, nous commençons le temps; nous affichons soit le temps total passé, soit la chaîne construite jusqu'à présent, ou en"Fail"
fonction de la condition remplie.Nous pourrions économiser un autre octet avec
t<1
plutôt quet==0
si nous pouvons supposer que personne n’est assez rapide pour taper l’alphabet en moins d’une seconde :)Si vous essayez ceci dans un cahier Mathematica, gardez à l'esprit que vous devez cliquer à l'intérieur du cadre avant d'enregistrer vos pressions de touche. (C’est la raison pour laquelle nous avons besoin du cadre pour commencer; s’il
Framed
n’y en a pas, alors l’ensemble de l’objet sélectionné est modifié lorsqu’une touche est enfoncée;la source
C #,
154152 + 13 = 165 octets2 octets sauvés grâce aux commentaires de Ayb4btu
Le code ci-dessus a des espaces pour le faire rentrer dans SE sans barre de défilement. Les espaces ne font pas partie du nombre d'octets
et 13 octets pour
using System;
C'est similaire à la version d'Ayb4btu mais avec les différences suivantes:
Stocker datetime comme un long permet de faire
c
un long aussi, et de raccourcir la déclarationLa boucle n'a pas besoin d'une pause séparée
Il n’est pas vraiment plus court d’utiliser
$"interpreted strings"
que d’ajouter un "\ n" nécessaire en millisecondes pour en faire une chaîne pour le inline siL'utilisation d'une
for
boucle nous permet parfois de sauvegarder les caractères sur un certain temps, bien que celui-ci ne soit pas sauvegardé de manière équivalente.while
De Ayb4btu:
s=s==0
peut devenirs=s<1
etc==123
peut devenirc>122
Ungolfed
la source
DateTime
. Vous pouvez enregistrer un couple plus d' octets en changeants=s==0
des=s<1
(comptage sur le fait que s ne sera pas négatif) et la modificationi==123
dei>122
.i<123
devait aller avant leReadKey()
, sinon il attend un autre caractère après z avant d'afficher l'heure.z
devrait signifier readkey.keychar renvoie 122 lorsque l’utilisateur tape z, c vaut également 122, donc'z' == 122
réussit, c est alors incrémenté, puis c (contre 123) est testéc<123
et échoue, arrêtant la boucle .. ?c++
incrément lorsque je l'ai regardé. Cependant, je viens de l'essayer et quand je tape,abcdefghijklmnopqrstuvwxys
ça me donne un temps au lieu d'échouer. Je crois que c’est parcec
que, même si laKeyChar
vérification échoue, incrémente toujoursc>122
.Processing.org
133142le premier code n'est pas sorti
la source
GCC, Windows, 98 octets
Ne nécessite aucune saisie instantanée pour la première clé
la source