Спростіть дату


9

Це схоже на спрощення дробів, але з датами!

Вхід вашої програми повинен мати форму, mm/dd наприклад

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

Ми припускаємо, що введення буде дійсним таким чином, що місяці містять у них таку кількість днів:

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

Завдання вашої програми полягає в тому, щоб взяти на себе припущену дійсну інформацію та повторно (або рекурсивно) спростити дату та на кожній ітерації (включаючи 0-ту) вивести дату з повним найменуванням місяця, як написано вище.

Наприклад:

Враховуючи вхід:

12/18

Виводить

December 18
June 9
February 3

Вхід, який уже спрощений, видає лише сам:

11/17

Виходи:

November 17

Назви місяців не можуть походити від функції на вашій мові. Рядки можуть бути заплутані, обчислені, як би вам не подобалося, але ви не можете використовувати стандартну функцію, як GetMonthString (4) або щось подібне, вам або потрібно написати цю функцію, або знайти спосіб вивести імена місяця, як описано.

Я не можу придумати жодних випадків, коли спрощена дата створює незаконну дату, але якщо ви коли-небудь створюєте незаконну дату по дорозі, виведіть:

Illegal Date

Але якщо ви впевнені, що цього не може статися, вам не потрібно мати код, що висвітлює цю справу. Дати, що відображаються, завжди повинні бути дійсними відповідно до описаного вище (безсумнівно, що місяці та дні починаються з 1).

Алгоритм:

На кожній ітерації ви ділите на найменше число, яке ділить чисельник і знаменник.

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

Сподіваюся, це зрозуміло.

Будь-яка мова дозволена. Це Code Golf, найкоротший виграш коду!


Питання було закрито, коли я публікував відповідь. До!
t-clausen.dk

@ t-clausen.dk Виклик було відновлено.
AdmBorkBork

Чому від 12/18до , 6/9а не 4/6(я не отримую все ітерації безлад ... коли я спрощую фракцію я отримав immedialtely в результаті спрощуються значення)?
edc65

Відповіді:


2

Желе , 59 байт

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

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

Як це працює

ṣ”/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 байт

Не дозволяючи використовувати стандартне ім'я дати, коштувало мені багато байтів, однак, щоб зберегти кілька байтів, я використав перші 3 символи опису дати за замовчуванням (у форматі пн гд ггг г год: miAM (або PM)) і додав назва решти місяця.

Гольф:

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

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

Безголівки:

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

Гм ... що перші два рядки роблять там ???
Ерік Аутгольфер

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ перший рядок повідомляє, яку базу даних використовувати для цього сценарію, другий рядок оголошує вхідну змінну. Я не включив їх до підрахунку, оскільки вони визначають, куди слід виконати сценарій, і розповісти, що таке вхідна змінна
t-clausen.dk

Я бачу а '12/2'на другому рядку, ви впевнені, що говорите мені правду?
Ерік Аутгольфер

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Боюся, я не розумію вашого запитання
t-clausen.dk

Я думаю , що ви використовуєте жорстко запрограмований дату, хоча я не впевнений , що якщо STDIN підтримується в SQL і варіантів ... Крім того , ви, здається , помилка Septemberз Septemper. 'temper','ober','ember','ember')+' '+LEFT(@d,2)
Ерік Аутгольфер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.