Orang Australia suka hari libur nasional, dan minum. Kemarin, 26 Januari, adalah hari Australia, yang merupakan hari libur umum. Saya senang tidak berada di tempat kerja kemarin, dan ingin tahu kapan saya mendapat libur umum! Sayangnya, saya terlalu banyak minum, dan saya tidak bisa mengatasinya sendiri.
Tulis program yang akan memasukkan tanggal dalam notasi tanggal / waktu Australia (dd / mm) sebagai input, dan tampilkan jumlah hari hingga hari libur umum berikutnya. Karena saya seorang penduduk Queensland (QLD), saya hanya tertarik pada hari libur nasional yang memengaruhi warga Queensland :
25/03 | Jumat Agung
26/03 | Sabtu Paskah
28/03 | Senin Paskah
25/04 | Hari Anzac
02/05 | Hari Buruh
03/10 | Ulang Tahun Ratu
25/12 | Hari Natal
26/12 | Boxing Day
27/12 | Liburan Hari Natal
Perhatikan hal berikut dari situs:
Liburan Hari Natal
Hari libur umum tambahan akan ditambahkan ketika Hari Tahun Baru, Hari Natal atau Boxing Day jatuh pada akhir pekan.
Karena hari Natal adalah pada hari Minggu, ada hari libur umum tambahan . Hari Natal masih menjadi hari libur umum.
Karena saya orang pagi, Anda harus memasukkan tanggal saat ini sebagai hari (karena itu kemungkinan besar saya akan memeriksa program Anda untuk hari libur umum berikutnya). Artinya, jika tanggal hari libur nasional dimasukkan, output Anda seharusnya 0
; jika hari sebelum hari libur dimasukkan, output Anda akan menjadi 1
.
Saya hanya tertarik pada tanggal antara sekarang (tanggal 27/01) hingga akhir tahun. Tanggal akhir yang harus Anda pertanggungjawabkan adalah 31/12 di mana output Anda akan berada 1
(untuk hari Tahun Baru).
Celah standar dilarang.
Memasukkan
- Input akan selalu 5 karakter: 4 huruf, dipisahkan dengan tanda hubung
-
atau garis miring/
- Input hanya akan berupa tanggal antara 27/01 dan 31/12
Keluaran
- Jumlah hari sampai hari libur umum berikutnya di Queensland Australia, termasuk tanggal input: harus berupa angka antara
0
dan153
(jeda terpanjang) - Tidak ada baris atau kesalahan baru
Contohnya
01-05 = 1
02-05 = 0
03-05 = 153
25/12 = 0
26-12 = 0
27/12 = 0
30/12 = 2
31-12 = 1
Semoga ini jelas dan tidak ada yang terlewatkan; Namun, ini adalah pertanyaan kedua saya jadi saya akan menghargai setiap umpan balik dan melakukan yang terbaik untuk memperbaiki masalah secepatnya.
Jawaban:
Pyth ,
98846267 BytesPembaruan: Disimpan 14 Bytes dengan memperpendek daftar hitungan hari untuk semua 12 bulan untuk perhitungan nomor hari. Belum menemukan cara yang baik untuk mengompres daftar yang lain, masih mencoba!
Update2: Menyimpan 22 byte lainnya dengan meng-endcoding daftar angka-hari sebagai string base256.
Cobalah online!
Algoritma yang sama seperti pada jawaban Python saya. Dan tidak ada builtin untuk mendapatkan hari dalam setahun, jadi saya harus melakukannya sendiri. Membuat 2 daftar itu untuk perhitungan hari-of-the-tahun dan untuk hari-hari liburan cukup mahal ... akan melihatnya lagi dan mencoba untuk menghasilkan mereka dalam byte lebih sedikit.
sumber
Visual Basic for Applications, 155 atau 118 byte
Versi 1 - lokal-independen, 155 byte
Versi 2 - tergantung pada lokal, 118 byte
Hitungan byte untuk file .BAS final, termasuk karakter linefeed. Diedit di luar editor VBA standar (karena membebankan ruang tambahan dan bentuk verbose dari beberapa kata kunci) - tetapi impor dan berjalan lancar pada Aplikasi Office apa pun (untuk menguji jenis misalnya
? h("10/08")
di jendela langsung, atau dalam penggunaan Excel langsung dalam formula sel).(EDITED) Awalnya saya memilih untuk menggunakan
DateSerial
fungsi locale-safe (versi 1). Karena saya tinggal di Brazil dan dengan demikian sistem saya dikonfigurasikan untuk menggunakan format "dd / mm / yy" untuk tanggal (seperti Australia), saya bisa menulis versi yang lebih kecil dengan menggunakanCDate
sebagai gantinya (versi 2).CDate
menggunakan informasi lokal sistem untuk mengonversi teks menjadi tanggal. Saya juga berasumsi dalam versi ini bahwa kode hanya akan dijalankan selama 2016 (jika tahun dihilangkan (-6 bytes)CDate
mengasumsikan tahun berjalan sesuai jam sistem).Angka 42454 pada baris ketiga adalah jumlah dari 42450 yang merupakan representasi numerik 01/01/2016 pada VBA, dan 84 yang merupakan hari-of-the-tahun untuk liburan pertama. Array berisi hari-of-the-year untuk setiap liburan (termasuk 01/01/2017) diimbangi dengan -84 karena ini akan menghilangkan beberapa digit. Menggunakan 16 bukannya 2016 pada
DateSerial
menghilangkan dua byte lagi.Membuat array identik sembilan kali di dalam iterasi adalah kode "buruk", tetapi berfungsi dan menyimpan 3 byte lebih (satu untuk nama array dan satu untuk tanda yang sama di luar loop, dan satu lagi untuk referensi array di dalam loop).
Ruang "hilang" antara 0 dan kata kunci berikut pada baris kedua dan keempat tidak diperlukan karena diperkenalkan kembali secara otomatis oleh VBE ketika modul diimpor. Digunakan usang tetapi byte-murah
If <...> Goto <linenumber>
untuk istirahat dari loop (keduanyaIf <...> Then Exit For
danIf <...> Then Exit Function
menggunakan lebih banyak karakter).Juga mengambil keuntungan dari fakta bahwa nama fungsi di VBA berperilaku sebagai variabel lokal, dan nilainya secara otomatis dikembalikan oleh fungsi di akhir eksekusi.
sumber
JavaScript (ES6),
131128 bytePenjelasan
Menggunakan
Date
konstruktor bawaan JavaScript untuk mengubah string input menjadi beberapa milidetik sejak zaman, lalu membandingkannya dengan jumlah milidetik untuk setiap hari libur umum.Ini dilakukan dengan menyimpan hari libur umum dalam array sebagai jumlah hari sejak tanggal referensi. Saya memilih
2016-01-29
untuk tanggal referensi karena jumlah milidetik sejak zaman dapat dipadatkan paling pendek untuk tanggal ini. Sejumlah milidetik antara hari ini dan selanjutnya berfungsi karena hasilnya dibulatkan ke bawah, dan mempertahankan angka di tengahnya menghindari efek penghematan siang hari (meskipun zona waktu OP tidak memiliki penghematan siang hari). Jumlah hari ini adalah1453986000000
dan membulatkannya menjadi1454000000000
(menambahkan beberapa jam) berarti dapat ditulis sebagai1454e9
.Uji
Solusi ini tergantung pada zona waktu pengguna. Ini berfungsi di zona waktu OP (dan saya) (GMT +1000). Jika Anda ingin mengujinya di zona waktu yang berbeda, menambah
numberOfHoursDifferentFromGMT1000 * 60 * 60 * 1000
nomor tanggal referensi harus berfungsi. (mis. GMT +0430 akan menjadi-5.5 * 60 * 60 * 1000 + 1454e9+n*864e5
)Tampilkan cuplikan kode
sumber
separated with a hyphen - or slash /
agak ambisius. Bagi saya itu berarti kita harus berurusan dengan keduanya, tetapi saya pasti bisa melihat sisi Anda. Tebak OP harus mengklarifikasi ini.T-SQL,
210,206, 194 Bytes(Posting pertama di sini, Semoga ini ok, tapi tolong bersikap baik :)
Masukan dimasukkan
@i
, melayani keduanya/
dan-
sebagai pemisah. Saya di Australia, jadi format tanggal saya sama dengan @TasPembaruan
varchar
untukchar
menghemat 3 byte plus menghapus ruang :)Perbarui 2 deklarasikan
@c
dan tetapkan tanpa pilihsumber
T-SQL, 296 byte
Dibuat sebagai fungsi bernilai tabel
Digunakan dengan cara berikut
Penjelasan singkat
sumber
JavaScript (ES6), 134 byte
user81655 masih membuat saya kalah 3 byte, tapi saya tidak dapat menemukan tempat lain untuk memeras apa pun dari sini. Bekerja dengan menghitung jumlah hari berlalu alih-alih menggunakan Tanggal, lalu membandingkannya dengan serangkaian offset liburan.
sumber
Python 2,
204185165166 BytesPembaruan: Dipotong turun ~ 20 Bytes dengan menghitung hari dalam setahun sendirian. Tidak perlu lagi impor lama :)
Perbarui 2: Lain 20 Bytes turun dengan menyadari bahwa saya dapat memperlakukan tahun baru seperti hari 367 dan membuat beberapa penyesuaian kecil lainnya.
Cobalah online!
Tidak Disatukan:
Bekerja dengan menyimpan jumlah hari libur dalam daftar, menyaring yang sebelum tanggal yang ditentukan, mengambil elemen pertama dalam daftar yang difilter dan mengurangi hari-tahun-tahun, yang dihitung dari input.
sumber
PHP, 116 byte
Pendekatan yang cukup lurus ke depan. Ini menyimpan hari-hari dalam setahun untuk liburan dan muncul selama mereka di masa lalu. Akhirnya hari yang diminta tahun itu dikurangi.
Melewati semua kasus uji. Berjalan dari baris perintah dan menerima input menggunakan tanda hubung, seperti:
sumber
ruby 1.9.3,
155153 byteSetelah liburan Hari Natal, kami membutuhkan 366 hari istimewa kami! Kasus serupa dengan @DenkerAffe.
Pemakaian:
sumber
05AB1E , 45 byte
Mungkin bukan 2016 lagi, tapi apa pun ..;) Masih menganggap tahun ini 2016 demi tahun kabisat
29
untuk Februari.Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
Lihat ini 05AB1E ujung tambang (bagian Cara kompres bilangan bulat besar? Dan Cara daftar bilangan bulat kompres? ) Untuk memahami mengapa
•9JRt€ª´Q®Ië•
adalah10549819042671399072072399
;•9JRt€ª´Q®Ië•368в
adalah[85,86,88,116,123,277,360,361,362,367]
; dan•Σ₁t•
adalah5354545
.sumber