月に何日?


25

月のテキスト表現(大文字と小文字を区別しないフルネームまたは3文字の略語)を指定すると、その月の日数を返します。

たとえば、decemberDEC、およびdecすべての31を返す必要があります。

2月には28日または29日があります。

入力が正しい形式の1つの月であると想定します。


19
おそらく、受け入れられるはずの月名のすべてのバリエーションをリストする必要があります。
ジュゼッペ

1
それを使用できる人なら誰でも、最初の3文字のASCII序数合計は一意です。
完全に人間の

19
それは解決策を受け入れるにはあまりにも早すぎました。
シャギー

5
入力が固定形式の月だけである場合、形式は基本的に固定ケースに変換し、最初の3文字のみを見る必要があるため、これは良いと思います。
-xnor

4
「例えば、 -それはあなたが記載されているフォームのすべてを処理するための答えをしたいように見える現状ではdecemberDECdecすべきであるすべてのリターン31」 -意思ということですか?
ジョナサンアラン

回答:


4

Pyke、9バイト

l4C9@~%R@

ここで試してみてください!

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]

または、すべての入力形式が必要な場合は15バイト

l43<C9 3L<@~%R@

ここで試してみてください!

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
これは、31を返しますFEB
ライコニ

2
私はLaikoniのポイントが有効である@(それはまたのために31を返すと信じてAprJunSep、及びNov)だけでなく、それは(私の見OPで少し明確化が必要であると考えて質問を)。
ジョナサンアラン

@JonathanAllanまあ、OPはこの答えを受け入れたので、それは有効だと思いますか?
エリックアウトゴルファー

4
@EriktheOutgolfer私は個人的にその結論にジャンプしません。
ジョナサンアラン

私はそれが唯一の入力の一の形態のための仕事に必要なという印象の下にあった
ブルー

33

JavaScript(ES6)、 48 47 44 43  42バイト

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

デモ

どうやって?

これらの操作により、8つのエントリのルックアップテーブルが作成されますが、値がランダムに分布している場合はあまり興味深いものではありません。ただし、2を超える結果は31日にマッピングされます。したがって、最初の3つのエントリのみを明示的に保存する必要があります。

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とこれらの素晴らしい奇妙な提出を作り続ける行う:あなたがこれらを見つけるためのプログラムを持っているか、あなただけの私たちの残りのためにあまりにも良いですか
HyperNeutrino

1
@HyperNeutrino私が最初に試みることは、常にベース変換を見つけ、その後にオプションの乗算とそれに続く1つまたは複数のモジュロ演算を見つけることです。これはすぐに発見されました。しかし、私はこの挑戦を読み違え、これ.substr(0,3)は必須ではないと最初に思いました。したがって、考え直してみると、これは最善のアプローチではないかもしれません。
アーナルド

substrslice
ニール

私の取るに足らないアプローチは3バイトだけ<s> 2 </ s>ですので、最適ではないかもしれませんが、それでも非常に印象的です:)
HyperNeutrino

1
誰かの編集がその部分を削除しましたが、私が元々それを許可しなかった理由の1つは、このような答えを見たかったからです。大文字と異なる形式の問題を回避するための使用ベース34が大好きです。
qw3n

15

Javascript(ES6)、36 33バイト

@JustinMarinerと@Neilのおかげで-3バイト

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

@Arnauldさん、申し訳ありませんが、JavaScriptの異常を悪用するのは、ファンシーなベースコンバージョンよりも短くなります。

使い方

何らかの理由で、JavaScriptでは指定された月以外の日付を入力できます。このコードは、月の外に何日あるかをカウントして、その月に何日あるかを判断します。例:
"FEB31"Thu Mar 02 200031 - 2 % 3129
"October31"Tue Oct 31 200031 - 31 % 3131

テストケース


MS Excelもこれを行います。1月0日は常に12月最終日であるため、= DAY( "00/01/2017")は31
DavChana

