Dự báo ngày Palindromic


18

Ngày Palindromic là ngày xuất hiện dưới dạng palindromes: chuỗi chữ số có thể được đọc theo cùng một cách ngược như trước. Đối với định dạng ngày ở Bắc Mỹ (MM / DD / YYYY), một số ngày palindromic tiếp theo là:

02/02/2020

12/02/2021

03/02/2030

Các thách thức

Tạo một hàm trả về tất cả các ngày palindromic theo định dạng ngày chung, nhất quán (theo lựa chọn của bạn) nằm trong một phạm vi ngày ( chỉnh sửa: bao gồm cả phạm vi ).

Quy tắc

  • Để đủ điều kiện là một bảng màu, chỉ nên kiểm tra các ký tự số của ngày.
  • Ngày có thể ở bất kỳ định dạng phổ biến nào ( MM/DD/YYYY, DD-MM-YYYY), miễn là nó sử dụng hai chữ số cho cả tháng và ngày và bốn cho năm và nó sử dụng một ký tự để tách các phần của ngày. Các đầu ra phải bảo vệ nhân vật Seperating ( /, -, vv). Chức năng của bạn chỉ cần xử lý một định dạng ngày riêng biệt. Vui lòng bao gồm các định dạng trong câu trả lời của bạn.
  • Nếu có nhiều hơn một ngày được trả về, chúng nên được phân tách bằng dấu phẩy hoặc dòng mới.
  • Câu trả lời ngắn nhất sẽ thắng!

Thí dụ

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

Nếu tôi muốn đăng câu trả lời Oracle SQL, tôi có thể sử dụng loại đầu vào DATEđể tránh to_date()hoặc tôi phải sử dụng ít golf hơn VARCHAR2không?
Giacomo Garabello

Tôi không biết đủ về Oracle SQL để trả lời điều này.
đồ học

Câu trả lời:


8

MATL, 24 23 byte

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

Chấp nhận đầu vào dưới dạng một chuỗi các chuỗi {lower, upper}có định dạng ngày 'MM/DD/YYYY'. Đầu ra là ở định dạng MM/DD/YYYYlà tốt.

Dùng thử trực tuyến

Giải trình

        % 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

Tiện ích Bash + GNU, 116 84

Yêu cầu phiên bản ngày 64 bit cho mẫu thử đã cho.

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

I / O có YYYY-MM-DDđịnh dạng. Đầu vào được lấy từ hai dòng stdin, vd

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

Giải trình

  • setlưu mẫu lệnh ngày để nó có thể được truy cập bằng $@tham số
  • date -uf- +%s chuyển đổi ngày kết thúc thành số giây kể từ thời kỳ Unix
  • jot nội suy điều này để đưa ra một danh sách các giây từ epoch, mỗi ngày một tiền tố, mỗi tiền tố với @
  • date -uf- +%F định dạng mỗi mục nhập danh sách như YYYY-MM-DD
  • sed kiểm tra palindromes:
    • h lưu dòng đầu vào vào bộ đệm giữ
    • : định nghĩa nhãn "không tên"
    • s/-|^(.)(.*)\1$/\2/ nếu một dấu gạch ngang được tìm thấy, hãy xóa nó hoặc nếu các ký tự đầu tiên và cuối cùng khớp với nhau, hãy xóa chúng
    • t nếu có một trận đấu ở trên, nhảy trở lại nhãn không tên
    • /./d nếu có bất kỳ ký tự nào còn sót lại, dòng không phải là một bảng màu - xóa nó và tiếp tục dòng tiếp theo
    • gnếu chúng ta đến đây, thì không có dòng nào bị xóa, do đó dòng phải là một bảng màu. Lấy dòng trở lại từ bộ đệm giữ và hiển thị ngầm.

6

Python 2, 197 byte

Một byte được lưu nhờ @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

Hãy thử nó ở đây!

Định dạng đầu vào và đầu ra là YYYY-MM-DD. Cấp độ dự định đầu tiên là không gian, thứ hai là các tab.
Không có gì quá đặc biệt đang diễn ra ở đây. Sử dụng một số execlạm dụng để chuyển đổi đầu vào thành datecác đối tượng bằng cách tách chuỗi ngày trên -và tách danh sách vào hàm datetạo. Sau đó, chúng tôi chỉ lặp đi lặp lại tất cả các ngày trong phạm vi bao gồm của họ và in những ngày đó là palindromic.


1
Đặt from datetime import*dòng đầu tiên để lưu một byte
con mèo

