Ini adalah kode golf pertama saya, jadi tolong beri tahu saya jika terlalu luas atau jika saya kehilangan informasi untuk puzzle yang bagus!
Tantangan
Di Ontario dan mungkin daerah lain di dunia, listrik ditagih menggunakan Time-Of-Use (TOU) , yang memvariasikan biaya per kilowatt-jam sesuai dengan saat Anda menggunakan daya.
Diberi tanggal dan waktu, saya ingin tahu apakah saya berada di periode waktu on-peak (merah), mid-peak (kuning), atau off-peak (hijau).
Memasukkan
Asumsikan bahwa input disediakan dalam format tanggal-waktu ISO 8601 kurang-zona waktu yang dapat diterima dengan ketepatan jam minimum:YYYY-MM-DDThh[:mm[:ss]]
(T adalah literal).
Contohnya
- 2014-09-01T14
- 2014-09-01T17: 30
- 2014-09-01T17: 30: 02
Keluaran
Output harus string On
, Mid
atauOff
.
Aturan
- Kode terpendek menang
- Untuk tujuan tantangan ini, abaikan hari libur resmi
- Asumsikan informasi yang ditemukan di pos ini. Aturan aktual penetapan harga waktu penggunaan mungkin berubah di masa depan oleh Kementerian Energi Ontario.
Informasi
Musim panas hari kerja (1 Mei hingga 31 Oktober)
- Off-peak: 19h00 - 07h00
- Mid-peak: 07h00 - 11h00 dan 17h00 - 19h00
- On-peak: 11h00 - 17h00
Musim dingin di musim dingin (1 November hingga 30 April)
- Off-peak: 19h00 - 07h00
- Mid-peak: 11h00 - 17h00
- On-peak: 07h00 - 11h00 dan 17h00 - 19h00
Akhir pekan
- Off-peak: Sepanjang hari
YYYY-MM-DDThh[:mm[:ss]]
sejak detik hanya dapat diterapkan jika menit diterapkan?Jawaban:
Ruby -
147 144 143 141 137135Ini mewakili fungsi yang mengambil string sebagai parameter dan mengembalikan string.
Ini demo online dengan beberapa test case: http://ideone.com/wyIydw
sumber
Python 2 - 164
Jika diperlukan, di bawah ini adalah penjelasan dari logika di baris terakhir:
Baris terakhir mencetak sepotong
'OMOfinfd'
tergantung pada evaluasi kondisionalnya.Pertama, evaluasi operasi
1+((10<t<17)==(4<m<11))
.Jika XNOR berada di antara kondisi
10<t<17
dan4<m<11
adalahFalse
, ini akan dievaluasi menjadi1+False => 1+0 => 1
. Jika tidak, operasi akan dievaluasi menjadi1+True => 1+1 => 2
.Akhirnya, gandakan hasil operasi di atas dengan apakah hari itu adalah hari kerja dan apakah waktunya antara pukul 6 pagi sampai 7 sore.
Jika demikian
False
, hari itu adalah akhir pekan atau waktunya adalah antara jam 7 malam - 6 pagi, dan hasilnya akan seperti itu(1|2)*0 => 0
. Kalau tidak hasilnya akan(1|2)*1 => 1|2
.Hasil dari
0
akan dicetakOff
,1
akan dicetakMid
, dan2
akan dicetakOn
.sumber
C # -
240220 karakterTidak ada yang spesial. Pengodean lurus ke depan.
Terima kasih kepada w0lf :)
sumber
s.Length==13?s+":00:00":s.Length==16?s+":00":s
ke(s+":00:00").Substring(0,19)
Ruby - 135
Menyalahgunakan modul Waktu. Masukan dengan argumen baris perintah.
Sunting: Terima kasih w0lf untuk Waktu yang membantu mempersingkat dan menyelesaikan bug.
sumber
2014-09-01T17:30
dengan benar output"Mid"
, tetapi untuk2014-09-01T17
itu output"Off"
.Groovy -
621534524491 karakterBeberapa bermain golf lebih lanjut untuk dilakukan, tetapi cukup sederhana ketika memanfaatkan Joda-Time
sampel berjalan:
Tidak Terkumpul:
sumber
java.time.*
, yang sangat mirip dengan Joda Time tetapi merupakan bagian dari JRE. Mungkin ini bisa mempersingkat kode sedikit.'2014-01-05T08:08'
, 5 Januari 2014 adalah hari Minggu. Dengan demikian, seharusnya'Off'
java.time.*
. gagal total. Pengurai terlalu ketat. GunakanDateParser
dari nashorn (juga bagian dari JRE8) yang lunak, dan dengan sedikit peretasan kasar, bahkan cukup ringan untuk melewati menit & detik.R,
243204 karakterDiindentasi dan berkomentar:
Contoh:
sumber
Bash, 286
ini adalah jawaban bash sederhana menggunakan program tanggal
sumber
Ini dia lagi!
JavaScript,
175171Tidak dijinakkan:
Hanya bekerja pada penterjemah tempat string tanggal ISO8601 dapat diteruskan ke
Date
konstruktor.CoffeeScript,
192189Anehnya, itu lebih lama di CoffeeScript karena tidak ada operator ternary dalam bahasa itu (yang seperti yang Anda lihat dari JavaScript saya, saya sangat bergantung pada).
sumber
ES6 - 146
Ini dalam bentuk fungsi, menggunakan beberapa hack jahat.
Dijelaskan:
sumber
Python 3 - 352 karakter
sumber
s=['high','mid','off']
kes=['on','mid','off']
- tidak hanya ini menyimpan 2 karakter, tetapi spesifikasi mengatakan untuk menampilkan "pada".Java -
426309/301? (lihat komentar)Contoh output:
Saya menggunakan trik EXOR yang sama dengan pengiriman Python.
Saya juga menggunakan+
fungsi OR, untuk saat ituweekend OR night
.Trik besar saya yang lain: topeng bit.
Misalnya, untuk melihat apakah angka berada di antara 2 dan 6 (Senin hingga Jumat), pertama buat pola bit di mana nilai yang menarik adalah 1:
Kemudian, gunakan bit shift untuk mendapatkan bit yang menarik ke LSB dan ekstrak:
Demikian pula, saya membuat pola bit selama berbulan-bulan dan berjam-jam:
Sayangnya, ternyata
x>y&x<z
lebih pendek dalam banyak kasus, jadi saya tidak menggunakannya di beberapa tempat.Dan akhirnya, sedikit peretasan (sangat tergantung implementasi) dengan
jdk.nashorn.internal.parser.DateParser
: KapanparseEcmaDate()
tidak sepenuhnya menguraikan tanggal (seperti ketika membaca jam dan mencapai akhir string), ia mengembalikan false.Integer[]
(ftw auto-unboxing), dengan bulan ditetapkan menjadi basis-0 (seperti kelas Java lainnya).-(c?0:1)
.sumber
.parse()
mungkin juga berfungsi (mengurangi 8 karakter), tapi saya belum mengujinya dengan input yang berbeda.parse
panggilan internalparseEcmaDate
dan jika gagal, panggilanparseLegacyDate
. Yang terakhir mungkin mengacaukan array, tetapi ini tidak terjadi dengan beberapa kasus yang saya uji.Tidak ada yang menghentikan saya untuk memasukkan milik saya, dan ada yang lebih pendek di sini, jadi ...
PHP 5.4+, 194
Tidak ditagih dan dikomentari:
Perhatikan juga bahwa
date.timezone
arahan dalam php.ini harus disetel, jika tidak, Pengecualian akan dibuang.sumber