Ваша задача - составить программу, которая измеряет, как быстро вы сможете набирать буквы английского алфавита.
- Программа должна принимать только строчные буквы
a
вz
в алфавитном порядке. - Каждая буква отображается как набранная в той же строке (без новой строки или каких-либо других разделителей между буквами).
- Если вы введете недопустимый символ, программа выведет
Fail
новую строку и завершит работу. - Если вы введете все 26 букв, программа в новой строке выведет время в миллисекундах, которое прошло с первой до последней буквы, и завершится.
- Таймер запускается при вводе первой буквы
a
.
Пример выходов:
b
Fail
abcdefgg
Fail
abcdefghijklmnopqrstuvwxyz
6440
Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
code-golf
date
alphabet
interactive
Данко Дурбич
источник
источник
Fail
без заголовка новой строки? (например,abdFail\n
илиabd Fail\n
))Fail
или миллисекунды) должен быть в новой строке, как в примере. Большинство ответов уже предполагают это.Ответы:
HTML (JavaScript (ES6)),
129126117 байтНажмите на вход и начните печатать! Кроме того, мой набор текста отстой; Я занимаю около 5 секунд, даже с практикой. Редактировать: Сохранено 2 байта благодаря @HermanLauenstein путем переключения языка. Сохранено 3 байта благодаря @ qw3n. Сохранено 9 байт благодаря @tsh.
источник
<input id=i><script>l=0;n=Date.now;i.onkeypress=e=>e.charCode-97-l?i.outerHTML='Fail':l>24?i.outerHTML=n()-t:t=l++?t:n()</script>
-11 байтов, если закрывающий тег не нужен<input id=i onkeypress=event.which-97-l?i.outerHTML='Fail':24<l?i.outerHTML=n()-t:t=l++?t:n() onfocus=l=0,n=Date.now>
6502 машинный код (C64 PAL),
189165 байтовИнтернет демо (Usage:
sys49152
)Объяснение:
Это была бы крошечная программа, если бы не проблема точного измерения миллисекунд на C64. Системное прерывание происходит примерно 60 раз в секунду, что даже близко не происходит. Таким образом, мы должны использовать аппаратный таймер, который получает свои входные сигналы от системных часов.
На машине PAL системные часы составляют ровно 985248 Гц. Следовательно, установка таймера в 985 дает около миллисекундных тиков, но это слишком быстро, мы должны считать 986 циклов для каждого четвертого такта или держать таймер для одного цикла. Это невозможно, но мы можем провести таймер на 6 циклов с последовательностью
DEC $DD0E
,INC $DD0E
:$DD0E
это регистр управления таймером с битом 0 переключения его включением и выключением, и обе инструкции принимают 6 циклов, поэтому точные пишет , что остановка и начать таймер ровно 6 циклов. Поэтому мы должны выполнять эту последовательность каждые 6 * 4 = 24-й тик. Это все еще не совсемточнее, таймер будет отставать на 1 миллисекунду после 8 минут и 12 секунд, но, вероятно, он достаточно хорош - для компенсации этого потребуется много кода.редактирование : начальное значение для таймера должно быть 984, а не 985, потому что эти таймеры срабатывают "при недостаточном расходе", поэтому значение 0 будет подсчитывать еще один цикл до срабатывания. Код исправлен, число байтов не изменилось.
Вот прокомментированный список разборки:
источник
.starttimer
- скоро сделаю :) (и даже дальше, используя систему,TI
подобную этому основному ответу , но я не уверен, что это действительно так, потому что вы можете добиться большего в машинном коде )Bash + coreutils,
1039998 байтДолжен быть запущен в терминале.
Тестовый забег
источник
3479
довольно быстро! молодец :)a
сразу дает мнеline 1: ((: r=15094100773N: value too great for base (error token is "15094100773N")
и выходит.date
быть. Мой из GNU coreutils 8.23. Чтоdate +%s%3N
печатает в вашей системе?15094104833N
- это встроеннаяdate
утилита в macOS, если это имеет значение.date
кажется, использует strftime, который не распознает%N
.Python 2 + getch , 116 байт
Спасибо ovs и ElPedro за исправление кода и сохранение 57 байт.
источник
SOGL V0.12 , 35 байт
Попробуй здесь! - нажмите кнопку «Выполнить» и введите алфавит в поле ввода. Обратите внимание, что это может быть немного запаздывающим, потому что SOGL делает паузу только для ввода каждые 100 выполненных токенов (а SOGL довольно медленный). Если это вас беспокоит, запустите
sleepBI=true
в консоли.примечание: не запускайте это в режиме совместимости - это будет просто цикл навсегда.
Объяснение:
источник
Паскаль (FPC) , 176 байт
Попробуйте онлайн!
Некоторые трюки, используемые в коде для игры в гольф:
Real
в качестве более короткой альтернативыTDateTime
, потому что, как здесь определено ,TDateTime
=Double
, который является типом с плавающей точкой.MilliSecondsBetween
для вычисления промежутка времени, этот код умножает разницу между двумя значениями с плавающей запятой на864e5
, что работает из-за способа кодирования Free Pascal,TDateTime
описанного здесь .Заметка:
ReadKey
Функция на самом деле не печатает ключ на консоли, поэтому ручная запись в консольWrite(c)
необходима.0
за ввод алфавита по понятной причине.источник
for c:='a'to'z'do
ту же строку, что иa:=Time;
.Now
а неTime
как это короче.86398338
?? Я могу понять, умножаете ли вы 864e5, так как в день 864e5 миллисекунд. но как получается это магическое число?TDateTime
какDouble
.864e5
звучит правильнее, я исправлю проблемы.Java,
404388354348320318 байтИ здесь я подумал, что консоль Java уже многословна.
Поскольку у Java нет способа прослушивания нажатий клавиш в консоли, я использую GUI
java.awt
.-78 байт благодаря @ OlivierGrégoire .
Объяснение:
Пример GIF успеха: (Да, я набираю алфавит довольно медленно здесь ..)
Примечание: Это старый GIF. Текущая версия больше не печатает нажатия клавиш на консоли. И он больше не печатает время с цифрами после десятичной точки.
Пример gif сбоя:
Примечание: это старый gif. Текущая версия больше не печатает нажатия клавиш на консоли.
источник
setVisible(false)
вместо выхода.show
иdispose
, который еще корочеsetVisible
. Я почти никогда не использую графический интерфейс Java. И умно использовать инициализацию класса вместо того, чтобы помещать его в метод main. Я должен помнить это.TextField
. Кроме того, вы можете использоватьTextArea
вместо того,TextField
чтобы получить два байта. Наконец,KeyEvent
естьgetWhen
метод, который дает время между эпохой и событием в миллисекундах. Просто нужно использовать их вместо того,System.nanoTime()
чтобы получить еще больше байтов.C # (.NET Core),
245 + 13183 + 41177 + 41 байт+41 байт для
using System;using static System.Console
.Не проверял, так как я на мобильном телефоне, и это не работает на TIO.
источник
int x=0;
и затем сделайтеx=1/x;
. Это должно сэкономить 14 байтов. К сожалению, вам нужноx
. Если вы попытаетесь сделать это,1/0
вы получите деление на постоянную нулевую ошибку компилятора. 2) -5 байтов для объединения объявленияc
с первымReadKey
. 3) Изменение состояния во внутренней ,if
чтобыReadKey!=++c
и удалитьc++;else
для другого -9 байт.x=1/x
может быть уменьшен доx/=x
. И я добавил,using static System.Console;
чтобы сохранить еще несколько байтов :)i
и использованияc
в условии цикла вместо этого.MSX-BASIC, 126 символов
TIME
является внутренней переменной MSX-BASIC, которая увеличивается на единицу каждые 20 миллисекунд.источник
C # (.NET Core) ,
184 + 13 = 197173 + 13 = 186 байтПопробуйте онлайн!
К сожалению, TIO не может запустить это, но это удобно для подсчета байтов.
+13 за
using System;
-1, изменив
i==123
наi>122
. Я был соблазн сделать этоi>'z'
.Подтверждения
-10 байт благодаря @raznagul
Ungolfed
источник
ReadKey
их в условие цикла, чтобы вы могли удалить первыйif
иbreak
.Node.js,
240213 байтРЕДАКТИРОВАТЬ: Сохранено 27 байтов благодаря Иордании
Безголовая версия:
источник
C (gcc) , 303 байта
Работает на * nix системах. Автономный код, удаляющий канонический режим текущего терминала, чтобы позволить чтение символов без ожидания перевода строки:
/! \ Запуск этой программы сделает терминал практически непригодным для использования.
Развернулся и прокомментировал:
Альтернативное решение (218 байт):
Если предварительная настройка терминала разрешена, то мы можем избавиться от части кода, обрабатывающей эту часть.
Вот тот же код без терминальной манипуляции:
Чтобы это работало:
пример выполнения:
источник
Commodore BASIC v2 - 113 байт
Заглавные буквы должны быть сдвинуты.
Спасибо Феликсу Палмену за указание на некоторые опечатки, спецификации
попробуйте
источник
TI
увеличивается в ней), которую я счел неподходящей из- за ее недостаточной точности, но я думаю, что это справедливая игра здесь, потому что просто нет способа добиться большего успеха в Бейсике :) Тем не менее, вставив это в тиски, я получаю синтаксическая ошибка в1
- любая помощь?1on-(f=26)gO4:gEa$:ifa$=""tH1
Nitpicks: 1.) вывод находится в той же строке, 2.) вывод - все заглавные - я думаю, вы должны исправить это, не займет много байтов В любом случае :)Perl 5,
7993 +31 (-MTerm :: ReadKey -MTime :: HiRes = время) байтов$|=1
недостаточно для установки терминала в режиме raw,stty -icanon
должен быть запущен до иличтобы увидеть символы в терминале после запуска команды:
stty echo
илиstty echo icanon
источник
ReadKey
! Вы можете сохранить несколько байтов здесь и там,1e3
для1000
,$s||=time
и если вы установите$s
сначала, а затем вызовReadKey
, вы можете заменить наmap
постфиксfor
. Я хотел бы сказатьdie
вместоexit print
, но я думаю, что вы тут же ... Я возился с этим,printf"\n%i"
но это закончилось большим, и я подумал об использовании$-
вместо$s
, но это было глупо! :)$|=1;
, также $ s || = время не может быть заменено на карте, потому что таймер должен запускаться после первого нажатия клавиши, иdie
будет эхоFail
на stderr вместо стандартного вывода.exit print
это так долго! К сожалению, я не думаю , что я объяснил свою мысль дляfor
правильно:$s||=time,ReadKey eq$_||exit print" Fail"for a..z
должны работать , я думаю , что ... Может быть , даже ,$|=$s||=...
или$|=map...
если вы предпочитаете такой подход! Думаю, ты в значительной степени прибил это все же!$|=map..
не устанавливает небуферизованный ввод в новом терминале (у меня была ошибка при удалении, ReadMode 3, потому что я тестировал в том же сеансе), и$s||=time
до того, как первый ReadKey запустил таймер слишком рано$|
, но опять же, он запоминает после цикла, который слишком поздно! Ты на шаг впереди!Aceto , 70 байт
Я начну с установки метки и зеркального отражения по горизонтали (
@|
), если значение в стеке верно. Это не изначально, а позже всегда будет. Мы вернемся сюда позже, если будет введен неправильный ключ. Затем мы нажимаем a в стеке ('a
), затем дублируем его и читаем один символ из user (d,
). Если два символа не равны (=!
), мы «сбой» ($
) и вернуться к метке. В противном случае мы нажимаем другое «а» и печатаем его, затем устанавливаем текущее время ('apT
).Затем мы вводим наш «основной цикл»: «увеличиваем» текущий символ и «увеличиваем» символ (
'apToIc
), затем дублируем его, читаем новый символ, сравниваем его и «сбиваем», если символы не идентичны (d,=!$
). Если мы не потерпели крах, мы сравниваем текущий символ с «z» (d'z=|
), если он не равен, мы печатаем символ, затем нажимаем 1 и «условно» (в данном случае: всегда) переходим к толькоo
в коде (начало нашего основного цикла). Если он был равен z, мы отразили по горизонтали какое-то пустое пространство сверху. Мы печатаем «z», затем нажимаем текущее время (минус время начала;t
), а затем умножаем на него число 1000 (полученное поднятием 10 до третьей степени;91+3F
), потому что мы получаем секунды, не миллисекунды). Затем мы печатаем новую строку, время и выход (pX
).Если мы когда-нибудь потерпим крах (плохой ввод пользователем), мы прыгнем до самого начала. Так как теперь у нас будет некоторое истинное значение в стеке, мы будем зеркально отображать горизонталь в направлении
u
, которое меняет направление, в котором мы двигаемся.n
Печатает символ новой строки, затем мы толкаем"Fail"
стек, печатаем его и выходим (pX
).источник
Mathematica (записная книжка), 248 байт
Как это работает
A
DynamicModule
сEventHandler
ответом на строчные буквы. Переменныеx
,s
иt
удерживайте нажатыми до сих пор буквы, время начала и время окончания соответственно. Как только мы заметим,x
что мы равны{"a"}
, мы начинаем время; мы отображаем либо общее потраченное время, либо построенную строку, либо в"Fail"
зависимости от того, какое условие выполнено.Мы могли бы сохранить другой байт
t<1
вместо того,t==0
чтобы предположить, что никто не достаточно быстр, чтобы набрать алфавит менее чем за одну секунду :)Если вы пробуете это в записной книжке Mathematica, имейте в виду, что вы должны щелкнуть внутри рамки, прежде чем ваши нажатия клавиш будут зарегистрированы. (Это причина того, что нам нужен кадр для начала; если
Framed
его там нет, то весь выбранный объект изменяется при нажатии клавиши, поэтому он перестает быть выбранным, и вам придется нажимать снова.)источник
C #,
154152 + 13 = 165 байтСохранено 2 байта благодаря комментариям Ayb4btu
В приведенном выше коде есть пробел, чтобы он поместился в SE без полосы прокрутки. Пробелы не входят в число байтов
и 13 байт для
using System;
Это похоже на версию Ayb4btu, но со следующими отличиями:
Хранение datetime как long позволяет нам также делать
c
long и сокращать объявлениеПетля не нуждается в отдельном перерыве
На самом деле это не короче, по
$"interpreted strings"
сравнению с добавлением необходимого "\ n" в миллисекундах, чтобы сделать его строкой для встроенного, еслиИспользование
for
цикла иногда позволяет нам сохранять символы в течение некоторого времени, хотя я думаю, что этот не будет сохранять по сравнению с эквивалентнымwhile
Из Айб4бту:
s=s==0
может статьs=s<1
иc==123
может статьc>122
Ungolfed
источник
DateTime
. Вы можете сохранить еще пару байтов, изменивs=s==0
наs=s<1
(рассчитывая на то, что s не будет отрицательным), и изменивi==123
наi>122
.i<123
должен был идти передReadKey()
, в противном случае он ждет другого символа после z, прежде чем отображать время.z
должно означать, что readkey.keychar возвращает 122, когда пользователь вводит z, c также равен 122, следовательно,'z' == 122
успешно, c затем увеличивается, затем c (теперь 123) проверяетсяc<123
и завершается неудачей, останавливая петля ..?c++
приращение, когда я смотрел на это. Тем не менее, я только что попробовал это, и когда я набираю,abcdefghijklmnopqrstuvwxys
это дает мне время, а не неудачу. Я полагаю, что это потому, чтоc
все еще увеличивается, хотяKeyChar
проверка не проходит, поэтому проходитc>122
проверку.Processing.org
133142первый код не вышел
источник
GCC, windows, 98 байт
Не требует мгновенного ввода для первой клавиши
источник