Venerdì prossimo 13


15

Qual è il programma più breve che può prevedere la prossima volta che venerdì cadrà il 13 ° giorno del mese?

  • Deve essere un programma operativo completo (non solo una funzione / subroutine)
  • È necessario stampare la data nel seguente formato: YYYY-MM-DD
  • Consenti all'utente di fornire una data di inizio come argomento della riga di comando o tramite STDIN
  • Se l'utente non fornisce alcuna data di inizio, utilizzare oggi come data di inizio.
  • Se la data di inizio è un Venerdì 13, il programma dovrebbe trovare il prossimo Venerdì 13.

Se dovessi eseguire il programma oggi (16 febbraio 2011) dovrei ottenere il seguente output.

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

Un 2013-9-13output andrebbe bene per il primo esempio?
JB,

Vuoi dire che possiamo decidere se vogliamo prendere la data come argomento o da STDIN o se dobbiamo supportare entrambi?
sepp2k,

@ sepp2k Puoi decidere, non è necessario supportare entrambi, l'utente ha solo bisogno di un modo per inserire una data.
Daniel Standage,

@JB Sì, poiché ci sono molte altre soluzioni che soddisfano tutti i requisiti, non accetterei la tua risposta come soluzione anche se fosse la più breve. Ciò non significa che la tua risposta non sia stata istruttiva ... ma sì, gestire un formato data incoerente sarebbe frustrante.
Daniel Standage,

Bene, questo non è davvero possibile con golfscript perché non conosce la data di oggi *. Inoltre non ha una libreria di date, quindi probabilmente sarebbe una risposta abbastanza grande. (* puoi usare ruby ​​eval per ottenerlo, ma poi potresti usare anche ruby ​​date lib)
gnibbler,

Risposte:


6

Windows PowerShell, 74

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

Abbastanza semplice. Un bit forse confuso è l'uso di "Get-Date $args" | Invoke-Expressionper ottenere la data corrente (se $argsè vuota) o la data specificata $argssenza generare un errore.

Variante a 72 byte:

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

Ci vogliono anni, però ... questo non incrementa il datetime di un giorno intero ogni iterazione ma invece solo 900 nanosecondi. Ma due byte in meno.

Variante a 67 byte:

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

Questo è un po 'sensibile alle impostazioni locali; se non funziona sulla tua macchina, prova a impostare il formato della data su ISO-8601 in anticipo. :-)

Oh, e può essere trasformato in 65 byte proprio come la versione a 72 byte.

