B64版本的C64代码艺术:10 PRINT CHR $(205.5 + RND(1)); :GOTO 10

spe*_*pex 20 bash c64

我拿了一本书10 PRINT CHR $(205.5 + RND(1)); :GOTO 10

本书讨论了Commodore 64 BASIC单行产生的艺术:

10 PRINT CHR$(205.5+RND(1)); : GOTO 10
Run Code Online (Sandbox Code Playgroud)

这只是从PETSCII集中反复打印字符205或206到屏幕:

我不确定为什么原版使用字符205和206而不是相同的109和110.另外,我更喜欢在开头添加一个清晰.这就是我通常在C64中输入的内容:

1?CHR$(147)
2?CHR$(109.5+RND(1));:GOTO2
RUN
Run Code Online (Sandbox Code Playgroud)

您可以在模拟器中尝试这一切,例如使用Flash或JavaScript的模拟器:


我觉得写一个bash行来做类似的事很有趣.

我目前有:

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

两个问题:

  1. 有什么建议让这个更简洁?
  2. 有关更好的输出特性的任何建议吗?前锋和后退的斜线并不是那么漂亮,因为他们的分数不对齐.PETSCII使用的字符是特殊字符,而不是斜杠.我没有看到任何可以正常工作的ASCII,但也许你可以建议一种方法从UTF-8或其他东西中提取一个角色?

迄今为止最好的答案

bash最短(40个字符):

yes 'c=(? ?);printf ${c[RANDOM%2]}'|bash
Run Code Online (Sandbox Code Playgroud)

这是一个简短的zsh(53个字符):

c=(? ?);clear;while :;do printf ${c[RANDOM%2+1]};done
Run Code Online (Sandbox Code Playgroud)

这是我喜欢放在.bashrc或.profile中的别名

alias art='c=(? ?);while :;do printf "%s" ${c[RANDOM%2]};done'
Run Code Online (Sandbox Code Playgroud)

有趣的是将此与我可以为C64 BASIC(23个字符)做的最短时间进行比较:

1?C_(109.5+R_(1));:G_1
Run Code Online (Sandbox Code Playgroud)

下划线分别是shift + H,shift + N和shift + O. 我不能在这里粘贴字符,因为它们特定于PETSCII.此外,C64输出看起来更漂亮;)

您可以在此处阅读有关C64 BASIC缩写的信息:

gni*_*urf 6

这个怎么样?

# 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
Run Code Online (Sandbox Code Playgroud)

作为具有较短变量名称的单行,使其更简洁:

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

如果您事先知道要打印多少个字符(这里80*24 = 1920),您可以摆脱循环

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

或者,如果要直接包含字符而不是代码:

c=(?? ?); n=${#c[@]}; clear; while :; do printf "${c[RANDOM%n]}"; done
Run Code Online (Sandbox Code Playgroud)

最后,c预先计算数组的大小并删除不必要的空格和引号(我不能比这更短):

c=(?? ?);clear;while :;do printf ${c[RANDOM%2]};done
Run Code Online (Sandbox Code Playgroud)

此行使用的字节数:

$ wc -c <<< 'c=(?? ?);clear;while :;do printf ${c[RANDOM%2]};done'
59
Run Code Online (Sandbox Code Playgroud)

编辑.一个有趣的方式使用命令yes:

clear;yes 'c=(? ?);printf ${c[RANDOM%2]}'|bash
Run Code Online (Sandbox Code Playgroud)

它使用50个字节:

$ wc -c <<< "clear;yes 'c=(? ?);printf \${c[RANDOM%2]}'|bash"
51
Run Code Online (Sandbox Code Playgroud)

或46个字符:

$ wc -m <<< "clear;yes 'c=(? ?);printf \${c[RANDOM%2]}'|bash"
47
Run Code Online (Sandbox Code Playgroud)


pau*_*tag 5

看了一些UTF后的东西:

2571 BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
2572 BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
Run Code Online (Sandbox Code Playgroud)

(╱和╲)似乎最好.

f="??";while :;do print -n ${f[(RANDOM % 2) + 1]};done
Run Code Online (Sandbox Code Playgroud)

也可以在zsh中工作(感谢Clint on OFTC给我的一些东西)