日付を簡略化する


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の場合、可能な限り簡略化して停止します。

これが明確であることを願っています。

どの言語でも使用できます。これはコードゴルフです、最短のコードが勝ちます!


回答を投稿している間、質問は締め切られました。どー!
t-clausen.dk 2016年

@ t-clausen.dkチャレンジが再開されました。
AdmBorkBork 2016年

なぜ12/18toから6/9ではないの4/6ですか?
edc65 2016年

回答:


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

うーん...最初の2行は何をしているの???
Erik the Outgolfer 2016年

@EʀɪᴋᴛʜᴇGᴏʟғᴇʀ1行目はこのスクリプトに使用するデータベースを示し、2行目は入力変数を宣言しています。スクリプトを実行する場所を定義し、入力変数が何であるかを示すため、カウントには含めていません
t-clausen.dk

'12/2'2行目にが表示されます。本当のことを言っているのですか?
Erik the Outgolfer 2016年

@EʀɪᴋᴛʜᴇGᴏʟғᴇʀ質問が理解できません
。t

SQLとバリアントでSTDINがサポートされているかどうかはわかりませんが、ハードコードされた日付を使用していると思います...また、のスペルが間違っSeptemberているようですSeptemper'temper','ober','ember','ember')+' '+LEFT(@d,2)
Erik the Outgolfer 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.