Prakiraan Tanggal Palindromik

18

Tanggal palindrom adalah tanggal yang muncul sebagai palindrom: string angka dapat dibaca dengan cara yang sama mundur ke depan. Untuk format tanggal Amerika Utara (MM / DD / YYYY), beberapa tanggal palindromik berikutnya adalah:

02/02/2020

12/02/2021

03/02/2030

Tantangan

Buat fungsi yang mengembalikan semua tanggal palindrom dalam format tanggal yang umum dan konsisten (sesuai pilihan Anda) yang termasuk dalam rentang tanggal ( edit: termasuk kisaran itu sendiri ).

Aturan

  • Untuk memenuhi syarat sebagai palindrome, hanya karakter numerik tanggal yang harus diperiksa.
  • Tanggal dapat dalam format umum apa pun ( MM/DD/YYYY, DD-MM-YYYY), asalkan menggunakan dua digit untuk bulan dan hari dan empat untuk tahun tersebut, dan menggunakan karakter untuk memisahkan bagian-bagian tanggal. Output harus melestarikan karakter Memisahkan ( /, -, dll). Fungsi Anda hanya perlu menangani satu format tanggal yang berbeda. Harap sertakan format dalam jawaban Anda.
  • Jika ada lebih dari satu tanggal dikembalikan, mereka harus koma atau baris baru dipisahkan.
  • Jawaban terpendek menang!

Contoh

date_palindrome('05/02/2050', '12/12/2060')
>>>['05/02/2050', '06/02/2060']
ahli atlasologi
sumber
Jika saya ingin memposting jawaban Oracle SQL dapatkah saya menggunakan tipe input DATEmenghindari to_date()atau saya harus menggunakan yang kurang golf VARCHAR2?
Giacomo Garabello
Saya tidak cukup tahu tentang Oracle SQL untuk menjawab ini.
ahli atlasologi

Jawaban:

8

MATL, 24 23 byte

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

Menerima input dalam bentuk array string di {lower, upper}mana format tanggal 'MM/DD/YYYY'. Output dalam format MM/DD/YYYYjuga.

Cobalah secara Online

Penjelasan

        % 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
Suever
sumber
6

Utilitas Bash + GNU, 116 84

Membutuhkan versi 64-bit tanggal untuk testcase yang diberikan.

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

I / O dalam YYYY-MM-DDformat. Input diambil dari dua baris stdin, mis

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

Penjelasan

  • setmenyimpan templat perintah tanggal sehingga dapat diakses menggunakan $@parameter
  • date -uf- +%s mengonversi tanggal titik akhir ke jumlah detik sejak zaman Unix
  • jot interpolasi ini untuk memberikan daftar detik-dari-zaman, satu per hari, masing-masing diawali dengan @
  • date -uf- +%F memformat setiap entri daftar sebagai YYYY-MM-DD
  • sed memeriksa palindrom:
    • h simpan baris input ke buffer penahan
    • : tentukan label "tidak bernama"
    • s/-|^(.)(.*)\1$/\2/ jika tanda hubung ditemukan, hapus atau jika karakter pertama dan terakhir cocok, hapus
    • t jika ada kecocokan di atas, kembali ke label yang tidak disebutkan namanya
    • /./d jika ada karakter yang tersisa, garis itu bukan palindrom - hapus dan lanjutkan ke baris berikutnya
    • gjika kita sampai di sini, maka tidak ada penghapusan garis yang terjadi, maka garis itu pasti merupakan palindrom. Dapatkan saluran kembali dari buffer penahan dan tampilkan secara implisit.
Trauma Digital
sumber
6

Python 2, 197 byte

Satu byte disimpan berkat @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

Coba di sini!

Format input dan output adalah YYYY-MM-DD. Level niat pertama adalah spasi, yang kedua adalah tab.
Tidak ada yang terlalu istimewa terjadi di sini. Menggunakan beberapa execpenyalahgunaan untuk mengonversi input ke dateobjek dengan memisahkan string tanggal -dan memecah daftar ke datekonstruktor. Kemudian kami hanya mengulangi semua tanggal dalam kisaran inklusif mereka dan mencetak yang palindromik.

