पूर्वानुमान पलिंड्रोमिक तिथियां


18

पैलिंड्रोमिक तिथियां वे तिथियां हैं जो पैलिंड्रोम के रूप में दिखाई देती हैं: अंकों की स्ट्रिंग को पीछे की तरफ उसी तरह पढ़ा जा सकता है। उत्तर अमेरिकी तिथि प्रारूप (MM / DD / YYYY) के लिए, अगले कुछ पलिंडोमिक तिथियां हैं:

02/02/2020

12/02/2021

03/02/2030

चुनौती

एक ऐसा फंक्शन बनाएं जो सभी पैलिंड्रोमिक तिथियों को एक सुसंगत, सामान्य तिथि प्रारूप (आपके चयन के) में लौटाता है, जो कि कई तिथियों के भीतर आते हैं ( संपादित करें: सीमा सहित )।

नियम

  • एक palindrome के रूप में अर्हता प्राप्त करने के लिए, केवल तारीख के संख्यात्मक वर्णों को जांचना चाहिए।
  • दिनांक किसी भी सामान्य प्रारूप ( MM/DD/YYYY, DD-MM-YYYY) में हो सकता है , जब तक कि यह महीने और दिन दोनों के लिए दो अंकों का उपयोग करता है और वर्ष के लिए चार, और यह तिथि के अलग-अलग हिस्सों के लिए एक चरित्र का उपयोग करता है। उत्पादन अलग वर्ण (बनाए रखने चाहिए /, -, आदि)। आपके फ़ंक्शन को केवल एक अलग दिनांक प्रारूप को संभालने की आवश्यकता है। कृपया अपने उत्तर में प्रारूप शामिल करें।
  • यदि एक से अधिक तारीखें वापस आती हैं, तो उन्हें अल्पविराम या नई-पंक्ति को अलग करना चाहिए।
  • सबसे छोटा जवाब जीत!

उदाहरण

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

अगर मैं ओरेकल एसक्यूएल उत्तर पोस्ट करना चाहता हूं तो क्या मैं इनपुट प्रकार का उपयोग करने DATEसे बच सकता हूं to_date()या मुझे कम गोल्फ का उपयोग करना होगा VARCHAR2?
गियाकोमो गारबेलो

मैं इसका जवाब देने के लिए 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

बैश + जीएनयू उपयोगिताओं, 116 84

दिए गए टेस्टकेस के लिए 64-बिट संस्करण की आवश्यकता है।

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

मैं / ओ में है YYYY-MM-DD प्रारूप में है। इनपुट को स्टडिन की दो लाइनों से लिया जाता है, जैसे

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

व्याख्या

  • set दिनांक कमांड टेम्प्लेट को सहेजता है इसलिए इसका उपयोग करके पहुँचा जा सकता है $@ पैरामीटर
  • date -uf- +%s यूनिक्स युग के बाद से सेकंड की संख्या के लिए समापन बिंदु दिनांक धर्मान्तरित
  • jot यह प्रति-सेकंड-प्रति-युग, प्रति दिन, प्रत्येक के साथ उपसर्ग की सूची देने के लिए प्रक्षेपित करता है @
  • date -uf- +%F प्रत्येक सूची प्रविष्टि को प्रारूपित करता है YYYY-MM-DD
  • sed palindromes के लिए जाँच:
    • h इनपुट लाइन को होल्ड बफर में सेव करें
    • : "अनाम" लेबल परिभाषित करें
    • s/-|^(.)(.*)\1$/\2/ यदि कोई डैश पाया जाता है, तो उसे हटा दें या यदि पहले और अंतिम अक्षर मेल खाते हैं, तो उन्हें हटा दें
    • t अगर ऊपर एक मैच था, तो अनाम लेबल पर वापस जाएं
    • /./d यदि कोई वर्ण बचा हुआ है, तो रेखा कोई तालमेल नहीं है - इसे हटा दें और अगली पंक्ति पर जारी रखें
    • gअगर हम यहां पहुंच गए, तो कोई लाइन डिलीट नहीं हुई, इस तरह लाइन एक पैलिंड्रोम रही होगी। होल्ड बफ़र से लाइन को वापस लें और इसे स्पष्ट रूप से प्रदर्शित करें।

6

पायथन 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))?
मथियास 711

1
@ Mathias711 दुर्भाग्य से नहीं, reprआमतौर पर केवल strआदिम डेटाैटिप के बराबर है । उदाहरण के लिए dateमुझे मिलने वाली वस्तुओं datetime.date(2012, 12, 12)के लिए।
डेनकर

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संकलित स्ट्रिंग के बराबर सेट करते yyyyMMddहैं, जिसके आधार पर $a। हम तो तुलना अगर है कि -eqकरने के लिए UAL $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

जावास्क्रिप्ट (ईएस 6), 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 आईएसओ प्रारूप में। 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

जावा 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

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


@ मुझे लगता है कि टिप्पणी के लिए धन्यवाद, लेकिन आप वास्तव में जवाब +1 करना भूल गए। ; पी
केविन क्रूज़सेन

ठीक है, वास्तव में, मेरे आलसी ब्राउज़र को यह सहमत होने का मन नहीं था कि मैं + 1 ll और इसलिए जब मैं रिफ्रेश, बाम करता हूं, तो मेरा वोट डी चला जाता है:
बिल्ली

1

Oracle 11: SQL: 246 बाइट्स (हे, कम से कम मैंने जावा को हराया: 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

सी #, 97 94 बाइट्स

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

C # लैम्ब्डा ( Action) जहां इनपुट्स हैं DateTimeऔर आउटपुट का उपयोग .Dump()विधि (@ EvilFonti की ट्रिक ) द्वारा किया जाता है।


सी #, 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) जहां इनपुट हैं DateTimeऔर आउटपुट ए है 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()

लिंक करने के लिए लिंक: https://github.com/mvegh1/Enumerable

कोड स्पष्टीकरण: ठीक है, मैंने अंत में एक बार के लिए यहां कुछ वास्तविक कोड गोल्फिंग का उपयोग किया है। इसलिए इनपुट ए, बी डेट ऑब्जेक्ट हैं। A से b, जहां a और b को पूर्णांक में समेटा गया है, से पूर्णांकों की एक श्रेणी बनाएँ, और श्रेणी में मानों के बीच की दूरी 86400000 है, यानी एक दिन में टिक की मात्रा। सीमा में प्रत्येक मान को दिनांक ऑब्जेक्ट पर मैप करें। उस सीमा तक फ़िल्टर करें, जो पैलिंड्रोमिक तिथियों का प्रतिनिधित्व करती है। यह निर्धारित करने के लिए तर्क सरल है ... पुस्तकालय का उपयोग करके किसी चार सरणी के लिए वर्तमान दिनांक ऑब्जेक्ट के JSON स्ट्रिंग प्रतिनिधित्व को डालें और गैर-संख्यात्मक प्रविष्टियों को फ़िल्टर करें, और केवल पहले 8 मान लें (क्योंकि वह yyyyMMdd होगा ) और उसे वेरिएबल z में स्टोर करें, फिर जांचें कि z z z उलट के बराबर है या नहीं। अंत में, मूल 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);}}


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());
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.