ルビー、150文字
a=(0..15).map{|i|[0.9-3*i*=0.02,i]}
[9,*a[0,11],*(z=a.reverse)[5,11],11,*z,*a,2,11,6,*[0.2]*9].map{|x,y|c=Time.now
1until Time.now-c>x/3
sleep y||x%3}
これまでのところそれほど短いわけではありませんが、私の意見では、出力はかなり良いので、とにかくこれを投稿すると思いました。他のほとんどのソリューションと同様に、Rubyプロセスの先頭にを付けて特定のコアに固定する必要がある場合がありますtaskset -c $core
。
コードは、一定の時間、眠っ/スピニングの単純な組み合わせである必要があり、それはややポータブルにします。滑らかなグラデーションは、スピン/スリープ時間の比率を変えることで作成されます。
CPUサンプリング周波数を下げると、エッジが少し良くなります。
アルファベットにさらにいくつかの文字を追加することで(AILMNUVW
多少認識できます)、他の単語を書くこともできます。
これらの写真は、次のコードで生成されました。
def gradient num_samples, direction, base = 0.3, increment = 0.02, scale = 1
range = [*0..num_samples]
samples = case direction
when :up then range.reverse
when :down then range
when :updown then range.reverse + range
when :downup then range + range.reverse
end
samples.map{|i|
i *= increment
[base - scale * i, i]
}
end
# letters are defined as a series of pairs of (spin-time, sleep-time)
# with the time in seconds
THIN_A = gradient(15, :updown, 0.2, 0.2/15)
A = gradient(15, :updown)
I = 2,0
L = 1.5,0, [[0.1,0.2]]*9
M = 2,0, gradient(9, :downup), 2,0
N = 1,0, gradient(9, :down), 2,0
U = 1,0, gradient(9, :downup, 0.1, 0.03, 0.1), 1,0
V = 0.5,0, gradient(12, :downup, 0.25, 0.02), 0.5,0
W = 0.5,0, [gradient(12, :downup, 0.25, 0.02)]*2, 0.5,0
[A,I,L,M,N,U,V,W].map{|i|
# add 2 second pause after each letter
i + [0,2]
}.flatten.each_slice(2){|x,y|
# spin, then sleep
c = Time.now
1 until Time.now-c > x
sleep y
}
実装された文字で書くことができる単語は、で見つけることができます
grep -E '^[aijlmnuvw]+$' /usr/share/dict/words