Storia:

  • 17/02/2011 00:33 (92) Primo tentativo.
  • 17/02/2011 00:35 (85) Migliorata la ricezione di una data iniziale.
  • 17/02/2011 00:37 (79) Rispetto al prodotto anziché al giorno e al giorno della settimana singolarmente. Certamente rubato da Ventero.
  • 17/02/2011 00:40 (76) Tirato la prima riga in for. Confronto come sottrazione invece del -eqquale salva altri due byte.
  • 17/02/2011 00:53 (75) La datestringa in formato Unix è un po 'più corta.
  • 17/02/2011 11:42 (74) Ripristinato al modello di data predefinito ma è yyy-MM-dsufficiente (poiché l'anno è sempre più lungo di tre caratteri e il giorno è sempre 13. Grazie a Ty Auvil per questo.

Perché stai passando "date $ args" a iex? Prova solo (date $ args) invece.
Iszi,

@Iszi: viene utilizzato per implementare "Se l'utente non fornisce alcuna data di inizio, utilizzare oggi come data di inizio". regola. Se si passa un array vuoto o $nullal Get-Datesi otterrà un errore, non la data corrente. "date $args"|iextuttavia, risolve la data indicata $args o la data corrente, che è esattamente ciò che vogliamo qui.
Joey,

4

bash, 75

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

Questo è un po 'sensibile alle impostazioni locali; se non riesce sulla vostra macchina, provare exporting LC_ALL=Canticipo.

$ 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

Rubino, 96 75 caratteri

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

Prende la data da stdin. Per non specificare una data premere ctrl-d.

Grazie mille per l'aiuto di 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 di esempio:

$ 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è più corta di 4 caratteri. E dovresti essere in grado di sostituire Date.today.to_scon"thu"
Ventero il

In realtà utilizzando un ciclo invece di un iteratore accorcia il codice a 76 caratteri: require"date";d=Date.parse($*[0]||"thu")+1;d+=1 while d.wday*d.day!=65;$><<d. E puoi leggere la data da stdin con getsinvece di $*[0]salvare un altro personaggio (inserisci EOF per ottenere il comportamento predefinito).
Ventero,

@Ventero: Molto bello, grazie.
sepp2k,

3

C #, 185

Basato sulla soluzione C # di Andrew Koester , ma fortemente modificato lungo la strada. Alla fine sono arrivato a una soluzione simile alla mia soluzione 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 altri), 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 successivo, esegui con -E 'code here'o -M5.010 file. Necessità date(da coreutils per Linux) e cal(da util-linux)

Esecuzione di esempio:

$ 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

Non sono sicuro quando verrà mantenuto lo zero iniziale per mesi prima di ottobre. Ovviamente si perde quando finisce l'anno; sembra essere mantenuto quando la risposta è proprio il mese prossimo. Chiamiamo quel comportamento indefinito - ehi, questo è golf!


2

BASH

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

CONCETTO USATO:

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

I / O CAMPIONE

:~/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 caratteri. C # ha bisogno di una modalità "esegui solo una funzione"!

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

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

Uscita di prova

\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 personaggi

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

Più leggibilmente:

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 divertente è che mentre std.datetime di D rende questo tipo di codice molto facile da scrivere, è anche incredibilmente dettagliato, principalmente grazie ai nomi precisi (e quindi lunghi) delle funzioni. Pertanto, l'usabilità e la manutenibilità del codice sono molto elevate, ma la sua golfabilità del codice è piuttosto bassa.


2

Python - 166 caratteri

Legge da stdin, quindi è necessario alimentare una riga vuota se si desidera la data odierna

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 meno che non mi manchi qualcosa, questo non risponde al quarto requisito (se non viene fornita alcuna data, inizia da oggi).
Daniel Standage,

@Daniel, mancava quello. 26 colpi dopo ...
Gnibbler,

Spavento dal passato scusa :) Se ci uniamo alle nostre soluzioni, arriviamo a 144 caratteri collaborativi (vedi sotto!) :)
Roberto,

2

SQLite, 374 caratteri

(Le interruzioni di riga aggiunte qui per la leggibilità; non incluse nel conteggio.)

Requisito "Consenti all'utente di fornire una data di inizio come argomento della riga di comando o tramite STDIN" omesso a causa di limitazioni tecniche.

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

Le prime 4 istruzioni creano una tabella (R) con una singola colonna contenente tutti gli interi da 0 a 4095.

La quinta affermazione costruisce una tabella (F) di tutto il venerdì 13 tra il 2000-10-13 e il 2340-12-13.

La sesta dichiarazione restituisce semplicemente il primo venerdì 13 dopo la data corrente (UTC).


Il calendario gregoriano ha un ciclo di 400 anni, non 340 anni. O mi sto perdendo qualcosa qui?
Joey,

Non gestisce anni al di fuori dell'intervallo 2000-2340. È stata solo una scelta arbitraria.
dan04,

2

PHP - 103

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

Test:

$ 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
Puoi salvare fino a 1 carattere cambiando !=in -. Inoltre puoi salvare fino a 2 caratteri spostando in alto $d->modify('next fri')nella sezione incrementale del loop.
HoLyVieR,

Devo modificare il prossimo venerdì prima del loop, nel caso in cui la data indicata sia già un venerdì 13 :-) (o anche solo 13)
Arnaud Le Blanc,

Usa -re non hai bisogno del tag. Usa la configurazione predefinita con -ne Non è necessario @. \nnon è necessario. echoinvece di diesalvare un altro byte. strtotimeinvece di Dateclasse può salvare uno o due più.
Tito

2

C #, 206 194 caratteri

Aggiornare

Questa è una versione leggermente diversa del problema, quindi ho lasciato il mio altro tentativo qui per intero.

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

Qui sto trovando la settimana "corrente" del venerdì e poi aumentando di 7 fino a quando non ne trovo uno che è 13. Ho anche usato Joey's per la formattazione di loop e output per radere alcuni caratteri.

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

