Vorhersage palindromischer Daten

18

Palindrome Datumsangaben sind Datumsangaben, die als Palindrome angezeigt werden: Die Ziffernfolge kann auf die gleiche Weise rückwärts wie vorwärts gelesen werden. Für das nordamerikanische Datumsformat (MM / TT / JJJJ) sind die nächsten palindromischen Daten:

02/02/2020

12/02/2021

03/02/2030

Die Herausforderung

Erstellen Sie eine Funktion, die alle palindromischen Daten in einem konsistenten, gemeinsamen Datumsformat (Ihrer Wahl) zurückgibt, das in einen Datumsbereich fällt ( Bearbeiten: einschließlich des Bereichs selbst ).

Regeln

  • Um als Palindrom zu gelten, sollten nur die numerischen Zeichen des Datums überprüft werden.
  • Das Datum kann in jedem gängigen Format ( MM/DD/YYYY, DD-MM-YYYY) angegeben werden, sofern es sowohl für den Monat als auch für den Tag zwei Ziffern und für das Jahr vier Ziffern verwendet und Teile des Datums durch ein Zeichen voneinander getrennt werden. Der Ausgang muss erhalten Trenn - Zeichen ( /, -usw.). Ihre Funktion muss nur ein bestimmtes Datumsformat verarbeiten. Bitte geben Sie das Format in Ihrer Antwort an.
  • Wenn mehr als ein Datum zurückgegeben wird, sollten diese durch Kommas oder Zeilenumbrüche getrennt werden.
  • Kürzeste Antwort gewinnt!

Beispiel

date_palindrome('05/02/2050', '12/12/2060')
>>>['05/02/2050', '06/02/2060']
Atlasologe
quelle
Wenn ich eine Oracle SQL-Antwort posten möchte, kann ich den Eingabetyp verwenden DATE, der ein vermeidet, to_date()oder muss ich den weniger golffähigen verwenden VARCHAR2?
Giacomo Garabello
Ich weiß nicht genug über Oracle SQL, um darauf zu antworten.
Atlasologe

Antworten:

8

MATL, 24 23 Bytes

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

Akzeptiert Eingaben in Form eines String-Arrays mit {lower, upper}dem Datumsformat 'MM/DD/YYYY'. Die Ausgabe erfolgt ebenfalls im Format MM/DD/YYYY.

Probieren Sie es online

Erläuterung

        % 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
Suever
quelle
6

Bash + GNU-Dienstprogramme, 116 84

Erfordert eine 64-Bit-Version des Datums für den angegebenen Testfall.

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

E / A ist im YYYY-MM-DDFormat. Die Eingabe erfolgt aus zwei Zeilen stdin, z

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

Erläuterung

  • setspeichert die Datumsbefehlsvorlage, damit über den $@Parameter darauf zugegriffen werden kann
  • date -uf- +%s Konvertiert Endpunktdaten in die Anzahl der Sekunden seit der Unix-Epoche
  • jot interpoliert dies, um eine Liste von Sekunden aus der Epoche zu erhalten, eine pro Tag, denen jeweils ein Präfix vorangestellt ist @
  • date -uf- +%F formatiert jeden Listeneintrag als YYYY-MM-DD
  • sed prüft auf Palindrome:
    • h Speichern Sie die Eingabezeile im Haltepuffer
    • : definiere "unbenanntes" Etikett
    • s/-|^(.)(.*)\1$/\2/ Wenn ein Bindestrich gefunden wird, entfernen Sie ihn, oder wenn das erste und das letzte Zeichen übereinstimmen, entfernen Sie sie
    • t Wenn oben eine Übereinstimmung gefunden wurde, springen Sie zurück zum unbenannten Etikett
    • /./d Wenn noch Zeichen übrig sind, ist die Zeile kein Palindrom. Löschen Sie sie und fahren Sie mit der nächsten Zeile fort
    • gWenn wir hier sind, ist keine Zeile gelöscht worden. Die Zeile muss also ein Palindrom gewesen sein. Holen Sie sich die Zeile aus dem Haltepuffer zurück und zeigen Sie sie implizit an.
Digitales Trauma
quelle
6

Python 2, 197 Bytes

Ein Byte gespart dank @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

Probieren Sie es hier aus!

Eingabe- und Ausgabeformat ist YYYY-MM-DD. Erste Absichtsebene sind Leerzeichen, zweite Ebene sind Tabulatoren.
Hier ist nichts Besonderes los. Verwendet einen gewissen execMissbrauch, um die Eingabe in dateObjekte zu konvertieren, indem die Datumszeichenfolge aufgespalten -und die Liste in den dateKonstruktor aufgeteilt wird. Dann iterieren wir einfach über alle Daten in ihrem Inklusivbereich und drucken diejenigen, die palindrom sind.

