El próximo viernes 13

15

¿Cuál es el programa más corto que puede predecir la próxima vez que el viernes caiga el día 13 del mes?

  • Debe ser un programa de funcionamiento completo (no solo una función / subrutina)
  • Debe imprimir la fecha en el siguiente formato: YYYY-MM-DD
  • Permitir al usuario proporcionar una fecha de inicio como argumento de línea de comando o mediante STDIN
  • Si el usuario no proporciona una fecha de inicio, úsela hoy como fecha de inicio.
  • Si la fecha de inicio es un viernes 13, el programa debe encontrar el próximo viernes 13.

Si tuviera que ejecutar el programa hoy (16 de febrero de 2011) debería obtener el siguiente resultado.

$ ./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
fuente
¿Una 2013-9-13salida estaría bien para el primer ejemplo?
JB
¿Quiere decir que podemos decidir si queremos tomar la fecha como argumento o de STDIN o si necesitamos apoyar a ambos?
sepp2k
@ sepp2k Puede decidir, no necesita admitir ambos, el usuario solo necesita una forma de ingresar una fecha.
Daniel Standage
@JB Sí, dado que hay varias otras soluciones que abordan todos los requisitos, no aceptaría su respuesta como la solución, incluso si fuera la más breve. Eso no significa que su respuesta no fue informativa ... pero sí, tratar con un formato de fecha inconsistente sería frustrante.
Daniel Standage
Bueno, este no es realmente posible con golfscript porque no conoce la fecha de hoy *. Tampoco tiene una biblioteca de fechas, por lo que probablemente sería una respuesta bastante grande de todos modos. (* puede usar ruby ​​eval para obtenerlo, pero también podría usar ruby ​​date lib también)
gnibbler

Respuestas:

6

Windows PowerShell, 74

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

Bastante sencillo. Un bit quizás confuso es el uso de "Get-Date $args" | Invoke-Expressionpara obtener la fecha actual (si $argsestá vacía) o la fecha especificada $argssin generar un error.

Variante de 72 bytes:

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

Sin embargo, lleva años ... esto no incrementa la fecha y hora en un día completo en cada iteración, sino que solo 900 nanosegundos. Pero dos bytes más cortos.

Variante de 67 bytes:

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

Esto es un poco sensible a la configuración regional; Si falla en su máquina, intente configurar su formato de fecha en ISO-8601 de antemano. :-)

Ah, y se puede convertir en 65 bytes al igual que la versión de 72 bytes.

Historia:

  • 2011-02-17 00:33 (92) Primer intento.
  • 2011-02-17 00:35 (85) Se mejoró la obtención de una fecha inicial.
  • 2011-02-17 00:37 (79) Comparó el producto en lugar de día y día de la semana individualmente. Admitido robado de Ventero.
  • 2011-02-17 00:40 (76) Lanzó la primera línea al for. La comparación solo como resta en lugar de la -eqcual ahorra otros dos bytes.
  • 2011-02-17 00:53 (75) La datecadena de formato Unix es un poco más corta.
  • 17/02/2011 11:42 (74) Volvió al patrón de fecha predeterminado pero es yyy-MM-dsuficiente (ya que el año siempre es más largo que tres caracteres y el día siempre es 13. Gracias a Ty Auvil por esto.
Joey
fuente
¿Por qué le pasas "date $ args" a iex? Pruebe solo (date $ args) en su lugar.
Iszi
@Iszi: Esto se usa para implementar "Si el usuario no proporciona una fecha de inicio, úsela hoy como fecha de inicio". regla. Si se pasa una matriz vacía o $nullque Get-Datese obtendrá un error, no la fecha actual. "date $args"|iexsin embargo, se resuelve en la fecha dada $args o en la fecha actual, que es justo lo que queremos aquí.
Joey
4

bash, 75

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

Esto es un poco sensible a la configuración regional; Si falla en su máquina, intente exportde LC_ALL=Cantemano.

$ 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
fuente
4

Ruby, 96 75 caracteres

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

Toma la fecha de stdin. Para no especificar una fecha, presione ctrl-d.

Muchas gracias por la ayuda de Ventero.

Sin 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

Muestra IO:

$ 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
fuente
1
d.wday*d.day==65Es 4 caracteres más corto. Y usted debería ser capaz de reemplazar Date.today.to_scon"thu"
Ventero
En realidad, el uso de un bucle en lugar de un iterador acorta el código de 76 caracteres: require"date";d=Date.parse($*[0]||"thu")+1;d+=1 while d.wday*d.day!=65;$><<d. Y puede leer la fecha de stdin con en getslugar de $*[0]guardar otro carácter (ingrese EOF para obtener el comportamiento predeterminado).
Ventero
@Ventero: Muy bien, gracias.
sepp2k
3

C #, 185

Basado en la solución C # de Andrew Koester , pero muy modificado en el camino. Finalmente llegué a una solución similar a mi solución 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
fuente
2

Perl (y otros), 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 o posterior, ejecuta con -E 'code here'o -M5.010 file. Necesidades date(de coreutils para Linux) y cal(de util-linux)

Ejecución de muestra:

$ 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

No estoy seguro de cuándo se mantiene el cero inicial durante meses antes de octubre. Obviamente se pierde cuando se acerca el año; parece mantenerse cuando la respuesta es solo el próximo mes. Llamemos a eso comportamiento indefinido: ¡hey, esto es jugar al golf!

JB
fuente
2

GOLPETAZO

#!/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

CONCEPTO UTILIZADO:

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

Muestra de 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
fuente
2

C#

240 caracteres ¡C # necesita un modo "ejecutar dentro de una función solamente"!

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

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

Prueba de salida

\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
Encadenar
fuente
2

D: 227 caracteres

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

Más legible:

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 parte divertida es que si bien std.datetime de D hace que este tipo de código sea muy fácil de escribir, también es increíblemente detallado, debido principalmente a los nombres de funciones precisos (y por lo tanto largos). Por lo tanto, la usabilidad y mantenibilidad del código es muy alta, pero su capacidad de codificación es bastante baja.

Jonathan M Davis
fuente
2

Python - 166 caracteres

Lee desde stdin, por lo que debe alimentar una línea en blanco si desea la fecha de hoy

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")
gnibbler
fuente
A menos que me falte algo, esto no cumple con el cuarto requisito (si no se proporciona una fecha, comience desde hoy).
Daniel Standage
@Daniel, perdí esa. 26 golpes más tarde ...
gnibbler
Explosión del pasado lo siento :) Si nos unimos a nuestras soluciones, llegamos a 144 caracteres de colaboración (¡ver más abajo!) :)
Roberto
2

SQLite, 374 caracteres

(Saltos de línea agregados aquí para facilitar la lectura; no incluidos en el recuento).

Se omite el requisito de "Permitir al usuario proporcionar una fecha de inicio como argumento de línea de comando o mediante STDIN" debido a limitaciones técnicas.

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

Las primeras 4 declaraciones crean una tabla (R) con una sola columna que contiene todos los enteros de 0 a 4095.

La quinta declaración construye una tabla (F) de todos los viernes 13 entre 2000-10-13 y 2340-12-13.

La sexta declaración simplemente devuelve el primer viernes 13 después de la fecha actual (UTC).

dan04
fuente
El calendario gregoriano tiene un ciclo de 400 años, no 340 años. ¿O me estoy perdiendo algo aquí?
Joey
No maneja años fuera del rango 2000-2340. Esa fue solo una elección arbitraria.
dan04
2

PHP - 103

(fuerza bruta)

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

Sin golf:

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

Prueba:

$ 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
fuente
1
Puede guardar 1 personaje cambiando !=a -. También puede guardar hasta 2 caracteres subiendo $d->modify('next fri')en la sección de incremento del bucle.
HoLyVieR
Necesito modificar el próximo viernes antes del ciclo, en caso de que la fecha dada ya sea el viernes 13 :-) (o incluso solo el 13)
Arnaud Le Blanc
Use -ry no necesita la etiqueta. Utilice la configuración predeterminada con -ny no necesita @. \nes innecesario echoen lugar de dieguardar otro byte. strtotimeen lugar de Dateclase puede guardar uno o dos más.
Titus
2

C #, 206 194 caracteres

Actualizar

Esta es una versión ligeramente diferente del problema, así que dejé mi otro intento aquí por completo.

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

Aquí, encuentro el viernes de la semana "actual" y luego incrementé en 7 hasta encontrar uno que es 13. También utilicé Joey para el formato de bucle y salida para afeitar algunos caracteres.

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

Esto es similar al anterior de Andrew, pero había suficientes diferencias. Decidí publicar una respuesta por separado en lugar de comentar y sugerir ediciones.

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

