Robitex's Blog

Ideas in the web

Numeri in lettere in Go


Scarica l’articolo in formato pdf

Sommario

Un nuovo linguaggio di sviluppo si è affacciato sulle scene: è il Go. In questo post non spiegherò come installare Go sul sistema, né come compilare il sorgente od il perché compaiono certe espressioni. Vorrei piuttosto proporre di assaporare questo nuovo piatto del grande libro di ricette, informatiche s’intende.

Di nuovo numeri in lettere…

Avevamo già preso in considerazione il problema di tradurre numeri in lettere, per sperimentare un nuovo linguaggio o per confrontarne le caratteristiche. Prima in Java in questo post, poi in Python e Lua in quest’altro post.

Ricorsione, operazioni con le stringhe, test a scelta multipla, sono tutti temi impiegati nel codice informatico che dato un numero, ne restituisce il testo letterale.

Il codice

Vi presento subito il codice:

package main

import "fmt"

func main() {
    var n uint64
    for {
        fmt.Scanf("%d", &n)
        fmt.Println(num2text(n))
    }
}

// array per definizione nomi da 1 a 19
var alpha19 = [...]string{"uno", "due", "tre", "quattro",
     "cinque", "sei", "sette", "otto", "nove", "dieci",
     "undici", "dodici", "tredici", "quattordici", "quindici",
     "sedici", "diciassette", "diciotto", "diciannove",}
     
var  decine = [...]string{"venti", "trenta", "quaranta",
                  "cinquanta", "sessanta", 
                  "settanta", "ottanta", "novanta",}

// funzione ricorsiva di trasformazione
// di un intero nella definizione letterale
func num2text(n uint64) string {
    switch {
        case n==0 :
           return ""
        case n<=19 :
           return alpha19[n-1]
        case n<=99 : {
           letter := decine[n/10-2]
           if t := n%10; t == 1 || t == 8 {
              letter = letter[0:len(letter)-1]
           }
           return letter + num2text(n%10)
        }
        case n<=199 :
            return "cento" + num2text(n%100)
        case n<=999 : {
            letter := "cent"
            if m := (n%100)/10; m != 8 {
                letter += "o"
            }
            return alpha19[n/100-1] +
                   letter +
                   num2text(n%100)
        }
        case n<=1999 :
            return "mille" + num2text(n%1000)
        case n<= 999999 : {
            return num2text(n/1000) +
                   "mila" +
                   num2text(n%1000)
        }
        case n <= 1999999 :
            return "unmilione" + num2text(n%1000000)
        case n <= 999999999 :
            return num2text(n/1000000)+
                "milioni" +
                num2text(n%1000000)
        case n <= 1999999999 :
            return "unmiliardo" + num2text(n%1000000000)
        default:
            return num2text(n/1000000000) +
                "miliardi" +
                num2text(n%1000000000)
    }
    return ""
}

Il codice si apre con la funzione main() che chiama a sua volta una funzione num2text() non ancora definita nel sorgente, e prosegue definendo un paio di array con le espressioni letterali dei numeri, per finire con la definizione della funzione ricorsiva, tutta costruita con un costrutto switch.

Se è la prima volta che vi capita del codice in Go, leggete il listato con calma e scoprirete un po’ di stranezze. Proprio questo è quello che intendo per imparare un nuovo linguaggio…

Prime impressioni sul Go

Non male, davvero non male. Non nascondo che questo linguaggio mi piace, prima di tutto perché non si lascia compilare facilmente, ed è per così dire “colto”, ricco di dettagli da tenere a mente, insomma ben progettato. Sembra una di quelle espressioni dell’architettura che li per li dice poco ma che invece abitandola rivela profondità.

Sfida

Il listato non è perfetto. Lancio dunque una sfida a chi vorrà farlo con divertimento: trovare un codice ancora migliore, più elegante e più tecnico di quello che ho trovato io per tradurre un numero in lettere.
Let’s Go…

2 risposte a “Numeri in lettere in Go

  1. Pingback:Visto nel Web – 46 « Ok, panico

  2. Pingback:Numeri in lettere in Falcon « Ok, panico

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: