逆日付を合法化


18

入力:

日付(ddMMおよびを含むyyyy)。日付オブジェクト、または3つの個別の整数も入力として有効です。

出力:

各部分(ddMMおよびyyyy)は個別に元に戻され、次に最も近い有効な日付に丸められます。

例(形式dd-MM-yyyy):に
21-10-2016なります12-01-6102

チャレンジルール:

  • のみddMMyyyy有効ですが、あなたが使用順序と別のシンボルは、あなた自身の選択です。
    したがって、これらは有効な形式の例ですdd-MM-yyyyMM/dd/yyyy; yyyy MM dd; ddMMyyyyなど。
    また、これらは無効な形式の例ですdd MMM yyyydd-MM-'yy; 等
  • 日付を表す文字列の代わりに、言語がサポートしている場合はDateオブジェクトを入力するか、3つの個別の整数パラメーターを入力することもできます。
  • 使用した日付形式を明記してください!(また、入力と出力は同じ形式でなければなりません。)以下のすべてのテストケースとチャレンジルールを処理できる限り、Dateオブジェクトの出力も許可されます。
  • このチャレンジでは、ユリウス暦からグレゴリオ暦への移行は無視されます。の1582有効な逆年です2851
    有効なすべての年、月、日に関するチャレンジ情報/ヒントを参照してください。
  • 2月を他の月と逆にすることはできないため、うるう年を心配する必要はありません。

すべて逆の年、月、日:

  • 年は、問題なくいつでも元に戻すことができ、0001(元に戻す1000)から9999(残り9999)に達します。(つまり0000、有効な入力ではなく、テストケースもありません。)
  • 取り消されるのは、1月のみです:1月(10月から取り消され10ます/ )10月(1月から反転/ 01); 11月11月のまま/ 11); および12月(1か月おきに反転/ 02- 0912)。
  • 取り消されるのは、01(から取り消される10)、02(から取り消される20)、03(から取り消される30)、10(から取り消される01)、11(残っている11)、12(から取り消される21)、13(から取り消される31)のみです、20(から反転02)、21(から反転12)、22(のまま22)、30(11月から反転03または31と同じ!)、31(から反転04- 09/ 13-19/ 23- 29)。

一般的なルール:

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

テストケース(dd-MM-yyyy形式として):

21-07-2016   ->   12-12-6102
12-11-1991   ->   21-11-1991
01-01-2000   ->   10-10-0002
27-08-1875   ->   31-12-5781
18-12-2010   ->   31-12-0102
13-01-1981   ->   31-10-1891
04-11-1671   ->   30-11-1761  // Semi-tricky case, since November has 30 days
28-11-2036   ->   30-11-6302  // Semi-tricky case, since November has 30 days
14-06-1855   ->   31-12-5581
30-10-9999   ->   03-01-9999
01-01-2851   ->   10-10-1582

@ LegionMammal978いいえ、21-07-2016元に戻さ12-70-6102れ、丸められ12-12-6102ます。わからないあなたが結果を得る方法を##-10-6107...
ケビンCruijssen

@KevinCruijssenさて、私はそれが月が70一周し、年が増加していると思った。
LegionMammal978

である10-10-2第三のケースで有効な出力は?
ルイスメンドー

@LuisMendoうん。他の人も同じことをしているのを見てきました。課題は、入力形式または出力形式よりも、日付を正しく反転して丸めることです。
ケビンCruijssen 16

3つの文字列を使用し、先頭にゼロを追加することは許容されますか?
JustinM -復活モニカ

回答:


3

、23バイト

バイトカウントはCP-1252エンコードを前提としています。

qS/Wf%_1=:=31^sCs¶.e<S*

I / O形式はdd mm yyyyです。

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

これは私のCJamの答えの直接のポートです。ConvexはCJamに大きく基づいているため、唯一の違いは、リストの上位2つのスタック要素をラップしてバイトを節約するConvexの演算子を使用することです[...]


8

CJam、24バイト

qS/Wf%[_1=:=31^sCs].e<S*

I / O形式はdd mm yyyyです。

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

同じバイトカウント、I / O形式mm dd yyyy

qS/Wf%_0=:=1231^s2/.e<S*

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

説明

qS/     e# Read input, split around spaces.
Wf%     e# Reverse each component.
[       e# Set marker for new list.
  _1=   e#   Duplicate reversed strings, extract reversed month.
  :=    e#   Check for equality of the characters. This gives 1 for
        e#   November (11) and 0 for everything else.
  31^   e#   XOR the result with 31, giving 30 for November and 31
        e#   for everything else.
  s     e#   Convert the result to a string, "30"/"31".
  Cs    e#   Push 12, convert to string, "12".
]       e# Wrap "30"/"31" and "12" in a list.
.e<     e# Element-wise minimum. This clamps the day and month to their
        e# respective maxima.
S*      e# Join the result with spaces.

他のバージョンでは、我々は、整数から始めることを除いて、同じように動作します12301231にそれを変換する前に["12" "30"]["12" "31"]


2
内蔵の...日付の言語
漏れ修道女

1
@LeakyNunこれは組み込みの日付を使用せず、どのように役立つかわかりません。
マーティンエンダー

それでは、11月に30日間あることをどのように知っていますか?
リーキー修道女

2
@LeakyNun後で説明を追加します1=が、逆の月を取得し、:=その数字が等しいかどうかを確認し^、結果を31にxorsして、月に30、11他のすべてに31を与えます。
マーティンエンダー

ああ、私は...仕様を読んでいない
漏れ修道女

5

Pyth、55 53 46 43 41バイト

