間違いを指摘してくれた@Neilと@NickCliffordに感謝、現在修正済み
ZO1)TThXJYOXIGYO&:8XO!s310=sJ4B-YOIq&:8XO!s310=sX\
オンラインでお試しください!または、すべてのテストケースを確認します。
説明
これは、MATLにある3つの日付/時刻変換関数を使用します。
XO
:日付と時刻を文字列形式に変換します。
YO
:日付と時刻をシリアル日付番号に変換します。
ZO
:日付と時刻をコンポーネントのベクトルに変換します。
MATLは8XO!s310=s
パーツを再利用するための呼び出し可能な関数を定義できないため、週「0」が52または53になるかどうかを判断するのはコストがかかりました。分岐のあるループによって再利用すると、1バイトしか節約できず、説明が複雑になるため、おそらく価値はありません。
また、[年、月、日]配列として日付を入力すると、何かが得られる可能性があります。しかし、私は3つすべての日付関数を使用しません:-)
入力'17MAY2017'
を例として考えます。
% Implicit input
% STACK: '17MAY2017'
ZO % Convert to date vector
% STACK: [2017 5 17]
1) % Get first entry: year
% STACK: 2017
TTh % Append [1 1]
% STACK: [2017 1 1]
XJ % Copy to clipboard J
YO % Convert to date number
% STACK: 736696
XI % Copy to clipboard I
GYO % Push input again. Convert to date number
% STACK: [736696 736832]
&: % Binary range
% STACK: [736696 736697 736698 ... 736832]
8XO % Convert to date string with format 'ddd': day of week
% STACK: ['Sun'; 'Mon'; 'Tue'; ... ; 'Wed']
!s % Sum of each row (chars are interpreted as code points)
% STACK: [310 298 302 ... 288]
310= % Compare with 310 (sum of 'Sun')
% STACK: [1 0 0 ... 0]
s % Sum of array. If is 0, it needs to be transformed into 52 or 53,
% depending on the number of Sundays the previous year contains.
% STACK: 20
J % Paste from clipboard J
% STACK: 20, [2017 1 1]
4B- % Push [1 0 0] and subtract element-wise
% STACK: 20, [2016 1 1]
YO % COnvert to date number
% STACK: 20, 736330
I % Paste from clipboard I
% STACK: 20, 736330, 736696
q % Subtract 1
% STACK: 20, 736330, 736695
&: % Binary range
% STACK: 20, [736330 736331 736332 ... 736695]
8XO % Convert to date string with format 'ddd': day of week
% STACK: 20, ['Fri'; 'Sat'; 'Sun'; ... ; 'Sat']
!s % Sum of each row (chars are interpreted as code points)
% STACK: 20, [289 296 310 ... 296]
310= % Compare with 310 (sum of 'Sun')
% STACK: 20, [0 0 1 ... 0]
s % Sum of array
% STACK: 20, 52
X\ % 1-based modulo
% STACK: 20
% Implicit display