ルビー、191 116、115 113
ロジックはFraxtils Pythonソリューションから盗まれます。
t=Time.now
d=t.wday
m=[0,t.hour*2+t.min/3e1-18].max
p d<1?100:20*[5,(d-1+[15,m-[8,[7,m].max].min+7].min/15)].min
単体テストでコードをテストする場合は、次の143文字のソリューションが必要です。
class Time
def r
m=[0,hour*2+min/3e1-18].max
d=wday
d<1?100:20*[5,(d-1+[15,m-[8,[7,m].max].min+7].min/15)].min
end
end
p Time.now.r
最短で最も効率的なコードではありませんが、単体テストを使用しています;)
191文字には改行が含まれます(1行にすることもできますが、各改行をに置き換えます;
)。
class Time
def r
i=0
d{|t|i+=t.w}
i/1350.0
end
def d
t=dup
yield t-=1 until t.strftime('%w%T')=='109:00:00'
end
def w
h=hour
wday<1||wday>5||h<9||h>16||h==12&&min>29?0:1
end
end
p Time.now.r
そしてテストコード:
require 'test/unit'
class MyTest < Test::Unit::TestCase
def test_mo
assert_equal( 20, Time.new(2012,8,13,20).r) #monday
end
def test_tue
assert_equal( 40, Time.new(2012,8,14,20).r) #tuesday
end
def test_wed_morning
assert_equal( 40, Time.new(2012,8,15,7).r)
end
def test_wed
assert_equal( 60, Time.new(2012,8,15,20).r)
end
def test_thu
assert_equal( 80, Time.new(2012,8,16,20).r)
end
def test_fri
assert_equal(100, Time.new(2012,8,17,20).r)
end
def test_sat
assert_equal(100, Time.new(2012,8,18,20).r)
end
def test_sun
assert_equal(100, Time.new(2012,8,19,20).r)
end
def test_middle
assert_equal(50, Time.new(2012,8,15,13,15).r)
end
end