自由形式の日付を読む


10

以下の形式のいずれか(すべて同じプログラムで処理する必要がある)で記述された日付を指定して、有効なに解析しますyyyy/mm/dd date

17th May 2012
March 14th, 2016
20 February 2014
September 14, 2017
Sunday, June 8, 2015

ルール

  • 日付が無効になる場合があります。月または年の月数が正しくない場合は、両方のケースを処理する必要があります。エラーになるか、一貫した偽の値を返すかのどちらかを選択します。(ただし、上記のテンプレート形式を使用します)
  • 2桁の出力を作成するには、10未満の日と月のパディングを使用する必要があります。
  • 月の名前は常にフルネームであり、3文字の短縮形に短縮されません。
  • 年は常に0000〜9999の範囲内であると想定できます。
  • 負の数は処理する必要はありません。
  • 完全なプログラムまたは関数を作成して、出力を任意の形式にして、コンソールに出力したり、関数から返すことができます。
  • 入力が常に文字列であり、出力が常に文字列である必要がある場合は、配列内の単一の引数として受け取ると短くなります。["17th May 2012"]あなたはそうすることができ、出力は同じになる可能性があります["2012/05/17"]
  • 入力のスペルが正しいと想定できます。

ボーナス:ここでチャレンジが嫌いなcos;)

あなたはまたの入力フォーマットを許可するように管理することができた場合The Fourteenth of March, 2016、またはMarch the Fourteenth, 2016あなたが余分かかる場合があります20バイトの少ない1その結果1よりも最終的なバイト数でコードオフ。

スペルの混乱を避けるために、各曜日の完全な筆記番号を以下に示します。

First, Second, Third, Fourth, Fifth, Sixth, Seventh, Eighth, Nineth, Tenth, Eleventh, Twelfth, Thirteenth, Fourteenth, Fifteenth, Sixteenth, Seventeenth, Eighteenth, Nineteenth, Twentieth, Twenty First, Twenty Second, Twenty Third, Twenty Fourth, Twenty Fifth, Twenty Sixth, Twenty Seventh, Twenty Eighth, Twenty Nineth, Thirtieth, Thirty First

テストケース

INPUT                           | Output
17th May 2012                   | 2012/05/17
March 14th, 2016                | 2016/03/14
20 February 2014                | 2014/02/20
September 14, 2017              | 2017/09/14
Sunday, June 8, 2015            | 2015/06/08
1st January 1918                | 1918/01/01

The Fourteenth of March, 2016   | 2016/03/14
March the Fourteenth, 2016      | 2016/03/14
November the Seventeenth, 2019  | 2019/11/17
The Thirtieth of April, 2016    | 2016/04/30

30 February 2014                | Invalid
September 99, 2017              | Invalid
Sunday, June8, 2015             | Invalid

The Thirty First of April, 2016 | Invalid


10
ここで挑戦を好まないcos」-彼らがボーナスの形で来るとき、ほとんどすべての人がそうではありません!そして、入力検証を開始します。
Shaggy 2017

3
Mr.Xcoder I @全体の課題は、複数の入力フォーマットをサポートすることだと思います。..のようなものが20 February 2014デフォルトの日付パーサの多くでサポートされますが、17thSunday, June 8, 2015少し難しく(言語に依存)を解析することです。
Kevin Cruijssen 2017

1
@ Mr.Xcoder私はそれが楽しい/退屈、簡単/難しい、良い/悪いコードゴルフの挑戦であるとは決して言っていません。チャレンジで読んだ内容に基づいて、複数の入力形式のサポートがチャレンジの主な目標であるように思われると単に述べています。5つの入力形式のif-else、または年、月、日を抽出するある種の正規表現(これが現在のアプローチです)になる可能性が高いことに同意します。
Kevin Cruijssen 2017

3
曜日は常に正しいですか?うThursday, August 25, 2017有効では?DOWを無視した提出が見られます。
ベンジャミンクニンガム2017

回答:


4

レール、4137の 35バイト

->x{x.to_date.strftime('%Y/%m/%d')}

Railsのオンラインインタープリターについては知りませんが、このprocを示すスクリーンショットがあります

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


オンライン通訳リンク?
ジョナサンアラン

1
これは問題のすべてのフォーマットで本当に機能しますか?:o
完全に人間的な2017

