इसे आज रात या इस सप्ताहांत में वापस प्लग करें


20

यह मेरा पहला कोड गोल्फ है तो कृपया मुझे बताएं कि क्या यह बहुत व्यापक है या अगर मैं एक अच्छी पहेली के लिए कोई जानकारी याद कर रहा हूं!

चुनौती

ओंटारियो और संभवतः दुनिया के अन्य क्षेत्रों में, बिजली का उपयोग टाइम-ऑफ-यूज (टीओयू) मूल्य निर्धारण के साथ किया जाता है , जो कि बिजली का उपयोग करने पर प्रति किलोवाट-घंटे की लागत के अनुसार बदलता रहता है।

दिनांक और समय को देखते हुए, मैं जानना चाहता हूं कि क्या मैं ऑन-पीक (रेड), मिड-पीक (येलो), या ऑफ-पीक (ग्रीन) समयावधि में हूं।

इनपुट

मान लें कि इनपुट समय की न्यूनतम परिशुद्धता के साथ एक स्वीकार्य टाइमज़ोन-कम आईएसओ 8601 तिथि-समय प्रारूप में प्रदान किया गया है: YYYY-MM-DDThh[:mm[:ss]](टी शाब्दिक है)।

उदाहरण

  • 2014-09-01T14
  • 2014-09-01T17: 30
  • 2014-09-01T17: 30: 02

उत्पादन

उत्पादन एक स्ट्रिंग होना चाहिए On, Midया Off

नियम

  • सबसे छोटा कोड जीत
  • इस चुनौती के प्रयोजनों के लिए वैधानिक छुट्टियों पर ध्यान न दें
  • जानकारी इस पोस्ट में पाया मान लें। समय के उपयोग के मूल्य निर्धारण की वास्तविक नियम ऊर्जा ओंटारियो मंत्रालय द्वारा भविष्य में बदल सकता है।

जानकारी

ग्रीष्मकालीन काम करने के दिन (31 अक्टूबर करने के लिए 1st मई)

गर्मियों काम करने के दिन के लिए समय-से-प्रयोग घड़ी

  • ऑफ पीक: 19h00 - 07h00
  • मिड-शिखर: 07h00 - 11h00 और 17h00 - 19h00
  • पर पीक: 11h00 - 17h00

शीतकालीन काम करने के दिन (30 अप्रैल करने के लिए 1st नवंबर)

सर्दियों काम करने के दिन के लिए समय-से-प्रयोग घड़ी

  • ऑफ पीक: 19h00 - 07h00
  • मिड-शिखर: 11h00 - 17h00
  • पर पीक: 07h00 - 11h00 और 17h00 - 19h00

सप्ताहांत

समय का उपयोग सप्ताहांत पर घड़ी

  • ऑफ पीक: सभी दिन

क्या आपको यकीन है सर्दियों काम करने के दिन मध्य शिखर की जरूरत नहीं है / पर पीक बदली?
जॉन ड्वोरक

3
@JanDvorak, सर्दियों में लोग रोशनी और सुबह और शाम में हीटिंग का उपयोग करें; गर्मियों में वे दोपहर के समय एयर-कॉन का उपयोग करते हैं।
पीटर टेलर

4
यह codegolf.stackexchange.com/q/7008/194 का बॉर्डरलाइन-डुप्लिकेट है (एक डेटाटाइम पार्स करें और यह कार्य दिवस है या नहीं इसके आधार पर एक सरल गणना करें)। मुझे लगता है कि मौसम की निर्भरता अभी काफी अलग है, लेकिन अन्य असहमत हो सकते हैं।
पीटर टेलर

@PeterTaylor नियमों से जुड़ा हुआ प्रश्न में से यहाँ बहुत सरल लग रहे हैं। उदाहरण के लिए, इसे लीप वर्ष को संभालने की आवश्यकता नहीं है।
जॉन ड्वोरक

