Saya seorang penjelajah waktu, dan saya terobsesi dengan perjalanan waktu. Saya sangat suka saat-saat ketika jarum jam melewati 12, atau ketika saya bisa beralih ke halaman berikutnya dari kalender saya, atau ketika semua orang berteriak "Selamat Tahun Baru!"
Tolong tuliskan bagi saya sebuah program untuk menunjukkan kepada saya seberapa jauh saya dari saat seperti terakhir ke yang berikutnya, dalam bentuk progress bar. Misalnya, jika saya katakan pukul 09:12, maka harus dicetak ini:
09:00 ####---------------- 10:00
Jika saya katakan bulan ini adalah bulan Mei 1982, itu harus dicetak:
1982-01 #######------------- 1983-01
Apakah saya menyebutkan saya penjelajah waktu? Saya melakukan perjalanan ke mana saja dari milidetik pertama 0 M hingga milidetik terakhir 9999 M, sehingga program perlu menangani tanggal dan waktu dalam rentang itu.
Memasukkan
Input akan berada dalam salah satu format berikut:
YYYY-MM-DDThh:mm:ss.sss
YYYY-MM-DDThh:mm:ss
YYYY-MM-DDThh:mm
YYYY-MM-DDThh
YYYY-MM-DD
YYYY-MM
Ini adalah satu-satunya format yang perlu ditangani. Setiap bagian akan memiliki jumlah digit yang ditampilkan, yang berarti detik pecahan mungkin memiliki angka nol (misalnya
.120
, tidak pernah.12
). IniT
adalah huruf literal "T" yang membatasi tanggal dari waktu. Jam berada pada jam 24 jam.Bulan dan hari berbasis 1 (lebih lanjut tentang ini di bawah).
Input yang tidak valid dan di luar jangkauan tidak perlu ditangani.
Sesuai kebijaksanaan programmer, input mungkin memiliki satu baris tambahan.
Kemajuan matematika bar
Program ini berkaitan dengan unit paling sedikit dan paling sedikit kedua dalam input yang diberikan. Misalnya, jika input memiliki tingkat presisi hari (misalnya 2016-12-14
), bilah kemajuan akan menunjukkan proporsi hari dalam bulan input yang telah berlalu dibandingkan yang tersisa.
Progress bar akan memiliki 20 unit (karakter) dan proporsi diwakili akan dibulatkan ke kenaikan terdekat dari 1 / 20 . Misalnya, diberikan 2016-12-14T12:28
, bilah progres akan menunjukkan Putaran ( 28 ⁄ 60 × 20) = 9 dari 20 unit "terisi."
Bulan dan hari berbasis 1
Meskipun hari 1 Desember (misalnya) sudah 01
dalam 2016-12-01
, untuk tujuan perhitungan itu adalah hari ke-0 dalam sebulan, karena unit terpotong menyiratkan milidetik ke-0 pada menit ke-0 dari menit ke-0 dari jam ke-0 pada hari itu. Dengan kata lain, 2016-12-01
adalah 0 / 31 dari jalan sampai Desember dan 2016-12-02
merupakan 1 / 31 , dan seterusnya.
Demikian juga, 2016-01
adalah milidetik 0 hari 0 Januari, sehingga dalam perhitungan itu adalah 0 / 12 , yang berarti 2016-12
adalah 11 / 12 .
Ya, itu berarti bulan dan hari tidak akan pernah sepenuhnya mengisi bilah kemajuan.
Durasi bulan dan tahun kabisat yang berbeda
Bulan yang berbeda memiliki jumlah hari yang berbeda dan hasilnya harus mencerminkan hal ini — termasuk tahun kabisat. Bilah progres untuk 6 Februari 2017 akan berbeda dari bilah progres untuk 6 Februari 2016 (atau 6 Januari di kedua tahun tersebut).
Lain-lain
- Pelancong waktu menggunakan kalender Gregorian yang subur . TL; DR: Tidak ada kasus khusus seperti hari yang hilang pada 1752 . Input akan mencakup tanggal pada tahun 0 M
- Pelancong waktu mengabaikan penghematan siang hari.
- Program ini tidak diharuskan untuk menghitung detik kabisat, tetapi mungkin saja.
Keluaran
Program (atau fungsi) harus mencetak (atau mengembalikan sebagai string) bilah kemajuan 20-karakter yang berorientasi horizontal yang "diisi" untuk waktu yang telah berlalu dan "terbuka" untuk waktu yang tersisa. Itu harus "mengisi" dari kiri ke kanan.
Bilah kemajuan harus memiliki label di sebelah kiri yang menunjukkan awal periode yang dihitung dan yang lain di sebelah kanan menunjukkan awal periode berikutnya, dalam format yang sama dengan input (tetapi hanya menunjukkan dua unit presisi). Sebagai contoh, 2016-12-14
output yang valid adalah:
12-01 #########----------- 01-01
Berikut adalah format label yang valid untuk masing-masing periode yang mungkin:
- Bulan:
YYYY-MM
- Hari:
MM-DD
- Jam:
DDThh
- Menit:
hh:mm
- Detik:
mm:ss
- Milidetik:
ss.sss
Tidak ada unit tambahan yang dapat dimasukkan dalam label, dan tidak ada yang dapat dihilangkan.
Catatan keluaran
- Unit "diisi" progress bar akan diwakili oleh
#
karakter. "Buka" unit akan diwakili oleh-
. - Harus ada tepat satu ruang antara bilah kemajuan dan setiap label.
- Ruang depan atau belakang dan / atau baris baru tunggal diperbolehkan.
Kemenangan
Ini adalah kode-golf . Kode terpendek dalam byte menang. Aturan standar berlaku. Celah standar dilarang.
Contohnya
Input Output
----------------------- -------------------------------------
2016-12-12T12:17 12:00 ######-------------- 13:00
2016-12-12 12-01 #######------------- 01-01
0000-01-01T00:00:00.000 00.000 -------------------- 01.000
0000-01-01T00:00 00:00 -------------------- 01:00
1899-12-31T23 31T00 ###################- 01T00
1899-12-31 12-01 ###################- 01-01
1899-12 1899-01 ##################-- 1900-01
1982-05-15T17:15 17:00 #####--------------- 18:00
1982-05-15T17 15T00 ##############------ 16T00
1982-05 1982-01 #######------------- 1983-01
9999-12-31T23:59:59.999 59.000 #################### 00.000
9999-12 9999-01 ##################-- 10000-01
2000-01-06 01-01 ###----------------- 02-01
2000-02-06 02-01 ###----------------- 03-01
2001-02-06 02-01 ####---------------- 03-01
1742-09-10 09-01 ######-------------- 10-01
Jawaban:
JavaScript, 282 byte
Lewati semua tes
Fungsi tes tidak mencetak apa-apa untuk lulus, nilai untuk gagal.
Kasus uji:
sumber
Pyth, 213 byte
Kode pertama saya di pyth! Melihat:
Kode pyth saya berdasarkan dari jawaban python saya sebelumnya. Berikut adalah versi yang tidak diklik dengan komentar:
Menguji banyak nilai dengan mudah dilakukan dengan membuat loop kode, dan menambahkan cetakan baris baru sampai akhir:
Lalu saya berlari
cat testinput | pyth code.pyth > output
dandiff output testoutput
Atau mencobanya secara online .sumber
Python 2, 371 byte
Tantangan ini ternyata sangat sulit! Sepertinya saya akan berusia di bawah 300 sampai saya berhasil memformat string output.
Jenis bagian yang keren adalah bahwa jawaban saya tidak menggunakan paket tanggal:
sumber