Légaliser la date inversée

18

Contribution:

A Date (contenant dd, MMet yyyy). Un objet date ou trois entiers distincts sont également valides en entrée.

Production:

Chaque partie ( dd, MMet yyyy) est retournée individuellement et arrondie à la date valide la plus proche.

Par exemple (au format dd-MM-yyyy):
21-10-2016devient12-01-6102

Règles du défi:

  • Seulement dd, MM, yyyyest valide, mais l'ordre et qui-symboles distincts que vous utilisez est votre choix.
    Ce sont quelques exemples de format valides: dd-MM-yyyy; MM/dd/yyyy; yyyy MM dd; ddMMyyyy, Etc.
    Et ce sont quelques exemples de format non valides: dd MMM yyyy; dd-MM-'yy; etc.
  • Vous pouvez également choisir de simplement saisir un objet Date si votre langue le prend en charge ou trois paramètres entiers distincts, au lieu de la chaîne représentant une date.
  • Veuillez indiquer le format de date que vous avez utilisé! (Et l'entrée et la sortie doivent être dans le même format.) Il est également autorisé de sortir un objet Date, tant qu'il peut gérer tous les cas de test et la règle de défi ci-dessous.
  • La transition du calendrier julien au calendrier grégorien est ignorée pour ce défi. Il ne 1582s'agit donc que d'une année inversée valide pour 2851.
    Voir les infos / conseils du défi pour toutes les années, mois et jours valides.
  • Puisque vous ne pouvez pas avoir février comme inversé d'un autre mois, vous n'avez pas à vous soucier des années bissextiles.

Toutes les années, mois et jours inversés:

  • L'année peut toujours être inversée sans problème, allant de 0001 (inversé de 1000) à 9999 (restant 9999). (Ce 0000n'est donc pas une entrée valide, et il n'y a pas non plus de cas de test pour cela.)
  • Les seuls mois que vous aurez inversés sont: janvier (inversé à partir d'octobre / 10); Octobre (inversé à partir de janvier / 01); Novembre (reste novembre / 11); et décembre (inversé par rapport à tous les deux mois / 02- 09, 12).
  • Les seuls jours que vous aurez inversés sont: 01 (inversé de 10), 02 (inversé de 20), 03 (inversé de 30), 10 (inversé de 01), 11 (reste 11), 12 (inversé de 21), 13 (inversé de 31) , 20 (inversé de 02), 21 (inversé de 12), 22 (reste 22), 30 (inversé de 03ou identique au 31 de novembre!), 31 (inversé de 04- 09/ 13-19/ 23- 29).

Règles générales:

  • C'est le , donc la réponse la plus courte en octets l'emporte.
    Ne laissez pas les langues de golf de code vous décourager de publier des réponses avec des langues autres que le golf de code. Essayez de trouver une réponse aussi courte que possible pour «n'importe quel» langage de programmation.
  • Des règles standard s'appliquent à votre réponse, vous êtes donc autorisé à utiliser STDIN / STDOUT, des fonctions / méthodes avec les paramètres appropriés et à renvoyer des instructions / sorties, des programmes complets. Ton appel.
  • Les failles par défaut sont interdites.
  • Si possible, veuillez ajouter un lien avec un test pour votre code.
  • Veuillez également ajouter une explication si nécessaire.

Cas de test ( dd-MM-yyyyau format):

21-07-2016   ->   12-12-6102
12-11-1991   ->   21-11-1991
01-01-2000   ->   10-10-0002
27-08-1875   ->   31-12-5781
18-12-2010   ->   31-12-0102
13-01-1981   ->   31-10-1891
04-11-1671   ->   30-11-1761  // Semi-tricky case, since November has 30 days
28-11-2036   ->   30-11-6302  // Semi-tricky case, since November has 30 days
14-06-1855   ->   31-12-5581
30-10-9999   ->   03-01-9999
01-01-2851   ->   10-10-1582
Kevin Cruijssen
la source
@ LegionMammal978 Non, 21-07-2016est inversé 12-70-6102et arrondi à 12-12-6102. Je ne sais pas comment vous obtenez le résultat ##-10-6107..
Kevin Cruijssen
@KevinCruijssen D'accord, je pensais que c'était le mois qui se terminait, 70l'année augmentant.
LegionMammal978
La 10-10-2sortie est-elle valide dans le troisième cas?
Luis Mendo
@LuisMendo Oui bien sûr. J'ai vu d'autres personnes le faire aussi. Le défi consiste davantage à inverser et à arrondir correctement les dates qu'au format d'entrée ou de sortie.
Kevin Cruijssen
Serait-il acceptable de prendre trois chaînes et de s'attendre à des zéros non significatifs?
JustinM

Réponses:

3

Convexe , 23 octets

Le nombre d'octets suppose le codage CP-1252.

qS/Wf%_1=:=31^sCs¶.e<S*

Le format d'E / S est dd mm yyyy.

Essayez-le en ligne!

Ceci est un port direct de ma réponse CJam . Convex est fortement basé sur CJam, et donc la seule différence est l'utilisation de l' opérateur de Convex qui encapsule les deux premiers éléments de la pile dans une liste, économisant ainsi un octet [...].

Martin Ender
la source
8

CJam, 24 octets

qS/Wf%[_1=:=31^sCs].e<S*

Le format d'E / S est dd mm yyyy.

Essayez-le en ligne!

Même nombre d'octets, format d'E / S mm dd yyyy:

qS/Wf%_0=:=1231^s2/.e<S*

Essayez-le en ligne!

Explication

qS/     e# Read input, split around spaces.
Wf%     e# Reverse each component.
[       e# Set marker for new list.
  _1=   e#   Duplicate reversed strings, extract reversed month.
  :=    e#   Check for equality of the characters. This gives 1 for
        e#   November (11) and 0 for everything else.
  31^   e#   XOR the result with 31, giving 30 for November and 31
        e#   for everything else.
  s     e#   Convert the result to a string, "30"/"31".
  Cs    e#   Push 12, convert to string, "12".
]       e# Wrap "30"/"31" and "12" in a list.
.e<     e# Element-wise minimum. This clamps the day and month to their
        e# respective maxima.
S*      e# Join the result with spaces.

L'autre version fonctionne de manière similaire, sauf que nous partons de l'entier 1230ou 1231avant de le convertir en ["12" "30"] ou ["12" "31"].

Martin Ender
la source
2
Langues avec date intégrée ...
Leaky Nun
1
@LeakyNun Cela n'utilise pas de date intégrée et je ne vois pas comment cela pourrait aider.
Martin Ender
Alors comment savez-vous qu'il y a 30 jours en novembre?
Leaky Nun
2
@LeakyNun J'ajouterai une explication plus tard, mais 1=obtient le mois inversé, :=vérifie si ses chiffres sont égaux et ^xors le résultat en 31, donnant 30 pour le mois 11et 31 pour tout le reste.
Martin Ender
Oh, je n'ai pas lu les spécifications ...
Leaky Nun
5

Pyth, 55 53 46 43 41 octets

APJ_Mczd = HhS, 12sH = GhS, sGC @. "❤❤ó» î "H%"% 02d% 02d% s "[GHeJ 
APJ_Mczd = hS, 12sH = hS, sGC @." ❤❤ó »î" H "% "% 02d% 02d% s" [GHeJ 
APJ_Mcz \ -% "% 02d% 02d% s" [hS, sGx31q11sHhS, 12sHeJ 
APJ_Mczdjd [> 2+ \ 0hS, sGx31q11sH> 2+ \ 0hS, 12sHeJ
APJ_Mczdjd. [L \ 02 [`hS, sGx31q11sH`hS, 12sHeJ

où se ❤❤trouvaient deux non imprimables, respectivement U + 001C et U + 001F.

Suite de tests.

Leaky Nun
la source
3

Python 3, 82 octets

lambda x:[min(x[0][::-1],['31','30'][x[1]=='11']),min(x[1][::-1],'12'),x[2][::-1]]

Une fonction anonyme qui prend l'entrée, via un argument, de la date sous forme de liste de chaînes du formulaire ['dd', 'mm', 'yyyy']et renvoie la date inversée validée dans le même format.

Comment ça fonctionne

Python compare les caractères et les chaînes par leurs points de code Unicode. Cela signifie que toute comparaison sur deux ou plusieurs entiers renvoie la même chose que cette comparaison sur ces entiers sous forme de chaînes. Par conséquent, l'appel minà deux entiers sous forme de chaînes renvoie le plus petit entier sous forme de chaîne; en prenant la partie date inversée comme un argument et la valeur maximale comme un autre, le jour et le mois sont limités à la plage souhaitée. Les parties de date sont inversées par indexation avec les étapes de -1( [::-1]), et la valeur maximale pour le mois passe de '31'à '30'si le mois est novembre en indexant dans une liste avec le résultat booléen d'un conditionnel.

Essayez-le sur Ideone

TheBikingViking
la source
2

Dyalog APL , 32 33 octets

⍕¨{⍵-3↑31 11≡2↑⍵}31 12 1E4⌊⍎∊⍕⌽¨⎕

I / O est une liste de trois chaînes ( 'dd' 'mm' 'yyyy').

TryAPL , mais notez que (invite pour la saisie) a été remplacé par et la ligne entière incluse dans {... }pour permettre les tests en ligne, et (exécuter l'expression) a été remplacé par 2⊃⎕VFI(vérifier et corriger la saisie) car l'exécution de code arbitraire est bloquée .

Adam
la source
2

C # 314 305 299 249 232 223 octets

using System.Linq;string f(int d,int m,int y){Func<int,string>r=i=>string.Concat((""+i).PadLeft(2,'0').Reverse());Func<string,int,string>x=(j,k)=>int.Parse(j)>k?""+k:j;return x(r(d),m==11?30:31)+"-"+x(r(m),12)+"-"+r(y);}

Merci à @KevinCruijssen d'avoir souligné que je pouvais raccourcir ma déclaration de variable, ce qui a également permis à la chaîne d'alias de sauver quelques octets.

50 octets enregistrés stockant la fonction d'inversion pour réutilisation et 13 autres en faisant de même pour l'arrondi et la suppression des déclarations de variable.

La dernière mise à jour fait que l'alias de chaîne n'est plus un économiseur d'octets.

Version non golfée:

using System.Linq;
    string dateReverse(int day, int month, int year)
{
    //setup a resuable function to reverse
    Func<int, string> reverse = intToReverse => string.Concat((""+intToReverse).PadLeft(2, '0').Reverse());

    //another function for rounding
    Func<string, int, string> round = (strToRound, maxVal) => int.Parse(strToRound) > maxVal ? "" + maxVal : strToRound;

    //Join the strings into the "dd-mm-yyyy" date format
    return 
        //Round down the day value, if november cap to 30 otherwise cap to 31
        round(reverse(day), month == 11 ? 30 : 31) + "-" +

        //Round the month down
        round(reverse(month), 12) + "-" +

        //we can use the reverse function here too and pad left just won't do anything
        reverse(year);
}

Testez-le ici

JustinM - Rétablir Monica
la source
Vous pouvez ignorer l'espace entre using System.Linq;et la fonction, c'est donc -1 octet. En outre, var n=...;var e=...;peut être joué par 1 octet en utilisant ceci à la place: string n=...,e=...;ce n'est pas beaucoup, mais toujours -2 octets. ;)
Kevin Cruijssen
Belle prise sur cet espace, bien qu'il semble que mon nombre d'octets ne l'ait pas compté, si mal que ça jusqu'à un problème de copier-coller. Je pense aussi qu'en utilisant ce style de déclaration de variable, je pourrai gagner quelques octets de plus en aliasant la chaîne.
JustinM
2

Javascript, 106 105 94 octets

d=>d.split`,`.map((a,b,r)=>(e=[...a].reverse().join``,f=!b?r[1]==11^31:b<2&&12,f&&f<e?f:e))+''

Suite de tests (rév. 3)


Explication

d=>d.split`,`                 // split into sections by `,`

.map((a,b,r)=>(               // map each section

e=[...a].reverse().join``,    // spread a date section into array and reverse and 
                              // join with `` to get string result

f=!b?r[1]==11^31              // if section being mapped is day (section 0), 
                              // then max (f) is 30 for November(month 11) or else 31

:b<2&&12,                     // if part being mapped is month (section 1), then max (f) is 12

f&&f<e?f:e))                  // if there is a max (f)
                              // and the max (f) is less than the reversed string (e),
                              // then return the max (f), 
                              // else return the reversed string (e)

+''                           // join all the sections back together with `,` 
                              // (concatenating [] with a string will do this)

Merci @KevinCruijssen pour sauver 1 octet pour b==1à b<2. Merci à @Neil d'avoir économisé 11 octets en suggérant le modèle et le ,séparateur ES6 .

CShark
la source
Je suis assez mauvais chez JS, alors corrigez-moi si je dis quelque chose de mal, mais je ne peux pas b==1jouer au golf b<2pour enregistrer un octet? Il ne peut plus être 0, puisque vous l'avez déjà vérifié dans la !b?partie du code. Il semble fonctionner dans votre suite de tests lorsque je le change.
Kevin Cruijssen du
@KevinCruijssen yep, vous avez raison, merci! Je l'ai juste oublié. Je n'ai pas fait de golf en javascript pour le look, donc je manque parfois des choses comme ça
CShark
* Je voulais dire 'pour très longtemps', pas 'pour très look'
CShark
2
Comme vous ciblez ES6, vous pouvez utiliser des chaînes de modèle pour raccourcir votre code - join``au lieu de join('')par exemple - mais vous pouvez économiser un peu plus en utilisant ,votre séparateur, ce qui vous permet d'utiliser +''pour joindre les trois valeurs ensemble.
Neil
@Neil tu veux dire ,comme le séparateur dans l'entrée?
CShark
1

Rubis, 92 84 + 1 ( -pindicateur) = 93 85 octets

Utilise -comme séparateur.

d,m,y=chomp.split(?-).map &:reverse
$_=[[d,m=="11"?"30":"31"].min,[m,"12"].min,y]*?-
Encre de valeur
la source
1

Pyke, 29 octets

F_bw-o^tDI]SX(mhj_Xjth~%R@]Sh

Essayez-le ici!

Je peux certainement voir que c'est jouable au golf

Bleu
la source
0

Python 2, 154 octets

z=input().split("-");r=[x[::-1]for x in z];z[1]=r[1]if r[1]<'12'else '12';z[0]=r[0]if r[0]<'31'else '30'if z[1]=='11'else '31';z[2]=r[2];print "-".join(z)

Prend l'entrée comme une chaîne, donc les guillemets doivent être spécifiés dans l'entrée, par exemple "11-04-2016".

Jeremy
la source
Juste une amélioration de base puisque je ne suis pas un golfeur Python: z=[x[::-1]for x in z];z[1]=min(z[1],'12');z[0]=min(z[0],['31','30'][z[1]=='11']);print"-".join(z). Fondamentalement, vous n'avez pas besoin d'utiliser rdu tout, et minaccomplissez beaucoup de choses que vous voulez faire.
Value Ink
0

05AB1E , 24 octets

#íÐÅsË31^12‚øεßт+¦}sθªðý

Port de @MartinEnder réponse CJAM de , donc aussi les entrées et sorties sous forme de chaîne dans le format dd MM yyyy.

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

#                         # Split the (implicit) input by spaces
                          #  i.e. "04 11 1671" → ["04","11","1671"]
                          #  i.e. "20 01 2000" → ["20","01","2000"]
 í                        # Reverse each string
                          #  i.e. ["04","11","1671"] → ["40","11","1761"]
                          #  i.e. ["20","01","2000"] → ["02","10","0002"]
  Ð                       # Triplicate this list
   Ås                     # Pop one of them, and push it's middle element (the months)
                          #  i.e. ["40","11","1761"] → "11"
                          #  i.e. ["02","10","0002"] → "10"
     Ë                    # Check if the digits are the same (1 for 11; 0 otherwise)
                          #  i.e. "11" → 1 (truthy)
                          #  i.e. "10" → 0 (falsey)
      31^                 # Bitwise-XOR with 31 (30 for November, 31 for other months)
                          #  i.e. 1 → 30
                          #  i.e. 0 → 31
         12              # Pair it with 12
                          #  i.e. 30 → [30,12]
                          #  i.e. 31 → [31,12]
            ø             # Zip/transpose; swapping rows and columns
                          # (implicitly removes year)
                          #  i.e. ["40","11","1761"] and [30,12] → [["40",30],["11",12]]
                          #  i.e. ["02","10","0002"] and [31,12] → [["02",31],["10",12]]
             ε    }       # Map each pair to:
              ß           # Get the minimum (implicitly converts to integer unfortunately)
                          #  i.e. [["40",30],["11",12]] → [30,11]
                          #  i.e. [["02",31],["10",12]] → [2,10]
               т+         # Add 100
                          #  i.e. [30,11] → [130,111]
                          #  i.e. [2,10] → [102,110]
                 ¦        # Remove the first character
                          #  i.e. [130,111] → ["30","11"]
                          #  i.e. [102,110] → ["02","10"]
                   s      # Swap so the triplicated list is at the top of the stack again
                    θ     # Pop and only leave it's last element (the year)
                          #  i.e. ["40","11","1761"] → "1761"
                          #  i.e. ["02","10","0002"] → "0002"
                     ª    # Append it to the list
                          #  i.e. ["30","11"] and "1761" → ["30","11","1761"]
                          #  i.e. ["02","10"] and "0002" → ["02","10","0002"]
                      ðý  # Join the list by spaces (and output implicitly)
                          #  i.e. ["30","11","1761"] → "30 11 1761"
                          #  i.e. ["02","10","0002"] → "02 10 0002"
Kevin Cruijssen
la source