En 1984, Michael Crichton a écrit un programme de sécurité en BASIC qui a été publié dans le magazine Creative Computing. Le programme demanderait à l'utilisateur de taper une phrase de son choix, enregistrer les intervalles entre les frappes, puis lui demander de retaper la phrase. Si les horaires différaient trop, le programme identifierait l'utilisateur comme imposteur.
Votre mission: créez une version du programme de Crichton dans la langue de votre choix.
Règles:
Les phrases pour communiquer avec l'utilisateur («Veuillez saisir la phrase clé», «Veuillez saisir à nouveau la phrase clé», etc.) comptent pour un octet chacune, quelle que soit la longueur réelle. Ceci est uniquement pour la communication utilisateur, n'essayez pas de masquer le code du programme dans les chaînes.
Le test de réussite / échec doit être basé sur la valeur absolue moyenne des écarts en pourcentage par rapport aux intervalles d'origine. Si les chaînes ne correspondent pas, retournez en cas d'échec ou autorisez l'utilisateur à réessayer, à votre discrétion.
La phrase clé ne doit pas autoriser une chaîne nulle. Dans le cas où la phrase clé est trop longue pour votre type de données de chaîne, tronquer ou interdire et recommencer, à votre discrétion.
La sensibilité du test (le seuil du test de réussite / d'échec) doit être réglable dans le code source.
À l'origine, j'ai fourni un bonus de 20% du nombre total d'octets si votre code source peut être formaté pour ressembler de manière reconnaissable à un dinosaure. Il a été souligné que cela est très subjectif et peut-être plus approprié pour un concours de popularité, j'ai donc supprimé ce bonus. Cependant, j'encourage toujours vivement le formatage des dinosaures, et si vous formatez votre code pour ressembler à un dinosaure, vous pouvez déduire tous les commentaires purement cosmétiques, les sauts de ligne ou les espaces blancs de votre total d'octets.
Le nombre d'octets le plus court gagne, sous réserve de la longueur de la chaîne et des ajustements de formatage des dinosaures.
Notez que mes spécifications ci-dessus ne correspondent pas exactement au fonctionnement du code de Crichton, dont des copies peuvent être trouvées en ligne. Suivez les spécifications, n'essayez pas de cloner l'original.
"Please type the key phrase"
compte comme 1 octet, ou seulement la phrase compte et la phrase citée compte comme 3 octets ("
, phrase,"
)? Est-il intentionnel qu'un intervalle beaucoup plus long et un intervalle beaucoup plus court "s'annulent" et redeviennent encore? Le programme doit-il vérifier que les deux phrases clés correspondent?Réponses:
Rubis,
171 167157 octetsSorties
true
si la variance moyenne est supérieure à 20%, sinon sortiesfalse
.Tentative artistique des dinosaures ASCII:
Non golfé:
require 'io/console'
pourrait être supprimé lors de l'exécution dans certains REPL Ruby, car la bibliothèque est déjà chargée.la source
Java 768 octets
quelle? Java? pour le golf de code?
C'est probablement la pire chose à faire, mais je l'ai quand même essayé.
Il affiche tous les messages dans la fenêtre de la console, mais la saisie réelle se produit dans le JTextField. Pas vraiment beau. Oh, et pour économiser 5 octets, vous devez redimensionner le JFrame vous-même. En outre, il ne vérifie pas l'exactitude de la chaîne la deuxième fois. Je ne sais pas si c'est contre les spécifications.
Utiliser:
Tapez votre clé dans le champ de texte.
N'appuyez pas sur Entrée, accédez à la console et tapez quelque chose. Il affichera un autre message
Tapez la même chose dans le champ de texte (qui devrait maintenant être effacé).
Accédez à la console et appuyez à nouveau sur quelque chose. Il affichera si vous êtes un intrus ou non.
non golfé:
golfé:
la source
JFrame
, donc vous n'en auriez pas besoinf
.HTML, JavaScript (ES6), 328
Le nombre total d'octets du code est de 402 octets et les messages pour interagir avec l'utilisateur:
sont au total 78 octets, donc score total => 402 - 78 + 4 = 328
Exécutez l'extrait de code ci-dessous dans un dernier Firefox et tapez la clé dans la zone de saisie suivie de la touche Entrée.
Le code vérifie que les clés saisies et ressaisies sont identiques (invite à entrer à nouveau sinon), calcule le pourcentage moyen de différence absolue et vérifie s'il est inférieur à la valeur de la variable
V
la source
C, 154 (86 + 68 pour les drapeaux)
Compiler avec
-DY=(y=clock())-x
,-DZ=a[d]
,-DE=getch()
,-DW=);while
,-DU=i++[d]=Y
et-DP=puts(
. Les nouvelles lignes sont ajoutées à des fins de présentation et peuvent être supprimées (le nombre d'octets donné est sans).Ungolfed + commentaires:
Cela ne vérifie pas que la phrase retapée est identique, ni ne produit quoi que ce soit si l'utilisateur n'est pas identifié comme imposteur.
Cela ne prend pas non plus en compte le temps nécessaire après l'invite avant la première frappe.
la source
getch
pariergetc
ougetchar
? J'ai une référence indéfinie à `getch ', qui si je me souviens bien est obsolète?char
avant les déclarations globales, et maintenant, cela donne un défaut de segmentation au moment de l'exécution. Pouvez-vous donner des détails sur la façon de le construire? Quel compilateur utilisez-vous? Merci.int
et initialisé à0
. J'ai testé cela en utilisant gcc sur Windows (en utilisant Windowsgetch
).getch
est utilisé à la place degetc
ougetchar
cargetch
ne nécessite pas d'appuyer sur la touche de retour avant de traiter des caractères (getch
est en effet obsolète sous Windows, bien qu'il n'y ait rien de mal à utiliser des fonctions obsolètes ici).Scala REPL 233
Avec tout l'espacement supprimé, vous avez:
Je suis sûr que quelqu'un de plus talentueux que moi pourrait en faire un dinosaure!
Brève explication:
La
l
méthode lit les caractères et conserve une partie de lananoTime
lorsque chaque caractère a été tapé.La
m
méthode s'imprime"Enter"
, rompt lal
méthode en appuyant sur Entrée (caractère 13), puis la mappe sur juste lenanoTimes
, puis obtient les intervalles de temps entre chaque caractère.Les 2 lignes suivantes lisent en 2 chaînes, les zippent, puis trouvent la valeur absolue moyenne de la différence en pourcentage entre le deuxième intervalle et le premier, et imprime finalement si cette moyenne était inférieure ou non
0.2
.la source
Lisp commun: 660
Non golfé
Remarque additionnelle
Bonus de dinosaure
Je devrais avoir un bonus parce que tout le monde sait que " Common Lisp est un dinosaure moribond ".
la source