Leggi la mia data in formato libero


10

Data una data scritta in qualsiasi (deve gestire tutti nello stesso programma) dei seguenti formati, analizzalo in un valido yyyy/mm/dd date.

17th May 2012
March 14th, 2016
20 February 2014
September 14, 2017
Sunday, June 8, 2015

Regole

  • Le date a volte non saranno valide, ad es. giorno errato per il mese o il numero di mesi in un anno, è necessario gestire entrambi i casi. Scegliendo un errore o restituendo un valore di falsità coerente. (Aderiranno comunque ai formati di modello sopra)
  • Per creare un output a due cifre è necessario utilizzare un'imbottitura per giorni e mesi inferiori a 10.
  • I nomi dei mesi saranno sempre il nome completo, non abbreviati nelle loro controparti a tre caratteri.
  • Puoi presumere che l'anno sarà sempre compreso nell'intervallo999999.
  • Non è necessario gestire numeri negativi.
  • È possibile creare un programma o una funzione completi in modo che l'output possa essere in qualsiasi formato, stampato sulla console o restituito da una funzione.
  • L'input sarà sempre una stringa, l'output deve sempre essere una stringa, se lo rende più breve accettarlo come singolo argomento in un array, ad es. ["17th May 2012"]puoi farlo e l'output può essere lo stesso["2012/05/17"]
  • Puoi presumere che l'ortografia nell'input sia corretta.

BONUS: perché a chi qui non piace una sfida;)

Se riesci a consentire anche i formati di input The Fourteenth of March, 2016o March the Fourteenth, 2016puoi rimuovere 20 byte extra dal tuo codice con un numero di byte finale inferiore a 1 risultante in 1.

Ecco i numeri scritti completi per ciascuno dei giorni per evitare qualsiasi confusione sull'ortografia.

First, Second, Third, Fourth, Fifth, Sixth, Seventh, Eighth, Nineth, Tenth, Eleventh, Twelfth, Thirteenth, Fourteenth, Fifteenth, Sixteenth, Seventeenth, Eighteenth, Nineteenth, Twentieth, Twenty First, Twenty Second, Twenty Third, Twenty Fourth, Twenty Fifth, Twenty Sixth, Twenty Seventh, Twenty Eighth, Twenty Nineth, Thirtieth, Thirty First

Casi test

INPUT                           | Output
17th May 2012                   | 2012/05/17
March 14th, 2016                | 2016/03/14
20 February 2014                | 2014/02/20
September 14, 2017              | 2017/09/14
Sunday, June 8, 2015            | 2015/06/08
1st January 1918                | 1918/01/01

The Fourteenth of March, 2016   | 2016/03/14
March the Fourteenth, 2016      | 2016/03/14
November the Seventeenth, 2019  | 2019/11/17
The Thirtieth of April, 2016    | 2016/04/30

30 February 2014                | Invalid
September 99, 2017              | Invalid
Sunday, June8, 2015             | Invalid

The Thirty First of April, 2016 | Invalid


10
" perché a chi qui non piace una sfida " - quando arrivano sotto forma di bonus, la maggior parte di noi non lo fa! E boo-urne per inserire la convalida.
Shaggy,

3
@ Mr.Xcoder Credo che l'intera sfida è quella di supportare più formati di input .. le cose come 20 February 2014sono di default supportato in un sacco di data-parser, ma 17the Sunday, June 8, 2015sono un po 'più difficile da analizzare (a seconda della lingua).
Kevin Cruijssen,

1
@ Mr.Xcoder Non ho mai detto che è stata una sfida divertente / noiosa, facile / difficile, buona / cattiva. Sto semplicemente affermando che sulla base di ciò che ho letto nella sfida, il supporto per formati multipli di input sembra essere l'obiettivo principale della sfida. Sono d'accordo che molto probabilmente sarà un if-else per i cinque formati di input, o una sorta di regex per estrarre l'anno, il mese e il giorno (che è attualmente il mio approccio).
Kevin Cruijssen,

3
Il giorno della settimana è sempre corretto? Sarebbe Thursday, August 25, 2017valido? Vedo osservazioni ignorando il DOW.
Benjamin Cuningham,

Risposte:


4

Rotaie, 41 , 37 35 byte

->x{x.to_date.strftime('%Y/%m/%d')}

Non conosco un interprete online per Rails, ma ecco uno screenshot che dimostra questo proc

inserisci qui la descrizione dell'immagine


Link dell'interprete online?
Jonathan Allan,

1
Funziona davvero per tutti i formati in questione? : o
totalmente umano il