3
सामान्य दिनांक स्वरूप होना चाहिए YYYY-MM-DDThh[:mm[:ss]]के बाद से सेकंड केवल तभी मिनट लागू की गई हैं लागू किया जा सकता?
क्रंचर

जवाबों:


3

माणिक - 147 144 143 141 137 135

x=->s{y,m,d,h=s.scan(/\d+/).map &:to_i
g=Time.new(y,m,d).wday%6<1?0:[0..11,4..9].count{|r|r===h-7}
%W{Off Mid On}[m<5||m>10?(3-g)%3:g]}

यह एक समारोह जो एक पैरामीटर के रूप में एक स्ट्रिंग लेता है और एक स्ट्रिंग रिटर्न प्रतिनिधित्व करता है।

यहाँ कुछ परीक्षण मामलों के साथ एक ऑनलाइन डेमो है: http://ideone.com/wyIydw


8

पायथन 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]

यदि आवश्यक हो, नीचे अंतिम पंक्ति में तर्क की एक व्याख्या है:

अंतिम पंक्ति का एक टुकड़ा प्रिंट 'OMOfinfd'इसकी सशर्त, के मूल्यांकन के आधार पर।

  • सबसे पहले, ऑपरेशन का मूल्यांकन करें 1+((10<t<17)==(4<m<11))

    शर्तों के बीच XNOR हैं 10<t<17और 4<m<11है False, इस के लिए मूल्यांकन करेंगे 1+False => 1+0 => 1। अन्यथा, ऑपरेशन का मूल्यांकन करेगा 1+True => 1+1 => 2

  • अंत में, चाहे दिन एक काम करने के दिन है द्वारा और क्या समय 06:00-7:00 के बीच है ऊपर आपरेशन के गुणा कि परिणाम।

    इस है False, या तो दिन सप्ताहांत है या समय 19:00-6:00 के बीच है, और परिणाम होगा (1|2)*0 => 0। अन्यथा परिणाम होगा (1|2)*1 => 1|2

का एक परिणाम 0प्रिंट होगा Off, 1प्रिंट होगा Mid, और 2प्रिंट होगा On


क्या गोल्फ संस्करण वास्तव में लंबा नहीं है क्योंकि आप अर्धविराम का उपयोग करते हैं? या नई-पंक्तियों में गिने जाते हैं?
बीटा डिके

नई पंक्तियां आम तौर पर गिने जाते हैं। नोटपैड ++ (जहाँ मैं आम तौर पर मेरी गिनती मिल) में ungolfed संस्करण 4bytes अब 168 पर है
BeetDemGuise

3
@BeetDemGuise संपादित करें → EOL रूपांतरण → यूनिक्स / OSX स्वरूप।
मतभेद

5

सी # - 240 220 वर्ण

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;}

कुछ खास नहीं। सीधे आगे कोडिंग।

w0lf के लिए धन्यवाद :)


1
मुझे लगता है कि आप को छोटा कर सकते s.Length==13?s+":00:00":s.Length==16?s+":00":sकरने के लिए(s+":00:00").Substring(0,19)
क्रिस्टियन Lupascu

5

रूबी - 135

हनन समय मॉड्यूल। कमांड लाइन तर्क से इनपुट।

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

संपादित करें: समय के लिए धन्यवाद w0lf जो छोटा और एक बग का समाधान में मदद की।


आपका कार्यक्रम गलत है। इनपुट के लिए 2014-09-01T17:30यह सही ढंग से आउटपुट करता है "Mid", लेकिन इसके लिए 2014-09-01T17आउटपुट "Off"
क्रिश्चियन लुपस्कु

3

ग्रूवी - 621 534 524 491 वर्ण

कुछ और गोल्फिंग करते हैं, लेकिन जब जोडा-टाइम का लाभ उठाते हैं तो बहुत आसान है

