Berapa hari dalam sebulan?

25

Diberikan representasi tekstual (nama lengkap tidak peka huruf atau singkatan 3 karakter) sebulan mengembalikan jumlah hari dalam sebulan.

Sebagai contoh, december, DEC, dan decsemua harus kembali 31.

Februari dapat memiliki 28 atau 29 hari.

Asumsikan input adalah sebulan di salah satu bentuk yang benar.

qw3n
sumber
19
Anda mungkin harus mencantumkan semua variasi nama bulan yang dapat kami terima.
Giuseppe
1
Bagi siapa saja yang dapat menggunakannya, jumlah ordinal ASCII dari 3 karakter pertama yang diturunkan adalah unik.
manusiawi
19
Itu jauh, terlalu cepat untuk menerima solusi.
Shaggy
5
saya pikir ini akan lebih baik jika input hanya bulan dalam format tetap, karena format sekarang pada dasarnya memerlukan konversi ke kasus tetap dan hanya melihat 3 huruf pertama.
xnor
4
Seperti berdiri sepertinya Anda ingin jawaban untuk menangani semua bentuk terdaftar - "Sebagai contoh, december, DEC, dan decharus semua kembali 31" - Apakah itu niat?
Jonathan Allan

Jawaban:

4

Pyke , 9 byte

l4C9@~%R@

Coba di sini!

