Di situs web saya, pengguna memasukkan tanggal lahir dengan gaya xx.xx.xx
- tiga angka dua digit yang dipisahkan oleh titik. Sayangnya, saya lupa memberi tahu pengguna format yang digunakan. Yang saya tahu adalah bahwa satu bagian digunakan untuk bulan itu, satu untuk tanggal, dan satu untuk tahun. Tahun pasti di abad ke-20 (1900-1999), jadi formatnya 31.05.75
berarti 31 May 1975
. Juga, saya berasumsi semua orang menggunakan kalender Gregorian atau Julian.
Sekarang, saya ingin membuka database saya untuk membersihkan kekacauan ini. Saya ingin memulai dengan berurusan dengan pengguna dengan tanggal yang paling ambigu, yaitu, di mana kisaran tanggal yang mungkin adalah yang terbesar.
Misalnya, tanggal 08.27.53
berarti 27 August 1953
dalam kalender Gregorian atau Julian. Tanggal dalam kalender Julian adalah 13 hari kemudian, jadi rentangnya adil 13 days
.
Sebaliknya, notasi 01.05.12
dapat merujuk pada banyak kemungkinan tanggal. Yang paling awal adalah 12 May 1901 (Gregorian)
, dan yang terbaru adalah 1 May 1912 (Julian)
. Kisarannya adalah 4020 days
.
Aturan
- Input adalah string dalam format
xx.xx.xx
, di mana setiap bidang adalah dua digit dan nol-empuk. - Output adalah jumlah hari dalam kisaran.
- Anda dapat mengasumsikan bahwa input akan selalu menjadi tanggal yang valid.
- Anda tidak boleh menggunakan fungsi tanggal atau kalender bawaan.
- Kode terpendek (dalam byte) menang.
Testcases
01.00.31
=>12
29.00.02
=>0
(Satu-satunya kemungkinan adalah29 February 1900 (Julian)
)04.30.00
=>13
06.12.15
=>3291
5, May 1975
seharusnya31st
? Juga, apakah kita harus memperhitungkan tahun kabisat?Jawaban:
Pyth, 118 byte
Cobalah online: Demonstrasi atau Test Suite .
Pengetahuan yang diperlukan tentang Kalender Julian dan Gregorian
Kalender Julian dan Gregorian sangat mirip. Setiap kalender membagi satu tahun menjadi 12 bulan, masing-masing berisi 28-31 hari. Hari-hari yang tepat dalam sebulan adalah
[31, 28/29 (depends on leap year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
. Satu-satunya perbedaan antara kalender adalah definisi tahun kabisat. Dalam Kalender Julian setiap tahun yang dapat dibagi dengan 4 adalah tahun kabisat. Kalender Gregorian sedikit lebih spesifik. Setiap tahun yang habis dibagi 4 adalah tahun kabisat, kecuali tahun yang habis dibagi 100 dan tidak habis dibagi 400.Jadi di abad ke-20 hanya satu tahun yang berbeda. Tahun 1900, yang merupakan tahun kabisat dalam Kalender Julian, tetapi bukan tahun kabisat dalam Kalender Gregorian. Jadi satu-satunya tanggal, yang ada di satu kalender tetapi tidak di kalender lainnya adalah hari
29.02.1900
.Karena definisi tahun kabisat yang berbeda, ada perbedaan antara tanggal di Kalender Julian dan Kalender Gregorian. Perbedaan 12 hari untuk tanggal sebelum
29.02.1900
, dan 13 hari perbedaan untuk tanggal setelah29.02.1900
.Kode Pseudo Sederhana
Penjelasan Kode Lengkap
Bagian pertama
M++28@j15973358 4G&qG2!%H4
mendefinisikan fungsig(G,H)
, yang menghitung jumlah hari dalam sebulanG
dari setahunH
di Kalender Julian.Dan bagian selanjutnya hanyalah for for loop, dan ifs. Perhatikan bahwa saya menafsirkan
N
dalam format(month, year, day)
. Hanya karena menghemat beberapa byte.sumber
Perl 5 , 294 byte
Cobalah online!
298 byte saat spasi, baris baru, dan komentar dihapus.
Baris 1-4 menginisialisasi (jika tidak dilakukan)
%g
dan%j
hash di mana nilainya adalah angka hari Gregorian dan Julian yang dihitung dari Jaunary 1 1900 hingga 31 Desember 1999.Baris 5 memasukkan tanggal input ke dalam $ 1, $ 2 dan $ 3.
Baris 9 mencantumkan semua enam permutasi dari ketiga nomor input tersebut.
Jalur 8 mengubah enam angka itu menjadi dua angka masing-masing, angka Gregorian dan hari Julian, tetapi hanya mereka yang merupakan tanggal yang valid.
Jalur 7 memastikan hal itu, menyaring nomor hari yang tidak ada.
Baris 6 mengurutkan daftar nomor tanggal yang valid dari yang terkecil hingga yang terbesar.
Jalur 10 mengembalikan lalu perbedaan antara yang terakhir dan yang pertama (maks dan min), yang merupakan rentang yang diinginkan.
sumber