相変わらず人気のRubyですが、未だにどうもしっくり馴染めない下駄なんですが、書き込む行数がまだまだ少ないからでしょうね。
フレームワークなどを触ってみると意外と好きになるかもね〜。
ところで、他の言語よりRubyの優位点があるところって、どんなところなんでしょう?
この辺が明確にわかると、面白くなるかもしれないな〜。
ソース
def bucketSort(numbers)
bucket = []
max = 0
(0).step(numbers.count-1 , 1){ |i|
if bucket[numbers[i]] == nil then
bucket[numbers[i]] = 0
end
bucket[numbers[i]] += 1
if max < numbers[i] then
max = numbers[i]
end
}
arr = []
(0).step(max , 1){ |i|
if bucket[i] != nil then
(0).step(bucket[i]-1 , 1){ |j|
arr.push(i)
}
end
}
return arr
end
numbers = [1,1,3,2,4,6,1,2,4,6]
nums = bucketSort(numbers)
print nums,"\n"
実行
$ ruby bucketSort.rb
[1, 1, 1, 2, 2, 3, 4, 4, 6, 6]
解説
配列要素の存在確認
phpで言うところの「isset」、javascriptでは「typeof」のような確認は、Rubyでは、is_keyやis_valueでできるんですが、配列の要素に関しては、「nil」で確認するのが良さそうです。
ちなみに、配列の定義において、以下のような挙動を知っておくと、エラーを回避しやすいかもしれませんね。
arr = []
arr[1] = 10
print arr
> [nil , 10]
Rubyのfor文
今一度、Rubyのfor文は存在しないので、下記のようなstep文を理解しておきましょう。
(開始数).step(終了数 , step数){ | 代入する変数 |
...
}
慣れると便利なんですが、他の言語にない処理なので、慣れるまでが少ししんどいかも。
繰り返し文のcontinue
Rubyは多言語でいうところの「continue」の代わりに「next」を使うので、覚えておきましょう。
(0).step(10,1){ |i|
if i < 5 then
next
end
print i
}
> 5
> 6
> 7
> 8
> 9
> 10
関連リンク
wikipedia
たくさんのプログラム言語でアルゴリズム学習