128年?仮想うるう年の改革


23

このビデオによると、太陽年は365日、5時間、48分、45秒、138ミリ秒です。現在のグレゴリオ暦では、うるう年の規則は次のとおりです。

if      year is divisible by 400, LEAP YEAR
else if year is divisible by 100, COMMON YEAR
else if year is divisible by 4,   LEAP YEAR
else,                             COMMON YEAR

残念ながら、この方法は3216年ごとに1日ずれています。

カレンダーを変更する1つの可能な方法は、次の規則です。

if      year is divisible by 128, COMMON YEAR
else if year is divisible by 4,   LEAP YEAR
else,                             COMMON YEAR

これには、さらに625,000年間、カレンダーを再度変更する必要がないか、ギブまたはテイクする必要がないという利点があります。

全世界が、今から4年ごとにこのシステムを使用し、128年ごとを除いてうるう年であると判断し、カレンダーを次のように変更するとします。

YEAR    GREGORIAN    128-YEAR
2044    LEAP         LEAP
2048    LEAP         COMMON
2052    LEAP         LEAP
 ...
2096    LEAP         LEAP
2100    COMMON       LEAP
2104    LEAP         LEAP
 ...
2296    LEAP         LEAP
2300    COMMON       LEAP
2304    LEAP         COMMON
2308    LEAP         LEAP

これは曜日アルゴリズムにどのように影響しますか?

チャレンジ

  • 2000年から100000年までの日付を指定すると、この新しいカレンダーの下で曜日を見つけます。
  • 使用している形式を明確に指定している限り、入力および出力形式はすべて許可されます。
  • これはコードゴルフですので、可能な限りゴルフのように解決するようにしてください!

テストケース

"28 February 2048" -> "Friday"
"March 1, 2048"    -> "Sat"
(2100, 2, 29)      -> 0           # 0-indexed with Sunday as 0
"2100-02-29"       -> 7           # 1-indexed with Sunday as 7
"28 Feb. 2176"     -> "Wednesday"
"1-Mar-2176"       -> "Th"
"28/02/100000"     -> "F"         # DD/MM/YYYYYY
"Feb. 29, 100000"  -> 6           # 1-indexed with Sunday as 7
"03/01/100000"     -> 1          # MM/DD/YYYYYY and 1-indexed with Sunday as 1

チャレンジに関する提案やフィードバックを歓迎します。幸運と良いゴルフ!


テストケース#4の場合、1のインデックスが付けられていますよね?それ以外の場合は、その週に8日が必要です。
セバスチャン

また、「良いゴルフ」と言うので、これは#code-golfの挑戦ですか?その場合は、勝者の基準(最低バイト数/文字数など)を入力し、タグとして追加します。
セバスチャン

@Sebastianあなたは両方の点で正しいです。私はすでにチャレンジを編集しました。ご意見をお
Sherlock9

1
タイトルを読んでいるとき、私はマット・パーカーのビデオについてすぐに知りました。スレッドでもリンクされているのを見て
うれしい

1
標準の曜日ライブラリを使用して、それに応じてグローバル定数を変更するだけです。;)
ワイルドカード

回答:


8

C(gcc)、60バイト

f(m,d,y){y-=m<3;return(y+y/4-y/128+"-bed=pen+mad."[m]+d)%7;}

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

坂本の方法の簡単な修正。入力を整数の引数として順番month, day, yearに受け取り、その日の番号を出力します(日曜日に0からインデックス付けされます)。


この"-bed=pen+mad."部分は何をしますか?
ericw31415

@ ericw31415各月の長さを日数で表し、見た目のために、序数(31、28 ...)の文字ではなく、7の倍数だけシフトされます。
notjagan

右、charまだ数字を表しているのを忘れていたので、mod 7直接行うことができます。
ericw31415

6

Wolfram言語(Mathematica)57 55 53バイト

