18 votos

Bash Versión de C64 Código de Arte: 10 PRINT CHR$(205.5+RND(1)); : GOTO 10

Yo cogí un ejemplar de el libro de 10 PRINT CHR$(205.5+RND(1)); : GOTO 10

Este libro habla sobre el arte que se produce por la sola línea de Commodore 64 BÁSICOS:

10 PRINT CHR$(205.5+RND(1)); : GOTO 10

Esto sólo repetidamente imprime al azar carácter 205 o 206 a la pantalla de la PETSCII conjunto:

No estoy seguro de por qué los usos originales de los personajes 205 y 206 en lugar de la idénticos 109 y 110. También, prefiero añadir un claro al principio. Esto es lo que yo suelo escribir en el C64:

1?CHR$(147)
2?CHR$(109.5+RND(1));:GOTO2
RUN

Usted puede probar todo esto por ti mismo en un emulador, como el uso de Flash o JavaScript:


Decidí que sería divertido escribir un bash la línea de hacer algo similar.

Tengo actualmente:

clear; while :; do [ $(($RANDOM%2)) -eq 0 ] && (printf "\\") || (printf "/"); done;

Dos preguntas:

  1. Alguna sugerencia para hacer esto más conciso?
  2. Cualquier sugerencia para una mejor salida de personaje? El avance y retroceso de slash son no es tan bonito, ya que sus puntos no alineados. El uso de caracteres de PETSCII son caracteres especiales, no barras. Yo no veo nada en ASCII que se puede trabajar así, pero tal vez usted puede sugerir una manera de sacar a un personaje de la codificación UTF-8 o algo más?

Mejores RESPUESTAS hasta Ahora

Más corto para bash (40 caracteres):

yes 'c=(╱ ╲);printf ${c[RANDOM%2]}'|bash

Aquí está un breve uno de zsh (53 caracteres):

c=(╱ ╲);clear;while :;do printf ${c[RANDOM%2+1]};done

Aquí es un alias que me gusta poner en mi .bashrc o .perfil

alias art='c=(╱ ╲);while :;do printf "%s" ${c[RANDOM%2]};done'

Curioso comparar esta a la menor, que puedo hacer para C64 BÁSICO (de 23 caracteres):

1?C_(109.5+R_(1));:G_1

Los subrayados son mayús+H mayús+y mayús+S respectivamente. Yo no puedo pegar el personaje, ya que son específicos para PETSCII. También, el C64 salida se ve más guapa ;)

Usted puede leer acerca de la C64 BÁSICA abreviaturas aquí:

5voto

paultag Puntos 73

Después de mirar algunos UTF cosas:

2571 BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
2572 BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT

(╱ y ╲) parecen ser las mejores.

f="╱╲";while :;do print -n ${f[(RANDOM % 2) + 1]};done

también trabaja en zsh (gracias a Clint en OFTC por darme bits de eso)

4voto

gniourf_gniourf Puntos 9393

¿Qué hay de esto?

