Liburan PPCG saya selesai: D
Intro
Waktu pecahan adalah the year + (the value (minute of year) / number of minutes in the year)
.
Contoh perhitungan
Anda harus berasumsi bahwa Februari selalu memiliki 28 hari dan tahun selalu 365 hari.
Katakanlah kita ingin mengubah waktu: 17:34 3rd March 2013
ke waktu fraksional. Pertama, Anda menemukan berapa menit pada 2013: 525600 menit . Sebut ini x
.
Selanjutnya, Anda ingin mengetahui berapa menit yang sudah ada sejak awal 2013. Beberapa perhitungan cepat akan memberi tahu Anda bahwa jawabannya adalah 88894 menit:
Sudah ada 61 hari sejak awal tahun, yang kali 1440 (jumlah menit dalam sehari) sama dengan 87.840 menit. Dalam 17 jam adalah 1020 menit (17 * 60). Sekarang, kita dapat menambahkan 87.840, 1020 dan 34 menit menjadi sama dengan 88.894 menit.
Sebut ini y
.
Akhirnya, Anda membagi y
dengan x
dan menambahkan tahun, menghasilkan 2013.16912
(ke 5 tempat desimal).
Memasukkan
Tanggal dan waktu akan diberikan sebagai string tunggal. String akan berada dalam format berikut:
YYYY-MM-DD hh:mm
Waktu akan selalu dalam format 24 jam dan tahun akan selalu berada dalam kisaran 1900-2050 inklusif.
Contohnya
Input: 2016-08-06 23:48
Output: 2016.59723
Input: 2013-03-03 17:34
Output: 2013.16912
Input: 1914-11-11 11:11
Output: 1914.86155
Jika Anda mencari hadiahnya, ping saya di komentar atau di The Nineteenth Byte .
Tantangan
Hitung tanggal dan waktu yang diberikan sebagai tahun pecahan.
Berikan semua output ke lima tempat desimal (Anda dapat membulatkannya sesuai keinginan: lantai, langit-langit, atau pembulatan sejati). Kode terpendek menang.
Karunia
Saya menawarkan hadiah 100 rep untuk program terpendek yang juga menerima tanggal dalam format tahun pecahan dan mengembalikan waktu dalam YYYY-MM-DD hh:mm
format. Intinya, program Anda (atau fungsi) harus bertindak dengan cara berikut:
f('1914-11-11 11:11') => 1914.86155
f('1914.86155') => 1914-11-11 11:11
For this, assume February has 28 days and the year is 365 days long.
, tetapi juga... using the Gregorian calendar.
Jawaban:
TSQL, 63 byte
Ini adalah versi yang lebih pendek dari jawaban asli saya, karena jawaban pertama saya termasuk perhitungan untuk tahun kabisat.
Biola
Sql berikut dapat menangani kedua jenis input
TSQL, 154 byte
Fiddle Gabungan 1
Fiddle Gabungan 2
sumber
JavaScript (ES6), 84 byte
Dengan asumsi tidak ada tahun kabisat atau DST diperlukan, saya mengganti tahun dengan tahun 1970 yang
Date.parse
secara langsung mengembalikan waktu offset dalam milidetik, yang ada31536000000
pada tahun 1970 (atau memang tahun non-kabisat lainnya). Yang perlu saya lakukan adalah menambahkan kembali tahun dan putaran ke 5 tempat desimal. Sunting: Konversi dua arah dalam183178 byte:Asumsikan string yang berisi
:
format waktu, ditangani seperti di atas, jika tidak dilepaskan tahun, dikonversi ke milidetik, tambahkan setengah menit untuk tujuan pembulatan, dikonversi ke tanggal pada tahun 1970, ekstrak bulan, hari, jam dan menit, dan awali tahun asli.sumber
s
adalah argumen untuk fungsi.Matlab,
132115 bytePutaran menuju 0.
Hmmm ... Itu cukup panjang.
Itu menggunakan beberapa bawaan, tetapi bukan yang benar-benar bermanfaat - karena tahun kabisat.
Parsing string secara langsung memberikan 2 solusi byte lebih
Versi Matlab yang lebih baru mungkin memiliki beberapa fungsi pemisahan yang lebih baik, tapi saya sedang menjalankan 2012a.
Beberapa byte disimpan berkat @Luis Mendo
sumber
[-1 '# #"#"##"#"'-4]
untuk menyimpan beberapa byte. Apakahyear
fungsi standar dll? Jika Anda menggunakan kotak alat, Anda harus menunjukkannya dalam judul, misalnya "Matlab dengan Kotak Alat Keuangan"#
notasi dan bahkan tidak pernah menemukannya. Di mana saya dapat membaca lebih banyak tentang hal itu (pencarian cepat Google tidak membantu)? Saya pikiryear
dll adalah fungsi standar, tetapi saya tidak tahu apakah mereka berperilaku sama di luar toolbox (docs) .PowerShell v3 +, 131 byte
Mengambil input
$args[0]
dan mengubahnya denganGet-Date
untuk menyimpan ke dalam[datetime]
format .NET , menyimpan ke$t
. Hitung apakah 29 Februari ada, dan set$a
jadi kami kurangi nilai menit pada tanggal tersebut (jika ada).Kemudian kami menggunakan
-f
operator ormat dengan spesifikasi string tetap 5 angka desimal untuk menjalankan perhitungan. Gunakan built-in untuk menghitung.DayOfYear
dan.TotalMinutes
dari input yang diberikan, kurangi$a
jika ini tahun kabisat, bagi dengan525600
total menit, dan tambahkan pada input.Year
.Akan mengeluh (secara lisan) kepada STDERR jika 29 Februari tidak ada (lihat contoh di bawah), tetapi karena STDERR diabaikan secara default, kami tidak khawatir tentang itu. Juga, perhatikan bahwa PowerShell melakukan pembulatan bankir secara default.
Contohnya
Bergantian, dengan tahun kabisat, 119 byte
Jika kita mengikuti pengaturan kalender, kita dapat mengurangi selusin byte karena kita tidak perlu memperhitungkan
$a
dalam kode asli di atas. Ini memungkinkan kami untuk pindah$t
ke ekspresi itu sendiri, dan kami akan secara eksplisit menghitung.DayOfYear
untuk tanggal 31 Desember. Jika tidak, ikuti metodologi yang sama.sumber
Python 3,
163173 bytelebih banyak byte karena format output
tidak menggunakan tanggal bawaan apa pun, seperti jawaban java.
sedikit lebih mudah dibaca
sumber
Perl 6 ,
107 105102 bytePenjelasan:
Uji:
sumber