Không chắc chắn, nhưng có `a+timedelta(d)`giống như str(a+timedelta(d))?
Mathias711

1
@ Mathias711 Thật không may, reprthường chỉ tương đương strvới các kiểu dữ liệu nguyên thủy. Đối với datecác đối tượng tôi nhận được datetime.date(2012, 12, 12)ví dụ.
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)}

Đưa đầu vào dưới dạng đối số dòng lệnh $argsMM/DD/YYYYđịnh dạng (hoặc tương tự) và lặp lại dưới dạng một [datetime]mảng, lưu trữ chúng trong $a$b. Đó là bước thiết lập của forvòng lặp. Các điều kiện là miễn $alà ít hơn hoặc bằng với $b.

Mỗi lần lặp, chúng tôi đặt $cbằng một -fchuỗi yyyyMMddkiểu được định dạng, dựa trên $a. Sau đó, chúng tôi so sánh nếu đó là thông thường -eqđể $cđảo ngược (sử dụng thủ thuật nối mảng). Nếu vậy, chúng tôi đầu ra $aở định dạng thích hợp. Dù bằng cách nào, chúng tôi tăng $avới .AddDays(1)để chuyển sang ngày hôm sau.

Thí dụ

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

4

Julia, 132 byte

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

Đây là một hàm chấp nhận hai chuỗi và trả về một chuỗi các chuỗi.

Ung dung:

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

Hãy thử trực tuyến!


3

JavaScript (ES6), 159 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 ở định dạng ISO. Ung dung:

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 byte

Sử dụng định dạng ISO8601 cho ngày (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

Vĩ cầm


2

Java 7, 436 435 416 byte * thở dài .. *

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

Định dạng đầu vào và đầu ra: dd-MM-yyyy

Mã thử nghiệm & mã hóa:

Hãy thử nó ở đây.

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

Đầu ra:

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


@cat Cảm ơn vì nhận xét tôi đoán, nhưng bạn đã quên thực sự +1 câu trả lời. ; P
Kevin Cruijssen

Chà, thực ra, trình duyệt lười biếng của tôi không cảm thấy đồng ý rằng tôi + 1'd và vì vậy khi tôi làm mới, bam, phiếu bầu của tôi đã biến mất D:
con mèo

1

Oracle 11: SQL: 246 byte (hey, ít nhất tôi đã đánh bại 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);

Đầu ra:

  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>

Ở định dạng có thể đọc được:

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

Giải thích:

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.

Đã tìm hiểu về chức năng REVERSE ngày hôm nay :)


1

C #, 97 94 byte

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

C # lambda ( Action) trong đó đầu vào là DateTimevà đầu ra được in bằng .Dump()phương thức ( thủ thuật @ EvilFonti's ).


C #, 115 112 byte

(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) trong đó đầu vào DateTimevà đầu ra là a string.

Mã số:

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

Hãy thử chúng trực tuyến!


0

VBA, 240 193 byte

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

Đó là một định dạng dễ hiểu. Trường hợp thử nghiệm:

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

Không có nhiều dư thừa:

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 (sử dụng thư viện bên ngoài) (158 byte)

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

Liên kết đến lib: https://github.com/mvegh1/Enumerable

Giải thích về mã: Ok, cuối cùng tôi đã sử dụng một số mã golf thực tế ở đây một lần. Vậy các đầu vào a, b là các đối tượng Date. Tạo một phạm vi số nguyên từ a đến b, trong đó a và b bị ép buộc thành số nguyên và khoảng cách giữa các giá trị trong phạm vi là 86400000, tức là số lượng tích tắc trong một ngày. Ánh xạ mỗi giá trị trong phạm vi đến một đối tượng ngày. Lọc phạm vi đó theo vị ngữ đại diện cho ngày palindromic. Logic để xác định điều đó thật đơn giản ... truyền biểu diễn chuỗi JSON của đối tượng ngày hiện tại sang một mảng char bằng cách sử dụng thư viện và lọc ra các mục không phải là số và chỉ lấy 8 giá trị đầu tiên (vì đó sẽ là yyyyMMdd ) và lưu nó vào biến z, sau đó kiểm tra xem z có tương đương với z Đảo ngược không. Cuối cùng, quay trở lại mảng JS gốc

Chỉnh sửa: Cạo 2 byte bằng cách loại bỏ các parens không cần thiết ..

nhập mô tả hình ảnh ở đây


0

Java, 269 byte

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


Ung dung:

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());
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.