Javascriptでは、日付が最大31の日付文字列のみが許可されているように見えます。「feb 32」と入力すると、2032-02-01に変換され、「0-feb-32」で強制的に変換しようとすると(または同様の文字列)、「Invalid Date」とだけ言います。奇妙なことに、日を0(「feb 0」)に設定すると、2000-01-31ではなく2000-02-01に変換されます。
-TehPers

前にスペースをドロップすることでバイトを節約できるかもしれません31new Date("feb31")たとえば、Chromeで動作するようです。
ジャスティンマリナー

実際、おそらく+31全体で3バイトの節約になります。ただし、Firefoxではこれは機能しません。
ニール


7

Bash、21バイト

cal $1|xargs|tail -c3

オンラインでお試しください!

入力をコマンドライン引数として受け取り、末尾に改行を付けて出力します。2月の日数は、現在の年の日数に依存します

util-linux 2.29バージョンのが必要ですcal。これはTIOで利用可能です。また、ロケールに依存するため、英語以外のシステムではLC_TIMEを変更する必要があります(説明については@Dennisに感謝します)。

xargsトリムcalの出力にパイピングするアイデアは、このSOの回答からです。


2
これは単なるbashではありません。通常はshですが、おそらくcal、tail、およびxargsを使用するシステムで、パスルックアップとパイプをサポートするほとんどすべてのシェル実装です。
小次郎

5

プロトン、50バイト

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

オンラインでお試しください!

ジョナサンフレッシュのおかげで-14バイト

30日間は9月、4月、6月、11月です。残りはすべてピーナッツバターでした。私の祖母を除くすべて。彼女は少し赤いトライクを持っていたが、私はそれを盗んだ。ムアハハハハハハ

(私はこのジョーク(ソース:私の数学の教授)をこのサイトで何年も前から言っているのを待っていました:D:D:D)


@Rikerおっと、これを書き始めたときはなかった:/
HyperNeutrino

1
あなたがいない有効な月をチェックして、私はそれが削除されます願っています0を返す必要があること、新しいルールがある
レベル川セント

1
変更を気にしない私はその部分を削除しています
-qw3n

文字列'sepaprjunnov'のリストの代わりに単一の文字列を使用できると思います。
ジョナサンフレッチ

@JonathanFrechかもしれません。試してみます、ありがとう
-HyperNeutrino

4

C#(.NET Core)52 + 13 = 65 38 + 24 = 62バイト

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

オンラインでお試しください!

+24 using D=System.DateTime;

謝辞

GrzegorzPuławskiのおかげで-3バイト。


これは機能しますusing System;か?または、バイトカウントから除外できますか?
マティ

@Mattyそれは良い点です。追加されました。
Ayb4btu

後期チップ、ただし-3バイト:using D=System.DateTime;そして、次のm=>D.DaysInMonth(1,D.Parse(1+m).Month)ように:tio.run
GrzegorzPuławski17年




2

Pythonの3 - 93の 86 84の 82バイト

回答のバリエーション(時間の進行と各バイトをTIOリンクで表示):

元の回答(93バイト)

ジョナサン・フレッシュのおかげで-7バイト。(86バイト)

-2 monthrange番目の値は常に高い値で、結果をさらにテストしたおかげで、さらに2バイト増えました。(84バイト)1

-2を使用しimport calendar as c、で参照することによりc.monthrange(82バイト、現在のリビジョン


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

ビルトインを使用しないHyperNeutrinoの答えほど明らかに良いものではありませんが、これでも機能します。


脚注

1:さまざまな月のテストケースについて、TIO.run介したテストケースは、これらのmonthrange値をどのように処理しているかの証拠を示しています。



@JonathanFrechありがとう。monthrangeの動作をさらにテストし、import ...,calendar as c「calendar」を2回入力する必要がないように使用することで、さらに下方に修正されました。
トーマスウォード


2

Haskell65 63 62バイト

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

オンラインでお試しください!

パターンマッチングアプローチ。最初の行は、大文字と小文字を区別しないようにすることです。次に28、3番目の文字がC(数値3)より小さい30場合、2番目の文字がCより大きく、3番目の文字がMより大きい場合、または31そうでない場合に戻ります。

編集:レオのおかげで-1バイト


代替(65 64バイト)

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

オンラインでお試しください!


1
賢い方!c<3代わりにチェックすることでバイトを保存できますa==6(3番目の文字で注文した場合は2月が最初の月で、12月が続きます)
レオ

2

APL(Dyalog)、32バイト*

暗黙のプレフィックス機能。想定している⎕IOI NDEX O RIGIN)0多くのシステムではデフォルトです。

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

