To jest mój pierwszy kod golfowy, więc daj mi znać, jeśli jest zbyt szeroki lub jeśli brakuje mi informacji na temat dobrej układanki!
Wyzwanie
W Ontario i prawdopodobnie w innych częściach świata za energię elektryczną naliczane są ceny według czasu użytkowania (TOU) , który zmienia koszt za kilowatogodzinę w zależności od tego, kiedy używasz energii.
Biorąc pod uwagę datę i godzinę, chcę wiedzieć, czy jestem w szczycie (czerwony), w środku szczytu (żółty), czy poza szczytem (zielony).
Wejście
Załóżmy, że dane wejściowe są dostarczane w akceptowalnym formacie daty i godziny ISO 8601 bez strefy czasowej z minimalną dokładnością godzin: YYYY-MM-DDThh[:mm[:ss]]
(T jest dosłowne).
Przykłady
- 2014-09-01T14
- 2014-09-01T17: 30
- 2014-09-01T17: 30: 02
Wynik
Wyjście powinno być ciągiem On
, Mid
albo Off
.
Zasady
- Najkrótszy kod wygrywa
- Na potrzeby tego wyzwania należy zignorować dni ustawowo wolne od pracy
- Załóżmy, że informacje zawarte w tym poście. Rzeczywiste zasady ustalania cen za czas użytkowania mogą ulec zmianie w przyszłości przez Ministerstwo Energii Ontario.
Informacja
Letnie dni powszednie (od 1 maja do 31 października)
- Poza szczytem: 19.00 - 07.00
- Środkowy szczyt: 07.00 - 11.00 i 17.00 - 19.00
- Na szczycie: 11.00 - 17.00
Zimowe dni powszednie (od 1 listopada do 30 kwietnia)
- Poza szczytem: 19.00 - 07.00
- Środkowy szczyt: 11.00 - 17.00
- Na szczycie: 07.00 - 11.00 i 17.00 - 19.00
Weekendy
- Poza szczytem: Cały dzień
YYYY-MM-DDThh[:mm[:ss]]
że sekundy można zastosować tylko wtedy, gdy stosuje się minuty?Odpowiedzi:
Rubinowy -
147 144 143 141 137135 135To reprezentuje funkcję, która przyjmuje ciąg znaków jako parametr i zwraca ciąg znaków.
Oto demo online z niektórymi przypadkami testowymi: http://ideone.com/wyIydw
źródło
Python 2 - 164
W razie potrzeby poniżej znajduje się wyjaśnienie logiki w ostatnim wierszu:
Ostatni wiersz wypisuje wycinek w
'OMOfinfd'
zależności od oceny jego warunków warunkowych.Najpierw oceń operację
1+((10<t<17)==(4<m<11))
.Jeśli XNOR między warunkami
10<t<17
a4<m<11
jestFalse
, to oceni to na1+False => 1+0 => 1
. W przeciwnym razie operacja zostanie oszacowana na1+True => 1+1 => 2
.Na koniec pomnóż wynik powyższej operacji przez to, czy dzień jest dniem tygodnia i czy czas jest między 6 rano a 19:00.
Jeśli tak jest
False
, albo dzień jest weekendem, albo czas jest między 19:00 a 6:00, a wynik będzie(1|2)*0 => 0
. W przeciwnym razie wynik będzie(1|2)*1 => 1|2
.Wynik
0
zostanie wydrukowanyOff
,1
wydrukowanyMid
i2
wydrukowanyOn
.źródło
C # -
240220 znakówNic specjalnego. Proste kodowanie.
Dzięki w0lf :)
źródło
s.Length==13?s+":00:00":s.Length==16?s+":00":s
do(s+":00:00").Substring(0,19)
Rubin - 135
Nadużywa moduł czasu. Wprowadź za pomocą argumentu wiersza poleceń.
Edycja: Dzięki w0lf za czas, który pomógł skrócić i rozwiązać błąd.
źródło
2014-09-01T17:30
poprawnie wyprowadza"Mid"
, ale dla2014-09-01T17
wyjścia"Off"
.Groovy -
621534524491 znakówTrochę gry w golfa do zrobienia, ale całkiem proste, jeśli wykorzystasz czas Joda
przykładowe przebiegi:
Nie golfowany:
źródło
java.time.*
bardzo podobna do Joda Time, ale część JRE. Być może może to nieco skrócić kod.'2014-01-05T08:08'
, 5 stycznia 2014 r. To niedziela. Tak więc powinno być'Off'
java.time.*
. zawiodło nieszczęśliwie. Parser jest zbyt cholernie surowy. UżywajDateParser
z nashorn (również części JRE8), który jest łagodny i z odrobiną obraźliwego hakowania, nawet wystarczająco łagodny, aby pominąć minuty i sekundy.R,
243204 znakówWcięte i skomentowane:
Przykłady:
źródło
Bash, 286
jest to prosta odpowiedź bash przy użyciu programu daty
źródło
Oto kolejna!
JavaScript,
175171Unminified:
Działa tylko w przypadku interpreterów, w których ciąg daty ISO8601 można przekazać do
Date
konstruktora.CoffeeScript,
192189Zaskakujące jest to, że jest już w CoffeeScript, ponieważ nie ma trójskładnikowego operatora w tym języku (co, jak widać z mojego JavaScript, polegałem na nim).
źródło
ES6 - 146
To jest w formie funkcji, wykorzystuje kilka paskudnych hacków.
Wyjaśniono:
źródło
Python 3 - 352 znaków
źródło
s=['high','mid','off']
nas=['on','mid','off']
- nie tylko oszczędza to 2 znaki, ale specyfikacja mówi, aby wypisywać „on”.Java -
426309/301? (Zobacz komentarze)Przykładowe dane wyjściowe:
Użyłem tej samej sztuczki EXOR, co przesłanie Pythona.
Użyłem również+
jako funkcji OR, kiedy to jestweekend OR night
.Moja druga wielka sztuczka: maski bitowe.
Na przykład, aby sprawdzić, czy liczba zawiera się między 2 a 6 (od poniedziałku do piątku), najpierw utwórz wzór bitowy, w którym interesujące wartości to 1:
Następnie użyj przesunięcia bitów, aby uzyskać interesujący bit do LSB i wyodrębnić go:
Podobnie zrobiłem wzory bitów dla miesięcy i godzin:
Niestety okazuje się, że
x>y&x<z
w większości przypadków jest po prostu krótszy, więc nie korzystałem z niego w niektórych miejscach.I na koniec trochę hakowania (w dużym stopniu zależne od implementacji) z
jdk.nashorn.internal.parser.DateParser
: KiedyparseEcmaDate()
nie analizuje całkowicie daty (na przykład, gdy czyta godzinę i osiąga koniec łańcucha), zwraca false.Integer[]
(automatyczne rozpakowywanie plików ftw), a miesiąc jest ustawiony na 0 (podobnie jak inne klasy Java).-(c?0:1)
.źródło
.parse()
może również działać (golić 8 znaków), ale nie przetestowałem tego dokładnie przy różnych wejściach.parse
połączenia wewnętrzne,parseEcmaDate
a jeśli się nie powiedzie, połączeniaparseLegacyDate
. Ten ostatni może zepsuć tablicę, ale nie zdarzyło się to w kilku testowanych przypadkach.Nic nie powstrzymuje mnie przed wejściem do własnego, a i tak są tu inne krótsze, więc…
PHP 5.4+, 194
Unminified and commented:
Zauważ też, że
date.timezone
dyrektywa w php.ini musi być ustawiona, w przeciwnym razie zostanie zgłoszony wyjątek.źródło