Lire un mot de passe: sur mobile!

13

Grâce au récent défi de MD XF , nous pouvons désormais lire les mots de passe dans de nombreuses langues différentes! Le problème est que nous devons maintenant porter nos applications sur des appareils mobiles, et ils saisissent un mot de passe un peu différemment.

Défi

  • Lisez une chaîne du clavier.
  • Chaque fois qu'un caractère kest entré, affichez-le pendant un court intervalle de temps.
  • Une fois l'intervalle de temps écoulé OU l'utilisateur a entré un autre caractère, remplacez-le kpar un caractère c.

Règles

  • cdoit être constant; ce doit être le même personnage.
  • c peut être n'importe quel caractère visible (c'est-à-dire qu'il ne peut pas s'agir d'une nouvelle ligne, d'un espace, d'une tabulation ou non imprimable).
  • cne peut pas être basé sur une entrée k; cdoit être défini / constant avant la première klecture.
  • c doit être le même à chaque exécution du programme.
  • cpeut être l'une des valeurs données comme kpar accident, tant que toutes les autres règles sont respectées.

  • Vous devez imprimer ken temps réel. Dès que l'utilisateur saisit un nouveau k, vous devez l'afficher immédiatement.
  • kdoit être visible par l'utilisateur final avant d'être remplacé par c; l'intervalle de temps ne doit pas être inférieur à 0,5 seconde.
  • kdevrait être remplacé par cdans un délai raisonnable; l'intervalle de temps ne doit pas dépasser 5 secondes.
  • Dès qu'un nouveau caractère est entré, que l'intervalle de temps soit expiré ou non, vous devez remplacer kpar cet utiliser la clé entrée comme nouveau kimmédiatement.

  • Il est acceptable d'effacer et de redessiner l'écran chaque fois que vous devez changer un personnage.
  • Vous pouvez utiliser toutes les méthodes d'entrée et de sortie raisonnables tant que toutes les autres règles sont respectées.
  • Vous pouvez supposer que le nombre de caractères saisis n'est jamais supérieur à la largeur du terminal / de la fenêtre graphique.
  • Si vous utilisez un terminal, votre programme doit se terminer après la saisie d'une nouvelle ligne ou lorsque l'EOF est atteint.
  • Votre programme devrait fonctionner comme indiqué ici sur les environnements mobiles et autres.

  • Votre programme peut supposer que l'entrée ne contiendra que des caractères imprimables (lettres, chiffres, symboles) et éventuellement une nouvelle ligne de fin (pas de retour arrière, de touches fléchées, de suppression, etc.).
  • Votre programme peut se terminer lorsque vous appuyez sur Ctrl + C.
  • Vous pouvez terminer votre programme en fermant une fenêtre, si votre programme en lance une.

Notation

C'est le , donc la réponse la plus courte dans chaque langue gagne!

Exemple

Voici un exemple de ce à quoi cela devrait ressembler. Notez que cela est enregistré sur une plate-forme mobile, mais devrait également fonctionner sur une plate-forme de bureau.

mot de passe

musicman523
la source
Pour ceux qui peuvent voir les messages supprimés, voici le post Sandbox
musicman523
Quel clavier utilisez-vous dans la vidéo?
Beta Decay
1
@BetaDecay la notification à la fin du clavier
zenui
@BetaDecay C'est en fait le clavier ZenUI. Juste curieux, ou est-ce important?
musicman523
@ musicman523 Just curious :)
Beta Decay

Réponses:

4

HTML + JavaScript, 20 + 105 = 125 octets

<input id=I oninput=v=I.value;s='*'.repeat(l=v.length-1);I.value=s+v[l];clearTimeout(I.t);I.t=setTimeout(`I.value=s+'*'`,1e3)

Le délai entre l'entrée de ket la lettre devenant *est d'une seconde.

JavaScript oninput, formaté

v=I.value;
s='*'.repeat(l=v.length-1);
I.value=s+v[l];
clearTimeout(I.t);
I.t=setTimeout(`I.value=s+'*'`,1e3)

Extrait de test

Ajout du crochet de fin ( >) pour une meilleure compatibilité.

<input id=I oninput=v=I.value;s='*'.repeat(l=v.length-1);I.value=s+v[l];clearTimeout(I.t);I.t=setTimeout(`I.value=s+'*'`,1e3)>

Justin Mariner
la source
Ne semble cependant pas se terminer!
officialaimm
1
@officialaimm Le défi indique que seules les applications de terminal doivent avoir un moyen de les terminer.
Justin Mariner
Ah, idiot moi. Pardon.
officialaimm
3

Python 3 , 186 224 octets

Fonctionne uniquement sous Windows.

import os,time,msvcrt as m
i=s=x=0;t=time.clock
def v():os.system("cls")
v()
while 1:
 if m.kbhit():
  k=str(m.getch())
  if"\\r"in k:break 
  i+=1;x=1;v();print("*"*(i-1)+k[2]);s=t()
 if (t()-s>.6and x):x=0;v();print("*"*i)

Version plus ancienne (186 octets): la mise en veille était obligatoire quelle que soit la vitesse à laquelle la touche était enfoncée.

import os,time,msvcrt
a=k=[];i=0;o=os.system
while 1:
 o("cls")
 if i:print("*"*(i-1)+a[i-1]);time.sleep(.6);o("cls");print("*"*i)
 k=str(msvcrt.getch())
 if"\\r"in k:break
 a+=k[2];i+=1
officialaimm
la source
1
Je ne pense pas que cela répond tout à fait à tous les critères, en particulier As soon as a new character is entered, whether or not the time interval has expired, you should replace k with c and use the entered key as the new k immediately.Cela étant dit, je ne peux pas le tester car je n'exécute pas Windows, alors faites le moi savoir! Vous pouvez trouver ce défi connexe utile comme référence
musicman523
J'ai supposé que le remplacement de k à c n'était que graphique (ce qui est réalisé dans mon code). Vouliez-vous aussi changer la valeur stockée de k avec c?
officialaimm
1
Non, c'est tout ce qu'il devrait y avoir. Votre délai est de 0,6 seconde - que se passe-t-il si je tape deux lettres à 0,1 seconde l'une de l'autre? Voulez-vous toujours dormir pendant 1,2 seconde? Encore une fois, désolé, je ne peux pas tester cela moi-même - cela pourrait valoir la peine de publier une vidéo de vous exécutant votre code!
musicman523
Modifié. La nouvelle version garantit que le nouveau personnage peut être lancé avant même que le temps du personnage précédent ne soit écoulé.
officialaimm
3

Python 2 , 133 octets

Basé sur la réponse @officialaimm .

import time,msvcrt as m
k=T=0
s=p='\r'
while'\r'!=k:
 t=time.time();print s,
 if m.kbhit():k=m.getch();s=p+k;T=t;p+='*'
 if t-T>1:s=p
Felipe Nardi Batista
la source
Woah, 90 octets de moins !!! Voterait mais ma limite quotidienne a été atteinte. Existe-t-il un moyen de le vérifier (je n'ai que python 3 sur mon PC)? Btw je ne vois pas d'écran clair, comment est-il géré?
officialaimm
@officialaimm by the \rin the print
Felipe Nardi Batista
1
Je publierai une variante py3 quand j'arriverai dans ma classe
Felipe Nardi Batista
1
@officialaimm cela devrait fonctionner, je suis sur linux atm, donc je ne peux pas le tester
Felipe Nardi Batista
Je l'ai vérifié, ça marche. (y)
officialaimm