0

私は、コンテストで候補をランク付けして並べ替えるプログラムを書いています。

# Defining class. Also sorts the array elements in ascending order.
class Dancer
attr_reader :couplenumber
attr_reader :scores
def initialize(couplenumber,scores)
@couplenumber=couplenumber
@scores=scores.sort
end 
end

# Opening file, and sorting into array. Also splits with ",".
results = File.open("danceresult.txt", "r+")
dancescores=[]
results.each do |result|
scores = result.split(',').map(&:to_i) 
couplenumber = scores.shift
dancescores << Dancer.new(couplenumber, scores)
end
dancescores.each do |dancers|
  dancers.scores
  # Prints to screen.
  puts "Couple No. #{dancers.couplenumber} got "\
       "a minimum score of #{dancers.scores[3]} or better. "\
       "Their sum is: #{dancers.scores[0..3].inject(:+)}"
end

Their sum is: #{dancers.scores[0..3].inject(:+)}最小スコアが最も低い人だけを合計したいと思います。したがって、5 人の候補者がいて、そのうちの 2 人が最小スコア 2 を取得し、他の 3 人が最小スコア 4 を取得する場合、「合計部分」は最小スコアが 2 の候補者のみを使用する必要があります。すべてのコードを作り直す必要がありますか? もしそうなら、それを行う最も簡単な方法は何ですか?

4

1 に答える 1

0

まず、最小スコアが何であるかを確立します。

min_score = dancescores.map{|d| d.scores[3]}.min

次に、印刷の前に条件を追加します。

dancescores.each do |dancer|
  # Prints to screen if the couple has the min_score
  if dancer.scores[3] == min_score
    puts "Couple No. #{dancer.couplenumber} got "\
       "a minimum score of #{dancer.scores[3]} or better. "\
       "Their sum is: #{dancer.scores[0..3].inject(:+)}"
  end
end

selectまたは、次のように min_score を持つダンサーのみを処理するために使用できます。

dancescores.select{|d| d[3] == min_score}.each do |dancer|
  puts "Couple No. #{dancer.couplenumber} got "\
     "a minimum score of #{dancer.scores[3]} or better. "\
     "Their sum is: #{dancer.scores[0..3].inject(:+)}"
end
于 2012-12-01T14:45:05.533 に答える