これらの日は私のために働く


8

バックグラウンド

あなたは魅力的なコードゴルファーであり、かなりの数の人々があなたに尋ねています。

あなたは正確にあなたが利用できる日を考える時間がないので、日付を受け入れてその週の曜日を返す関数を作成することに決めました。

次に、それらの曜日を取り、それをカレンダープログラムに挿入して、他の誰かがすでにあなたに依頼していないかどうかを確認します。

ルール

  • YYYY-MM-DD形式の日付を受け入れます
  • その週の日付の配列/リストを返します。(日曜日が最初の日です)
    • 日付は、1970年1月1日からその日付までのミリ秒単位で、「一般的な」日付形式1または日付オブジェクトで表示できます。
  • 日付の順序は昇順でなければなりません。
    • (あなたは降順リストのサポートを含めるのに十分賢いですが、プログラムは昇順リストで最も速く動作することができ、誰に数ミリ秒の余裕がありますか?)
  • 1993年以降、いつでも一緒に仕事をする必要があります(はい、あなたは執筆時点で24歳です!)
  • すべてのJavascriptの回答はハイファイブを獲得します!

スペック

入力例: whichDates(2017-08-29)

出力:(同等のもの)

console.log([
  Date.parse('2017-08-27'),
  Date.parse('2017-08-28'),
  Date.parse('2017-08-29'),
  Date.parse('2017-08-30'),
  Date.parse('2017-08-31'),
  Date.parse('2017-09-01'),
  Date.parse('2017-09-02'),
]);

1かなりよく知られているフォーマット。YYYY-MM-DDなど。

2これはです!言語ごとの最短コードが優先されますが、全体的に最短のコードはエメラルドチェックマークを取得します。


2
また、他の形式を許可することをお勧めしますYYYY-MM-DD(厳密にする必要がある理由はわかりません)。
Xcoder氏、2017

5
最初の文は、私が挑戦で見た中で最も奇妙であまり説得力のない紹介です。よくできました:-)
Luis Mendo 2017

2
@LuisMendoありがとうございます!しかし、あなたは正確に密かに自分の病気のプログラミングのスキルを眺めているかを知ることはありません....
クリス・ハッピー

1
なぜすべてのJavascriptの回答がハイファイブになるのか
sergiol 2017

1
Date.parse(2017-08-27)?? これはDate.parse('2017-08-27')
tsh

回答:


1

Japt、15バイト

ÐU
7Æf1X+Uf -Ue

試して


説明

stringの暗黙の入力U

ÐU

U日付オブジェクトに変換し、に再度割り当てUます。

から0までの整数の配列を作成し6、をX現在の要素とする関数に渡します。

f1

の日付を設定しますU

X+Uf

の現在の日付をUに追加しXます。

-Ue

の現在の曜日を減算しUます。

結果の配列を暗黙的に出力します。


5

Perl 6、47バイト

{my$d=Date.new($_);map($d+*-$d.day-of-week,^7)}

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

コードはほとんど自明です。まず$d、文字列からDateオブジェクトを作成します。これは、たまたまISOwhatever形式です。日付を使って算術を実行することができます(整数を追加する=その日数を追加する、減算と同じ)。そう$d-$d.day-of-weekです最終この(私の神、週はいつも月曜日から始まります:D)週の日曜日。(.day-of-week月曜日は1から日曜日は7です。)次に、0から6(^7)にマッピングし、それを日曜日に追加して、すべての曜日を取得します。星の代わりに、マッピングしている番号が表示されます*。その後、このリストが返されます。


5

JavaScript(ES6)、73 63 62バイト

JavaScriptでも試してみたいと思いました。

編集:プロンプトで許可されているミリ秒アプローチを使用して、62バイトに減らしました。

s=>[..."0123456"].map(i=>(x=new Date(s))-(x.getDay()-i)*864e5)

.map(x=>new Date(x))変換したい場合は、返された配列に対してa を実行できます。


