Prognoza daty palindromiczne


18

Daty palindromiczne to daty, które pojawiają się jako palindromy: ciąg cyfr można odczytać w ten sam sposób wstecz i do przodu. W przypadku formatu daty w Ameryce Północnej (MM / DD / RRRR) następnych kilka dat palindromicznych to:

02/02/2020

12/02/2021

03/02/2030

Wyzwanie

Utwórz funkcję, która zwraca wszystkie daty palindromiczne w spójnym, wspólnym formacie dat (wybranym przez Ciebie), które mieszczą się w zakresie dat ( edytuj: w tym sam zakres ).

Zasady

  • Aby zakwalifikować się jako palindrom, należy sprawdzić tylko znaki numeryczne daty.
  • Data może mieć dowolny wspólny format ( MM/DD/YYYY, DD-MM-YYYY), pod warunkiem, że używa dwóch cyfr dla miesiąca i dnia oraz czterech dla roku i używa znaku do oddzielenia części daty. Wyjście musi zachować rozdzielając znaki ( /, -, itd.). Twoja funkcja musi obsługiwać tylko jeden odrębny format daty. Podaj format w swojej odpowiedzi.
  • Jeśli zwrócono więcej niż jedną datę, należy je oddzielić przecinkiem lub znakiem nowej linii.
  • Najkrótsza odpowiedź wygrywa!

Przykład

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

Jeśli chcę opublikować odpowiedź Oracle SQL, czy mogę użyć typu danych wejściowych, DATEunikając to_date()lub muszę użyć mniej golfa VARCHAR2?
Giacomo Garabello

Nie wiem wystarczająco dużo o Oracle SQL, aby odpowiedzieć na to pytanie.
atlasolog

Odpowiedzi:


8

MATL, 24 23 bajty

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

Akceptuje dane wejściowe w postaci tablicy ciągów, w {lower, upper}których format daty to 'MM/DD/YYYY'. Dane wyjściowe mają również format MM/DD/YYYY.

Wypróbuj online

Wyjaśnienie

        % 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

Narzędzia Bash + GNU, 116 84

Wymaga 64-bitowej wersji daty dla danej skrzynki testowej.

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

I / O ma YYYY-MM-DDformat. Dane wejściowe są pobierane z dwóch wierszy standardowego wejścia, np

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

Wyjaśnienie

  • setzapisuje szablon polecenia daty, aby można było uzyskać do niego dostęp za pomocą $@parametru
  • date -uf- +%s konwertuje daty punktów końcowych na liczbę sekund od epoki Uniksa
  • jot interpoluje to, aby uzyskać listę sekund od epoki, po jednej na dzień, każdy z prefiksem @
  • date -uf- +%F formatuje każdą pozycję listy jako YYYY-MM-DD
  • sed sprawdza palindromy:
    • h zapisz linię wejściową w buforze wstrzymania
    • : zdefiniuj etykietę „bez nazwy”
    • s/-|^(.)(.*)\1$/\2/ jeśli znaleziono myślnik, usuń go lub jeśli pierwszy i ostatni znak pasują, usuń je
    • t jeśli powyżej było dopasowanie, wróć do nienazwanej etykiety
    • /./d jeśli pozostały jakieś znaki, linia nie jest palindromem - usuń ją i przejdź do następnej linii
    • gjeśli tu dotarliśmy, to nie nastąpiło usunięcie linii, więc linia musiała być palindromem. Pobierz linię z bufora wstrzymania i domyślnie ją wyświetl.

6

Python 2, 197 bajtów

Jeden bajt zapisany dzięki @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

Wypróbuj tutaj!

Format wejściowy i wyjściowy to YYYY-MM-DD. Pierwszy poziom intencji to spacje, drugi to tabulatory.
Nie dzieje się tu nic specjalnego. Wykorzystuje pewne execnadużycia, aby przekonwertować dane wejściowe na dateobiekty, dzieląc ciąg daty -i umieszczając listę w datekonstruktorze. Następnie po prostu iterujemy wszystkie daty w ich obejmującym zakresie i drukujemy te, które są palindromiczne.


1
Umieść from datetime import*pierwszą linię, aby zapisać bajt
cat