l4        -   input.title()
    @     -  v.index(^)
  C9      -   ['PADDING', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
        @ - v[^]
     ~%R  -  ['Padding', 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

Atau 15 byte jika semua format input diperlukan

l43<C9 3L<@~%R@

Coba di sini!

l43<            -   input.title()[:3]
          @     -  v.index(^)
    C9 3L<      -   ['PAD', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
              @ - v[^]
           ~%R  -  ['Padding', 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
Biru
sumber
6
Ini mengembalikan 31 untuk FEB.
Laikoni
2
Saya percaya @ titik Laikoni adalah valid (juga mengembalikan 31 untuk Apr, Jun, Sep, dan Nov) tetapi juga berpikir bahwa itu memerlukan klarifikasi kecil di OP (lihat saya pertanyaan ).
Jonathan Allan
@ JonathanAllan Baiklah, OP telah menerima jawaban ini, jadi saya kira itu valid?
Erik the Outgolfer
4
@EriktheOutgolfer Saya tidak akan langsung mengambil kesimpulan itu secara pribadi.
Jonathan Allan
Saya mendapat kesan bahwa itu hanya perlu bekerja untuk satu bentuk input
Biru
33

JavaScript (ES6),  48 47 44 43  42 byte

m=>31^'311'[parseInt(m[1]+m[2],34)*3%49%8]

Demo

Bagaimana?

Operasi-operasi ini mengarah ke tabel pencarian 8 entri, yang tidak akan sangat menarik jika nilai-nilai didistribusikan secara acak. Tetapi hasil apa pun yang lebih besar dari 2 dipetakan hingga 31 hari. Karena itu, hanya 3 entri pertama yang perlu disimpan secara eksplisit.

Month | [1:2] | Base 34 -> dec. | * 3  | % 49 | % 8 | Days
------+-------+-----------------+------+------+-----+-----
  JAN |    AN |             363 | 1089 |   11 |   3 |  31
  FEB |    EB |             487 | 1461 |   40 |   0 |  28
  MAR |    AR |             367 | 1101 |   23 |   7 |  31
  APR |    PR |             877 | 2631 |   34 |   2 |  30
  MAY |    AY |              10 |   30 |   30 |   6 |  31
  JUN |    UN |            1043 | 3129 |   42 |   2 |  30
  JUL |    UL |            1041 | 3123 |   36 |   4 |  31
  AUG |    UG |            1036 | 3108 |   21 |   5 |  31
  SEP |    EP |             501 | 1503 |   33 |   1 |  30
  OCT |    CT |             437 | 1311 |   37 |   5 |  31
  NOV |    OV |             847 | 2541 |   42 |   2 |  30
  DEC |    EC |             488 | 1464 |   43 |   3 |  31
Arnauld
sumber
14
jujur ​​bagaimana Anda terus membuat kiriman aneh yang menakjubkan ini dengan hal-hal gila matematika D: apakah Anda memiliki program untuk menemukan ini atau apakah Anda terlalu baik untuk kita semua
HyperNeutrino
1
@HyperNeutrino Hal pertama yang saya coba adalah selalu menemukan konversi basis, diikuti oleh perkalian opsional diikuti oleh satu atau beberapa operasi modulo. Yang ini ditemukan dengan cepat seperti itu. Tetapi saya salah membaca tantangan dan pertama kali berpikir bahwa ini .substr(0,3)tidak diperlukan. Jadi, setelah dipikir-pikir, ini mungkin bukan pendekatan terbaik.
Arnauld
substr? slice!
Neil
Pendekatan sepele saya hanya <s> 2 </s> 3 byte lebih lama sehingga mungkin tidak optimal lagi karena itu, tapi masih sangat mengesankan :)
HyperNeutrino
1
Suntingan seseorang menghapus bagian itu, tetapi salah satu alasan saya awalnya tidak mengizinkannya adalah saya ingin melihat jawaban seperti ini. Saya suka menggunakan basis 34 untuk menghindari masalah kapitalisasi dan format yang berbeda.
qw3n
15

Javascript (ES6), 36 33 byte

-3 byte terima kasih kepada @JustinMariner dan @Neil

m=>31-new Date(m+31).getDate()%31

Maaf @Arnauld, menyalahgunakan keanehan JavaScript lebih pendek dari konversi basis mewah Anda.

Bagaimana itu bekerja

Untuk beberapa alasan, JavaScript memungkinkan memasukkan tanggal di luar bulan yang ditentukan. Kode menghitung berapa hari di luar bulan tanggal untuk menentukan berapa hari di dalam bulan. Contoh:
"FEB31"Thu Mar 02 200031 - 2 % 3129
"October31"Tue Oct 31 200031 - 31 % 3131

Uji kasus

Herman L.
sumber
MS Excel juga melakukan ini .. 0 Januari selalu Hari Terakhir Desember, jadi = HARI ("00/01/2017") akan menghasilkan 31
DavChana
Sepertinya Javascript hanya membolehkan string tanggal di mana hari ini mencapai 31. Jika Anda mencoba memasukkan "feb 32", itu diterjemahkan ke 2032-02-01, dan jika Anda mencoba memaksanya dengan "0-feb-32" (atau string serupa), ia hanya mengatakan "Tanggal Tidak Valid". Anehnya, jika Anda menetapkan hari ke 0 ("feb 0"), itu diterjemahkan ke 2000-02-01 daripada 2000-01-31.
TehPers
Anda mungkin dapat menghemat satu byte dengan menjatuhkan spasi sebelumnya 31. Tampaknya berfungsi di Chrome sebagai new Date("feb31")contoh.
Justin Mariner
Bahkan Anda mungkin bisa menggunakan +31penghematan tiga byte secara keseluruhan. Namun semua ini tidak berfungsi di Firefox.
Neil
11

Python 2 , 46 45 38 byte

-1 byte terima kasih kepada @totallyhuman

lambda m:29-int(m[1:3],35)%238%36%-5/2

Cobalah online!

ovs
sumber
45 byte
manusiawi
7

Bash , 21 byte

cal $1|xargs|tail -c3

Cobalah online!

Mengambil input sebagai argumen baris perintah dan menghasilkan dengan baris baru tambahan. Hitungan hari untuk Februari tergantung pada tahun berjalan

Membutuhkan util-linux 2,29 versi cal, yang merupakan salah satu yang tersedia di TIO . Juga tergantung pada lokal, jadi LC_TIME harus diubah pada sistem non-Inggris (terima kasih @Dennis untuk klarifikasi).

Ide pemipaan melalui xargsuntuk memangkas caloutput adalah dari jawaban SO ini .

Justin Mariner
sumber
2
Ini bukan hanya bash. Biasanya ini adalah sh, tetapi mungkin hampir setiap implementasi shell yang mendukung pencarian path dan pipa, pada sistem dengan kal, ekor dan xarg.
kojiro
5

Proton , 50 byte

k=>31-((e=k.lower()[1to3])in"eprunov")-3*(e=="eb")

Cobalah online!

-14 byte terima kasih kepada Jonathan Frech

Tiga puluh hari telah September, April, Juni, dan November. Yang lainnya punya selai kacang. Semua kecuali nenekku; dia punya sepeda roda tiga merah, tapi aku mencurinya. muahahahahaha

(Saya sudah menunggu untuk menceritakan lelucon itu (sumber: profesor matematika saya) untuk waktu yang lama di situs ini: D: D: D)

HyperNeutrino
sumber
@Riker oh whoops yang tidak ada di sana ketika saya mulai menulis ini: /
HyperNeutrino
1
Ada aturan baru yang harus Anda periksa bukan bulan yang valid dan kembali 0. Saya harap itu dihapus
Level River St
1
Nevermind changing Saya menghapus bagian itu
qw3n
Saya pikir Anda dapat menggunakan string tunggal 'sepaprjunnov'alih-alih daftar string.
Jonathan Frech
@ JonathanFrech mungkin; Saya akan mencobanya, terima kasih
HyperNeutrino
4

C # (.NET Core) , 52 + 13 = 65 38 + 24 = 62 byte

m=>D.DaysInMonth(1,D.Parse(1+m).Month)

Cobalah online!

+24 untuk using D=System.DateTime;

Ucapan Terima Kasih

-3 byte terima kasih kepada Grzegorz Puławski.

Ayb4btu
sumber
Apakah ini berhasil tanpa using System;? Atau bisakah Anda mengecualikannya dari jumlah byte?
Matty
@Matty Itu poin yang bagus; sekarang ditambahkan.
Ayb4btu
Tip terlambat, tetapi -3 byte: using D=System.DateTime;dan m=>D.DaysInMonth(1,D.Parse(1+m).Month)seperti di sini: tio.run/##jc5BSwMxEAXgs/…
Grzegorz Puławski
3

Python 3 , 60 byte

x=input().lower()[1:3];print(31-(x in"eprunov")-3*(x=="eb"))

Cobalah online!

Porting solusi Proton saya

-10 byte terima kasih untuk benar-benar manusia

HyperNeutrino
sumber
Lebih baik daripada milikku heh
Thomas Ward
1
um
manusiawi
: P bawaan terkadang terlalu panjang: P
HyperNeutrino
@ benar-benar manusia oh rly wow. Terima kasih +1: P
HyperNeutrino
2
umm
totallyhuman
2

AWK , 45 44 byte

L=tolower($1){$0=L~/v|p|un/?30:L~/f/?28:31}1

Cobalah online!

Robert Benson
sumber
2

Python 3 - 93 86 84 82 byte

Varian jawaban (menunjukkan progres waktu, dan byte untuk masing-masing, dengan tautan TIO):

Jawaban Asli (93 byte)

-7 byte terima kasih kepada Jonathan Frech. (86 byte)

-2 byte lebih banyak berkat pengujian saya sendiri lebih lanjut dari monthrangehasil, dengan nilai kedua selalu menjadi nilai yang lebih tinggi. (84 byte) 1

-2 lebih banyak dengan menggunakan import calendar as cdan merujuk dengan c.monthrange. (82 byte, revisi saat ini )


lambda x:c.monthrange(1,time.strptime(x[:3],'%b')[1])[1];import time,calendar as c

Jelas tidak sebaik jawaban HyperNeutrino yang tidak menggunakan built-in, tetapi ini masih berfungsi.


Catatan kaki

1 : Uji kasus melalui TIO.run yang menunjukkan bukti bagaimana saya menangani monthrangenilai - nilai itu, untuk berbagai kasus uji bulan.

Thomas Ward
sumber
86 byte .
Jonathan Frech
@JonathanFrech Terima kasih. Lebih lanjut direvisi ke bawah oleh saya telah menguji lebih banyak tentang cara kerja bulanan, dan juga dengan menggunakan import ...,calendar as csehingga tidak harus mengetik 'kalender' dua kali.
Thomas Ward
2

Perl 5 , 47 +1 ( -p) = 48 byte

$_=substr$_,1,2;$_=31-("eprunov"=~/$_/i)-3*/b/i

Cobalah online!

Xcali
sumber
-6 byte: ($_)=/.(..)/;bukannya $_=substr$_,1,2;dan ()sekitar "eprunov"=~/$_/ibisa dihapus.
Nahuel Fouilleul
2

Haskell , 65 63 62 byte

f.map((`mod`32).fromEnum)
f(_:b:c:_)|c<3=28|c>13,b>3=30
f _=31

Cobalah online!

Pendekatan pencocokan pola. Baris pertama adalah menangani case-insensitivity. Kemudian kita kembali 28jika huruf ketiga lebih kecil dari C (angka 3), 30jika huruf kedua lebih besar dari C dan yang ketiga lebih besar dari M, atau 31sebaliknya.

Sunting: -1 byte terima kasih kepada Leo


Alternatif ( 65 64 byte)

f s|let i#n=n<mod(fromEnum$s!!i)32=sum$29:[2|2#2]++[-1|2#13,1#3]

Cobalah online!

Laikoni
sumber
1
Yang pintar! Anda dapat menyimpan byte dengan memeriksa c<3alih - alih a==6(Februari adalah bulan pertama jika Anda memesannya dengan huruf ketiga, diikuti Desember)
Leo
2

APL (Dyalog) , 32 byte *

Fungsi awalan Tacit. Asumsikan ⎕IO( I ndex O rigin) 0, yang merupakan default pada banyak sistem.

31 28 30⊃⍨∘⊃'.p|un|no|f'S 11

Cobalah online!

⍠1 kasus tidak sensitif

1 mengembalikan panjang

⎕S PCRE S earch untuk

'.p|un|no|f' any-char, "p" atau "un" atau "no" atau "f"

⊃⍨∘⊃ dan gunakan elemen pertama dari itu (0 jika tidak ada) untuk memilih

31 28 30 daftar ini

Demikian:

  • Ap r, S ep , J un , dan No v akan memilih angka pada indeks 2, yaitu 30

  • F eb akan memilih angka pada indeks 1, yaitu 28

  • yang lain akan memilih angka pada indeks 0, yaitu 31


* Menggunakan Klasik dan menghitung sebagai ⎕OPT.

Dyalog APL
sumber
2

Templat Mediawiki, 19 byte

{{#time:t|{{{1}}}}}
tsh
sumber
1

MATL , 22 byte

14L22Y2c3:Z)Z{kj3:)km)

Cobalah online!

Penjelasan

14L    % Push numeric array of month lengths: [31 28 ... 31]
22Y2   % Push cell array of strings with month names: {'January', ..., 'December'}
c      % Convert to 2D char array, right-padding with spaces
3:Z)   % Keep first 3 columns
Z{     % Split into cell array of strings, one each row
k      % Convert to lower case
j      % Input string
3:)    % Keep first 3 characcters
k      % Convert to lower case
m      % Ismember: gives a logical index with one match
)      % Use that as index into array of month lengths. Implicit display
Luis Mendo
sumber
1

Bahasa Wolfram (Mathematica) , 46 30 byte

#~NextDate~"Month"~DayCount~#&

Cobalah online!

Akan memberi salah satu 28 atau 29untuk Februari tergantung pada apakah tahun ini adalah tahun kabisat.

Bagaimana itu bekerja

Semua perintah date dalam Mathematica akan menafsirkan input seperti April, APR, ApRiL, dan sebagainya sebagai hari pertama bulan sesuai dalam tahun berjalan. (Sebagai bonus, masukan seperti "February 2016"atau {2016,2}juga berfungsi seperti yang diharapkan.)

#~NextDate~"Month"memberikan hari pertama bulan setelah itu, dan DayCountmemberikan jumlah hari di antara dua argumennya. Jumlah hari antara 1 April dan 1 Mei adalah 30, jumlah hari pada April.

Misha Lavrov
sumber
1

Java 8 , 47 byte

m->31-new java.util.Date(m+"31 1").getDate()%31

Cobalah online!

Akhirnya menggunakan ide yang sama dengan jawaban Herman Lauenstein JS , di mana pengaturan tanggal ke 31 mendorong ke bulan berikutnya. Java memang membutuhkan satu tahun, jadi itu sudah diatur ke 1.

Justin Mariner
sumber
1

Retina , 32 31 28 byte

i`f
28
i`p|v|un
30
\D

^$
31

Cobalah online! Sunting: Disimpan 1 byte berkat @RobertBenson. Disimpan 3 byte berkat @ovs.

Neil
sumber
Saya percaya Anda bisa menyimpan byte dengan menggunakan 'f' bukannya 'eb'
Robert Benson
28 byte
ovs
1

q / kdb +, 36 byte

Larutan:

28 30 31@2^1&(*)"ebeprunov"ss(_)1_3#

Contoh:

q)28 30 31@2^1&(*)"ebeprunov"ss(_)1_3#"January"
31
q)28 30 31@2^1&(*)"ebeprunov"ss(_)1_3#"FEB"
28
q)28 30 31@2^1&(*)"ebeprunov"ss(_)1_3#"jun"
30