@Grab(group='joda-time',module='joda-time',version='2.3')
f={p,a->org.joda.time.format.DateTimeFormat.forPattern(p).parseDateTime a}
g={p,a->def x=null;try{x=f p,a}catch(Exception e){}}
a=args[0]
d=["",":mm",":mm:ss"].collect{g "yyyy-MM-dd'T'HH$it",a}.find{it}
r="Off"
m="Mid"
j={d,a,b->d.hourOfDay>a&&d.hourOfDay<b}
k={j(it,6,11)||(j(it,16,19))}
if(d.dayOfWeek<6){x=d.monthOfYear;if(x>4&&x<12){if(j(d,10,17))r="On";if(k(d))r=m}else if(x<5||x>10){if(j(d,10,17))r=m;if(k(d))r="On"}}
println r

नमूना चलता है:

bash-3.2$ ./run.peak.sh 
groovy Peak.groovy 2014-08-26T19
Off
groovy Peak.groovy 2014-08-26T07:00
Mid
groovy Peak.groovy 2014-08-26T18:00:00
Mid
groovy Peak.groovy 2014-08-26T12:30:30
On
groovy Peak.groovy 2014-11-01T00
Off
groovy Peak.groovy 2014-02-05T11:11:11
Mid
groovy Peak.groovy 2014-01-05T08:08
Off
groovy Peak.groovy 2014-12-18T18:59:59
On
groovy Peak.groovy 2014-08-31T14
Off

Ungolfed:

@Grab(group='joda-time',module='joda-time',version='2.3')

f = { p,a -> org.joda.time.format.DateTimeFormat.forPattern(p).parseDateTime a}
g = { p,a -> def x=null; try{x=f p,a} catch(Exception e) {} }
a=args[0]

d = ["",":mm",":mm:ss"].collect{g "yyyy-MM-dd'T'HH$it",a}.find{it}
r = "Off"
m = "Mid"

j = {d,a,b -> d.hourOfDay > a && d.hourOfDay < b}
k = { j(it,6,11) || (j(it,16,19)) }

if (d.dayOfWeek<6) {
    x = d.monthOfYear;
    if ( x>4 && x<12 ) {
        if (j(d,10,17)) r="On";
        if (k(d)) r=m
    } else if (x<5||x>10) {
        if (j(d,10,17)) r=m;
        if (k(d)) r="On"
    }
}
println r

2
Java 8 के बाद से, यह भी है java.time.*, जो कि Joda Time से मिलता-जुलता है, लेकिन JRE का हिस्सा है। शायद यह कोड को थोड़ा छोटा कर सकता है।
ntoskrnl

पुन: जावा 8. उत्कृष्ट बिंदु
माइकल ईस्टर

आपके तीसरे-से-अंतिम उदाहरण में '2014-01-05T08:08', 5 जनवरी, 2014 रविवार है। इस प्रकार, यह होना चाहिए'Off'
BeetDemGuise

पुन: ५ जनवरी २०१४। वर्तमान कोड सही है, लेकिन आउटपुट रन गलत है। ठीक कर देंगे।
माइकल ईस्टर

कोशिश की java.time.*। बुरी तरह असफल रहा। पार्सर बहुत सख्त है। उपयोग DateParsernashorn (भी JRE8 का हिस्सा) जो उदार, और अपमानजनक हैकिंग का एक सा, यहां तक कि उदार मिनट और सेकंड को छोड़ करने के लिए पर्याप्त के साथ से।
मार्क जेरोनिमस

2

आर, 243 204 वर्ण

b=strptime(scan(,""),"%Y-%m-%dT%H");i=function(x)as.integer(format(b,x));h=i("%H");d=i("%m%d");w=d>1100|d<430;f=ifelse;cat(c("Off","Mid","On")[f(i("%u")%in%5:6|h<7|h>19,1,f(h>11&h<17,f(w,2,3),f(w,3,2)))])

इंडेंट किया और टिप्पणी की:

