Scala: valore assoluto

Prendendo spunto da un Kata trovato su Codewars vediamo come si può calcolare il valore assoluto in Scala. Il Kata, che trovate a questo link, chiedeva di calcolare, dati in input l’età del padre e quella del figlio, quanti anni fa il padre aveva il doppio degli anni del figlio. Detta così è un po’ contorta, ma vediamo i test che il nostro codice dovrà superare:

class ExampleSpec extends FlatSpec with Matchers {
  "twice_as_old(36, 7)" should "return 22" in {
    Sol.twice_as_old(36, 7) should be (22)
  }
  "twice_as_old(55, 30)" should "return 5" in {
    Sol.twice_as_old(55, 30) should be (5)
  }
  "twice_as_old(42, 21)" should "return 0" in {
    Sol.twice_as_old(42, 21) should be (0)
  }  
  "twice_as_old(22, 1)" should "return 20" in {
    Sol.twice_as_old(22, 1) should be (20)
  }
  "twice_as_old(29, 0)" should "return 29" in {
    Sol.twice_as_old(29, 0) should be (29)
  }   
}

Prendendo la prima riga, dobbiamo calcolare quanti anni fa il padre aveva 14 anni. Siccome ne ha 36 ecco che il valore che dobbiamo trovare è 22, che si ottiene facendo 36 – 7*2, vale a dire <em>etàDelPadre – etàDelFiglio*2</em>. Funziona bene dappertutto, tranne che per il secondo test. 55-30*2 infatti fa -5, quindi la nostra soluzione dovrà prendere questa differenza in valore assoluto. Ci sono due modi per farlo:

object Sol { 

    def twice_as_old(dad: Int, son: Int) = {
      val result = Math.abs(dad-2*son)
      result
    }
}

Molto simile a quello che faremmo in Java. E’ possibile dare una snellita al codice? Certamente. Intanto possiamo restituire direttamente Math.abs(…), ma non solo: abs è una funzione del tipo int, quindi il nostro codice può essere scritto in una sola riga così:

 
object Sol { 
    def twice_as_old(dad: Int, son: Int) = {
      (dad-2*son).abs
    }
}

 

 

Pierpaolo Paris

Sono uno dei tanti che sono entrati nel girone infernale di Ingegneria Informatica, e che poi ne è anche uscito. Attualmente lavoro come sviluppatore presso una società di consulenza. Ogni tanto mi diletto con la fotografia.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.