今日はセンターです


36

任意の便利な形式の入力として日付を指定し、その日付を5週間のウィンドウの正確な中心としてカレンダーを出力します。カレンダーのヘッダーには、曜日を表す2文字の略語(つまり、Su Mo Tu We Th Fr Sa)を含める必要があります。3文字またはその他の日の略語は許可されていません。

たとえば、April 2 2019入力として指定された場合、出力は次のようになります。

Sa Su Mo Tu We Th Fr
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31  1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19

与えられた日付がカレンダーのちょうど真ん中になるように。

与えられたFebruary 19 2020、出力

Su Mo Tu We Th Fr Sa
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
 1  2  3  4  5  6  7

の場合September 14 1752、次を表示します。

Mo Tu We Th Fr Sa Su
28 29 30 31  1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  1

  • 入力と出力は、任意の便利な方法で指定できます。
  • 入力は、空ではなく有効であることが保証されます(つまり、あなたは決して受信し""ないFeb 31など)。
  • すべての日付にグレゴリオ暦を想定します。
  • うるう年を考慮する必要があります。
  • 入力日付の範囲はJan 1 1600からDec 31 2500です。
  • STDOUTに出力するか、関数の結果として返すことができます。
  • 完全なプログラムまたは機能のいずれかが受け入れられます。
  • 文字が適切に並んでいる限り、任意の量の無関係な空白を使用できます。
  • 1桁の日の先頭のゼロは許可されますが、1桁の日付を左揃えにすることもできます。
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

回答:


12

R77 72バイト

function(d,`~`=format)write(c(strtrim(d+-3:3~"%a",2),d+-17:17~"%e"),1,7)

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

2文字の曜日の省略形を使用するように出力を修正しました。

Aaron Haymanのstrtrimおかげで-1バイト。

日付番号の先頭に0を埋め込みます。入力をaとして受け取ります。Dateこれは、を使用して作成できますas.Date("YYYY/MM/DD")

R 答えの奇妙な短い...


8

05AB1E175の 174 172 171 160 バイト

¦WΘ1š-1šVтFY`2ô0Kθ4ÖUD2Qi\28X+ë<7%É31α}‹iY¬>0ëY1¾ǝDÅsD12‹i>1ë\1Dǝ¤>2}}ǝVY})DJIJk18+£35.£¬.•4ιõ÷‡o‹ƶ¸•2ôs`UÐ3‹12*+>13*5÷s3‹Xα©т%D4÷®т÷©4÷®·()DćsćsO7%._s€нT‰J«7ô»

形式で入力します[day, month, year]01桁の日の先頭にsを付けて出力し、小文字でmo通しますsu(タイトルケースが必須の場合は、+ 1バイトを追加できます)。

オンラインそれを試してみたり、すべてのテストケースを確認してください

これは、最長の05AB1E回答の私の新しい記録かもしれません。それから、私がやった非常に複雑な課題を含めます。

重要な注意: 05AB1Eには、Dateオブジェクトまたは計算用の組み込み機能はありません。日付に関する唯一の組み込みは、今日の年/月/日/時間/分/秒/マイクロ秒です。

そのため、表示されるコードのほとんどすべては、前日と翌日を計算する手動計算であり(年の推移およびうるう年を考慮に入れて)、Zellerの合同を使用して曜日を計算しています。

コードの巨大な部分はからコピーされます この以前の05AB1Eのmineの回答ています。これは、以下の説明にも関連します。

説明:

前月の初日に行くことから始めます。

¦          # Remove the first item (the days) from the (implicit) input
 W         # Get the minimum (without popping the list itself)
           # (since the year is guaranteed to be above 1599, this is the month)
  Θ        # Check if its exactly 1 (1 if 1, 0 if in the range [2,31])
   1š      # Prepend a 1 as list (so we now have either [1,1] or [1,0]
     -     # Subtract this from the month and year
      1š   # And prepend a 1 for the day
        V  # Pop and store this first day of the previous month in variable `Y`

次に、その日付を開始日として使用し、次の100日間を計算します。

