Прочитайте пароль: на мобільний!


13

Завдяки нещодавньому виклику MD XF , тепер ми можемо читати паролі на багатьох різних мовах! Проблема в тому, що зараз нам потрібно портувати наші програми на мобільні пристрої, і вони роблять введення пароля дещо інакше.

Виклик

  • Прочитайте рядок з клавіатури.
  • Щоразу при kвведенні символу відображайте його на короткий проміжок часу.
  • Після того, як пройшов інтервал часу АБО користувач ввів інший символ, замініть його kдеяким символом c.

Правила

  • cповинні бути постійними; це повинен бути той самий персонаж.
  • c може бути будь-яким видимим символом (тобто він не може бути новим рядком, пробілом, вкладкою або недрукувальним).
  • cне може базуватися на введених даних k; cповинні бути визначені / постійні до першого kчитання.
  • c повинні бути однаковими при кожному запуску програми.
  • cможе бути одним із значень, заданих kненаче випадково, дотримуючись усіх інших правил.

  • Ви повинні надрукувати kв режимі реального часу. Як тільки користувач вводить нове k, ви повинні негайно відобразити його.
  • kмає бути видно кінцевому користувачеві перед тим, як його змінити c; інтервал часу не повинен бути менше 0,5 секунди.
  • kйого слід замінити на cрозумний термін; інтервал часу не повинен перевищувати 5 секунд.
  • Як тільки вводиться новий символ, або не закінчився інтервал часу, ви повинні замінити kз cі використовувати введений ключ як нові kнегайно.

  • Дозволено очищати та перемальовувати екран щоразу, коли потрібно змінити символ.
  • Ви можете використовувати будь-які обґрунтовані методи введення та виведення до тих пір, доки дотримуються всі інші правила.
  • Ви можете припустити, що кількість введених символів ніколи не перевищує ширину вікна терміналу / графічного зображення.
  • Якщо ви користуєтесь терміналом, ваша програма повинна завершитися після введення нової лінії або досягнення EOF.
  • Ваша програма повинна функціонувати так, як зазначено тут, як у мобільному, так і в інших середовищах.

  • Ваша програма може припустити, що вхід буде містити лише символи для друку (літери, цифри, символи) та, можливо, завершальний новий рядок (відсутність зворотної області, клавіші зі стрілками, видалення тощо).
  • Ваша програма може закінчитися, якщо натиснути Ctrl + C.
  • Ви можете припинити програму, закривши вікно, якщо програма запущена.

Оцінка балів

Це , тому найкоротша відповідь на кожній мові виграє!

Приклад

Ось приклад того, як це має виглядати. Зауважте, що це записано на мобільній платформі, але також має працювати на настільній платформі.

пароль


Для тих, хто може бачити видалені публікації, ось
musicman523

Яку клавіатуру ви використовуєте у відео?
Бета-розпад

1
@BetaDecay повідомлення в кінці повідомляє zenui клавіатура
ов

@BetaDecay Це насправді клавіатура ZenUI. Просто цікаво, чи це має значення?
musicman523

@ musicman523 Просто цікаво :)
бета-розпад

Відповіді:


4

HTML + JavaScript, 20 + 105 = 125 байт

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

Затримка між введенням kі введенням букви *становить одну секунду.

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

Тест-фрагмент

Додано кінцеву дужку ( >) для кращої сумісності.

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


Здається, це не припиняється!
officialaimm

1
@officialaimm У виклику зазначено, що лише термінальні програми повинні мати спосіб їх припинення.
Джастін Марінер

Ах, нерозумно мені. Вибачте.
officialaimm

3

Пітон 3 , 186 224 байт

Працює лише у вікнах.

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)

Старіша версія (186 байт): сон був обов'язковим незалежно від швидкості натискання клавіші.

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

1
Я не думаю, що це цілком відповідає всім критеріям. Зокрема 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., я не можу перевірити його, оскільки не запускаю Windows, тому дайте мені знати! Цей пов’язаний виклик може бути корисним як довідник
musicman523

Я припускав, що заміна з k на c була лише графічною (що виконується в моєму коді). Ви також мали на увазі змінити збережене значення k на с?
officialaimm

1
Ні, це все, що має бути. Ваша затримка у часі - 6 секунд - що трапиться, якщо я напишу дві літери протягом 1 секунди один від одного? Ви все ще будете спати 1,2 секунди? Знову ж таки, вибачте, що я не можу перевірити це сам - можливо, варто опублікувати відео з вашим кодом!
музикант523

Змінено. Більш нова версія гарантує, що нового персонажа можна кинути ще до того, як не минув час попереднього персонажа.
officialaimm

3

Python 2 , 133 байт

На основі відповіді @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

Вау, на 90 байт менше !!! Проголосував би, але мій щоденний ліміт досягнуто Чи є спосіб перевірити це (у мене є лише python 3 на моєму ПК)? До речі, я не бачу чіткого екрана, як це управляється?
officialaimm

@officialaimm за \rдруком
Феліпе Нарді Батіста

1
Я опублікую варіант py3, коли я прийду до своєї аудиторії
Феліпе Нарді Батіста

1
@officialaimm це повинно працювати, я перебуваю на Linux atm, тому я не можу перевірити це
Felipe Nardi Batista

Я перевірив це, це працює. (У)
officialaimm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.