Si no está familiarizado con hacker typer, consulte hackertyper.net . En resumen, es un programa que genera un fragmento de una base de código por pulsación de tecla para un efecto cómico. PERO, la versión hackertyper.net es demasiado fácil de implementar. Simplemente genera tres caracteres a la vez desde un código arbitrario . Para este desafío, un programa debe generar su propio código fuente e imprimir un fragmento de código delimitado por espacios por pulsación de tecla.
Detalles
- Uno no puede codificar un nombre de archivo para el programa; debe determinar su nombre dinámicamente. Si el programa se compila en un ejecutable, puede agregar la extensión de archivo estándar al nombre del ejecutable (excluyendo el .exe si usa Windows) y asumir que el archivo fuente está dentro del directorio del ejecutable. Por ejemplo, si un ejecutable en C se llama "hacker", debe extraer su código fuente de un archivo llamado "hacker.c" en su mismo directorio. Si un programa compilado tiene una extensión, debe descartarse antes de determinar el nombre de su código fuente ("typer.exe" -> "typer.cs").
- Los programas deben contener al menos 5 espacios, con al menos un carácter entre cada espacio. Esto significa que el tamaño más pequeño posible para este desafío es de 9 bytes. Los espacios no tienen que ser cruciales para el funcionamiento del programa.
- Cualquier formato (sangría, nuevas líneas, etc.) debe mantenerse en la salida. Este formato puede imprimirse con el código que lo sigue o seguirlo, lo importante es mantener el formato.
- Evite usar comentarios para satisfacer los 5 requisitos de espacio a menos que no haya otra forma de implementar los espacios en el idioma que elija.
EDITAR : Se pueden usar nuevas líneas en lugar de, o además de, espacios como separadores de fragmentos.
Respuestas:
golpe, 51
58fuente
2: read: Illegal option -s
)cat $0
e tildes con$(<$0)
IFS=\
realmente necesario si omite el shebang? El IFS predeterminado es algo asíIFS=$'\n\t '
, y como ya no tiene una nueva línea, no creo que deba limitarla solo al espacio.for w in `<$0`;{ read \-sn1;printf $w\ ;}
HTML y JavaScript, 123
Esto funciona de manera similar al hacker typer, pero con su propio código fuente. Avísame si he entendido mal las reglas.
Y aquí hay una versión con estilo (170 caracteres):
He hecho una demostración . Se modificó porque JS Bin agrega mucho código extra, pero la idea general es la misma.
fuente
<head>
fue que el navegador lo agregará si no está allí, por lo que siempre se mostrará. Aunque me olvidé<html>
.Perl + Término :: ReadKey, 56 bytes
Gracias a ThisSuitIsBlackNot por la inspiración original, y a primo por sugerir
open 0
y<0>
.Tenga en cuenta que la nueva línea posterior
for
es realmente innecesaria, excepto que necesito incluir una nueva línea adicional en algún lugar para llevar el recuento de espacios en blanco hasta el mínimo especificado de cinco.También tenga en cuenta que, al igual que el envío de ThisSuitIsBlackNot, este programa requiere el módulo Term :: ReadKey de CPAN. En Debian / Ubuntu Linux, este módulo, si aún no está presente, se puede instalar fácilmente con el comando
sudo apt-get install libterm-readkey-perl
.Además, para guardar algunos caracteres, este programa no restaura el modo de entrada a la normalidad al salir, por lo que es posible que no pueda ver lo que está escribiendo después. Ejecutando el comando de shell
stty sane
oreset
debería solucionarlo. Este problema podría solucionarse, a un costo de 10 bytes adicionales, con:Bonus: quine puro, 81 bytes
Nuevamente, la nueva línea después de la coma solo es necesaria para cumplir con el mínimo de cinco espacios en blanco.
A diferencia del programa de 56 bytes anterior, esta versión en realidad no necesita leer su propio código fuente, ya que se basa en una quine, específicamente, en esta quine:
Lo bueno de este quine es que puede transportar fácilmente una "carga útil" arbitraria dentro del
q{ }
bloque, sin tener que repetirlo. Si bien no puede vencer<0>
en brevedad, se acerca bastante.Nota: Este programa utiliza la función Perl 5.10+
say
y, por lo tanto, debe invocarse con el-M5.010
(o-E
) interruptor de línea de comando. Según el consenso establecido sobre meta, tales interruptores utilizados para habilitar las características del lenguaje moderno no cuentan como caracteres adicionales . La solución más corta que puedo encontrar sinsay
es de 83 bytes:Ambos también se pueden hacer más amigables con la terminal (uniendo las dos últimas líneas e) insertando:
antes de la última
}
.fuente
stty sane
lugar dereset
(lo que, en algunos sistemas operativos, a veces podría estar haciendo algo más que simplemente restablecer algunos parámetros terminales ^^)open F,$0
y<F>
podría ser reemplazado conopen 0
y<0>
. Además, diría que una publicación en meta no constituye realmente un consenso. La opción-M5.01
no "lleva el idioma a un punto específico" , como sugiere el autor, habilita funciones. No hay una versión de perl para la que estas funciones estén habilitadas de forma predeterminada.ruby golfscript.rb foo.gs
cuenta como un comando válido para ejecutar un programa escrito en GolfScript, entoncesperl -M5.010 foo.pl
debería contar como un comando válido para ejecutar un programa escrito en "Perl 5.10". Pero tales argumentos realmente pertenecen al meta, no aquí.)Python 3 - 124 bytes - 7 espacios
Código:
Sin golf:
Versión con estilo:
fuente
Ruby,
85, 71Lástima que
IO#raw
no sea parte de la biblioteca estándar.Mejora
Este elimina la llamada a Kernel # exit y usa variables globales para acortar el código.
fuente
Befunge - 21
Estoy bastante satisfecho con esto, ya que me acabo de enterar de Befunge. Si no le importa "escribir" en una ventana emergente, puede ejecutarlo aquí o aquí hasta que encuentre un mejor intérprete en línea.
fuente
Powershell, 89
fuente
Python 3: 299
Es una quine. Se redujo de 507 al usar
exec
y mover algunas declaraciones.fuente
C,
211186 bytesMi solución en C usando la biblioteca de maldiciones. Puede ser más largo que la otra solución de C, pero es una quine. Aunque no es requerido por la pregunta, sigue siendo bastante agradable. También funciona bastante bien:
Una versión más legible con algunos comentarios y cosas:
compilar con:
fuente
C -
136135132bytes (solo Windows)Nota: hay un espacio al final del programa, que probablemente no aparecerá.
No puedo garantizar que este programa funcione en una sola computadora que no sea la mía, ya que es increíblemente hacky. Las cosas habrían sido mucho más simples cuando todos tenían máquinas de 32 bits. Entonces no tendría que preocuparme por
sizeof(int*)
tener 8 (lo que definitivamente es; lo imprimí para asegurarme) mientrassizeof(int)
tenga 4.Felizmente, el nombre del ejecutable se almacena en la primera cadena en argv.
Sin embargo, poner un puntero como argumento para una función significa que tengo que especificar explícitamente el tipo de TODOS los argumentos de la función, lo que significa que tendría que escribirAfortunadamente encontré una solución alternativa. Tuve el segundo argumento para mainint
dos veces, una gran pérdida de caracteres.q
, ser solo otro int. Luego, asignarq
a una variable de tipo deint**
alguna manera logró capturar todos los bytes necesarios de la pila.No tuve éxito en encontrar tales trucos para interpretar el tipo de retorno
fopen
como un puntero sin declarar la función.Editar: Notado que debería usar en
~fscanf(*v,"%s",b)
lugar defscanf(*v,"%s",b)>0
ya que el retorno es -1 cuando se alcanza EOF.fuente
void **v;
) en lugar de crear prototiposfopen()
.fopen
. No veo por qué sustituir void por int debería hacer la diferencia, ya que todos los punteros son del mismo tamaño de todos modos.b[1<<20];main(int *c,char **v){strcpy(b,*v);strcat(b,".c");c=fopen(b,"r");for(;fscanf(c,"%s",b)>0;printf("%s ",b))getch();}
(tuve que sustituirgetchar()
porgetch()
embargo).*fopen()
lugar de*fopen(a,b)
?Perl - 87 bytes
No vi nada en las reglas sobre qué hacer una vez que el archivo se ha leído hasta el final, por lo que simplemente se queda esperando la entrada después de imprimir el último fragmento.
fuente
node.js con LiveScript:
versión asincrónica:
fuente
Cobra - 147
CobraCore.exePath
es muy útil!fuente
Javascript ES6, 154
Firefox 154 :
Chrome 175 :
Ambos 274 :
Sin golf (cromo):
Tiene dos versiones, porque Chrome no maneja la función de flecha y la consola no se borra con el mismo método
El Firefox uno funciona con firebug, parece que la consola de desarrollador predeterminada no se puede borrar de un script.
fuente
Groovy - 379
Como no hay ninguno
getch()
o equivalente en los lenguajes Java y Java-esque como Groovy ... básicamente mi código no maneja las pulsaciones de teclas. Eso es todo: Dfuente
C, 248 caracteres
Quine verdadero
Solo funciona en Unix, en Windows se implementaría usando _getch.
fuente
HTML y Javascript, 232 bytes
El tradicional Javascript quine, pero modificado.
JS Violín aquí .
fuente
SmileBASIC,
7975 bytesEs muy fácil obtener una LÍNEA específica de un programa en SmileBASIC, así que solo pongo los espacios antes de cada salto de línea.Pensé que era muy inteligente, colocando los espacios antes de cada salto de línea, pero aparentemente se nos permite usar saltos de línea en lugar de espacios ...Explicación:
fuente
Haskell
fuente