Ruby言語とPython言語は、コーディングした見た目が誰が書いても分かりやすいと聞くが、いままでそれは、言語的に遊びがないからだと思っていた。
確かにインデントなどの扱いでエラーになる言語なので、単純にインデントだけの話だと思っていたが、今回のプログラムを書いて気がついたのだが、ものの10分程度で完了できた。
基本的にはPHPプログラムのローカライズをしただけなのだが、関数や変数、その他の処理など、そのまま移していくことでほとんどエラーも出ずに完了できた。
そして、コーディングもほぼブレがなく、誰が書いても大体同じという事なのだろう。
C言語やshellなどと違いこんなに早く終わったので、拍子抜けではあるが、とりあえず今回はこんな感じ。
ソースコード
def midPoint(nums)
return ((nums.count / 2) + 0.5).floor
end
def setMerge(arr1 , arr2)
arr = []
while arr1.count > 0 || arr2.count > 0 do
if arr1.count == 0 then
arr.push(arr2.shift)
elsif arr2.count == 0 then
arr.push(arr1.shift)
elsif arr1[0] > arr2[0] then
arr.push(arr2.shift)
else
arr.push(arr1.shift)
end
end
return arr
end
def mergeSort(numbers)
if numbers.count == 0 then
numbers = []
elsif numbers.count == 1 then
numbers = numbers
elsif numbers.count == 2 then
if numbers[0] > numbers[1] then
tmp = numbers[0]
numbers[0] = numbers[1]
numbers[1] = tmp
end
else
midNum = midPoint(numbers)
arr1 = numbers.slice(0,midNum+1)
arr2 = numbers.slice(midNum+1,numbers.count)
arr1 = mergeSort(arr1)
arr2 = mergeSort(arr2)
numbers = setMerge(arr1 , arr2)
end
return numbers
end
numbers = [10,2,12,7,16,8,13]
print mergeSort(numbers) ,"\n"
実行
$ ruby mergeSort.rb
[2, 7, 8, 10, 12, 13, 16]
解説
rubyの小数点切り捨て、四捨五入
return ((nums.count / 2) + 0.5).floor
切り捨ては@.floorで行える。
四捨五入は、0.5を足した後、@.floorすればいい
配列の要素数(length)
arr.count
ruby言語は、javascriptのprototypeのような扱いで行えるのが非常に分かりやすい。
配列の追加(push)
arr.pusn(変数 or 配列)
配列の先頭を抜き出す(破壊的処理:shift)
hoge = arr.shift
hogeに先頭の値が入り、arrは先頭を抜かした残りの配列になる(要素数が一つ減る)
配列の特定部分の抜き出し(slice)
arr.slice(start-num , count-num)
startは配列の要素番号(0スタート)で、countは○文字分になる。
今回のプログラム内では、中間値が要素数で取得しているので、+1をすることで、対応している。
関連記事
たくさんのプログラム言語でアルゴリズム学習
0 件のコメント:
コメントを投稿