회문 날짜 예측


18

회문 날짜 는 회문으로 표시되는 날짜입니다. 자릿수는 앞으로와 같은 방식으로 읽을 수 있습니다. 북미 날짜 형식 (MM / DD / YYYY)의 경우 다음 몇 가지 회문 날짜는 다음과 같습니다.

02/02/2020

12/02/2021

03/02/2030

도전

날짜 범위 내에있는 일관된 공통 날짜 형식 (선택한 범위)으로 모든 회문 날짜를 반환하는 함수를 만듭니다 ( 편집 : 범위 자체 포함 ).

규칙

  • 회문으로 자격을 얻으려면 날짜의 숫자 만 확인해야합니다.
  • 날짜는 월과 일에 2 자리, 연도에 4 자리를 사용하고 문자를 사용하여 날짜의 일부를 분리 하는 한 일반적인 형식 ( MM/DD/YYYY, DD-MM-YYYY) 으로 지정할 수 있습니다 . 출력은 (구분을 문자를 보존해야 /, -등). 함수는 하나의 고유 한 날짜 형식 만 처리하면됩니다. 답변에 형식을 포함하십시오.
  • 반환 된 날짜가 둘 이상인 경우 쉼표 또는 줄 바꿈으로 구분해야합니다.
  • 최단 답변이 승리합니다!

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

나는 내가 입력 유형을 사용할 수있는 오라클 SQL의 답변을 게시 할 경우 DATE을 피하고 to_date()아니면 덜 golfable을 사용할 필요가 VARCHAR2?
Giacomo Garabello 2016 년

Oracle SQL에 대한 대답이 충분하지 않습니다.
atlasologist

답변:


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

배쉬 + 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형식입니다. 입력은 두 줄의 stdin에서 가져옵니다. 예 :

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

설명

  • set$@매개 변수를 사용하여 액세스 할 수 있도록 날짜 명령 템플리트를 저장합니다.
  • date -uf- +%s 유닉스 시대 이후 엔드 포인트 날짜를 초 단위로 변환
  • jot 이를 삽입하여 하루에 하나씩 초 단위로 목록을 제공합니다. @
  • date -uf- +%F 각 목록 항목의 형식을 YYYY-MM-DD
  • sed 회문 검사 :
    • h 입력 라인을 홀드 버퍼에 저장
    • : "이름이없는"레이블 정의
    • s/-|^(.)(.*)\1$/\2/ 대시가 있으면 제거하거나 첫 문자와 마지막 문자가 일치하면 제거하십시오.
    • t 위와 일치하는 경우 이름이없는 레이블로 다시 이동하십시오.
    • /./d 남은 문자가있는 경우 해당 줄은 회문이 아닙니다. 삭제하고 다음 줄로 계속하십시오.
    • g우리가 여기에 도착하면 줄 삭제가 발생하지 않았으므로 줄은 회문이어야합니다. 보류 버퍼에서 라인을 다시 가져 와서 내재적으로 표시하십시오.

6

파이썬 2, 197 바이트

@cat 덕분에 1 바이트가 절약되었습니다!

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*바이트를 저장하기 위해 첫 줄에 넣어
cat

확실하지,하지만 않습니다 `a+timedelta(d)`같은 str(a+timedelta(d))?
Mathias711

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

커맨드 라인 인수로 입력 취하고 $args있는 MM/DD/YYYY(또는 유사한) 포맷과 같은 재조정 할 [datetime]그들의 배열 저장 $a$b. 이것이 for루프 의 설정 단계입니다 . 조건부 $a보다 작거나 같은 조건부입니다 $b.

각 반복마다를 기반으로 ormatted 스타일의 문자열 $c과 동일하게 설정 했습니다 . 그건 경우에 우리는 다음 비교 에 연간를 반전 (AN 사용하여 트릭을 배열을 조인). 그렇다면 올바른 형식으로 출력 합니다. 어느 쪽이든, 우리는 증가 로 다음날로 이동합니다.-fyyyyMMdd$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

자바 스크립트 (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 바이트 * sigh .. *

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 2016 년

글쎄, 실제로, 게으른 브라우저는 내가 +1을 동의한다는 느낌이 들지 않아서 새로 고치면 내 투표가 사라졌습니다.
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();};

Action입력이 DateTime있고 출력이 .Dump()메소드 (@ EvilFonti 's trick ) 를 사용하여 인쇄되는 C # lambda ( ).


C #, 115112 바이트

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

Func입력이 DateTime있고 출력이 C # 람다 ( ) 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

자바 스크립트 (외부 라이브러리 사용) (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 배열로 캐스트

편집 : 불필요한 parens을 제거하여 2 바이트를 깎았습니다 ..

여기에 이미지 설명을 입력하십시오


0

자바, 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());
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.