@totallyhuman Aggiunto uno screenshot che mostra i risultati. Sfortunatamente non conosco un interprete online :(
Suever

8

PowerShell , 91 89 91 56 byte

date("$args"-replace'th|rd|st|(\b.*)day|,')-f yyyy/MM/dd

Provalo online!

Accetta l'input come stringa. Usa a -replaceper sbarazzarsi di junk, quindi usa il Get-Datecomando integrato con il -fflag ormat per specificare il yyyy/MM/ddformato richiesto . Quella stringa viene lasciata sulla pipeline e l'output è implicito.

Risparmiato due byte grazie a Mr Xcoder. Ho salvato un grosso pezzo grazie al golf regex di TessellatingHeckler.


1
Ehi, guarda l'invio competitivo di PowerShell!
Erik the Outgolfer,

@EriktheOutgolfer La manipolazione della data è uno dei punti di forza di PowerShell.
AdmBorkBork,


@ Mr.Xcoder "all those" = 2. lol. Grazie!
AdmBorkBork,

È possibile rimuovere il ''dal formato della data, per -2. Se si desidera attenersi al proprio approccio, dato che "l'ortografia è corretta", è possibile sostituirlo 'th|rd|st|(\b.*)day|,'e scende a 56 byte e gestisce gli stessi casi. Anche se penso che sia sbagliato perché se lasci cadere i giorni, non puoi ritirare il Sunday, June8, 2015 | Invalidcaso perché era lunedì. Dovrebbe essere un errore, ma viene considerato valido. Non sono sicuro di quale sarà la sentenza o se gli altri lo stanno controllando.
Tessellating Heckler,

4

PHP, 73 164 + 1 byte

for(preg_match("#(\d+)[^\d]+(\d+)#",$d=$argn,$r);$m++<12;)strpos(_.$d,date(F,strtotime($r[2].-$m)))&&printf(checkdate($m,$r[1],$r[2])?"$r[2]/%02d/%02d":E,$m,$r[1]);

Esegui come pipe -nRo provalo online .

Il controllo della data è stato davvero costoso: ho dovuto smontare la data prima di utilizzare un built-in, quindi provare ad errori sul nome del mese.


Penso che devi supportare tutti i formati, non solo uno di essi?
Erik the Outgolfer,

1
@EriktheOutgolfer lo fa. Ma non i formati bonus.
Tito,

@EriktheOutgolfer Gestisce tutti i formati.
Mr. Xcoder,

1
Questo non riesce per date non valide. 30 February 2014ritorna 2014/03/02. Scegliendo un errore o restituendo un valore di falsità coerente. (
Aderiranno

@ Mr.Xcoder Questo lo rovina abbastanza ...
Tito

3

Python 3 + libreria parsedatetime, 152 139 155 153 byte

Salvato 13 byte grazie a Jonathan Allan

Aggiunti 16 byte per gestire le date con giorni di lunghezza non validi

Salvato 2 byte rimuovendo l'assegnazione lambda

lambda s:re.search(f'(^| ){str(h(s)[0].tm_mday)[:2]}[^\d]',s)and time.strftime('%Y/%m/%d',h(s)[0])
import parsedatetime as p,time,re
h=p.Calendar().parse

Provalo online!

Non supporta le date dei bonus


Benvenuti in PPCG! Bel primo post. Salvare 13 byte utilizzando: il valore restituito false di None; import ...as; E un lambdariutilizzando parsecome h.
Jonathan Allan,


1

Java (OpenJDK 8) , 190 + 26 = 216 byte

import java.time.format.*;

s->DateTimeFormatter.ofPattern("uuuu/MM/dd").format(DateTimeFormatter.ofPattern("[EEEE, ][d ]MMMM [d, ]uuuu").withResolverStyle(ResolverStyle.STRICT).parse(s.replaceAll("(\\d)[a-z].","$1")))

Provalo online!

Nota importante: è stato più breve convalidare anche il giorno della settimana invece di abbandonarlo, in modo che la convalida sia inclusa!

Non ho provato SimpleDateFormatoltre gli ovvi casi che tutti hanno accettato date come il 30 febbraio. Quindi ho dovuto abbandonarlo e ho usato Java 8 DateTimeFormatter.

Spiegazione

"[EEEE, ][d ]MMMM [d, ]uuuu"

Questo formato significa:

  • giorno della settimana facoltativo seguito da virgola e spazio [EEEE, ](succede inSunday, ... ),
  • seguito da un giorno opzionale con spazio [d ],
  • seguito dal mese in lettere MMMMe spazio completo ,
  • seguito da un giorno opzionale con virgola e spazio [d, ],
  • seguita dall'anno uuuuper far sapere al parser che siamo nell'era gregoriana.

Codice:

import java.time.format.*;                                     // Required for DateTimeFormatter, *and* ResolverStyle

s->DateTimeFormatter.ofPattern("uuuu/MM/dd")                   // Output format
  .format(
    DateTimeFormatter.ofPattern("[EEEE, ][d ]MMMM [d, ]uuuu")  // Input format
      .withResolverStyle(ResolverStyle.STRICT)                 // Invalidates xxxx-02-30 instead of transforming it into xxxx-02-28
      .parse(
        s.replaceAll("(\\d)[a-z].","$1")                       // remove st, nd, rd, th
       )
    )

Crediti

  • 2 byte nella regex grazie a Neil.

1
Hai bisogno delle parentesi nel replaceAllmodello?
Neil,

Sembra di no. Grazie, @Neil!
Olivier Grégoire,

1

JavaScript (ES6), 124 122 byte

f=
s=>(d=new Date(s.replace(/.[dht]\b/,'')+' +0')).getDate()==s.match(/\d\d?/)&&d.toISOString().replace(/-(..)(T.*)?/g,'/$1')
<input oninput=o.textContent=f(this.value)><pre id=o>


Restituisce 2015/06/07per June 8, 2015(problema UTC? Sono in UTC + 2) efalse per uno Sunday, June 8, 2015o Monday, June 8, 2015.
Olivier Grégoire,

1
@ OlivierGrégoire Grazie per avermelo sottolineato. Avevo provato solo le date nel Regno Unito al di fuori dell'ora legale, quindi stavano già utilizzando UTC e non avevo provato i giorni feriali che finivanonday .
Neil
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.