тF    # Loop 100 times:
  Y`2ô0Kθ4ÖUD2Qi\28X+ë<731α}‹iY¬>0ëY1¾ǝDÅsD12i>1ë\1Dǝ¤>2}}ǝV
      #  Calculate the next day in line
      #  (see the linked challenge above for a detailed explanation of this)
   Y  #  And leave it on the stack
 })   # After the loop: wrap the entire stack into a list, which contains our 100 days

次に、入力日付を中央にして、リストからその入力日付の前の17と後の17のみを残します。

DJ          # Duplicate the 100 dates, and join the day/month/year together to strings
  IJ        # Push the input, also joined together
    k       # Get the 0-based index of the input in this list
            # (the joins are necessary, because indexing doesn't work for 2D lists)
     18+    # Add 18 to this index (18 instead of 17, because the index is 0-based)
        £   # Only leave the first index+18 items from the 100 dates
     35.£   # Then only leave the last 35 items

これで35日間になりました。次のステップでは、曜日を計算し、出力テーブルのヘッダーを作成します。

¬                # Get the first date of the list (without popping the list itself)
 .•4ιõ÷‡o‹ƶ¸•    # Push compressed string "sasumotuwethfr"
             2ô  # Split it into chunks of size 2
s                # Swap to get the first date again
 `UÐ312*+>13*5÷s3Xα©т%D4÷®т÷©4÷®·()DćsćsO7%
                 # Calculate the day of the week (sa=0; su=1; ...; fr=6)
                 # (see the linked challenge above for a detailed explanation of this)
  ._             # Rotate the list of strings that many times

私のこの05AB1Eのヒントを参照してください(セクション圧縮文字列ではない辞書の一部にどのように?理由を理解すること.•4ιõ÷‡o‹ƶ¸•です"sasumotuwethfr"

次に、以前に作成した日付のリストに基づいて、テーブル自体を埋める日を作成します。これをヘッダーとマージします。その後、最終結果を印刷できます。

s           # Swap to get the list of dates again
 €н         # Only leave the first item of each date (the days)
   T       # Take the divmod 10 of each
     J      # Join those divmod results together
            # (we now have leading 0s for single-digit days)
      «     # Merge this list together with the header list
       7ô   # Split it into chunks of size 7
         »  # Join each inner list by spaces, and then each string by newlines
            # (and output the result implicitly)

2
それは膨大な量の仕事です!
ルイスメンドー

2
うん、Javaが05AB1Eを打ち負かしました!:D初めてだと思う;-)
オリビエグレゴワール

@LuisMendoほとんどは前回リンクされたチャレンジで行われましたが、はい、それは多くの作業でした..;)ところで説明が追加されました。
ケビンクルーッセン

@OlivierGrégoire今、私たちも同じバイカウントです。;)
Kevin Cruijssen

@OlivierGrégoireそして、今度は再び低くなりました、ごめんなさい。; p
ケビンクルーッセン

6

JavaScript(ES6)、 141  126バイト

借りて15のバイトを保存した.toUTCString().slice(0,2)からニールの答え

入力をDateオブジェクトとして受け取ります。

f=(d,n=0)=>n<42?(D=new Date(d-864e5*(24-n)),n<7?D.toUTCString().slice(0,2):(i=D.getDate())>9?i:' '+i)+`
 `[++n%7&&1]+f(d,n):''

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


えー、私が最初に書いたとき、3番目のテストケースでコードが失敗したことを誓うことができました...それは52バイトを節約します...
ニール

4

JavaScript(Node.js)205 152 145バイト

f=
d=>`012345`.replace(g=/./g,r=>`0123456
`.replace(g,c=>`${new Date(d-864e5*(24-c-r*7))[+r?`getUTCDate`:`toUTCString`]()}`.slice(0,2).padStart(3)))
<input type=date oninput=o.textContent=f(this.valueAsDate)><pre id=o>

オンラインでお試しください!JavaScript Dateオブジェクトまたはタイムスタンプとして入力を受け取ります。編集:@EmbodimentofIgnoranceのおかげで1バイトを保存し、出力に末尾の改行を追加することでさらに7バイトを保存できました。そもそもバグではない動作を回避していることを発見したとき、52バイトを節約しました...


padStart(2)-> padStart(3)、- 1バイトの結合文字列のスペースを削除します
無知の実施例



2

Wolfram言語(Mathematica)、123バイト

