bash c64

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:

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:

  1. ¿Alguna sugerencia para hacer esto más conciso?
  2. ¿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()