domenica 6 novembre 2016

Quesito con la Susi n. 937

Trovare un numero minore di 55 tale che le cifre del suo quadrato, sommate due a due, diano lo stesso numero.

Gli esempi dati nel quesito sono 9 (9×9 = 81, 8 + 1 = 9) e 55 (55×55 = 3025, 30 + 25 = 55). Dal primo esempio non si può dedurre il mio «sommate due a due», ma Susi ci dice che la mamma di Luca ha «a occhio» qualche anno in meno del marito, che ne ha appunto 55.

Il più grande e minore di 55 il cui quadrato dà un numero di meno di 4 cifre è 31: 31×31 = 961. Con numeri di tre cifre non sapremmo quale regola applicare: 9 + 61 o 96 + 1? Inoltre, d'accordo che la madre di Luca è più giovane del padre, ma con numeri minori di 31 la differenza di età sarebbe minimo di 24 anni. Un po' troppo per un quiz su un giornale per famigliole… O forse no?

Possiamo imporre che l'età debba essere compresa tra 32 e 55 escluso. Ci aspettiamo anche che il numero sia più vicino a 55 che a 32, quindi non è una brutta idea iniziare la ricerca dal 55 e provare via via numeri più piccoli (ma questo ha senso solo se si procede provando in sequenza le età).

Provare. Esatto. Siamo di nuovo qui ad implementare una banale ricerca esaustiva, fino ad arrivare al numero che soddisfa i vincoli imposti.

Questa volta lo faccio in Erlang.

Dalla linea di comando:

Eshell V6.2  (abort with ^G)
1> c(solve937).
{ok,solve937}
2> solve937:solve().
[45]
ok

4 commenti:

  1. Uh! traduco in Python3, al volo:
    x = 55
    t = False
    while not t:
        x -= 1
        x2 = x * x
        a = x2 // 100
        b = x2 % 100
        t = ((a + b) == x)
    print (x, a, b)

    ottengo:
    python3 e.py
    45 20 25
    sperando conservi l'indentazione; no ho dovuto barare usando [tutto attaccato] & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;

    RispondiElimina
  2. Ciao!

    Una traduzione più fedele nello spirito (filtro su un elenco) e che non ha bisogno di preservare l'indentazione, visto che è una singola riga:

    print([x for x in range(32,55) if (lambda x: x == (x**2) // 100 + (x**2) % 100)(x)])

    :-)

    RispondiElimina
    Risposte
    1. (più fedele - sempre nello spirito - al codice Erlang, ma non al testo, dove in effetti avevo scritto “quindi non è una brutta idea iniziare la ricerca dal 55 e provare via via numeri più piccoli”!)

      Elimina
    2. Certo! Ma volevo essere elementare, fare
      una cosa per i nuovi.
      uh! non esiste il tag pre.

      Elimina

Sii educato, costruisci con cura le frasi, rifletti prima di pubblicare, evita parolacce e offese dirette, non uscire dal tema, cerca di non omettere la punteggiatura, evita errori ortografici, rileggi quel che hai scritto.