何週ですか?


8

曜日と月は注目を集めているようですが、誰もその週を気にしていないようです。私はそれを変更する時だと思います。したがって、あなたの仕事は、日付が与えられたときに、その年の現在の週に対応する1〜53の整数を出力するプログラムまたは関数を書くことです。

この課題では、年の最初の日曜日が年の初めを表すと言うので、1月1日が第1週と見なされるのは、日曜日になる場合のみです。

  • 入力は、明示的に間の日付の週番号を(ちょうどあなたの答えにフォーマットを指定)を含まない任意の日付フォーマットすることができ1JAN1900、および31DEC2100
  • 出力は1〜53の整数です
  • 入力/出力を提供する標準的な方法を使用できます。

テストケース

17MAY2017 -> 20

3JAN2013 -> 53

1JAN2017 -> 1

17MAY1901 -> 19

31DEC2100 -> 52

7JUL2015 -> 27
  • これはので、すべての標準ゴルフ規則が適用され、最短コード(バイト単位)が優先されます。

5
ISOの週がより標準的です。IIRCそれらは1年の最初の木曜日に基づいています。
ニール

他の日付入力形式(つまり、07/07/2015)を使用できますか?すること7JUL2015ができます07JUL2015か?
スティーブン

@StephenSはい、それで結構です。7/7/20152015-07-07も有効です。
J_Lard 2017年

2
@ニール:標準の定義と完全に一致しないことは、ここでは良いことです。問題をビルトインで解決できる可能性は低くなりますが、それがなければ解決するのは難しくありません。

4
使用者への注意%U:@J_Lardが指摘するように、0週が前年の52週と53週のどちらであるかについて注意する必要があります。2001年、2007年、2013年、2018年、2024年、2029年の53週目で、28年周期で繰り返されます。他の年のそれは52週です
ニール・

回答:


2

オーム12 33バイト

編集:「%U」のエッジケースを修正しました。

IΩDÖ?┼╓y≤s"-12-31"C"%F"╓₧Ω
"%U"╓&

入力はタイムスタンプであると仮定します。来る説明。

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


1
0週は、1995年と2023年もに異なっている
ニール

@ニールそれは本当です、しかし挑戦は答えが1と53の間でなければならないと言います、そして私は基本的に他のすべての答えと同じことをしています。
Nick Clifford

すみません、年を間違えました。とにかく、それはいくつかの年で52、他の年で53です。
ニール

@ニール行きます。
Nick Clifford

1
確かに、これは、例えば2018年1月1日と2019年のための正解提供します
ニール・

6

MATL、50バイト

間違いを指摘してくれた@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

2
おめでとうございます!私はすぐ後ろにいます:)
デジタルトラウマ

1
あと2ポイント...そしてブーム!おめでとうございます!
ジョナサンアラン

これはニールによって指摘されたエッジケースで動作しますか?を使用していないことはわかっていますが%U、確認したいだけです。
Nick Clifford

これは、2019年1月1日が週53であると考えているようだが、それだけで週52にだ
ニール・

@ニールはい、あなたは正しいです。興味深いことに、他のテストケースは正しいです。
J_Lard 2017年

4

JavaScript(ES6)、82 80バイト

入力をとして受け取ります(year,month,day)

let f =

(y,m,d)=>-~((((x=new Date(y,m-1,d))-new Date(y,0,1))/864e5+372-x.getDay())/7%53)

console.log(f(2017, 5,17)) // 20
console.log(f(2013, 1, 3)) // 53
console.log(f(2017, 1, 1)) // 1
console.log(f(1901, 5,17)) // 19
console.log(f(2100,12,31)) // 52
console.log(f(2015, 7, 7)) // 27


4

JavaScript(Firefox 34以降)、70バイト

with(new Date())y.value=getFullYear(),m.value=getMonth()+1,d.value=getDate()+1
f=
(y,m,d)=>new Date(y,--m,d-new Date(y,m,d).getDay()).toLocaleFormat`%U`
<div oninput=w.value=f(y.value,m.value,d.value)><input id=y type=number><input id=m type=number min=1 max=12><input id=d type=number min=1 max=31><input id=w readonly placeholder=Output>

指定された日付を含む週の最初の日を見つけ、その日の週番号(ゼロになることはありません)を見つけます。


の+1 with常に +1 with
Shaggy

2

パイソン2、70の、64バイト

入力=> (year,month,day)

from datetime import*;lambda*v:int(date(*v).strftime('%U'))or 53

print(f(2017, 5,17)) #20
print(f(2013, 1, 3)) #53
print(f(2017, 1, 1)) #1
print(f(1901, 5,17)) #19
print(f(2100,12,31)) #52
print(f(2015, 7, 7)) #27

-6バイト、@ ovsのおかげ


2

JavaScript(Firefoxのみ)、77バイト

文字列として日付を取ります:ie Jan 1, 2017

s=>+new Date(s)[k='toLocaleFormat']`%U`||new Date(s.slice(-4)-1,11,31)[k]`%U`

いい試みですが、「0週目」は必ずしも同じ週とは限りません(1995年と2023年は異なります)。
Neil

テストケースが間違っています。質問には適切なコメントを投稿する必要があります。
ニール

@ニール修正する必要があります。
2017年


2

C#、138 123 121バイト

namespace System.Globalization{d=>CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(d,(CalendarWeekRule)1,(DayOfWeek)0);}

そのために組み込まれていることがわかりましたが、それはかなり大きいです...

namespace System.Globalization
{
    Func<DateTime, int> f = d =>
        CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(d, (CalendarWeekRule)1, (DayOfWeek)0);
 }

1

Powershell、260 + 8 = 268バイト

-DateTimeフラグのため+8バイト


引数を"day month year"フォーマットとして受け入れます。

function W([datetime]$DateTime = (Get-Date)) {
$cultureInfo = [System.Globalization.CultureInfo]::CurrentCulture
$cultureInfo.Calendar.GetWeekOfYear($DateTime,$cultureInfo.DateTimeFormat.CalendarWeekRule,$cultureInfo.DateTimeFormat.FirstDayOfWeek)
}

Powershellのエキスパートではなく、ゴルフはできません


テストケース

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