Versión de Bash de Arte en Código C64: 10 PRINT CHR $(205.5+RND(1));:GOTO 10
(6)
¿Qué tal 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 una sola línea con nombres de variables más cortos para hacerlo más conciso:
c=($''/xe2/x95/xb1'' $''/xe2/x95/xb2''); n=${#c[@]}; clear; while :; do printf -- "${c[RANDOM%n]}"; done
Puede deshacerse del bucle si sabe de antemano cuántos caracteres imprimir (aquí 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
precalculado y eliminando espacios y comillas innecesarias (y no puedo ser más corto que esto):
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
Editar. Una forma divertida usando el comando yes
:
clear;yes ''c=(╱ ╲);printf ${c[RANDOM%2]}''|bash
Utiliza 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
Recogí una copia del libro 10 PRINT CHR $ (205.5 + RND (1)); : GOTO 10
Este libro analiza el arte producido por la línea única de Commodore 64 BASIC:
10 PRINT CHR$(205.5+RND(1)); : GOTO 10
Esto simplemente imprime repetidamente el carácter 205 o 206 en la pantalla desde el conjunto PETSCII:
No estoy seguro de por qué el original usa los caracteres 205 y 206 en lugar de los idénticos 109 y 110. Además, prefiero agregar una clara al principio. Esto es lo que normalmente escribo en el C64:
1?CHR$(147)
2?CHR$(109.5+RND(1));:GOTO2
RUN
Puedes probar todo esto por ti mismo en un emulador, como este con Flash o JavaScript:
- http://codeazur.com.br/stuff/fc64_final/
http://www.kingsquare.nl/jsc64
Cuando ingrese el código anterior en los emuladores enumerados, deberá darse cuenta de que
- ( es *
- ) es (
- + es]
Decidí que sería divertido escribir una línea de bash para hacer algo similar.
Actualmente tengo:
clear; while :; do [ $(($RANDOM%2)) -eq 0 ] && (printf "//") || (printf "/"); done;
Dos preguntas:
- ¿Alguna sugerencia para hacer esto más conciso?
- ¿Alguna sugerencia para un mejor personaje de salida? La barra inclinada hacia adelante y hacia atrás no es tan hermosa ya que sus puntos no se alinean. Los caracteres utilizados de PETSCII son caracteres especiales, no barras. No vi nada en ASCII que pudiera funcionar igual de bien, pero ¿quizás puedas sugerir una forma de obtener un personaje de UTF-8 o algo más?
Las mejores respuestas hasta ahora
El más corto para bash (40 caracteres):
yes ''c=(╱ ╲);printf ${c[RANDOM%2]}''|bash
Aquí hay una breve para zsh (53 caracteres):
c=(╱ ╲);clear;while :;do printf ${c[RANDOM%2+1]};done
Aquí hay un alias que me gusta poner en mi .bashrc o .profile
alias art=''c=(╱ ╲);while :;do printf "%s" ${c[RANDOM%2]};done''
Es divertido comparar esto con lo más corto que puedo hacer con C64 BASIC (23 caracteres):
1?C_(109.5+R_(1));:G_1
Los guiones bajos son shift + H, shift + N, y shift + O respectivamente. No puedo pegar el carácter aquí ya que son específicos de PETSCII. Además, la salida de C64 se ve más bonita;)
Puedes leer sobre las abreviaturas de C64 BASIC aquí:
Aquí está mi solución de línea de comandos de 39 caracteres que acabo de publicar en @climagic :
grep -ao "[///]" /dev/urandom|tr -d //n
En bash, puede eliminar las comillas dobles alrededor de la expresión de coincidencia [/ /] y hacerla incluso más corta que la solución C64, pero las he incluido para una buena medida y compatibilidad entre shell. Si hubiera una opción de 1 carácter en grep para hacer que grep recortara las nuevas líneas, entonces podría hacer este 27 caracteres.
Sé que esto no usa los caracteres Unicode así que quizás no cuente. Es posible grep para los caracteres Unicode en / dev / urandom, pero eso tomará mucho tiempo porque esa secuencia aparece con menos frecuencia y si la canalizas, la línea de comandos probablemente se "pegará" durante bastante tiempo antes de que se produzca algo debido a la línea de búfer.
Bash es compatible con Unicode ahora, por lo que no necesitamos usar secuencias de caracteres UTF-8 como $ ''/ xe2 / x95 / xb1''.
Esta es mi versión más correcta : realiza un bucle, imprime uno o otro en función de un número aleatorio, como lo hacen otros.
for((;;x=RANDOM%2+2571)){ printf "/U$x";}
41
Mi mejor anterior fue:
while :;do printf "/U257"$((RANDOM%2+1));done
45
Y este ''engaña'' usando Unicode incrustado (creo que por mi obviedad, facilidad de mantenimiento y simplicidad, este es mi favorito).
Z=╱╲;for((;;)){ printf ${Z:RANDOM&1:1};}
40
Mi mejor anterior fue:
while Z=╱╲;do printf ${Z:RANDOM&1:1};done
41
Y aquí hay algunos 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 obtenemos un desbordamiento de pila (¡no otro!), Ya que bash no parece soportar la eliminación de llamadas de cola todavía.
f(){ printf "/U257"$((RANDOM%2+1));f;};f
40
Y este es mi intento de implementar una forma burda de eliminación del proceso de cola. Pero cuando hayas tenido suficiente y presionas ctrl-c, tu terminal desaparecerá.
f(){ printf "/U257"$((RANDOM%2+1));exec bash -c f;};export -f f;f
ACTUALIZAR:
Y algunos 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
Después de mirar algunas cosas de UTF:
2571 BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
2572 BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
(╱ y ╲) parecen mejores.
f="╱╲";while :;do print -n ${f[(RANDOM % 2) + 1]};done
también funciona en zsh (gracias a Clint en OFTC por darme un poco de eso)
Perdón por la necropostización, pero aquí está la versión de bash en 38 caracteres.
yes ''printf //u$[2571+RANDOM%2]''|bash
usar for
lugar de yes
infla esto a 40 caracteres:
for((;;)){ printf //u$[2571+RANDOM%2];}
#!/usr/bin/python3
import random
import sys
while True:
if random.randrange(2)==1:sys.stdout.write("/u2571")
else:sys.stdout.write("/u2572")
sys.stdout.flush()