Tantangan ini cukup sederhana. Anda akan mengambil input yang akan menjadi satu tahun dari 1801 hingga 2400, dan menghasilkan apakah tahun kabisat atau tidak.
Masukan Anda tidak akan memiliki baris baru atau spasi tambahan:
1954
Anda akan menampilkan dengan cara apa pun yang Anda suka yang dengan jelas memberi tahu pengguna apakah ini tahun kabisat atau tidak (saya akan menerima y atau n untuk ya / tidak)
Anda bisa mendapatkan daftar tahun kabisat di sini: http://kalender-365.de/leap-years.php Saya akan mencatat bahwa tahun kabisat tidak selalu empat tahun selalu. 1896 adalah tahun kabisat, tetapi 1900 tidak. Tahun-tahun yang mengikuti "lewati" ini adalah:
1900
2100
2200
2300
Kasus uji:
1936 -> y
1805 -> n
1900 -> n
2272 -> y
2400 -> y
EDIT: Ini didasarkan pada kalender Gregorian standar: http://www.epochconverter.com/date-and-time/daynumbers-by-year.php
sumber
(divisible by 4)∧((divisible by 100)→(divisible by 400))
.Jawaban:
APL,
161412 karakterPengembalian
0
untuk tahun kabisat,1
untuk tahun yang tidak kabisat.Coba solusi ini di tryapl.org . Perhatikan bahwa saya telah mengubah solusi ke dfn
{≥/⌽×4 25 4⊤⍵}
karena tryapl.com tidak mendukung⎕
(ambil input pengguna). Perhatikan bahwa itu⎕
adalah kotak kosong, bukan karakter yang hilang.Solusi yang sama dalam J:
Penjelasan
Dyadic
⊤
(encode) mewakili argumen kanannya di dasar yang ditentukan oleh argumen kirinya. Saya menggunakan basis4 25 4
dalam solusi ini. Ini mewakili tahun y sebagai polinomialBiarkan proposisi α, β, dan γ mewakili jika a, b, dan c adalah nol: Proposisi γ salah jika y dapat dibagi dengan 4, β ∧ γ salah jika y dapat dibagi dengan 100 dan α ∧ β ∧ γ adalah false jika y dapat dibagi dengan 400.
Sebuah tabel kebenaran (
*
mewakili “tidak peduli”) adalah proposisi Δ mewakili jika y adalah lompatan-tahun Memperoleh:Pernyataan berikut ini menyatakan Δ dalam α , β , dan γ :
Karena struktur pernyataan ini, seseorang dapat menyatakan ¬Δ sebagai reduksi di
≥/⌽α β γ
mana ≥ mengimplementasikan ←. Ini mengarah pada jawaban yang saya jelaskan sekarang.sumber
Pyth, 11 byte
Program lengkap ini membaca dari STDIN dan mencetak True untuk tahun kabisat dan False sebaliknya.
Terima kasih kepada @Jakube untuk menyarankan Pyth dan pada dasarnya porting kode CJam saya.
Verifikasi sendiri kasus uji di Pyth Compiler / Executor .
Bagaimana itu bekerja
sumber
CJam, 12 byte
Program lengkap ini membaca dari STDIN dan mencetak 1 untuk tahun kabisat dan 0 sebaliknya.
Verifikasi sendiri kasus uji dalam juru bahasa CJam .
Bagaimana itu bekerja
sumber
r2/~~\e|i4%!
,r2/~~\~e|4%!
,r2/:~~\e|4%!
,r2/S*~\e|4%!
Dan 13 byter2/:~W%:e|4%!
r2/:i:\e|4%!
(12) danr2/:i(fe|~4%!
(13). Saya bahkan sudah mencoba GolfScript (yang tidak memerlukanr
), tetapior4
ditafsirkan sebagai token tunggal. Andai saja input memiliki baris tambahan ...Javascript (ES6), 21 karakter
Aturan standar adalah bahwa itu
y
adalah tahun kabisat jika 4 membagiy
dan jika 100 tidak membagiy
atau 400 tidak membagiy
. Dalam kode,Tidak perlu untuk itu 100 dan 400. Sebaliknya cukup untuk memeriksa apakah 16 atau 4 membagi y, dengan 16 dipilih jika 25 membagi y, 4 sebaliknya. Golf, ini menjadi
Fungsi javascript yang mengimplementasikan ini sepanjang 21 karakter:
Perl,
2826 karakterIde yang sama, tetapi dalam perl.
Jalankan menggunakan
-lp
opsi. Sebagai contoh,Dengan set tes sebagai input, ini menghasilkan
sumber
y=>...
) adalah fitur ES6.Pip , 13 byte
Yang ini lebih menarik daripada yang pertama kali muncul. Butuh beberapa penyelesaian, tapi akhirnya saya bisa mengganti referensi panjang
400
dengan4
danh
variabel (= 100).Output
1
untuk tahun kabisat,0
untuk tahun tidak kabisat. Penjelasan:sumber
Pyth,
191514 byteTerlalu mudah. Cobalah secara online: Demonstrasi atau Uji harness
edit: Tidak Terjawab, bahwa Anda dapat mencetak nilai-nilai Kebenaran / Kebohongan, bukan
n/y
. -4 bytesunting 2: Menggunakan ide akar kuadrat dari Martin. -1 byte
Penjelasan
sumber
Regex,
836238Terima kasih kepada Toby untuk tips tentang menggabungkan kedua bagian regex.
Jika kita fokus hanya pada kisaran 1801..2400 dan menganggap input bilangan bulat:
Tes di Ruby (
^
=\A
dan$
=\Z
karena Ruby) untuk rentang yang diinginkan:(Bonus) untuk sesuatu yang seharusnya bekerja tidak hanya untuk 1801..2400, tetapi untuk tahun non-negatif:
Tes di Ruby (
^
=\A
dan$
=\Z
karena Ruby) untuk 100000 tahun pertama:sumber
(?!)
Anda dapat menggabungkan dua bagian:(?!00)([02468][048]|[13579][26])(00)?$
- untuk 38. Itu tidak akan bekerja selama satu digit tahun.JavaScript ( ES6 ) 27
Peraturan:
(y%4==0) && (y%100!=0 || y%400==0)
Golf:
!(y%100<1&&y%400||y%4)
(terutama menggunakan hukum De Morgans )Fungsi yang menerapkan aturan:
Tes (jalankan di Firefox) hanya untuk memastikan:
sumber
!(y%(y%25?4:16))
sebagai ganti!(y%100<1&&y%400||y%4)
. Bagi mereka yang terganggu oleh operator ternary, Anda dapat menggunakan!(y%(4<<2*!(y%25)))
dan masih menyimpan tiga karakter!(y%100<1&&y%400||y%4)
.TI-BASIC,
20 17 1613Karena itu tokenized, TI-BASIC sering kompetitif di tantangan matematika sederhana, tetapi tidak yang ini karena tidak ada perintah "habis dibagi".Mungkin memang, tapi ini masih lebih lama dari CJam dan Pyth.Ini menggunakan metode David Hammond.
Kode lama 16 byte:
Tidak Disatukan:
fPart(
adalah "bagian pecahan"; eksponensial memiliki prioritas lebih tinggi daripada divisi. Dalam TI-BASIC, close-parens adalah opsional.Saya menggunakan perilaku
sub(
perintah tidak berdokumen , biasanya digunakan untuk mendapatkan substring: ketika argumennya adalah angka dan bukan string, itu membagi angka dengan 100. Ini akan bekerja pada kalkulator seri TI-83 atau 84.20 -> 17 dengan mengatur ulang kode untuk memungkinkan penghapusan parens dekat; 17 -> 16 dengan mengganti 400 dengan 16; 16 -> 13 dengan menggunakan ide David Hammond.
sumber
Stackylogic, 226 byte (tidak bersaing)
Ya itu benar. Saya membuat program di Stackylogic (non-TC), yang diciptakan oleh Helka Homba, untuk tantangan yang ditemukan di sini . Ini dibuat setelah tantangan, jadi non-bersaing.
Stackylogic hanya memiliki input biner, jadi 10 (atau lebih, lebih banyak digit akan diabaikan) bit biner harus digunakan (bit paling sedikit diinput dulu). Setiap tanggal di luar rentang yang ditentukan mungkin gagal, karena hanya memeriksa apa nomor yang dimasukkan: tidak mencakup tanggal yang tidak perlu
Tidak hanya ini tantangan pertama saya dengan stackylogic, tetapi tantangan pertama dengan stackylogic sama sekali.
Bersiaplah untuk kekacauan ini:
Ini membuat saya begitu lama untuk membuat, karena Stackylogic adalah bahasa yang paling membingungkan yang saya temui, dan sangat tidak dapat dibaca: Anda harus tahu bagaimana sisa program telah dijalankan sebelum Anda dapat membaca bagian saat ini sedang diedit. Saya bahkan harus menambahkan spasi untuk dibaca saat membuatnya.
Penjelasan kecil
Ini adalah penjelasan sederhana tentang apa yang dilakukannya.
Stackylogic tidak memiliki fungsi matematika, sehingga membuat ini lebih sulit. Saya harus hardcode sebagian besar, untuk memeriksa apakah itu nomor tertentu.
Pertama, program ini akan melakukan NOR dari bit paling tidak signifikan, membuangnya dalam proses. ini berarti bahwa jika itu dapat dibagi 4, itu akan melanjutkan ke bagian utama dari program, jika tidak output 0.
Kedua, pointer dibawa ke labirin stackylogic, dari sini, jika dua bit berikutnya adalah nol, maka akan langsung menghasilkan 1 (saat itu dapat dibagi oleh 16, dan jadi tahun kabisat terlepas dari kondisi lain), lainnya bijaksana itu akan memeriksa apakah itu bukan nomor yang dapat dibagi oleh 4 tetapi bukan tahun kabisat, antara 1801 dan 2400.
Untuk menjelaskan secara rinci, akan melibatkan membuat posting ini berkali-kali lebih lama dari yang sudah ada
sumber
Assembler IBM System Z - 56 byte.
(96 byte sumber. Sebelumnya
712384202 byte sumber, dapat dieksekusi 168 byte).Versi yang lebih kecil. Tidak lagi menyimpan register pemanggil, perubahan ke penyimpanan literal, mengubah mode pengalamatan.
Versi baru. Ini akan MENGGANTI dengan S0C1 jika tahun kabisat, dan mengulang jika tidak. Semoga memenuhi persyaratan menunjukkan hasil.
OK, jadi bukan yang terpendek (meskipun mungkin begitu kita melihat kode yang sebenarnya dieksekusi ditambah ukuran interpreter ...)
Keluaran:
ABEND S0C1 selama satu tahun kabisat, S222 (saat waktu CPU telah habis) jika tidak.
1936 Y 1805 N 1900 N 2272 Y 2400 Y(saat dijalankan beberapa kali)sumber
CJam,
1816 byteMemberi
1
(kebenaran) selama tahun kabisat dan0
(kepalsuan) sebaliknya.Jalankan semua test case di sini.
Penjelasan
sumber
Mathematica,
4027 byte, 17 karakterMenggunakan 17 karakter, tetapi 27 byte. Terima kasih kepada @alephalpha untuk tipnya. Perhatikan bahwa bilah vertikal sebenarnya adalah U + 2223 untuk pembagian. The
<U+F523>
harus diganti dengan karakter yang sesuai.sumber
∣
untuk mewakiliDivisible
:#∣4&&(!#∣100||#∣400)&
, 21 karakter, 27 UTF-8 byte.U+F523
(\[Implies]
) untuk membuatnya#∣4&&(#∣100<U+F523>#∣400)&
selama 19 karakter (tapi masih 27 byte).R, 29
Uji coba
sumber
C, 81
Saya bisa melakukan yang lebih pendek, tetapi yang ini tetap dengan tipe 'char', tanpa menguraikan argumen (misalnya dengan
atoi
):Itu harus dipanggil dengan nama 4 karakter, karena itu membuat asumsi standar bahwa argumen segera mengikuti nama program, dipisahkan oleh NUL. Lebih jauh, ini mengasumsikan bahwa argumen tunggal dikodekan dalam ASCII dan tidak memiliki ruang terdepan.
Penjelasan:
*v+9
adalah posisi digit 'puluhan' div[1]+2
.Jika karakter 'puluhan' dan 'unit' ditambahkan ke 96, kita berakhir di
00
, jadi buat cadangan dua karakter, sehingga 'puluhan' dan 'unit' menunjuk ke angka abad.Sekarang xor 'unit' dengan dua kali 'puluhan', mod 4. Ini berfungsi karena
10==±2 mod 4
, jadi bit yang lebih rendah dari 'puluhan' hanya dapat beralih bit 1 dari 'unit'. Kami menggunakan hasilnya sebagai indeks ke tabel sisa kami, mencetaky
hanya jika hasil modular adalah nol.sumber
Befunge -98, (41 byte)
Kesederhanaan itu luar biasa.
sumber
sed, 55
Perhatikan bahwa tahun non-kabisat dapat dicetak sebagai
n
atauN
tergantung pada apakah mereka genap atau ganjil. Saya menganggap ini sebagai interpretasi kreatif dari aturan yang memungkinkan alternatif untuk 'ya' dan 'tidak' tanpa menyebutkan bahwa mereka harus konsisten.sumber
Python2 - 37
g=lambda x:(x%4or x%400and x%100<1)<1
Perhatikan bahwa jika
a
bilangan bulat tidak negatif, makaa<1
cara menulisnya singkatnot bool(a)
. Yang terakhir<1
dengan demikian secara efektif mengubah ekspresi dalam tanda kurung menjadi boolean dan meniadakan hasilnya.Menerapkan fungsi
g
ke integern
antara 1801 dan 2400 akan kembaliTrue
jikan
merupakan tahun kabisat, danFalse
sebaliknya.sumber
KDB (Q), 27 byte
Penjelasan
Uji
sumber
Julia,
3028 byteIni menciptakan fungsi tanpa nama yang menerima argumen integer dan mengembalikan nilai boolean. Untuk menyebutnya, berikan nama, mis
f=y->...
.Tidak Disatukan:
Contoh:
sumber
PHP - 45 byte
Tidak ada yang istimewa benar-benar, hanya penyalahgunaan juggling.
sumber
C #, 23 byte
Cobalah online!
Sumber lengkap, termasuk uji kasus:
sumber
C,
373430 byteWandbox
sumber
T-SQL
3722 byteDisimpan 15 byte berkat komentar BradC.
Variabel hardcoded biasa karena kurangnya a
stdin
.misalnya
Maka solusinya adalah:
sumber
1
atau0
secara langsung:PRINT ISDATE(@+'0229')
Java 8,
49452220 byte-2 byte terima kasih kepada @ OlivierGrégoire .
Cobalah online.
Beberapa solusi 22 byte:
Cobalah online.
Cobalah online.
Cobalah online.
Penjelasan:
sumber
java.time.Year::isLeap
.n->n%(n%25<1?16:4)<1
Haskell, 19 byte
Cobalah online!
sumber
Javascript ES6, 32, 29, 26
Setiap baris berikut berfungsi:
sumber
C, 57 byte
Mengambil input dari stdin, dengan atau tanpa spasi tambahan / baris baru. Hanya bekerja pada mesin endian kecil (ya, seperti semua orang di BE hari ini). Output Y atau N.
Penjelasan
Tidak Disatukan:
Pertama,
scanf
baca tahun sebagai bilangan bulat di y. Kemudian, y adalah modulo'ed dengan 4 atau 400 tergantung pada apakah tahun tersebut dapat dibagi 100. Jika sisanya adalah nol, kode ASCII untuk Y ditugaskan ke y, jika tidak maka akan mendapatkan kode ASCII untuk N. Nilai dari y sekarang0x000000??
, di mana0x??
karakter yang ditugaskan. Berada di mesin little-endian, dalam memori ini disimpan sebagai?? 00 00 00
. Ini adalah string C diakhiri NULL, hanya berisi karakter yang ditugaskan. Alamat y diteruskan ke put dan char dicetak (dengan baris baru)sumber
main(y){scanf("%d",&y);y=!(y%(y%100?4:400))+48;puts(&y);}
. Saya bisa turun ke 48 byte jika saya bisa menampilkan baris kosong untuk tahun kabisat dan karakter apa pun (ASCII 1-99) jika tidak, tapi saya merasa seperti sedikit membengkokkan aturan. Apa yang kamu pikirkan?PowerShell, 31 byte
Saya senang mengatakan bahwa saya bermain golf ini lebih pendek dari builtin!
Output benar untuk tahun kabisat dan false jika tidak.
Dibangun:
Padahal, jika saya ingin meregangkan pernyataan 'dengan jelas memberi tahu pengguna apakah tahun kabisat atau bukan' dan melakukan sesuatu yang tidak standar, saya bisa menghemat 3 byte dan menggunakan:
Ini menghasilkan
0
untuk tahun kabisat dan 1 atau lebih tinggi untuk tahun tidak kabisat, yang saya tidak suka karena saya lebih suka mengembalikan nilai kebenaran standar yang lebih untuk tahun kabisat.sumber
LOLCODE,
228202159 byteTidak Disatukan:
Dalam Python ungolfed, karena LOLCODE membingungkan:
sumber
WIN
..