Leer una contraseña: en el móvil!

13

Gracias al desafío reciente de MD XF , ¡ahora podemos leer contraseñas en muchos idiomas diferentes! El problema es que ahora necesitamos portar nuestras aplicaciones a dispositivos móviles, y ellos ingresan la contraseña de manera un poco diferente.

Desafío

  • Leer una cadena del teclado.
  • Cada vez que kse ingresa un carácter , muéstrelo por un breve intervalo de tiempo.
  • Después de que el intervalo de tiempo haya pasado O el usuario haya ingresado otro carácter, reemplácelo kcon algún carácter c.

Reglas

  • cdebe ser constante; Debe ser el mismo personaje.
  • c puede ser cualquier carácter visible (es decir, no puede ser una nueva línea, espacio, tabulación o no imprimible).
  • cno puede basarse en ninguna entrada k; cdebe estar definido / constante antes de que kse lea el primero .
  • c debe ser el mismo cada vez que se ejecuta el programa.
  • cpuede ser uno de los valores dados como kpor accidente, siempre que se sigan todas las demás reglas.

  • Debe imprimir ken tiempo real. Tan pronto como el usuario ingrese uno nuevo k, debe mostrarlo de inmediato.
  • kdebe ser visible para el usuario final antes de cambiarlo a c; El intervalo de tiempo no será inferior a 0,5 segundos.
  • kdebe ser reemplazado por cdentro de un tiempo razonable; el intervalo de tiempo no debe exceder los 5 segundos.
  • Tan pronto como se introduce un nuevo personaje, si el intervalo de tiempo ha expirado, se debe reemplazar kcon cy utilizar la clave introducida como la nueva kforma inmediata.

  • Es aceptable borrar y volver a dibujar la pantalla cada vez que necesite cambiar un personaje.
  • Puede usar cualquier método razonable de entrada y salida siempre que se sigan todas las demás reglas.
  • Puede suponer que el número de caracteres ingresados ​​nunca es más largo que el ancho de la ventana del terminal / gráfico.
  • Si usa un terminal, su programa debe finalizar después de ingresar una nueva línea o alcanzar EOF.
  • Su programa debe funcionar como se describe aquí en entornos móviles y de otro tipo.

  • Su programa puede suponer que la entrada solo contendrá caracteres imprimibles (letras, números, símbolos) y posiblemente una nueva línea de terminación (sin retroceso, teclas de flecha, borrar, etc.).
  • Su programa puede finalizar cuando se presiona Ctrl + C.
  • Puede finalizar su programa cerrando una ventana, si su programa inicia una.

Puntuación

Esto es , por lo que gana la respuesta más corta en cada idioma.

Ejemplo

Aquí hay un ejemplo de cómo debería ser. Tenga en cuenta que esto se registra en una plataforma móvil, pero también debería funcionar en una plataforma de escritorio.

contraseña

musicman523
fuente
Para aquellos que pueden ver publicaciones eliminadas, aquí está la publicación de Sandbox
musicman523
¿Qué teclado estás usando en el video?
Beta Decay
1
@BetaDecay la notificación al final indica teclado
zenui
@BetaDecay De hecho, es el teclado ZenUI. ¿Solo curiosidad, o importa?
musicman523
@ musicman523 Simplemente curioso :)
Decaimiento Beta

Respuestas:

4

HTML + JavaScript, 20 + 105 = 125 bytes

<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)

La demora entre la entrada ky la carta* es de un segundo.

JavaScript oninput, formateado

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

Fragmento de prueba

Se agregó el soporte final ( >) para una mejor compatibilidad.

<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
fuente
¡Aunque no parece terminar!
officialaimm
1
@officialaimm El desafío establece que solo las aplicaciones de terminal deben tener una forma de terminarlas.
Justin Mariner
Ah, tonto de mí. Lo siento.
officialaimm
3

Python 3 , 186 224 bytes

Funciona solo en ventanas.

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)

Versión anterior (186 bytes): la suspensión fue obligatoria independientemente de la velocidad a la que se presionó la tecla.

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
fuente
1
No creo que esto cumpla con todos los criterios, específicamente 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.Dicho esto, no puedo probarlo ya que no ejecuto Windows, ¡hágamelo saber! Puede encontrar este desafío relacionado útil como referencia
musicman523
Supuse que el reemplazo de k a c era solo gráfico (que se cumple en mi código). ¿También quiso cambiar el valor almacenado de k con c?
officialaimm
1
No, eso es todo lo que debería haber. Su retraso de tiempo es de .6 segundos. ¿Qué sucede si escribo dos letras con una diferencia de .1 segundos? ¿Seguirás durmiendo durante 1,2 segundos? Una vez más, lo siento, no puedo probar esto yo mismo, ¡podría valer la pena publicar un video de usted ejecutando su código!
musicman523
Modificado. La versión más nueva garantiza que se pueda lanzar un nuevo personaje incluso antes de que el tiempo del personaje anterior no haya terminado.
officialaimm
3

Python 2 , 133 bytes

Basado en la respuesta @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
fuente
Woah, 90 bytes menos !!! Votaría pero mi límite diario ha sido alcanzado. ¿Hay alguna manera de verificarlo (solo tengo Python 3 en mi PC)? Por cierto, no veo una pantalla clara, ¿cómo se gestiona?
officialaimm
@officialaimm por el \ren la impresión
Felipe Nardi Batista
1
Publicaré una variante py3 cuando llegue a mi clase
Felipe Nardi Batista
1
@officialaimm esto debería funcionar, estoy en el cajero automático de Linux, así que no puedo probarlo
Felipe Nardi Batista
Lo revisé, está funcionando. (y)
officialaimm