预报回文日期


18

回文日期是显示为回文日期的日期:数字字符串的读取方式可以与向前相同。对于北美日期格式(MM / DD / YYYY),接下来的几个回文日期是:

02/02/2020

12/02/2021

03/02/2030

挑战

创建一个函数,该函数以一致的,通用的日期格式(您选择的)返回所有属于日期范围内的回文日期(编辑:包括范围本身)。

规则

  • 要获得回文资格,仅应检查日期的数字字符。
  • 日期可以采用任何通用格式(MM/DD/YYYYDD-MM-YYYY),只要它在月份和日期中均使用两位数字,而在年份中则使用4位,并且使用字符来分隔日期的各个部分。输出必须保留字符分隔条件(/-,等)。您的函数仅需要处理一种不同的日期格式。请在回答中包括格式。
  • 如果返回的日期不止一个,则应将它们用逗号或换行符分隔。
  • 最短答案胜出!

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

如果我想发布一个Oracle SQL答案,我可以使用输入类型来DATE避免使用a to_date()还是必须使用较少使用golfable的类型VARCHAR2
Giacomo Garabello

我对Oracle SQL的了解不足,无法回答这个问题。
肿瘤学家

Answers:


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'

I / O为YYYY-MM-DD格式。输入来自标准输入的两行,例如

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 '16

1
@ Mathias711不幸的是,repr通常只相当于str原始数据类型。对于date对象datetime.date(2012, 12, 12),例如。
Denker

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

将输入作为(或类似形式)格式的命令行参数$argsMM/DD/YYYY并将其重铸为[datetime]数组,并将其存储在$a和中$b。这是for循环的设置步骤。条件是只要$a小于或等于$b

每次迭代时,我们基于都将其设置为$c等于样式的-f字符串。然后,我们如果这是比较UAL到反转(使用数组联接招)。如果是这样,我们将以正确的格式输出。无论哪种方式,我们增加与移动到第二天。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格式的I / O。取消高尔夫:

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格式(yyyy-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

小提琴


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
Kevin Cruijssen

好吧,实际上,我的懒惰浏览器不喜欢同意我+1,所以当我刷新时,bam,我的投票消失了:D
cat

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

使用方法(@EvilFonti的技巧Action在其中输入DateTime和输出C#lambda()。.Dump()


C#,115112字节

(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输出是a string

码:

(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/Enumerable

代码说明:好的,我终于在这里一次使用了一些实际的代码打高尔夫球。因此,输入a,b是Date对象。创建一个从a到b的整数范围,其中a和b被强制转换为整数,并且范围内的值之间的距离为86400000,即一天中的滴答数。将范围内的每个值映射到一个日期对象。通过代表回文日期的谓词过滤范围。确定逻辑的方法很简单...使用该库将当前日期对象的JSON字符串表示形式广播到char数组,并过滤​​掉非数字条目,并且仅采用前8个值(因为该值为yyyyMMdd )并将其存储到变量z中,然后检查z是否等于z Reversed。最后,转换回本机JS数组

编辑:通过删除不必要的par。剃光了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());
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.