Plug it back in tonight or this weekend
Python 2 - 164
from datetime import*
d,t=input().split('T')
y,m,d=map(int,d.split('-'))
t=int(t[:2])
print'OMOfinfd'[(1+((10<t<17)==(4<m<11)))*(date(y,m,d).weekday()<5<6<t<19)::3]
If needed, below is a explanation of the logic in the final line:
The final line prints a slice of 'OMOfinfd'
depending on the evaluation of its conditionals.
First, evaluate the operation
1+((10<t<17)==(4<m<11))
.If the XNOR between the conditions
10<t<17
and4<m<11
isFalse
, this will evaluate to1+False => 1+0 => 1
. Otherwise, the operation will evaluate to1+True => 1+1 => 2
.Finally, multiply that result of the above operation by whether the day is a weekday and whether the time is between 6am-7pm.
If this is
False
, either the day is a weekend or the time is between 7pm-6am, and the result will be(1|2)*0 => 0
. Otherwise the result will be(1|2)*1 => 1|2
.
A result of 0
will print Off
, 1
will print Mid
, and 2
will print On
.
Ruby - 135
Abuses the Time module. Input by command line argument.
d=Time.new(*$*[0].scan(/\d+/)[0..3])
o,m,f=%w{On Mid Off}
o,m=m,o if (d.mon-5)%10<6
p d.wday%6<1||(12>h=(d.hour+5)%24)?f:15<h&&h<22?m:o
Edit: Thanks w0lf for Time which helped shorten and solve a bug.
C# - 240 220 chars
string x(string s){var d=DateTime.Parse((s+":00:00").Substring(0,19));int h=d.Hour,i=(int)d.DayOfWeek,x=d.Month;string o="off",m="mid",f="on";return i==6|i==0?o:x>=5&x<11?h>18|h<7?o:h>10&h<17?f:m:h>18|h<7?o:h>10&h<17?m:f;}
Nothing special. Straight forward coding.
Thanks to w0lf :)