久々にコーディングしてみた。 via http://itpro.nikkeibp.co.jp/article/MAG/20070420/269073/
実際の競技では,C/C++,Java,Visual 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になって無いので、次はリファクタリングに挑戦しようかな。