Ruby Code Golf Technic
概要
Rubyのコードゴルフテクニックについて。
随時更新していこうかと思っています。
私自身ゴルファーではないので、基本的なテクニックが中心となります。
あくまでRubyの話題をメインにして、
言語に依存しないスペースの削除だとか、
数式の変換だとかについては割愛したいと思います。
標準出力
$><<
print よりも 1文字短く書ける
print"hoge" # => hoge
$><<"hoge" # => hoge
引数が可変長配列をとり、それぞれを to_s した結果を出力してくれるため
splat演算子と併用して短く書けるケースがある。
a = [*1..5]
print *a # => 12345
p
メソッド名が短いのだが、
- inspect した値が出力される
- 可変長の引数に配列を指定した場合に改行区切りで出力される
という機能のため、ゴルフでは出番が少なめかも。
a = [*1..5]
b = [*'a'..'e']
c = 123
p *a
# => output is ...
# 1
# 2
# 3
# 4
# 5
p b.join # => "abcde"
p c # => 123
putc
文字コードがわかっている状態での標準出力が必要な場合に有効
$><<65.chr # => A
putc 65 # => A
文字、文字列リテラル
?を利用
1文字の場合、 ?記法を利用することで短くかけます
puts ':' # => :
puts ?: # => :
シンボル
最終的に暗黙の to_s を利用できることが想定されるなら
シンボルを利用することで文字列を短く記述できます。
標準出力時に print や puts が to_s を利用して変換してくれるため、
併せて利用しやすいテクニックです。
puts 'hoge' # => hoge
puts :hoge # => hoge
文字列から任意の位置の文字を取得
String#[] メソッドで文字列中の任意の文字を取得出来ます
puts 'hoge'.split('')[1] # => o
puts 'hoge'.chars[1] # => o
puts 'hoge'[1] # => o
puts 'hoge'.chars[1..-1]*'' # => oge
puts 'hoge'[1..-1] # => oge
グローバル変数,クラス変数,インスタンス変数の文字列展開
#{各種変数名}
を #各種変数名
というように、 {}
を省略できます
class Hoge
def hoge
@a=1 # => インスタンス変数
@@b=2 # => クラス変数
$c=3 # => グローバル変数
d=4 # => 変数(通常の変数は省略できない)
puts "#@a,#@@b,#$c,#d"
end
end
Hoge.new.hoge
# => 1,2,3,#d
文字列配列の連結
普段のプログラミングでは Array#join を利用する場面ですが
join の alias である Array#* を利用することで短くかけます
puts [*1..5].join(':') # => 1:2:3:4:5
puts [*1..5]*':' # => 1:2:3:4:5
文字列の置換
sub!
による置換を [regexp]=
による置換で短くする
str = "0123456789"
str.sub! /[2-4]/,'@'
puts str # => 01@3456789
str = "0123456789"
str[/[2-4]/]='@'
puts str # => 01@3456789
補足
編集リクエストを歓迎致します。
Ruby 2.0 以上共通のテクニックなら特にバージョンに関する記載不要。
1.9,2.0,2.1 など、バージョン依存のテクニックの場合はバージョン情報を記載。
Ruby 1.8 以下については対象外。
以下のフォーマットが基本。
- 見出しレベル2 大分類
- 見出しレベル3 中分類
- 簡単な説明
- 短縮前後と出力内容が分かるサンプルコード
ある程度利用頻度の高そうなもので。
あまりに状況限定のものは挙げ出すときりがないかなと。