Después de mi entrada al mundo ofuscado Hello World , pensé que sería divertido compartir el código subyacente. Pero, ¿por qué solo mostrar el código, hagámoslo también un golf!
Desafío
Escriba un script que desplace una cadena por la terminal, de derecha a izquierda, estableciéndose en el lado izquierdo.
Entrada
Toma una cuerda como argumento.
Resultado
Imprime la marquesina de desplazamiento en STDOUT. Ancho máximo de ~ 50 caracteres. Comienza con 0 o 1 caracteres que se muestran. Algún espacio entre letras mientras se desplaza. Se detiene cuando se establece (sin espacio adicional entre caracteres de palabras). Desplazamiento lento, pero no demasiado lento (<1s por iteración).
Ejemplo
Ejecutar script con arg 'Hello World'
H
luego
H e l l o W o
luego
H e l l o W o r l d
luego
Hell o W o r l d
finalmente
Hello World
Para ver un ejemplo en ejecución, pruebe mi código del desafío "Hello World". Eventualmente publicaré el mío. Actualmente tiene 202 caracteres en Perl. Ahora que hay algunos competidores, he publicado el mío en las respuestas.
Ganador
No quiero que las restricciones sean absolutas, por eso las dejé un poco vagas. El guión más corto que siga el espíritu de mi original ganará.
Notas
Este juego asume el xterm
medio ambiente. Si otro entorno resulta útil, solo se compararán entornos similares y se puede declarar un ganador por separado para cada uno.
Anexo (25 de abril de 2012)
Para abordar algunos problemas incipientes, estoy tomando una decisión. Su recuento de caracteres debe incluir el código necesario para:
- Flush STDOUT (Mirándote Ruby)
- Implementar
sleep
con un retraso de <1s (Mirándote, Perl)
Esto se puede hacer cuando la línea de comando cambia a un intérprete, pero esos caracteres cuentan en el total (sin espacios en blanco circundantes).
xterm
,vt102
, ...?Respuestas:
pitón 2 - 146 caracteres
editar: lo convirtió en una función en lugar de ingresarlo a través de stdin. El primer argumento es la cadena, y el segundo argumento es la longitud que desea que sea. entonces la invocación sería
f('Hello World', 50)
. También lo hice mucho más suave; cuando cada personaje 'aterrizó' hubo una pausa incómodaviejo, 158 caracteres:
fuente
f("Hello World, 40)
funcionó para mí.Ruby,
939189 caracteresEl texto a mostrar se debe dar como argumento de línea de comando, p. Ej.
para el ejemplo que se muestra arriba. Desafortunadamente no puedo mostrar la animación aquí, así que debes probar el código tú mismo.
Versión previa:
fuente
STDOUT.sync=true;
para que se enjuague automáticamente. El equivalente de Perl es$|++
. Eso es 17 caracteres adicionales, pero aún está muy por debajo del mío. ¡Pues no puedo permitir que Ruby venza a Perl! Voy a tener que trabajar. Buena esa.ruby1.8 "Hello World"
, recibo, no exactamente para mi sorpresa, un error que dice:ruby1.8: No such file or directory -- Hello World (LoadError)
ruby foo.rb args
;-)C,
948380173 caracteresEDITAR: Se agregó mucho código, implementa toda la funcionalidad solicitada ahora. La constante
1e8
se puede ajustar para controlar la velocidad. En mi máquina, es bastante rápido como es.Algunos personajes seguramente se pueden guardar aquí.
l
puede ser estático (guarda la inicialización),c
puede convertirse en un puntero (reemplazarb+c
).Versión anterior (80 caracteres), con funcionalidad parcial:
guardado un par de caracteres reemplazándolos
char**t
porint*t
. Funciona bien en 32 bits (int**t
admitiría 64 bits).fuente
K&R C -
431416 caracteresRespeta el estándar en alto grado. Utiliza ncurses, por lo que debería ser en gran medida independiente de la terminal. Hay un ligero tartamudeo cuando el texto toca el costado debido a algunos trucos jugados para preservar el espacio en blanco deseado en la cadena.
La cadena a usar se debe pasar como el primer argumento en la línea de comando (y se debe escapar si contiene espacios, más aún si contiene a
!
como lo hizo mi cadena de prueba (Hello, World!
)).En una forma más legible y comentada:
fuente
if
con operadores. Por ejemplo -if((s-q)%2)s--;else usleep(1e5);
->s-q&1?s--:usleep(1e5);
(os-=s-q&1||usleep(1e5);
)' '
s con equivalentes numéricos.x==32
conx-32
(invierte el significado, por lo tanto, invierta si no), o conx<33
(suponiendo que 0..31 nunca se usa). Inicialice con los valores que tiene (for(curs_set(c=0);...
).*(s+1)
->s[1]
. Quite las llaves innecesarias (reemplazar;
con,
ayuda).Perl 5.13.2, 96
Robando mucho de la respuesta de @ Kevin Reid , especialmente el
/r
truco disponible en los nuevos Perls.Perl, 115
Al igual que la respuesta de @ Joel Berger , esto sería mucho más corto si pudiera usarlo
sleep 1
y ser lento, o pasar-MTime::HiRes=sleep
la línea de comando para habilitarlosleep.1
. De lo contrario, la única forma incorporada de dormir cortoselect'','','',.1
es bastante larga.Perl, 128Perl, 133fuente
x
y la forma de bloque demap
guardará algunos.JavaScript
180218 caracteresVersión de producción:
Versión sin golf:
Aquí hay una demostración de jsFiddle
Nota: si intenta reproducirlo, asegúrese de que el código esté debajo del cuerpo
fuente
Perl 5.13.2, 115 caracteres
/r
.Créditos
$"
como fuente de la respuesta" "
de ephemient , reducción en 1 personaje.fuente
r
bandera, la mejor adición al idioma desdestate
bash 234
Uso:
sin golf:
fuente
R, 319 caracteres
Siguiendo la filosofía del ejemplo @Blazer (d es el retraso en segundos):
Uso:
fuente
Perl :
144133Para obtener el sueño de <1s, aunque debe ejecutarse como:
Como no me declararé ganador, no discutiré sobre lo que cuenta allí o no (pero realmente no puedo hacer que Ruby gane esto ;-))
fuente
s/' '/$"/g
ys/shift/pop/
push
declaración. Simplemente no lo había publicado todavía.Q, 145
No cumple exactamente con los requisitos porque la línea final elimina todos los espacios que estaban en la cadena de entrada original.
Se necesitan dos argumentos, cadena de entrada y velocidad de desplazamiento
fuente
PowerShell, 135
No es muy golfista y probablemente sea un enfoque horrible, pero estoy enfermo y realmente no puedo pensar ...
fuente
J (116)
Toma la cadena de entrada en la línea de comando, es decir
jconsole marquee.ijs 'Hello, world!'
Si no necesita borrar la pantalla, es decir, salida como esta:
está permitido, sería 12 caracteres más corto.
Explicación:
s.=>2{ARGV
: obtener la cadena de la línea de comandok.=50,3#~<:#s
: la cantidad inicial de espacios en blanco agregados antes de cada personaje, 50 antes del primero y 3 antes de todos los demás. (da una matriz, '50 3 3 3 ... ')([-=&0@/:@\:@~:&0)
: dada una matriz, disminuye el primer elemento distinto de cero en la matriz^:(i.>:+/k)
: esta función se aplicó N veces, donde N es 0 hasta la suma de la cantidad de espacios en blanco agregados. (da una matriz:50 3 3 3; 49 3 3 3; 48 3 3 3; ... 0 0 0 1; 0 0 0 0)
."1
: ejecuta la siguiente función en cada fila de la matriz;@:(([,~#&' '@])@.>)
: agrega la cantidad de espacios dada antes de cada carácter en la cadena(50&{.)
: toma los primeros 50 caracteres de la cadena([[i.@]&2e7)
: una función que genera la lista de 0 a 2 * 10 ^ 7, y luego la tira. Esto toma aproximadamente un tercio de segundo en mi máquina, esto causa el retraso.((50#LF)&,)
: agregue 50 líneas nuevas antes de la cadena, para borrar la pantallaecho
: salida de la cadenas (...)
: da la cadena como argumento izquierdo a la funciónfuente
APL (70)
Toma la entrada del teclado, la salida está en la
⎕SM
ventana (que sería el terminal si tuviera un APL basado en texto, supongo). El tamaño de la ventana se detecta automáticamente, si realmente desea que sea 50, cambie1↓⎕SD
a50
.Explicación:
1↓⎕SD,1↓3⍴⍨⍴D←⍞
: lea la cadena y guárdelaD
. Genere un vector que describa cuánto espacio en blanco agregar antes de cada carácter, que es el ancho de la pantalla antes del primer carácter (1↓⎕SD
) y 3 antes de los otros (1↓3⍴⍨⍴D
).⎕DL÷8
: espere 1/8 de segundoP←⍵-{⍵×~×⍺}\×⍵
: en el vector en el argumento de la derecha, reste 1 del elemento distinto de cero a la izquierda y almacene el nuevo vector en P.,/D{⍺,⍨⍵⍴⍕⍬}¨P
: para cada carácter en D, prefije la cantidad de espacios en blanco dada en P.⎕SM∘←1,⍨1,⍨
: se muestra en la pantalla, en la columna más a la izquierda de la fila superior0∨.≠P:∇P
: si hay un elemento distinto de cero en P, repita con P.fuente
PowerShell , 129 bytes
Pruébalo en línea!
Este script no elimina espacios de los argumentos en contraste con el script de Joey .
TIO
no muestra la salida correctamente. Con la consola Powershell, obtienes la línea de marca de desplazamiento.fuente
05AB1E , 42 bytes
Pruébelo en línea (sin dormir). NOTA: No tengo 05AB1E instalado localmente, así que no estoy 100% seguro de si el
\r
truco funciona (en teoría debería funcionar, sin embargo). En TIO,\r
se interpretan como nuevas líneas. Además, el TIO utiliza la versión heredada, porque.e
está deshabilitado en la nueva versión TIO (sin embargo, el programa es el mismo tanto en la versión heredada como en la nueva versión de 05AB1E).Explicación:
Ver este consejo 05AB1E mío (sección Cómo usar el diccionario? ) Para entender por qué
“…¢('\r')“
es"print('\r')"
.fuente
Python, 139 bytes
Tiene que llamar
f('Hello World', 50)
para comenzar.fuente