Який це формат дати?


11

Для григоріанських календарів формат дат відрізняється від країни до іншої. Визнано три основні формати:

  1. YY-MM-DD (біг-ендіан)
  2. DD-MM-YY (малопомітний)
  3. MM-DD-YY (середній-ендіанський)

Ваше завдання - написати програму, яка, задавши рядок введення, що представляє дату, виводить усі можливі формати дати, за допомогою яких цей рядок можна інтерпретувати як дату.

Правила

  • Дата введення у форматі xx-xx-xx, де кожне поле має дві цифри та нульове значення.
  • Дата завжди дійсна (тому ви не можете отримати такі речі, як 14-13-17)
  • Дата завжди є хоча б одним із форматів вище (тому ви не можете отримати такі речі, як 17-14-11)
  • Оскільки ми насправді перебуваємо в паралельному світі, щомісяця в році є 31 день , а отже, немає високосних років
  • Дата між 01 січня 2001 року та 31 грудня 2099 року
  • Якщо на дату є лише один формат, код повинен надрукувати лише його (дозволені лише проміжні нові рядки)
  • Якщо для дати є кілька форматів, вони повинні бути розділені комою, пробілом, новим рядком або комбінацією цих
  • Ви повинні вивести точну назву формату (форматів). Використання різних довільних значень заборонено.
  • Не допускаються жодні провідні або кінцеві символи, окрім місця пробілу
  • Вихід повинен бути малий
  • Вам заборонено використовувати будь-які вбудовані функції дати чи календаря
  • Вихідні формати не потрібно сортувати

Приклади

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
Вам, мабуть, слід додати тестовий випадок, використовуючи 31 лютого, щоб переконатися, що відповіді підтримують цей дивний випадок: P
ETHproductions

Чи можемо ми вивести будь-які три різних значення для трьох дійсних форматів, чи повинні бути ці три точні рядки?
ETHproductions

3
there are 31 days for every month of the year, and consequently no leap yearsТо це означає, що будь-яка бібліотека дат тоді для цього ефективно марна?
TheLethalCoder

1
@TheLethalCoder Так, більшість бібліотек дат, ймовірно, непридатні.
Джим

Відповіді:


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 , 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),

Спробуйте в Інтернеті!


Вам дозволяється розділяти нові рядки, тому ви можете видалити трейлінг ,.
Джонатан Аллан

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``

Як?

Розбиваємо вхід на a , b і c . Оскільки дата гарантовано є дійсною, ми точно знаємо, що b менше 32. Тому достатньо перевірити, чи є a менше 13, щоб перевірити формат середнього ендіанця. Для форматів маленького ендіану та великого ендіану потрібно, щоб b було менше 13, а для перевірки дня - ще один тест на а та с відповідно.

Звідси 3 тести:

  • Біг-ендіан: b <13 & c <32
  • Маленький ендіан: b <13 & a <32
  • Середній-ендіан: a <13

Тестові справи


3

Bash, 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

Гольф.

Завдяки манатурності за кілька порад

Збережено 9 байт, видаливши перевірку на менше 32 у відповіді Арнольда середнього рівня

Збережено 4 байти, використовуючи різні змінні замість масиву

Перевірте це!



Дякую @manatwork, у мене це запитання, що додане до закладок, дуже корисне, чи буде гольф ним
DrnglVrgs

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":"")}";};

Виходи з лише значеннями, розділеними пробілом, також можуть мати провідні та кінцеві пробіли. Оновлюватиметься, коли ОП роз'яснить цю проблему в разі потреби.

Повна / відформатована версія:

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
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 ":"";
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.