Sin 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
fuente
2

R, 113 caracteres

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

Ejecuciones de ejemplo:

> 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
fuente
2

Perl 6 , 69 bytes

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

Pruébalo en línea!

Gracias a @ ASCII-only por -5

Ven
fuente
No válido, necesita manejar el caso cuando el usuario no proporciona un argumento, tambiénday-of-week==5
solo ASCII
@ Solo ASCII arreglado
Ven
Ah, sí, también tiene que ser un programa completo, no una función
solo ASCII el
Es posible que desee vincular a esto (aún mejor, vaya allí, esc -> s -> g para una publicación bien formateada)
solo ASCII
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: sí, lo sé, rompí la primera regla (no podría ser solo una función)

Pruebas en javascript shell

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

fuente
+1 Combate el lenguaje elitista de propósito general que favorece la regla STDIN.
mootinator
1

T-SQL 359 285 253 caracteres

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)

Solo quería echar un vistazo a la solución SQLite con mi función de fecha detallada no inteligente usando el procedimiento T-SQL.

Actualización: Mi temor original de que hacer un incremento de un día tomaría más espacio que un incremento de un mes era muy incorrecto.

Resultados de la prueba (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
fuente
1

Otro Javascript, 153

Publico otra respuesta de JavaScript porque no puedo comentar la primera ...

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

Ejecutar con nodeJS:

$ node fr13th
2013-12-13

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

$ node fr13th 2013-05-09
2013-09-13
guy777
fuente
1

Python 3.3, 166 caracteres

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

La entrada está en el formato 2013 1 1,

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

o simplemente presione enter para usar la fecha de hoy (sería 2013/12/11 para esta salida)

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

2013-12-13

(en realidad, hay una mezcla de mi solución y la de @gnibbler que cuenta 144 caracteres)

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 línea muy bonita while t.day*t.weekday()-65:es de la solución de @ gnibbler.

Roberto
fuente
1

Japt, 35 bytes

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

-8 bytes gracias a @ASCIIOnly!

¡Intentalo!

dana
fuente
Formato de salida no válido ...
ASCII de sólo
1
36?
Solo ASCII el
Sí, estoy trabajando en eso :) Aparentemente se toISOStringconvierte a UTC, lo que cambia la fecha
dana
¿Cómo cambia la fecha? ¿ KAlmacena la hora como hora local?
Solo ASCII el
1
Solucionado, 39 (bueno, algo así. Produce el resultado correcto para hoy en UTC (AFAICT) y eso es lo suficientemente bueno para mí. No quiero meterme con las zonas horarias más de lo que ya soy)
ASCII solo el
1

Swift 4 , 310 bytes

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

Pruébalo en línea!

-4 gracias a TagTaco.

Pobre de mí...:

  • necesita Fundación para Fecha / Calendario.
  • Swift no permite Intque se use s como Bool.
  • La sintaxis enum abreviada es útil, aunque no tanto.
  • Se requiere espacio alrededor ??.
  • != también necesita espacio, para que no se interprete como un desenvolvimiento.
Ven
fuente
0

VB.net (96c *)

Entrada

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
  • Creo que el recuento CodeGolf para vb.net no debe incluir la firma de la función , el cierre de la función final y el retorno . Por lo tanto, solo se trata de la implementación interna.

Entonces mi puntuación se desglosa así

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
fuente
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]

Sin 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]

Ejemplo de uso:

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

Java 8, 200 197 bytes

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

Explicación:

Pruébelo aquí (elimine el argumento para usar la fecha actual).

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

NOTA: El formato predeterminado de Java cuando la impresión ya está yyyy-MM-dd.

Kevin Cruijssen
fuente
0

05AB1E , 141 bytes

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 no tiene ninguna función integrada para los objetos o cálculos de fecha. Lo único que incluye las fechas que tiene es el año / mes / día / horas / minutos / segundos / microsegundos de hoy.

Por eso, casi todo el código que ves son cálculos manuales para ir al día siguiente y calcular el día de la semana.

Principalmente derivado de mi respuesta 05AB1E en el desafío The Work Day Countdown (por eso lo edité hace aproximadamente una hora cuando me encontré con un error ...)

La entrada es una cadena en el formato dd-MM-yyyy(pero la salida está en el formato yyyy-MM-dd, ya que es una de las reglas del desafío).

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

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
fuente