この日付形式は何ですか?


11

グレゴリオ暦の場合、日付の形式は国によって異なります。認識される3つの主要な形式があります。

  1. YY-MM-DD (ビッグエンディアン)
  2. DD-MM-YY (リトルエンディアン)
  3. MM-DD-YY (ミドルエンディアン)

あなたの仕事は、日付を表す入力文字列を与えられ、この文字列を日付として解釈できるすべての可能な日付形式を出力するプログラムを書くことです。

ルール

  • 入力日付の形式xx-xx-xxはで、各フィールドは2桁でゼロが埋め込まれます。
  • 日付は常に有効です(14-13-17のようなものは取得できません)
  • 日付は常に上記の形式の少なくとも1つです(したがって、17-14-11のようなものは取得できません)
  • 私たちは実際にはパラレルワールドにいるため、1年の各月には31日あり、その結果、うるう年はありません
  • 日付は2001年1月1日から2099年12月31日の間
  • 日付の形式が1つしかない場合、コードはそれだけを印刷する必要があります(末尾の改行のみが許可されます)。
  • 日付の形式が複数ある場合は、コンマ、スペース、改行、またはそれらの組み合わせで区切る必要があります
  • 形式の正確な名前を出力する必要があります。異なる任意の値を使用することはできません。
  • 末尾のスペース以外の先頭または末尾の文字は使用できません
  • 出力は小文字でなければなりません
  • 組み込みの日付またはカレンダー関数の使用は許可されていません
  • 出力フォーマットをソートする必要はありません

Input      Output
30-05-17   big-endian, little-endian
05-15-11   middle-endian
99-01-02   big-endian
12-11-31   big-endian, little-endian, middle-endian
02-31-33   middle-endian

これはので、バイト単位の最短コードが優先されます。説明が奨励されます。


3
おそらく、2月31日を使用してテストケースを追加して、その奇妙なケースをサポートする回答を確認する必要があります:P
ETHproductions

3つの有効な形式に対して3つの異なる値を出力できますか、それとも3つの正確な文字列でなければなりませんか?
ETHproductions 2017年

3
there are 31 days for every month of the year, and consequently no leap yearsつまり、これは日付ライブラリがこれには効果がないことを意味しますか?
TheLethalCoder

1
@TheLethalCoderはい、ほとんどの日付ライブラリはおそらく使用できません。
ジム

1
世の中にはもっとたくさんのフォーマットがあります。
ugoren 2017年

回答:


3

05AB1E、40バイト

'-¡©2£13‹`®Á2£32‹*)˜“Œ±„¥„ê“#Ï’-„–ian’«»

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

説明