Penjelasan:

Ada sejuta cara untuk menguliti kucing. Saya pikir sedikit berbeda dengan yang lain. Ambil huruf ke-2 dan ke-3 dari input, kecilkan, kemudian cari di dalam string "ebeprunov". Jika mereka berada di lokasi 0, maka ini adalah Februari, jika mereka berada di lokasi> 0 mereka adalah 30 hari, jika mereka tidak berada dalam string, mereka adalah 31 hari.

28 30 31@2^1&first"ebeprunov"ss lower 1_3# / ungolfed solution
                                        3# / take first 3 items from list, January => Jan
                                      1_   / drop the first item from the list, Jan => an
                                lower      / lower-case, an => an
                  "ebeprunov"ss            / string-search in "ebeprunov", an => ,0N (enlisted null)
             first                         / take the first, ,0N => 0N
           1&                              / take max (&) with 1, 0N => 0N
         2^                                / fill nulls with 2, 0N => 2
        @                                  / index into
28 30 31                                   / list 28,30,31
streetster
sumber
1

Excel VBA, 47 43 Bytes

Fungsi jendela langsung VBE anonim yang mengambil input, seperti nama bulan, singkatan, atau nomor, dari rentang [A1]dan menampilkan panjang bulan itu di tahun 2001 ke fungsi jendela langsung VBE.

