Date palindromiche di previsione


18

Le date palindromiche sono date che appaiono come palindromi: la stringa di cifre può essere letta allo stesso modo in avanti e indietro. Per il formato data nordamericano (MM / GG / AAAA), le prossime date palindromiche sono:

02/02/2020

12/02/2021

03/02/2030

La sfida

Crea una funzione che restituisca tutte le date palindromiche in un formato di data comune e coerente (a tua scelta) che rientri in un intervallo di date ( modifica: compreso l'intervallo stesso ).

Regole

  • Per qualificarsi come palindromo, devono essere controllati solo i caratteri numerici della data.
  • La data può essere in qualsiasi formato comune ( MM/DD/YYYY, DD-MM-YYYY), purché utilizzi due cifre per il mese e il giorno e quattro per l'anno, e utilizza un carattere per separare parti della data. L'uscita deve preservare caratteri Seperating ( /, -ecc). La tua funzione deve gestire solo un formato data distinto. Si prega di includere il formato nella risposta.
  • Se vengono restituite più date, devono essere separate da virgola o nuova riga.
  • Vince la risposta più breve!

Esempio

date_palindrome('05/02/2050', '12/12/2060')
>>>['05/02/2050', '06/02/2060']

Se voglio pubblicare una risposta Oracle SQL, posso utilizzare il tipo di input DATEevitando un to_date()o devo usare meno golfable VARCHAR2?
Giacomo Garabello,

Non so abbastanza su Oracle SQL per rispondere a questo.
atlanteologo

Risposte:


8

MATL, 24 23 byte

YOZ}&:"@23XOtt47>)tP=?8M

Accetta input sotto forma di una matrice di stringhe in {lower, upper}cui è il formato della data 'MM/DD/YYYY'. Anche l'output è nel formato MM/DD/YYYY.

Provalo online

Spiegazione

        % Implicitly grab the two inputs
YO      % Convert to serial date format
Z}      % Push them onto the stack separately
&:      % Create an array from [lower...upper] incrementing 1 day
"       % For each day
  @23XO % Get the string version of the date (mm/dd/yyyy)
  tt    % Duplicate twice
  47>)  % Get the numeric parts
  tP=   % Compare numeric part with the flipped version of the numeric part
  ?8M   % If they are the same push it to the stack
        % Implicitly display stack contents

6

Utilità Bash + GNU, 116 84

Richiede la versione a 64 bit della data per la data testcase.

set date -uf- +%
jot -w@ - `$@s` 86400|$@F|sed -r 'h
:
s/-|^(.)(.*)\1$/\2/
t
/./d
g'

L'I / O è in YYYY-MM-DDformato. L'input è preso da due linee di stdin, ad es

printf "%s\n" 2050-05-02 2060-12-12 | ./palindate.sh

Spiegazione

  • set salva il modello di comando data in modo che sia possibile accedervi utilizzando il $@ parametro
  • date -uf- +%s converte le date degli endpoint in numero di secondi dall'epoca di Unix
  • jot interpola questo per fornire un elenco di secondi dall'epoca, uno al giorno, ciascuno con il prefisso @
  • date -uf- +%F formatta ciascuna voce dell'elenco come YYYY-MM-DD
  • sed controlli per palindromi:
    • h salva la riga di input nel buffer di mantenimento
    • : definire un'etichetta "senza nome"
    • s/-|^(.)(.*)\1$/\2/ se viene trovato un trattino, rimuoverlo o se il primo e l'ultimo carattere corrispondono, rimuoverli
    • t se c'era una corrispondenza sopra, torna all'etichetta senza nome
    • /./d se sono rimasti caratteri, la riga non è un palindromo: eliminala e passa alla riga successiva
    • gse siamo arrivati ​​qui, allora non è avvenuta la cancellazione della linea, quindi la linea deve essere stata un palindromo. Recupera la linea dal buffer di mantenimento e visualizzala implicitamente.

6

Python 2, 197 byte

Un byte salvato grazie a @cat!