DayName@{m=#~Mod~128;6+Mod[(9#-m)/8-6Clip@m,28],##2}&

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

年、月、日の順に3つの入力を受け取ります。あなたは上記のような機能を保存した場合たとえば、fun、その後、fun[2048,2,28]あなたの2048年2月28日の曜日を伝えます。

使い方

この式m=#~Mod~128;6+Mod[(9#-m)/8-6Clip@m,28]は、年をAD 6〜33 ADの同等の年(まったく同じ曜日の年)に変換します。これを行うには、オフセットを減算し、年mod 28を使用します。ただし、オフセットは128年ごとに変化し、128で割り切れる年については、同等の年がうるう年ではないため、さらに調整する必要があります。

とにかく、それが完了したら、組み込みのを使用して、同等の年の月と日を検索しDayNameます。



3

JavaScript、65 59バイト

(d,m,y)=>(y-=m<3,(+"0032503514624"[m]+y+(y>>2)-(y>>7)+d)%7)

(d,m,y)=>(y-=m<3,(+"0032503514624"[m]+~~y+~~(y/4)-~~(y/128)+d)%7)

坂本の方法を使用します。与える0=Sunday, 1=Monday, 2=Tuesday...

Misha Lavrovのおかげで-2バイト
Arnauldのおかげで-4バイト


1
~~y変更できると思いますy。入力で小数年を取得するつもりはありませんよね?しかし、私はJavaScriptに堪能ではないことを認めています。
ミシャラヴロフ

2
どう+y+(y>>2)-(y>>7)
アーナルド

@MishaLavrovはい、そうです。何らかの理由で、私はすべてを床にする必要があると決めました。
ericw31415

2

実際には、37バイト

これはポートですnotjaganの変更坂本のアルゴリズムが、いくつかのスタックベースのトリックを以下に説明するように。入力形式はday, year, monthです。出力形式は0-indexed with Sunday as 0です。ゴルフの提案を歓迎します!オンラインでお試しください!

;"0032503514624"Ei)3>±+;¼L;¼¼½L±kΣ7@%

説明

                     Implicit input: day, year, month (month is at TOS)
;"0032503514624"Ei)  Get the month code, convert to float, rotate to bottom of the stack
3>±+                 If 3>month, add -1 to year
;¼L                  Push floor(year/4) to stack
;¼¼½L±               Push floor(year/4) and append -floor(year/128) to stack.
kΣ                   Wrap the stack (y/128, y/4, y, month_code, d) in a list and sum
7@%                  Get the sum modulo 7
                     Implicit return

2

ゼリー32 31 30 28バイト

別のポートnotjaganの変更坂本のアルゴリズムが、の代わりに、ベース250の数では032503514624(追加を必要としない0ゼリーは1-インデックスされるため)。入力形式はmonth, year, dayです。出力形式は0-based with Sunday as 0です。リンクの配置が難しく、まだゴルフが可能な方法として、ゴルフの提案は大歓迎です。オンラインでお試しください!

編集:整数除算の代わりにビットシフトを使用することで-1バイト。-1バイトは、先頭と入力形式の再配置から。-2バイトは、アウトゴルファーのエリックとコイアリンガリングのおかげです。

3>_@µæ»7,2I+µ“Ṿ⁵Ḥ9{’D³ị+⁵+%7

説明

         Three arguments: month, year, day
3>_@     Subtract (month<3) from year. Call it y.
µ        Start a new monadic chain.
æ»7,2    Bit shift y by both 7 and 2 (equivalent to integer division by 128 and by 4).
I+       y + y/4 - y/128
µ        Start a new monadic chain.
“Ṿ⁵Ḥ9{’  The number 732573514624 in base 250.
D        The list [7, 3, 2, 5, 7, 3, 5, 1, 4, 6, 2, 4].
³ị       Get the month code from the list (1-based indexing).
+⁵+      Add y, our month code, and day together.
%7       Modulus 7.

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