ターミナルでMacの絵文字の時計を回す


前書き

ほんとは絵文字をそのままソースに入力してました
QiitaにMacの絵文字を書き込めないことが判明したので文字コードから変換する方法にしました
(変数名にも絵文字を使う頭おかしいソースで、けっこう好きでしたが)

時計を回す

ワンライナー

ruby -e 'clock=[*128336..128359].map{|c|c.chr("UTF-8")};clock=(clock[0..11].zip(clock[12..23])).flatten;10.times{clock.each{|time|print "Time flies like an arrow. #{time}\r";sleep 0.05}};puts'

ターミナルで絵文字を使うと後ろの文字列と重なるので、避けるには後ろに半角スペースを入れる

文字列の書き換え

ターミナル上の文字列を書き換えるには\b\rでカーソルを移動して上書きする
\bは半角1文字分、\rは行頭にカーソルを戻す
改行されたらもう上書きする手段は無い(かも)

時計の絵文字について

時計の絵文字は24個ある
文字コード順に、最初の12個が0分ちょうどで、残りが30分のもの
まとめて使うには並べ替える

clocks_oclock = [*128336..128347].map{|c|c.chr("UTF-8")}
clocks_thirty = [*128348..128359].map{|c|c.chr("UTF-8")}

clocks = (clocks_oclock.zip(clocks_thirty)).flatten

分針は2種類しかないのに回ってるように見える気がするから不思議

ちなみによく見ると30分の表示でも時針は動いてないので、現実とちょっと違う
時針も動いてれば、もう少し滑らかに回ってる感じになったんではないかと

おまけ

月のやつ

ruby -e 'moon=[*127761..127768].map{|c|c.chr("UTF-8")};10.times{moon.each{|m|print "Fly me to the moon. #{m}\r";sleep 0.05}};puts'

月の絵文字は8個で並べ替える必要も無いので楽

記号で回転っぽいやつ

\|/-を順番に表示すると回転してるっぽくなる
(環境によってはバックスラッシュが円記号に見えるかも)

ruby -e '10.times{%q!\|/-!.each_char{|c|print "Please wait... #{c}\r";sleep 0.05}};puts'

->)|(<-を往復させると微生物っぽくてキモい

ruby -e '10.times{"->)|(<-".tap{|s|s<<s[1..-2].reverse}.each_char{|c|print "Please wait... #{c}\r";sleep 0.05}};puts'

参考

Node.js - CLIでプログレスバーみたいのを出力する - Qiita
unicode - RubyでIntegerと文字を相互変換する - Qiita