from datetime import*
def g(a,b):
 for s in"ab":exec"%s=date(*[int(x)for x in %s.split('-')])"%(s,s)
 for d in range((b-a).days+1):
    x=str(a+timedelta(d));y=x.replace("-","")
    if y==y[::-1]:print x

Provalo qui!

Il formato di input e output è YYYY-MM-DD. Il primo livello di intenzioni sono gli spazi, il secondo è le schede.
Non sta succedendo niente di speciale qui. Usa un po 'di execabuso per convertire l'input in dateoggetti suddividendo la stringa della data -e separando l'elenco nel datecostruttore. Quindi ripetiamo semplicemente tutte le date nel loro intervallo inclusivo e stampiamo quelle che sono palindromiche.


1
Inserisci la from datetime import*prima riga per salvare un byte
cat

Non sono sicuro, ma fa `a+timedelta(d)`lo stesso str(a+timedelta(d))?
Mathias711,

1
@ Mathias711 Sfortunatamente no, di reprsolito è equivalente solo ai strtipi di dati primitivi. Per gli dateoggetti ottengo datetime.date(2012, 12, 12)ad esempio.
Denker,

5

PowerShell v2 +, 127 byte

for($a,$b=[datetime[]]$args;$a-le$b){if(($c="{0:yyyyMMdd}"-f$a)-eq-join$c[$c.length..0]){"{0:MM/dd/yyyy}"-f$a}$a=$a.AddDays(1)}

Accetta input come argomenti della riga di comando $args in formato MM/DD/YYYY(o simile) e li rimodella come [datetime]array, li memorizza in $ae $b. Questo è il passo di installazione del forloop. Il condizionale è lungo quanto $aè inferiore o uguale a $b.

Ogni iterazione, abbiamo impostato $cuguale a-f stringa di yyyyMMddstile ormatted , basata su $a. Confrontiamo quindi se è -eqnormale o $cinvertito (usando un trucco array-join). In tal caso, eseguiamo l'output $anel formato corretto. In entrambi i casi, aumentiamo $acon .AddDays(1)per passare al giorno successivo.

Esempio

PS C:\Tools\Scripts\golfing> .\forecast-palindromic-dates.ps1 '06/23/2016' '12/12/2020'
02/02/2020

4

Julia, 132 byte

f(a,b,t=s->DateTime(s,"mm/dd/y"),g=d->Dates.format(d,"mm/dd/yyyy"))=map(g,filter(d->(r=replace(g(d),"/",""))==reverse(r),t(a):t(b)))

Questa è una funzione che accetta due stringhe e restituisce una matrice di stringhe.

Ungolfed:

function f(a, b)
    # Define a function to create a DateTime object from a string
    t = s -> DateTime(s, "mm/dd/y")

    # Define a function to create a string from a DateTime object
    g = d -> Dates.format(d, "mm/dd/yyyy")

    # Filter the range a:b to palindromic dates
    p = filter(d -> (r = replace(g(d), "/", "")) == reverse(r), t(a):t(b))

    # Format all dates in the array
    m = map(g, p)

    return m
end

Provalo online!


3

JavaScript (ES6), 159 154 byte

(s,e)=>{for(r=[],s=Date.parse(s),e=Date.parse(e);s<=e;s+=864e5){d=new Date(s).toJSON().slice(0,10);`${a=d.match(/\d/g)}`==a.reverse()&&r.push(d)}return r}

I / O in formato ISO. Ungolfed:

function date_palindrome(start, end) {
    start = Date.parse(start);
    end = Date.parse(end);
    var result = [];
    while (start <= end) {
        var date = new Date(start).toISOString().slice(0, 10);
        var digits = date.match(/d/g);
        if (digits.join() == digits.reverse.join()) {
            result.push(date);
        }
        start += 24 * 60 * 60 * 1000; // ms
    }
    return result;
}

2

TSQL, 88 byte

Utilizzo del formato ISO8601 per data (aaaa-mm-gg)

DECLARE @ date='2050-05-02',@t date='2060-12-12'

