今日(または他の日付)は何曜日ですか?


12

仕事

ユーザーが入力する日付の曜日名を計算するプログラムまたは関数を作成します。

入出力

入力は文字列ですYYYYMMDD

入力値の例:

20110617:2011年6月17日
19040229:1904年2月29日
06661225:666年12月25日
00000101:1月1日、0
99991231:9999年12月31日

すべての入力が有効であるとみなすことができます。ゼロ年は有効であることに注意してください。

出力は、間の整数である06。各整数は曜日名を表します。この整数のように、どの整数が曜日名を表すかを自由に決定できます

0:月曜日
1:火曜日
2:水曜日
...
6:日曜日

(順番に)またはこれ

0:月曜日
1:水曜日
2:日曜日
...
6:土曜日

(順不同)。

テストケース

曜日出力の入力(この例では[0..6-> Monday..Sunday]が使用されます。)

20110617金曜日4
19500101日曜日6
22220202土曜日5
19000228水曜日2
19000301木曜日3
19450815水曜日2
19040229月曜日0
19040301火曜日1
17760704木曜日3
20000228月曜日0
20000229火曜日1
20000301水曜日2
20121223日曜日6
00000401土曜日5
66660606水曜日2
59161021土曜日5

制限

あなたはしてはならない使用どのように、タイムスタンプまたは日付に関連する機能/クラスの種類を/ ... DateにクラスJava/ JavaScript/ ActionScript、またはgetdateで機能PHP

現在、多くの人々が使用しているグレゴリオ暦を使用する必要があります。

もちろん、最短のコードが優先されます。2つのコードの長さが同じ場合、最も高い投票数のコードが勝ちます。

(期限:+1投票数が多い(または等しい)コードが5つ以上ある場合。)


今日?なぜ、クリスマスの日!
ジョーイアダムス

3
バッシュ(6文字)で書かれた楽観的ソリューション:echo 4
真実性

1
@truthealityいいえ、私はそれを意味しませんでした。私が欲しかったのは、今日の曜日だけでなく、誰かが入力した日付の曜日を印刷/返すコードです。
JiminP

ああ、わかる。それがこれです。
真実性

少なくとも14%の確率でそうです!
Draco18sは、

回答:


2

ルビー、95 92文字

0:Mondayを使用した単純明快なRuby実装、...

p ((y=(d=gets.to_i)/(k=100)/k-((m=d/k%k)<3?1:0))+y/4-y/k+y/400+"squsptrotqro"[-m].ord+d%k)%7

4

PHP- 101 97 103 125文字

  • 坂本アルゴリズム
  • 0 =日曜日

コード

<?php fscanf(STDIN,"%4d%2d%2d",$y,$m,$d);@$a=a032503514624;$y-=$m<3;$z=$y+1;echo($y+$y/4%$z-$y/100%$z+$y/400%$z+$a[$m]+$d)%7;

注意

残念ながら、PHPの動的で弱い型付けのため、各除算操作を明示的にフロアリングしないと、坂本アルゴリズムは正しく機能しません。


もう一度テストしてください。数年間、それは私に異なる結果を与えます(例えば、テストケース17760704は水曜日の代わりに火曜日をもたらします)。
ハワード

@Howardそれは非常に奇妙です。17760704の場合、水曜日になります。ただし、他の不整合は発生しますが、これは説明できません。たとえば、19040229は火曜日を返します。何がこれを引き起こしているのかわからない。アルゴリズムをに展開し直すと、同じ結果が得られy+y/4-y/100+y/400ます。
-rintaun

私は497 * y / 400でそれが起こっているのを見ることができます:y=4その場合、正しい5の代わりに4を返しますy+y/4+y/100+y/400(最初の2つの用語のみが作用します)。それが私のJavaScriptの答えを悩ませています。intの代わりにdoubleが作成される可能性はありますか?(私のPHPは弱すぎて知ることができません。)
DocMax

@DocMax:式を展開したままにしても同じ結果になります(497y / 400は同等である必要があります。y/ 100は差し引かれ、y / 400は再び追加されます)。PHPは、小数点以下を切り捨てるのではなく、小数点以下を切り捨てているだけだと思います。モジュロの前に丸めてこれをテストしました。これにより、2つの異常が修正されますが、19040229でも同じ結果が返されます。他のアイデアはありますか?
リンタウン

@rintaun私はそれが丸めだとは思わない。それらは根本的に異なります。上記の例をご覧ください(y = 4):497 * 4/400 = 1988/400 = 4ただし、4 + 4 / 4-4 / 100 + 4/400 = 4 + 1-0 + 0 = 5 。用語/ 100および/ 400は、2000に到達できないほど計算の重みが大きくなりすぎます。
ハワード

2

C-129

main(y,m,d,s)
{
    scanf("%04d%02d%02d",&y,&m,&d);
    y-=s=86400;
    d+=y+"-addgbegcfadf"[m];
    m>2?y++:0;
    putchar(48+(d+y/4-y/100+y/400+s+s)%7);
}

これは、少なくとも私のシステム(Linux x86)では、除算がゼロに丸める方法を乱用します。

マジック定数には86400、2つの目的があります。

  • 曜日に影響を与えることなく、年から減算してマイナスにします。これにより、部門が切り捨てられるのではなく切り上げられるようになります。
  • 月曜日が0になるように日数をシフトします。

1日の秒数でもあります。


y+=m>2;代わりに使用しm>2?y++:0;、数バイト削ります。
クリア

2

Javascript、126 123文字

坂本のアルゴリズムを使用して0 =日曜日:

prompt().replace(/(....)(..)(..)/,function(_,y,m,d){y-=m<3;alert((+d+y-~(y/4)+~(y/100)-~(y/400)+ +".621462403513"[+m])%7)})

分裂が崩壊する可能性があると思うが、今は見えない。

編集:部門を改善しました(~~できる場合は必要ありません~)。


2

Pythonの283 116 113 109バイト

坂本のアルゴリズムを実装します。ゴルフの提案を歓迎します。オンラインでお試しください!

編集: 私はこの年齢前に修正する必要がありました。ジョナサンアランの提案から-6バイト+実際にコードを修正するための+2バイト。

def w(s):m=int(s[4:6]);y,d=int(s[:4])-(m<3),int(s[6:]);return(y+y/4-y/100+y/400+int('032503514624'[m-1])+d)%7

入力は単一の文字列でなければなりません。
msh210

int('032503514624'[m-1])セーブ6
ジョナサンアラン

0

Perl-110バイト

perl -p source.plまたはperl -pe 'here-is-code'を使用して実行するソリューションを次に示します。

s/((..)(..))(..)(..)/(1+3*$1+$2-2*($1%4+$2%4)-(2<$4?$4+(1&$4&&4-(8&$4)):(2^$4)+(!($3%4)-!-$3+!($2%4)))+$5)%7/e

テストケースをコピーして標準入力に貼り付けます。

これは、変数、文字列定数、および除算のない唯一のコードのようです。


0

JavaScript(ES6)、73バイト(非競合)

d=>(w=new Date(d[s="slice"](0,4),d[s](4,6)-1,d[s](-2)).getDay())-(w?1:-6)

それを試してみてください

f=
d=>(w=new Date(d[s="slice"](0,4),d[s](4,6)-1,d[s](-2)).getDay())-(w?1:-6)
o.innerText=f(i.value="59161021")
oninput=_=>i.value.length==8&&(o.innerText=f(i.value))
<input id=i type=number><pre id=o>


競合しない理由
Programmer5000

@ programmer5000、チャレンジが投稿された日付を確認してください;)
シャギー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.