(Terinspirasi oleh Riddler minggu lalu di FiveThirtyEight.com. Posting Sandbox .)
Diberi tahun antara 2001 dan 2099, hitung dan kembalikan jumlah hari selama tahun kalender itu di mana mm * dd = yy
(di mana yy
tahun 2 digit ).
2018, misalnya, memiliki 5:
- 18 Januari (1 * 18 = 18)
- 9 Februari (2 * 9 = 18)
- 6 Maret (3 * 6 = 18)
- 3 Juni (6 * 3 = 18)
- 2 September (9 * 2 = 18)
Input dapat berupa tahun numerik 2 atau 4 digit.
Output harus berupa bilangan bulat. Ruang trailing opsional atau pengembalian tidak masalah.
Daftar input / output lengkap:
Input = Output
2001 = 1 2021 = 3 2041 = 0 2061 = 0 2081 = 2
2002 = 2 2022 = 3 2042 = 4 2062 = 0 2082 = 0
2003 = 2 2023 = 1 2043 = 0 2063 = 3 2083 = 0
2004 = 3 2024 = 7 2044 = 3 2064 = 2 2084 = 5
2005 = 2 2025 = 2 2045 = 3 2065 = 1 2085 = 1
2006 = 4 2026 = 2 2046 = 1 2066 = 3 2086 = 0
2007 = 2 2027 = 3 2047 = 0 2067 = 0 2087 = 1
2008 = 4 2028 = 4 2048 = 6 2068 = 1 2088 = 3
2009 = 3 2029 = 1 2049 = 1 2069 = 1 2089 = 0
2010 = 4 2030 = 6 2050 = 3 2070 = 3 2090 = 5
2011 = 2 2031 = 1 2051 = 1 2071 = 0 2091 = 1
2012 = 6 2032 = 3 2052 = 2 2072 = 6 2092 = 1
2013 = 1 2033 = 2 2053 = 0 2073 = 0 2093 = 1
2014 = 3 2034 = 1 2054 = 4 2074 = 0 2094 = 0
2015 = 3 2035 = 2 2055 = 2 2075 = 2 2095 = 1
2016 = 4 2036 = 6 2056 = 4 2076 = 1 2096 = 4
2017 = 1 2037 = 0 2057 = 1 2077 = 2 2097 = 0
2018 = 5 2038 = 1 2058 = 0 2078 = 2 2098 = 1
2019 = 1 2039 = 1 2059 = 0 2079 = 0 2099 = 2
2020 = 5 2040 = 5 2060 = 6 2080 = 4
Ini adalah tantangan kode-golf , jumlah byte terendah dalam setiap bahasa menang.
Pra-perhitungan dan hanya mencari jawaban biasanya dikecualikan sesuai aturan celah kami , tapi saya secara eksplisit mengizinkannya untuk tantangan ini. Hal ini memungkinkan untuk beberapa strategi alternatif yang menarik, meskipun tidak kemungkinan 98 99-item daftar lookup akan menjadi terpendek.
Jawaban:
Excel, 48 byte
Hore! Akhirnya, sesuatu yang sangat baik dimiliki oleh Excel.
Mengambil input dari A1 dalam bentuk bilangan bulat 1-99 yang mewakili tahun, dan menampilkan ke mana pun Anda memasukkan rumus ini. Ini adalah rumus array, jadi gunakan Ctrl-Shift-Enter, bukan Enter untuk memasukkannya.
Ini mengambil keuntungan dari fakta yang
COUNT
mengabaikan kesalahan, sehingga kesalahan yang disebabkan oleh bulan tidak membagi tahun (mengarahkan Excel untuk menguraikan sesuatu seperti2/12.5/25
atau dengan tanggal yang tidak valid, seperti2/29/58
, hanya diabaikan dalam hati.sumber
A1
. Memasuki tahun 4 digit hanya mengembalikan0
.Python 2 , 44 byte
Cobalah online!
Fungsi anonim yang diberikan sebagai objek metode. Memproduksi semua produk dari
(month, day)
pasangan(m, d)
yang dikodekan olehk=32*m+d
dengan0≤m≤12
,0≤d≤31
, membungkus di sekitar. Hilangkan 29-31 Februari dengan mengecualikan mereka dari jangkauan.sumber
Java (JDK 10) , 65 byte
Cobalah online!
Kredit
sumber
29*n
(m==2?29:32)
menjadi29+m%2*3
masih tampaknya memberikan semuaOK
hasil. Kredit untuk @AsoneTuhid 's Ruby jawabannya .PowerShell , 94 byte
Cobalah online!
Mengambil input sebagai tahun dua digit, kemudian membuat satu
for
loop dari1/1/year
ke12/9/year
(karena 12/10 dan seterusnya tidak akan pernah dihitung dan ini menghemat satu byte). Setiap iterasi, kami menambah$z
jika.Month
kali.Day
sama dengan tahun input kami. Di luar loop,$z
dibiarkan pada pipa dan output tersirat.Sunting - ini tergantung budaya. Kode di atas berfungsi untuk
en-us
. Format tanggal mungkin perlu diubah untuk budaya lain.sumber
Ruby ,
4642 byteCobalah online!
sumber
JavaScript (Node.js) ,
484443 byteCobalah online!
JavaScript (Node.js) ,
5958 byteCobalah online!
sumber
Jelly , 15 byte
Cobalah online!
Ambil angka dalam rentang
[0,100[
sebagai input.sumber
JavaScript (ES6), 91 byte
Saya ingin tahu bagaimana hardcoding dibandingkan dengan perhitungan berulang. Sudah pasti lebih lama (lihat jawaban @ Shaggy ), tetapi tidak terlalu lama.
Sunting : Ini, bagaimanapun, jauh lebih lama daripada formula yang lebih langsung (lihat @ l4m2 jawaban ).
Mengambil input sebagai integer dalam [1..99] .
Cobalah online!
Bagaimana?
Tahun ganjil memiliki kemungkinan lebih kecil untuk memiliki mm * dd = yy daripada tahun bahkan. Lebih konkretnya, tahun ganjil memiliki 0 hingga 3 pertandingan, sementara tahun bahkan memiliki 0 hingga 7 pertandingan. Ini memungkinkan kita untuk mengkodekan setiap pasangan tahun hanya dengan 5 bit, yang dapat dengan mudah direpresentasikan sebagai satu karakter dalam basis 36.
sumber
Perl 6 , 40 byte
Cobalah online!
sumber
Python 2 dan 3 ,
5552 byteCobalah online!
sumber
Utilitas Bash + GNU , 57
Perhatikan bahwa
seq
perintah selalu menghasilkan daftar 366 tanggal - untuk tahun non-kabisat 1 Januari tahun berikutnya akan dimasukkan. Namun dalam rentang tanggal 2001..2099, MM * DD tidak akan pernah menjadi YY untuk 1 Januari tahun berikutnya untuk tahun-tahun ini, jadi hari tambahan ini tidak akan mempengaruhi hasilnya.Cobalah online!
sumber
date
akan melakukan matematika tanggal seperti itu saat parsing.seq
tidak perlu spasi setelah-f
, sehingga Anda dapat menyimpan byte di sana.T-SQL,
123121 byteSesuai aturan IO kami , input diambil melalui tabel t yang sudah ada dengan bidang integer y , yang berisi tahun 2 digit.
Line break hanya untuk keterbacaan. Terinspirasi sebagian besar oleh solusi Excel Sophia .
CONCAT()
, yang tidakvarchar
konversi data tipe implisit . Kalau tidak, aku harus melakukan banyakCAST
atauCONVERT
pernyataan.ISDATE()
, yang mengembalikan 1 untuk tanggal yang valid dan 0 untuk tanggal yang tidak valid.y%m=0
) keWHERE
klausa untuk menyimpan 2 byte, terima kasih @RazvanSocol.Sayangnya, ini tidak jauh lebih pendek daripada versi tabel pencarian (menggunakan string dari versi osdavison ):
Pencarian T-SQL, 129 byte
EDIT : Meninggalkan dokumen asli saya di atas, tetapi kami dapat menyimpan beberapa byte dengan menggunakan beberapa fungsi baru:
STRING_SPLIT
tersedia dalam MS SQL 2016 ke atas.CONCAT_WS
tersedia dalam MS SQL 2017 ke atas.IIF
denganWHERE
MS-SQL 2017,
121118 byteMS-SQL 2017, edisi cheaty ekstra: 109 byte
Perlu Anda berada di
master
database, yang berisi tabel sistemspt_values
yang (ketika difilter olehTYPE='P'
), memberi Anda penghitungan angka dari 0 hingga 2048.sumber
m/d/y
) tergantung pada pengaturan lokalitas contoh SQL. Daerah lain mungkin memerlukan urutan yang berbeda, atau pemisah yang berbeda, tetapi menurut saya tidak akan memengaruhi panjang kode.SPLIT_STRING
bukannya CTE membawanya ke 120 byte. MenggunakanCONCAT_WS
alih-alihCONCAT
menyimpan karakter lain, membuatnya menjadi 119 byte.IIF
denganWHERE
.Julia 0,6 ,
494442 byteCobalah online!
-5 byte terinspirasi oleh jawaban Ruby Asone Tuhid.
-2 byte menggantikan hitungan dengan jumlah
Penjelasan:
Untuk setiap bulan
i
dari 1 hingga 12, hitungy/i
, dan periksa apakah itu salah satu dari hari-hari di bulan itu. Bulan dengan 31 hari adalah 1, 3, 5, 7, 8, 10, 12 - jadi mereka aneh di bawah 8 dan bahkan pada dan di atas 8. Jadi salah satui%2
ataui÷8
(yaitu 0 untuk i <8 dan 1 untuk i> = 8 di sini) harus 1, tetapi tidak keduanya - jadi kami XOR mereka. Jika hasil xor benar, kami memeriksa tanggal1:28+3
yaitu1:31
, kalau tidak, kami memeriksa tanggal saja1:28
.1:28
cukup untuk sisa bulan (peningkatan ini terinspirasi oleh jawaban Asone Tuhid's Ruby ) karena:untuk bulan Februari, satu-satunya kemungkinan adalah
2*29 = 58
, tetapi2058
bukan tahun kabisat, jadi kita dapat menganggap Feb selalu memiliki 28 hari.bulan-bulan lainnya dengan 30 hari adalah bulan ke 4 dan di atasnya - yang
i*29
(dani*30
) akan di atas 100, yang dapat diabaikan.Akhirnya, kami menghitung berapa kali
y/i
berada dalam daftar hari ini (dengan menggunakan boolean disum
sini), dan mengembalikannya.sumber
JavaScript,
9185828177 byteMengambil input sebagai string 2 digit (atau integer 1 atau 2 digit).
Mengambil keuntungan dari fakta yang
new Date
akan bergulir ke bulan berikutnya, dan terus melakukannya, jika Anda memberikannya nilai hari yang melebihi jumlah hari dalam bulan yang Anda berikan, jadi, pada iterasi pertama, ia mencoba untuk membangun tanggalyyyy-01-345
yang menjadiyyyy-12-11
, atauyyyy-12-10
pada tahun kabisat. Kami tidak perlu memeriksa tanggal setelah itu karena12*11+
menghasilkan angka 3 digit.3 byte disimpan berkat Arnauld .
Menguji
sumber
Python 2 ,
89846858 byteCobalah online!
sumber
Excel, 83 byte
Input ada di sel
A1
dalam formatyyyy
. Ini adalah rumus array dan dimasukkan dengan Ctrl+ Shift+ Enteruntuk mendapatkan kurung keriting{}
. Ini cukup mudah dan tanpa kepintaran.Ketika dalam rumus array,
DATE(A1,1,0)+ROW(1:366)
beri kami array dengan nilai tanggal 366. Pada tahun-tahun non-kabisat, ini akan termasuk 1 Januari tahun depan tetapi itu tidak menjadi masalah karena1*1=1
dan hanya akan dihitung sebagai false positive jika tahun berikutnya adalah2001
, tetapi karena rentang tahun yang diperlukan adalah2001 - 2099
, itu tidak akan pernah muncul sebagai isu.Jika Anda menyingkat sedikit menjadi sederhana
~
, rumusnya karena lebih mudah diikuti:Saya mencoba menggunakan
COUNTIF()
alih-alihSUM(IF())
tetapi Excel bahkan tidak membiarkan saya memasukkannya sebagai rumus array, apalagi memberi saya hasil. Saya memang menemukan solusi Google Sheets menggunakanCountIf()
tetapi metode yang sama kalau tidak ternyata menjadi 91 byte, terutama karena menggunakanArrayFormula()
bukan hanya{ }
.sumber
Retina 0.8.2 , 55 byte
Cobalah online! Membutuhkan waktu dua digit tahun; tambahkan 1 byte untuk mendukung tahun 4-digit. Penjelasan: Tahap pertama hanya dikonversi ke unary. Tahap kedua dimulai dengan mencocokkan 1 hingga 12 karakter sebelum posisi pertandingan, mewakili bulan, dan kemudian mencoba melihat ke depan untuk sejumlah pengulangan bulan itu. Namun, lookahead berisi persyaratan, yang memilih antara hingga 27 atau 30 pengulangan lebih lanjut tergantung pada bulan. Hitungan posisi pertandingan kemudian merupakan hasil yang diinginkan.
sumber
R ,
22122 byteCobalah online!
Memutuskan untuk pergi dengan pendekatan tabel pencarian. Tahun input harus 2 digit.
sumber
if
, karena input dapat berupa 2 digit atau 4 digit, pilihan Anda (sehingga Anda dapat memilih untuk hanya menerima input 2 digit). Tapi sepertinya kode menganggap setiap bulan mengandung 31 hari, jadi misalnya, 62 (untuk 2062) mengembalikan 1 di mana ia harus mengembalikan 0.C (gcc),
656059 bytePort Java user202729 jawaban . Cobalah online di sini . Terima kasih kepada Jonathan Frech untuk bermain golf 1 byte.
sumber
a=0,m=13;for(;
~>for(a=0,m=13;
.J , 29 byte
Cobalah online!
Bagaimana itu bekerja
Berusaha keras untuk mendapatkan di bawah 2 kali solusi Jelly :)
Catatan samping
Jika seseorang benar-benar ingin meng-hardcode data 99 digit, berikut ini sedikit informasinya:
Membagi 99 digit menjadi potongan 2 digit. Kemudian digit pertama adalah
<4
dan yang kedua<8
, yang berarti lima bit dapat mengkodekan dua angka. Kemudian seluruh data dapat dikodekan dalam 250 bit, atau 32 byte.sumber
Python 3 , 158
162215241byteDihapus 4 Terima kasih kepada Stephen untuk bermain golf bersyarat.
Dihapus 53 terima kasih Stephen untuk menunjukkan ruang putih
Dihapus 26 berkat tautan yang diberikan oleh caird
Saya cukup baru dalam hal ini. Tidak dapat memikirkan cara melakukan ini tanpa ada hari dalam sebulan yang dijelaskan.
Cobalah online!
sumber
(28if Y%4else 29)
dapat disingkat menjadi[29,28][Y%4>0]
. Juga, daftar panjang dapat disingkat menjadi[a,...]+2*[a,b,a,b,a]
.a,b,c
dapat ditambahkan dalam daftar parameter untuk menyimpan garis.int(str(Y)[2:])
dapat disingkat menjadiY%100
. Akhirnya, variabel counter sebagian besar dapat disingkat menjadilen
daftar pemahaman, ini juga memungkinkann
untuk dibuatlambda
. Ini menghasilkan 118 .Keempat (gforth) ,
6059 byteCobalah online!
Versi ini mengambil keuntungan dari kenyataan bahwa tidak boleh ada lebih dari 1 hari pencocokan per bulan, dan bahwa tahun harus dibagi berdasarkan bulan untuk mencocokkan.
Penjelasan
Iterate selama berbulan-bulan, periksa apakah tahun dapat dibagi berdasarkan bulan, dan jika hasil bagi adalah <31 (28 untuk Februari) Bulan setelah Maret tidak dapat mencocokkan dengan hari yang lebih besar dari 25, jadi kami dapat mengasumsikan semua bulan (selain Februari) punya 31 hari untuk tujuan puzzle.
Penjelasan Kode
[1] - Keempat memiliki konsep angka panjang ganda, yang disimpan di tumpukan sebagai dua angka panjang tunggal (dari bentuk xy, di mana nilai ganda = di
y * 2^(l) + x
mana l adalah ukuran dalam bit dari satu tunggal di implementasi yang sedang Anda kerjakan).Dalam kasus ini, saya membandingkan hasil bagi dan sisanya menjadi 32 (atau 29) 0. Jika sisanya lebih besar dari 0 (tahun tidak dibagi menurut bulan), ganda pertama akan secara otomatis lebih besar dari 32 (atau 29) 0 dan hasilnya akan salah. Jika sisanya adalah 0, maka itu memutuskan untuk secara efektif memeriksa hasil bagi <<32 (atau 29)
Keempat (gforth) , 61 byte
Cobalah online!
Menyimpan beberapa byte dengan menyadari bahwa hanya Februari yang penting dalam hal memiliki jumlah hari yang benar dalam sebulan
Penjelasan
Untuk (setidaknya gforth) perbandingan mengembalikan -1 untuk true dan 0 untuk false
sumber
Java (JDK 10) ,
797270 byteCobalah online!
sumber
d
&&
ke&
jawaban yang sama dengan jawaban Java OlivierGrégoire, meskipun ia telah menjawab 19 menit sebelumnya.JavaScript (Node.js) , 108 byte
sumber
Perl 5 , 68 byte
Cobalah online!
sumber
Python 3, 132 byte
Ini benar-benar program yang cukup lama, tetapi saya pikir ini mungkin menarik.
Semua nilai adalah antara 0-7 jadi saya menyandikan setiap angka dengan 3 bit dalam string biner yang panjang. Saya mencoba menempelkan string biner mentah ke dalam program python saya, tetapi saya tidak bisa membuatnya bekerja, jadi saya memilih base64 dalam file tersebut.
Saya menggunakan string berikut sebagai tabel pencarian (berakhir 7 digunakan untuk padding):
01223242434261334151533172234161321260115040331061312042410060032130113060021220420051013051110140127
Program mengambil string ini dan menerjemahkannya sebagai angka, lalu menggunakan bit shifting untuk mengekstrak hasilnya.
66 byte + file 37 byte = 103 byte
Ini membaca file biner yang dipanggil
e
dan menghindari penggunaan base64.Berikut ini adalah hexdump dari file baca (tanpa padding):
sumber
Haskell ,
6151 byteCobalah online!
Terinspirasi oleh xnor's Python 2 answer dan Laikoni.
sumber
f y=sum[1|i<-[1..12],mod y i<1,div y i<29+mod i 2*3]
Cobalah secara online!Oracle SQL, 115 byte
Kita dapat mencatat bahwa tidak terlalu penting berapa hari di bulan April (dan bulan-bulan berikutnya), sejak 100/4 <28. Juga tidak perlu memeriksa apakah tahun itu melompat atau tidak. Kami hanya perlu menentukan bahwa ada 28 hari di bulan Februari (bukan 29 karena validasi itu akan dieksekusi hanya untuk 2058 yang tidak melompat) jika tidak, mungkin hanya 31 untuk setiap bulan.
Pendekatan lain
Oracle SQL (12c Release 2 dan yang lebih baru), 151 byte
Oracle SQL (12c Release 2 dan yang lebih baru), 137 byte
Kedua solusi bisa menjadi 8 byte lebih pendek jika kita ganti
(select level l from dual connect by level<=12)
denganxmltable('1to 12'columns l int path'.')
tetapi Oracle melempar pengecualian karena bug (diuji pada versi 12.2.0.1.0, 18.3.0.0.0).Satu-satunya kasus di kedua solusi ketika tahun itu penting adalah 2058 yang non-lompatan sehingga literal '-1' digunakan untuk menentukan tahun non-lompatan.
Oracle SQL, 128 byte
Oracle SQL, 126 byte
Memperbarui
Oracle SQL, 110 byte
Oracle SQL, 108 byte
Spark SQL, 137 byte
Spark 2.3+ SQL, 126 byte
(
replace
fungsi menjadi tersedia)sumber
PHP , 73 byte
Menggunakan input pipa dan
php -nR
:Cobalah online!
PHP , 76 byte
Menggunakan input baris perintah arg
php dm.php 18
:Cobalah online!
Pendekatan berulang. Karena satu-satunya tahun kabisat yang terlihat adalah 2 * 29 = 58, dan 2058 bukan tahun kabisat, maka tidak perlu mempertimbangkan tahun kabisat pada hari-hari Februari. Dan karena sampul bukan masalah - mulai April hingga hari, lebih dari 25 hari akan melebihi 100, kami hanya mengatakan sisa bulan hanya memiliki 25 hari.
Input adalah 2 digit tahun melalui baris perintah (-10 byte sebagai program, terima kasih atas saran dari @Titus).
ATAU:
PHP , 101 byte
Cobalah online!
Masih berulang tetapi menggunakan fungsi timestamp PHP. Menerima tahun sebagai angka empat digit. Terima kasih kepada @Titus untuk saran penggunaan
strtotime()
alih-alihmktime()
.sumber
$m<5?$m-2?31:28:25
untuk yang pertama dan$d=strtotime("$y-1")
yang keduay
tanda kutip di tanda kutip?strtotime()
bukanmktime()
diimplementasikan kembali sebagai program, -7 byte. Juga, saya melihat sebagian besar kiriman, termasuk yang terpilih teratas, hanya akan menerima tahun sebagai 2 atau 4 digit, jadi saya akan menganggap itu berarti diserahkan kepada pengirim. Sekali lagi untuk saran!PHP,
7470 bytehanya menerima dua digit tahun.
Saya mengadopsi pertimbangan gwaugh dan bermain golf mereka; Pendekatan pertama saya lebih lama dari (92 byte):
%100
memungkinkan untuk menggunakan tahun 4-digit.Jalankan sebagai pipa dengan
-nR
atau coba online .sumber