a:IF stuff(reverse(@),3,1,'')=stuff(@,8,1,'')PRINT @
SET @=dateadd(d,1,@)IF @<=@t GOTO a

Violino


2

Java 7, 436 435 416 byte * sospiro .. *

import java.text.*;import java.util.*;void c(String...a)throws Exception{DateFormat f=new SimpleDateFormat("dd-MM-yyyy");Calendar s=Calendar.getInstance(),e=Calendar.getInstance();s.setTime(f.parse(a[0]));e.setTime(f.parse(a[1]));for(Date d=s.getTime();s.before(e);s.add(5,1),d=s.getTime()){String o=f.format(d),x=o.replaceAll("\\W|_",""),w="";for(char c:x.toCharArray())w=c+w;if(x.equals(w))System.out.println(o);}}

Formato di input e output: dd-MM-yyyy

Codice non testato e test:

Provalo qui.

import java.text.*;
import java.util.*;

class Main{
  static void c(String... a) throws Exception{
    DateFormat f = new SimpleDateFormat("dd-MM-yyyy");
    Calendar s = Calendar.getInstance(),
             e = Calendar.getInstance();
    s.setTime(f.parse(a[0]));
    e.setTime(f.parse(a[1]));
    for(Date d = s.getTime(); s.before(e); s.add(Calendar.DATE, 1), d = s.getTime()){
      String o = f.format(d),
             x = o.replaceAll("\\W|_", ""),
             w = "";
      for(char c : x.toCharArray()){
        w = c + w;
      }
      if(x.equals(w)){
        System.out.println(o);
      }
    }
  }

  public static void main(String[] a){
    try{
      c("05-02-2050", "12-12-2060");
    } catch (Exception e){}
  }
}

Produzione:

05-02-2050
15-02-2051
25-02-2052
06-02-2060


@cat Grazie per il commento immagino, ma hai dimenticato di fare +1 sulla risposta. ; P
Kevin Cruijssen,

Bene, in realtà, il mio browser pigro non aveva voglia di accettare di fare +1, quindi quando aggiorno, bam, il mio voto è andato D:
cat

1

Oracle 11: SQL: 246 byte (ehi, almeno ho battuto Java: P lol)

with d as(select to_date('&1','yyyy-mm-dd')s,to_date('&2','yyyy-mm-dd')e from dual),r as(select level-1 l from d connect by level<=e-s+1),x as(select s+l y,to_char(s+l,'yyyymmdd')w from d,r)select to_char(y,'yyyy-mm-dd')from x where w=reverse(w);

Produzione:

  SQL> with d as(select to_date('&1','yyyy-mm-dd')s,to_date('&2','yyyy-mm-dd')e from dual),r as(select level-1 l from d connect by level<=e-s+1),x as(select s+l y,to_char(s+l,'yyyymmdd')w from d,r)select to_char(y,'yyyy-mm-dd')from x where w=reverse(w);
  Enter value for 1: 2000-01-01
  Enter value for 2: 2021-01-01

  TO_CHAR(Y,
  ----------
  2001-10-02
  2010-01-02
  2011-11-02
  2020-02-02

  SQL>

In formato leggibile:

  with d as (select to_date('&1','yyyy-mm-dd') s,
                    to_date('&2','yyyy-mm-dd') e
              from dual),
        r as (select level-1 l 
                from d connect by level <= e-s+1),
        x as (select s+l y, to_char(s+l,'yyyymmdd') w 
                from d,r)
  select to_char(y,'yyyy-mm-dd')
    from x 
   where w=reverse(w);

Ha spiegato:

d: get input for start/end
r: generate rows needed, 1 per day.
x: calculate the actual dates, and convert them to a minimal string.
final: use REVERSE function to verify the palindroms, return in proper format.

Oggi ho imparato a conoscere la funzione INVERSO :)


1

C #, 97 94 byte

(a,b)=>{for(;a<b;a=a.AddDays(1))if($"{a:yyy}".SequenceEqual($"{a:MMdd}".Reverse()))a.Dump();};

