Em 1984, Michael Crichton escreveu um programa de segurança no BASIC, publicado na revista Creative Computing. O programa solicita que o usuário digite uma frase de sua escolha, registre os intervalos entre as teclas e, em seguida, peça para redigitar a frase. Se os horários diferissem demais, o programa identificaria o usuário como um impostor.
Sua tarefa: crie uma versão do programa de Crichton no idioma de sua escolha.
Regras:
As frases para comunicação com o usuário ("Digite a frase-chave", "Digite a frase-chave novamente" etc.) contam como um byte cada, independentemente do tamanho real. Isso é apenas para comunicação do usuário, não tente ocultar o código do programa nas strings.
O teste de aprovação / reprovação deve ser baseado no valor absoluto médio das variações percentuais dos intervalos originais. Se as seqüências não corresponderem, retorne a falha ou permita que o usuário tente novamente, a seu critério.
A frase-chave não deve permitir uma cadeia nula. No caso de a frase-chave ser muito longa para o seu tipo de dados de string, truncar ou não permitir e reiniciar, a seu critério.
A sensibilidade do teste (o limite para o teste de aprovação / reprovação) deve ser ajustável no código fonte.
Originalmente, forneci um bônus de 20% da contagem total de bytes, se o código-fonte puder ser formatado para se parecer com um dinossauro. Foi apontado que isso é altamente subjetivo e talvez mais apropriado para um concurso de popularidade; portanto, removi esse bônus. No entanto , ainda encorajo com entusiasmo a formatação de dinossauros, e se você formatar seu código para se parecer com um dinossauro, poderá deduzir quaisquer comentários puramente cosméticos, quebra de linha ou caracteres de espaço em branco do total de bytes.
Ganhos mais curtos de contagem de bytes, sujeitos a ajustes de formatação de comprimento de string e dinossauros.
Observe que minha especificação acima não corresponde exatamente à operação do código de Crichton, cujas cópias podem ser encontradas online. Siga as especificações, não tente clonar o original.
"Please type the key phrase"
conta como 1 byte ou apenas a frase conta e a frase entre aspas conta como 3 bytes ("
, frase"
)? É intencional que um intervalo muito mais longo e um intervalo muito mais curto "cancelem" e se tornem iguais novamente? O programa precisa verificar se as duas frases-chave correspondem?Respostas:
Rubi,
171 167157 bytesResultados
true
se a variação média estiver acima de 20%, caso contrário, resultadosfalse
.Tentativa de arte ASCII de dinossauro:
Ungolfed:
require 'io/console'
pode ser removido quando executado em alguns REPLs do Ruby, pois a biblioteca já está carregada.fonte
Java 768 bytes
que? Java? para o código de golfe?
Esta é provavelmente a pior coisa a fazer, mas tentei mesmo assim.
Ele exibe todas as mensagens na janela do console, mas a digitação real ocorre no JTextField. Não é exatamente bonito. Ah, e para salvar 5 bytes, você deve redimensionar o JFrame. Além disso, ele não verifica a exatidão das seqüências de caracteres pela segunda vez. Não tenho certeza se isso é contra as especificações.
Usar:
Digite sua chave no campo de texto.
Não pressione enter, vá para o console e digite algo. Ele exibirá outra mensagem
Digite a mesma coisa no campo de texto (que agora deve ser limpo).
Vá para o console e pressione algo novamente. Ele exibirá se você é um intruso ou não.
ungolfed:
golfed:
fonte
JFrame
fosse estendida , para que você não precisassef
.HTML, JavaScript (ES6), 328
A contagem total de bytes do código é 402 bytes e as mensagens para interagir com o usuário:
são 78 bytes totais, então a pontuação total => 402 - 78 + 4 = 328
Execute o trecho abaixo em um Firefox mais recente e digite a chave na caixa de entrada seguida pela tecla Enter.
O código verifica se as chaves inseridas e reinseridas são iguais (solicita a reinserção, se não for o caso), calcula a porcentagem média da diferença absoluta e verifica se é menor que o valor da variável
V
fonte
C, 154 (86 + 68 para bandeiras)
Compilar com
-DY=(y=clock())-x
,-DZ=a[d]
,-DE=getch()
,-DW=);while
,-DU=i++[d]=Y
e-DP=puts(
. Novas linhas adicionadas para fins de apresentação e podem ser removidas (a contagem de bytes fornecida é sem).Ungolfed + comentários:
Isso não verifica se a frase redigitada é idêntica, nem produz nada se o usuário não for identificado como um impostor.
Isso também não considera o tempo gasto após o prompt antes do primeiro pressionamento de tecla.
fonte
getch
apostargetc
ougetchar
? Eu tenho uma referência indefinida ao `getch ', que, se bem me lembro, está obsoleta?char
antes das declarações globais e, agora, isso causa uma falha de segmentação no tempo de execução. Você pode dar detalhes sobre como construí-lo? Qual compilador você está usando? Obrigado.int
e inicializado para0
. Eu testei isso usando o gcc no Windows (usando o Windowsgetch
).getch
é usado em vez degetc
ougetchar
porquegetch
não exige que a tecla de retorno seja pressionada antes de processar qualquer caractere (nagetch
verdade, foi preterido no Windows, embora não haja nada de errado em usar funções preteridas aqui).Scala REPL 233
Com todo o espaçamento removido, você tem:
Que eu tenho certeza que alguém mais talentoso do que eu posso transformar em dinossauro!
Breve explicação:
O
l
método lê caracteres e mantém o controlenanoTime
de quando cada caractere foi digitado.O
m
método imprime"Enter"
, quebra ol
método ao pressionar enter (caractere 13), mapeia-o apenas para onanoTimes
e obtém os intervalos de tempo entre cada caractere.As próximas 2 linhas lêem em 2 strings, as compactam e depois encontram o valor absoluto médio da diferença percentual entre o segundo intervalo e o primeiro e, finalmente, imprimem se essa média foi ou não menor que
0.2
.fonte
Lisp comum: 660
Ungolfed
Observações adicionais
Bônus de dinossauro
Eu deveria ter um bônus, porque todo mundo sabe que " Common Lisp é um dinossauro moribundo ".
fonte