พยากรณ์วัน Palindromic


18

วันที่ Palindromicเป็นวันที่ที่ปรากฏเป็น palindromes: สตริงของตัวเลขสามารถอ่านได้ในแบบเดียวกับการส่งต่อ สำหรับรูปแบบวันที่อเมริกาเหนือ (MM / DD / YYYY) วันที่ palindromic ถัดไปคือ:

02/02/2020

12/02/2021

03/02/2030

ความท้าทาย

สร้างฟังก์ชั่นที่ส่งคืนวันที่แบบ palindromic ทั้งหมดในรูปแบบวันที่ทั่วไปที่สอดคล้องกัน (การเลือกของคุณ) ที่อยู่ในช่วงของวันที่ ( แก้ไข: รวมถึงช่วงของตัวเอง )

กฎระเบียบ

  • เพื่อให้มีคุณสมบัติเป็น palindrome ควรตรวจสอบเฉพาะอักขระตัวเลขของวันที่
  • วันที่สามารถอยู่ในรูปแบบทั่วไปใด ๆ ( 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()หรือฉันต้องใช้ Golfable น้อยกว่าVARCHAR2หรือไม่
Giacomo Garabello

ฉันไม่รู้ 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 บิตสำหรับ testcase ที่กำหนด

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 เพื่อให้สามารถเข้าถึงได้โดยใช้$@พารามิเตอร์
  • date -uf- +%s แปลงวันที่ปลายทางเป็นจำนวนวินาทีตั้งแต่ Unix epoch
  • jot สอดแทรกสิ่งนี้เพื่อให้รายการวินาทีจากยุคปัจจุบันหนึ่งรายการต่อวันแต่ละคำนำหน้าด้วย @
  • date -uf- +%F จัดรูปแบบรายการแต่ละรายการเป็น YYYY-MM-DD
  • sed ตรวจสอบ palindromes:
    • h บันทึกบรรทัดอินพุตลงในบัฟเฟอร์พัก
    • : กำหนดป้ายกำกับ "ไม่มีชื่อ"
    • s/-|^(.)(.*)\1$/\2/ หากพบเส้นประให้ถอดออกหรือหากตัวอักษรตัวแรกและตัวสุดท้ายตรงกันให้ลบออก
    • t หากมีการแข่งขันด้านบนให้ข้ามกลับไปที่ป้ายกำกับที่ไม่มีชื่อ
    • /./d หากมีอักขระใด ๆ ค้างอยู่บรรทัดนั้นจะไม่เป็น palindrome ให้ลบออกและไปยังบรรทัดถัดไป
    • gถ้าเรามาถึงที่นี่ก็ไม่มีการลบเส้นเกิดขึ้นดังนั้นเส้นนั้นจะต้องเป็นแบบ palindrome รับบรรทัดกลับจากบัฟเฟอร์พักและแสดงโดยปริยาย

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

ลองที่นี่!

input และ output YYYY-MM-DDรูปแบบคือ ระดับความตั้งใจแรกคือช่องว่างส่วนที่สองคือแท็บ
ไม่มีอะไรพิเศษเกินไปเกิดขึ้นที่นี่ ใช้การใช้งานในexecทางที่ผิดเพื่อแปลงอินพุตให้เป็นdateวัตถุโดยแยกสตริงวันที่-และกระจายรายการลงในตัวdateสร้าง จากนั้นเราเพียงทำซ้ำทุกวันในช่วงรวมของพวกเขาและพิมพ์วันที่ที่เป็น palindromic


1
ใส่from datetime import*บรรทัดแรกเพื่อบันทึก byte
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(หรือคล้ายกัน) รูปแบบและ recasts เป็น[datetime]อาร์เรย์เก็บไว้ในและ$a $bนั่นคือขั้นตอนการตั้งค่าของforลูป เงื่อนไขเพื่อให้นานที่สุดเท่าที่จะน้อยกว่าหรือเท่ากับไป$a$b

แต่ละซ้ำเราตั้ง$cเท่ากับ-fสตริง ormatted ของรูปแบบขึ้นอยู่กับyyyyMMdd $aจากนั้นเราเปรียบเทียบว่าเป็น-equal to reverse หรือไม่$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)))

นี่คือฟังก์ชั่นที่ยอมรับสองสตริงและส่งกลับอาร์เรย์ของสตริง

Ungolfed:

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}

I / O ในรูปแบบ ISO Ungolfed:

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 bytes * ถอนหายใจ .. *

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

Ungolfed & รหัสการทดสอบ:

ลองที่นี่

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 แล้วดังนั้นเมื่อฉันรีเฟรชแบมการลงคะแนนของฉันหายไป 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();};

C # lambda ( Action) ที่มีอินพุตDateTimeและเอาต์พุตถูกพิมพ์โดยใช้.Dump()วิธีการ (@ EvilFonti trick )


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 # แลมบ์ดา ( Func) ซึ่งปัจจัยการผลิตที่มีและการส่งออกเป็นDateTimestring

รหัส:

(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 จึงเป็นวัตถุวันที่ สร้างช่วงของจำนวนเต็มตั้งแต่ a ถึง b โดยที่ a และ b ถูกรวมเข้ากับจำนวนเต็มและระยะห่างระหว่างค่าในช่วงคือ 86400000 คือจำนวนของเห็บในหนึ่งวัน แมปแต่ละค่าในช่วงกับวัตถุวันที่ กรองช่วงนั้นโดยเพรดิเคตที่แสดงถึงวันที่ Palindromic ตรรกะในการพิจารณาว่าเป็นเรื่องง่าย ... cast การแสดงสตริง JSON ของวัตถุวันที่ปัจจุบันไปยังอาร์เรย์ char โดยใช้ไลบรารีและกรองรายการที่ไม่ใช่ตัวเลขและรับเฉพาะค่า 8 อันดับแรกเท่านั้น (เพราะนั่นจะเป็น yyyyMMdd ) และเก็บสิ่งนั้นไว้ในตัวแปร z จากนั้นตรวจสอบว่า z เทียบเท่ากับ z กลับด้าน ในที่สุดก็กลับไปสู่อาร์เรย์ JS ดั้งเดิม

แก้ไข: โกน 2 ไบต์โดยลบ parens ที่ไม่จำเป็นออก

ป้อนคำอธิบายรูปภาพที่นี่


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


Ungolfed:

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.