@totallyhuman結果を示すスクリーンショットを追加しました。残念ながら、私はオンライン通訳を知りません:(
Suever

8

PowerShell91 89 91 56バイト

date("$args"-replace'th|rd|st|(\b.*)day|,')-f yyyy/MM/dd

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

入力を文字列として受け取ります。a -replaceを使用してジャンクを取り除き、次に組み込みGet-Dateコマンドと-formatフラグを使用して、必要なyyyy/MM/dd形式を指定します。その文字列はパイプラインに残され、出力は暗黙的です。

Xcoder氏のお陰で2バイト節約。TessellatingHecklerの正規表現ゴルフのおかげで巨大なチャンクを保存しました。


1
ちょっと競争力のあるPowerShellの提出を見てください!
Erik the Outgolfer 2017

@EriktheOutgolfer日付の操作は、PowerShellの長所の1つです。
AdmBorkBork 2017


@ Mr.Xcoder "すべて" = 2.笑。ありがとう!
AdmBorkBork 2017

''-2の場合、日付形式からを削除できます。「スペルが正しい」という前提でアプローチを固守したい場合は、置き換え'th|rd|st|(\b.*)day|,'て56バイトに落として同じケースを処理できます。日を落とすSunday, June8, 2015 | Invalidと月曜日だったので拾えないので間違っていると思います 。エラーになるはずですが、有効と解釈されます。その決定がどうなるか、または他の人がそれをチェックしているかどうかはわかりません。
TessellatingHeckler 2017

4

PHP、73 164 + 1バイト

for(preg_match("#(\d+)[^\d]+(\d+)#",$d=$argn,$r);$m++<12;)strpos(_.$d,date(F,strtotime($r[2].-$m)))&&printf(checkdate($m,$r[1],$r[2])?"$r[2]/%02d/%02d":E,$m,$r[1]);

でパイプとして実行する-nR、オンラインで試してください

日付チェックは非常にコストがかかりました。組み込みを使用する前に日付を分解し、月名でエラーを発生させなければなりませんでした。


1つだけでなく、すべてのフォーマットをサポートする必要があると思いますか?
Erik the Outgolfer 2017

1
@EriktheOutgolferします。しかし、ボーナス形式ではありません。
タイタス

@EriktheOutgolferこれはすべての形式を処理します。
Xcoder氏2017

1
これは無効な日付では失敗します。30 February 2014を返します2014/03/02エラーになるか、一貫した偽の値を返すかのどちらかを選択します。(ただし、上記のテンプレート形式を使用します)
Xcoder氏

@ Mr.Xcoderそれはかなりそれを台無しにします...
タイタス

3

Python 3 + parsedatetimeライブラリ、152 139 155 153バイト

ジョナサンアランのおかげで13バイト節約

無効な日数の日付を処理するために16バイトを追加

ラムダ割り当てを削除して2バイトを節約

lambda s:re.search(f'(^| ){str(h(s)[0].tm_mday)[:2]}[^\d]',s)and time.strftime('%Y/%m/%d',h(s)[0])
import parsedatetime as p,time,re
h=p.Calendar().parse

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

ボーナス日はサポートしていません


PPCGへようこそ!素敵な最初の投稿。次を使用して13バイトを節約しますNoneimport ...as; &a としてlambda再利用parsehます。
ジョナサンアラン


1

Java(OpenJDK 8)、190 + 26 = 216バイト

import java.time.format.*;

s->DateTimeFormatter.ofPattern("uuuu/MM/dd").format(DateTimeFormatter.ofPattern("[EEEE, ][d ]MMMM [d, ]uuuu").withResolverStyle(ResolverStyle.STRICT).parse(s.replaceAll("(\\d)[a-z].","$1")))

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

重要な注意:それはより短かった曜日を破棄する代わりに曜日を検証するため、検証が含まれています!

SimpleDateFormat2月30日のようなすべての日付を受け入れた明白なケースを超えて、私は試していません。だから私はそれを捨てる必要があり、私はJava 8を使用しましたDateTimeFormatter

説明

"[EEEE, ][d ]MMMM [d, ]uuuu"

このフォーマットは次を意味します:

  • オプションの曜日の後にコンマとスペースが続きます[EEEE, ]Sunday, ...)、
  • スペースでオプションの日が続き[d ]
  • 完全な文字MMMMとスペースの月が続きます。
  • コンマとスペースを含むオプションの日が続きます[d, ]
  • 次に、年号を入力uuuuして、パーサーに私たちがグレゴリオ暦の時代であることを知らせます。

コード:

import java.time.format.*;                                     // Required for DateTimeFormatter, *and* ResolverStyle

s->DateTimeFormatter.ofPattern("uuuu/MM/dd")                   // Output format
  .format(
    DateTimeFormatter.ofPattern("[EEEE, ][d ]MMMM [d, ]uuuu")  // Input format
      .withResolverStyle(ResolverStyle.STRICT)                 // Invalidates xxxx-02-30 instead of transforming it into xxxx-02-28
      .parse(
        s.replaceAll("(\\d)[a-z].","$1")                       // remove st, nd, rd, th
       )
    )

クレジット

  • ニールのおかげで正規表現で2バイト。

1
replaceAllパターンにブラケットが必要ですか?
Neil

ないようです。ありがとう、@ Neil!
OlivierGrégoire17年

1

JavaScript(ES6)、124 122バイト

f=
s=>(d=new Date(s.replace(/.[dht]\b/,'')+' +0')).getDate()==s.match(/\d\d?/)&&d.toISOString().replace(/-(..)(T.*)?/g,'/$1')
<input oninput=o.textContent=f(this.value)><pre id=o>


戻り値2015/06/07のためJune 8, 2015(UTCの問題?私はUTC + 2にいるよ)とfalseのいずれかのためSunday, June 8, 2015Monday, June 8, 2015
OlivierGrégoire17年

1
@OlivierGrégoireそれらを指摘してくれてありがとう。私は夏時間外の英国で日付のみを試しましたので、彼らはすでにUTCを使用しており、末尾がで終わる平日は試しませんでしたnday
Neil
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.