久々に、CodeIQのコードゴルフをやりました。
数カ月ぶりに素のRubyを触ったので色々と忘れていました。
しかもRubyでコードゴルフは初めてだったので、
Google先生に聞きながら書いているうちに知った、7つのことをメモします。
小ネタが多めです。
Ruby初心者なので、Rubyistにとっては当たり前のことを知りません。 Rubyistの方なら知ってる内容が多かも知れませんが、ご容赦下さい。
なお、手元のRubyのバージョンは、1.9.2です。
1行ずつ代入するのと文字列長は変わらないけどやってみた。
今回は使わなかったけどtmpを使わないswapにも使えるそう。
a,b..と順番に宣言していけば、aの値が必要なbの初期化も出来るかと思いましたが、
それはエラーになりました。少し不便。
a, b = 1, 2 #=> a = 1, b = 2
a, b = 1, a + 2 #=> エラー
[]
を抜かしても、左辺の変数が1つなら、配列として入るようです。
a = 0, 1, 2, 3 #=> [0, 1, 2, 3]
これを応用して、右辺側に代入を混ぜてみました。
M = -1, v = y = 0, 1, 0 #=> M = [-1, 0, 1, 0], v = 0, y = 0
縦のサイズが決まっている場合に有効そうです。
これはコードゴルフじゃなくても使えそうなイディオムです。
横のサイズも決まっていて、
内側の配列も初期化したいなら、内側のArray.newのあとにmapを続けて書けば行けます。
a = Array.new(2).map{Array.new} #=> [[],[]]
文字列の%
メソッドを使います。
C言語のsprintf()とかとほぼ同様のフォーマットが使えます。
扱えるフォーマットについては、こちらを参照。
その書式で出力するわけではなく、その書式の文字列が返ることに注意です。
a = "%3d" % 1 #=> " 1"(手前に足りない幅分のスペースが入る)
文字列化して、長さを取得。
桁数取得に悩んでたら思いつきました。
分かってみれば「知ってるよ」となりますが、盲点だった。
a = 1000.to_s.size #=> 4
Rangeは、N…M
の書き方でN>Mにすれば
逆順になるのかと思ってましたが、ならないようです。
降順の連番をループで使いたいときは、
Integerクラスにdownto()というメソッドがあるそうです。
10.downto(1) {|i| #=> 10, 9, 8, ,7, 6, 5, 4, 3, 2, 1と順にアクセスできる }
なんだこの奇妙な挙動は…
配列の*
メソッドに文字列を渡すと、joinと同じ結果になるようです。
a = [1, 2, 3, 4] a.join("|") #=> "1|2|3|4" a*"|" #=> "1|2|3|4"