日付アプローチの維持(72バイト

s=>[..."0123456"].map(i=>new Date((x=new Date(s))-(x.getDay()-i)*864e5))

私の最初の提出にバグがありました、それは修正されました。牛乳による観察のおかげで、バグを取り除くことができ、それでもバイト数を減らすことができました。


ハイタッチ!!
Chris Happy

2
サイトへようこそ!
Luis Mendo 2017

配列に数値を書き込むだけの方が短いです。60バイト:s=>[..."0123456"].map(i=>(x=new Date(s))-(x.getDay()-i)*8e7)
ミルク

1
PPCGへようこそ。うまく結びついています:)ヒント1:keys配列をマッピングするときに、を破棄して、要素の代わりにインデックスを使用します。ヒント2:配列がこれほど小さい場合、私が行った方法で生成する方が短いです。
Shaggy

3

MATL22 21バイト

7:j8XOs21Y2=f-GYO+1XO

出力はdd-mm-yyyyフォーマットです。

MATL Online試しください

説明

7:     % Push [1 2 3 4 5 6 7]
j      % Input as a string
8XO    % Convert date to string with format 8, which is 'Mon', 'Tue' etc
s      % Sum
21Y2   % Push predefined literal [298 302 288 305 289 296 310]. The first number
       % is the sum of ASCII codes of 'Mon', the second is that of 'Tue', etc.
=      % Is equal?, element-wise
f      % Index of nonzero value. For example, if input is a Friday this gives 5
-      % Subtract, element-wise. For a Friday this gives [-4 -3 -2 -1 0 1 2]
G      % Push input again
YO     % Convert to date number: number of days from January 0, 0000
+      % Add, element-wise
1XO    % Convert to date format 1, which is 'dd-mm-yyyy'. Implicitly display

3

JavaScript(ES6)、76バイト

私はようやく、効率的なゴルフに最も不利な環境に気付いたと思います。バーの後ろから、もう一方の手でパイントを提供している間です!

s=>[...""+8e6].map((_,x)=>d.setDate(d.getDate()-d.getDay()+x),d=new Date(s))

オンラインで試してみてください(スニペットでフォロー)


説明

s=>

(formatのyyyy-(m)m-(d)d)文字列を引数として引数として取る無名関数s

[...""+8e6]

8000000科学表記法で文字列に変換し、それよりも短い7つの要素の配列を作成します[...Array(7)]

.map((_,x)=>          )

配列にマッピングし、各要素を関数に渡します。_は、現在使用されていない要素でありx、現在のインデックスであり、0から始まります。

,d=new Date(s)

オブジェクトに変換sDateて変数に割り当てるd

d.setDate(     )

の日付を設定しますd

d.getDate()

の現在の日付を取得しますd

-d.getDay()

日曜日を取得するには、現在の曜日番号(0から始まる)を減算します。

+x

を追加しxます。


2
もう片方の手でパイントを出している間!-
優れた

ほとんど忘れました... ハイファイブ!
Chris Happy

2
@ChrisHappyあなたがJSを学んでいるなら、ゴルフのヒントを探すために見てはいけません:P
caird coinheringaahing

1
@ChrisHappy:私が1つ書くのに十分な時間があるまで、それは日曜日であるかもしれません。それまでバーの後ろに引っかかっていた。
Shaggy

1
@ChrisHappy:1分見つかりました、説明が追加されました。JS でゴルフをするためのトリックをもっと探している場合は、tipsタグの下にあるJSのヒントを確認してください。
Shaggy

2

Bash +共通ユーティリティ、53

jot -w@ 7 `date -f- +%s-%w*86400|bc` - 86400|date -f-

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

これは、GNU日付の出力が「一般的な」日付形式であることを前提としていますFri Sep 1 00:00:00 UTC 2017

説明

           date -f- +%s-%w*86400                       # read date from STDIN, output expression "seconds-since-epoch - (index of day in week * 60 * 60 * 24)
                                |bc                    # arithmetically evaluate generated expression - result is date of required sunday in seconds-since-epoch
