Bir ayda kaç gün var?


25

Bir ayın yazılı bir gösterimi (büyük / küçük harf duyarlı tam adı veya 3 karakter kısaltması) verildiğinde, ay içindeki gün sayısını döndürün.

Örneğin, december, DECve dectüm 31 dönmelidir.

Şubat, 28 veya 29 gün sürebilir.

Girişin doğru formlardan birinde bir ay olduğunu varsayalım.


19
Muhtemelen kabul edebileceğimiz tüm ay isimlerinin çeşitlerini listelemelisiniz.
Giuseppe

1
Kullanabilecek herhangi biri için, indirilen ilk 3 karakterin ASCII sıralı toplamları benzersizdir.
tamamen insan

19
Bir çözümü kabul etmek için henüz çok erken.
Shaggy,

5
Bence girdi sadece sabit bir formatta ay olsaydı daha iyi olurdu, çünkü format şimdi temelde sabit bir duruma dönüşmeyi ve sadece ilk 3 harfe bakmayı gerektiriyordu.
xnor

4
"Örneğin, - o listelenen formların tüm işlemek için cevaplar istiyorum benziyor haliyle december, DECve decgereken tüm dönüşünü 31" - niyeti bu mu?
Jonathan Allan

Yanıtlar:


4

Pyke , 9 bayt

l4C9@~%R@

Burada dene!

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]

Tüm giriş formatları gerekliyse 15 bayt

l43<C9 3L<@~%R@

Burada dene!

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]

6
Bunun için 31 döndürür FEB.
Laikoni

2
Ben Laikoni en noktası (aynı zamanda için 31 döndüren geçerlidir @ inanıyoruz Apr, Jun, Sep, ve Nov) aynı zamanda (benim bakınız OP biraz açıklama gerektirir düşünüyorum soruyu ).
Jonathan Allan,

@JonathanAllan Peki, OP bu cevabı kabul etti, sanırım geçerli mi?
Outgolfer Erik

4
@EriktheOutgolfer Ben bu sonuca şahsen atlamayacağım.
Jonathan Allan,

Sadece bir çeşit girdi için çalışmanın gerekli olduğu izlenimi altında kaldım
Blue

33

JavaScript (ES6),  48 47 44 43  42 bayt

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

gösteri

Nasıl?

Bu işlemler, 8 sonuçtan oluşan bir arama tablosuna götürür; bu, eğer değerler rastgele dağıtılırsa ilginç olmazdı. Ama daha herhangi sonuç büyüktür 2'ye eşleştirilmiş 31 gün. Bu nedenle, yalnızca ilk 3 girişin açıkça kaydedilmesi gerekir.

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

14
dürüst olmak gerekirse, dünyada nasıl bu inanılmaz garip teslimleri çılgın matematik
şeyleriyle

1
@HyperNeutrino Denedim ilk şey her zaman bir temel dönüşüm bulmak, ardından bir veya birkaç modulo işleminin ardından isteğe bağlı bir çarpma olduğunu. Bu, hızlı bir şekilde bu şekilde bulundu. Ancak bu mücadeleyi yanlış anladım ve .substr(0,3)bunun gerekli olmadığını düşündüm . Dolayısıyla, ikinci düşüncede, bu en iyi yaklaşım olmayabilir.
Arnauld,

substr? slice!
Neil

Benim önemsiz yaklaşımım sadece <s> 2 </s> 3 bayt daha uzun, bu yüzden artık daha uygun olmayabilir, ama yine de çok etkileyici :) :)
HyperNeutrino

1
Birinin düzenlemesi bu bölümü kaldırdı, ancak başlangıçta izin vermeme nedenlerinden biri, bunun gibi cevapları görmek istiyordum. Büyük harf kullanımı ve farklı biçimlerden kaçınmak için 34 tabanını kullanmayı seviyorum.
qw3n

15

Javascript (ES6), 36 33 bayt

@JustinMariner ve @Neil sayesinde -3 bayt

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

Maalesef @Arnauld, JavaScript tuhaflığını kötüye kullanmak, fantezi temel dönüşümlerinizden daha kısa.

Nasıl çalışır

Bazı nedenlerden dolayı, JavaScript belirtilen ayın dışındaki tarihlerin girilmesine izin verir. Kod, ayın kaç günü olduğunu belirlemek için tarihin ayın dışında kaç günü olduğunu sayar. Örnekler:
"FEB31"Thu Mar 02 200031 - 2 % 3129
"October31"Tue Oct 31 200031 - 31 % 3131

Test durumları


MS Excel de bunu yapıyor .. 0 Ocak her zaman Aralık Son Gün, yani = DAY ("00/01/2017") 31 ile sonuçlanacak
DavChana