オンラインでお試しください!

⍠1 大文字小文字を区別せずに

1 の長さを返します

⎕S PCRE S earch for

'.p|un|no|f' any-char、 "p"または "un"または "no"または "f"

⊃⍨∘⊃ そして、その最初の要素(ない場合は0)を使用して選択します

31 28 30 このリスト

したがって:

  • Ap r、S ep、J un、およびNo vは、インデックス2の番号、つまり30を選択します

  • F ebは、インデックス1の番号、つまり28を選択します

  • それ以外は、インデックス0の番号、つまり31を選択します


*クラシックを使用し、としてカウントし⎕OPTます。


2

Mediawikiテンプレート、19バイト

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

1

MATL、22バイト

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

オンラインでお試しください!

説明

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言語(Mathematica)46 30バイト

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

オンラインでお試しください!

現在の年がうるう年かどうかに応じて、2月28または292月のいずれかを指定します。

使い方

Mathematicaですべての日付のコマンドは、このような入力解釈しAprilAPRApRiL現在の年で、そのため、対応する月の最初の日として上。(ボーナスとして、"February 2016"またはなどの入力{2016,2}も期待どおりに機能します。)

#~NextDate~"Month"それ以降の月の最初の日をDayCount指定し、2つの引数間の日数を指定します。4月1日から5月1日までの日数は30日で、4月の日数です。




1

q / kdb +、36バイト

溶液:

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

例:

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

説明:

猫の皮をむく方法は100万通りあります。他とは少し違うと思います。入力の2文字目と3文字目を小文字にして、文字列で検索します"ebeprunov"。それらがロケーション0にある場合、これは2月であり、ロケーションが0より大きい場合、30日であり、ストリングに含まれていない場合、31日です。

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バイト

範囲から月名、略語、または数値として入力を受け取り、[A1]2001年のその月の長さをVBEイミディエイトウィンドウ関数に出力する匿名VBEイミディエイトウィンドウ関数。

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

古いバージョン

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

1

PHP、38 33 + 1 32 + 1バイト

Titusのおかげで5バイト節約

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

パイプとして実行 -nF

オンラインでお試しください!


1
ねえ、私はあなたが必要.' 1'とは思わない、それなしでTIOで動作するようです!
ドムヘイスティングス

1
28 + 1バイト:(で<?=date(t,strtotime($argn));パイプとして実行-nF
タイタス

3
@DomHastings-ですので、投稿する前に.' 1'、がなくても動作するかどうかをテストしましたが、動作しませんでした。あなたのコメントを見た後、私は間違ったことを理解しようとしました。私は月の31日に実行していたので、入力した月の31日(現在の日)がかかっていたため、現在の月を超えてしまいました。2月31日が3月3日になるため、コードは31(3月の日数)を返します。このため、毎月31が返されていました。したがって、.' 1'月の28日以下の曜日はありません。
ジョー。

ああ、PHPが空白を埋める方法を忘れてしまいました!説明してくれてありがとう!
ドムヘイスティングス

@タイタスありがとうございます。私はそのようなゴルフ初心者です!'t'->に気付かなかった理由がわかりませんt。また、「パイプとして実行する」方法を-nF見つけるために、たくさんの検索をしなければなりませんでしたが、私はそれを見つけました(私は思う)。:)
ジョー。


0

QBIC49 35バイト

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

いくつかの策略で大幅に短くなります。

説明

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



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.