# The characters you want to use
chars=( $'\xe2\x95\xb1' $'\xe2\x95\xb2' )
# Precompute the size of the array chars
nchars=${#chars[@]}
# clear screen
clear
# The loop that prints it:
while :; do
    printf -- "${chars[RANDOM%nchars]}"
done

Como un one-liner con acortamiento de los nombres de las variables para que sea más concisa:

c=($'\xe2\x95\xb1' $'\xe2\x95\xb2'); n=${#c[@]}; clear; while :; do printf -- "${c[RANDOM%n]}"; done

Usted puede deshacerse de el bucle si se sabe de antemano cuántas impresión de caracteres (80*24=1920)

c=($'\xe2\x95\xb1' $'\xe2\x95\xb2'); n=${#c[@]}; clear; printf "%s" "${c[RANDOM%n]"{1..1920}"}"

O, si desea incluir los caracteres directamente en lugar de su código:

c=(╱‬ ╲); n=${#c[@]}; clear; while :; do printf "${c[RANDOM%n]}"; done

Finalmente, con el tamaño de la matriz c precalculadas y eliminar espacios innecesarios y comillas (y yo no puede conseguir más corto que el de este):

c=(╱‬ ╲);clear;while :;do printf ${c[RANDOM%2]};done

Número de bytes utilizados para esta línea:

$ wc -c <<< 'c=(╱‬ ╲);clear;while :;do printf ${c[RANDOM%2]};done'
59

Edit. Una manera divertida de usar el comando yes:

clear;yes 'c=(╱ ╲);printf ${c[RANDOM%2]}'|bash

Se utiliza el 50 bytes:

$ wc -c <<< "clear;yes 'c=(╱ ╲);printf \${c[RANDOM%2]}'|bash"
51

o 46 caracteres:

$ wc -m <<< "clear;yes 'c=(╱ ╲);printf \${c[RANDOM%2]}'|bash"
47

3voto

deltaray Puntos 133

Aquí está mi de 39 caracteres de la línea de comandos solución que se me acaba de publicar a @climagic:

grep -ao "[/\\]" /dev/urandom|tr -d \\n

En bash, puede quitar las comillas dobles alrededor de la [/\] coincide con la expresión y la hacen aún más corta que la de C64 solución, pero he incluido una buena medida y de la cruz shell de compatibilidad. Si hay un 1 opción de caracteres con un grep para hacer grep recorte de saltos de línea, entonces usted podría hacer esto de 27 caracteres.

Sé que esto no utilice los caracteres Unicode, así que tal vez no cuenta. Es posible grep para los caracteres Unicode en /dev/urandom, pero que va a tomar mucho tiempo debido a que la secuencia es menos a menudo, y si la tubería de la canalización de comandos probablemente "stick" durante bastante tiempo antes de producir cualquier cosa debido a la línea de almacenamiento en búfer.

2voto

philcolbourn Puntos 1182

Bash es compatible con Unicode, así que no es necesario el uso de caracteres UTF-8 secuencias, tales como $'\xe2\x95\xb1'.

Este es mi más correcta versión: bucles, imprime / o \ basado en un número al azar como hacen los demás.

for((;;x=RANDOM%2+2571)){ printf "\U$x";}
41

Mi anterior mejor fue:

while :;do printf "\U257"$((RANDOM%2+1));done
45

Y este uno de los 'trucos' utilizando embedded Unicode (creo que para la evidencia, la facilidad de mantenimiento y sencillez, este es mi favorito).

Z=╱╲;for((;;)){ printf ${Z:RANDOM&1:1};}
40

Mi anterior mejor fue:

while Z=╱╲;do printf ${Z:RANDOM&1:1};done
41

Y aquí hay algunas más.

while :;do ((RANDOM&1))&&printf "\U2571"||printf "\U2572";done
while printf -v X "\\\U%d" $((2571+RANDOM%2));do printf $X;done
while :;do printf -v X "\\\U%d" $((2571+RANDOM%2));printf $X;done
while printf -v X '\\U%d' $((2571+RANDOM%2));do printf $X;done
c=('\U2571' '\U2572');while :;do printf ${c[RANDOM&1]};done
X="\U257";while :;do printf $X$((RANDOM%2+1));done

Ahora, este se ejecuta hasta que llegamos a un desbordamiento de pila (no otra!) desde bash no parecen apoyar la cola de llamadas eliminación todavía.

f(){ printf "\U257"$((RANDOM%2+1));f;};f
40

Y este es mi intento de implementar una forma cruda de cola-proceso de eliminación. Pero cuando usted ha tenido suficiente y presione ctrl-c, el terminal va a desaparecer.

f(){ printf "\U257"$((RANDOM%2+1));exec bash -c f;};export -f f;f

ACTUALIZACIÓN:

Y un par más.

X=(╱ ╲);echo -e "\b${X[RANDOM&1]"{1..1000}"}" 46
X=("\U2571" "\U2572");echo -e "\b${X[RANDOM&1]"{1..1000}"}" 60
X=(╱ ╲);while :;do echo -n ${X[RANDOM&1]};done 46
Z=╱╲;while :;do echo -n ${Z:RANDOM&1:1};done 44

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: