数字の日付範囲


15

注:私はオランダ人なのでdd-MM-yyyy、チャレンジの説明とテストケースではすべての日付がオランダ語の形式になっています。

チャレンジ:

入力:
開始日s ; 終了日e ; 桁n

出力:
範囲[s,e](両側を含む)内のすべての日付。日付にnの一意の数字が含まれます。

例:

入力:開始日:12-11-1991; 終了日:02-02-1992; 桁:4

出力:
日/月の先頭に0を付けます:

[20-11-1991, 23-11-1991, 24-11-1991, 25-11-1991, 26-11-1991, 27-11-1991, 28-11-1991, 30-11-1991, 01-12-1991, 02-12-1991, 09-12-1991, 10-12-1991, 13-12-1991, 14-12-1991, 15-12-1991, 16-12-1991, 17-12-1991, 18-12-1991, 20-12-1991, 23-12-1991, 24-12-1991, 25-12-1991, 26-12-1991, 27-12-1991, 28-12-1991, 31-12-1991, 01-01-1992, 02-01-1992, 09-01-1992, 10-01-1992, 11-01-1992, 12-01-1992, 19-01-1992, 20-01-1992, 21-01-1992, 22-01-1992, 29-01-1992, 01-02-1992, 02-02-1992]

日/月の先頭に0がない場合:

[20-11-1991, 23-11-1991, 24-11-1991, 25-11-1991, 26-11-1991, 27-11-1991, 28-11-1991, 30-11-1991, 3-12-1991, 4-12-1991, 5-12-1991, 6-12-1991, 7-12-1991, 8-12-1991, 10-12-1991, 13-12-1991, 14-12-1991, 15-12-1991, 16-12-1991, 17-12-1991, 18-12-1991, 20-12-1991, 23-12-1991, 24-12-1991, 25-12-1991, 26-12-1991, 27-12-1991, 28-12-1991, 31-12-1991, 3-1-1992, 4-1-1992, 5-1-1992, 6-1-1992, 7-1-1992, 8-1-1992, 10-1-1992, 13-1-1992, 14-1-1992, 15-1-1992, 16-1-1992, 17-1-1992, 18-1-1992, 20-1-1992, 23-1-1992, 24-1-1992, 25-1-1992, 26-1-1992, 27-1-1992, 28-1-1992, 31-1-1992]

チャレンジルール:

  • 入力および出力の日付は、任意の妥当な(日付)形式です。任意の文字列として使用できますdMy形式の(オプションの区切り文字を含む)、3つの整数のリスト、言語のネイティブDateオブジェクトなどとして使用できます。出力は、リスト/配列/ストリーム、STDOUTに出力、単一の区切り文字列などです。
  • 出力に日/月の先頭の0を含めたり除外したりできます。answerどちらを使用するかを指定してください。異なる結果が生じるためです。つまり1-1-1991、2つの一意の数字がありますが、01-01-1991、3つの一意の数字として。
  • うるう年やグレゴリオ暦とユリウス暦の違いに対処する必要はありません。テストケースで指定された日付範囲は、4で割り切れる年の間、2月28日/ 3月1日を超えることはないと想定できます。
  • 入力桁nの範囲にあることが保証されている[18]、これを扱うn=0指定されていない(空のリストを返すことは最も合理的であるが、エラーを与えるか、誤った結果が同様に罰金です。あなたウォンその入力を処理する必要はありません)。

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、コードゴルフ以外の言語で回答を投稿しないようにしてください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。
  • 標準のルールデフォルトのI / Oルールで回答に適用されますでの STDIN / STDOUT、適切なパラメーターと戻り値型、完全なプログラムを持つ関数/メソッドを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテストへのリンク(TIOなど)を追加してください。
  • また、回答の説明を追加することを強くお勧めします。

テストケース:

Inputs: [12-11-1991, 02-02-1992], 4
Outputs with leading 0s:    [20-11-1991, 23-11-1991, 24-11-1991, 25-11-1991, 26-11-1991, 27-11-1991, 28-11-1991, 30-11-1991, 01-12-1991, 02-12-1991, 09-12-1991, 10-12-1991, 13-12-1991, 14-12-1991, 15-12-1991, 16-12-1991, 17-12-1991, 18-12-1991, 20-12-1991, 23-12-1991, 24-12-1991, 25-12-1991, 26-12-1991, 27-12-1991, 28-12-1991, 31-12-1991, 01-01-1992, 02-01-1992, 09-01-1992, 10-01-1992, 11-01-1992, 12-01-1992, 19-01-1992, 20-01-1992, 21-01-1992, 22-01-1992, 29-01-1992, 01-02-1992, 02-02-1992]
Outputs without leading 0s: [20-11-1991, 23-11-1991, 24-11-1991, 25-11-1991, 26-11-1991, 27-11-1991, 28-11-1991, 30-11-1991, 3-12-1991, 4-12-1991, 5-12-1991, 6-12-1991, 7-12-1991, 8-12-1991, 10-12-1991, 13-12-1991, 14-12-1991, 15-12-1991, 16-12-1991, 17-12-1991, 18-12-1991, 20-12-1991, 23-12-1991, 24-12-1991, 25-12-1991, 26-12-1991, 27-12-1991, 28-12-1991, 31-12-1991, 3-1-1992, 4-1-1992, 5-1-1992, 6-1-1992, 7-1-1992, 8-1-1992, 10-1-1992, 13-1-1992, 14-1-1992, 15-1-1992, 16-1-1992, 17-1-1992, 18-1-1992, 20-1-1992, 23-1-1992, 24-1-1992, 25-1-1992, 26-1-1992, 27-1-1992, 28-1-1992, 31-1-1992]

Inputs: [19-09-2019, 30-09-2019], 5
Outputs (same with and without leading 0s): [23-09-2019, 24-09-2019, 25-09-2019, 26-09-2019, 27-09-2019, 28-09-2019, 30-09-2019]

Inputs: [19-09-2019, 30-09-2019], 8
Output (same with and without leading 0s): []

Inputs: [20-06-1749, 30-06-1749], 8
Outputs with leading 0s:    [23-06-1749, 25-06-1749, 28-06-1749]
Outputs without leading 0s: []

Inputs: [10-12-1969, 12-01-1970], 6
Outputs (same with and without leading 0s): [30-12-1969]

Inputs: [10-12-1969, 12-01-1970], 5
Outputs with leading 0s:    [10-12-1969, 13-12-1969, 14-12-1969, 15-12-1969, 17-12-1969, 18-12-1969, 20-12-1969, 23-12-1969, 24-12-1969, 25-12-1969, 27-12-1969, 28-12-1969, 31-12-1969, 02-01-1970, 03-01-1970, 04-01-1970, 05-01-1970, 06-01-1970, 08-01-1970, 12-01-1970]
Outputs without leading 0s: [10-12-1969, 13-12-1969, 14-12-1969, 15-12-1969, 17-12-1969, 18-12-1969, 20-12-1969, 23-12-1969, 24-12-1969, 25-12-1969, 27-12-1969, 28-12-1969, 31-12-1969, 2-1-1970, 3-1-1970, 4-1-1970, 5-1-1970, 6-1-1970, 8-1-1970, 12-1-1970]

Inputs: [11-11-1111, 11-11-1111], 1
Output (same with and without leading 0s): [11-11-1111]

私はそれがここで要求される形式ではないことを知っていますが、ここで「言葉を広める」とコメントします:プログラマーが日付(ログ、ファイル名など)に使用すべき国際標準があります:en.wikipedia.org /ウィキ/ ISO_8601。( 'T'を使用して曖昧さをなくし(Tがない場合、日付と時刻は完全に別のものになる可能性があります)、使用するセパレーターを指定します。セパレーターを使用できない場合(つまり、短いものから長いものまで)標準]:主なもの:YYYY-MM-DDThh:mm:ss.mmm +hh:mm、+ hh:mmはロケールのUTCからの時間オフセットです。)
オリビエデュラック

回答:


2

Japt、23 バイト

日付入力をUnixタイムスタンプとして取得0し、ロケールに依存する書式設定と先頭のsを持つ文字列の配列を出力します。Japt v2では1バイト短くなりますが、Dateオブジェクトを文字列に変換するときにバグがあるようです。

òV864e5@ÐX s7Ãf_¬â ʶWÄ

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

òV864e5@ÐX s7Ãf_¬â ʶWÄ     :Implicit input of integers U=s,V=e & W=n
òV                          :Range [U,V]
  864e5                     :  With step 86,400,000 (24*60*60*1000)
       @                    :Map each X
        ÐX                  :  Convert to Date object
           s7               :  Convert to locale date string
             Ã              :End map
              f             :Filter
               _            :By passing each through the following function
                ¬           :  Split
                 â          :  Deduplicate
                   Ê        :  Length
                    ¶       :  Is equal to
                     WÄ     :  W+1, to account for the inclusion of the delimiting "/" or "-"


3

、93バイト

func[a b n][until[if n = length? exclude d: rejoin[a/4"-"a/3"-"a/2]"-"[print d]b < a: a + 1]]

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

日/月の先行ゼロなし。

Redが内部的09-10-2019に変換するのは残念です。その9-Oct-2019ため、日/月/年を個別に抽出する必要があります。


私は赤に精通していませんが、これから切り取られる余白がたくさんあるようです。私が間違っている場合はご容赦ください。
connectyourcharger

@connectyourcharger問題ありません!一見、不要な空白がいくつかありますが、トークンを分離するために必要です。赤の単語(識別子)にはを含めることができる-=+*<>?!~&ため、空白(または(...)[...]"...")が必要です。
ガレンイワノフ

2

Python 3.8(プレリリース)、84バイト

Gloweyeのおかげで-6バイト

lambda s,e,n:[d for i in range((e-s).days+1)if-len(set(d:=str(s+type(e-s)(i))))==~n]

3つの引数を受け入れる文字列のリスト(先頭のゼロを含む/含む)を返す名前のない関数:

  • s開始 - datetime.dateオブジェクト。
  • e終わり - datetime.dateオブジェクト。そして
  • n、日数- intオブジェクト。

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

注:関数はdatetime.dateオブジェクトを受け入れるため、そのためのインポートコードはカウントしていません(datetime.timedeltaこれらの入力オブジェクトの減算を介して間接的にアクセスできるため、オブジェクトのインポートを回避しました)。


1
type(obj)は、よりも3バイト短くなっていobj.__class__ます。
グローアイ

@Gloweye本当にありがとう!
ジョナサンアラン

@Gloweyeは最後に6を節約します(点が付き、括弧は既に存在します)
ジョナサンアラン

1
私はまだその深さまで分析していませんでした、ただ見て__class__、簡単なコメントをしました。いつも喜んでお手伝いします。
グロウアイ

1

JavaScript(ES6)、91バイト

入力をとして受け取り(n)(end)(start)ます。日付はミリ秒単位のUnixタイムスタンプとして予期されます。formatで日付のスペース区切りリストを返しますyyyy-mm-dd

先頭の0が含まれます。

n=>b=>g=a=>a>b?'':(new Set(d=new Date(a).toJSON().split`T`[0]).size+~n?'':d+' ')+g(a+864e5)

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


1
DSTシフトが発生すると、このスニペットはおそらく失敗します(その場合、a + 864e5は明日ではないかもしれません)。しかし、ありがたいことに、tioはDSTを持たないUTCタイムゾーンを使用します。-製品のWebサイトで同じロジックを使用し、DSTがシフトするまで何か問題があることに
気付い

1

PHP、90バイト

for([,$s,$e,$n]=$argv;$s<=$e;)$n-count(count_chars($d=date(Ymd,86400*$s++),1))||print$d._;

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

これは、先頭に0が付きます。入力はコマンド引数($argv)で、日付は日単位のUnixタイムスタンプ(基本的には標準秒/ 86400)です。このチャレンジでは時間が必要ないため、この形式を使用しました。終わりに達するまで開始日を追加し続け、形式$nで区切られ_た一意の数字を含む日付を出力しYmdます。

また、入力と同じ形式で出力する日付(日単位の UNIXタイムスタンプ)を出力する89バイトの代替もあります


1

Java(JDK)、86バイト

(s,e,n)->s.datesUntil(e.plusDays(1)).filter(d->(""+d).chars().distinct().count()==n+1)

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

リードを使用することにしました 0 s。

クレジット

  • -24 あまりゴルフをすることができるとは知らなかったKevin Cruijssenに感謝します:p

1
多分両端で包括的にすべきではなかったのでdatesUntil103バイトのJava 9を使用できたでしょう。;) いい答え。個人的にゴルフできるものは見当たりません。
ケビンCruijssen

1
@KevinCruijssenまあ、実際、あなたはゴルフの非常に素晴らしい方法を与えました!あなたが書いたように、値オブジェクトとストリームが許可されているので日付を返すことができるため、それを追加.plusDays(1)および削除するだけで.forEach(System.out::println)、非常に多くの答えが得られます。;-)私datesUntilも存在する手がかりがありませんでした!ありがとうございます:-)
オリヴィエグレゴワール

おっと、ストリームリターンを許可する独自のルールを忘れてしまった、ハハXD私はばかです。しかし、私の愚かさであなたを助けることができてうれしいです。; p
ケビンクルーイッセン


1

C#(Visual C#Interactive Compiler)

リーディング0せず、104、103バイト

(s,e,n)=>new int[(e-s).Days+1].Select((x,i)=>s.AddDays(i)).Where(x=>$"{x:yyyMd}".Distinct().Count()>=n)

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

先行0で、106 105バイト

(s,e,n)=>new int[(e-s).Days+1].Select((x,i)=>s.AddDays(i)).Where(x=>$"{x:yyyMMdd}".Distinct().Count()>=n)

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


x =>$"両方のバージョンで-1のスペースを削除できます。:)
ケビンクルーイッセン

@KevinCruijssen ah fuck thanks x)誰かがもっと短い解決策を思い付くことができると確信しています、私はこれに満足していません
Innat3

0

Kotlin、119バイト

fun f(a:LocalDate,b:LocalDate,c:Long)=a.datesUntil(b.plusDays(1)).filter{it.toString().chars().distinct().count()==c+1}

大手0がなければ、2にかかるjava.time.LocalDateLong、返すStreamLocalDate


こんにちは、CCGCへようこそ!おそらくそれが機能することを確認するために、テストコードを含む[ オンラインで試す]リンクを追加しもらえますか?また、私はKotlinを知らないが、それは交換することが可能であるit.toString()(it+"")数バイトを保存しますか?これは、Javaや.NET C#のような他の言語でも可能です。
ケビンCruijssen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.