Denker
quelle
1
Setzen Sie die from datetime import*in der ersten Zeile ein Byte zu speichern
cat
Nicht sicher, aber `a+timedelta(d)`wie str(a+timedelta(d))?
Mathias711
1
@ Mathias711 Leider nicht, reprentspricht in der Regel nur strprimitiven Datentypen. Für dateObjekte bekomme ich datetime.date(2012, 12, 12)zum Beispiel.
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)}

Übernimmt Eingaben als Befehlszeilenargumente $argsim MM/DD/YYYY(oder ähnlichen) Format und setzt sie als [datetime]Array um, speichert sie in $aund $b. Das ist der Einrichtungsschritt der forSchleife. Die Bedingung ist so lange, wie sie $akleiner oder gleich ist $b.

Bei jeder Iteration setzen wir $cgleich eine -formattierte Zeichenfolge des yyyyMMddStils, basierend auf $a. Wir vergleichen dann, ob dies -eqtatsächlich $cumgekehrt ist (mithilfe eines Array-Join-Tricks). In diesem Fall wird $aim richtigen Format ausgegeben. In jedem Fall erhöhen wir uns $amit .AddDays(1), um zum nächsten Tag überzugehen.

Beispiel

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

Julia, 132 Bytes

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)))

Dies ist eine Funktion, die zwei Zeichenfolgen akzeptiert und ein Array von Zeichenfolgen zurückgibt.

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

Probieren Sie es online!

Alex A.
quelle
3

JavaScript (ES6), 159 bis 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 im ISO-Format. 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;
}
Neil
quelle
2

TSQL, 88 Bytes

Verwenden des ISO8601-Formats für das Datum (JJJJ-MM-TT)

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

Geige

t-clausen.dk
quelle
2

Java 7, 436 435 416 Bytes * seufz .. *

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);}}

Eingabe- und Ausgabeformat: dd-MM-yyyy

Ungolfed & Testcode:

Probieren Sie es hier aus.

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){}
  }
}

Ausgabe:

05-02-2050
15-02-2051
25-02-2052
06-02-2060
Kevin Cruijssen
quelle
@cat Danke für den Kommentar, aber du hast vergessen, die Antwort tatsächlich +1 zu geben. ; P
Kevin Cruijssen
Tatsächlich wollte mein fauler Browser nicht zustimmen, dass ich +1 gebe, und wenn ich mich aktualisiere, meine Stimme ist weg. D:
cat
1

Oracle 11: SQL: 246 Bytes (hey, zumindest habe ich Java geschlagen: 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);

Ausgabe:

  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 lesbarem Format:

  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);

Erklärt:

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.

Habe heute etwas über die REVERSE-Funktion gelernt :)

Dito
quelle
1

C # 97 94 Bytes

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

C # lambda ( Action), wobei Eingaben DateTimeund die Ausgabe mit der .Dump()Methode gedruckt werden (@ EvilFontis Trick ).


C #, 115 112 Bytes

(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), wo Eingaben DateTimeund Ausgaben sind, ist a string.

Code:

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

Probiere sie online aus!

aloisdg sagt Reinstate Monica
quelle
0

VBA, 240 193 Bytes

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

Das wars in einem verständlichen Format. Testfall:

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

Ohne so viel Redundanz:

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
user3819867
quelle
0

Javascript (mit externer Bibliothek) (158 Bytes)

(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 zu lib: https://github.com/mvegh1/Enumerable

Code-Erklärung: Ok, ich habe hier endlich mal ein bisschen Code-Golf gespielt. Die Eingaben a, b sind also Datumsobjekte. Erstellen Sie einen Bereich von Ganzzahlen von a bis b, wobei a und b in Ganzzahlen umgewandelt werden und der Abstand zwischen den Werten im Bereich 86400000 beträgt, dh die Anzahl der Ticks an einem Tag. Ordnen Sie jeden Wert im Bereich einem Datumsobjekt zu. Filtern Sie diesen Bereich nach dem Prädikat, das palindromische Daten darstellt. Die Logik, um zu bestimmen, dass dies einfach ist ... Konvertieren Sie die JSON-Zeichenfolgendarstellung des aktuellen Datumsobjekts mithilfe der Bibliothek in ein Zeichenarray, filtern Sie die nicht numerischen Einträge heraus und nehmen Sie nur die ersten 8 Werte (da dies yyyyMMdd wäre) ) und speichere das in der Variablen z und überprüfe dann, ob z gleich z Umgekehrt ist. Zuletzt kehren Sie zum nativen JS-Array zurück

Edit: Rasiert 2 Bytes durch Entfernen unnötiger Parens.

Bildbeschreibung hier eingeben

applejacks01
quelle
0

Java, 269 Bytes

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());
    }
}
416E64726577
quelle