b=strptime(scan(,""),"%Y-%m-%dT%H") #Takes stdin and converts into POSIXct
i=function(x)as.integer(format(b,x)) #Format the POSIXct and convert it to integer
h=i("%H")      #Format to hours
d=i("%m%d")    #Format to Month/Day
w=d>1100|d<430 #True if winter time, false if summer
f=ifelse
cat(c("Off","Mid","On")[f(i("%u")%in%5:6|h<7|h>19, #If weekend or night
                          1,                       #Case 1
                          f(h>11&h<17,            #Else if mid-day
                             f(w,3,2),             #Case 2 in winter, case 3 in summer
                             f(w,2,3)))])          #else vice versa

उदाहरण:

> b=strptime(scan(,""),"%Y-%m-%dT%H");i=function(x)as.integer(format(b,x));h=i("%H");d=i("%m%d");w=d>1100|d<430;f=ifelse;cat(c("Off","Mid","On")[f(i("%u")%in%5:6|h<7|h>19,1,f(h>11&h<17,f(w,3,2),f(w,2,3)))])
1: 2014-08-26T15
2: 
Read 1 item
On
> b=strptime(scan(,""),"%Y-%m-%dT%H");i=function(x)as.integer(format(b,x));h=i("%H");d=i("%m%d");w=d>1100|d<430;f=ifelse;cat(c("Off","Mid","On")[f(i("%u")%in%5:6|h<7|h>19,1,f(h>11&h<17,f(w,3,2),f(w,2,3)))])
1: 2014-12-10T15
2: 
Read 1 item
Mid
> b=strptime(scan(,""),"%Y-%m-%dT%H");i=function(x)as.integer(format(b,x));h=i("%H");d=i("%m%d");w=d>1100|d<430;f=ifelse;cat(c("Off","Mid","On")[f(i("%u")%in%5:6|h<7|h>19,1,f(h>11&h<17,f(w,3,2),f(w,2,3)))])
1: 2014-08-26T23
2: 
Read 1 item
Off

1

बैश, 286

यह दिनांक प्रोग्राम का उपयोग करके एक सरल बैश उत्तर है

d(){ date -d $1 +%$2; };D=$(echo $1|sed 's/\(T..\)$/\1:00/');H=$(d $D H);M=$(d $D m);if [ $(d $D u) -gt 5 ]||[ $H -lt 7 ]||[ $H -gt 18 ];then echo Off;exit;fi;if [ $M -gt 4 ]&&[ $M -lt 11 ];then I=On;O=Mid;else I=Mid;O=On;fi;if [ $H -gt 10 ]&&[ $H -lt 17 ];then echo $I;else echo $O;fi

1

यहाँ एक और जाता है!

जावास्क्रिप्ट, 175 171