jot -w@ 7 `                        ` - 86400           # output seconds-since-epoch for all 7 required days of the week, prefixed with "@"
                                            |date -f-  # convert all seconds-since-epoch dates back to regular dates

2

Pythonの3、133の 124 126 112バイト

Xcoder氏のおかげで-9バイト
+2バイトは週が日曜日から始まるため
-14バイト notjaganのおかげで

from datetime import*
a=date(*map(int,input().split('-')))
for i in range(7):print(a-timedelta(a.weekday()-i+1))

それは私が期待したほどうまくいきませんでした。





これraw_input()は、input()上記の代わりにPython2でも機能します。(+4バイト)。 rangeこの小さなことについても、Python2で動作します。なければraw_input、あなたは、エラーが発生します。
トーマスウォード

1

Mathematica 20バイト?

Mathematicaは日のリストを単一の日付オブジェクトとして表現します。そのような日付オブジェクトが許容可能な出力である場合、次の20バイトの純関数が機能します。

#~DateObject~"Week"&

#~DateObject~"Week"&["2017-08-29"]

週オブジェクト


1
問題ありません!:)
クリスハッピー

1

ジャワ8(161 154 123 122 102 + 19 36バイト)

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

import static java.time.LocalDate.*;

e->{for(int i=0;i<7;System.out.println(parse(e).plusDays(i++-parse(e).getDayOfWeek().getValue()%7)));}

ソリューションとバイト数にインポートを含めることを忘れないでください。
ジェイコブ

またl、参照を削除してで置き換えることにより、バイトを節約できますLocalDate.parse(e)
ジェイコブ

@Jakobグッドシャウト、ありがとう
ロベルトグラハム

そして今、あなたiはループ本体でインクリメントして1バイトを節約することができます。ああ、java.util.function.*インポートはラムダで使用されないので、ソリューションの一部として数える必要はありません。
ジェイコブ

1

Python 2、115バイトまたは111バイト(入力形式に応じて)。

基本的に、これはSobszによって書かれたPython3の回答のコードとほとんど同じですが Python 2で動作するように作られています。


入力が次の形式の場合YYYY-MM-DD

(これは、入力が文字列を入力として表すために、入力が単一引用符で囲まれていないことを前提としています)

主な違いは、日付をアポストロフィで明示的に指定して文字列リテラルとして識別しない限り、raw_inputではなくが必要なことです。文字列リテラル入力がない場合、構文エラーが発生するため、を使用して日付を受け入れますinput'YYYY-MM-DD'raw_inputYYYY-MM-DDを文字列リテラルに入れず直接ことができます。

もちろん、これは入力が次のように入力されていることを前提としています2017-08-29

from datetime import*
a=date(*map(int,raw_input().split('-')))
for i in range(7):print a-timedelta(a.weekday()-i+1)

+4はSobszの回答から、-1は括弧を必要としないため printステートメントにからバイトを保存するためです。合計+3バイトの違い。

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


入力がフォームの場合 'YYYY-MM-DD'

(この回答を機能させるには、日付を引用符で囲んでおく必要があります)

必要ないので4バイトを節約できます。raw_これはSobszが提供するものと実質的に同じ答えですが、括弧を必要としないので1バイトを差し引いたものです。printコマンドのです。

これを指摘してくれたXcoder氏に感謝しますが、これは厳密にはSobszの回答の1バイトを引いた正確な複製です。

from datetime import*
a=date(*map(int,input().split('-')))
for i in range(7):print a-timedelta(a.weekday()-i+1)

1
PPCGへようこそ!raw_input()入力で置き換え、入力を引用符で囲むと、4バイトを節約できます。もちろん、それによってソリューションが重複に変わります:P
Mr. Xcoder

@ Mr.Xcoder True、これがスキップされた理由です。ただし、入力を最初に引用符で囲んだ場合、実際にはSobszから1バイトが保存されます。そのことを書き留めました。
トーマスワード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.