Dies ist mein erstes Codegolf, also lass es mich bitte wissen, wenn es zu breit ist oder wenn mir Informationen für ein gutes Puzzle fehlen!
Herausforderung
In Ontario und möglicherweise in anderen Regionen der Welt wird die Stromrechnung nach den Nutzungsdauer-Gebühren (Time-Of-Use, TOU) berechnet. Die Kosten pro Kilowattstunde hängen davon ab, wann Sie Strom verbrauchen .
Wenn ich ein Datum und eine Uhrzeit angegeben habe, möchte ich wissen, ob ich mich in einem Zeitraum auf der Spitze (rot), in der Mitte (gelb) oder außerhalb der Spitze (grün) befinde.
Eingang
Angenommen, die Eingabe erfolgt in einem akzeptablen zeitzonenlosen ISO 8601-Datums- / Uhrzeitformat mit einer Mindestgenauigkeit von Stunden: YYYY-MM-DDThh[:mm[:ss]]
(das T ist ein Literal).
Beispiele
- 2014-09-01T14
- 2014-09-01T17: 30
- 2014-09-01T17: 30: 02
Ausgabe
Die Ausgabe sollte ein String sein On
, Mid
oder Off
.
Regeln
- Kürzester Code gewinnt
- Ignorieren Sie für diese Herausforderung gesetzliche Feiertage
- Angenommen, die Informationen in diesem Beitrag gefunden. Die tatsächlichen Regeln für die Preisgestaltung für die Nutzungsdauer könnten sich vom Energieministerium in Ontario in Zukunft ändern.
Information
Sommertage (1. Mai bis 31. Oktober)
- Nebensaison: 19.00 - 07.00 Uhr
- Mittelspitze: 07:00 - 11:00 Uhr und 17:00 - 19:00 Uhr
- An der Spitze: 11.00 - 17.00 Uhr
Wintertage (1. November bis 30. April)
- Nebensaison: 19.00 - 07.00 Uhr
- Mittelspitze: 11.00 - 17.00 Uhr
- An der Spitze: 07:00 - 11:00 Uhr und 17:00 - 19:00 Uhr
Wochenenden
- Nebensaison: Den ganzen Tag
YYYY-MM-DDThh[:mm[:ss]]
Sekunden nur angewendet werden können, wenn Minuten angewendet werden?Antworten:
Ruby -
147 144 143 141 137135Dies stellt eine Funktion dar, die eine Zeichenfolge als Parameter verwendet und eine Zeichenfolge zurückgibt.
Hier ist eine Online-Demo mit einigen Testfällen: http://ideone.com/wyIydw
quelle
Python 2 - 164
Nachstehend finden Sie bei Bedarf eine Erläuterung der Logik in der letzten Zeile:
Die letzte Zeile druckt
'OMOfinfd'
je nach Bewertung ihrer Bedingungen einen Slice aus .Bewerten Sie zuerst die Operation
1+((10<t<17)==(4<m<11))
.Wenn die XNOR zwischen den Bedingungen
10<t<17
und4<m<11
sindFalse
, wird dies bewerten zu1+False => 1+0 => 1
. Andernfalls wird die Operation zu ausgewertet1+True => 1+1 => 2
.Multiplizieren Sie abschließend das Ergebnis der obigen Operation mit der Angabe, ob der Tag ein Wochentag ist und ob die Zeit zwischen 6 und 19 Uhr liegt.
Wenn dies
False
der Fall ist , ist entweder der Tag ein Wochenende oder die Zeit zwischen 19.00 und 06.00 Uhr und das Ergebnis ist(1|2)*0 => 0
. Andernfalls ist das Ergebnis(1|2)*1 => 1|2
.Ein Ergebnis von
0
wird gedrucktOff
,1
wird gedrucktMid
und2
wird gedrucktOn
.quelle
C # -
240220 ZeichenNichts Besonderes. Einfache Codierung.
Danke an w0lf :)
quelle
s.Length==13?s+":00:00":s.Length==16?s+":00":s
bis(s+":00:00").Substring(0,19)
Rubin - 135
Missbrauch des Zeitmoduls. Eingabe über Befehlszeilenargument.
Edit: Danke w0lf für die Zeit, die geholfen hat, einen Bug zu verkürzen und zu lösen.
quelle
2014-09-01T17:30
es richtig aus"Mid"
, aber dafür2014-09-01T17
gibt es aus"Off"
.Groovy -
621534524491 ZeichenWeiteres Golfen, aber ganz einfach mit Joda-Time
Probeläufe:
Ungolfed:
quelle
java.time.*
, das Joda Time sehr ähnlich ist, aber Teil der JRE ist. Vielleicht könnte dies den Code etwas verkürzen.'2014-01-05T08:08'
ist der 5. Januar 2014 ein Sonntag. So sollte es sein'Off'
java.time.*
. Scheiterte kläglich. Der Parser ist zu streng. Verwenden SieDateParser
aus Nashorn (ebenfalls Teil des JRE8), das mild und mit ein wenig missbräuchlichem Hacking sogar mild genug ist, um Minuten und Sekunden zu überspringen.R,
243204 ZeichenEingerückt und kommentiert:
Beispiele:
quelle
Bash, 286
Dies ist eine einfache Bash-Antwort mit dem Datumsprogramm
quelle
Hier geht noch einer!
JavaScript,
175171Nicht abgeschlossen:
Funktioniert nur mit Interpreten, bei denen eine ISO8601-Datumszeichenfolge an den
Date
Konstruktor übergeben werden kann.CoffeeScript,
192189Überraschenderweise ist es in CoffeeScript länger, da es in dieser Sprache keinen ternären Operator gibt (worauf ich mich in meinem JavaScript stark verlassen habe).
quelle
ES6 - 146
Dies ist in Funktionsform, verwendet ein paar böse Hacks.
Erklärt:
quelle
Python 3 - 352 Zeichen
quelle
s=['high','mid','off']
zus=['on','mid','off']
- nicht nur dies tun speichern 2 Zeichen, aber die Spezifikation sagt zur Ausgabe von „on“.Java -
426309/301? (Zeige Kommentare)Beispielausgabe:
Ich habe den gleichen EXOR-Trick wie die Python-Vorlage verwendet.
Ich habe auch eine+
als OR-Funktion verwendet, wenn es istweekend OR night
.Mein anderer großer Trick: Bitmasken.
Um beispielsweise festzustellen, ob eine Zahl zwischen 2 und 6 liegt (Montag bis Freitag), erstellen Sie zunächst ein Bitmuster mit den interessanten Werten 1:
Verwenden Sie dann die Bitverschiebung, um das interessante Bit in das LSB zu übertragen und zu extrahieren:
Ebenso habe ich monatelang und stundenlang Bitmuster erstellt:
Leider stellt sich heraus, dass es
x>y&x<z
in den meisten Fällen einfach kürzer ist, so dass ich es an einigen Stellen nicht verwendet habe.Und zum Schluss noch ein bisschen Hackery (stark implementierungsabhängig) mit
jdk.nashorn.internal.parser.DateParser
: WennparseEcmaDate()
ein Datum nicht vollständig analysiert wird (z. B. wenn es die Stunde liest und das Ende der Zeichenfolge erreicht), wird false zurückgegeben.Integer[]
(Auto-Unboxing-FTP) gespeichert , wobei der Monat auf Basis 0 festgelegt ist (wie bei anderen Java-Klassen).-(c?0:1)
.quelle
.parse()
könnte auch funktionieren, nur 8 Zeichen zu verwenden, aber ich habe es nicht gründlich mit verschiedenen Eingaben getestet.parse
Intern ruft anparseEcmaDate
und wenn es fehlschlägt, ruft anparseLegacyDate
. Letzteres kann das Array vermasseln, aber dies ist in einigen Fällen, die ich getestet habe, nicht geschehen.Nichts hindert mich daran, meine eigenen zu betreten, und es gibt hier sowieso noch andere kürzere, also ...
PHP 5.4+, 194
Nicht abgeschlossen und kommentiert:
Beachten Sie auch, dass die
date.timezone
Direktive in der php.ini gesetzt sein muss, sonst wird eine Exception ausgelöst.quelle