Узаконити зворотну дату


18

Вхід:

А Дата (у якому dd, MMі yyyy). Об'єкт дати або три окремі цілі числа також дійсні як вхідні дані.

Вихід:

Кожна частина ( dd, MMа yyyy) індивідуально повернувся і чим округлені до найближчої дійсної дати.

Наприклад (у форматі dd-MM-yyyy):
21-10-2016стає12-01-6102

Правила виклику:

  • Тільки dd, MM, yyyyдійсно, але порядок і які окремі-символи , які ви використовуєте ваш власний вибір.
    Так ось деякі дійсні приклади формату: dd-MM-yyyy; MM/dd/yyyy; yyyy MM dd; ddMMyyyyІ т.д.
    І це лише деякі приклади неприпустимого формату: dd MMM yyyy; dd-MM-'yy; тощо.
  • Ви також можете просто ввести об'єкт Date, якщо ваша мова підтримує його або три окремі цілі параметри, а не рядок, що представляє дату.
  • Будь ласка, вкажіть, який формат дати ви використовували! (І вхід, і вихід повинні бути в одному форматі.) Також дозволено виводити об'єкт Date, якщо він може обробляти всі тестові випадки та правило виклику нижче.
  • Перехід Юліанського до Григоріанського календаря для цього виклику ігнорується. Так що 1582це дійсно зворотний рік для 2851.
    Перегляньте інформацію / поради щодо викликів за всі дійсні роки, місяці та дні.
  • Оскільки лютий не може бути відміненим від будь-якого іншого місяця, вам не доведеться турбуватися про високосні роки.

Усі перевернуті роки, місяці та дні:

  • Рік завжди можна змінити без проблем, досягнувши від 0001 (перевернутого 1000) до 9999 (залишається 9999). (Отже 0000, це неправдивий ввід, і для нього також немає тестових випадків.)
  • Єдині місяці, які ви змінили, це: січень (відмінено від жовтня / 10); Жовтень (перевернуто з січня / 01); Листопад (залишається листопад / 11); і грудень (зворотно від кожного другого місяця / 02- 09, 12).
  • Єдині дні, які ви скасували, це: 01 (відмінено від 10), 02 (відмінено від 20), 03 (відмінено від 30), 10 (відмінено від 01), 11 (залишається 11), 12 (відмінено від 21), 13 (відмінено від 31) , 20 (перевернуте з 02), 21 (відмінено від 12), 22 (залишається 22), 30 (відмінено від 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..
Кевін Кройсейсен

@KevinCruijssen Добре, я вважав, що місяць завернувся з ростом 70року.
LegionMammal978

Чи 10-10-2дійсний вихід у третьому випадку?
Луїс Мендо

@LuisMendo Так, звичайно. Я бачив, як це роблять і інші люди. Завдання полягає більше в тому, щоб правильно змінити назад і округлення дат, ніж формат вводу або виводу.
Kevin Cruijssen

Чи було б прийнятним взяти три рядки та очікувати провідних нулів?
JustinM

Відповіді:


3

Опукла , 23 байти

Кількість байтів передбачає кодування CP-1252.

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

Формат вводу / виводу є dd mm yyyy.

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

Це прямий порт моєї відповіді CJam . Convex сильно базується на CJam, тому єдиною відмінністю є використання оператора Convex, який загортає два найкращі елементи стека в список, економлячи байт [...].


8

CJam, 24 байти

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

Формат вводу / виводу є dd mm yyyy.

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

Те саме число байтів, формат вводу / виводу 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.

Інша версія працює аналогічно, за винятком того, що ми починаємо з цілого 1230чи 1231перед тим, як перетворити його в ["12" "30"] або ["12" "31"].


2
Мови з вбудованою датою ...
Leaky Nun

1
@LeakyNun Тут не використовується вбудована дата, і я не бачу, як це допоможе.
Мартін Ендер

Тоді як ти знаєш, що в листопаді 30 днів?
Leaky Nun

2
@LeakyNun Я додаю пояснення пізніше, але 1=отримує зворотній місяць, :=перевіряє, чи є його цифри рівними, і ^підкреслює результат у 31, даючи 30 на місяць 11і 31 на все інше.
Мартін Ендер

О, я не читав специфікації ...
Leaky Nun,

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.

Тестовий набір.


3

Пітон 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. Це означає, що будь-яке порівняння на два чи більше цілих числа повертає те саме, що і порівняння для цих цілих чисел, як рядки. Отже, виклик minдвох цілих чисел як рядків повертає найменше ціле число у вигляді рядка; приймаючи перевернуту частину дати як один аргумент, а максимальне значення як інший, день і місяць затискаються до потрібного діапазону. Частини дати реверсуються шляхом індексації з кроками -1( [::-1]), а максимальне значення для місяця змінюється з '31'на, '30'якщо місяць - листопад, шляхом індексації до списку з умовним результатом Булева.

Спробуйте це на Ideone


2

Діалог APL , 32 33 байти

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

I / O - це список з трьох рядків ( '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, виконавши те ж саме для округлення та видалення змінних оголошень.

Останнє оновлення змушує параметр "aliase" більше не зберігати байт.

Версія без заготівлі:

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 байти. ;)
Кевін Круїссен

Хороший улов на цьому просторі, хоча, схоже, мій підрахунок байтів насправді не рахував його, настільки жорстокий обвал, що аж до проблеми копіювання вставити. Крім того, я думаю, що за допомогою цього змінного стилю декларування Ill вдасться виграти ще кілька байтів шляхом прокладки рядка.
JustinM

2

Javascript, 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))+''

Тестовий набір (версія 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)

Завдяки @KevinCruijssen для економії 1 байт для b==1до b<2. Дякуємо @Neil за збереження 11 байтів, запропонувавши шаблон літералу ES6 та ,роздільник.


Я дуже поганий у JS, тому виправте мене, якщо я скажу щось не так, але не b==1можна гольфу, b<2щоб зберегти байт? Це більше не може бути 0, оскільки ви вже перевірили це в !b?частині коду. Здається, він працює у вашому тестовому наборі, коли я його змінюю.
Кевін Крейссен

@KevinCruijssen так, ви праві, дякую! Я просто пропустив це. Я ще не робив гольф у javas для дуже зовнішнього вигляду, тому іноді пропускаю подібні речі
CShark

* Я мав на увазі "дуже довго", а не "для дуже вигляду"
CShark

2
Орієнтуючись на ES6, ви можете використовувати рядки шаблону, щоб скоротити код - join``замість, join('')наприклад, - але ви можете заощадити трохи більше, використовуючи ,як роздільник, який дозволяє використовувати +''для об'єднання трьох значень разом.
Ніл

@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). В основному, вам зовсім не потрібно користуватися rі minвиконує багато речей, які ви хочете зробити.
Значення чорнила

0

05AB1E , 24 байти

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

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