Semplifica una data


9

Questo è simile alla semplificazione delle frazioni, ma con Date!

L'input del programma deve essere nel formato mm/dd Ad esempio

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

Partiamo dal presupposto che l'input sarà valido in modo che i mesi contengano questi numeri di giorni:

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

Il lavoro del tuo programma è quello di prendere l'input valido assunto e semplificare iterativamente (o ricorsivamente) la data e ad ogni iterazione (incluso il 0), produrre la data con il nome completo del mese come scritto sopra.

Per esempio:

Dato un input di:

12/18

Uscirebbe

December 18
June 9
February 3

Un input che è già semplificato genera solo se stesso:

11/17

Uscite:

November 17

I nomi dei mesi non possono provenire da una funzione nella tua lingua. Le stringhe possono essere offuscate, calcolate, come preferisci, ma non puoi usare una funzione standard come GetMonthString (4) o qualcosa del genere, o devi scrivere quella funzione o trovare un modo per generare i nomi dei mesi come descritto.

Non riesco a pensare a nessun caso in cui la data semplificata produca una data illegale, ma se mai produci una data illegale lungo la strada, produci:

Illegal Date

Ma se sei sicuro che ciò non possa accadere, non è necessario disporre di codice che copra questo caso. Le date emesse devono sempre essere valide secondo quanto sopra descritto (è ovvio che mesi e giorni iniziano a 1).

L'algoritmo:

Ad ogni iterazione dividi per il numero più piccolo che divide numeratore e denominatore.

Cioè, trovi tutti i numeri in modo tale che, dividendo sia il numeratore che il denominatore per questo numero produca un nuovo numeratore e denominatore che sono entrambi numeri interi (fattori comuni). Seleziona il più piccolo e dividi individualmente il numeratore e il denominatore per produrre una nuova frazione. Se l'unico numero che puoi dividere è 1, allora hai semplificato il più possibile e ti fermi.

Spero che questo sia chiaro.

È consentita qualsiasi lingua Questo è Code Golf, vince il codice più corto!


la domanda è stata chiusa mentre stavo postando una risposta. Doh!
t-clausen.dk,

@ t-clausen.dk La sfida è stata riaperta.
AdmBorkBork,

Perché da 12/18a 6/9e non 4/6(non ho ricevuto tutto il casino di iterazione ... quando ho semplificare una frazione ho avuto immedialtely il valore risultante semplificato)?
edc65,

Risposte:


2

Gelatina , 59 byte

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

Provalo online!

Come funziona

ṣ”/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.

4

Pyth - 116 87 byte

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

Test Suite .


Spiegazione per favore? : 3
Downgoat,

0

TSQL 296 byte

Non avere il permesso di usare il nome standard standard mi è costato un sacco di byte, tuttavia per salvare alcuni byte, ho usato i primi 3 caratteri della descrizione della data predefinita (con il formato mon dd yyyy hh: miAM (o PM)) e ho aggiunto il nome del resto del mese.

golfed:

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

Provalo 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 ... cosa ci fanno le prime due righe ???
Erik the Outgolfer,

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ la prima riga indica quale database utilizzare per questo script, la seconda riga dichiara la variabile di input. Non li ho inclusi nel conteggio in quanto definiscono dove eseguire lo script e dicendo qual è la variabile di input
t-clausen.dk

Vedo una '12/2'seconda riga, sei sicuro di dirmi la verità?
Erik the Outgolfer,

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Temo di non capire la tua domanda
t-clausen.dk

Penso che tu stia usando una data codificata, anche se non sono sicuro che STDIN sia supportato in SQL e varianti ... Inoltre, sembra che tu abbia sbagliato Septembera scrivere Septemper. 'temper','ober','ember','ember')+' '+LEFT(@d,2)
Erik the Outgolfer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.