久々にコーディングしてみた。 via http://itpro.nikkeibp.co.jp/article/MAG/20070420/269073/

実際の競技では,C/C++JavaVisual Basic .NETのいずれかを使い,標準入出力でデータをやり取りするプログラムを作ります
との事だが、自分の勉強も兼ねてRubyで書いてみた。
設問1:平方採中法(2006年本選・20点)

class MiddleSquareMethod

  def create( first_value , digit_value , number )

    return_value = Array.new()

    number.times do
      strValue = sprintf( "%0#{digit_value*2}d" , first_value**2 )
      this_value = strValue[ digit_value - (digit_value/2).to_i , digit_value ].to_i
      return_value.push( this_value )
      first_value = this_value
    end
    
    return return_value
  end  
end

require 'test/unit'
require 'middle_square_method'
class MiddleSquareMethodTest< Test::Unit::TestCase
  
  def test_Create()
    
    obj = MiddleSquareMethod.new()
    ret = obj.create( 123 , 4 , 10 )
    
    assert_equal( 151 , ret[0] )  
    assert_equal( 228 , ret[1] )  
    assert_equal( 519 , ret[2] )  
    assert_equal( 2693 , ret[3] )  
    assert_equal( 2522 , ret[4] )  
    assert_equal( 3604 , ret[5] )  
    assert_equal( 9888 , ret[6] )  
    assert_equal( 7725 , ret[7] )  
    assert_equal( 6756 , ret[8] )  
    assert_equal( 6435 , ret[9] )  
    
  end
end

実行結果

Started
.
Finished in 0.015 seconds.

1 tests, 10 assertions, 0 failures, 0 errors

設問2:陸上競技大会(2006年本選・20点)

class TrackMeetRecords
  
  # 1レースの人数
  RACE_OF_MEMBER = 8
  
  def create( records )
    i = 0
    race_no = 1
    max = records.size()
    return_value = Array.new()
    others = Array.new()
    
    while( i < max )
      race = Array.new()

      # レース毎に集計
      while ( i < RACE_OF_MEMBER * race_no )
        race.push( records.shift() )
        i += 1
      end
      
      # レース上位2名を選出
      race = race.sort_by{|member| member[1] }
      return_value.push( view_value( race.shift() ) )
      return_value.push( view_value( race.shift() ) )
      
      # 3位以下の選手
      others += race
      race_no +=1
    end    

    # 3位以下の上位2名を選出
    others = others.sort_by{|member| member[1] }
    return_value.push( view_value( others.shift() ) )
    return_value.push( view_value( others.shift() ) )
    
    return return_value
  end
  
  def view_value( array )
    return sprintf( "%s %5.2f" , array[0] , array[1] )
  end
end

require 'test/unit'
require 'track_meet_records'

class TrackMeetRecordsTest < Test::Unit::TestCase

  def test_create()
    
    obj = TrackMeetRecords.new()
    ret = obj.create([[18,25.46],[16,26.23],[3,23.00],[10,24.79],[11,23.87],[19,23.90],[1,25.11],[5,22.88],
                     [23,23.88],[4,23.46],[7,24.12],[12,22.91],[13,21.99],[14,22.86],[21,23.12],[9,24.09],
                     [17,22.51],[22,23.49],[6,23.02],[20,22.23],[24,21.89],[15,24.14],[8,23.77],[2,23.42]])
    
    p ret
    assert_equal(  "5 22.88" , ret[0] )
    assert_equal(  "3 23.00" , ret[1] )
    assert_equal( "13 21.99" , ret[2] )
    assert_equal( "14 22.86" , ret[3] )
    assert_equal( "24 21.89" , ret[4] )
    assert_equal( "20 22.23" , ret[5] )
    assert_equal( "17 22.51" , ret[6] )
    assert_equal( "12 22.91" , ret[7] )
    
  end
  
end

実行結果

Started
["5 22.88", "3 23.00", "13 21.99", "14 22.86", "24 21.89", "20 22.23", "17 22.51", "12 22.91"]
.
Finished in 0.032 seconds.

1 tests, 8 assertions, 0 failures, 0 errors

エラー処理等を入れていないのは、趣味のプログラミングだから。
たまにこうやって、コーディング脳に戻す事も重要。
陸上競技大会に関しては、全然OOになって無いので、次はリファクタリングに挑戦しようかな。