Su tarea es hacer un programa que mida qué tan rápido puede escribir las letras del alfabeto inglés.
- El programa sólo aceptará las letras minúsculas
aazen orden alfabético. - Cada letra se repite a medida que se escribe en la misma línea (sin nueva línea ni ningún otro separador entre letras).
- Si escribe un carácter no válido, el programa generará
Failuna nueva línea y saldrá. - Si escribe las 26 letras, el programa, en una nueva línea , mostrará el tiempo en milisegundos que tomó desde la primera letra hasta la última y saldrá.
- El temporizador se inicia cuando se escribe la primera letra,
a.
Salidas de ejemplo:
b
Fail
abcdefgg
Fail
abcdefghijklmnopqrstuvwxyz
6440
Este es el código de golf , por lo que la respuesta más corta en bytes gana.
code-golf
date
alphabet
interactive
Danko Durbić
fuente
fuente

Failsin una nueva línea de encabezado? (por ejemplo,abdFail\noabd Fail\n))Failo milisegundos) debe estar en una nueva línea, como en el ejemplo. La mayoría de las respuestas ya asumen esto.Respuestas:
HTML (JavaScript (ES6)),
129126117 bytesHaga clic en la entrada y comience a escribir! Además, mi escritura apesta; Tomo alrededor de 5 segundos incluso con la práctica. Editar: Guardado 2 bytes gracias a @HermanLauenstein al cambiar de idioma. Guardado 3 bytes gracias a @ qw3n. Guardado 9 bytes gracias a @tsh.
fuente
<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 si no se necesita la etiqueta de cierre<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 de máquina 6502 (C64 PAL),
189165 bytesDemostración en línea (Uso:
sys49152)Explicación:
Este sería un pequeño programa si no fuera por el problema de una medición exacta de milisegundos en el C64. La interrupción del sistema ocurre aproximadamente 60 veces por segundo, lo que ni siquiera está cerca. Así que tenemos que usar un temporizador de hardware aquí que obtiene sus tics de entrada del reloj del sistema.
En una máquina PAL, el reloj del sistema es exactamente 985248 Hz. Inicializar el temporizador a 985, por lo tanto, proporciona algo cerca de tics de milisegundos, pero es un poco demasiado rápido, tendríamos que contar 986 ciclos por cada cuarto tick, o mantener el temporizador durante un solo ciclo. Esto no es posible, pero puede contener el temporizador durante 6 ciclos con la secuencia
DEC $DD0E,INC $DD0E:$DD0Ees el registro de control de temporizador con el bit 0 de ponerlo en marcha y apagado, y las dos instrucciones de tomar 6 ciclos, por lo que las escrituras exactos que detener e iniciar el temporizador son exactamente 6 ciclos de diferencia. Por lo tanto, tenemos que ejecutar esta secuencia cada 6 * 4 = 24 tick. Esto todavía no es absolutamenteexacto, el temporizador se retrasará 1 milisegundo después de 8 minutos y 12 segundos, pero probablemente sea lo suficientemente bueno: compensarlo requeriría mucho código.editar : El valor de inicio para el temporizador debe ser 984, no 985, porque estos temporizadores se disparan "en flujo inferior", por lo que un valor de 0 contará un ciclo más antes de disparar. Código fijo, recuento de bytes sin cambios.
Aquí está el listado de desmontaje comentado:
fuente
.starttimer- hará pronto :) (y aún más usando el sistemaTIcomo este respuesta básica , pero no estoy seguro de que esto es válido, porque se puede hacer mejor en código de máquina )Bash + coreutils,
1039998 bytesDebe ejecutarse en una terminal.
Prueba de funcionamiento
fuente
3479es bastante rapido! bien hecho :)ainmediatamente me daline 1: ((: r=15094100773N: value too great for base (error token is "15094100773N")y sale.datefuerza. El mío es de GNU coreutils 8.23. ¿Quédate +%s%3Nimprime en su sistema?15094104833N: esta es ladateutilidad incorporada en macOS, si eso marca la diferencia.dateparece estar usando strftime, que no reconoce%N.Python 2 + getch , 116 bytes
Gracias a ovs y ElPedro por arreglar el código y guardar 57 bytes.
fuente
SOGL V0.12 , 35 bytes
Pruébalo aquí! - haga clic en ejecutar e ingrese el alfabeto en el cuadro de entrada. Tenga en cuenta que puede ser un poco lento porque SOGL solo hace una pausa para la entrada cada 100 tokens ejecutados (y SOGL es bastante lento). Si eso te molesta, corre
sleepBI=trueen la consola.nota: no ejecute esto en el modo de compatibilidad, solo se repetirá para siempre.
Explicación:
fuente
Pascal (FPC) , 176 bytes
Pruébalo en línea!
Algunos trucos utilizados en el código para jugar golf:
Realcomo una alternativa más corta aTDateTime, porque como se define aquí ,TDateTime=Double, que es de tipo coma flotante.MilliSecondsBetweenpara calcular el intervalo de tiempo, este código multiplica la diferencia entre dos valores de punto flotante864e5, lo que funciona debido a la forma en que Free Pascal codifica seTDateTimedescribe aquí .Nota:
ReadKeyLa función en realidad no imprime la clave en la consola, por lo queWrite(c)es necesaria la escritura manual en la consola .0por escribir el alfabeto por razones obvias.fuente
for c:='a'to'z'doa la misma línea quea:=Time;.Nowlugar de hacerlo,Timeya que es más corto.86398338? Puedo entender si multiplicas 864e5 ya que hay 864e5 milisegundos en un día. ¿Pero cómo viene este número mágico?TDateTimecomoDouble.864e5suena más correcto, solucionaré los problemas.Java,
404388354348320318 bytesY aquí pensé que la Consola Java ya era detallada.
Dado que Java no tiene forma de escuchar las pulsaciones de teclas en la consola afaik, utilizo una GUI con
java.awt.-78 bytes gracias a @ OlivierGrégoire .
Explicación:
Ejemplo de gif de éxito: (Sí, escribo el alfabeto muy lentamente aquí ..)
Nota: Este es un viejo gif. La versión actual ya no imprime pulsaciones de teclas en la consola. Y ya no imprime la hora con dígitos después del punto decimal.
Ejemplo de gif de falla:
Nota: Este es un viejo gif. La versión actual ya no imprime pulsaciones de teclas en la consola.
fuente
setVisible(false)lugar de salir.showydispose, que es incluso más corto quesetVisible. Casi nunca uso la GUI de Java ... Y es inteligente usar la inicialización de clase en lugar de ponerla en el método principal. Debo recordar eso.TextField. Además, puede usar enTextArealugar deTextFieldganar dos bytes. Finalmente,KeyEventtiene ungetWhenmétodo que da el tiempo entre época y el evento en milisegundos. Solo necesito usarlos en lugar deSystem.nanoTime()ganar aún más bytes.C # (.NET Core),
245 +13183 +41177 + 41 bytes+41 bytes para
using System;using static System.Console.No probado porque estoy en el móvil y esto no funciona en TIO.
fuente
int x=0;y luego lo hagox=1/x;. Esto debería ahorrar 14 bytes. Lamentablemente lo necesitasx. Si intenta hacerlo1/0, obtiene una división por error de compilación constante cero . 2) -5 bytes para combinar la declaración deccon la primeraReadKey. 3) Cambio de la condición en el interiorifaReadKey!=++cy retirar elc++;elseotro -9 bytes.x=1/xse puede reducir ax/=x. Y agreguéusing static System.Console;para guardar algunos bytes más :)iy usarloscen la condición de bucle.MSX-BASIC, 126 caracteres
TIMEes una variable interna de MSX-BASIC que aumenta en uno cada 20 milisegundos.fuente
C # (.NET Core) ,
184 + 13 = 197173+ 13 = 186 bytesPruébalo en línea!
Lamentablemente, TIO no puede ejecutar esto, pero es útil para obtener el recuento de bytes.
+13 para
using System;-1 cambiando
i==123ai>122. Estuve tentado de hacer estoi>'z'.Agradecimientos
-10 bytes gracias a @raznagul
Sin golf
fuente
ReadKeya la condición de bucle para que pueda eliminar el primeroify elbreak.Node.js,
240213 bytesEDITAR: 27 bytes guardados gracias a Jordan
Versión sin golf:
fuente
C (gcc) , 303 bytes
Funciona en sistemas * nix. Código independiente que elimina el modo canónico del terminal actual para permitir la lectura de caracteres sin esperar nuevas líneas:
/! \ Ejecutar este programa hará que el terminal sea casi inutilizable.
Ungolfed y comentó:
Solución alternativa (218 bytes):
Si se permite configurar el terminal de antemano, entonces podemos deshacernos de la parte del código que maneja esa parte.
Aquí está el mismo código sin manipulación de terminal:
Para que funcione:
ejemplo de tiempo de ejecución:
fuente
Commodore BASIC v2 - 113 bytes
Las letras mayúsculas deben ser desplazadas.
Gracias a Felix Palmen por señalar algunos errores tipográficos, las especificaciones lo
prueban
fuente
TIse incrementa en él). Considero inadecuado por su falta de precisión, pero supongo que es un juego justo aquí porque simplemente no hay forma de hacerlo mejor en BASIC :) Aún así, pegando esto en el vicio, obtengo un error de sintaxis en1- ¿alguna ayuda?1on-(f=26)gO4:gEa$:ifa$=""tH1Nitpicks: 1.) la salida está en la misma línea, 2.) la salida es todo en mayúsculas - Creo que deberías arreglar eso, no tomará muchos bytes de todos modos :)Perl 5,
7993 +31 (-MTerm :: ReadKey -MTime :: HiRes = time) bytes$|=1no es suficiente para configurar el terminal en modo sin procesar,stty -icanondebe ejecutarse antes opara ver los caracteres en la terminal después de ejecutar el comando:
stty echoostty echo icanonfuente
ReadKey! Puede guardar algunos bytes aquí y allá,1e3para1000,$s||=timey si configura$sprimero y luego llamaReadKey, puede cambiar elmapa un postfixfor. Me gustaría decir endielugar deexit print, pero creo que estás ahí ... Jugué con,printf"\n%i"pero eso terminó siendo más grande, y pensé en usarlo en$-lugar de$s, ¡pero eso fue estúpido! :)$|=1;, también $ s || = el tiempo no se puede cambiar del mapa porque el temporizador debe comenzar después de presionar la primera tecla, ydieharía ecoFailen stderr en lugar de stdout.exit printes tan largo! Lo siento, no creo que haya explicado mi pensamientoforcorrectamente:$s||=time,ReadKey eq$_||exit print" Fail"for a..zcreo que debería funcionar ... ¡Quizás incluso$|=$s||=...o$|=map...si prefieres ese enfoque! ¡Aunque creo que lo has clavado!$|=map..no establece la entrada sin búfer en la nueva terminal (tuve el error al eliminar, ReadMode 3, porque estaba probando en la misma sesión), y$s||=timeantes de que la primera ReadKey iniciara el temporizador demasiado temprano$|, pero de nuevo, ¡se está almacenando después del ciclo que es demasiado tarde! Estás un paso por delante!Aceto , 70 bytes
Comienzo estableciendo una marca de captura y reflejando horizontalmente (
@|), si el valor en la pila es verdadero. Inicialmente no lo es, y luego siempre lo será. Saltaremos aquí más tarde si se ingresa una clave incorrecta. Luego, empujamos una a en la pila ('a), luego la duplicamos y leemos un solo carácter del usuario (d,). Si los dos caracteres no son iguales (=!), "colisionamos" ($) y volvemos a la marca de captura. De lo contrario, presionamos otra "a" e imprimimos, luego establecemos la hora actual ('apT).Luego ingresamos nuestro "bucle principal": "incrementamos" el carácter actual e "incrementamos" el carácter (
'apToIc), luego lo duplicamos, leemos un nuevo carácter, lo comparamos y "bloqueamos" si los caracteres no son idénticos (d,=!$) Si no fallamos, comparamos el carácter actual con "z" (d'z=|), si no es igual, imprimimos el carácter, luego presionamos un 1 y saltamos "condicionalmente" (en este caso: siempre) al solooen el código (el comienzo de nuestro bucle principal). Si era igual a z, reflejamos horizontalmente a un espacio vacío en la parte superior. Imprimimos "z", luego presionamos el tiempo actual (menos el tiempo de inicio;t) y luego multiplicamos el número 1000 (obtenido al elevar 10 a la tercera potencia;91+3F) por él (porque obtenemos segundos, no milisegundos). Luego imprimimos una nueva línea, la hora y salimos (pX)Si alguna vez fallamos (entrada incorrecta del usuario), saltamos hasta el principio. Dado que ahora tendremos un valor verdadero en la pila, reflejaremos horizontalmente en el
u, que invierte la dirección en la que nos movemos.nImprime un carácter de nueva línea, luego empujamos"Fail"la pila, la imprimimos y salimos (pX).fuente
Mathematica (expresión de cuaderno), 248 bytes
Cómo funciona
A
DynamicModulecon unEventHandlerque responde a las pulsaciones de teclas en minúsculas. Las variablesx,sytmantienen presionadas las letras hasta el momento, la hora de inicio y la hora de finalización, respectivamente. Tan pronto como notamos quexes igual a{"a"}, comenzamos el tiempo; mostramos el tiempo total empleado o la cadena construida hasta el momento, o"Fail"dependiendo de qué condición se cumpla.Podríamos guardar otro byte en
t<1lugar det==0si podemos suponer que nadie es lo suficientemente rápido como para escribir el alfabeto en menos de un segundo :)Si está probando esto en un cuaderno de Mathematica, tenga en cuenta que debe hacer clic dentro del marco antes de registrar sus pulsaciones de teclas. (Esta es la razón por la que necesitamos el marco para empezar; si
Framedno está allí, todo el objeto seleccionado cambia cuando se presiona una tecla, por lo que deja de seleccionarse y tendrá que hacer clic nuevamente).fuente
C #,
154152 + 13 = 165 bytesGuardado 2 bytes gracias a los comentarios de Ayb4btu
El código anterior tiene espacios en blanco para que se ajuste en SE sin una barra de desplazamiento. El espacio en blanco no es parte del recuento de bytes
y 13 bytes para
using System;Es similar a la versión de Ayb4btu pero con las siguientes diferencias:
Almacenar datetime como un largo, nos permite hacer
cun largo también, y atajo la declaraciónLoop no necesita un descanso por separado
En realidad, no es más corto de usar
$"interpreted strings"en lugar de agregar una "\ n" necesaria en los milisegundos para convertirla en una cadena para la línea siEl uso de un
forbucle a veces nos permite guardar caracteres durante un tiempo, aunque creo que este no guardaría el equivalentewhileDe Ayb4btu:
s=s==0puede llegar a sers=s<1yc==123puede llegar a serc>122Sin golf
fuente
DateTime. Puede guardar un par de bytes más cambiandos=s==0as=s<1(contando con el hecho de que s no será negativo) y cambiandoi==123ai>122.i<123tenía que ir antes delReadKey(), de lo contrario, espera a otro personaje después de z antes de mostrar la hora.zdebería significar readkey.keychar devuelve 122 cuando el usuario escribe z, c también es 122, por lo tanto'z' == 122tiene éxito, c se incrementa, luego c (ahora 123) se pruebac<123y falla, deteniendo el lazo .. ?c++incremento cuando lo estaba mirando. Sin embargo, acabo de probarlo y cuandoabcdefghijklmnopqrstuvwxyslo escribo me da un tiempo en lugar de fallar. Creo que es porquecaún se incrementa aunque elKeyCharcheque falla, por lo tanto, pasa elc>122cheque.Processing.org
133142primer código no salió
fuente
GCC, windows, 98 bytes
No requiere entrada instantánea para la primera tecla
fuente