function f(x){d=new Date(x.slice(0,10));t=x.slice(11,13),m=(x.slice(5,7)+1)%12;return(t<8||t>18||!(d.getUTCDay()%6)?'off':((t<11||t>17)?(m<5?'on':'mid'):(m<5?'mid':'on'))}

unminified:

function f(x) {
  d = new Date(x.slice(0, 10));
  t = x.slice(11, 13), m = (x.slice(5, 7) + 1) % 12;
  return (t < 8 || t > 18 || !(d.getUTCDay() % 6) ? 'off' : ((t < 11 || t > 17) ? (m < 5 ? 'on' : 'mid') : (m < 5 ? 'mid' : 'on'))
}

केवल दुभाषिए जहां एक ISO8601 तारीख स्ट्रिंग में पारित किया जा सकता पर काम करता है Date निर्माता।

कॉफ़ीस्क्रिप्ट, 192 189

हैरानी की बात है, यह कॉफीस्क्रिप्ट में लंबा है क्योंकि उस भाषा में कोई टर्नरी ऑपरेटर नहीं है (जो कि आप मेरे जावास्क्रिप्ट से देख सकते हैं, मैं बहुत भरोसा करता हूं)।

f=(x)->d=new Date(x.slice(0,10));t=x.slice(11,13);m=(x.slice(5,7)+1)%12;return'off'if(t<8||t>18||!(d.getUTCDay()%6));if(t<11||t>17)then(if m<5then'on'else'mid')else(if m<5then'mid'else'on')

0

ईएस 6 - 146

यह समारोह रूप में है एक जोड़े बुरा हैक्स उपयोग करता है।

let y,m,d,h,c=s=>[y,m,d,h]=s.split(/[T:-]/g).map(i=>+i),new Date(y,m,d).getDay()in{0:1,6:1}||h<20||8>h?'Off':['Mid','On'][(10>h&&h>16)^(m>5||m<8)]

व्याख्या की:

// These variables are declared outside of the function scope to save
// characters.
let y, // year
    m, // month
    d, // day
    h, // hour
    c = s => // c for check, called as c(isoString)
      [y, m, d, h] = // Assign to fields
        s.split(/[T:-]/g) // Split at delimiters
         .map(i => +i), // Convert all to numbers
                        // Comma used to keep it as a single statement.
      new Date(y, m, d).getDay() // Create Date to get day of week
        in {0:1, 6:1} // Check if it is good (0 = Sunday, 6 = Saturday). It
                      // is shorter to use an object literal than to
                      // do individual checks.
      ||
      h < 20 || 8 > h ? // h is between 7 and 19 (7pm)
       'Off' : // Return 'Off'
       ['Mid','On'][ // Two other outputs
        (10 > h && h > 16) ^ // Check if it is 11-16 (5pm)
        (m > 5 || m < 8)] // Invert that if the month is in summer/fall. Note
                          // that this returns a number, either 1 or 0. This
                          // is an ugly hack using the bitwise xor operator.

0

अजगर 3 - 352 वर्ण

import datetime as dt
t=input()
i=int
p=print
a='on'
b='mid'
c='off'
m=i(t[5:7])
h=i(t[11:13])
d=dt.date(i(t[0:4]),m,i(t[8:10])).weekday()
if 5==d or 6==d:p(c)
elif h>=19 and h<7:p(c)
elif m<=10 and m>=4:
 if h>=7 and h<11:p(b)
 if h>=11 and h<17:p(a)
 if h>=17 and h<19:p(b)
else:
 if h>=7 and h<11:p(a)
 if h>=11 and h<17:p(b)
 if h>=17 and h<19:p(a)

1
आप बदलना चाहिए s=['high','mid','off']करने के लिए s=['on','mid','off']- न केवल 2 वर्ण बचाने इस करता है, लेकिन कल्पना "पर" उत्पादन के लिए कहते हैं।
Sellyme

0

जावा - 426 309/301? (टिप्पणी देखो)

String z(String a){
    DateParser b=new DateParser(a);
    boolean c=b.parseEcmaDate();
    Integer[]d=b.getDateFields();
    GregorianCalendar e=new GregorianCalendar(d[0],d[1]-(c?0:1),d[2]);
    e.setTimeZone(new SimpleTimeZone(0,""));
    return(124>>e.get(7)&1)>0&d[3]>6&d[3]<19?
           d[3]>10&d[3]<17^(1008>>e.get(2)&1)>0?"Mid":"On":"Off";
}

उदाहरण आउटपुट:

2014-03-02T00   Off
2014-03-02T06   Off
2014-03-02T07   Off
2014-03-02T10   Off
2014-03-02T11   Off
2014-03-02T16   Off
2014-03-02T17   Off
2014-03-02T18   Off
2014-03-02T19   Off
2014-03-02T23   Off
2014-04-02T00   Off
2014-04-02T06   Off
2014-04-02T07   On
2014-04-02T10   On
2014-04-02T11   Mid
2014-04-02T16   Mid
2014-04-02T17   On
2014-04-02T18   On
2014-04-02T19   Off
2014-04-02T23   Off
2014-05-02T00   Off
2014-05-02T06   Off
2014-05-02T07   Mid
2014-05-02T10   Mid
2014-05-02T11   On
2014-05-02T16   On
2014-05-02T17   Mid
2014-05-02T18   Mid
2014-05-02T19   Off
2014-05-02T23   Off

मैं अजगर प्रस्तुत करने के रूप में ही Exor चाल का इस्तेमाल किया। मैं भी एक प्रयोग किया जाता +है जब यह है के लिए एक या समारोह, के रूप मेंweekend OR night

मेरे अन्य बड़ी चाल: बिट मास्क।

उदाहरण के लिए, एक नंबर (सोमवार से शुक्रवार) 2 और 6 के बीच है, तो पहले एक सा पैटर्न जहां दिलचस्प मूल्यों 1 बनाने को देखने के लिए:

  6   2 
0b1111100 = 124

फिर, एलएसबी के लिए दिलचस्प बिट पाने के लिए बिट शिफ्ट का उपयोग करें और इसे निकालें:

(124 >> day_of_week) & 1

इसी तरह, मैंने महीनों और घंटों के लिए बिट पैटर्न बनाया:

  9    4
0b1111110000 = 1008

      76          76
0b111110000000000001111111 = 16253055
0b000000011111100000000000 = 129024

दुर्भाग्य से, यह बस पता चला है x>y&x<z , ज्यादातर मामलों में कम है तो मैं कुछ स्थानों में इसका इस्तेमाल नहीं किया।

और अंत में, हैकरी (अत्यधिक कार्यान्वयन पर निर्भर) का एक सा jdk.nashorn.internal.parser.DateParser: कबparseEcmaDate() पूरी तरह से एक तारीख को पार्स नहीं करता है (जैसे कि जब यह घंटे पढ़ता है और स्ट्रिंग के अंत को हिट करता है), तो यह गलत होता है।

  • जब यह ठीक से खत्म हो जाता है, तो तारीख एक में जमा हो जाती है Integer[] (ऑटो-अनबॉक्सिंग एफडब्ल्यू) , जिस महीने को आधार -० (अन्य जावा वर्गों की तरह) निर्धारित किया जाता है।
  • जब यह गलत हो जाता है, तो यह आधा रास्ता छोड़ देता है और यह फिक्सिंग नहीं करता है। हालाँकि यह अभी भी जो कुछ भी इसे सरणी में रखा है, जो आसानी से उपलब्ध है। इसलिए द -(c?0:1)

मुझे लगता है कि सिर्फ इस्तेमाल करने से .parse()भी काम चल सकता है (8 अक्षरों का शेविंग), लेकिन मैंने अलग-अलग इनपुट्स के साथ इसका पूरी तरह से परीक्षण नहीं किया है। parseआंतरिक रूप से कॉल करता है parseEcmaDateऔर यदि यह विफल रहता है, तो कॉल करता है parseLegacyDate। उत्तरार्द्ध सरणी को खराब कर सकता है, लेकिन मेरे द्वारा परीक्षण किए गए कुछ मामलों के साथ ऐसा नहीं हुआ।
मार्क जेरोनिमस

-1

कुछ भी मुझे अपने आप में प्रवेश करने से नहीं रोकता है, और यहाँ वैसे भी अन्य छोटे हैं, इसलिए…

PHP 5.4+, 194

<?function f($x){$t=substr($x,11,2);$m=(substr($x,5,2)+1)%12;if($t<8||$t>18||(new DateTime(substr($x,0,10)))->format('N')>5)return'off';return($t<11||$t>17)?($m<5?'on':'mid'):($m<5?'mid':'on');}

अकुशल और टिप्पणी:

<?
function f($x) {
  $t = substr($x,11,2); // hour
  $m = (substr($x,5,2) + 1) % 12; // month shifted up by 1

  if ($t < 8 || $t > 18 || (new DateTime(substr($x,0,10)))->format('N') > 5)
    return 'off'; // evenings and weekends

  return ($t < 11 || $t > 17)
    ? ($m < 5 ? 'on' : 'mid') // morning and mid-afternoon
    : ($m < 5 ? 'mid' : 'on'); // afternoon
}

यह भी ध्यान दें कि date.timezonephp.ini में निर्देश सेट किया जाना चाहिए, अन्यथा एक अपवाद को फेंक दिया जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.