月のテキスト表現(大文字と小文字を区別しないフルネームまたは3文字の略語)を指定すると、その月の日数を返します。
たとえば、december
、DEC
、およびdec
すべての31を返す必要があります。
2月には28日または29日があります。
入力が正しい形式の1つの月であると想定します。
december
、DEC
とdec
すべきであるすべてのリターン31」 -意思ということですか?
月のテキスト表現(大文字と小文字を区別しないフルネームまたは3文字の略語)を指定すると、その月の日数を返します。
たとえば、december
、DEC
、およびdec
すべての31を返す必要があります。
2月には28日または29日があります。
入力が正しい形式の1つの月であると想定します。
december
、DEC
とdec
すべきであるすべてのリターン31」 -意思ということですか?
回答:
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]
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]
FEB
。
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
.substr(0,3)
は必須ではないと最初に思いました。したがって、考え直してみると、これは最善のアプローチではないかもしれません。
substr
?slice
!
@JustinMarinerと@Neilのおかげで-3バイト
m=>31-new Date(m+31).getDate()%31
@Arnauldさん、申し訳ありませんが、JavaScriptの異常を悪用するのは、ファンシーなベースコンバージョンよりも短くなります。
何らかの理由で、JavaScriptでは指定された月以外の日付を入力できます。このコードは、月の外に何日あるかをカウントして、その月に何日あるかを判断します。例:
"FEB31"
→ Thu Mar 02 2000
→ 31 - 2 % 31
→ 29
"October31"
→ Tue Oct 31 2000
→ 31 - 31 % 31
→31
31
。new Date("feb31")
たとえば、Chromeで動作するようです。
+31
全体で3バイトの節約になります。ただし、Firefoxではこれは機能しません。
cal $1|xargs|tail -c3
入力をコマンドライン引数として受け取り、末尾に改行を付けて出力します。2月の日数は、現在の年の日数に依存します
util-linux 2.29バージョンのが必要ですcal
。これはTIOで利用可能です。また、ロケールに依存するため、英語以外のシステムではLC_TIMEを変更する必要があります(説明については@Dennisに感謝します)。
xargs
トリムcal
の出力にパイピングするアイデアは、このSOの回答からです。
k=>31-((e=k.lower()[1to3])in"eprunov")-3*(e=="eb")
ジョナサンフレッシュのおかげで-14バイト
30日間は9月、4月、6月、11月です。残りはすべてピーナッツバターでした。私の祖母を除くすべて。彼女は少し赤いトライクを持っていたが、私はそれを盗んだ。ムアハハハハハハ
(私はこのジョーク(ソース:私の数学の教授)をこのサイトで何年も前から言っているのを待っていました:D:D:D)
'sepaprjunnov'
のリストの代わりに単一の文字列を使用できると思います。
m=>D.DaysInMonth(1,D.Parse(1+m).Month)
+24 using D=System.DateTime;
GrzegorzPuławskiのおかげで-3バイト。
using System;
か?または、バイトカウントから除外できますか?
x=input().lower()[1:3];print(31-(x in"eprunov")-3*(x=="eb"))
プロトンソリューションの移植
完全に人間のおかげで-10バイト
回答のバリエーション(時間の進行と各バイトを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
値をどのように処理しているかの証拠を示しています。
import ...,calendar as c
「calendar」を2回入力する必要がないように使用することで、さらに下方に修正されました。
($_)=/.(..)/;
代わりに、$_=substr$_,1,2;
および()
その周囲"eprunov"=~/$_/i
を削除できます。
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バイト
f s|let i#n=n<mod(fromEnum$s!!i)32=sum$29:[2|2#2]++[-1|2#13,1#3]
c<3
代わりにチェックすることでバイトを保存できますa==6
(3番目の文字で注文した場合は2月が最初の月で、12月が続きます)
暗黙のプレフィックス機能。想定している⎕IO
(I NDEX O RIGIN)0
多くのシステムではデフォルトです。
31 28 30⊃⍨∘⊃'.p|un|no|f'⎕S 1⍠1
⍠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
ます。
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
#~NextDate~"Month"~DayCount~#&
現在の年がうるう年かどうかに応じて、2月28
または29
2月のいずれかを指定します。
Mathematicaですべての日付のコマンドは、このような入力解釈しApril
、APR
、ApRiL
現在の年で、そのため、対応する月の最初の日として上。(ボーナスとして、"February 2016"
またはなどの入力{2016,2}
も期待どおりに機能します。)
#~NextDate~"Month"
それ以降の月の最初の日をDayCount
指定し、2つの引数間の日数を指定します。4月1日から5月1日までの日数は30日で、4月の日数です。
m->31-new java.util.Date(m+"31 1").getDate()%31
結局、ハーマンラウエンシュタインのJS回答と同じアイデアを使用することになり、日付を31日に設定すると翌月にプッシュされました。Javaには1年が必要なため、に設定されてい1
ます。
溶液:
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
Titusのおかげで5バイト節約
<?=date(t,strtotime("$argn 1"));
パイプとして実行 -nF
.' 1'
とは思わない、それなしでTIOで動作するようです!
<?=date(t,strtotime($argn));
パイプとして実行-nF
)
.' 1'
、がなくても動作するかどうかをテストしましたが、動作しませんでした。あなたのコメントを見た後、私は間違ったことを理解しようとしました。私は月の31日に実行していたので、入力した月の31日(現在の日)がかかっていたため、現在の月を超えてしまいました。2月31日が3月3日になるため、コードは31(3月の日数)を返します。このため、毎月31が返されていました。したがって、.' 1'
月の28日以下の曜日はありません。
't'
->に気付かなかった理由がわかりませんt
。また、「パイプとして実行する」方法を-nF
見つけるために、たくさんの検索をしなければなりませんでしたが、私はそれを見つけました(私は思う)。:)
s->{for(java.time.Month m:java.time.Month.values())if(m.name().startsWith(s.toUpperCase()))System.out.print(m.length(false));}
false
ようなブール式に短縮できると思います1<0
。
->m{((Date.parse(m)>>1)-1).day}
require'date'
Ruby's Date.parse
はそれ自体で月名を受け入れます。通常、右シフト(>>
)となるものは、実際にDate
オブジェクトの月に追加されます。減算は月の日に影響を与え、その月の日は前の月の最終日まで逆戻りします。
val d={m:String->arrayOf(0,31,30,30,31,30,31,28,31,0,30)[(m[1].toInt()+m[2].toInt())%32%11]}