Quel est le programme le plus court qui puisse prédire la prochaine fois que le vendredi tombera le 13e jour du mois?
- Doit être un programme fonctionnel complet (pas seulement une fonction / sous-routine)
- Doit imprimer la date au format suivant:
YYYY-MM-DD
- Autoriser l'utilisateur à fournir une date de début sous forme d'argument de ligne de commande ou via
STDIN
- Si l'utilisateur ne fournit aucune date de début, utilisez aujourd'hui comme date de début.
- Si la date de début est un vendredi 13, le programme devrait trouver le prochain vendredi 13.
Si je devais exécuter le programme aujourd'hui (16 février 2011), je devrais obtenir la sortie suivante.
$ ./fr13th 2013-05-09
2013-09-13
$ ./fr13th 2007-06-29
2007-07-13
$ ./fr13th 2007-07-13
2008-06-13
$ ./fr13th
2011-05-13
2013-9-13
sortie serait-elle correcte pour le premier exemple?Réponses:
Windows PowerShell, 74
Assez simple. Un bit peut-être déroutant est l'utilisation de
"Get-Date $args" | Invoke-Expression
pour obtenir la date actuelle (si elle$args
est vide) ou la date spécifiée dans$args
sans déclencher d'erreur.Variante de 72 octets:
Cela prend du temps, cependant ... cela n'incrémente pas le datetime d'une journée entière à chaque itération, mais plutôt seulement 900 nanosecondes. Mais deux octets de moins.
Variante de 67 octets:
C'est un peu sensible aux paramètres régionaux; s'il échoue sur votre machine, essayez de régler votre format de date sur ISO-8601 au préalable. :-)
Oh, et il peut être transformé en 65 octets, tout comme la version 72 octets.
Histoire:
for
. La comparaison tout comme la soustraction au lieu de-eq
laquelle enregistre deux autres octets.date
chaîne de format Unix est un peu plus courte.yyy-MM-d
suffit (car l'année est toujours plus longue que trois caractères et le jour est toujours 13. Merci à Ty Auvil pour cela.la source
iex
? Essayez simplement (date $ args) à la place.$null
àGet-Date
vous obtiendrez une erreur, pas la date actuelle."date $args"|iex
cependant, se résout à la date indiquée dans$args
ou à la date actuelle, qui est exactement ce que nous voulons ici.bash, 75
C'est un peu sensible aux paramètres régionaux; si elle échoue sur votre machine, essayez
export
ing auLC_ALL=C
préalable.la source
Ruby,
9675 caractèresPrend la date de stdin. Pour ne pas spécifier de date, appuyez sur ctrl-d.
Merci beaucoup pour l'aide de Ventero.
Non golfé:
Exemple d'E / S:
la source
d.wday*d.day==65
est de 4 caractères plus court. Et vous devriez pouvoir remplacerDate.today.to_s
par"thu"
require"date";d=Date.parse($*[0]||"thu")+1;d+=1 while d.wday*d.day!=65;$><<d
. Et vous pouvez lire la date depuis stdin avecgets
au lieu de$*[0]
pour enregistrer un autre caractère (entrez EOF pour obtenir le comportement par défaut).C #, 185
Basé sur la solution C # d'Andrew Koester , mais fortement modifié en cours de route. Je suis finalement arrivé à une solution similaire à ma solution PowerShell:
la source
Perl (et autres), 114
Perl 5.10 ou version ultérieure, exécutez avec
-E 'code here'
ou-M5.010 file
. Besoinsdate
(de coreutils pour Linux) etcal
(d'util-linux)Exemple d'exécution:
Je ne sais pas quand le zéro principal des mois avant octobre est conservé. Elle est évidemment perdue lorsque l'année se déroule; il semble être conservé lorsque le mois prochain sera la réponse. Appelons ce comportement indéfini - hé, c'est du golf!
la source
FRAPPER
CONCEPT UTILISÉ:
EXEMPLE D'E / S
la source
C #
240 caractères. C # a besoin d'un mode "exécuter à l'intérieur d'une fonction uniquement"!
Non golfé:
Sortie test
la source
D: 227 caractères
Plus lisiblement:
La partie amusante est que, si std.datetime de D rend ce type de code très facile à écrire, il est également incroyablement verbeux - principalement en raison des noms de fonctions précis (et donc longs). Ainsi, l'utilisabilité et la maintenabilité du code sont très élevées, mais sa jouabilité au code est plutôt faible.
la source
Python - 166 caractères
Lit à partir de stdin, vous devez donc alimenter une ligne vierge si vous voulez la date d'aujourd'hui
la source
SQLite, 374 caractères
(Les sauts de ligne sont ajoutés ici pour plus de lisibilité; non inclus dans le décompte.)
Obligation de «permettre à l'utilisateur de fournir une date de début sous forme d'argument de ligne de commande ou via STDIN» omise en raison de limitations techniques.
Les 4 premières instructions créent une table (R) avec une seule colonne contenant tous les entiers de 0 à 4095.
La 5e déclaration construit un tableau (F) de tous les vendredis 13 entre le 2000-10-13 et le 2340-12-13.
La 6e déclaration renvoie simplement le premier vendredi le 13 après la date actuelle (UTC).
la source
PHP - 103
(Force brute)
Non golfé:
Tester:
la source
!=
pour-
. Vous pouvez également enregistrer jusqu'à 2 caractères en remontant$d->modify('next fri')
dans la section incrément de la boucle.-r
et vous n'avez pas besoin de la balise. Utilisez la configuration par défaut avec-n
et vous n'avez pas besoin@
.\n
est inutile.echo
au lieu d'die
enregistrer un autre octet.strtotime
au lieu de laDate
classe peut en sauver un ou deux de plus.C #,
206194 caractèresMise à jour
Il s'agit d'une approche légèrement différente du problème, j'ai donc laissé mon autre tentative ici en entier.
Ici, je trouve le vendredi de la semaine "actuelle", puis je l'incrémente de 7 jusqu'à ce que j'en trouve un qui est un 13. J'ai également utilisé Joey pour la boucle et le formatage de sortie pour raser quelques caractères.
Non golfé:
Original:
Ceci est similaire à celui d'Andrew ci-dessus, mais il y avait suffisamment de différences, j'ai décidé de poster une réponse distincte plutôt que de commenter et de suggérer des modifications.
Non golfé:
la source
R, 113 caractères
L'exemple s'exécute:
la source
Perl 6 , 69 octets
Essayez-le en ligne!
Merci à @ ASCII uniquement pour -5
la source
day-of-week==5
Javascript
ps: oui, je sais, j'ai enfreint la première règle (ça ne pouvait pas être juste une fonction)
Tests sur shell javascript
la source
T-SQL
359285253 caractèresJe voulais juste mettre la claque sur la solution SQLite avec ma fonction de date verbeuse non intelligente en utilisant la procédure T-SQL.
Mise à jour: Ma crainte initiale que faire un incrément d'un jour prendrait plus d'espace qu'un incrément d'un mois était très incorrecte.
Résultats des tests (SSMS):
la source
Un autre Javascript, 153
Je poste une autre réponse javascript car je ne peux pas commenter la première ...
Exécutez avec nodeJS:
la source
Python 3.3, 166 caractères
L'entrée est au format
2013 1 1
,ou appuyez simplement sur Entrée pour utiliser la date d'aujourd'hui (serait le 2013/12/11 pour cette sortie)
(il y a en fait un mélange de ma solution et de @gnibbler qui compte 144 caractères)
La très belle ligne
while t.day*t.weekday()-65:
vient de la solution de @ gnibbler.la source
Japt, 35 octets
-8 octets grâce à @ASCIIOnly!
Essayez!
la source
toISOString
convertit en UTC qui change la dateK
-ce que l'heure est stockée comme heure locale?Swift 4 , 310 octets
Essayez-le en ligne!
-4 grâce à TagTaco.
Hélas...:
Int
s commeBool
.??
.!=
a également besoin d'espacement, de peur qu'il ne soit interprété comme un déballage.la source
VB.net (96c *)
Entrée
Donc, mon score est ventilé comme suit
la source
Rebol, 136
Non golfé:
Exemple d'utilisation:
la source
Java 8,
200197 octetsExplication:
Essayez-le ici (supprimez l'argument pour utiliser la date actuelle).
REMARQUE: le format par défaut de Java lors de l'impression l'est déjà
yyyy-MM-dd
.la source
05AB1E , 141 octets
05AB1E n'a pas de prédéfinis pour les objets Date ou les calculs. Le seul élément intégré concernant les dates dont il dispose est l'année / mois / jour / heures / minutes / secondes / microsecondes d'aujourd'hui.
Donc à cause de cela, la quasi-totalité du code que vous voyez sont des calculs manuels pour aller au lendemain et calculer le jour de la semaine.
Principalement dérivé de ma réponse 05AB1E dans le défi The Work Day Countdown (c'est pourquoi j'ai édité celui-ci il y a environ une heure quand je suis tombé sur un bug ..)
L'entrée est une chaîne au format
dd-MM-yyyy
(mais la sortie est au formatyyyy-MM-dd
, car c'est l'une des règles du défi).Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source