Javascript, yalnızca günün 31'e kadar olduğu tarih dizgilerine izin veriyor gibi görünüyor. "Feb 32" girmeye çalışırsanız, 2032-02-01'e çevirir ve "0-feb-32" ile zorlamaya çalışırsanız (veya benzer bir dize), sadece "Geçersiz Tarih" diyor. İşin garibi, günü 0 ("feb 0") olarak ayarlarsanız, 2000-01-31 yerine 2000-02-01 olarak değişir.
TehPers

Önündeki boşluğu bırakarak bir bayt kaydedebilirsiniz 31. new Date("feb31")Örneğin Chrome'da çalışıyor gibi görünüyor .
Justin Mariner

Aslında, muhtemelen +31toplamda üç bayt tasarrufu kullanabilirsiniz . Bunların hiçbiri Firefox'ta çalışmıyor.
Neil,


7

Bash , 21 bayt

cal $1|xargs|tail -c3

Çevrimiçi deneyin!

Komut satırı argümanı olarak girdi alır ve sonunda yeni bir satır yazar. Şubat için gün sayısı, bu yılınki

Gerektirir util-linux 2.29 sürümünü calbiridir TIO geçerli . Ayrıca yerel ayarlara bağlıdır, bu nedenle İngilizce olmayan sistemlerde LC_TIME değiştirilmelidir (açıklama için teşekkürler @Dennis).

Aracılığıyla borulama Fikir xargskırpmak için cal'ın çıkışını dan bu SO cevap .


2
Bu sadece bash değil. Genellikle sh, ama muhtemelen cal, tail ve xarg sistemli, yol aramalarını ve borularını destekleyen hemen hemen her kabuk uygulamasıdır.
kojiro

5

Proton , 50 bayt

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

Çevrimiçi deneyin!

Jonathan Frech sayesinde -14 bayt

Otuz gün eylül, nisan, haziran ve kasım ayları arasındadır. Her şey fıstık ezmesi vardı. Büyükannem hariç hepsi; Kırmızı bir yumruğu vardı, ama çaldım. muahahahahaha

(Bu şakayı anlatmak için bekliyorum (kaynak: matematik profesörüm) bu sitede yaş için: D: D: D)


@Riker oh, şunu yazmaya başladığımda orada olmayanlar: /
HyperNeutrino

1
Geçerli bir ay olup olmadığını kontrol etmeniz ve 0 döndürmeniz gereken yeni bir kural var. Umarım silinir
Level River St

1
Nevermind değişiyor ben o parçayı
siliyorum

'sepaprjunnov'Dizelerin listesi yerine tek bir dize kullanabileceğinizi düşünüyorum .
Jonathan Frech

@JonathanFrech belki; Bunu deneyeceğim, teşekkürler
HyperNeutrino 28:17

4

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

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

Çevrimiçi deneyin!

İçin +24 using D=System.DateTime;

Teşekkür

Grzegorz Puławski sayesinde -3 bayt.


Bu olmadan çalışıyor using System;mu? Yoksa bunu bayt sayısından hariç tutabilir misin?
Matty

@Matty Bu iyi bir nokta; şimdi eklendi.
Ayb4btu

Geç bahşiş, ancak -3 bayt: using D=System.DateTime;ve m=>D.DaysInMonth(1,D.Parse(1+m).Month)burada: tio.run/##jc5BSwMxEAXgs/…
Grzegorz




2

Python 3 - 93 86 84 82 bayt

Cevap çeşitleri (TIO bağlantılarıyla her biri için zamanın ve baytın ilerlemesini gösteren):

Orijinal Yanıt (93 bayt)

Jonathan Frech sayesinde -7 bayt. (86 bayt)

-2 daha fazla bayt, monthrangesonuçları daha fazla test ettim , ikinci değer ise her zaman daha yüksek değer. (84 bayt) 1

-2 kullanarak import calendar as cve referans olarak kullanarak c.monthrange. (82 bayt, güncel revizyon )


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

Açıkçası , yerleşik kullanmayan HyperNeutrino'nun cevabı kadar hoş değil, ama bu hala işe yarıyor.


Dipnotlar

1 : TIO.run aracılığıyla yapılan test senaryoları , bu monthrangeay sayıdaki çeşitli test durumları için bu değerleri nasıl kullandığımı gösteren kanıtı göstermektedir .



@JonathanFrech Teşekkürler. Ayrıca, ay düzenlemesinin nasıl çalıştığını daha fazla test ettiğimde ve ayrıca import ...,calendar as c'takvimi' iki kez yazmak zorunda kalmayacağımı kullanarak aşağı doğru revize ettik .
Thomas Ward


2

Haskell , 65 63 62 bayt

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

Çevrimiçi deneyin!

Desen eşleştirme yaklaşımı. İlk satır büyük / küçük harfe duyarsızlığı ele almaktır. Ardından 28, üçüncü harf C'den küçükse (sayı 3), 30ikinci harf C'den büyükse, üçüncü harf M'den büyükse veya 31aksi takdirde geri döneriz.

Düzenleme: Leo sayesinde -1 bayt


Alternatif ( 65 64 bayt)

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

