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

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
источник
Для тех, кто может видеть удаленные посты, вот песочница
musicman523
Какую клавиатуру вы используете в видео?
бета-распад
1
@BetaDecay уведомления в конце заявляет zenui клавиатуры
OVS
@BetaDecay На самом деле это клавиатура ZenUI. Просто любопытно, или это имеет значение?
musicman523
@ musicman523 Просто любопытно :)
Beta Decay

Ответы:

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

Python 3 , 186 224 байта

Работает только в 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)

Старая версия (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
officialaimm
источник
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 с помощью c?
officialaimm
1
Нет, это все, что должно быть. Ваша задержка составляет 0,6 секунды. Что произойдет, если я наберу две буквы в течение 0,1 секунды друг от друга? Будете ли вы еще спать в течение 1,2 секунд? Опять же, извините, я сам не могу это проверить - возможно, стоит опубликовать видео о том, как вы запускаете свой код!
musicman523
Modified. Более новая версия гарантирует, что новый персонаж может быть брошен даже до того, как время предыдущего персонажа не истекло.
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, так что я не могу это проверить
Фелипе Нарди Батиста
Я проверил, это работает. (y)
officialaimm