'-¡©                                      # split on "-" and store a copy in register
    2£13‹                                 # compare the first 2 elements to 13
         `                                # split as separate to stack
                                          # the bottom element is true if it is middle endian
                                          # the top value is true if it can be big/little
          ®Á                              # retrieve the list from register and rotate right
            2£32‹                         # compare the first 2 elements to 32
                 *                        # multiply with the result of the comparison to 13
                  )˜                      # wrap in a flattened list
                    “Œ±„¥„ê“#             # push the list ['middle', 'big', 'little']
                             Ï            # index into this with the flattened list
                                          # this leaves the types the date could be
                              ’-„–ian’«   # append "-endian" to each
                                       »  # join on newlines

4

Python 2 2、123バイト

a,b,c=map(int,input().split('-'))
for a,b,c in[[b,c,'big'],[b,a,'little'],[a,b,'middle']]:print(c+'-endian')*(a<13)*(b<32),

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


Python 2、少ない入力解析、123バイト

d=input()
for a,b,c in[[3,6,'big'],[3,0,'little'],[0,3,'middle']]:print(c+'-endian')*(int(d[a:a+2])<13)*(int(d[b:b+2])<32),

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


改行で区切ることができるので、末尾のを削除でき,ます。
ジョナサンアラン2017年

4

JavaScript(ES6)、121 119 118 112バイト

末尾にスペースがあるスペース区切りの文字列を返します。

s=>['big','little','middle'].map((v,i)=>[b<13&c<32,b<13&a<32,a<13][i]?v+'-endian ':'',[a,b,c]=s.split`-`).join``

どうやって?

入力をab、およびcに分割します。日付が有効であることが保証されているため、bが32未満であることは確実です。したがって、ミドルエンディアン形式を検証するに、aが13未満であるかどうかをテストするだけで十分です。リトルエンディアン形式とビッグエンディアン形式では、bが13未満である必要があり、acで別のテストを実行し、その日を検証します。

したがって、3つのテスト:

  • ビッグエンディアン:b <13&c <32
  • リトルエンディアン:b <13&a <32
  • ミドルエンディアン:a <13

テストケース


3

バッシュ、240の 125 116 112バイト

IFS=- read a b c<<<$1
d=-endian
((b<13))&&(((a<32))&&echo little$d;((c<32))&&echo big$d);((a<13))&&echo middle$d

ゴルフした。

いくつかのヒントをmanatworkに感謝します

中間エンディアンの次のArnauld回答で32バイト未満の検証を削除して9バイトを節約

配列の代わりに異なる変数を使用して4バイトを節約

試して!


バッシュでのゴルフのヒント」には、算術に関連するヒントがいくつかあります。あなたはそれを少し減らすことができます: それをオンラインで試してください!
manatwork

ありがとう@manatworkブックマークされた質問はとても役に立ちます。それでうまくいきます
DrnglVrgs 2017年

1

C#、180バイト

t=(n,m)=>int.Parse(n)<13&int.Parse(m)<32;s=>{var a=s.Split('-');return$"{(t(a[1],a[2])?"big-endian":"")} {(t(a[1],a[0])?"little-endian":"")} {(t(a[0],a[1])?"middle-endian":"")}";};

スペースで区切られた値のみの出力には、先頭と末尾にスペースを含めることもできます。必要に応じて、OPがその点を明確にしたときに更新されます。

フル/フォーマット済みバージョン:

Func<string, string, bool> t = (n, m) => int.Parse(n) < 13 & int.Parse(m) < 32;

Func<string, string> f = s =>
{
    var a = s.Split('-');

    return $"{(t(a[1], a[2]) ? "big-endian" : "")} {(t(a[1], a[0]) ? "little-endian" : "")} {(t(a[0], a[1]) ? "middle-endian" : "")}";
};

私はルールをより明確にしました:No leading or trailing characters others than a trailing space are allowed
ジム


1

バッチ、138バイト

@echo off
set/ps=
call:l little %s:-= %
exit/b
:l
call:e big %4 %3
call:e middle %3 %2
:e
if %2 leq 31 if %3 leq 12 echo %1-endian

漠然と@ovsの答えに基づいています。


1

Java 232バイト

(String s)=>{String[]i=s.split("-");String e="-endian",b="big"+e,m="middle"+e,l="little"+e;int p=Integer.valueOf(i[0]);System.out.print(p<13?Integer.valueOf(i[1])<13?Integer.valueOf(i[2])<32?b+","+m+","+l:m+","+l:m:p<32?b+","+l:b);}

これはより良いバージョンです

String[] i = s.split("-");

String e = "-endian",
       b = "big" + e,
       m = "middle" + e,
       l = "little" + e;

int p = Integer.valueOf(i[0]);

この部分のフォーマット方法が本当にわかりませんでした...

System.out.print(
        p < 13 ? Integer.valueOf(I[1]) < 13 ? Integer.valueOf(I[2]) < 32 ? b + "," + m + "," + l
                                                                         : m + "," + l
                                            : m 

               : p < 32 ? b + "," + l 
                        : b
);

1
エンディアンが多すぎます:String e="-endian",b="big"+e,m="middle"+e,l="little"+e;
manatwork

良い点は、そうしないと決めたとき、バイトカウントに余分な「文字列」を含めていたことです。@manatwork
cheemcheem

1

PHP、131バイト

[$a,$b,$c]=explode('-',$argn);foreach([[big,b,c],[little,b,a],[middle,a,b]]as[$t,$x,$y])echo$$x*$$y&&$$x<13&$$y<32?"$t-endian ":"";
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.