Zalegalizuj odwróconą datę

18

Wejście:

A Data (zawierającą dd, MMi yyyy). Obiekt daty lub trzy oddzielne liczby całkowite są również ważne jako dane wejściowe.

Wynik:

Każda część ( dd, MMi yyyy) indywidualnie cofnięta i zaokrąglona do najbliższej ważnej daty.

Na przykład (w formacie dd-MM-yyyy):
21-10-2016staje się12-01-6102

Zasady konkursu:

  • Tylko dd, MM, yyyyjest ważny, ale kolejność i który oddzielny symbole używasz jest twój własny wybór.
    To są niektóre ważne przykłady formatów: dd-MM-yyyy; MM/dd/yyyy; yyyy MM dd; ddMMyyyy, Itd.
    A oto kilka przykładów Nieprawidłowy format: dd MMM yyyy; dd-MM-'yy; itp.
  • Możesz także wybrać wprowadzenie obiektu daty, jeśli Twój język go obsługuje lub trzy oddzielne parametry liczb całkowitych zamiast ciągu reprezentującego datę.
  • Podaj używany format daty! (A dane wejściowe i wyjściowe muszą być w tym samym formacie.) Dozwolone jest również generowanie obiektu Date, o ile może on obsłużyć wszystkie przypadki testowe i regułę wyzwania poniżej.
  • Przejście kalendarza juliańskiego do kalendarza gregoriańskiego jest ignorowane w przypadku tego wyzwania. 1582Jest to więc tylko ważny odwrócony rok 2851.
    Zobacz informacje / wskazówki dotyczące wyzwań dla wszystkich ważnych lat, miesięcy i dni.
  • Ponieważ nie możesz mieć lutego w odwrotnym kierunku niż jakikolwiek inny miesiąc, nie musisz się martwić o lata przestępne.

Wszystkie odwrócone lata, miesiące i dni:

  • Rok można zawsze bez problemu cofnąć, sięgając od 0001 (cofnięty z 1000) do 9999 (pozostały 9999). (Więc 0000nie jest to poprawny wpis i nie ma też dla niego przypadków testowych).
  • Jedyne miesiące, które cofniesz to: styczeń (odwrócony od października / 10); Październik (odwrócony od stycznia / 01); Listopad (pozostaje listopad / 11); i grudzień (odwrócone co drugi miesiąc / 02- 09, 12).
  • Jedyne dni, które cofniesz to: 01 (odwrócony od 10), 02 (odwrócony od 20), 03 (odwrócony od 30), 10 (odwrócony od 01), 11 (pozostanie 11), 12 (odwrócony od 21), 13 (odwrócony od 31) , 20 (odwrócone od 02), 21 (odwrócone od 12), 22 (pozostaje 22), 30 (odwrócone od 03lub to samo co 31 w listopadzie!), 31 (odwrócone od 04- 09/ 13-19/ 23- 29).

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Odpowiedzi dotyczą standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i instrukcji return / output, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem swojego kodu.
  • W razie potrzeby dodaj również wyjaśnienie.

Przypadki testowe ( dd-MM-yyyyjako format):

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
Kevin Cruijssen
źródło
@ LegionMammal978 Nie, 21-07-2016jest cofane, 12-70-6102co jest zaokrąglane do 12-12-6102. Nie jestem pewien, jak uzyskać wynik ##-10-6107.
Kevin Cruijssen
@KevinCruijssen W porządku, myślałem, że miesiąc się skończył, a rok rośnie 70.
LegionMammal978
Czy 10-10-2ważne jest wyjście w trzecim przypadku?
Luis Mendo,
@LuisMendo Tak, jasne. Widziałem, jak inni to robią. Wyzwanie polega raczej na prawidłowym odwracaniu i zaokrąglaniu dat niż na formacie wejściowym lub wyjściowym.
Kevin Cruijssen
Czy dopuszczalne byłoby przyjęcie trzech ciągów znaków i oczekiwanie zer wiodących?
JustinM - Przywróć Monikę

Odpowiedzi:

3

Wypukły , 23 bajty

Liczba bajtów zakłada kodowanie CP-1252.

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

Format wejścia / wyjścia to dd mm yyyy.

Wypróbuj online!

To jest bezpośredni port mojej odpowiedzi CJam . Wypukły jest w dużej mierze oparty na CJam, a zatem jedyną różnicą jest użycie operatora Convex, który otacza dwa górne elementy stosu na liście, oszczędzając bajt [...].

Martin Ender
źródło
8

CJam, 24 bajty

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

Format wejścia / wyjścia to dd mm yyyy.

Wypróbuj online!

Ta sama liczba bajtów, format we / wy mm dd yyyy:

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

Wypróbuj online!

Wyjaśnienie

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.

Druga wersja działa podobnie, z tym że zaczynamy od liczby całkowitej 1230lub 1231przed konwersją na ["12" "30"] lub ["12" "31"].

Martin Ender
źródło
2
Języki z wbudowaną datą ...
Leaky Nun
1
@LeakyNun To nie używa wbudowanej daty i nie widzę, jak to by pomogło.
Martin Ender
Więc skąd wiesz, że w listopadzie jest 30 dni?
Leaky Nun
2
@LeakyNun Dodam wyjaśnienie później, ale 1=pobiera odwrócony miesiąc, :=sprawdza, czy jego cyfry są równe, i ^xor wyniku na 31, dając 30 dla miesiąca 11i 31 dla wszystkiego innego.
Martin Ender
Och, nie przeczytałem specyfikacji ...
Leaky Nun
5

Pyth, 55 53 46 43 41 bajtów

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

