C64 代码艺术的 Bash 版本 : 10 PRINT CHR$(205. 5+RND(1)); : 转到 10

标签 bash c64

我拿起一本书 10 PRINT CHR$(205.5+RND(1)); : 转到 10

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

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

这只是从 PETSCII 集合中随机地将字符 205 或 206 重复打印到屏幕上:

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

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

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


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

我目前有:

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

两个问题:

  1. 有什么建议可以使它更简洁吗?
  2. 任何建议 为了更好的输出字符?正斜线和反斜线是 几乎没有那么漂亮,因为他们的观点不一致。 PETSCII 使用的字符是特殊字符,而不是斜杠。我在 ASCII 中没有看到任何可以工作的东西,但也许你可以建议一种从 UTF-8 或其他格式中提取字符的方法?

迄今为止的最佳答案

最短的 bash(40 个字符):

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

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

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

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

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

有趣的是,将它与我能为 C64 BASIC 做的最短(23 个字符)进行比较:

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

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

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

最佳答案

这个怎么样?

# 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

作为单行代码,使用较短的变量名使其更简洁:

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

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

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

或者,如果您想直接包含字符而不是它们的代码:

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

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

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

此行使用的字节数:

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

编辑。使用命令 yes 的有趣方式:

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

它使用 50 个字节:

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

或 46 个字符:

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

关于C64 代码艺术的 Bash 版本 : 10 PRINT CHR$(205. 5+RND(1)); : 转到 10,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13611501/

相关文章:

bash - 为每个图像 ffmpeg 进程调用 shell 脚本(延时摄影)

bash - "echo ' hello';之间的区别ls"vs "echo ' 你好' && ls"?

assembly - 在 Commodore 64 上使用程序集写入磁盘文件

CC65 : Four lines bad, 两行好吗?

assembly - Commodore 64 平滑滚动条位于第 1 行 - 如果在第 0 行设置了中断,则会在屏幕上跳跃

python - 更改标签之间的文本 - shell 脚本

bash - 采购后如何阻止 .bashrc 中的变量在 shell 中可见?

linux - 如何使用 xargs 运行 nohup 子进程池?

coordinate-transformation - 打印出屏幕任意位置的字母

border - 如何在 C64 上显示边框中的 Sprite ?