Vendredi 13 prochain

15

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
Daniel Standage
la source
Une 2013-9-13sortie serait-elle correcte pour le premier exemple?
JB
Voulez-vous dire que nous pouvons décider si nous voulons prendre la date comme argument ou de STDIN ou que nous devons soutenir les deux?
sepp2k
@ sepp2k Vous pouvez décider, vous n'avez pas besoin de prendre en charge les deux, l'utilisateur a juste besoin d'un moyen pour entrer une date.
Daniel Standage
@JB Oui, car il existe plusieurs autres solutions qui répondent à toutes les exigences, je n'accepterais pas votre réponse comme la solution même si elle était la plus courte. Cela ne signifie pas que votre réponse n'était pas informative ... mais oui, gérer un format de date incohérent serait frustrant.
Daniel Standage
Eh bien celui-ci n'est pas vraiment possible avec golfscript car il ne connaît pas la date du jour *. Il n'a pas non plus de bibliothèque de dates, ce serait donc une réponse assez importante de toute façon. (* vous pouvez utiliser ruby ​​eval pour l'obtenir, mais vous pourriez aussi bien utiliser ruby ​​date lib aussi)
gnibbler

Réponses:

6

Windows PowerShell, 74

for($d="date $args"|iex;($d+='1').day*$d.dayofweek-65){}'{0:yyy-MM-d}'-f$d

Assez simple. Un bit peut-être déroutant est l'utilisation de "Get-Date $args" | Invoke-Expressionpour obtenir la date actuelle (si elle $argsest vide) ou la date spécifiée dans $argssans déclencher d'erreur.

Variante de 72 octets:

for($d="date $args"|iex;($d+=9).day*$d.dayofweek-65){}'{0:yyy-MM-d}'-f$d

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:

for($d="date $args"|iex;($d+='1').day*$d.dayofweek-65){}'{0:d}'-f$d

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:

  • 17-02-2011 00:33 (92) Première tentative.
  • 17-02-2011 00:35 (85) Amélioration de l'obtention d'une date initiale.
  • 2011-02-17 00:37 (79) Comparé le produit au lieu du jour et du jour de la semaine individuellement. Certes volé à Ventero.
  • 17/02/2011 00:40 (76) Tiré la première ligne dans le for. La comparaison tout comme la soustraction au lieu de -eqlaquelle enregistre deux autres octets.
  • 2011-02-17 00:53 (75) La datechaîne de format Unix est un peu plus courte.
  • 2011-02-17 11:42 (74) Revient au modèle de date par défaut mais yyy-MM-dsuffit (car l'année est toujours plus longue que trois caractères et le jour est toujours 13. Merci à Ty Auvil pour cela.
Joey
la source
Pourquoi passez-vous "date $ args" à iex? Essayez simplement (date $ args) à la place.
Iszi
@Iszi: Ceci est utilisé pour implémenter le "Si l'utilisateur ne fournit aucune date de début, utilisez aujourd'hui comme date de début." règle. Si vous passez un tableau vide ou $nullà Get-Datevous obtiendrez une erreur, pas la date actuelle. "date $args"|iexcependant, se résout à la date indiquée dans $args ou à la date actuelle, qui est exactement ce que nous voulons ici.
Joey
4

bash, 75

until set `date +%F -d$1+day`
date -d$1|grep -q '^F.* 13'
do :
done
echo $1

C'est un peu sensible aux paramètres régionaux; si elle échoue sur votre machine, essayez exporting au LC_ALL=Cpréalable.

$ bash fri13th.sh 2013-05-09
2013-09-13                                             
$ bash fri13th.sh 2007-06-29
2007-07-13                                             
$ bash fri13th.sh 2007-07-13
2008-06-13
$ bash fri13th.sh
2011-05-13
JB
la source
4

Ruby, 96 75 caractères

require"date"
d=Date.parse(gets||"thu")+1
d+=1 while d.wday*d.day!=65
$><<d

Prend la date de stdin. Pour ne pas spécifier de date, appuyez sur ctrl-d.

Merci beaucoup pour l'aide de Ventero.

Non golfé:

require "date"
# Date.parse("thu") will return this week's thursday
date = Date.parse(gets || "thu")+1
date += 1 while d.wday * d.day != 5 * 13
$stdout << date

Exemple d'E / S:

$ ruby fr13th.rb
2013-05-09
2013-09-13
$ ruby fr13th.rb
2007-06-29
2007-07-13
$ ruby fr13th.rb
2007-07-13
2008-06-13
$ ruby fr13th.rb
2011-05-13
sepp2k
la source
1
d.wday*d.day==65est de 4 caractères plus court. Et vous devriez pouvoir remplacer Date.today.to_spar"thu"
Ventero
En fait , en utilisant une boucle au lieu d'un itérateur raccourcit le code à 76 caractères: 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 avec getsau lieu de $*[0]pour enregistrer un autre caractère (entrez EOF pour obtenir le comportement par défaut).
Ventero
@Ventero: Très bien, merci.
sepp2k
3

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:

using System;class
P{static void
Main(string[]a){var
n=a.Length>0?DateTime.Parse(a[0]):DateTime.Now;for(;(n=n.AddDays(1)).Day*(int)n.DayOfWeek!=65;);Console.Write("{0:yyy-MM-d}\n",n);}}
Joey
la source
2

Perl (et autres), 114

for(($y,$m,$d)=(shift//`date +%F`)=~/\d+/g,$d>12&&$m++;$m
>12&&($y++,$m=1),`cal $m $y`!~/14$/m;$m++){}say"$y-$m-13"

Perl 5.10 ou version ultérieure, exécutez avec -E 'code here'ou -M5.010 file. Besoins date(de coreutils pour Linux) et cal(d'util-linux)

Exemple d'exécution:

$ perl -M5.010 fr13.pl 2013-05-09
2013-9-13
$ perl -M5.010 fr13.pl 2007-06-29
2007-07-13
$ perl -M5.010 fr13.pl 2007-07-13
2008-6-13
$ perl -M5.010 fr13.pl
2011-5-13

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!

JB
la source
2

FRAPPER

#!/bin/bash
from=$1
if [ "$from" = "" ]; then
from=`date +%Y-%m-%d`
fi
i=1
while [ "$isFri" = "" ] || [ "$is13" = "" ]
do
isFri=`date -d "${from} ${i} days" | grep Fri`
is13=`date -d "${from} ${i} days" +%Y-%m-%d | grep "\-13"`
((i++))
done
((i--))
date -d "${from} ${i} days" +%Y-%m-%d

CONCEPT UTILISÉ:

$ date -d "2011-02-16 2 days" +%Y-%m-%d
2011-02-18

EXEMPLE D'E / S

:~/aman> ./fr13th.sh
2011-05-13
:~/aman> ./fr13th.sh 2013-05-09
2013-09-13
:~/aman> ./fr13th.sh 2007-06-29
2007-07-13
:~/aman> ./fr13th.sh 2007-07-13
2008-06-13
Aman ZeeK Verma
la source
2

C #

240 caractères. C # a besoin d'un mode "exécuter à l'intérieur d'une fonction uniquement"!

using System;class P{static void Main(string[] a){var n=DateTime.Now;if(a.Length>0)DateTime.TryParse(args[0],out n);while(true){n=n.AddDays(1);if((n.Day==13)&&(n.DayOfWeek==(DayOfWeek)5))break;}Console.WriteLine(n.ToString("yyyy-MM-dd"));}}

Non golfé:

using System;

class P
{
    static void Main(string[] a)
    {
        var n = DateTime.Now;
        if (a.Length > 0) DateTime.TryParse(args[0], out n);
        while (true)
        {
            n = n.AddDays(1);
            if ((n.Day == 13) && (n.DayOfWeek == (DayOfWeek)5)) break;
        }
        Console.WriteLine(n.ToString("yyyy-MM-dd"));
    }
}

Sortie test

\Debug> f13.exe 2013-05-09
2013-09-13

\Debug> f13.exe 2007-06-29
2007-07-13

\Debug> f13.exe 2007-07-13
2008-06-13

\Debug> f13.exe
2011-05-13
Jess
la source
2

D: 227 caractères

import std.datetime,std.stdio;void main(string[]a){auto d=a.length<2?cast(Date)(Clock.currTime()):Date.fromISOExtendedString(a[1]);for(;d.dayOfWeek!=DayOfWeek.fri||d.day!=13;d+=dur!"days"(1)){}writeln(d.toISOExtendedString());}

Plus lisiblement:

import std.datetime, std.stdio;

void main(string[] a)
{
    auto d = a.length < 2 ? cast(Date)(Clock.currTime()) : Date.fromISOExtendedString(a[1]);

    for(; d.dayOfWeek != DayOfWeek.fri || d.day != 13; d += dur!"days"(1)) {}

    writeln(d.toISOExtendedString());
}

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.

Jonathan M Davis
la source
2

Python - 166 caractères

Lit à partir de stdin, vous devez donc alimenter une ligne vierge si vous voulez la date d'aujourd'hui

from datetime import*
D=datetime
e=timedelta(1)
I=raw_input()
d=e+(I and D.strptime(I,"%Y-%m-%d")or D.now())
while(d.weekday()+1)*d.day-65:d+=e
print d.strftime("%F")
grignoteur
la source
À moins que je manque quelque chose, cela ne répond pas à la 4ème exigence (si aucune date n'est fournie, commencez à partir d'aujourd'hui).
Daniel Standage
@Daniel, a manqué celui-là. 26 coups plus tard ...
gnibbler
Explosion du passé désolé :) Si nous rejoignons nos solutions, nous arrivons à une collaboration 144 caractères (voir ci-dessous!) :)
Roberto
2

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.

CREATE TABLE R(N UNIQUE);
INSERT INTO R VALUES(0);
INSERT INTO R VALUES(1);
REPLACE INTO R SELECT A.N*2048|B.N*1024|C.N*512|D.N*256|E.N*128|F.N*64|
G.N*32|H.N*16|I.N*8|J.N*4|K.N*2|L.N FROM
R A,R B,R C,R D,R E,R F,R G,R H,R I,R J,R K,R L;
CREATE TABLE F AS SELECT DATE('2000-01-13','+'||N||'months') AS D
FROM R WHERE STRFTIME('%w',D)='5';
SELECT MIN(D) FROM F WHERE D>DATE('now');

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

dan04
la source
Le calendrier grégorien a un cycle de 400 ans, pas 340 ans. Ou est-ce que je manque quelque chose ici?
Joey
Il ne gère pas les années en dehors de la plage 2000-2340. Ce n'était qu'un choix arbitraire.
dan04
2

PHP - 103

(Force brute)

<?for($d=date_create(@$argv[1]);$d->modify('next fri')&&$d->format(@d)-13;);die($d->format("Y-m-d\n"));

Non golfé:

<?
$d = new DateTime(@$argv[1]);
while ($d->modify('next fri')) {
        if ($d->format('d') == 13) {
                die($d->format("Y-m-d\n"));
        }
}

Tester:

$ php 979.php 2013-05-09
2013-09-13
$ php 979.php 2007-06-29
2007-07-13
$ php 979.php 2007-07-13
2008-06-13
$ php 979.php 
2011-05-13
Arnaud Le Blanc
la source
1
Vous pouvez enregistrer jusqu'à 1 caractère en changeant !=pour -. Vous pouvez également enregistrer jusqu'à 2 caractères en remontant $d->modify('next fri')dans la section incrément de la boucle.
HoLyVieR
Je dois passer au vendredi suivant avant la boucle, au cas où la date indiquée est déjà un vendredi 13 :-) (ou même juste 13)
Arnaud Le Blanc
Utilisez -ret vous n'avez pas besoin de la balise. Utilisez la configuration par défaut avec -net vous n'avez pas besoin @. \nest inutile. echoau lieu d' dieenregistrer un autre octet. strtotimeau lieu de la Dateclasse peut en sauver un ou deux de plus.
Titus
2

C #, 206 194 caractères

Mise à 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.

using System:class p{static void Main(string[]a){var n=a.Length>0?DateTime.Parse(a[0]):DateTime.Now;for(;(n=n.AddDays(5-(int)n.DayOfWeek).AddDays(7)).Day!=13;);Console.Write("{0:yyy-MM-d}",n);}}

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é:

using System;
class p
{
    static void Main(string[] a)
    {
        var n = a.Length > 0 ? DateTime.Parse(a[0]) : DateTime.Now;

        for (; (n = n.AddDays(5 - (int)n.DayOfWeek).AddDays(7)).Day != 13; ) ;

        Console.Write("{0:yyy-MM-d}", n);
    }
}

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.

using System;class p{static void Main(string[]a){var n=a.Length>0?DateTime.Parse(a[0]):DateTime.Now;do n=n.AddDays(1);while(!(n.Day==13&&n.DayOfWeek+""=="Friday"));Console.Write(n.ToString("yyyy-MM-dd"));}}

Non golfé:

using System;
class p
{
    static void Main(string[] a)
    {
        var n = a.Length > 0 ? DateTime.Parse(a[0]) : DateTime.Now;
        do
        {
            n = n.AddDays(1);
        } while (!(n.Day == 13 && n.DayOfWeek + "" == "Friday"));

        Console.Write(n.ToString("yyyy-MM-dd"));
    }
}
Steve
la source
2

R, 113 caractères

f="%Y-%m-%d";o=format;a=c(as.Date(scan(,""),f),Sys.Date())[1];repeat{a=a+1;if(o(a,"%w%d")==513)break};cat(o(a,f))

L'exemple s'exécute:

> f="%Y-%m-%d";o=format;a=c(as.Date(scan(,""),f),Sys.Date())[1];repeat{a=a+1;if(o(a,"%w%d")==513)break};cat(o(a,f))
1: 2007-06-29
2: 
Read 1 item
2007-07-13

> f="%Y-%m-%d";o=format;a=c(as.Date(scan(,""),f),Sys.Date())[1];repeat{a=a+1;if(o(a,"%w%d")==513)break};cat(o(a,f))
1:
Read 0 items
2013-12-13

> f="%Y-%m-%d";o=format;a=c(as.Date(scan(,""),f),Sys.Date())[1];repeat{a=a+1;if(o(a,"%w%d")==513)break};cat(o(a,f))
1: 2013-12-13
2: 
Read 1 item
2014-06-13
plannapus
la source
2

Perl 6 , 69 octets

$_=Date.new(@*ARGS[0]//Date.today);.++while .day*.day-of-week-65;.say

Essayez-le en ligne!

Merci à @ ASCII uniquement pour -5

Ven
la source
Non valide, doit gérer le cas lorsque l'utilisateur ne fournit pas d'argument, égalementday-of-week==5
ASCII uniquement
@ ASCII uniquement corrigé
Ven
Oh oui, cela doit aussi être un programme complet, pas une fonction
ASCII uniquement
Pourrait vouloir créer un lien vers cela (encore mieux, allez-y, esc -> s -> g pour un article bien formaté)
ASCII uniquement
1

Javascript

F13=function(x){
    z=function(x){return (''+x).replace(/^(.)$/,'0$1')}
    D=x?new Date(x):new Date(),Z=864e5,X=D.getDay()%7,X+=+D+(X?Z*(5-X):0);
    do{
        X+=Z*7;
        D=new Date(X);
    }while(D.getDate()!=13)
    return D.getFullYear()+"-"+z(D.getMonth()+1)+"-"+z(D.getDate());
}

ps: oui, je sais, j'ai enfreint la première règle (ça ne pouvait pas être juste une fonction)

Tests sur shell javascript

F13("2013-05-09") // 2013-09-13
2013-09-13
F13("2007-06-29") // 2007-07-13
2007-07-13
F13("2007-07-13") // 2008-06-13
2008-06-13
F13() //2011-05-13
2011-05-13
VOUS
la source
+1 Combattez le langage élitiste à usage général favorisant la règle STDIN.
mootinator
1

T-SQL 359 285 253 caractères

CREATE PROCEDURE f13(@d DateTime=null)AS
SET @d=ISNULL(@d,GETDATE())
;WITH d AS
(SELECT @d+1 d
UNION ALL SELECT d+1 FROM d
WHERE DATEPART(dw,d)<>6 OR DAY(d)<>13)SELECT CAST(d AS DATE) FROM d
WHERE DATEPART(dw,d)=6 AND DAY(d)=13
OPTION (MAXRECURSION 999)

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

f13 '2013-05-09';
GO

f13 '2007-06-29';
GO

f13 '2007-07-13';
GO

f13;
GO
--

d
----------
2013-09-13

d
----------
2007-07-13

d
----------
2008-06-13

d
----------
2011-05-13
mootinator
la source
1

Un autre Javascript, 153

Je poste une autre réponse javascript car je ne peux pas commenter la première ...

a=new Date(process.argv[2]||Date.now());for(b=1;b;b=a.getDate()!=13||!/^F/.test(a))a.setTime(a.getTime()+864e5);console.log(a.toISOString().substr(0,10))

Exécutez avec nodeJS:

$ node fr13th
2013-12-13

$ node fr13th 2007-06-29
2007-07-13

$ node fr13th 2013-05-09
2013-09-13
guy777
la source
1

Python 3.3, 166 caractères

import datetime as d
t=input()
t=d.date(*map(int,t.split()))if t!=""else d.date.today()
while 1:
 t+=d.timedelta(1)
 if t.day==13and t.weekday()==4:
  print(t);break

L'entrée est au format 2013 1 1,

>>> ================================ RESTART ================================
>>> 
2013 1 1
2013-09-13

ou appuyez simplement sur Entrée pour utiliser la date d'aujourd'hui (serait le 2013/12/11 pour cette sortie)

>>> ================================ RESTART ================================
>>> 

2013-12-13

(il y a en fait un mélange de ma solution et de @gnibbler qui compte 144 caractères)

import datetime as d
t=input()
t=d.date(*map(int,t.split()))if t!=""else d.date.today()
while t.day*t.weekday()-65:
 t+=d.timedelta(1)
print(t)

La très belle ligne while t.day*t.weekday()-65:vient de la solution de @ gnibbler.

Roberto
la source
1

Japt, 35 octets

ÐUªKs3 ¯A
@e ¶5©D¶Uf}a@f1Uf Ä
s3 ¯A

-8 octets grâce à @ASCIIOnly!

Essayez!

dana
la source
Format de sortie non valide ...
ASCII uniquement
1
36?
ASCII uniquement
Ouais, je travaille dessus :) Apparemment, toISOStringconvertit en UTC qui change la date
dana
Comment cela change-t-il la date? Est K-ce que l'heure est stockée comme heure locale?
ASCII uniquement
1
Fixe, 39 (enfin, un peu. Il produit le résultat correct pour aujourd'hui à UTC (AFAICT) et c'est assez bon pour moi. Je ne veux pas jouer avec les fuseaux horaires plus que je ne le suis déjà)
ASCII uniquement
1

Swift 4 , 310 octets

import Foundation
let (u,f)=(Calendar.current,DateFormatter())
f.dateFormat="yyyy-MM-dd"
var t={(x:Date)->Int in let c=u.dateComponents([.weekday,.day],from:x);return c.weekday!*c.day!},d=readLine().map{f.date(from:$0)!} ?? Date()
while t(d) != 65{d=u.date(byAdding:.day,value:1,to:d)!}
print(f.string(from:d))

Essayez-le en ligne!

-4 grâce à TagTaco.

Hélas...:

  • a besoin d'une fondation pour la date / le calendrier.
  • Swift ne permet pas d'utiliser Ints commeBool .
  • La syntaxe enum abrégée est utile, mais pas tant que ça.
  • L'espace est nécessaire autour ?? .
  • != a également besoin d'espacement, de peur qu'il ne soit interprété comme un déballage.
Ven
la source
0

VB.net (96c *)

Entrée

Function NextFridayThe13th(d As Date) As Date
  While d.DayOfWeek<>DayOfWeek.Friday
    d=d.AddDays(1)
  End While
  While d.Day<>13
    d=d.AddDays(7)
  End While
  Return d
End Function
  • Je pense que le nombre CodeGolf pour vb.net ne devrait pas inclure la signature de la fonction , la fonction de fin de fermeture et le retour . Il s'agit donc simplement de l'implémentation interne.

Donc, mon score est ventilé comme suit

While d.DayOfWeek<>DayOfWeek.Friday    '35c
d=d.AddDays(1)                         '13c  48c
End While                              ' 9c  57c
While d.Day<>13                        '15c  72c
d=d.AddDays(7)                         '14c  86c
End While                              ' 9c  95c
Return d                               ' 1c  96c
Adam Speight
la source
0

Rebol, 136

d: any[do system/script/args now]until[d: d + 1 all[d/day = 13 d/weekday = 5]]print format/pad[4"-"-2"-"-2]reduce[d/year d/month d/day]

Non golfé:

d: any [do system/script/args  now]

until [
    d: d + 1 
    all [d/day = 13 d/weekday = 5]
]

print format/pad [4 "-" -2 "-" -2] reduce [d/year d/month d/day]

Exemple d'utilisation:

$ rebol friday13th.reb 2013-05-09
2013-09-13
$ rebol friday13th.reb
2014-06-13
draegtun
la source
0

Java 8, 200 197 octets

interface M{static void main(String[]a){java.time.LocalDate z=null,r=a.length<1?z.now():z.parse(a[0]);for(;(r=r.plusDays(1)).getDayOfWeek().getValue()*r.getDayOfMonth()!=65;);System.out.print(r);}}

Explication:

Essayez-le ici (supprimez l'argument pour utiliser la date actuelle).

interface M{                        // Class
  static void main(String[]a){      //  Mandatory main-method
    java.time.LocalDate z=null,     //   LocalDate to reduce bytes when using static calls
     r=a.length<1?                  //   If no argument is given:
        z.now()                     //    Start at the current date
       :                            //   Else:
        z.parse(a[0]);              //    Start at the date of the first argument
    for(;(r=r.plusDays(1))          //   Before every iteration, go to the next day
                                    //   Loop as long as:
         .getDayOfWeek().getValue()
                                    //    the 1-indexed day of the week (Friday = 5)
         *r.getDayOfMonth()         //    multiplied by the day of the month
        !=65;                       //    is not 65
                                    //    (5 and 13 are primes, so only 5*13 results in 65)
    );                              //   End of loop
    System.out.print(r);            //   Print the result Friday the 13th
  }                                 //  End of main-method
}                                   // End of class

REMARQUE: le format par défaut de Java lors de l'impression l'est déjà yyyy-MM-dd.

Kevin Cruijssen
la source
0

05AB1E , 141 octets

gĀi'-¡ëžežfžg)}V[Y`2ô0Kθ4ÖUD2Qi\28X+ë<7%É31α}‹iY¬>0ëY1¾ǝDÅsD12‹i>1ë\1Dǝ¤>2}}ǝVY`UÐ3‹12*+>13*5÷s3‹Xα©т%D4÷®т÷©4÷®·()O7%6QYн13Q*#}YRεDgi0ì]'-ý

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 format yyyy-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:

gĀi        # If an input is given:
   '-¡    '#  Split it by "-"
  ë        # Else:
   že      #  Push today's day
     žf    #  Push today's month
       žg  #  Push today's year
         ) #  Wrap them into a single list
  }V       # After the if-else statement: pop and store it in variable `Y`
[          # Start an infinite loop
 Y`2ô0Kθ4ÖUD2Qi\28X+ë<731α}‹iY¬>0ëY1¾ǝDÅsD12i>1ë\1Dǝ¤>2}}ǝV
           #  Go to the next day
           #  (see my linked The Work Day Countdown answer for an explanation)
 Y`UÐ312*+>13*5÷s3Xα©т%D4÷®т÷©4÷®·()O7%
           #  Calculate the day of the week (0 = Saturday, 1 = Sunday, ..., 6 = Friday)
           #  (see my linked The Work Day Countdown answer for an explanation)
 6Q        #  Check if the day of the week is a Friday
 Yн        #  Push the days of the current date
   13Q     #  Check if it's the 13th
 *         #  And if both checks are truthy:
  #        #   Stop the infinite loop
}YR        # After the infinite loop: push the resulting date-list, and reverse it
ε          # Map each value to:
 Dgi       #  If it's only a single digit:
    0ì     #   Prepend a leading "0"
]          # Close both the if-statement and map
 '-ý      '# Join the result by "-"
           # (and output the result implicitly)
Kevin Cruijssen
la source