Nie jestem pewien, ale czy `a+timedelta(d)`to samo co str(a+timedelta(d))?
Mathias711,

1
@ Mathias711 Niestety nie, reprzwykle jest to odpowiednik tylko strdla prymitywnych typów danych. Na przykład datedostaję przedmioty datetime.date(2012, 12, 12).
Denker

5

PowerShell v2 +, 127 bajtów

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

Pobiera dane wejściowe jako argumenty wiersza polecenia $argsw MM/DD/YYYYformacie (lub podobnym) i przekształca jako [datetime]tablicę, przechowuje je w $ai $b. To jest krok konfiguracji forpętli. Warunek jest tak długi, że $ajest mniejszy lub równy $b.

W każdej iteracji ustalamy $crówny -formatowany ciąg yyyyMMddstylów, na podstawie $a. Następnie porównujemy, czy jest -eqto $codwrócone (za pomocą sztuczki łączenia tablic). Jeśli tak, wysyłamy dane wyjściowe $aw odpowiednim formacie. Tak czy inaczej, my zwiększamy $aze .AddDays(1)aby przejść do następnego dnia.

Przykład

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

4

Julia, 132 bajty

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

Jest to funkcja, która akceptuje dwa ciągi i zwraca tablicę ciągów.

Nie golfowany:

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

Wypróbuj online!


3

JavaScript (ES6), 159 154 bajtów

(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 w formacie ISO. Nie golfowany:

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 bajtów

Korzystanie z formatu ISO8601 dla daty (rrrr-mm-dd)

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

Skrzypce


2

Java 7, 436 435 416 bajtów * westchnienie *

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

Format wejściowy i wyjściowy: dd-MM-yyyy

Kod niepoznany i testowy:

Wypróbuj tutaj.

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

Wynik:

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


@cat Dziękuję za komentarz, ale chyba zapomniałeś dać +1 odpowiedzi. ; P
Kevin Cruijssen

Cóż, właściwie moja leniwa przeglądarka nie miała ochoty zgodzić się na to, że dałem +1, więc kiedy odświeżam, bam, mój głos już nie istnieje D:
cat

1

Oracle 11: SQL: 246 bajtów (hej, przynajmniej pobiłem 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);

Wynik:

  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>

W czytelnym formacie:

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

Wyjaśniono:

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.

Dowiedziałem się dzisiaj o funkcji ODWRÓCENIA :)


1

C #, 97 94 bajtów

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

C # lambda (X Action), w którym dane wejściowe są DateTimea wyjście jest drukowany za pomocą .Dump()sposobu (na @ EvilFonti podstęp ).


C #, 115 112 bajtów

(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) gdzie dane wejściowe są, DateTimea dane wyjściowe to a string.

Kod:

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

Wypróbuj je online!


0

VBA, 240 193 bajtów

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

To wszystko w zrozumiałym formacie. Przypadek testowy:

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

Bez tak dużej redundancji:

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 (przy użyciu zewnętrznej biblioteki) (158 bajtów)

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

Wyjaśnienie kodu: Ok, w końcu raz użyłem tutaj prawdziwego golfa. Zatem dane wejściowe a, b są obiektami daty. Utwórz zakres liczb całkowitych od a do b, gdzie a i b są wymuszone na liczby całkowite, a odległość między wartościami w tym zakresie wynosi 86400000, tj. Liczba tyknięć w ciągu jednego dnia. Odwzoruj każdą wartość w zakresie na obiekt daty. Filtruj ten zakres według predykatu reprezentującego daty palindromiczne. Logika określania tego jest prosta ... rzutuj reprezentację ciągu JSON obiektu bieżącej daty na tablicę znaków przy użyciu biblioteki i odfiltruj wpisy nienumeryczne i weź tylko 8 pierwszych wartości (ponieważ byłoby to rrrrMMdd ) i zapisz to w zmiennej z, a następnie sprawdź, czy z jest równoważne z Odwrócone. Na koniec wróć do natywnej tablicy JS

Edycja: Ogolono 2 bajty, usuwając niepotrzebne części.

wprowadź opis zdjęcia tutaj


0

Java, 269 bajtów

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


Nie golfowany:

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());
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.