gdzie ❤❤były dwa niedrukowalne, odpowiednio U + 001C i U + 001F.

Zestaw testowy.

Leaky Nun
źródło
3

Python 3, 82 bajty

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

Anonimowa funkcja, która pobiera za pomocą argumentu datę jako listę ciągów formularza ['dd', 'mm', 'yyyy'] i zwraca sprawdzoną odwróconą datę w tym samym formacie.

Jak to działa

Python porównuje znaki i łańcuchy według ich punktów kodowych Unicode. Oznacza to, że każde porównanie dwóch lub więcej liczb całkowitych zwraca to samo, co porównanie tych liczb całkowitych jako ciągów. Dlatego wywołanie mindwóch liczb całkowitych jako ciągów zwraca najmniejszą liczbę całkowitą jako ciąg; przyjmując odwróconą część daty jako jeden argument, a maksymalną wartość jako drugą, dzień i miesiąc zostają ograniczone do żądanego zakresu. Części daty są odwracane przez indeksowanie krokami -1( [::-1]), a maksymalna wartość dla miesiąca jest zmieniana z '31'na'30' jeżeli miesiącem jest listopad, poprzez indeksowanie do listy z wynikiem logicznym warunku.

Wypróbuj na Ideone

TheBikingViking
źródło
2

Dyalog APL , 32 33 bajty

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

I / O to lista trzech ciągów ( 'dd' 'mm' 'yyyy').

TryAPL , ale należy pamiętać, że (monit o wprowadzenie) został zastąpiony, a cała linia zawarta w {... w }celu umożliwienia testowania online, a (wykonanie wyrażenia) zostało zastąpione 2⊃⎕VFI(weryfikacja i naprawa danych wejściowych), ponieważ wykonanie dowolnego kodu jest zablokowane .

Adám
źródło
2

C # 314 305 299 249 232 223 bajtów

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

Dzięki @KevinCruijssen za zwrócenie uwagi na to, że mogę skrócić moją deklarację zmiennej, dzięki czemu łańcuch aliasingu może również zapisać niektóre bajty.

Zapisano 50 bajtów przechowujących funkcję cofania do ponownego użycia i kolejne 13, robiąc to samo dla zaokrąglania i usuwania deklaracji zmiennych.

Ostatnia aktualizacja powoduje, że łańcuch aliasingu nie jest już wygaszaczem bajtów.

Wersja bez golfa:

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

Sprawdź to tutaj

JustinM - Przywróć Monikę
źródło
Możesz zignorować odstęp między using System.Linq;i funkcję, więc to -1 bajt. Ponadto, var n=...;var e=...;można golfed przez 1 bajt używając zamiast tego: string n=...,e=...;To nie jest dużo, ale nadal -2 bajtów. ;)
Kevin Cruijssen
Fajny haczyk na tym miejscu, choć wygląda na to, że mój licznik bajtów tak naprawdę go nie policzył, więc źle to zaklinowałem, aż do problemu z wklejaniem kopii. Myślę też, że używając tego stylu deklaracji zmiennej będę w stanie wygrać jeszcze kilka bajtów poprzez aliasing łańcucha.
JustinM - Przywróć Monikę
2

JavaScript, 106 105 94 bajtów

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

Zestaw testowy (rev. 3)


Wyjaśnienie

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)

Dzięki @KevinCruijssen do zapisywania 1 bajt do b==1celu b<2. Dzięki @Neil za oszczędność 11 bajtów, sugerując literał szablonu ES6 i ,separator.

CShark
źródło
Jestem dość zły w JS, więc popraw mnie, jeśli powiem coś złego, ale nie b==1można grać w golfa, b<2aby zaoszczędzić bajt? To nie może być już 0, ponieważ już sprawdziłeś to w !b?części kodu. Wygląda na to, że działa w twoim pakiecie testowym, kiedy go zmieniam.
Kevin Cruijssen
@KevinCruijssen tak, masz rację, dzięki! Właśnie to przeoczyłem. Nie grałem w golfa w javascript dla własnego wyglądu, więc czasami tęsknię za takimi rzeczami
CShark
* Miałem na myśli „bardzo długo”, a nie „bardzo wyglądać”
CShark,
2
Gdy celujesz w ES6, możesz użyć ciągów szablonów, aby skrócić kod - join``zamiast join('')na przykład - ale możesz zaoszczędzić nieco więcej, używając ,jako separatora, co pozwala +''na połączenie trzech wartości razem.
Neil
@ Czy masz na myśli ,separator na wejściu?
CShark
1

Ruby, 92 84 + 1 ( -pflaga) = 93 85 bajtów

Służy -jako separator.

d,m,y=chomp.split(?-).map &:reverse
$_=[[d,m=="11"?"30":"31"].min,[m,"12"].min,y]*?-
Wartość tuszu
źródło
1

Pyke, 29 bajtów

F_bw-o^tDI]SX(mhj_Xjth~%R@]Sh

Wypróbuj tutaj!

Zdecydowanie widzę, że to gra w golfa

niebieski
źródło
0

Python 2, 154 bajty

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)

Traktuje dane wejściowe jako ciąg znaków, dlatego w danych wejściowych należy podać cudzysłowy, np. „11-04-2016”.

Jeremy
źródło
Wystarczy podstawowa poprawa ponieważ nie jestem golfistą 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). Zasadniczo nie musisz wcale używać ri minosiągasz wiele rzeczy, które chcesz robić.
Wartość tuszu
0

05AB1E , 24 bajty

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

Port odpowiedzi CJam @MartinEnder , a więc także wejścia i wyjścia w postaci łańcucha w formacie dd MM yyyy.

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

#                         # 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"
Kevin Cruijssen
źródło