В 1984 году Майкл Крайтон написал программу BASIC для обеспечения безопасности, которая была опубликована в журнале Creative Computing. Программа попросит пользователя ввести фразу по своему выбору, запишет интервалы между нажатиями клавиш, а затем попросит ее повторить фразу. Если время слишком сильно отличается, программа определит пользователя как самозванца.
Ваше задание: создать версию программы Crichton на выбранном вами языке.
Правила:
Фразы для связи с пользователем («Пожалуйста, введите ключевую фразу», «Пожалуйста, введите ключевую фразу еще раз» и т. Д.) Считаются одним байтом каждый независимо от фактической длины. Это только для общения с пользователем, не пытайтесь скрыть программный код в строках.
Пройденный / неудачный тест должен основываться на среднем абсолютном значении процентного отклонения от исходных интервалов. Если строки не совпадают, либо верните ошибку, либо разрешите пользователю повторить попытку на ваше усмотрение.
Ключевая фраза не должна допускать пустую строку. В случае, если ключевая фраза слишком длинная для вашего строкового типа данных, либо усекать, либо запрещать и начинать заново, на ваше усмотрение.
Чувствительность теста (порог для теста на прохождение / неудачу) должна быть изменена в исходном коде.
Первоначально я предоставил бонус в 20% от общего числа байтов, если ваш исходный код может быть отформатирован так, чтобы он был похож на динозавра. Было отмечено, что это очень субъективно и, возможно, больше подходит для конкурса популярности, поэтому я убрал этот бонус. Однако я по-прежнему от всей души рекомендую форматировать динозавров, и если вы отформатируете свой код так, чтобы он выглядел как динозавр, вы можете вычесть любые чисто косметические комментарии, разрыв строки или пробельные символы из общего байтового числа.
Побеждает кратчайший счетчик байтов, с учетом настроек длины строки и форматирования динозавров.
Обратите внимание, что моя спецификация выше не совсем соответствует работе кода Crichton, копии которого можно найти в Интернете. Следуйте спецификации, не пытайтесь клонировать оригинал.
"Please type the key phrase"
считается ли 1 байт, или только фраза считается, а цитируемая фраза считается 3 байтами ("
, фраза,"
)? Является ли намеренным, что гораздо более длинный интервал и гораздо более короткий интервал "отменится" и станет еще одним? Должна ли программа проверять совпадение двух ключевых фраз?Ответы:
Рубин,
171 167157 байтВыводится,
true
если средняя дисперсия превышает 20%, в противном случае выводитсяfalse
.Динозавр ASCII художественная попытка:
Ungolfed:
require 'io/console'
может быть удалено при запуске в некоторых Ruby REPL, так как библиотека уже загружена.источник
Java 768 байт
что? Ява? для кода гольф?
Это, наверное, самое плохое, но я все равно попробовал.
Он отображает любые сообщения в окне консоли, но фактическая типизация происходит в JTextField. Не совсем красиво выглядит. Да, и чтобы сохранить 5 байтов, вы должны сами изменить размер JFrame. Кроме того, он не проверяет правильность строки во второй раз. Не уверен, что это против спецификации.
Использовать:
Введите свой ключ в текстовом поле.
Не нажимайте Enter, перейдите к консоли и введите что-нибудь. Это будет отображать другое сообщение
Введите то же самое в текстовое поле (которое теперь должно быть очищено).
Подойдите к консоли и снова нажмите что-нибудь. Он покажет, являетесь ли вы нарушителем или нет.
ungolfed:
golfed:
источник
JFrame
, так что вам это не понадобитсяf
.HTML, JavaScript (ES6), 328
Общее количество байтов кода составляет 402 байта и сообщений для взаимодействия с пользователем:
всего 78 байт, поэтому общая оценка => 402 - 78 + 4 = 328
Запустите приведенный ниже фрагмент в последнем Firefox и введите ключ в поле ввода, а затем нажмите клавишу Enter.
Код проверяет, совпадают ли введенные и повторно введенные ключи (если нет, запрашивает повторный ввод), вычисляет средний процент абсолютной разницы и проверяет, меньше ли оно значения переменной
V
источник
С, 154 (86 + 68 для флагов)
Компиляция с
-DY=(y=clock())-x
,-DZ=a[d]
,-DE=getch()
,-DW=);while
,-DU=i++[d]=Y
и-DP=puts(
. Новые строки добавлены в целях презентации и могут быть удалены (количество байтов указано без).Ungolfed комментарии +:
Это не проверяет идентичность перепечатанной фразы и ничего не выводит, если пользователь не идентифицирован как самозванец.
Это также не учитывает время, которое потребовалось после запроса до первого нажатия клавиши.
источник
getch
ставитьgetc
илиgetchar
? У меня есть неопределенная ссылка на `getch ', которая, если я правильно помню, устарела?char
до глобальных объявлений, и теперь это дает ошибку сегментации во время выполнения. Можете ли вы рассказать подробнее о том, как его построить? Какой компилятор вы используете? Спасибо.int
и инициализированы0
. Я проверил это с помощью gcc в Windows (используя Windowgetch
).getch
используется вместоgetc
илиgetchar
потому,getch
что не требует нажатия клавиши возврата перед обработкой каких-либо символов (getch
действительно не рекомендуется в Windows, хотя здесь нет ничего плохого в использовании устаревших функций).Scala REPL 233
Со всем удаленным промежутком у вас есть:
Я уверен, что кто-то более талантливый, чем я, может превратиться в динозавра!
Краткое объяснение:
l
Метод чтения символов и сохраняет трактnanoTime
о том, когда каждый символ был набран.В
m
методе печатает"Enter"
, ломаетl
метод при ударе ввести (символ 13), а затем отображает ее как разnanoTimes
, а затем получает временные интервалы между символами.Следующие 2 строки читаются в 2 строки, архивируют их, затем находят среднее абсолютное значение процентной разницы между вторыми интервалами и первым и, наконец, выводят, было ли это среднее меньше или меньше
0.2
.источник
Общий Лисп: 660
Ungolfed
Дополнительные замечания
Динозавр бонус
У меня должен быть бонус, потому что все знают, что « Common Lisp - умирающий динозавр ».
источник