Упростить дату


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 символа описания даты по умолчанию (в формате mon dd гггг чч: miAM (или PM)) и добавил название месяца

Golfed:

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

Попробуйте онлайн

Ungolfed:

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

Ммм ... что там делают первые две строчки ???
Эрик Outgolfer

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

Я вижу '12/2'на второй строке, вы уверены, что говорите мне правду?
Эрик Outgolfer

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

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