Menu
Coddy logo textTech

復習 - スポーツリーグ

CoddyのRubyジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 31/57。

challenge icon

チャレンジ

難しい

小さなリーグ表を作成してください。Team は Comparable をインクルードします。チームのポイントが多い(勝利で3、引き分けで1)ほど上位となり、次に得失点差が大きいチーム、さらにアルファベット順で名前が先のチームが上位となります。record(scored, conceded) はチームを更新し、to_s は Reds 7 pts, +3 を返します。League は Enumerable をインクルードします。each はチームを順に返し、play(line) は Reds 2-1 Blues のような結果を両チームに記録します(名前が初めて登場したときにチームを作成します)。table は sort を使って、チームを上位から下位の順に返します。leader(max から得られる最上位のチーム)を持つ Rankable モジュールは League にインクルードされます。

用意されているコードは、すべての入力行を play に渡し、その後、順位付きの表(1. Reds 7 pts, +3)、首位のチーム、およびいずれの試合でも勝利していないチームを、select を使って見つけて表示します。

コードは rankable.rb、team.rb、league.rb に記述します。main.rb には用意された入出力コードが含まれており、編集できません。

自分で試してみよう

require_relative 'rankable'
require_relative 'team'
require_relative 'league'

# 提供された入出力コード: そのままにしておく
input = []
while (line = gets)
  input << line.chomp
end
league = League.new
input.each { |line| league.play(line) }
league.table.each_with_index { |t, i| puts "#{i + 1}. #{t}" }
puts "leader: #{league.leader&.name}"
winless = league.select { |t| t.wins.zero? }.map(&:name).sort
puts "no wins: #{winless.empty? ? "none" : winless.join(", ")}"

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Rubyオンラインコンパイラ