Simplifier une date

9

C'est similaire à la simplification des fractions, mais avec les dates!

L'entrée de votre programme doit être de la forme mm/dd Par exemple

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

Nous supposons que l'entrée sera valide de telle sorte que les mois contiennent ces nombres de jours:

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

Le travail de votre programme consiste à prendre l'entrée valide supposée et à simplifier de manière itérative (ou récursive) la date, et à chaque itération (y compris la 0e), sortir la date avec le nom complet du mois comme écrit ci-dessus.

Par exemple:

Étant donné une entrée de:

12/18

Serait sortie

December 18
June 9
February 3

Une entrée déjà simplifiée ne sort que d'elle-même:

11/17

Les sorties:

November 17

Les noms de mois ne peuvent pas provenir d'une fonction dans votre langue. Les chaînes peuvent être obscurcies, calculées, comme vous le souhaitez, mais vous ne pouvez pas utiliser une fonction standard comme GetMonthString (4) ou quelque chose, vous devez soit écrire cette fonction, soit trouver un moyen de sortir les noms de mois comme décrit.

Je ne peux penser à aucun cas où la date simplifiée produit une date illégale, mais si jamais vous produisez une date illégale en cours de route, affichez:

Illegal Date

Mais si vous êtes sûr que cela ne peut pas se produire, vous n'avez pas besoin de code couvrant ce cas. Les dates produites doivent toujours être valides conformément à ce qui a été décrit ci-dessus (il va sans dire que les mois et les jours commencent à 1).

L'algorithme:

À chaque itération, vous divisez par le plus petit nombre qui divise le numérateur et le dénominateur.

Autrement dit, vous trouvez tous les nombres tels que, en divisant le numérateur et le dénominateur par ce nombre, vous obtenez un nouveau numérateur et dénominateur qui sont tous deux des entiers (facteurs communs). Sélectionnez le plus petit et divisez individuellement le numérateur et le dénominateur pour produire une nouvelle fraction. Si le seul nombre que vous pouvez diviser est 1, alors vous avez simplifié autant que possible et vous vous arrêtez.

J'espère que cela est clair.

N'importe quelle langue est autorisée. C'est Code Golf, le code le plus court gagne!

jmasterx
la source
La question a été fermée pendant que je publiais une réponse. Ah!
t-clausen.dk
@ t-clausen.dk Le défi a été rouvert.
AdmBorkBork
Pourquoi partir 12/18à 6/9et non 4/6(je ne comprends pas tout le désordre d'itération ... quand je simplifie une fraction je suis arrivé immedialtely la valeur simplifiée résultant)?
edc65

Réponses:

2

Gelée , 59 octets

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

Essayez-le en ligne!

Comment ça fonctionne

ṣ”/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.
Dennis
la source
4

Pyth - 116 87 octets

jm++@rR3c."ayÖèÈÒ+J÷z4wëÝ~ñ!Õ¥´{mCØóy|å²z¼qP?ë"\qhd;ed.u/RYNPiFKsMcz\/K

Suite de tests .

Maltysen
la source
Explication s'il vous plait? : 3
Downgoat
0

TSQL 296 octets

Ne pas être autorisé à utiliser le nom de données standard m'a coûté beaucoup d'octets, mais pour économiser quelques octets, j'ai utilisé les 3 premiers caractères de la description de date par défaut (au format mon jj aaaa hh: miAM (ou PM)) et ajouté le reste du nom du mois.

Golfé:

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

Essayez-le en ligne

Non golfé:

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
t-clausen.dk
la source
Umm ... que font les deux premières lignes là-bas ???
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ la première ligne indique la base de données à utiliser pour ce script, la deuxième ligne déclare la variable d'entrée. Je ne les ai pas inclus dans le décompte car ils définissent où exécuter le script et
indiquent
Je vois un '12/2'sur la deuxième ligne, êtes-vous sûr de me dire la vérité?
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ J'ai bien peur de ne pas comprendre votre question
t-clausen.dk
Je pense que vous utilisez une date codée en dur, même si je ne suis pas sûr si STDIN est pris en charge dans SQL et variantes ... En outre, il semble que vous mal orthographié Septemberavec Septemper. 'temper','ober','ember','ember')+' '+LEFT(@d,2)
Erik the Outgolfer