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
a
az
en 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á
Fail
una 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
Fail
sin una nueva línea de encabezado? (por ejemplo,abdFail\n
oabd Fail\n
))Fail
o 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
:$DD0E
es 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 sistemaTI
como 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
3479
es bastante rapido! bien hecho :)a
inmediatamente me daline 1: ((: r=15094100773N: value too great for base (error token is "15094100773N")
y sale.date
fuerza. El mío es de GNU coreutils 8.23. ¿Quédate +%s%3N
imprime en su sistema?15094104833N
: esta es ladate
utilidad incorporada en macOS, si eso marca la diferencia.date
parece 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=true
en 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:
Real
como una alternativa más corta aTDateTime
, porque como se define aquí ,TDateTime
=Double
, que es de tipo coma flotante.MilliSecondsBetween
para 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 seTDateTime
describe aquí .Nota:
ReadKey
La función en realidad no imprime la clave en la consola, por lo queWrite(c)
es necesaria la escritura manual en la consola .0
por escribir el alfabeto por razones obvias.fuente
for c:='a'to'z'do
a la misma línea quea:=Time;
.Now
lugar de hacerlo,Time
ya 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?TDateTime
comoDouble
.864e5
suena 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.show
ydispose
, 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 enTextArea
lugar deTextField
ganar dos bytes. Finalmente,KeyEvent
tiene ungetWhen
mé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 dec
con la primeraReadKey
. 3) Cambio de la condición en el interiorif
aReadKey!=++c
y retirar elc++;else
otro -9 bytes.x=1/x
se puede reducir ax/=x
. Y agreguéusing static System.Console;
para guardar algunos bytes más :)i
y usarlosc
en la condición de bucle.MSX-BASIC, 126 caracteres
TIME
es 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==123
ai>122
. Estuve tentado de hacer estoi>'z'
.Agradecimientos
-10 bytes gracias a @raznagul
Sin golf
fuente
ReadKey
a la condición de bucle para que pueda eliminar el primeroif
y 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
TI
se 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$=""tH1
Nitpicks: 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$|=1
no es suficiente para configurar el terminal en modo sin procesar,stty -icanon
debe ejecutarse antes opara ver los caracteres en la terminal después de ejecutar el comando:
stty echo
ostty echo icanon
fuente
ReadKey
! Puede guardar algunos bytes aquí y allá,1e3
para1000
,$s||=time
y si configura$s
primero y luego llamaReadKey
, puede cambiar elmap
a un postfixfor
. Me gustaría decir endie
lugar 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, ydie
haría ecoFail
en stderr en lugar de stdout.exit print
es tan largo! Lo siento, no creo que haya explicado mi pensamientofor
correctamente:$s||=time,ReadKey eq$_||exit print" Fail"for a..z
creo 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||=time
antes 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 soloo
en 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.n
Imprime 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
DynamicModule
con unEventHandler
que responde a las pulsaciones de teclas en minúsculas. Las variablesx
,s
yt
mantienen presionadas las letras hasta el momento, la hora de inicio y la hora de finalización, respectivamente. Tan pronto como notamos quex
es 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<1
lugar det==0
si 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
Framed
no 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
c
un 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
for
bucle a veces nos permite guardar caracteres durante un tiempo, aunque creo que este no guardaría el equivalentewhile
De Ayb4btu:
s=s==0
puede llegar a sers=s<1
yc==123
puede llegar a serc>122
Sin golf
fuente
DateTime
. Puede guardar un par de bytes más cambiandos=s==0
as=s<1
(contando con el hecho de que s no será negativo) y cambiandoi==123
ai>122
.i<123
tenía que ir antes delReadKey()
, de lo contrario, espera a otro personaje después de z antes de mostrar la hora.z
debería significar readkey.keychar devuelve 122 cuando el usuario escribe z, c también es 122, por lo tanto'z' == 122
tiene éxito, c se incrementa, luego c (ahora 123) se pruebac<123
y falla, deteniendo el lazo .. ?c++
incremento cuando lo estaba mirando. Sin embargo, acabo de probarlo y cuandoabcdefghijklmnopqrstuvwxys
lo escribo me da un tiempo en lugar de fallar. Creo que es porquec
aún se incrementa aunque elKeyChar
cheque falla, por lo tanto, pasa elc>122
cheque.Processing.org
133142primer código no salió
fuente
GCC, windows, 98 bytes
No requiere entrada instantánea para la primera tecla
fuente