C # lambda ( Action) dove sono gli input DateTimee l'output viene stampato usando il .Dump()metodo (il trucco di @ EvilFonti ).


C #, 115 112 byte

(a,b)=>{var r="";for(;a<b;a=a.AddDays(1))if($"{a:yyy}".SequenceEqual($"{a:MMdd}".Reverse()))r+=a+",";return r;};

C # lambda ( Func) dove sono gli input DateTimee l'output è astring .

Codice:

(a,b)=> {
    var r="";
    for(;a<b;a=a.AddDays(1)) {
        if($"{a:yyy}".SequenceEqual($"{a:MMdd}".Reverse()))
            r+=a+",";
    }
    return r;
};

Provali online!


0

VBA, 240 193 byte

Function f(a, b)
Dim j, g()
For i = CDate(a) To CDate(b)
    If Format(i, "yyyy") = StrReverse(Format(i, "mmdd")) Then
        ReDim Preserve g(j)
        g(j) = Format(i, "yyyy-mm-dd")
        j = j + 1
    End If
Next
f = g()
End Function

È tutto in un formato comprensibile. Caso di prova:

Sub e()
MsgBox Join(f("5/2/2050", "6/2/2060"), ", ")
End Sub

Senza quella ridondanza:

Function f(a,b)
Dim j, g()
For i=CDate(a) To CDate(b)
If Format(i,"yyyy")=StrReverse(Format(i,"mmdd")) Then
ReDim Preserve g(j)
g(j)=Format(i,"yyyy-mm-dd")
j=j+1
End If
Next
f=g()
End Function

0

Javascript (utilizzando una libreria esterna) (158 byte)

(a,b)=>_.RangeTo(a%1e20,b%1e20,864e5).Select(y=>new Date(y)).Where(x=>z=(_.From(x.toJSON()).Where(y=>!isNaN(y)).Take(8)).SequenceEqual(z.Reverse())).ToArray()

Link alla lib: https://github.com/mvegh1/Enumerable

Spiegazione del codice: Ok, finalmente ho usato un po 'di golf reale qui per una volta. Quindi gli input a, b sono oggetti Date. Crea un intervallo di numeri interi da a a b, dove aeb sono costretti in numeri interi e la distanza tra i valori nell'intervallo è 86400000, ovvero la quantità di tick in un giorno. Mappare ciascun valore nell'intervallo su un oggetto data. Filtra quell'intervallo in base al predicato che rappresenta le date palindromiche. La logica per determinare che è semplice ... eseguire il cast della rappresentazione di stringhe JSON dell'oggetto data corrente in un array di caratteri usando la libreria e filtrare le voci non numeriche, e prendere solo i primi 8 valori (perché sarebbe yyyyMMdd ) e memorizzalo nella variabile z, quindi controlla se z è equivalente a z Invertito. Infine, esegui nuovamente il cast dell'array JS nativo

Modifica: rasato 2 byte rimuovendo le parentesi non necessarie.

inserisci qui la descrizione dell'immagine


0

Java, 269 byte

import java.time.LocalDate;void q(String...a)throws Exception{LocalDate s=LocalDate.parse(a[0]);while(!s.isAfter(LocalDate.parse(a[1]))){String d=s.toString().replace("-","");if(d.equals(new StringBuffer(d).reverse().toString()))System.out.println(d);s=s.plusDays(1);}}


Ungolfed:

import java.io.IOException;
import java.time.LocalDate;

public class UnGolfedPalindromicDates {
    public static void main(String...a) throws IOException {
        LocalDate start = LocalDate.parse(a[0]), end = LocalDate.parse(a[1]);
        while (!start.isAfter(end)) {
            String d = start.toString().replace("-","");
            if (palindrome(d)) System.out.println(d);
            start = start.plusDays(1);
        }
    }

    public static boolean palindrome(String s) {
        return s.equals(new StringBuffer(s).reverse().toString());
    }
}
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.