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

我拿起了这本书的副本10 PRINT CHR $(205.5 RND(1)); :GOTO 10

> http://www.amazon.com/10-PRINT-CHR-205-5-RND/dp/0262018462

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

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

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

> http://en.wikipedia.org/wiki/PETSCII
> https://vimeo.com/26472518

我不知道为什么原件使用字符205和206而不是相同的109和110.同样,我更喜欢在开头添加一个清晰的。这是我通常输入到C64:

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

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

> http://codeazur.com.br/stuff/fc64_final/
> http://www.kingsquare.nl/jsc64

当将上述代码输入到列出的模拟器中时,您需要意识到这一点

>(是*
>)是(
>是]

我决定写一个bash线做类似的事情会是有趣的。

我目前有:

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

两个问题:

任何建议,使这更简洁?
>任何建议
为了更好的输出字符?前后斜杠是
没有几分美丽,因为他们的分数不排队。 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

下划线分别是移位H,移位N和移位O。我不能粘贴这个角色,因为它们是针对PETSCII的。此外,C64输出看起来更漂亮;)

您可以在这里阅读C64 BASIC缩写:

> http://www.commodore.ca/manuals/c64_programmers_reference/c64-programmers_reference_guide-02-basic_language_vocabulary.pdf

这个怎么样?
# 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

编辑。一个有趣的方式使用命令是:

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

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...