?31-Day(DateValue("1 "&[A1]&" 1")+30)Mod 31

Versi lama

d=DateValue(["1 "&A1&" 1"]):?DateAdd("m",1,d)-d
Taylor Scott
sumber
1

PHP, 38 33 + 1 32 + 1 byte

Disimpan 5 byte berkat Titus

<?=date(t,strtotime("$argn 1"));

Jalankan sebagai pipa dengan -nF

Cobalah online!

Jo.
sumber
1
Hei, saya rasa Anda tidak perlu .' 1', sepertinya berfungsi pada TIO tanpa itu!
Dom Hastings
1
28 + 1 byte: <?=date(t,strtotime($argn));(dijalankan sebagai pipa dengan -nF)
Titus
3
@HomHastings - jadi, sebelum saya memposting, saya telah menguji untuk melihat apakah itu akan berhasil tanpa .' 1', tetapi tidak berhasil. Setelah melihat komentar Anda, saya mencoba mencari tahu kesalahan saya. Karena saya menjalankannya pada tanggal 31 di bulan itu, ia mengambil hari ke-31 (saat ini) untuk setiap bulan yang saya masukkan, yang akan membuatnya melampaui bulan saat ini. 31 Februari berubah menjadi 3 Maret, sehingga kode mengembalikan 31 (jumlah hari pada bulan Maret). Karena itu, setiap bulan mengembalikan 31. Jadi, ia berfungsi tanpa .' 1'pada hari apa pun <= 28 setiap bulan.
Jo.
Ahhh, saya lupa tentang bagaimana PHP mengisi kekosongan! Terima kasih telah menjelaskan!
Dom Hastings
@Itus Terima kasih. Saya seorang pemula golf! Saya tidak tahu mengapa saya tidak menyadari 't'-> t. Juga, saya harus melakukan banyak pencarian untuk mencari tahu bagaimana "berjalan sebagai pipa dengan -nF" tapi saya mendapatkannya (saya pikir). :)
Jo.
0

