简化日期


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,最短的代码获胜!


我发布答案时问题已关闭。h!
t-clausen.dk

@ t-clausen.dk挑战已重新打开。
AdmBorkBork

为什么从12/186/9,而不是4/6(我没有得到所有的迭代混乱...当我简化了一小部分我immedialtely所产生的简化值)?
edc65

Answers:


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 yyyy hh: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

嗯...前两行在做什么???
暴民埃里克(Erik the Outgolfer)

@EʀɪᴋᴛʜᴇGᴏʟғᴇʀ第一行告诉该脚本要使用哪个数据库,第二行声明输入变量。我没有将它们包括在计数中,因为它们定义了执行脚本的位置并告诉输入变量是什么
t-clausen.dk 2016年

'12/2'在第二行看到一个,您确定要告诉我真相吗?
暴民埃里克(Erik the Outgolfer)

@EʀɪᴋᴛʜᴇGᴏʟғᴇʀ恐怕我不明白您的问题
t-clausen.dk

我认为您使用的是硬编码的日期,虽然我不知道,如果STDIN在SQL支持和变种......而且,看来你拼错SeptemberSeptemper'temper','ober','ember','ember')+' '+LEFT(@d,2)
暴民埃里克(Erik the Outgolfer)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.