23

10 PRINT CHR$(205.5+RND(1));という本を手に取りました。:後藤10

この本では、Commodore 64 BASIC の単一ラインによって生み出されたアートについて説明します。

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

これは、PETSCII セットからランダムに文字 205 または 206 を画面に繰り返し出力します。

なぜオリジナルが同じ109と110ではなく、205と206の文字を使用しているのかはわかりません。また、最初にクリアを追加することを好みます。これは私が通常 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;

2 つの質問:

  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 の略語については、次を参照してください。

4

8 に答える 8

6

いくつかのUTFのものを見た後:

2571 BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
2572 BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT

(╱ と ╲) が最適と思われます。

f="╱╲";while :;do print -n ${f[(RANDOM % 2) + 1]};done

zshでも動作します(OFTCのClintに感謝します)

于 2012-11-28T18:31:43.493 に答える
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

より簡潔にするために変数名を短くしたワンライナーとして:

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
于 2012-11-28T18:51:25.073 に答える
4

@climagicに投稿したばかりの 39 文字のコマンド ライン ソリューションを次に示します。

grep -ao "[/\\]" /dev/urandom|tr -d \\n

bash では、[/\] 一致式を囲む二重引用符を削除して、C64 ソリューションよりもさらに短くすることができますが、適切な測定とクロスシェル互換性のためにそれらを含めました。grep が改行をトリムするように grep に 1 文字のオプションがあった場合、これを 27 文字にすることができます。

これは Unicode 文字を使用していないことを知っているので、カウントされない可能性があります。/dev/urandom で Unicode 文字を grep することは可能ですが、そのシーケンスがあまり頻繁に表示されないため長い時間がかかります。また、パイプラインをパイプすると、コマンド パイプラインが原因で何かを生成する前にかなりの時間「固着」する可能性があります。行バッファリングへ。

于 2013-05-02T14:03:42.817 に答える
3

Bash は現在 Unicode をサポートしているため、$'\xe2\x95\xb1' などの UTF-8 文字シーケンスを使用する必要はありません。

これは私の最も正しいバージョンです。他の人が行うように、ループし、乱数に基づいて / または \ を出力します。

for((;;x=RANDOM%2+2571)){ printf "\U$x";}
41

私の以前のベストは:

while :;do printf "\U257"$((RANDOM%2+1));done
45

そして、これは埋め込まれた Unicode を使用して「ごまかす」ものです (明白さ、保守性、および単純さのために、これが私のお気に入りだと思います)。

Z=╱╲;for((;;)){ printf ${Z:RANDOM&1:1};}
40

私の以前のベストは:

while Z=╱╲;do printf ${Z:RANDOM&1:1};done
41

そして、ここにいくつかあります。

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

さて、これはスタック オーバーフローが発生するまで実行されます (別のオーバーフローではありません!)。

f(){ printf "\U257"$((RANDOM%2+1));f;};f
40

そして、これはテールプロセスの除去の大まかな形を実装しようとする私の試みです。しかし、十分に食べて ctrl-c を押すと、端末が消えます。

f(){ printf "\U257"$((RANDOM%2+1));exec bash -c f;};export -f f;f

アップデート:

そして、さらにいくつか。

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
于 2013-05-02T14:07:49.337 に答える
2

ネクロポストで申し訳ありませんが、これは 38 文字の bash バージョンです。

yes 'printf \\u$[2571+RANDOM%2]'|bash

forの代わりに使用すると、yesこれが 40 文字に膨らみます。

for((;;)){ printf \\u$[2571+RANDOM%2];}
于 2015-03-03T22:31:09.943 に答える