Java (OpenJDK 8) , 126 byte

s->{for(java.time.Month m:java.time.Month.values())if(m.name().startsWith(s.toUpperCase()))System.out.print(m.length(false));}

Cobalah online!

Roberto Graham
sumber
1
Saya pikir Anda dapat mempersingkat falsemenjadi ekspresi boolean ingin 1<0menyimpan beberapa byte.
Justin Mariner
0

QBIC , 49 35 byte

?31-(instr(@aprjunsepnov feb`,;)%3)

Secara signifikan lebih pendek dengan beberapa tipu daya.

Penjelasan

?                          PRINT
31-(                       31 minus
  instr(                   the position of
                      ,;   our input string
    @aprjunsepnov feb`  )  in the string cntaining all non-31 months                                
    %3)                    modulo 3 (this yields a 1 for each month except feb=2)
steenbergh
sumber
0

Ruby , 45 byte

->m{((Date.parse(m)>>1)-1).day}
require'date'

Cobalah online!

Ruby Date.parsemenerima satu bulan nama sendiri. Apa yang biasanya menjadi pergeseran kanan ( >>) sebenarnya menambah bulan Dateobjek. Pengurangan mempengaruhi hari dalam sebulan, yang akan membungkus mundur ke hari terakhir bulan sebelumnya.

Justin Mariner
sumber
0

Kotlin , 92 byte

val d={m:String->arrayOf(0,31,30,30,31,30,31,28,31,0,30)[(m[1].toInt()+m[2].toInt())%32%11]}

Cobalah online!

JohnWells
sumber