Leia uma senha: no celular!

13

Graças ao recente desafio do MD XF , agora podemos ler senhas em diversos idiomas! O problema é que agora precisamos portar nossos aplicativos para dispositivos móveis, e eles inserem a senha de maneira um pouco diferente.

Desafio

  • Leia uma string do teclado.
  • Sempre que um caractere kfor inserido, exiba-o por um curto intervalo de tempo.
  • Após o intervalo de tempo OU, o usuário inseriu outro caractere, substitua kpor algum caractere c.

Regras

  • cdeve ser constante; deve ser o mesmo personagem.
  • c pode ser qualquer caractere visível (ou seja, não pode ser uma nova linha, espaço, guia ou não imprimível).
  • cnão pode ser baseado em nenhuma entrada k; cdeve ser definido / constante antes que o primeiro kseja lido.
  • c deve ser o mesmo sempre que o programa for executado.
  • cpode ser um dos valores dados como kse por acidente, desde que todas as outras regras sejam seguidas.

  • Você deve imprimir kem tempo real. Assim que o usuário inserir um novo k, você deve exibi-lo imediatamente.
  • kdeve estar visível para o usuário final antes de ser alterado para c; o intervalo de tempo não deve ser inferior a 0,5 segundos.
  • kdeve ser substituído cdentro de um prazo razoável; o intervalo de tempo não deve exceder 5 segundos.
  • Assim que um novo personagem é introduzido, com ou sem o intervalo de tempo tiver expirado, você deve substituir kcom ce use a chave entrou como o novo kimediatamente.

  • É aceitável limpar e redesenhar a tela sempre que precisar alterar um personagem.
  • Você pode usar qualquer método razoável de entrada e saída, desde que todas as outras regras sejam seguidas.
  • Você pode supor que o número de caracteres inseridos nunca seja maior que a largura da janela gráfica do terminal /.
  • Se estiver usando um terminal, seu programa deve terminar após uma nova linha ser inserida ou o EOF ser alcançado.
  • Seu programa deve funcionar conforme descrito aqui em ambientes móveis e outros.

  • Seu programa pode assumir que a entrada conterá apenas caracteres imprimíveis (letras, números, símbolos) e possivelmente uma nova linha final (sem espaço de fundo, teclas de seta, exclusão etc.).
  • Seu programa pode terminar quando Ctrl + C é pressionado.
  • Você pode encerrar seu programa fechando uma janela, se o programa iniciar uma.

Pontuação

Isso é , então a resposta mais curta em cada idioma vence!

Exemplo

Aqui está um exemplo de como deve ser. Observe que isso é registrado em uma plataforma móvel, mas também deve funcionar em uma plataforma de desktop.

senha

musicman523
fonte
Para aqueles que podem ver as mensagens apagadas, aqui está o post Sandbox
musicman523
Qual teclado você está usando no vídeo?
Beta Decay
1
@BetaDecay a notificação no teclado zenui dos estados finais
ovs 11/11
@BetaDecay Na verdade, é o teclado ZenUI. Apenas curioso, ou isso importa?
musicman523
@ musicman523 Just curious :)
Decay beta

Respostas:

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)

O atraso entre a entrada ke a letra *é de um segundo.

JavaScript oninput, formatado

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

Snippet de teste

Adicionado o colchete final ( >) para melhor compatibilidade.

<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
fonte
Parece que não termina!
officialaimm
1
@officialaimm O desafio afirma que apenas os aplicativos de terminal precisam ter uma maneira de finalizá-los.
Justin Mariner
Ah, bobo eu. Desculpe.
officialaimm
3

Python 3 , 186 224 bytes

Funciona apenas no 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)

Versão mais antiga (186 bytes): o sono era obrigatório, independentemente da velocidade na qual a tecla foi pressionada.

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
fonte
1
Eu não acho que isso atenda a todos os critérios, especificamente 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.Dito isto, não posso testá-lo porque não executo o Windows, então me avise! Você pode achar esse desafio relacionado útil como referência
musicman523
Presumi que a substituição de k para c era apenas gráfica (o que é cumprido no meu código). Você também quis alterar o valor armazenado de k com c?
officialaimm
1
Não, isso é tudo que deveria haver. Seu atraso de tempo é de 0,6 segundo - o que acontece se eu digitar duas letras dentro de 0,1 segundo um do outro? Você ainda vai dormir por 1,2 segundos? Mais uma vez, desculpe, eu mesmo não posso testar isso - pode valer a pena postar um vídeo com seu código!
musicman523
Modificado. A versão mais recente garante que o novo personagem possa ser lançado mesmo antes do tempo do personagem anterior não ter terminado.
officialaimm
3

Python 2 , 133 bytes

Com base na resposta @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
fonte
Uau, 90 bytes a menos !!! Votaria, mas meu limite diário foi atingido. Existe uma maneira de verificar isso (eu só tenho python 3 no meu pc)? Btw eu não vejo nenhuma tela clara, como é gerenciado?
officialaimm
@officialaimm pela \rna impressão
Felipe Nardi Batista
1
Vou postar uma variante PY3 quando eu chegar a minha sala de aula
Felipe Nardi Batista
1
@officialaimm isso deve funcionar, eu estou em linux atm, então eu não posso testá-lo
Felipe Nardi Batista
Eu verifiquei, está funcionando. (y)
officialaimm