Originale:

Questo è simile a quello di Andrew sopra, ma c'erano abbastanza differenze che ho deciso di pubblicare una risposta separata piuttosto che commentare e suggerire modifiche.

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 caratteri

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

Esempi di esecuzione:

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

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

Provalo online!

Grazie a @ ASCII solo per -5


Non valido, deve gestire il caso quando l'utente non fornisce un argomento, ancheday-of-week==5
ASCII

@ Risolto solo ASCII
Ven

Oh sì, deve anche essere un programma completo, non una funzione
solo ASCII

Potrebbe voler collegarti a questo (ancora meglio, vai lì, esc -> s -> g per un post ben formattato)
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 so, ho infranto la prima regola (non poteva essere solo una funzione)

Test su 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 Combatti la lingua elitaria per scopi generali che favorisce la regola STDIN.
Mootinator

1

T-SQL 359 285 253 caratteri

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)

Volevo solo posare lo smack sulla soluzione SQLite con la mia funzione di data dettagliata non intelligente usando la procedura T-SQL.

Aggiornamento: il mio timore originale che fare un incremento del giorno avrebbe richiesto più spazio di un incremento del mese era molto errato.

Risultati del test (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

Un altro Javascript, 153

Pubblico un'altra risposta javascript perché non posso commentare la prima ...

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

Eseguire con 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 caratteri

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'input è nel formato 2013 1 1,

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

oppure premi Invio per utilizzare la data di oggi (sarebbe 2013/12/11 per questo output)

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

2013-12-13

(in realtà c'è un mix tra la mia soluzione e quella di @gnibbler che conta 144 caratteri)

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 linea molto bella while t.day*t.weekday()-65:è dalla soluzione di @ gnibbler.


1

Japt, 35 byte

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

-8 byte grazie a @ASCIIOnly!

Provalo!


Formato di output non valido ...
ASCII


Sì, ci sto lavorando :) Apparentemente si toISOStringconverte in UTC che cambia la data
dana

Come cambia la data? Fa Kvolta negozio come ora locale?
ASCII

1
Risolto, 39 (beh, un po '. Produce il risultato corretto per oggi a UTC (AFAICT) e questo è abbastanza buono per me. Non voglio fare confusione con i fusi orari più di quanto lo sia già)
ASCII

1

Swift 4 , 310 byte

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

Provalo online!

-4 grazie a TagTaco.

Ahimè ...:

  • ha bisogno di Foundation for Date / Calendar.
  • Swift non consente Intdi usare s come Bool.
  • La sintassi dell'enum stenografia è utile, anche se non molto.
  • Lo spazio è richiesto in giro ??.
  • != ha anche bisogno di spazio, per non essere interpretato come un involucro.

0

VB.net (96c *)

Iscrizione

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
  • Penso che il conteggio di CodeGolf per vb.net non dovrebbe includere la firma della funzione , la chiusura della funzione di fine e il ritorno . Quindi si occupa solo dell'implementazione interna.

Quindi il mio punteggio è suddiviso in questo modo

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]

Esempio di utilizzo:

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

0

Java 8, 200 197 byte

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

Spiegazione:

Provalo qui (rimuovi l'argomento per usare la data corrente).

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: il formato predefinito di Java quando la stampa è già yyyy-MM-dd.


0

05AB1E , 141 byte

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 non ha alcun builtin per oggetti Date o calcoli. L'unico elemento incorporato relativo alle date che ha è l'anno / mese / giorno / ore / minuti / secondi / microsecondi di oggi.

Per questo motivo, quasi tutto il codice che vedi sono calcoli manuali per passare al giorno successivo e calcolare il giorno della settimana.

Derivato principalmente dalla mia risposta 05AB1E nella sfida Il conto alla rovescia della giornata lavorativa (motivo per cui l'ho modificato circa un'ora fa quando ho riscontrato un bug ..)

L'input è una stringa nel formato dd-MM-yyyy(ma l'output è nel formato yyyy-MM-dd, poiché è una delle regole della sfida).

Provalo online o verifica tutti i casi di test .

Spiegazione:

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.