Simplifique uma data


9

Isso é semelhante à simplificação de frações, mas com Datas!

A entrada do seu programa deve estar no formato mm/dd Por exemplo

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

Assumimos que a entrada será válida de modo que os meses tenham esses números de dias:

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

O trabalho do seu programa é pegar a entrada válida assumida e, iterativamente (ou recursivamente), simplificar a data e, a cada iteração (incluindo a 0ª), gerar a data com o nome completo do mês, conforme escrito acima.

Por exemplo:

Dada uma contribuição de:

12/18

Saída

December 18
June 9
February 3

Uma entrada que já é simplificada apenas gera em si mesma:

11/17

Saídas:

November 17

Os nomes dos meses não podem vir de uma função no seu idioma. As strings podem ser ofuscadas, calculadas da maneira que você quiser, mas você não pode usar uma função padrão como GetMonthString (4) ou algo assim; você precisa escrever essa função ou encontrar uma maneira de exibir os nomes dos meses, conforme descrito.

Não consigo pensar em nenhum caso em que a data simplificada produza uma data ilegal, mas, se alguma vez você produzir uma data ilegal ao longo do caminho, produza:

Illegal Date

Mas se você tem certeza de que isso não pode acontecer, não precisa ter um código que cubra esse caso. As datas exibidas sempre precisam ser válidas de acordo com o que foi descrito acima (não é preciso dizer que meses e dias começam em 1).

O algoritmo:

Em cada iteração, você divide pelo menor número que divide numerador e denominador.

Ou seja, você encontra todos os números que, ao dividir o numerador e o denominador por esse número, produz um novo numerador e denominador que são números inteiros (fatores comuns). Selecione o menor e divida individualmente o numerador e o denominador para produzir uma nova fração. Se o único número que você pode dividir for 1, você simplificou o máximo possível e para.

Espero que isso esteja claro.

Qualquer idioma é permitido. Este é o Code Golf, o código mais curto vence!


A pergunta foi encerrada enquanto eu estava postando uma resposta. Doh!
t-clausen.dk

@ t-clausen.dk O desafio foi reaberto.
AdmBorkBork

Por que de e 12/18para 6/9não 4/6(não recebo toda a bagunça da iteração ... quando simplifico uma fração, obtive imediatamente o valor simplificado resultante)?
edc65

Respostas:


2

Geléia , 59 bytes

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

Experimente online!

Como 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.


0

TSQL 296 bytes

Não poder usar o nome de dados padrão me custou muitos bytes; no entanto, para economizar alguns bytes, usei os três primeiros caracteres da descrição da data padrão (com o formato mon dd aaaa hh: miAM (ou PM)) e adicionei o nome do resto do mês.

Golfe:

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

Experimente online

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

Umm ... quais são as duas primeiras linhas fazendo lá ???
Erik the Outgolfer

A primeira linha do @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ diz qual banco de dados usar para esse script, a segunda linha está declarando a variável de entrada. Eu não incluí-los na contagem como eles definir onde para executar o script e dizer o que a variável de entrada é
t-clausen.dk

Eu vejo um '12/2'na segunda linha, você tem certeza que está me dizendo a verdade?
Erik the Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Receio não ter entendido sua pergunta
t-clausen.dk 15/16

Eu acho que você está usando uma data hard-coded, embora eu não tenho certeza se STDIN é suportado no SQL e variantes ... Além disso, parece que você grafada Septembercom Septemper. 'temper','ober','ember','ember')+' '+LEFT(@d,2)
Erik the Outgolfer
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.