2018年1月6日土曜日

Luaでソート(手抜き)

 Luaでソートしたくなったので作ってみた

 ソート関数

function sort(array, compare)
 for i = 1, #array do
  for j = #array, i + 1, -1 do
   if compare(array[i], array[j]) < 0 then
    array[i], array[j] = array[j], array[i]
   end
  end
 end
end

 サンプル

function color_to_luminance(color)
 return(0.299 * (color.R or 0) + 0.587 * (color.G or 0) + 0.114 * (color.B or 0))
end

do
 local numbers = {
  10, 5, 8, 3,
 }

 print("---")
 for i = 1, #numbers do
  print(numbers[i])
 end

 sort(numbers, function(a, b) return(b - a) end)

 print("---")
 for i = 1, #numbers do
  print(numbers[i])
 end

 local colors = {
  { R = 255, G = 255, B = 255 },
  { R = 255 },
  { G = 255 },
  { B = 255 },
  { },
 }

 print("---")
 for i = 1, #colors do
  print((colors[i].R or 0) .. " " .. (colors[i].G or 0) .. " " .. (colors[i].B or 0))
 end

 sort(colors, function(a, b) return(color_to_luminance(b) - color_to_luminance(a)) end)

 print("---")
 for i = 1, #colors do
  print((colors[i].R or 0) .. " " .. (colors[i].G or 0) .. " " .. (colors[i].B or 0))
 end

end

 結果

10
5
8
3
---
3
5
8
10
---
255 255 255
255 0 0
0 255 0
0 0 255
0 0 0
---
0 0 0
0 0 255
255 0 0
0 255 0
255 255 255


 バブルソートなのであまり早くない。今回は要素数200未満を1回通せば終わるので、たぶん問題ない。
 第2引数に比較関数を渡さないといけない。このあたりは使い方次第なので各自工夫してください。

 Luaはswapが簡単にできたり、デフォルト値をorで簡単に設定できたりするので便利。インクリメントとかデクリメントとか演算代入が使えないのは不便だけど。^で累乗できたりするのは結構便利。math.powとか使わなくても済むので、数式的に見やすい。なれないとちょっと違和感あるけど。
 あとCらいくに戻った時にセミコロンを忘れるのが欠点らしい欠点か。

0 件のコメント:

コメントを投稿