Vereinfachen Sie ein Datum

9

Dies ähnelt der Vereinfachung von Brüchen, jedoch mit Datumsangaben!

Die Eingabe Ihres Programm muss von der Form mm/dd zum Beispiel

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

Wir gehen davon aus, dass die Eingabe so gültig ist, dass die Monate diese Anzahl von Tagen enthalten:

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

Die Aufgabe Ihres Programms besteht darin, die angenommene gültige Eingabe zu übernehmen und das Datum iterativ (oder rekursiv) zu vereinfachen und bei jeder Iteration (einschließlich der 0.) das Datum mit dem vollständigen Namen des Monats wie oben beschrieben auszugeben.

Beispielsweise:

Bei einer Eingabe von:

12/18

Würde ausgeben

December 18
June 9
February 3

Eine bereits vereinfachte Eingabe gibt nur sich selbst aus:

11/17

Ausgänge:

November 17

Die Monatsnamen können nicht von einer Funktion in Ihrer Sprache stammen. Die Zeichenfolgen können verschleiert und berechnet werden, wie Sie möchten, aber Sie können keine Standardfunktion wie GetMonthString (4) oder ähnliches verwenden. Sie müssen entweder diese Funktion schreiben oder einen Weg finden, die Monatsnamen wie beschrieben auszugeben.

Ich kann mir keine Fälle vorstellen, in denen das vereinfachte Datum ein illegales Datum erzeugt, aber wenn Sie jemals ein illegales Datum auf dem Weg produzieren, geben Sie Folgendes aus:

Illegal Date

Wenn Sie jedoch sicher sind, dass dies nicht möglich ist, benötigen Sie keinen Code für diesen Fall. Die ausgegebenen Daten müssen nur immer gemäß den oben beschriebenen Angaben gültig sein (es versteht sich von selbst, dass Monate und Tage bei 1 beginnen).

Der Algorithmus:

Bei jeder Iteration dividieren Sie durch die kleinste Zahl, die Zähler und Nenner teilt.

Das heißt, Sie finden alle Zahlen so, dass durch Teilen des Zählers und des Nenners durch diese Zahl ein neuer Zähler und Nenner erzeugt werden, die beide ganze Zahlen sind (gemeinsame Faktoren). Wählen Sie den kleinsten aus und teilen Sie Zähler und Nenner einzeln, um einen neuen Bruch zu erhalten. Wenn die einzige Zahl, durch die Sie teilen können, 1 ist, haben Sie so viel wie möglich vereinfacht und hören auf.

Ich hoffe das ist klar.

Jede Sprache ist erlaubt. Dies ist Code Golf, der kürzeste Code gewinnt!

jmasterx
quelle
Die Frage wurde geschlossen, während ich eine Antwort veröffentlichte. Doh!
t-clausen.dk
@ t-clausen.dk Die Herausforderung wurde wieder geöffnet.
AdmBorkBork
Warum von 12/18bis 6/9und nicht 4/6(ich bekomme nicht das ganze Iterations-Chaos ... wenn ich einen Bruch vereinfache, bekomme ich sofort den resultierenden vereinfachten Wert)?
edc65

Antworten:

2

Gelee , 59 Bytes

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

Probieren Sie es online aus!

Wie es funktioniert

ṣ”/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
quelle
4

Pyth - 116 87 Bytes

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

Testsuite .

Maltysen
quelle
Erklärung bitte? : 3
Downgoat
0

TSQL 296 Bytes

Da ich den Standard-Dateinamen nicht verwenden durfte, kostete mich dies eine Menge Bytes. Um jedoch einige Bytes zu sparen, verwendete ich die ersten 3 Zeichen der Standard-Datumsbeschreibung (mit dem Format mon dd yyyy hh: miAM (oder PM)) und fügte das hinzu Rest des Monats Name.

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

Probieren Sie es online aus

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
t-clausen.dk
quelle
Ähm ... was machen die ersten beiden Zeilen dort ???
Erik der Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ In der ersten Zeile wird angegeben, welche Datenbank für dieses Skript verwendet werden soll. In der zweiten Zeile wird die Eingabevariable deklariert. Ich habe sie nicht in die Zählung aufgenommen, da sie definieren, wo das Skript ausgeführt werden soll und was die Eingabevariable ist
t-clausen.dk
Ich sehe ein '12/2'in der zweiten Zeile. Bist du sicher, dass du mir die Wahrheit sagst?
Erik der Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Ich fürchte, ich verstehe Ihre Frage nicht
t-clausen.dk
Ich denke, Sie verwenden ein fest codiertes Datum, obwohl ich nicht sicher bin, ob STDIN in SQL und Varianten unterstützt wird ... Außerdem scheinen Sie falsch geschrieben Septemberzu haben Septemper. 'temper','ober','ember','ember')+' '+LEFT(@d,2)
Erik der Outgolfer