Aww, mec, cette date d'expiration n'écrit pas les mois avec des lettres! Je ne peux pas dire si elle expire le 10 mars ou le 3 octobre ... Attendez, non, ça ne fait rien, l'année 2012 est en cours .
Supposons donc un instant que vous soyez trop occupé pour essayer de raisonner quand ce pot de marinara est censé expirer. Vous voulez juste la version de Cliff Notes: quelle est la probabilité qu'il soit en retard? Ecrivons du code!
Vous savez que les fabricants impriment la date sous la forme d'un triple ordonné d'entiers, dans l'un des trois formats suivants:
YEAR MONTH DAY
MONTH DAY YEAR
DAY MONTH YEAR
Et vous savez que certaines dates ne peuvent être interprétées que d'une ou deux manières, pas toutes les trois: le 55 dans 55-11-5
doit être une année, ce qui signifie que cette boîte particulière de Twinkies a expiré le 5 novembre 1955. L'année est parfois donnée en quatre chiffres et pas deux, ce qui peut exclure certaines options. Quand il s'agit de deux chiffres, 50..99 signifie 1950..1999 et 0..49 signifie 2000..2049.
Votre travail consiste à écrire un programme ou une fonction qui prend un tableau d’entiers qui est une date valide dans au moins une des interprétations ci-dessus, et génère un pourcentage de chance qu’il soit toujours bon. Le pourcentage de chance est simplement le pourcentage d'interprétations valides de la date qui sont postérieures ou postérieures à la date du jour.
Le tableau d’entiers sera le [Int]
type de longueur trois de votre langue s’il s’agit d’un argument pour une fonction et est indiqué sous la forme d’entiers entiers séparés par un tiret, une barre oblique ou un espace (vous devez choisir) s’il est utilisé comme entrée sur STDIN programme complet. *
La "date du jour" peut être la date du jour, obtenue via une fonction de date, ou la date indiquée dans un argument supplémentaire à function ou un paramètre supplémentaire dans STDIN. Il peut s’agir de secondes d’époque Unix, d’un autre triplet année-mois-jour entré d’une des manières ci-dessus, ou d’une autre manière plus pratique.
Ayons des exemples! La date d'expiration entrée sera dans le style séparé par tiret, et supposons pour les exemples ci-dessous que la date d'aujourd'hui est le 5 juillet 2006.
14-12-14
- Les deux interprétations valides pour cela (JJ et AMJ) sont équivalentes, le 14 décembre 2014. Le résultat est 100, car ce produit est définitivement bon.8-2-2006
- Le dernier chiffre est un an, bien sûr, puisqu'il comporte quatre chiffres. Cela pourrait être soit le 8 février (expiré) ou le 2 août (toujours bon). La sortie est 50 .6-7-5
- Cela pourrait être n'importe quoi! L’interprétation du "5 juillet 2006" est toujours valable (pour une journée seulement), mais les deux autres sont toutes les deux en 2005 et devraient être lancées le plus rapidement possible. La sortie est 33 .6-5-7
- Ici, deux interprétations sur trois sont sans danger. Vous pouvez arrondir votre décimale vers le haut ou le bas. 66 ou 67 sont donc acceptables.12-31-99
- D'accord, celui-ci est sans équivoque depuis le début du siècle (les années 50 à 99 sont 19XX et 31 ne peuvent pas être d'un mois). Un gros gros 0 , et vous devriez vraiment nettoyer votre réfrigérateur plus souvent.
Vous pouvez sans risque supposer que toute entrée qui ne répond pas aux normes ci-dessus n'est pas au courant des règles de sortie ci-dessus.
Pas de demandes Web ou de lacunes standard. Les bibliothèques de traitement de date sont autorisées. C'est du code golf: que le programme le plus court gagne.
* Si vous utilisez brainfuck ou un langage similaire handicapé par les types de données, vous pouvez supposer que les valeurs ASCII des trois premiers caractères en entrée sont les entiers de la date. Cela exclut la logique des années à quatre chiffres, bien sûr, mais je pense que nous serions trop étonnés de voir une solution à cela dans Brainfuck pour vous en vouloir.
Réponses:
k4
(90)(88)(87)(82)Invoke avec
x
de.z.D
(un builtin) à titre de comparaison à aujourd'hui, ou une date littérale de votre choix autrement:Ceci est fondamentalement un port de la solution Python @ Alex-l, avec quelques astuces de golf diverses ajoutées:
la source
"012201210"
, car#
prend ses éléments de manière cyclique. En fait, vous pouvez enregistrer une deuxième ombles de cette façon en échangeant les deux derniers cas:3 3#.:'"0122102"
.{c*(+/~d<x)%3-+/^d:{"D"$"."/:$|z,y,x+(c*19+x<50)*x<c::100}.'y@/:3 3#.:'$21020101}
.Ruby, 115 caractères
Ceci définit une fonction
f
qui prend deux arguments: un tableau contenant l'entrée et la date "aujourd'hui".Exemples:
la source
Python 2.7 - 172
J'utilise le module datetime pour la validité et la comparaison des dates. Si
date
vous ne pouvez pas créer une date / heure valide à partir de l'entrée, elle se déclencheValueError
. Cette manières
correspond à la somme des dates non expirées ett
au nombre total de dates valides. Je profite du fait queTrue == 1
pour l'ajout et l'indexation en Python. Je sauve également un personnage en utilisant 25 * (76,80) au lieu de (1900,2000).Notez que les lignes du deuxième niveau d'indentation utilisent un caractère de tabulation, pas deux espaces.
Ajoutez ceci à la fin pour tester:
la source
PowerShell,
183173168Entrée comme
int[]
paramètre via, par exempletry
/catch
, tant que je ne sais pas si la sortie sur stderr est autorisée ou non.+"-1"
de la date, ce qui est interprété de manière.AddDays(-1)
à décaler la date du jour d’un jour, afin que nous puissions nous comparer à hier (au lieu d’aujourd’hui). Cela résout le problème que nous obtenons une date avec 0:00 comme heure, mais devons comparer avec une date avec l'heure d'aujourd'hui.la source
R, 269
Je m'attendais à ce que ce soit facile en R, mais les années à un chiffre étaient une courbe assez grosse. Je sens que cela pourrait être beaucoup mieux que ce qu'il est.
lubridate
est un paquet du CRAN, vous devrez peut-être l'installer avecinstall.packages("lubridate")
.Utilisation:
f(c(d1,d2,d3))
oùc(d1,d2,d3)
est un vecteur d'entiers.par exemple, les
f(c(6,10,14))
retours0.3333333
.Le
lubridate
paquet a une série de fonctions d'encapsulation pour analyser les dates dans différents ordres. J'utilise ceux-ci pour voir quels formats produisent des dates valides, jettent les non valides, puis quels sont ceux qui ne se sont pas encore produits.la source
Mathematica,
163153164 octets( edit: dates fixes en dehors de la plage 1950 - 2049)
Ceci définit une fonction que vous pouvez appeler comme
Actuellement, le pourcentage n'est pas arrondi (en attendant que le PO clarifie).
Voici une explication un peu de longue haleine qui devrait être compréhensible sans aucune connaissance Mathematica (notez que
&
fait tout en reste une fonction anonyme dont les paramètres sont appelés#
,#2
,#3
...):Ceci définit une fonction qui transforme 3 paramètres
a,b,c
en 3 listes{{a,b,c},{c,b,a},{c,a,b}
. Notez que ce##
n'est qu'une séquence de tous les paramètres.Appliqué à la date d'expiration, ceci donne une liste de
{y,m,d}
pour chacune des trois permutations possibles.C'est une fonction anonyme qui prend trois paramètres
a,b,c
et renvoie une liste des trois, le premier ayant été converti en année selon les règles données: les nombres entre50
et99
(modulo100
) sont transformés en une année du 20ème siècle, les nombres entre0
et49
(( modulo100
) sont transformés en une année du 21ème siècle, tous les autres sont laissés. Voici##2
une séquence de paramètres commençant par le second, à savoirb,c
.Appliqué à chacun des trois résultats précédents, ceci canonise juste les formats d'année. Appelons cela
canonicalDates
pour raccourcir l'expression suivante:Ceci filtre les interprétations non valides.
DateList@d
fait une{y,m,d,h,m,s}
représentation complète à partir de divers formats de date. Il interprétera les listes dans le même ordre, mais le problème est que vous pouvez lui transmettre des informations telles que,{8,2,2006}
dans ce cas, le calcul est effectué8 years + 2 months + 2006 days
. Nous vérifions donc que les trois premiers éléments de la liste renvoyée sont identiques à ceux de l’entrée (ce qui ne peut se produire que si le mois et le jour figurent dans les plages appropriées).Pour raccourcir les lignes suivantes, je ferai référence au résultat de cette expression à
validDates
partir de maintenant:Une autre fonction anonyme qui prend une date et retourne la différence en jours à aujourd'hui (obtenue à partir de
Date[]
).Mappez cela sur les interprétations de date valides.
Encore une autre fonction anonyme qui, à partir d’une liste (
#
), retourne le pourcentage de nombres non positifs dans cette liste. Le résultat.
n’est pas une multiplication mais juste un chiffre décimal, afin d’éviter des nombres rationnels (vous obtiendrez des choses comme100/3
au lieu de33.333
- je ne sais pas vraiment si cela pose un problème).Appliqué à la liste des différences de dates, cela nous donne la fraction d'interprétations non encore expirées.
la source
JavaScript (E6) 159
164 172Edit Merci à nderscore pour les conseils et pour m'avoir poussé à réfléchir à nouveau. Réorganisé D en évitant les paramètres et en coupant certains caractères.
Edit 2 Une autre astuce de nderscore, 2 fonctions fusionnées en 1. Ensuite, deux parenthèses ont été supprimées pour fusionner les expressions séparées par des virgules. Lisibilité proche de 0. Note: Ne pas arrondir pourrait économiser 2 caractères (| 0).
Test dans la console FireFox
Sortie:
Ungolfed
NB La fonction D essaie de créer une Date avec une année, un mois ou un jour donnés, mais renvoie faux si la date créée n’est pas celle voulue (! = Jour ou mois)
la source
C # dans LINQPad -
446408272 octetsTroisième édition: Merci à Le Canard fou d’avoir fait remarquer que DateTime.Today est correct, pas DateTime.Now. Deuxième édition: Merci à VisualMelon pour cette solution intelligente!
Edit: Merci à podiluska et edc65 de m'aider à raccourcir le code! J'ai également remarqué que ma solution n'était pas correcte si la valeur de l'année était de 4 octets. J'ai donc inclus le correctif de ce problème. Le score de cette solution est de 408 octets.
Même si je ne bat aucune des réponses précédentes, je voulais tout de même partager ma solution C #. Toute aide / suggestion est appréciée! ;)
Version formatée et non-golfée:
J'ai essayé de créer une solution où la partie "DateTime.TryParse" ne se répète pas comme dans cette solution, mais elle était plus longue de 21 octets.
Solution sans répéter "DateTime.TryParse": 467 octets
Version non-golfée:
la source
int s=0;int a=d[2];int b=d[1];int e=d[0];
->int s=0,a=d[2],b=d[1],e=d[0];
DateTime.TryParse
appels était mon premier instinct, le remplacer par un lambda qui remettait également la valeur dans q. Également effectué quelques autres étapes ( pastebin ) pour obtenir 328chars:void g(int[]d){var q=new List<DateTime>();var p=".";int a=d[2],b=d[1],e=d[0],y;DateTime c;y=(a<100)?(a>49)?1900+a:2000+a:a;Action<string>z=(x)=>{if(DateTime.TryParse(x,out c))q.Add(c);};z(e+p+b+p+y);z(b+p+e+p+y);y=(e<100)?(e>49)?1900+e:2000+e:e;z(a+p+b+p+y);(q.Where(i=>i>=DateTime.Now).Count()*100/(q.Any()?q.Count:1)).Dump();}
Action<string>
auparavant, je pouvais donc apprendre quelque chose de votre part;) J'ai pu réduire votre réponse à 318 caractères en le remplaçantq.Where(i=>i>=DateTime.Now).Count
parq.Count(i=>i>=DateTime.Now
. J'ai également supprimé les crochetsx
pour pouvoir sauvegarder 2 caractères supplémentaires!Haskell,
171165 caractèresLe nom de la fonction est
%
. Exécutez avec la date du test sous forme de tuple dans l'ordre canonique (y, m, d) avec l'année réelle, et le tampon de la boîte sous forme de tuple de trois chiffres:la source
Erlang, 146
La fonction de test serait:
Ungolfed
Cette solution repose sur la compréhension de liste. Il emprunte l'astuce du modulo pour l'année à la solution Haskell. Il utilise également
calendar:valid_date/1
pour traiter les dates impossibles en raison du nombre de jours d'un mois donné (par exemple, "29-2-2" ne peut être qu'au format JMD). En outre, Today est audate()
format Erlang (un tuple YMD).la source
APL (85)
Cela utilise certaines des nouvelles fonctions de Dyalog APL 14, mais pas de bibliothèques externes. Pour changer, cela fonctionne sur TryAPL .
Il s'agit d'une fonction qui prend le tableau à 3 éléments comme
⍵
argument de droite ( ) et la date à vérifier comme⍺
argument de gauche ( ), sous la forme d'un entier auYYYYMMDD
format. C'est-à-dire que la date2014-07-09
est représentée par le nombre20140709
.Tester:
Explication:
Z←(⊂⌽⍵),(⊂2⌽⍵),⊂⍵
: transformer la date donnée au format AMJ en la retournant(⊂⌽⍵)
, en la tournant de 2 à gauche(⊂2⌽⍵)
ou en ne faisant rien⊂⍵
. Au moins un de ceux-ci est maintenant une date appropriée au format AMJ, peut-être plus d'une si la date est ambiguë.{∧/12 31≥1↓⍵}¨Z
: teste si chaque date est valide: l'année (premier élément) est supprimée, puis le mois ne doit pas dépasser 12 et le jour ne doit pas dépasser 31.Z/⍨
: filtrer les dates valides deZ
.{
...}¨
: pour chaque date valide:⍵+(99≥⊃⍵)×3↑1900+100×50>⊃⍵
: si l'année n'est pas supérieure à 99, ajoutez 1900, puis 100 si l'année est inférieure à 50.(3/100)⊥
: décodez-le comme s'il s'agissait d'un ensemble de nombres en base 100. (L'année est supérieure à 100, mais cela n'a pas d'importance car c'est le premier élément.) Ceci donne un nombre pour chaque date valide dans le même format que l'argument de gauche.⍺≤
: pour chaque date, voir si elle n'est pas plus petite que⍺
. Cela donnera un vecteur binaire où 1 signifieOK
et 0 signifiespoiled
.100×(+/÷⍴)
: divise la somme du vecteur binaire par sa longueur et multiplie par 100.la source
{100×(+/÷⍴)⍺≤((3/100)⊥⊢+(99≥⊃)×3↑1900+100×50>⊃)¨Z/⍨{∧/12 31≥1↓⍵}¨Z←(⌽⍵)(2⌽⍵)⍵}
Java: 349 caractères (3 sans espaces)
Voici une classe contenant qui peut être utilisée pour le tester, y compris une version (légèrement) dégradée de la méthode:
C’est ma première partie de golf de code, et je pense avoir compris pourquoi je ne vois généralement pas beaucoup de golfeurs Java.
la source
int[]
argument, pas troisint
.C # 287 octets
Première fois golf, à la recherche de conseils. Notamment, supprimer les octets en raison de l'espace de noms.
Abuser du fait que seule une fonction est requise, pas un programme réel. En outre, la fonction entraîne toujours une exception non interceptée.
Ungolfed
la source
Mathematica , 118
En utilisant le code de m.buettner comme point de départ, j'ai quelques améliorations:
la source