Uprość datę


9

Jest to podobne do uproszczenia ułamków, ale z Daty!

Dane wejściowe programu muszą mieć postać mm/dd Na przykład

3/4 //March 4
12/15 //December 15
1/1 // January 1

Zakładamy, że dane wejściowe będą prawidłowe, tak że miesiące mają w sobie następującą liczbę dni:

January 31
February 28
March 31
April 30
May 31
June 30
July 31
August 31
September 30
October 31
November 30
December 31

Zadaniem twojego programu jest przyjęcie założonych prawidłowych danych wejściowych i iteracyjnie (lub rekurencyjnie) uprościć datę, a na każdej iteracji (w tym 0) wypisz datę z pełną nazwą miesiąca, jak napisano powyżej.

Na przykład:

Biorąc pod uwagę:

12/18

Wyjdzie

December 18
June 9
February 3

Dane wejściowe, które są już uproszczone, same wyjściowe:

11/17

Wyjścia:

November 17

Nazwy miesięcy nie mogą pochodzić od funkcji w Twoim języku. Ciągi mogą być zaciemnione, obliczone, jak chcesz, ale nie możesz użyć standardowej funkcji, takiej jak GetMonthString (4) lub coś takiego, musisz albo napisać tę funkcję, albo znaleźć sposób na wyświetlenie nazw miesięcy zgodnie z opisem.

Nie mogę wymyślić żadnych przypadków, w których uproszczona data tworzy niezgodną z prawem datę, ale jeśli kiedykolwiek podasz niedozwoloną datę, wypisz:

Illegal Date

Ale jeśli masz pewność, że tak się nie stanie, nie musisz mieć kodu opisującego tę sprawę. Dane wyjściowe zawsze muszą być prawidłowe zgodnie z tym, co opisano powyżej (to oczywiste, że miesiące i dni zaczynają się od 1).

Algorytm:

Przy każdej iteracji dzielisz przez najmniejszą liczbę dzielącą licznik i mianownik.

Oznacza to, że wszystkie liczby są takie, że podzielenie zarówno licznika, jak i mianownika przez tę liczbę, daje nowy licznik i mianownik, które są liczbami całkowitymi (wspólne czynniki). Wybierz najmniejszy i osobno podziel licznik i mianownik, aby utworzyć nowy ułamek. Jeśli jedyną liczbą, którą możesz podzielić, jest 1, to uprościłeś jak najwięcej i przestajesz.

Mam nadzieję, że to jasne.

Dowolny język jest dozwolony. To jest Code Golf, wygrywa najkrótszy kod!


pytanie zostało zamknięte, kiedy publikowałem odpowiedź. Doh!
t-clausen.dk

@ t-clausen.dk Wyzwanie zostało ponownie otwarte.
AdmBorkBork

Dlaczego od 12/18celu 6/9i nie 4/6(nie dostać cały bałagan iteracji ... kiedy uprościć ułamek dostałem immedialtely Uzyskana wartość uproszczony)?
edc65

Odpowiedzi:


2

Galaretka , 59 bajtów

ṣ”/VµÆDf/2ị:@µÐĿị1¦€“£ṢtẒ⁽ẹ½MḊxɲȧėAṅ ɓaṾ¥D¹ṀẏD8÷ṬØ»ṣ⁶¤j€⁶j⁷

Wypróbuj online!

Jak to działa

ṣ”/VµÆDf/2ị:@µÐĿị1¦€“...»ṣ⁶¤j€⁶j⁷  Main link. Argument: mm/dd

ṣ”/                                Split at slashes.
   V                               Eval each chunk, yielding [m, d] (integers).
    µ                              Begin a new, monadic chain. Argument: [m, d]
             µÐĿ                   Execute the chain to the left until the results
                                   are no longer unique. Yield the list of all
                                   intermediate results.
     ÆD                              Compute the divisors of each number.
       f/                            Intersect them.
         2ị                          Select the one at index 2. If there is only
                                     one divisor, ị wraps around and selects 1.
           :@                        Divide [m, d] by this common divisor.
                        ¤            Combine the links to the left into a chain.
                 “...»                 Yield the month's name, space-separated.
                      ṣ⁶               Split at spaces.
                €                    For each pair...
             ị                          index into the month's names...
              1¦                        for the first element.
                         j⁶€         Join each pair, separating by spaces.
                            j⁷       Join, separating by linefeeds.


0

TSQL 296 bajtów

Nie zezwalając na użycie standardowej nazwy danych kosztowało mnie dużo bajtów, jednak aby zaoszczędzić kilka bajtów, użyłem pierwszych 3 znaków domyślnego opisu daty (w formacie mon dd rrrr gg: miAM (lub PM)) i dodałem reszta miesiąca nazwa.

Gra w golfa:

use master
DECLARE @ varchar(5) = '12/2'

DECLARE @m int=month('2000/'+@),@d INT=day('2000/'+@)WHILE @m>0BEGIN PRINT left(dateadd(d,@m*29,0),3)+choose(@m,'uary','uary','ch','il','','e','y','ust','tember','ober','ember','ember')+' '+LEFT(@d,2)SELECT @m/=min(n),@d/=min(n)FROM(SELECT number FROM spt_values)x(n)WHERE @m%n+@d%n=0 and n>1 END

Wypróbuj online

Nie golfowany:

use master
DECLARE @ varchar(5) = '12/2'

DECLARE @m int=month('2000/'+@),@d INT=day('2000/'+@)
WHILE @m>0
BEGIN
PRINT
 left(dateadd(d,@m*29,0),3)
 +choose(@m,'uary','uary','ch','il','','e','y','ust',
  'tember','ober','ember','ember')+' '+LEFT(@d,2)
SELECT @m/=min(n),@d/=min(n)
FROM
(
  SELECT number
  FROM spt_values
)x(n)
WHERE
  @m%n+@d%n=0
  and n>1
END

Umm ... jakie są pierwsze dwie linie ???
Erik the Outgolfer,

@ Pierwszy wiersz EʀɪᴋᴛʜᴇGᴏʟғᴇʀ mówi, której bazy danych użyć dla tego skryptu, drugi wiersz deklaruje zmienną wejściową. Nie uwzględniłem ich w policzeniu, ponieważ określają, gdzie wykonać skrypt i mówią, jaka jest zmienna wejściowa
t-clausen.dk

Widzę '12/2'drugą linię, czy na pewno mówisz mi prawdę?
Erik the Outgolfer,

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Obawiam się, że nie rozumiem twojego pytania
t-clausen.dk

Myślę, że używasz zakodowane daty, choć nie jestem pewien, czy STDIN jest obsługiwana w SQL i warianty ... Ponadto, wydaje się, błędnie Septemberz Septemper.'temper','ober','ember','ember')+' '+LEFT(@d,2)
Erik the Outgolfer
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.