Denker
sumber
1
Letakkan from datetime import*pada baris pertama untuk menyimpan byte
cat
Tidak yakin, tetapi apakah `a+timedelta(d)`sama str(a+timedelta(d))?
Mathias711
1
@ Mathias711 Sayangnya tidak, reprbiasanya hanya setara dengan struntuk tipe data primitif. Untuk dateobjek saya dapatkan datetime.date(2012, 12, 12)misalnya.
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)}

Mengambil input sebagai argumen baris perintah $argsdalam MM/DD/YYYY(atau serupa) format dan ditampilkan kembali sebagai [datetime]array, menyimpannya dalam $adan $b. Itulah langkah pengaturan forloop. Kondisional asalkan $akurang dari atau sama dengan $b.

Setiap iterasi, kami tetapkan $csama dengan -fstring yyyyMMddgaya yang diurut , berdasarkan $a. Kami kemudian membandingkan apakah itu -equal untuk $cdibalik (menggunakan trik array-join). Jika demikian, kami menampilkan $adalam format yang tepat. Either way, kami bertambah $adengan .AddDays(1)pindah ke hari berikutnya.

Contoh

PS C:\Tools\Scripts\golfing> .\forecast-palindromic-dates.ps1 '06/23/2016' '12/12/2020'
02/02/2020
AdmBorkBork
sumber
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)))

Ini adalah fungsi yang menerima dua string dan mengembalikan array string.

Tidak Disatukan:

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

Cobalah online!

Alex A.
sumber
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 dalam format ISO. Tidak Disatukan:

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;
}
Neil
sumber
2

TSQL, 88 byte

Menggunakan format ISO8601 untuk tanggal (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

Biola

t-clausen.dk
sumber
2

Java 7, 436 435 416 byte * desah .. *

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

Input & Output format: dd-MM-yyyy

Tidak digabungkan & kode uji:

Coba di sini.

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

Keluaran:

05-02-2050
15-02-2051
25-02-2052
06-02-2060
Kevin Cruijssen
sumber
@cat Terima kasih atas komentarnya, tapi Anda lupa untuk memberi +1 pada jawabannya. ; P
Kevin Cruijssen
Yah, sebenarnya, browser malas saya tidak merasa seperti setuju bahwa saya memberi +1 dan jadi ketika saya menyegarkan, bam, suara saya hilang D:
cat
1

Oracle 11: SQL: 246 byte (hei, setidaknya saya mengalahkan 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);

Keluaran:

  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>

Dalam format yang dapat dibaca:

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

Dijelaskan:

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.

Belajar tentang fungsi REVERSE hari ini :)

Dito
sumber
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) di mana input DateTimedan output dicetak dengan menggunakan .Dump()metode (@ EvilFonti ini trik ).


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) di mana input berada DateTimedan output adalah a string.

Kode:

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

Cobalah secara online!

aloisdg kata Reinstate Monica
sumber
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

Itu dalam format yang bisa dipahami. Kasus cobaan:

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

Tanpa banyak redundansi:

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
pengguna3819867
sumber
0

Javascript (menggunakan perpustakaan eksternal) (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()

Tautan ke lib: https://github.com/mvegh1/Enumerable

Penjelasan kode: Ok, saya akhirnya menggunakan beberapa kode golf sebenarnya di sini untuk sekali. Jadi input a, b adalah objek Date. Buat rentang bilangan bulat dari a ke b, di mana a dan b dipaksa ke dalam bilangan bulat, dan jarak antara nilai dalam kisaran adalah 86400000, yaitu jumlah kutu dalam satu hari. Petakan setiap nilai dalam rentang ke objek tanggal. Filter kisaran itu dengan predikat yang mewakili tanggal palindromik. Logika untuk menentukan itu sederhana ... melemparkan representasi string JSON dari objek tanggal saat ini ke array char menggunakan perpustakaan dan menyaring entri non-numerik, dan hanya mengambil 8 nilai pertama (karena yang akan menjadi yyyyMMdd ) dan simpan itu ke dalam variabel z, lalu periksa apakah z sama dengan z Terbalik. Akhirnya, masukkan kembali ke array JS asli

Sunting: Dicukur 2 byte dengan menghapus parens yang tidak perlu ..

masukkan deskripsi gambar di sini

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


Tidak Disatukan:

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