giovedì 1 marzo 2012

Le quattro stagioni!

Salve!

 Ieri (qui), il caro Lightuono, in un suo commento, ha lanciato una sfida: Creare uno script che, impostata una data, "dica" in quale delle quattro stagioni essa  si colloca.
Es. Se scrivo 25-12-2012, lo script deve dare come output "inverno." Non solo. Lo script deve "dire" anche se l'anno è bisestile o meno.
A dire il vero, lo script l'ho creato nella serata di ieri ma, per una questione di tempo, non l'ho potuto controllare. Perciò lo pubblico solo adesso.
Nel frattempo è arrivato un altro script, creato da Stefano. Lo potete trovare qui. Lo ringrazio tanto per aver condiviso il suo lavoro!

Premesso che si tratta di pura esercitazione, infatti lo script non risolve alcun problema esistenziale, devo  dire che il mio script presenta delle evidenti limitazioni, cui non ho potuto (e in parte, saputo) provvedere!

Ad esempio, non tiene conto della durata del mese, perciò se scrivete 40-1-2012, lo script vi darà comunque una risposta. :) Certo, avrei potuto usare il comando date, ma non l'ho ritenuto opportuno per un'esercitazione. Avrei potuto usare ulteriori controlli....etc, etc. Poi, per farla breve, ho dato per scontato che l'equinizio di primavera avvenga sempre il 21 marzo; che il solstizio d'estate si abbia sempre il 21 giugno...e tante altre approssimazioni indebite! :)

 #!/bin/bash
function bisestile() {
  if (( (anno % 400) == 0 )) || (( (anno % 4) == 0 && (anno % 100) != 0 )); then
   echo "l'anno $anno è bisestile"
  else
   echo " l'anno $anno non è bisestile"
fi
}

read -p "digita il giorno: " giorno
read -p "digita il mese: " mese
read -p "digita l'anno: " anno

case $mese in

    [1-6])
           if [ $giorno -lt 21 -a $mese -eq 3 ] || [ $mese -lt 3 ]; then
               echo "siamo in inverno"
           elif [ $giorno -eq 21 -a $mese -eq 3 ]; then
               echo "equinozio di primavera"
           elif [ $giorno -eq 21 -a $mese -eq 6 ]; then
               echo "solstizio d'estate"
           elif [ $giorno -ge 21 -a $mese -eq 6 ]; then
               echo "siamo in estate"
           else
              echo "siamo in primavera"
           fi
           bisestile $anno
    ;;
    [7-9])
           if [ $giorno -gt 21 -a $mese -ge 9 ]; then
               echo "siamo in autunno"
           elif [ $giorno -eq 21 -a $mese -eq 9 ]; then
               echo "equinozio d'autunno"
           else
              echo "siamo in estate"
           fi
           bisestile $anno
    ;;
    *)
            if [ $giorno -eq 21 -a $mese -eq 12 ]; then
               echo "solstizio d'inverno"
           elif [ $giorno -ge 21 -a $mese -eq 12 ]; then
               echo "siamo in inverno"
           elif [ $mese -gt 12 ]; then
                echo "hai inserito un mese inesistente"
           else
              echo "siamo in autunno"
           fi
           bisestile $anno
    ;;
esac

exit 0


 Posto che venga salvato nella cartella Documenti e nominato stagioni.sh, basta spostarsi nella directory Documenti

$ cd Documenti

ed eseguirlo

$ bash stagioni.sh

Dimenticavo, il giorno e il mese non devono contenere lo zero davanti! Es. per scrivere gennaio, bisogna usare 1 e non 01; la stessa cosa dicasi per i giorni. :D

A questo punto, ogni altra alternativa per risolvere il non facilissimo quesito, non può che essere gradita. :)

Ciao!

3 commenti:

  1. Ecco la mia versione -> http://toshidex.org/2012/03/02/5-ore-di-mortemale-per-creare-le-quattro-stagioni/

    RispondiElimina
  2. Mi diverte troppo consultare il tuo sito e quello di Lightuono da quando li ho scoperti!
    Come ho commentato anche li: "Ora so che posso avere degli amici!"
    Hhahauaauhuahuh

    Saluti e molti rispetti... XD

    FrankRock

    RispondiElimina