Próxima sexta-feira 13


15

Qual é o programa mais curto que pode prever a próxima vez que a sexta-feira cair no 13º dia do mês?

  • Deve ser um programa completo de funcionamento (não apenas uma função / sub-rotina)
  • É necessário imprimir a data no seguinte formato: YYYY-MM-DD
  • Permitir que o usuário forneça uma data de início como argumento de linha de comando ou por meio de STDIN
  • Se o usuário não fornecer uma data de início, use hoje como a data de início.
  • Se a data de início for sexta-feira 13, o programa deverá encontrar as próximas sexta-feira 13.

Se eu fosse executar o programa hoje (16 de fevereiro de 2011), obteria a seguinte saída.

$ ./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

Uma 2013-9-13saída seria boa para o primeiro exemplo?
JB

Quer dizer que podemos decidir se queremos considerar a data como argumento ou com o STDIN ou se precisamos apoiar os dois?
sepp2k

@ sepp2k Você pode decidir, não precisa dar suporte a ambos, o usuário só precisa de uma maneira de inserir uma data.
Daniel Standage

@JB Sim, como existem várias outras soluções que atendem a todos os requisitos, eu não aceitaria sua resposta como a solução, mesmo que fosse a mais curta. Isso não significa que sua resposta não foi informativa ... mas sim, lidar com um formato de data inconsistente seria frustrante.
Daniel Standage

Bem, este não é realmente possível com o golfscript porque ele não sabe a data de hoje *. Ele também não possui uma biblioteca de datas e, portanto, provavelmente seria uma resposta bastante grande. (* você pode usar ruby eval para obtê-lo, mas, em seguida, poderia muito bem usar ruby lib data também)
gnibbler

Respostas:


6

Windows PowerShell, 74

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

Bastante direto. Um bit talvez confuso é o uso de "Get-Date $args" | Invoke-Expressionpara obter a data atual (se $argsestiver vazia) ou a data especificada $argssem gerar um erro.

Variante de 72 bytes:

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

Porém, leva séculos ... isso não aumenta a data e hora em um dia inteiro a cada iteração, mas apenas em 900 nanossegundos. Mas dois bytes mais curtos.

Variante de 67 bytes:

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

Isso é um pouco sensível ao código do idioma; se falhar na sua máquina, tente definir o formato da data para ISO-8601 previamente. :-)

Ah, e pode ser convertido em 65 bytes, como na versão de 72 bytes.

História:

  • 2011-02-17 00:33 (92) Primeira tentativa.
  • 2011-02-17 00:35 (85) Melhorado a obtenção de uma data inicial.
  • 2011-02-17 00:37 (79) Comparou o produto em vez de dia e dia da semana individualmente. É certo que roubado de Ventero.
  • 2011-02-17 00:40 (76) Puxou a primeira linha para o for. Comparação apenas como subtração, em vez de -eqque salva outros dois bytes.
  • 17-02-2011 00:53 (75) A datestring de formato Unix é um pouco menor.
  • 17-02-2011 11:42 (74) Revertida para o padrão de data padrão, mas yyy-MM-dé suficiente (já que o ano é sempre superior a três caracteres e o dia é sempre 13. Agradecemos a Ty Auvil por isso.

Por que você está passando "date $ args" para iex? Tente apenas (date $ args).
Iszi

@ Iszi: Isso é usado para implementar o "Se o usuário não fornecer uma data de início, use hoje como a data de início". regra. Se você passar um array vazio ou $nullpara Get-Datevocê receber um erro, não a data atual. "date $args"|iexno entanto, resolve para a data indicada $args ou a data atual, que é exatamente o que queremos aqui.
Joey

4

festança, 75

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

Isso é um pouco sensível à localidade; se ele falhar em sua máquina, tente exporting LC_ALL=Cantemão.

$ 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

4

Ruby, 96 75 caracteres

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

Toma a data de stdin. Para não especificar uma data, pressione ctrl-d.

Muito obrigado pela ajuda de Ventero.

Ungolfed:

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

IO de amostra:

$ 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

1
d.wday*d.day==65é 4 caracteres mais curto. E você deve ser capaz de substituir Date.today.to_spor"thu"
Ventero 16/02

Na verdade, utilizando um ciclo, em vez de uma iteração encurta o código de 76 caracteres: require"date";d=Date.parse($*[0]||"thu")+1;d+=1 while d.wday*d.day!=65;$><<d. E você pode ler a data de stdin com, em getsvez de $*[0]salvar outro caractere (insira EOF para obter o comportamento padrão).
Ventero

@ Ventero: Muito bom, obrigado.
sepp2k

3

C #, 185

Baseado na solução C # de Andrew Koester , mas bastante modificado ao longo do caminho. Acabei por chegar a uma solução semelhante à minha solução 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);}}

2

Perl (e outros), 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 posterior, execute com -E 'code here'ou -M5.010 file. Necessidades date(do coreutils para Linux) e cal(do util-linux)

Exemplo de execução:

$ 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

Não tenho certeza de quando é mantido o zero inicial nos meses anteriores a outubro. Obviamente está perdido quando o ano passa; parece ser mantido quando a resposta é apenas no próximo mês. Vamos chamar esse comportamento indefinido - ei, isso é golfe!


2

BATER

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

CONCEITO USADO:

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

E / S DE AMOSTRA

:~/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

2

C #

240 caracteres. O C # precisa de um modo "executar somente dentro de uma função"!

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

Sem golfe:

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

Saída de teste

\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

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

Mais legivelmente:

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

A parte divertida é que, enquanto o std.datetime do D torna esse tipo de código muito fácil de escrever, também é incrivelmente detalhado - devido principalmente aos nomes de funções precisos (e, portanto, longos). Portanto, a usabilidade e a capacidade de manutenção do código são muito altas, mas a capacidade de golfabilidade do código é bastante baixa.


2

Python - 166 caracteres

Lê stdin, então você precisa alimentar uma linha em branco se desejar a data de hoje

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

A menos que esteja faltando algo que não atenda ao quarto requisito (se nenhuma data for fornecida, comece a partir de hoje).
Daniel Standage

@ Daniel, perdeu essa. 26 traços mais tarde ...
gnibbler

Explosão do passado desculpe :) Se juntarmos nossas soluções, chegamos a 144 caracteres colaborativos (veja abaixo!) :)
Roberto

2

SQLite, 374 caracteres

(Quebras de linha adicionadas aqui para facilitar a leitura; não incluídas na contagem.)

Requisito para "Permitir que o usuário forneça uma data de início como argumento de linha de comando ou por meio de STDIN" omitido devido a limitações 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');

As primeiras 4 instruções criam uma tabela (R) com uma única coluna contendo todos os números inteiros de 0 a 4095.

A 5ª declaração cria uma tabela (F) de todas as sextas-feiras 13 entre 2000-10-13 e 2340-12-13.

A sexta instrução simplesmente retorna a primeira sexta-feira 13 antes da data atual (UTC).


O calendário gregoriano tem um ciclo de 400 anos, não 340 anos. Ou estou faltando alguma coisa aqui?
Joey

Ele não suporta anos fora do intervalo 2000-2340. Essa foi apenas uma escolha arbitrária.
dan04

2

PHP - 103

(força bruta)

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

Ungolfed:

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

Teste:

$ 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

1
Você pode salvar um caractere alterando !=para -. Além disso, você pode salvar até 2 caracteres, movendo-o para cima $d->modify('next fri')na seção de incremento do loop.
21711 HoLyVieR

Preciso modificar para a próxima sexta-feira antes do loop, caso a data especificada já seja uma sexta-feira 13 :-) (ou mesmo apenas 13) #
Arnaud Le Blanc

Use -re você não precisa da tag. Use a configuração padrão com -ne Você não precisa @. \né desnecessário. echoem vez de diesalvar outro byte. strtotimeem vez de Dateclasse, pode salvar mais um ou dois.
Titus

2

C #, 206 194 caracteres

Atualizar

Esta é uma visão um pouco diferente do problema, por isso deixei minha outra tentativa aqui na íntegra.

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

