技術系ブログ

とにかく小ネタで

【ruby】アルゴリズム

array = [1,2,3,4,5]
max = array[0]
# puts max
array.length.times{|i|
  if max < array[i]
    max = array[i]
    puts max
  end
}
puts "maxは#{max}"

暫定的に最大値を変数(max)に格納して、他の配列データ一つ一つと比較して、
暫定的なデータよりも小さかったら、何もしない。
暫定的なデータよりも大きかったら、そちらを変数(max)に格納する。という方法でやっていきましょう。

指定の数よりも少ない数を集める

ar = [1,2,3,4,5,6,7,10]
min = []

ar.length.times{|i|
  if ar[i] < 4
    min << ar[i]
  end
}
p min

集めたものを降順に並び替える

ar = [1,2,3,4,5,6,7,10]
min = []

ar.length.times{|i|
  if ar[i] < 4
    min << ar[i]
  end
}
p min.sort.reverse

49点以下を2つ以上取ったの人物を洗い出す

csv = CSV.table("sample.csv")
csv.size.times{|i|
  # p csv[i]
  if csv[i][1..5].select{|n| n <= 49}.size >= 2
    puts "落第#{csv[i][0]}"
  end
5

* csv[i][1..5].select{|n| n <= 49}で49点以下をだし、.sizeで要素数を把握して >=2と比較

# 結果
落第Will
落第Alyssa
落第Carter

それぞれの平均点を出してトップとドベを出す

  csv = CSV.table("sample.csv")
    avg = []
    csv.size.times{|i|
      avg << {avg: (csv[i][1..5].sum / 5.00).round(2)}
      csv[i] << avg[-1]
    }
    csv.size.times{|n|
      if csv[:avg].min == csv[n][6]
        puts "#{csv[n][0]},#{csv[n][6]}"
      end
    }
    csv.size.times{|n|
      if csv[:avg].max == csv[n][6]
        puts "#{csv[n][0]},#{csv[n][6]}"
      end
    }
  • まずは(csv[i][1..5].sum / 5.00)でそれぞれの平均点をだし.round(2)で小数点以下2 桁の四捨五入をし、それを予め作っていたavg = []にheader付きで格納。
  • それから、csv[i]avgの最後の要素のavg[-1]を追加する。
    これでcsv[0]なら#<CSV::Row name:"Adam" mathematics:100 science:80 english:60 japanese:50 history:40 avg:66.0>という感じになる。
  • 平均点のドベはとドベを取った人を紐付けるには、行数が同じでになればいいので csv[:avg].min == csv[n][6]で互いに最小数が同じなときは行数も同じなのでこれでOK
  • トップも同じように出せる
# 結果
Carter,21.0
Catherine,93.6