En 1984, Michael Crichton escribió un programa de seguridad en BASIC que fue publicado en la revista Creative Computing. El programa le pedirá al usuario que escriba una frase de su elección, registre los intervalos entre las pulsaciones de teclas y luego le pida que vuelva a escribir la frase. Si los tiempos diferían demasiado, el programa identificaría al usuario como un impostor.
Su tarea: cree una versión del programa de Crichton en el idioma que elija.
Reglas:
Las frases para comunicarse con el usuario ("Escriba la frase clave", "Escriba la frase clave nuevamente", etc.) cuentan como un byte, independientemente de la longitud real. Esto es solo para la comunicación del usuario, no intente ocultar el código del programa en las cadenas.
La prueba de aprobación / reprobación debe basarse en el valor absoluto promedio de las variaciones porcentuales de los intervalos originales. Si las cadenas no coinciden, devuelva el error o permita que el usuario lo intente nuevamente, a su discreción.
La frase clave no debe permitir una cadena nula. En el caso de que la frase clave sea demasiado larga para su tipo de datos de cadena, ya sea truncar o rechazar y comenzar de nuevo, a su discreción.
La sensibilidad de la prueba (el umbral para la prueba de aprobación / reprobación) debe ser ajustable en el código fuente.
Originalmente proporcioné una bonificación del 20% del recuento total de bytes si su código fuente puede formatearse para parecerse a un dinosaurio. Se ha señalado que esto es altamente subjetivo y quizás más apropiado para un concurso de popularidad, por lo que he eliminado este bono. Sin embargo , todavía animo de todo corazón el formateo de dinosaurios, y si formatea su código para que parezca un dinosaurio, puede deducir cualquier comentario puramente cosmético, salto de línea o caracteres de espacio en blanco del total de bytes.
El recuento de bytes más corto gana, sujeto a la longitud de la cadena y los ajustes de formato de dinosaurio.
Tenga en cuenta que mi especificación anterior no coincide exactamente con la operación del código de Crichton, cuyas copias se pueden encontrar en línea. Siga las especificaciones, no intente clonar el original.
"Please type the key phrase"
Cuenta como 1 byte, o solo la frase cuenta y la frase citada cuenta como 3 bytes ("
, frase,"
)? ¿Es intencional que un intervalo mucho más largo y un intervalo mucho más corto se "cancelen" y se vuelvan aún más? ¿El programa tiene que verificar que las dos frases clave coincidan?Respuestas:
Rubí,
171 167157 bytesSalidas
true
si la varianza promedio es superior al 20%, de lo contrario, salidasfalse
.Intento de arte ASCII de dinosaurio:
Sin golf:
require 'io/console'
podría eliminarse cuando se ejecuta en algunos REPL de Ruby, ya que la biblioteca ya está cargada.fuente
Java 768 bytes
¿Qué? ¿Java? para el código de golf?
Esto es probablemente lo peor que puedo hacer, pero lo intenté de todos modos.
Muestra cualquier mensaje en la ventana de la consola, pero la escritura real ocurre en JTextField. No es exactamente bonito. Ah, y para guardar 5 bytes, debe cambiar el tamaño del JFrame usted mismo. Además, no verifica la corrección de la cadena la segunda vez. No estoy seguro si eso va en contra de las especificaciones.
Usar:
Escriba su clave en el campo de texto.
No presione enter, vaya a la consola y escriba algo. Mostrará otro mensaje
Escriba lo mismo en el campo de texto (que ahora debería borrarse).
Ve a la consola y presiona algo otra vez. Mostrará si eres un intruso o no.
sin golf:
golfizado:
fuente
JFrame
, por lo que no sería necesariof
.HTML, JavaScript (ES6), 328
El recuento total de bytes del código es de 402 bytes y los mensajes para interactuar con el usuario:
son 78 bytes en total, por lo que la puntuación total => 402-78 + 4 = 328
Ejecute el fragmento a continuación en un último Firefox y escriba la clave en el cuadro de entrada seguido de la tecla Intro.
El código verifica que tanto las teclas ingresadas como las reingresadas sean iguales (solicita que se vuelva a ingresar de nuevo si no), calcula el porcentaje de diferencia absoluta promedio y verifica si es menor que el valor de la variable
V
fuente
C, 154 (86 + 68 para banderas)
Compilar con
-DY=(y=clock())-x
,-DZ=a[d]
,-DE=getch()
,-DW=);while
,-DU=i++[d]=Y
y-DP=puts(
. Las nuevas líneas se agregan para fines de presentación y pueden eliminarse (el recuento de bytes dado es sin).Ungolfed + comentarios:
Esto no verifica que la frase reescrita sea idéntica, ni genera nada si el usuario no se identifica como un impostor.
Esto tampoco considera el tiempo que se tarda después de preguntar antes de la primera pulsación de tecla.
fuente
getch
apostargetc
ogetchar
? Tengo una referencia indefinida a 'getch', que si recuerdo correctamente está en desuso.char
antes de las declaraciones globales, y ahora, esto da un error de segmentación en tiempo de ejecución. ¿Puedes dar detalles sobre cómo construirlo? Qué compilador estas usando? Gracias.int
e inicializarlas0
. He probado esto usando gcc en Windows (usando Windowsgetch
).getch
se usa en lugar degetc
ogetchar
porquegetch
no requiere que se presione la tecla de retorno antes de procesar cualquier carácter (degetch
hecho, está en desuso en Windows, aunque no hay nada de malo en usar funciones en desuso aquí).Scala REPL 233
Con todo el espacio eliminado, tiene:
¡Lo cual estoy seguro de que alguien más talentoso que yo podría hacer un dinosaurio!
Breve explicacion:
El
l
método lee los caracteres y mantiene el trazonanoTime
de cuándo se escribió cada carácter.El
m
método imprime"Enter"
, interrumpe ell
método al presionar enter (carácter 13), luego lo asigna solo ananoTimes
, y luego obtiene los intervalos de tiempo entre cada carácter.Las siguientes 2 líneas se leen en 2 cadenas, las comprime, luego encuentra el valor absoluto promedio de la diferencia porcentual entre el segundo intervalo y el primero, y finalmente imprime si este promedio fue menor o no
0.2
.fuente
Lisp común: 660
Sin golf
Observaciones adicionales
Bonus de dinosaurio
Debería tener una bonificación porque todo el mundo sabe que " Common Lisp es un dinosaurio moribundo ".
fuente