Aqui, estou encontrando a sexta-feira da semana "atual" e, em seguida, aumentando em 7 até encontrar uma que seja 13. Eu também usei o Joey's para formatação de loop e saída para raspar alguns caracteres.

Ungolfed:

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:

Isso é semelhante ao de Andrew acima, mas havia diferenças suficientes. Decidi postar uma resposta separada em vez de comentar e sugerir edições.

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

Ungolfed:

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

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

Exemplo é executado:

> 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

2

Perl 6 , 69 bytes

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

Experimente online!

Graças a @ ASCII-only for -5


Inválido, precisa lidar com o caso quando o usuário não fornece um argumento, tambémday-of-week==5
ASCII-only

@ ASCII-only fixed
Ven

Ah, sim, ele também tem que ser um programa completo, não uma função
ASCII-only

Pode querer link para este (melhor ainda, vá lá, esc -> s -> g para um post bem formatado)
ASCII-only


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: sim, eu sei, quebrei a primeira regra (não poderia ser apenas uma função)

Testes no 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

+1 Lute contra a linguagem elitista de propósito geral, favorecendo a regra 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)

Eu só queria definir a solução SQLite com minha função de data detalhada não inteligente usando o procedimento T-SQL.

Atualização: Meu medo original de que fazer um incremento de um dia levasse mais espaço do que um incremento de um mês estava muito incorreto.

Resultados do teste (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

1

Outro Javascript, 153

Postei outra resposta javascript porque não posso comentar a primeira ...

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

Execute com nodeJS:

$ node fr13th
2013-12-13

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

$ node fr13th 2013-05-09
2013-09-13

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

A entrada está no formato 2013 1 1,

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

ou apenas pressione enter para usar a data de hoje (seria 11/12/2013 para esta saída)

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

2013-12-13

(na verdade, há uma mistura da minha solução e da @gnibbler que conta 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)

A linha muito legal while t.day*t.weekday()-65:é da solução @ gnibbler.


1

Japt, 35 bytes

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

-8 bytes graças a @ASCIIOnly!

Tente!


Formato de saída inválido ...
somente ASCII


Sim, eu estou trabalhando nisso :) Aparentemente toISOStringconvertidos ao UTC, que altera a data
dana

Como isso muda a data? Faz Ktempo loja como tempo local?
somente ASCII em

1
Corrigido, 39 (bem, meio que. Ele gera o resultado correto para hoje no UTC (AFAICT) e isso é bom o suficiente para mim. Não quero mexer com os fusos horários mais do que eu já sou)
ASCII-only

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

Experimente online!

-4 graças ao TagTaco.

Infelizmente ...:

  • precisa da Foundation for Date / Calendar.
  • Swift não permite que Ints sejam usados ​​comoBool .
  • A sintaxe da enumeração abreviada é útil, embora não tanto.
  • É necessário espaço ao redor ??.
  • != também precisa de espaçamento, para que não seja interpretado como um desembrulhamento.

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
  • Eu acho que a contagem de CodeGolf para vb.net não deve incluir a assinatura da função , a função final de fechamento e o retorno . Por isso, trata-se apenas da implementação interna.

Então minha pontuação é dividida assim

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

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]

Ungolfed:

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]

Exemplo de uso:

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

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

Explicação:

Experimente aqui (remova o argumento para usar a data atual).

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: O formato padrão do Java ao imprimir já é yyyy-MM-dd.


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 não possui nenhum built-in para objetos ou cálculos de data. O único construído em relação às datas que possui é o ano / mês / dia / hora / minutos / segundos / microssegundos de hoje.

Portanto, por causa disso, quase todo o código que você vê são cálculos manuais para ir para o dia seguinte e calcular o dia da semana.

Principalmente derivado da minha resposta 05AB1E no desafio The Work Day Countdown (foi por isso que editei essa pergunta cerca de uma hora atrás, quando me deparei com um bug ..)

Entrada é uma sequência no formato dd-MM-yyyy(mas a saída está no formatoyyyy-MM-dd , pois é uma das regras do desafio).

Experimente online ou verifique todos os casos de teste .

Explicação:

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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.