Contest 2020: Anno bisestile

…che dire 9 anni dall’ultimo contest sono troppi, quindi apriamone un’altro.

Tempo fa stavo giocando con le date e mi son trovato a dover capire se l’anno

è bisestile o no.

Non ricordando la formuletta canonica, faccio una ricerca su internet e la trovo al volo.


Di solito apro sempre quasi tutti i link della prima pagina della ricerca,
non si sa mai cos’altro si può trovare, ed in effetti anche stavolta ho trovato
una pepita bella grossa.

Quindi il problema da risolvere è questo:

come si può determinare se un anno è bisestile senza implementare la formuletta canonica?

Tenete bene mente: stiamo usando un computer e qualcuno l’ha già implementata per conto nostro, che si usi bash, python, c, perl, ruby o quello che più vi piace qualcuno l’ha già fatto, altrimenti non sarebbe possibile fare questo

cal 2 2012
cal 2 2010

La soluzione deve potersi applicare a tutti i linguaggi, (in uno shell script si dovrà usare un solo comando, ma esiste?).

Suggerimento: è probabile che l’autore della pepita abbia ragionato in modo diverso dal solito e invece di chiedersi come faccio a calcolare… si sia chiesto in cosa…

Cosa si vince?

per ora un applauso da tutti, se poi riusciamo ad organizzare un pizzata…
una bottiglia di Brunello e una di Greco di Tufo

Buon bevuta al vincitore.

R.

P.S.

frafra posso inviarti la soluzione così puoi fare da arbitro imparziale?

Ciao

Beh per una bottiglia di Greco di Tufo mi ci butto ma la soluzione mi sembra decisamente troppo semplice per essere quella giusta.

int Year;
bool Bisesto = (DaysBetween("01/01/"+IntToStr(Year),"01/01/"+IntToStr(Year+1))-365);

Ma probabilmente non ho capito bene i termini del problema.

Ciao Ciao, Moreno

Arbitro imparziale? Voglio anche io collaborare :smiley: Mettiamole qui e poi serenamente valutiamo magari :slight_smile:

Ecco la mia:

y=2020
((y%400==0 || y%100>0 && y%4==0)) || echo -n 'non '; echo 'bisestile'

Probabilmente si può ottimizzare un po’ :slight_smile:

è già ottimizzata, solo che non è questa la soluzione.
visto che hai usato bash, non si tratta di applicare la formuletta canonica, ma di trovare quel comando che ti da la risposta corretta (cal non quello giusto)

Puoi partecipare tranquillamente, non c’è problema, ma la soluzione te la mando lo stesso
anche perchè è crittografata e la chiave è proprio quel comando che devi usare per sapere se il 2002 è un anno bisestile.
(è un problema se ti mando un link su mega.nz)?

Nessun problema, non è facile spiegarsi bene, potrai non aver capito bene ma in ogni caso hai avuto un’intuizione:

calcolare il numero di giorni dal 1/1/x all 1/1/x+1 e togliere 365

Visto che hai usato il pascal, direi che… continui ad aggiungere qualcosa che potresti benissimo evitare visto quello che offre (almeno il free pascal).

un piccolo sforzo e potresti vincere

Ciao

Ehm, non è pascal è C, anche se le librerie sono praticamente le stesse.

Seguendo la scia si può semplificare in:

 int Year = 2012;
 bool Bisesto = (bool) DaysInAYear(Year)-365;

Ho fatto un po’ di controlli e in un modo o nell’altro l’equivalente di questo comando è presente in tutti i linguaggi che conosco.

Esiste anche una funzione più generale IsLeap ma richiede la definizione di un oggetto tempo ed alla fine risulta più complicata (almeno nel caso specifico delle librerie che uso io).

Ciao Ciao, Moreno

Ok, scusa, ho frainteso :slight_smile:

y=2020
((`date -d "$y-3-1" +%-j`/61)) || echo -n 'non '; echo 'bisestile'

In parole povere, se il primo marzo è il 61esimo (o successivo) giorno dell’anno, allora l’anno è bisestile.