Прогноз палиндромних дат


18

Паліндромні дати - це дати, які відображаються як паліндрами: рядок цифр можна читати так само, як і вперед. Для північноамериканського формату дати (MM / DD / РРРР) наступними кількома паліндромними датами є:

02/02/2020

12/02/2021

03/02/2030

Змагання

Створіть функцію, яка повертає всі паліндромні дати у послідовному, загальному форматі дати (на ваш вибір), що підпадає під діапазон дат ( редагувати: включаючи сам діапазон ).

Правила

  • Щоб визначити паліндром, слід перевіряти лише числові символи дати.
  • Дата може бути у будь-якому загальному форматі ( MM/DD/YYYY, DD-MM-YYYY), якщо вона використовує дві цифри як для місяця, так і за день та чотири за рік, і вона використовує символ для відокремлення частин дати. Вихід повинен зберігати розділяють символи ( /, -і т.д.). Ваша функція повинна обробляти лише один чіткий формат дати. Будь ласка, включіть у відповідь формат.
  • Якщо повернуто більше однієї дати, вони повинні бути відокремлені комою або новим рядком.
  • Найкоротша відповідь виграє!

Приклад

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

Якщо я хочу опублікувати відповідь Oracle SQL, чи можу я використовувати тип введення, DATEуникаючи to_date()або, чи потрібно використовувати менш зіграний VARCHAR2?
Джакомо Гарабелло

Я не знаю достатньо про Oracle SQL, щоб відповісти на це.
атласолог

Відповіді:


8

MATL, 24 23 байти

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

Приймає введення у вигляді масиву рядків, {lower, upper}де знаходиться формат дати 'MM/DD/YYYY'. Вихід також у форматі MM/DD/YYYY.

Спробуйте в Інтернеті

Пояснення

        % 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

Bash + GNU комунальні послуги, 116 84

Потрібна 64-розрядна версія дати для даного тесту.

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

Введення / виведення у YYYY-MM-DDформаті. Вхід береться з двох рядків stdin, наприклад

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

Пояснення

  • setзберігає шаблон команди для дати, щоб отримати доступ до нього за допомогою $@параметра
  • date -uf- +%s перетворює дати кінцевої точки в кількість секунд після епохи Unix
  • jot Інтерполювати це, щоб дати список секунд від епохи, по одній на день, кожна з приставкою @
  • date -uf- +%F форматує кожен запис у списку як YYYY-MM-DD
  • sed перевірки на паліндроми:
    • h збережіть рядок введення в буфер утримування
    • : визначте мітку "без імені"
    • s/-|^(.)(.*)\1$/\2/ якщо тире знайдено, видаліть його або якщо перший і останній символи збігаються, видаліть їх
    • t якщо там було збіг вище, перейдіть назад до неназваної етикетки
    • /./d якщо залишилися символи, рядок не є паліндром - видаліть його та перейдіть до наступного рядка
    • gякщо ми потрапили сюди, то видалення рядка не відбулося, таким чином, лінія повинна була бути паліндром. Поверніть рядок із буфера утримування та неявно відобразіть його.

6

Python 2, 197 байт

Один байт збережено завдяки @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

Спробуйте тут!

Формат вводу та виводу є YYYY-MM-DD. Перший рівень намірів - це пробіли, другий - вкладки.
Тут нічого особливого не відбувається. Використовує деяке execзловживання для перетворення вхідних даних на dateоб'єкти, розділяючи рядок дати на -і закладаючи список у dateконструктор. Потім ми просто перебираємо всі дати в їх включеному діапазоні і друкуємо ті, які є паліндромними.


1
Покладіть from datetime import*на перший рядок, щоб зберегти байт
кіт

Не впевнений, але чи `a+timedelta(d)`так само str(a+timedelta(d))?
Mathias711

1
@ Mathias711 На жаль, reprце, як правило, еквівалентно лише strпримітивним типам даних. Для dateоб'єктів, які я отримую, datetime.date(2012, 12, 12)наприклад.
Денкер

5

PowerShell v2 +, 127 байт

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

Приймає введення як аргументи командного рядка $argsу MM/DD/YYYY(або подібному) форматі та переглядає як [datetime]масив, зберігає їх у $aта $b. Це крок налаштування forциклу. Умовна така тривалість, $aяка менша, ніж рівна $b.

Кожну ітерацію ми встановлюємо $cрівним -fстилізованим рядком yyyyMMddстилю, виходячи з $a. Потім ми порівнюємо, якщо це -eqнереально до $cзворотного (використовуючи трюк приєднання масиву). Якщо так, ми виводимо $aу відповідному форматі. У будь-якому випадку, ми збільшуємо $aз .AddDays(1)перейти на наступний день.

Приклад

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

4

Джулія, 132 байти

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

Це функція, яка приймає два рядки і повертає масив рядків.

Безголівки:

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

Спробуйте в Інтернеті!


3

JavaScript (ES6), 159 154 байт

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

Введення / виведення у форматі ISO. Безголівки:

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 байт

Використання формату ISO8601 для дати (рр-р-мм-дд)

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

Скрипка


2

Java 7, 436 435 416 байт * зітхнення .. *

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

Формат вводу та виводу: dd-MM-yyyy

Невикористаний і тестовий код:

Спробуйте тут.

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

Вихід:

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


@cat Дякую за коментар, мабуть, але ви забули фактично відповісти +1. ; P
Кевін Круїссен

Ну, власне, мій ледачий браузер не схожий на те, що я погодився, що я поставив +1, і тому, коли я поновіться, бам, мій голос пройшов D:
кіт

1

Oracle 11: SQL: 246 байт (ей, принаймні, я переміг 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);

Вихід:

  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>

У читаному форматі:

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

Пояснили:

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.

Дізналися про функцію REVERSE сьогодні :)


1

C #, 97 94 байт

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

C # lambda ( Action), де є входи, DateTimeа вихід друкується за допомогою .Dump()методу (@ EvilFonti's хитрість ).


C #, 115 112 байт

(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), де вхідні даніDateTime а вихід - astring .

Код:

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

Спробуйте їх онлайн!


0

VBA, 240 193 байт

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

Ось це в зрозумілому форматі. Тестовий випадок:

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

Без такої надмірності:

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 (за допомогою зовнішньої бібліотеки) (158 байт)

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

Посилання на lib: https://github.com/mvegh1/Eumerable

Пояснення коду: Добре, я нарешті використав тут якийсь фактичний гольф з кодом. Отже, входи a, b - це об'єкти дати. Створіть діапазон цілих чисел від a до b, де a і b примушуються до цілих чисел, а відстань між значеннями в діапазоні становить 86400000, тобто кількість тиків за один день. Зобразуйте кожне значення в діапазоні з об'єктом дати. Фільтруйте цей діапазон за присудком, який представляє паліндромні дати. Логіка визначити це просто ... відкиньте рядок JSON об'єкта поточної дати до масиву char за допомогою бібліотеки та відфільтруйте нечислові записи та візьміть лише перші 8 значень (тому що це було б yyyyMMdd ) і збережіть це у змінну z, а потім перевірте, чи z еквівалентно z Зворотній. Нарешті, поверніть до рідного масиву JS

Редагувати: Поголив 2 байти, видаливши непотрібні паролі ..

введіть тут опис зображення


0

Java, 269 байт

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


Безголівки:

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());
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.