Simplifica una fecha

9

Esto es similar a simplificar fracciones, ¡pero con Fechas!

La entrada de su programa debe ser de la forma mm/dd Por ejemplo

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

Suponemos que la entrada será válida de modo que los meses tengan estos números de días:

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

El trabajo de su programa es tomar la entrada válida supuesta y simplificar iterativamente (o recursivamente) la fecha, y en cada iteración (incluida la 0), generar la fecha con el nombre completo del mes como se escribió anteriormente.

Por ejemplo:

Dado un aporte de:

12/18

Saldría

December 18
June 9
February 3

Una entrada que ya está simplificada solo se genera a sí misma:

11/17

Salidas:

November 17

Los nombres de los meses no pueden provenir de una función en su idioma. Las cadenas se pueden ofuscar, calcular, como quiera, pero no puede usar una función estándar como GetMonthString (4) o algo así, ya sea que tenga que escribir esa función o encontrar una forma de generar los nombres de los meses como se describe.

No puedo pensar en ningún caso en que la fecha simplificada produzca una fecha ilegal, pero si alguna vez produce una fecha ilegal en el camino, salida:

Illegal Date

Pero si está seguro de que esto no puede suceder, no necesita tener un código que cubra este caso. Las fechas de salida siempre deben ser válidas de acuerdo con lo descrito anteriormente (no hace falta decir que los meses y días comienzan en 1).

El algoritmo:

En cada iteración se divide por el número más pequeño que divide el numerador y el denominador.

Es decir, encuentra todos los números de tal manera que, dividiendo tanto el numerador como el denominador por este número, produce un nuevo numerador y denominador que son ambos enteros (factores comunes). Seleccione el más pequeño y divida individualmente el numerador y el denominador para producir una nueva fracción. Si el único número por el que puede dividir es 1, entonces ha simplificado lo más posible y se detiene.

Espero que esto quede claro.

Cualquier idioma está permitido. Este es Code Golf, ¡el código más corto gana!

jmasterx
fuente
La pregunta se cerró mientras publicaba una respuesta. Doh!
t-clausen.dk
@ t-clausen.dk El desafío ha sido reabierto.
AdmBorkBork
¿Por qué desde y 12/18hacia (no obtengo todo el desorden de iteración ... cuando simplifico una fracción obtuve inmediatamente el valor simplificado resultante)? 6/94/6
edc65

Respuestas:

2

Jalea , 59 bytes

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

Pruébalo en línea!

Cómo funciona

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

Pyth - 116 87 bytes

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

Test Suite .

Maltysen
fuente
¿Explicación por favor? : 3
Downgoat
0

TSQL 296 bytes

No se me permite usar el nombre de fecha estándar me costó muchos bytes, sin embargo, para guardar algunos bytes, utilicé los primeros 3 caracteres de la descripción de fecha predeterminada (con el formato mon dd aaaa hh: miAM (o PM)) y agregué el resto del mes nombre.

Golfizado:

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

Pruébalo en línea

Sin 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
fuente
Umm ... ¿qué están haciendo las dos primeras líneas allí?
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ la primera línea indica qué base de datos usar para este script, la segunda línea declara la variable de entrada. No los he incluido en el recuento, ya que definen dónde ejecutar el script y dicen cuál es la variable de entrada
t-clausen.dk
Veo un '12/2'en la segunda línea, ¿estás seguro de que me estás diciendo la verdad?
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Me temo que no entiendo tu pregunta
t-clausen.dk
Creo que estás usando una fecha no modificable, aunque no estoy seguro de si STDIN es compatible con SQL y variantes ... Además, parece que están mal escritas Septembercon Septemper. 'temper','ober','ember','ember')+' '+LEFT(@d,2)
Erik the Outgolfer