APJ_Mczd = HhS、12sH = GhS、sGC @。 "❤❤ó»î" H% "%02d%02d%s" [GHeJ 
APJ_Mczd = hS、12sH = hS、sGC @。 "❤❤ó»î" H% "%02d%02d%s" [GHeJ 
APJ_Mcz \-% "%02d%02d%s" [hS、sGx31q11sHhS、12sHeJ 
APJ_Mczdjd [> 2+ \ 0hS、sGx31q11sH> 2+ \ 0hS、12sHeJ
APJ_Mczdjd。[L \ 02 [`hS、sGx31q11sH`hS、12sHeJ

どこ❤❤に、それぞれU + 001CとU + 001Fの2つの印刷できないものがありました。

テストスイート。


3

Python 3、82バイト

lambda x:[min(x[0][::-1],['31','30'][x[1]=='11']),min(x[1][::-1],'12'),x[2][::-1]]

引数を介して、フォームの文字列のリストとして日付の入力を受け取る匿名関数 ['dd', 'mm', 'yyyy']、検証された逆日付を同じ形式で返す。

使い方

Pythonは、Unicodeコードポイントによって文字と文字列を比較します。つまり、2つ以上の整数を比較すると、それらの整数を文字列として比較した場合と同じ結果が返されます。したがって、min2つの整数を文字列として呼び出すと、最小の整数が文字列として返されます。逆の日付部分を1つの引数として、最大値を別の引数として使用することにより、日と月は目的の範囲に固定されます。日付部分は-1[::-1])のステップでインデックス付けすることにより逆になり、月の最大値は、条件のブール結果のリストにインデックス付けすることにより月が11月の場合にから'31'に変更され'30'ます。

Ideoneでお試しください


2

Dyalog APL32 33 バイト

⍕¨{⍵-3↑31 11≡2↑⍵}31 12 1E4⌊⍎∊⍕⌽¨⎕

I / Oは3つの文字列のリスト('dd' 'mm' 'yyyy')です。

TryAPLが、そのノート(入力のプロンプトが)に置き換えられましたとで囲まれた行全体{... }オンラインテストを有効にすると、(式を実行)に置き換えられている2⊃⎕VFI任意のコードの実行がブロックされているので(検証し、修正入力) 。


2

C#314 305 299 249 232 223バイト

using System.Linq;string f(int d,int m,int y){Func<int,string>r=i=>string.Concat((""+i).PadLeft(2,'0').Reverse());Func<string,int,string>x=(j,k)=>int.Parse(j)>k?""+k:j;return x(r(d),m==11?30:31)+"-"+x(r(m),12)+"-"+r(y);}

@KevinCruijssenに、変数宣言を短縮できることを指摘してくれたことに感謝します。これにより、エイリアス文字列がいくつかのバイトを節約できるようになりました。

再利用のために反転関数を保存する50バイトを保存し、変数宣言の丸めと削除に対して同じことを行うことで別の13バイトを保存しました。

最後の更新により、エイリアス文字列がバイトセーバーではなくなりました。

非ゴルフバージョン:

using System.Linq;
    string dateReverse(int day, int month, int year)
{
    //setup a resuable function to reverse
    Func<int, string> reverse = intToReverse => string.Concat((""+intToReverse).PadLeft(2, '0').Reverse());

    //another function for rounding
    Func<string, int, string> round = (strToRound, maxVal) => int.Parse(strToRound) > maxVal ? "" + maxVal : strToRound;

    //Join the strings into the "dd-mm-yyyy" date format
    return 
        //Round down the day value, if november cap to 30 otherwise cap to 31
        round(reverse(day), month == 11 ? 30 : 31) + "-" +

        //Round the month down
        round(reverse(month), 12) + "-" +

        //we can use the reverse function here too and pad left just won't do anything
        reverse(year);
}

ここでテストしてください


using System.Linq;関数と関数の間のスペースは無視できるため、-1バイトになります。また、var n=...;var e=...;代わりにこれを使用して1バイトでゴルフすることができます:string n=...,e=...;それはあまりありませんが、それでも-2バイトです。;)
ケビンクルーイッセン

そのスペースをうまくキャッチできますが、実際にはバイトカウントではカウントされていないように見えます。また、その変数宣言スタイルを使用すると、文字列をエイリアス化することで、さらに数バイトを獲得できると思います。
JustinM -復活モニカ

2

ジャバスクリプト、106の 105 94バイト

d=>d.split`,`.map((a,b,r)=>(e=[...a].reverse().join``,f=!b?r[1]==11^31:b<2&&12,f&&f<e?f:e))+''

テストスイート(rev。3)


説明

d=>d.split`,`                 // split into sections by `,`

.map((a,b,r)=>(               // map each section

e=[...a].reverse().join``,    // spread a date section into array and reverse and 
                              // join with `` to get string result

f=!b?r[1]==11^31              // if section being mapped is day (section 0), 
                              // then max (f) is 30 for November(month 11) or else 31

:b<2&&12,                     // if part being mapped is month (section 1), then max (f) is 12

f&&f<e?f:e))                  // if there is a max (f)
                              // and the max (f) is less than the reversed string (e),
                              // then return the max (f), 
                              // else return the reversed string (e)

+''                           // join all the sections back together with `,` 
                              // (concatenating [] with a string will do this)

に1バイトを保存してくれた@KevinCruijssenに感謝b==1b<2ます。@ Neil、ES6テンプレートリテラルと,セパレータを提案して11バイトを節約してくれてありがとう。


私はJSでかなり悪いのよ、私は何かを間違ったと言うなら、私を修正することはできませんが、b==1ダウンgolfedするb<2バイトを保存しますか?!b?コードの一部で既にチェックしているため、0にすることはできません。変更すると、テストスイートで動作するようです。
ケビンCruijssen 16

@KevinCruijssenうん、あなたは正しい、ありがとう!見落としただけです。私はjavascriptでゴルフを見たことがありませんので、時々
そういう

*私は「非常に長い」ことを意味し、「非常に見える」ことを意味しませんでした
-CShark

2
-あなたはES6をターゲットとしているとして、あなたはあなたのコードを短くするために、テンプレートの文字列を使用することができますjoin``代わりにjoin('')例えば-しかし、あなたが使用して、より少しを保存することができ,、使用することができ、あなたのセパレータとして+''一緒に3つの値が参加します。
ニール

@Neil ,は、入力のセパレーターですか?
–CShark

1

Ruby、92 84 + 1(-pフラグ)= 93 85バイト

-セパレータとして使用します。

d,m,y=chomp.split(?-).map &:reverse
$_=[[d,m=="11"?"30":"31"].min,[m,"12"].min,y]*?-


0

Python 2、154バイト

z=input().split("-");r=[x[::-1]for x in z];z[1]=r[1]if r[1]<'12'else '12';z[0]=r[0]if r[0]<'31'else '30'if z[1]=='11'else '31';z[2]=r[2];print "-".join(z)

入力を文字列として取得するため、入力に引用符を指定する必要があります(例: "11-04-2016")。


私はPythonゴルファーではないので、基本的な改善に過ぎませんz=[x[::-1]for x in z];z[1]=min(z[1],'12');z[0]=min(z[0],['31','30'][z[1]=='11']);print"-".join(z)。基本的に、使用する必要はまったくなくrminやりたいことの多くを達成します。
値のインク

0

05AB1E、24 バイト

#íÐÅsË31^12‚øεßт+¦}sθªðý

@MartinEnderのCJam回答のポート、形式の文字列としても入出力しますdd MM yyyy

オンラインで試すか、、すべてのテストケースを確認してください

説明:

#                         # Split the (implicit) input by spaces
                          #  i.e. "04 11 1671" → ["04","11","1671"]
                          #  i.e. "20 01 2000" → ["20","01","2000"]
 í                        # Reverse each string
                          #  i.e. ["04","11","1671"] → ["40","11","1761"]
                          #  i.e. ["20","01","2000"] → ["02","10","0002"]
  Ð                       # Triplicate this list
   Ås                     # Pop one of them, and push it's middle element (the months)
                          #  i.e. ["40","11","1761"] → "11"
                          #  i.e. ["02","10","0002"] → "10"
     Ë                    # Check if the digits are the same (1 for 11; 0 otherwise)
                          #  i.e. "11" → 1 (truthy)
                          #  i.e. "10" → 0 (falsey)
      31^                 # Bitwise-XOR with 31 (30 for November, 31 for other months)
                          #  i.e. 1 → 30
                          #  i.e. 0 → 31
         12              # Pair it with 12
                          #  i.e. 30 → [30,12]
                          #  i.e. 31 → [31,12]
            ø             # Zip/transpose; swapping rows and columns
                          # (implicitly removes year)
                          #  i.e. ["40","11","1761"] and [30,12] → [["40",30],["11",12]]
                          #  i.e. ["02","10","0002"] and [31,12] → [["02",31],["10",12]]
             ε    }       # Map each pair to:
              ß           # Get the minimum (implicitly converts to integer unfortunately)
                          #  i.e. [["40",30],["11",12]] → [30,11]
                          #  i.e. [["02",31],["10",12]] → [2,10]
               т+         # Add 100
                          #  i.e. [30,11] → [130,111]
                          #  i.e. [2,10] → [102,110]
                 ¦        # Remove the first character
                          #  i.e. [130,111] → ["30","11"]
                          #  i.e. [102,110] → ["02","10"]
                   s      # Swap so the triplicated list is at the top of the stack again
                    θ     # Pop and only leave it's last element (the year)
                          #  i.e. ["40","11","1761"] → "1761"
                          #  i.e. ["02","10","0002"] → "0002"
                     ª    # Append it to the list
                          #  i.e. ["30","11"] and "1761" → ["30","11","1761"]
                          #  i.e. ["02","10"] and "0002" → ["02","10","0002"]
                      ðý  # Join the list by spaces (and output implicitly)
                          #  i.e. ["30","11","1761"] → "30 11 1761"
                          #  i.e. ["02","10","0002"] → "02 10 0002"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.