=begin 600 蟻人間 ◆T6xkBnTXz7B0 2021/04/15(木) 20:54:26.73 ID:IlyHVFTA お題: ここに3つのタンクA,B,Cがある。それぞれの最大容量は20L, 15L, 10Lである。初め、Aには水15Lが入っていて、Bには水10L入っていて、 Cは空っぽだ。重力により、水は2L/sの速さでAからBに流入し、3L/sの速さでBからCに流入する。 このような水の流れとタンク内容量の変化を再現してCがいっぱいになったときのAとBの内容量を求めよ。 601 蟻人間 ◆T6xkBnTXz7B0 2021/04/15(木) 21:05:03.04 ID:PVf346K4 >>600 訂正と追記。 s/重力により/ポンプにより/ 方程式は使ってはならない。必ずシミュレーションなどで再現すること。 =end class Tank attr_reader :water @max = 0 @outSpeef = 0 def initialize(m,w,s) @max = m @water = w @outSpeef = s self end def in( w ) @water = [ @max, @water + w ].min self end def out out = [ @outSpeef, @water ].min @water -= out out end def >>(exp) exp.in( self.out ) end end $scale = 6 # 2.lcm( 3 ) tankA = Tank.new( 20 * $scale, 15 * $scale, 2 ) tankB = Tank.new( 15 * $scale, 10 * $scale, 3 ) tankC = Tank.new( 10 * $scale, 0 * $scale, 0 ) tanks = [ tankA, tankB, tankC ] def printTank( sec, tanks ) unless sec puts " sec A B C" return end puts " %6.3f, %s" % [ sec.fdiv($scale), tanks.map{|x| ' %5.2f' % [x.water.fdiv($scale)] }.join(', ') ] end sec = 0 printTank( nil, nil ) loop do printTank( sec, tanks ) break unless tankC.water != 10 * $scale # break unless tankA.water != 0 || tankB.water != 0 tankA >> tankB >> tankC sec += 1 end printTank( nil, nil ) puts puts "sec = #{Rational(sec,$scale)} ~= #{sec.fdiv($scale)}" puts "Tank A = #{Rational(tankA.water,$scale)} ~= #{tankA.water.fdiv($scale)}" puts "Tank B = #{Rational(tankB.water,$scale)} ~= #{tankB.water.fdiv($scale)}" puts "Tank C = #{Rational(tankC.water,$scale)} ~= #{tankC.water.fdiv($scale)}"
Standard input is empty
sec A B C 0.000, 15.00, 10.00, 0.00 0.167, 14.67, 9.83, 0.50 0.333, 14.33, 9.67, 1.00 0.500, 14.00, 9.50, 1.50 0.667, 13.67, 9.33, 2.00 0.833, 13.33, 9.17, 2.50 1.000, 13.00, 9.00, 3.00 1.167, 12.67, 8.83, 3.50 1.333, 12.33, 8.67, 4.00 1.500, 12.00, 8.50, 4.50 1.667, 11.67, 8.33, 5.00 1.833, 11.33, 8.17, 5.50 2.000, 11.00, 8.00, 6.00 2.167, 10.67, 7.83, 6.50 2.333, 10.33, 7.67, 7.00 2.500, 10.00, 7.50, 7.50 2.667, 9.67, 7.33, 8.00 2.833, 9.33, 7.17, 8.50 3.000, 9.00, 7.00, 9.00 3.167, 8.67, 6.83, 9.50 3.333, 8.33, 6.67, 10.00 sec A B C sec = 10/3 ~= 3.3333333333333335 Tank A = 25/3 ~= 8.333333333333334 Tank B = 20/3 ~= 6.666666666666667 Tank C = 10/1 ~= 10.0