(s=#;Grid@Join[{StringTake[ToString@DayName[s~d~#]&/@Range[-3,3],2]},Partition[Last@d[s,#]&/@Range[-17,17],7]])&
d=DatePlus

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

GridTIOで動作しない理由はわかりませんが、このコードはこれを出力します

ここに画像の説明を入力してください

@DavidCは1バイトを保存しました


たぶんGridTIOは、あなたの写真のような項目を中央にすることはできませんので動作しませんか?
AdmBorkBork

@AdmBorkBork TIOでこのようなグラフィックをロードする方法があります。去年誰かが私に見せたと思う。しかし、私はそれを行う方法を覚えていません...だから誰かが知っているなら、私たちに知らせてください!
J42161217

2

MATL34 33 31バイト

YO-17:17+t7:)8XOO3Z(!1ew7XOU7e!

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

説明

YO       % Implicit input. Convert to date number. This is a single number
         % that specifies the date
-17:17   % Push [-17 -16 ... 16 17]
+        % Add to date number, element-wise. This gives a row vector of 35
         % date numbers centered around the input date
t        % Duplicate
7:       % Push [1 2 ... 7]
)        % Index into the 35-element vector. This keeps the first 7 entries
8XO      % Convert to day-of-week in 3 letters. Gives a 3-col char matrix
O3Z(     % Write char 0 (equivalent to space for display purposes) into the
         % 3rd column
!1e      % Tranpose and linearize into a row. This produces a string such as
         % 'Tu We Th Fr Sa Su Mo ', to be used as column headings
w        % Swap. This brings to top the row vector of 35 date numbers
         % computed from the input
7XO      % Convert to day-of-month. Gives a 2-col char matrix
U        % Convert each row to number
7e!      % Reshape into 7-row matrix and transpose
         % Implicit display. This prints the string with the headings and
         % the matrix. The latter has a minimum-one-space separation between
         % columns, so it is aligned with the headings

2

Java(JDK)、149バイト

d->{d.add(5,-24);for(int i=0,w;i<42;d.add(5,1))System.out.printf("%c%2s",i%7<1?10:32,i++<7?"SaSuMoTuWeThFr".substring(w=d.get(7)%7*2,w+2):d.get(5));}

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

クレジット



1
@KevinCruijssen待って...何?おめでとうございます!私はこれをしようとしましたが、それを行う方法を見つけることができませんでした、それでもあなたはそれをしました!とてもいいです:-)
オリビエグレゴワール

1
たぶん、あなたは結合するより何かを参照iしてj何とかし?それともj++%7<1?10:32、ビット単位の魔法でもっと短いものですか?しかし、それはあなたにお任せします。仕事に戻ります、笑 ;)
Kevin Cruijssen

1
ああ、もちろん。素敵なチームワーク!;)PS:どこのw略?なぜhヘッダーではないのですか?
ケビンクルーッセン

1
@KevinCruijssen w「の日のためにワット EEK」。また、ビットをいじるだけで、(i%7+6)/7*22+10どちらがはるかに長くなります。
オリビエグレゴワール

2

PHP197 189 187バイト

for($d=date_create($argn)->sub($i=new DateInterval(P17D)),$i->d=1;$x++<35;$h.=$x<8?substr($d->format(D),0,2).' ':'',$d->add($i))$o.=str_pad($d->format(j),3,' ',2);echo wordwrap($h.$o,20);

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

入力はSTDIN日付文字列としてです。で実行しphp -nFます。

$ echo April 2 2019|php -nF cal.php

Sa Su Mo Tu We Th Fr 
16 17 18 19 20 21 22 
23 24 25 26 27 28 29 
30 31  1  2  3  4  5 
 6  7  8  9 10 11 12 
13 14 15 16 17 18 19 

すべてのテストケースを検証する

または、ゼロが埋め込まれた1桁の174バイト


1

Excel VBA、190 159バイト

ありがとう@TaylorScott

Function z(i)
Dim d(5,6)
v=DateValue(i)-17
For x=1To 5
For y=0To 6
d(0,y)=Left(WeekdayName(Weekday(v+y)),2)
d(x,y)=day(v+y+(x-1)*7)
Next y,x
z=d()
End Function

Excel VBAの有効な日付文字列(たとえば、2020年2月19日、2/19 / 2020、19-Feb-2019)の形式で入力を受け取り、指定されたカレンダーを中心とした配列を返します。


あなたは、この溶液から空白を除去することによって、159まで、この解決策を得ることができますFunction z(i) Dim d(5,6) v=DateValue(i)-17 For x=1To 5 For y=0To 6 d(0,y)=Left(WeekdayName(Weekday(v+y)),2) d(x,y)=Day(v+y+(x-1)*7) Next y,x z=d() End Function
テイラー・スコット

@TaylorScottありがとう、これらのスペースを自動入力する組み込みエディターのみを使用していました。
ウィリアムポーター


0

T-SQL、203バイト

DECLARE @f date='2020-02-19'

,@ char(20)=0,@d char(105)=0SELECT
@=left(format(d,'D'),2)+' '+@,@d=right(d,2)+char(32-n%7/6*19)+@d
FROM(SELECT dateadd(d,number-17,@f)d,number n
FROM spt_values WHERE'P'=type)x ORDER BY-n
PRINT @+'
'+@d

オンラインバージョンは若干異なります。この投稿されたバージョンはMS-SQL Studio Managementで動作します。オンラインバージョンと比較して1バイト節約できますが、オンラインで正しい結果が得られません

オンラインで試す


0

Python 2、115バイト

from datetime import*
d=input()
for i in range(42):print(d+timedelta(i-24)).strftime('%'+'da'[i<7])[:2]+i%7/6*'\n',

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

これが許可されているかどうかはわかりません...の形式でSTDINから入力を受け取りますdate(year, month, day)。これはとして表すこともでき__import__('datetime').date(year, month, day)ます。これらは本当に__import__('datetime').dateオブジェクトです。

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