El objetivo de este código de golf es crear un intérprete para el lenguaje de programación HQ9 +
Hay 4 comandos en este lenguaje de programación:
- H - imprime "¡Hola, mundo!"
- Q : imprime el código fuente del programa
- 9 - imprime la letra de la canción "99 botellas de cerveza"
- + - incrementa el acumulador
Las normas:
- Como el acumulador no está definido, puede ignorar el comando +
- Su programa debe solicitar la entrada (esta entrada será el código fuente) o el código fuente se lee desde un archivo
- No está permitido poner la letra de "99 botellas de cerveza" en un archivo, y leer el texto del archivo
- No puede utilizar un algoritmo de compresión como GZip o BZip para comprimir el texto de la canción: debe crear su propio algoritmo de compresión. Esto no tiene que ser un algoritmo complejo, pero intente comprimir el texto tanto como sea posible (recuerde: este es un código de golf, gana el código con la menor cantidad de bytes)
- Si el código fuente contiene un carácter que no es H , Q , 9 o + , ¡entonces la salida "El código fuente contiene caracteres no válidos" antes de ejecutar cualquier comando! Esto significa que, si el código fuente es,
H1
por ejemplo, no emitaHello, world!
antes de la salidaSource code contains invalid characters
. No, salida inmediataSource code contains invalid characters
- Si su intérprete acepta caracteres en mayúscula y minúscula, entonces obtiene -8 en su recuento de caracteres
¡Buena suerte!
code-golf
interpreter
hq9+
ProgramFOX
fuente
fuente
Respuestas:
APL (Dyalog) (326-8 = 318)
Pégalo en una ventana del editor y llama
H
. La entrada se toma del teclado.fuente
Mathematica,
349346341caracteresfuente
If[StringMatchQ[3, "a"], x, y]
C,
599587487481467 caracteresEstoy seguro de que esto puede ser mejor. Estoy usando C después de todo. Hay una razón por la que no ves muchas entradas de golf ganadoras escritas en C. Esto ahora tiene 467 caracteres gracias al abuso criminal de
#define
.Especifique el archivo fuente HQ9 + como argumento de línea de comando.EDITAR: ahora acepta la fuente de stdin, no un archivo. Iniciar el programa, comience a escribir el código, CTRL- Ccuando se hace para ejecutarlo.
Compila al menos en MinGW / GCC con:
gcc -o hq9+.exe hq9+.c
Debería funcionar en MSVC, pero no tenía ganas de crear una solución completa solo para esto. :)
O:
fuente
C
y un par antesR;
. También podría eliminar 8 caracteresp[s++]=0;
después del bucle de entrada para simplificar la impresiónp
.Python 2 -
452453443 bytesBleh Ya estaba mal, pero luego descubrí un error que me costó un byte para solucionarlo. Bleh
(No solía incluir
+
en la salida paraQ
. Una entrada deQ+++
dio la salidaQ
, por ejemplo).Guarde algunos caracteres al no salir de una entrada no válida como pensé que se suponía que debía hacer
Versión explicada próximamente.Me di por vencido. Apenas entiendo cómo funciona esta monstruosidad. Si hay demanda, lo intentaré otra vez, pero hasta entonces no está sucediendo.fuente
exit
utiliza el carácter no válido, solo muestra el mensaje, para que pueda guardar 7 caracteres allí.99 bottles of beer on the wall, 99 bottles of beer. Take one down, pass it around, *99* bottles of beer on the wall.
se supone que debe decir:99 bottles of beer on the wall, 99 bottles of beer. Take one down, pass it around, *98* bottles of beer on the wall.
+
. Se supone que debes ignorar+
, no dar un errorHQHH
debería decirHello World!HQHHHelloWorld!Hello World!
Perl, 325-8 = 317
Expandido:
fuente
Rubí,
364360-8 = 352Todavía tiene mucho margen de mejora. Código de 99 botellas robadas de aquí .
fuente
No more bottles of beer on the wall
después de la1 bottle
sección. entonces esGo to the store...
1 bottle of beer on the wall, 1 bottle of beer on the wall, take one down, pass it around, no more bottles of beer on the wall. No more bottles of beer on the wall, no more bottles of beer, go to the store, buy some more, 99 bottles of beer on the wall.
Haskell, 298
Esto es bastante sencillo.
%
devuelve la salida de un comando (dado el código fuente para usar enQ
).d
devuelve la canción de 99 botellas con una línea de basura al comienzo por razones de golf. todo está envuelto en una interacción (es posible que desee usar eng
lugar demain
al probar)fuente
<interactive>:8:5: parse error on input ‘=’
.let
para insertar definiciones (esto se rompe al insertar múltiples definiciones no separadas por;
) o ejecutar el código desde un archivo.main
, dice que el código fuente contiene caracteres no válidos cuando intento ejecutarH
. Cuando intento ejecutar eng
lugar demain
, inmediatamente me da un error.main
no funciona porque la nueva línea agregada no es un comando legal. Es por eso que recomendé usar en sug
lugar. En cuanto ag
, ¿putStrLn $ g "H"
no funciona correctamente?J - 444 bytes
Me gustó el número, así que dejé de jugar al golf. ¡Aquí tienes, función de expresión única!
Ejemplos:
fuente
Fortran 528
470481Requiere compilar con-fpp
flag (+3 para calificar) 1 para usar directivas de preprocesamiento (lo que ahorra más de 3 caracteres, así que estoy totalmente de acuerdo con eso). También es insensible a mayúsculas y minúsculas, por lo que hay -8: D. Se guardaron 5 caracteres al no procesar previamente elendif
que se usa una vez de todos modos .Requiere que el archivo tenga una
.F90
extensión (tiene sentido llamarlohq9+.F90
) para que el compilador fuerce el preprocesamiento. El código distingue entre mayúsculas y minúsculas; hacer que no distinga entre mayúsculas y minúsculas agrega algo así como 16 caracteres, por lo que realmente no vale la pena guardar 8 caracteres. Mi respuesta anterior no tenía en cuenta los plurales cambiantes debottles
for9
; esta versión lo corrige (y lamentablemente agrega muchos más caracteres).Se ve mucho mejor sin golf y sin preprocesar (probablemente porque puedes ver lo que está sucediendo):
fuente
.cc
para evitar necesitar la-lstdc++
bandera.Pitón 2, 340 - 8 = 332
fuente
Lua 443 - 8 = 435
464 - 8 = 456Logré guardar 21 caracteres usando múltiples
if-end
s en lugar deif-elseif-end
. También tuve algunos espacios en blanco adicionales flotando después de algunos)
.Estoy bastante contento con este, aunque no es mucho más corto que mi respuesta de Fortran . El código de 99 botellas de cerveza ha sido modificado a partir de esta respuesta por Alessandro . Sin golf, tenemos
fuente
if s in'Hh'
in
es para iteradores for-loop y no para comparaciones; obtendrá un error si lo pega allí. Aquí hay tres opciones: (1) usarmatch
en cada línea, (2) usuarios=='h'or s=='H'
en cada línea, (3) hacerlo como lo hice. Claramente (3) es más corto que (1) y (2).Julia, 362
fuente
Tcl, 515
Solo un poco golf, aún más pequeño que C y las 99 botellas correctas de cerveza terminan el verso.
fuente
regexp
. Puede obtener mi golf de 99 cervezas en codegolf.stackexchange.com/a/109818/29325JavaScript (ES6), 385
No opté por las mayúsculas y minúsculas, habría costado demasiados caracteres. Ni siquiera cerca de algunas de las otras entradas, ¡pero fue divertido!
JavaScript, 344
Hice una versión con una versión menos completa de la canción:
pero después de ver las otras entradas (y mirar las letras reales, ¡quién sabe!), ¡pensé que era un poco policial!
fuente
Go to the store, buy some more, *99* bottles of beer on the wall
, no*No more* bottles of beer on the wall
Q
tampoco funciona para mí.Q
se suponía que debía hacerlo en ese momento y proporcioné el código fuente de la función en lugar de la entrada ... Esa fue originalmente mi razón para hacerlo en JS, esa parte sería fácil, sin embargo, ahora sé que eso no es lo que se requiere.C, 562 bytes
Como un programa completo. El primer argumento es el programa HQ9 +. Con un acumulador real. Me desafié a mí mismo a no usar declaraciones definitorias.
Versión sin golf:
fuente
Java, 546 bytes
Esta es mi primera presentación de código de golf. Estoy seguro de que podríamos hacer más con eso. Lee la entrada como el argumento de la línea de comando. Código de cerveza "prestado" de "99 Botellas de cerveza" respuesta de Java (Creative Commons)
Avíseme si los argumentos de la línea de comando no son aceptables. ¡Esto fue muy divertido!
fuente
Excel VBA, 489 bytes
Sin sangría:
(sangrado para facilitar la lectura)
Cambie el nombre de la llamada predeterminada del Módulo 1 a M
con
h "+++++++++Your Code"
Esto también funcionará en otras aplicaciones de oficina, cambiando ActiveWorkbook al tipo de documento apropiado
fuente
For n=1 To
aFor n=1To
(eliminar espacios en blanco antesTo
) y 4 bytes al convertir todas las instancias deDebug.? 2;
aDebug.?2;
(eliminar espacios en blanco después de la?
palabra clave)