Rubyでコードゴルフする過程で知った7つの書き方

久々に、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

2次元配列の初期化

縦のサイズが決まっている場合に有効そうです。
これはコードゴルフじゃなくても使えそうなイディオムです。

横のサイズも決まっていて、
内側の配列も初期化したいなら、内側のArray.newのあとにmapを続けて書けば行けます。

a = Array.new(2).map{Array.new} #=> [[],[]]

文字列のフォーマット指定(幅)

文字列の%メソッドを使います。
C言語のsprintf()とかとほぼ同様のフォーマットが使えます。
扱えるフォーマットについては、こちらを参照。

その書式で出力するわけではなく、その書式の文字列が返ることに注意です。

a = "%3d" % 1 #=> " 1"(手前に足りない幅分のスペースが入る)

数値の桁数を取得する

文字列化して、長さを取得。

桁数取得に悩んでたら思いつきました。
分かってみれば「知ってるよ」となりますが、盲点だった。

a = 1000.to_s.size #=> 4

Rangeは降順にできない

Rangeは、N…Mの書き方でN>Mにすれば
逆順になるのかと思ってましたが、ならないようです。

降順の連番をループで使いたいときは、
Integerクラスにdownto()というメソッドがあるそうです。

10.downto(1) {|i| #=> 10, 9, 8, ,7, 6, 5, 4, 3, 2, 1と順にアクセスできる }

配列のjoin()

なんだこの奇妙な挙動は…
配列の*メソッドに文字列を渡すと、joinと同じ結果になるようです。

a = [1, 2, 3, 4] a.join("|") #=> "1|2|3|4" a*"|" #=> "1|2|3|4"