Çevrimiçi deneyin!


1
Zeki biri! Bunun c<3yerine kontrol ederek bir bayt kaydedebilirsiniz a==6(üçüncü bir mektuba göre sipariş verirseniz Şubat ayının ilk ayıdır, ardından Aralık ayını alır)
Leo

2

APL (Dyalog) , 32 bayt *

Tam önek işlevi. Devraldı ⎕IO( Ben nDex Ç rigin) 0, birçok sistemde varsayılan olan.

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

Çevrimiçi deneyin!

⍠1 duyarsızca durum

1 uzunluğu döndürmek

⎕S PCRE S için Araması

'.p|un|no|f' Herhangi bir karakter, "p" veya "un" veya "no" veya "f"

⊃⍨∘⊃ ve seçim yapmak için bunun ilk elemanını (eğer 0 ise) kullanın

31 28 30 bu liste

Böylece:

  • Ap R, S ep , J un ve No'nun v yani, dizin 2'ye 30 numarasını seçer

  • F eb indeks 1'de numarayı seçecektir, yani 28

  • başka bir şey, indeks 0'daki sayıyı seçecektir, yani


* Klasik kullanma ve sayım olarak ⎕OPT.


2

Mediawiki Şablonu, 19 bayt

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

1

MATL , 22 bayt

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

Çevrimiçi deneyin!

açıklama

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

1

Wolfram Dili (Mathematica) , 46 30 bayt

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

Çevrimiçi deneyin!

Ya verecek 28ya 29cari yıl artık yıl olmasına bağlı olarak Şubat için.

Nasıl çalışır

Mathematica tüm tarih komutları girişi yorumlayacak böyle April, APR, ApRiLve böylece cari yılda gelen ayın ilk günü olarak üzerinde. (Bonus olarak, giriş "February 2016"veya {2016,2}beklendiği gibi çalışır.)

#~NextDate~"Month"bundan sonra ayın ilk gününü DayCountverir ve iki argümanı arasındaki gün sayısını verir. 1 Nisan ile 1 Mayıs arasındaki gün sayısı 30, Nisan ayındaki gün sayısıdır.




1

q / kdb +, 36 bayt

Çözüm:

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

Örnekler:

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

Açıklama:

Bir kediyi cildin milyonlarca yolu vardır. Bence diğerlerinden biraz farklı. Girişin 2. ve 3. harflerini alın, küçük harflerle yazın, sonra dizgede arayın "ebeprunov". Eğer 0 konumundalarsa, o zaman bu Şubat,> 0 konumundaysa, 30 günlük, dizgede değilse, 31 günlük.

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

1

Excel VBA, 47 43 Bayt

Ay adı, kısaltma veya sayı olarak aralıktan [A1]girdi alan ve anılan VBE acil pencere işlevi, 2001 yılında o ayın uzunluğunu VBE acil pencere işlevine çıkarır.

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

Eski versiyon

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

1

PHP, 38 33 + 1 32 + 1 bayt

Titus sayesinde 5 bayt kurtarıldı

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

İle boru olarak çalıştır -nF

Çevrimiçi deneyin!


1
Hey, ihtiyacın olduğunu sanmıyorum .' 1', onsuz TIO'da çalışıyor gibi görünüyor!
Dom Hastings

1
28 + 1 bayt: <?=date(t,strtotime($argn));(pipo ile çalıştır -nF)
Titus

3
@DomHastings - göndermeden önce, olmadan çalışıp çalışmayacağını görmek için test ettim .' 1', ama işe yaramadı. Yorumunuzu gördükten sonra, ne yanlış yaptığımı anlamaya çalıştım. Ayın 31'inde koştuğum için koyduğum herhangi bir ayın 31'inci (şu anki) gününü alıyordu; 31 Şubat, 3 Mart’a dönüşür, bu nedenle kod 31 (Mart’taki gün sayısı) olarak döner. Bu nedenle, her ay 31'i iade ediyordu. Yani, .' 1'ayın <= 28. günü olmadan çalışır .
Jo.

Ahhh, PHP'nin boşlukları nasıl doldurduğunu unutuyorum! Açıkladığınız için teşekkürler!
Dom Hastings

@Titus Teşekkürler. Ben böyle bir golf acemisiyim! Neden fark etmedim bilmiyorum 't'-> t. Ayrıca, nasıl "boru olarak çalıştırılacağını" bulmak için bir sürü araştırma yapmak zorunda kaldım, -nFama anladım (sanırım). :)
Jo.


0

QBIC , 49 35 bayt

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

Bazı hile ile önemli ölçüde daha kısa.

açıklama

?                          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)


0

Ruby , 45 bayt

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

Çevrimiçi deneyin!

Ruby Date.parsekendi başına bir ay adını kabul eder. Normalde right-shift ( >>) olan şey aslında Datenesnenin ayına eklenir . Çıkarma, ayın gününü etkiler; bu, önceki ayın son gününe geri sarılır.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.