Sua tarefa é criar um programa que mede a rapidez com que você pode digitar as letras do alfabeto inglês.
- O programa só aceitará letras minúsculas
a
paraz
em ordem alfabética. - Cada letra é repetida conforme digitado na mesma linha (sem nova linha ou qualquer outro separador entre as letras).
- Se você digitar um caractere inválido, o programa emitirá
Fail
uma nova linha e sairá. - Se você digitar todas as 26 letras, o programa, em uma nova linha , produzirá o tempo em milissegundos que levou da primeira até a última letra e sairá.
- O timer inicia quando você digita a primeira letra
a
,.
Exemplo de saídas:
b
Fail
abcdefgg
Fail
abcdefghijklmnopqrstuvwxyz
6440
Isso é código-golfe , então a resposta mais curta em bytes vence.
code-golf
date
alphabet
interactive
Danko Durbić
fonte
fonte
Fail
sem uma nova linha de cabeçalho? (ex.abdFail\n
ouabd Fail\n
))Fail
ou milissegundos) deve estar em uma nova linha, como no exemplo. A maioria das respostas já assume isso.Respostas:
HTML (JavaScript (ES6)),
129126117 bytesClique na entrada e comece a digitar! Além disso, minha digitação é péssima; Eu levo cerca de 5 segundos, mesmo com a prática. Editar: salvou 2 bytes graças a @HermanLauenstein ao mudar o idioma. Economizou 3 bytes graças a @ qw3n. Economizou 9 bytes graças a @tsh.
fonte
<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 bytes se não é necessária a marca de fechamento<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>
Código da máquina 6502 (C64 PAL),
189165 bytesDemonstração online (Usage:
sys49152
)Explicação:
Este seria um programa minúsculo, se não fosse pelo problema de uma medição exata de milissegundos no C64. A interrupção do sistema ocorre aproximadamente 60 vezes por segundo, o que nem chega perto. Portanto, temos que usar um temporizador de hardware aqui, que obtém suas marcações de entrada do relógio do sistema.
Em uma máquina PAL, o relógio do sistema é exatamente 985248 Hz. Portanto, inicializar o timer para 985 fornece algo próximo a ticks de milissegundos, mas é um pouco rápido demais, teríamos que contar 986 ciclos para cada quarto tick ou pressionar o timer por um único ciclo. Isso não é possível, mas podemos segurar o temporizador durante 6 ciclos com a seqüência
DEC $DD0E
,INC $DD0E
:$DD0E
é o registro de controle timer com bit 0 ligá-lo dentro e fora, e ambas as instruções demorar 6 ciclos, assim as gravações exatas que parar e iniciar o temporizador são exatamente 6 ciclos separados. Portanto, temos que executar essa sequência a cada 6 * 4 = 24º tick. Isso ainda não é absolutamenteExatamente, o cronômetro ficará 1 milissegundo atrás após 8 minutos e 12 segundos, mas provavelmente é bom o suficiente - compensar isso exigiria muito código.edit : o valor inicial do timer deve ser 984, e não 985, porque esses timers são acionados "em underflow"; portanto, um valor 0 contará mais um ciclo antes de disparar. Código fixo, contagem de bytes inalterada.
Aqui está a lista de desmontagem comentada:
fonte
.starttimer
- fará em breve :) (e ainda mais usando o sistemaTI
como esta resposta BÁSICA , mas não tenho certeza se isso é válido, porque você pode fazer melhor no código da máquina )Bash + coreutils,
1039998 bytesDeve ser executado em um terminal.
Execução de teste
fonte
3479
é bem rápido! bem feito :)a
imediatamente me dáline 1: ((: r=15094100773N: value too great for base (error token is "15094100773N")
e sai.date
poder. O meu é do GNU coreutils 8.23. O que édate +%s%3N
impresso no seu sistema?15094104833N
- esse é odate
utilitário interno do macOS, se isso faz diferença.date
parece estar usando strftime, que não reconhece%N
.Python 2 + getch , 116 bytes
Agradecimentos a ovs e ElPedro por corrigir o código e salvar 57 bytes.
fonte
SOGL V0.12 , 35 bytes
Experimente aqui! - clique em executar e digite o alfabeto na caixa de entrada. Observe que pode ser um pouco lento porque o SOGL apenas pausa para entrada a cada 100 tokens executados (e o SOGL é bastante lento). Se isso lhe incomoda, execute
sleepBI=true
no console.nota: não execute isso no modo de compatibilidade - ele funcionará para sempre.
Explicação:
fonte
Pascal (FPC) , 176 bytes
Experimente online!
Alguns truques usados no código para jogar golfe:
Real
como uma alternativa mais curta paraTDateTime
, porque, conforme definido aqui ,TDateTime
=Double
, que é do tipo de ponto flutuante.MilliSecondsBetween
para calcular o intervalo de tempo, esse código multiplica a diferença entre dois valores de ponto flutuante por864e5
, o que funciona devido à maneira como o Free Pascal codificaTDateTime
descrito aqui .Nota:
ReadKey
A função realmente não imprime a chave no console; portanto,Write(c)
é necessário escrever manualmente no console .0
para digitar o alfabeto por motivos óbvios.fonte
for c:='a'to'z'do
para a mesma linha quea:=Time;
.Now
vez deTime
ser mais curto.86398338
?? Entendo se você tem vários 864e5, pois existem 864e5 milissegundos em um dia. mas como é que esse número mágico vem?TDateTime
comoDouble
.864e5
parece mais correto, vou resolver os problemas.Java,
404388354348320318 bytesE aqui eu pensei que o Java Console já estivesse detalhado.
Como o Java não tem como escutar breves pressionamentos de teclas no console, eu uso uma GUI com
java.awt
.-78 bytes graças a @ OlivierGrégoire .
Explicação:
Exemplo de gif de sucesso: (Sim, digito o alfabeto bem devagar aqui ..)
Nota: Este é um gif antigo. A versão atual não imprime mais as teclas pressionadas no console. E não imprime mais a hora com dígitos após o ponto decimal.
Exemplo de gif de falha:
Nota: este é um gif antigo. A versão atual não imprime mais as teclas pressionadas no console.
fonte
setVisible(false)
vez de sair.show
edispose
, que é ainda mais curto quesetVisible
. Eu quase nunca uso a GUI do Java. E inteligente usar a inicialização de classe em vez de colocá-la no método principal. Eu deveria me lembrar disso.TextField
. Além disso, você pode usar emTextArea
vez deTextField
obter dois bytes. Por fim,KeyEvent
possui umgetWhen
método que fornece o tempo entre a época e o evento em milissegundos. Só precisa usá-los em vez deSystem.nanoTime()
ganhar ainda mais bytes.C # (.NET Core),
245 + 13183 + 41177 + 41 bytes+41 bytes para
using System;using static System.Console
.Não testado, pois estou no celular e isso não é executado no TIO.
fonte
int x=0;
e então façax=1/x;
. Isso deve economizar 14 bytes. Infelizmente você precisax
. Se você tentar1/0
obter uma divisão por erro constante do compilador zero . 2) -5 bytes para combinar a declaração dec
com o primeiroReadKey
. 3) Altere a condição no interiorif
paraReadKey!=++c
e remova-ac++;else
para outros -9 bytes.x=1/x
pode ser reduzido parax/=x
. E eu adicioneiusing static System.Console;
para salvar mais alguns bytes :)i
e usandoc
a condição de loop.MSX-BASIC, 126 caracteres
TIME
é uma variável interna do MSX-BASIC que aumenta em um a cada 20 milissegundos.fonte
C # (.NET Core) ,
184 + 13 = 197173 + 13 = 186 bytesExperimente online!
Infelizmente, o TIO não pode executar isso, mas é útil para obter a contagem de bytes.
+13 para
using System;
-1 alterando
i==123
parai>122
. Fiquei tentado a fazer issoi>'z'
.Reconhecimentos
-10 bytes graças a @raznagul
Ungolfed
fonte
ReadKey
condição de loop para remover o primeiroif
e obreak
.Node.js,
240213 bytesEDIT: Salvo 27 bytes graças a Jordan
Versão não destruída:
fonte
C (gcc) , 303 bytes
Funciona em sistemas * nix. Código autônomo que remove o modo canônico do terminal atual para permitir a leitura de caracteres sem aguardar novas linhas:
/! \ A execução deste programa tornará o terminal quase inutilizável.
Ungolfed e comentou:
Solução alternativa (218 bytes):
Se a configuração prévia do terminal for permitida, poderemos nos livrar da parte do código que manipula essa parte.
Aqui está o mesmo código sem manipulação de terminal:
Para fazer funcionar:
exemplo de tempo de execução:
fonte
Commodore BASIC v2 - 113 bytes
Letras maiúsculas devem ser deslocadas.
Obrigado a Felix Palmen por apontar alguns erros de digitação, especificações
tente
fonte
TI
é incrementado nele). Considero inadequado por sua falta de precisão, mas acho que é um jogo justo aqui, porque não há como fazer melhor no BASIC :) Ainda assim, colando isso no vice, entendo um erro de sintaxe em1
- alguma ajuda?1on-(f=26)gO4:gEa$:ifa$=""tH1
Nitpicks: 1.) a saída está na mesma linha, 2.) a saída é tudo em maiúsculas - acho que você deve corrigir isso, não precisará de muitos bytes de qualquer maneira :)Perl 5,
7993 +31 (-MTerm :: ReadKey -MTime :: HiRes = time) bytes$|=1
não for suficiente para configurar o terminal no modo bruto,stty -icanon
deve ser executado antes oupara ver caracteres no terminal após executar o comando:
stty echo
oustty echo icanon
fonte
ReadKey
! Você pode salvar alguns bytes aqui e ali,1e3
para e1000
,$s||=time
se você definir$s
primeiro e depois ligarReadKey
, poderá trocar omap
para um postfixfor
. Eu gostaria de dizer emdie
vez deexit print
, mas acho que você está aí ... Eu consertei,printf"\n%i"
mas isso acabou maior, e pensei em usar em$-
vez de$s
, mas isso era estúpido! :)$|=1;
, também $ s || = o tempo não pode ser trocado pelo mapa porque o timer deve iniciar após a primeira tecla pressionada edie
ecoariaFail
em stderr em vez de stdout.exit print
é tão longo! Desculpe, acho que não expliqueifor
adequadamente o meu pensamento :$s||=time,ReadKey eq$_||exit print" Fail"for a..z
deve funcionar, acho ... Talvez até$|=$s||=...
ou$|=map...
se você preferir essa abordagem! Acho que você acertou em cheio!$|=map..
não define de entrada unbuffered no novo terminal (eu tinha o erro ao remover, ReadMode 3, porque eu estava testando na mesma sessão), e$s||=time
antes da primeira ReadKey iria começar temporizador muito cedo$|
, mas, novamente, é armazenar após o loop que é tarde demais! Você está um passo à frente!Aceto , 70 bytes
I começar por definir uma marca de captura e espelhamento horizontalmente (
@|
), se o valor na pilha é truthy. Não é inicialmente, e mais tarde sempre será. Voltaremos aqui mais tarde se uma chave errada for digitada. Em seguida, pressionamos um a na pilha ('a
), duplicamos e lemos um único caractere do usuário (d,
). Se os dois caracteres não forem iguais (=!
), "travaremos" ($
) e voltaremos para a marca de captura. Caso contrário, pressionamos outro "a" e o imprimimos, depois definimos a hora atual ('apT
).Então entramos em nosso "loop principal": "incrementamos" o caractere atual e "incrementamos" o caractere (
'apToIc
), depois o duplicamos, lemos um novo caractere, o comparamos e "travamos" se os caracteres não forem idênticos (d,=!$
) Se não travarmos, comparamos o caractere atual com "z" (d'z=|
), se não for igual, imprimimos o caractere, pressionamos 1 e pulamos "condicionalmente" (neste caso: sempre) para o somenteo
no código (o início do nosso loop principal). Se fosse igual a z, espelhamos horizontalmente em algum espaço vazio no topo. Imprimimos "z", pressionamos o horário atual (menos o horário inicial;t
) e multiplicamos o número 1000 (obtido aumentando 10 para a terceira potência;91+3F
) por ele (porque temos segundos, milissegundos). Em seguida, imprimimos uma nova linha, a hora e a saída (pX
)Se alguma vez travarmos (informações incorretas do usuário), pularemos todo o caminho até o início. Como agora teremos algum valor de verdade na pilha, espelharemos horizontalmente na
u
, o que reverte a direção em que estamos nos movendo.n
Imprime um caractere de nova linha, empurramos"Fail"
a pilha, imprimimos e saímos (pX
).fonte
Mathematica (expressão em notebook), 248 bytes
Como funciona
A
DynamicModule
com umEventHandler
que responde a pressionamentos de teclas de letras minúsculas. As variáveisx
,s
et
mantêm as letras pressionadas até o momento, o horário de início e o horário de término, respectivamente. Assim que percebemos quex
somos iguais{"a"}
, começamos a hora; exibimos o tempo total gasto ou a string criada até o momento ou"Fail"
dependendo de qual condição seja atendida.Poderíamos salvar outro byte em
t<1
vez det==0
assumir que ninguém é rápido o suficiente para digitar o alfabeto em menos de um segundo :)Se você estiver tentando isso em um notebook Mathematica, lembre-se de que precisa clicar dentro do quadro antes que suas teclas sejam registradas. (Esse é o motivo pelo qual precisamos do quadro; se
Framed
não estiver lá, o objeto inteiro selecionado será alterado quando uma tecla for pressionada; portanto, ela deixa de ser selecionada e você terá que clicar novamente.)fonte
C #,
154152 + 13 = 165 bytesGuardado 2 bytes graças aos comentários de Ayb4btu
O código acima possui um espaço em branco para ajustá-lo ao SE sem uma barra de rolagem. Espaço em branco não faz parte da contagem de bytes
e 13 bytes para
using System;
É semelhante à versão do Ayb4btu, mas com as seguintes diferenças:
Armazenar datetime como um longo, nos permite fazer
c
um long também, e atalho a declaraçãoO loop não precisa de uma pausa separada
Na verdade, não é mais curto de usar do que
$"interpreted strings"
adicionar um "\ n" necessário nos milissegundos para torná-lo uma string para o inline sefor
Às vezes, usar um loop nos permite salvar caracteres por um tempo, embora eu ache que este não economize o equivalentewhile
Partida Ayb4btu:
s=s==0
pode se tornars=s<1
, ec==123
pode se tornarc>122
Ungolfed
fonte
DateTime
. Você pode salvar mais alguns bytes alterandos=s==0
paras=s<1
(contando com o fato de que s não será negativo) e alterandoi==123
parai>122
.i<123
tinha que ir antes doReadKey()
, caso contrário, ele espera por outro caractere após z antes de exibir a hora.z
deve significar readkey.keychar retorna 122 quando o usuário digita z, c também é 122 e, portanto'z' == 122
, é bem-sucedido, c é incrementado e c (agora 123) é testadoc<123
e falha, interrompendo o ciclo .. ?c++
incremento quando estava olhando para ele. No entanto, eu apenas tentei e quando digitoabcdefghijklmnopqrstuvwxys
me dá um tempo em vez de falhar. Eu acredito que é porquec
ainda aumenta mesmo que oKeyChar
cheque falhe e, portanto, passa noc>122
cheque.Processing.org
133142primeiro código não saiu
fonte
GCC, Windows, 98 bytes
Não requer entrada instantânea para a primeira chave
fonte