Dates palindromiques prévues


18

Les dates palindromiques sont des dates qui apparaissent sous forme de palindromes: la chaîne de chiffres peut être lue de la même manière en arrière qu'en avant. Pour le format de date nord-américain (MM / JJ / AAAA), les quelques dates palindromiques suivantes sont:

02/02/2020

12/02/2021

03/02/2030

Le défi

Créez une fonction qui renvoie toutes les dates palindromiques dans un format de date commun et cohérent (de votre choix) qui se situe dans une plage de dates ( modifier: y compris la plage elle-même ).

Règles

  • Pour être considéré comme un palindrome, seuls les caractères numériques de la date doivent être vérifiés.
  • La date peut être dans n'importe quel format commun ( MM/DD/YYYY, DD-MM-YYYY), tant qu'elle utilise deux chiffres pour le mois et le jour et quatre pour l'année, et qu'elle utilise un caractère pour séparer les parties de la date. La sortie doit préserver les caractères seperating ( /, -, etc.). Votre fonction ne doit gérer qu'un seul format de date distinct. Veuillez inclure le format dans votre réponse.
  • Si plusieurs dates sont renvoyées, elles doivent être séparées par des virgules ou des sauts de ligne.
  • La réponse la plus courte gagne!

Exemple

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

Si je veux publier une réponse Oracle SQL, puis-je utiliser le type d'entrée en DATEévitant un to_date()ou dois-je utiliser le moins golfable VARCHAR2?
Giacomo Garabello

Je ne connais pas suffisamment Oracle SQL pour y répondre.
atlasologist

Réponses:


8

MATL, 24 23 octets

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

Accepte une entrée sous la forme d'un tableau de chaînes {lower, upper}où se trouve le format de date 'MM/DD/YYYY'. La sortie est également au format MM/DD/YYYY.

Essayez-le en ligne

Explication

        % 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

Utilitaires Bash + GNU, 116 84

Nécessite une version 64 bits de la date pour le testcase donné.

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

Les E / S sont au YYYY-MM-DDformat. L'entrée provient de deux lignes de stdin, par exemple

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

Explication

  • setenregistre le modèle de commande de date afin qu'il soit accessible à l'aide du $@paramètre
  • date -uf- +%s convertit les dates des points de terminaison en nombre de secondes depuis l'époque Unix
  • jot interpole ceci pour donner une liste des secondes de l'époque, une par jour, chacune préfixée de @
  • date -uf- +%F formate chaque entrée de liste comme YYYY-MM-DD
  • sed vérifie les palindromes:
    • h enregistrer la ligne d'entrée dans le tampon de maintien
    • : définir une étiquette "sans nom"
    • s/-|^(.)(.*)\1$/\2/ si un tiret est trouvé, supprimez-le ou si les premier et dernier caractères correspondent, supprimez-les
    • t s'il y avait une correspondance ci-dessus, revenez à l'étiquette sans nom
    • /./d s'il reste des caractères, la ligne n'est pas un palindrome - supprimez-la et passez à la ligne suivante
    • gsi nous sommes arrivés ici, alors aucune suppression de ligne n'a eu lieu, donc la ligne devait être un palindrome. Récupérez la ligne dans le tampon d'attente et affichez-la implicitement.

6

Python 2, 197 octets

Un octet enregistré grâce à @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

Essayez-le ici!

Le format d'entrée et de sortie est YYYY-MM-DD. Le premier niveau d'intention est les espaces, le second les onglets.
Rien de très spécial ici. Utilise certains execabus pour convertir l'entrée en dateobjets en divisant la chaîne de date -et en répartissant la liste dans le dateconstructeur. Ensuite, nous itérons simplement toutes les dates dans leur plage inclusive et imprimons celles qui sont palindromiques.


1
Mettez le from datetime import*sur la première ligne pour enregistrer un octet
cat

Pas sûr, mais fait `a+timedelta(d)`la même chose que str(a+timedelta(d))?
Mathias711

1
@ Mathias711 Malheureusement non, reprn'est généralement équivalent qu'à strdes types de données primitifs. Pour les dateobjets que je reçois datetime.date(2012, 12, 12)par exemple.
Denker

5

PowerShell v2 +, 127 octets

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

Prend les entrées sous forme d'arguments de ligne de commande $argsau MM/DD/YYYYformat (ou similaire) et les refondes sous forme de [datetime]tableau, les stockent dans $aet $b. C'est l'étape de configuration de la forboucle. Le conditionnel est tant qu'il $aest inférieur ou égal à$b .

À chaque itération, nous définissons $cégal à une -fchaîne de yyyyMMddstyle ormattée , basée sur $a. Nous comparons ensuite si c'est -equal à $cinversé (en utilisant une astuce de jointure de tableau). Si c'est le cas, nous sortons $aau format approprié. De toute façon, nous incrémentons $aavec.AddDays(1) pour passer au lendemain.

Exemple

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

4

Julia, 132 octets

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

Il s'agit d'une fonction qui accepte deux chaînes et renvoie un tableau de chaînes.

Non golfé:

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

Essayez-le en ligne!


3

JavaScript (ES6), 159 154 octets

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

E / S au format ISO. Non golfé:

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 octets

Utilisation du format ISO8601 pour la date (aaaa-mm-jj)

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

Violon


2

Java 7, 436 435 416 octets * soupir .. *

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

Format d'entrée et de sortie: dd-MM-yyyy

Code non testé et testé:

Essayez-le ici.

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

Production:

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


@cat Merci pour le commentaire, je suppose, mais vous avez oublié de +1 pour la réponse. ; P
Kevin Cruijssen

Eh bien, en fait, mon navigateur paresseux n'avait pas envie d'accepter que j'ai +1 et donc quand je rafraîchis, bam, mon vote est parti D:
cat

1

Oracle 11: SQL: 246 octets (hé, au moins j'ai battu 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);

Production:

  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>

Dans un format lisible:

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

Expliqué:

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.

J'ai appris la fonction REVERSE aujourd'hui :)


1

C #, 97 94 octets

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

C # lambda ( Action) où les entrées sont DateTimeet la sortie est imprimée en utilisant le.Dump() méthode (de @ EvilFonti trick ).


C #, 115 112 octets

(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 ) où les entrées sont DateTimeet la sortie est unstring .

Code:

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

Essayez-les en ligne!


0

VBA, 240 193 octets

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

C'est tout dans un format compréhensible. Cas de test:

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

Sans autant de redondance:

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 (à l'aide d'une bibliothèque externe) (158 octets)

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

Lien vers la bibliothèque: https://github.com/mvegh1/Enumerable

Explication du code: Ok, j'ai finalement utilisé du code réel pour jouer ici pour une fois. Les entrées a, b sont donc des objets Date. Créez une plage d'entiers de a à b, où a et b sont contraints en entiers, et la distance entre les valeurs de la plage est 86400000, c'est-à-dire la quantité de ticks en une journée. Mappez chaque valeur de la plage à un objet de date. Filtrez cette plage par le prédicat qui représente les dates palindromiques. La logique pour déterminer que c'est simple ... transtypez la représentation sous forme de chaîne JSON de l'objet de date actuel dans un tableau de caractères en utilisant la bibliothèque et filtrez les entrées non numériques, et ne prenez que les 8 premières valeurs (parce que ce serait aaaaMMjj ) et stockez-le dans la variable z, puis vérifiez si z est équivalent à z Inversé. Enfin, restaurez le tableau natif JS

Edit: Rasé 2 octets en supprimant les parenthèses inutiles ..

entrez la description de l'image ici


0

Java, 269 octets

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


Non golfé:

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());
    }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.