Ri-creazioni di logica: soluzione informatica a un quesito con la Susi

Da La Settimana Enigmistica

Quesito con la Susi numero 931

susi931

 

Come risolvere il quesito?
Per trovare la soluzione occorre effettuare il conteggio dei numeri che compaiono nelle ore dall’una (100) a lle dodici (1200) e che corrispondono a un quadrato.

Per calcolare la soluzione utilizzerò uno script che ho allestito in linguaggio JavaScript, un linguaggio standard molto diffuso sul web.

 

Procedura per la soluzione

Come abbiamo detto, devo controllare se il numero è un quadrato, quindi creo la funzione isSquare a cui passerò il parametro ora da controllare.
La funzione isSquare si basa sulla logica secondo la quale un  un quadrato deve essere positivo e  la sua radice quadrata deve essere un numero naturale.

function isSquare(n) {
  
  if (n > 0 && Math.sqrt(n) % 1 === 0) {
    return true;
  } else {

    return false;
  }
}

Ora che la funzione di controllo è pronta, passo a comporre l’elenco delle ore.
Istanzio la varabile numtimes che conterrà il conteggio richiesto dal quesito,
i punti di partenza e di arrivo delle ore e dei minuti, e la variabile che conterrà l’ora da controllare, e la stringa che conterrà l’elenco dei valori.

//Il numero da calcolare
var numTimes = 0;
//l'ora parte dal minuto zero e termina al minuto 59
var startMinutes = 0;
var endMinutes = 59;
//il calcolo deve essere effettuato per i valori dal'una alle 12
var startHours = 1;
var endHours = 12;

//istanzio la variabile ora, che conterrà l'ora da controllare
var hour = 0;
//istanzio la variabile stringa che conterrà l'elenco dei numeri
var string = '';

Ciclo sulle undici ore (dall’una alle dodici) e sui minuti (da 0 a 59).

I minuti saranno concatenati alle ore e devono essere a due cifre, occorre dunque aggiungere uno zero all’inizio del numero se è minore di 10

Ottengo l’ora concatenando le ore ai minuti

//istanzio gli iteratori per i cicli 
var i = 0; var j = 0; 

for (i >= startHours; i <= endHours; i++) { 

  for (j = startMinutes; j <= endMinutes; j++) { 
    n = j; 
    
    if ((j < 10)) { n = '0' + j; } 
 
    hour = parseInt(String(i) + String(n));
   //se l'ora è compresa tra l'una e le dodici...
    if (hour >= 100 && hour <= 1200) {
      //controllo che sia un quadrato usando la funzione isSquare definita sopra
      if (isSquare(hour)) {
        //aggiungo 1 al numero da ritrovare
        numTimes++;
        //inserisco nella stringa della lista l'ora
        string = string + hour + '-';
       
      }
    }
  }
}

//visualizzo in console il numero cercato
console.log('Soluzione:'+numTimes);
// per completezza, visualizzo in console anche l'elenco dei numeri trovati
console.log('Lista orari: ' + string);

 

Eseguo questo codice e in console   visualizzo in un millisecondo la soluzione.

 

Il valore che compare in console è 15, quindi la soluzione al quesito secondo me è 15,

I numeri che compaiono nella serie sono i seguenti;

100-121-144-225-256-324-400-441-529-625-729-841-900-1024-1156

Nel prossimo articolo proverò a risolvere qualche altro quesito della settimana enigmistica utilizzando qualche altro tipo di logica e di linguaggio di programmazione.