Numeri riciclati e autodefiniti

(Dev n. 142, luglio-agosto 2006)

C’è un segreto che fino ad oggi il doctor Morb ha custodito gelosamente. Nel suo albero geneaologico, infatti, c’è una macchia: un suo alter ego che ha cercato di sfruttare le sue amicizie all’interno della NSA e con il famoso dottor Matrix per riuscire a ottenere la potenza di calcolo necessaria per i suoi lavori di algomatica, una scienza da lui inventata che unisce il ragionamento matematico teorico alla necessità di utilizzare i supercomputer per trovare le soluzioni ai problemi affrontati. In effetti, l’antagonismo con il doctor Morb è tale che lui ha scelto di farsi conoscere come doctor Brom: i maligni affermano che non è un uomo ma un cyborg, e il nome è in realtà un acronimo per Bio-Robot Ordinateur Machine, ma lui ha sempre commentato tali voci come delle sciocchezze.

Ho conosciuto casualmente il doctor Brom a un seminario sugli ambigrammi, a cui abbiamo entrambi partecipato. È alto quanto me ma molto più magro e ossuto, e con lunghi capelli biondi che tendono ad andare in tutte le direzioni. Bisogna dire che dopo un rapido scambio di convenevoli è venuto subito al sodo, proponendomi di fargli da tramite con i lettori di Dev per verificare se i principi di base dell’algomatica stanno espandendosi anche fuori dall’ambiente ovattato dei grandi campus americani. In pratica, proporrò ogni mese uno o più problemi matematici fornitimi dal doctor Brom, e che dovranno essere da voi risolti rispettando le seguenti regole fondamentali.

  1. Non si chiede di trovare la soluzione ai problemi, ma di scrivere un programma che trovi le soluzioni, come del resto richiede l’algomatica. Il cervello umano è troppo importante per costringerlo a cercare a tentoni delle soluzioni.
  2. Il programma può essere scritto in un qualunque linguaggio di programmazione: l’algomatica è infatti agnostica e non fa preferenze.
  3. Dovete inviare il programma (in sorgente e - se il linguaggio è compilato – con l'eseguibile in formato windows oppure linux/386) all’indirizzo algomatica@infomedia.it; sono gradite delle considerazioni sugli algoritmi scelti (scorciatoie teoriche utilizzate, tipo di rappresentazione dei dati, o altro ancora. L’algomatica non è infatti sinonimo di forza bruta)
  4. Il doctor Brom selezionerà le soluzioni migliori, che saranno pubblicate e commentate nella rivista.

Per iniziare, ecco un paio di problemini “così semplici che mi vergogno quasi di proporli”: almeno queste sono state le parole del doctor Brom che, come credo abbiate capito, non sembra proprio essere un campione di modestia. Ad essere sincero, non sarei così sicuro della loro semplicità, ma lascio a voi la partita! Cominciamo parlando di numeri riciclati di ordine N: sono quelli che, se si prende la cifra più a destra e la si porta a sinistra, danno un numero che è N volte quello originale. Ad esempio, se scriviamo 265 e portiamo il 5 in prima posizione otteniamo 526, che purtroppo non è esattamente il doppio di 265 anche se gli si avvicina parecchio. Un problema abbastanza noto è quello di trovare un numero riciclato di ordine 2, tale cioè che spostando l’ultima cifra all’inizio si ottenga esattamente il doppio del numero iniziale. Mettendosi con un po’ di calma con carta e matita non è difficile trovare la soluzione; ma ricordo che l’algomatica snobba questi metodi ruspanti e chiede soluzioni ottenute da un programma. E mica per altro; il programma deve trovare infatti i numeri riciclati non solo di ordine 2 ma anche di ordine N per un N qualunque (maggiore di 1, mi affretto ad aggiungere… altrimenti un qualunque numero che abbia tutte le cifre uguali sarebbe una soluzione). Se volete fare le cose in grande, potete anche rendere più generale il vostro programma, permettendo di non usare solamente i numeri in base 10 ma anche quelli in un’altra base. Per fare un esempio, il numero 1012 in base 3 se raddoppiato diventa 2101, e quindi è un numero riciclato di ordine 2 in base 3.

Un altro problema sempre a riguardo dei numeri e delle loro cifre è quello dei numeri autodefiniti. Anche in questo caso un esempio è meglio di una lunga spiegazione. Prendiamo il numero 2020 e leggiamolo da sinistra a destra, mentre contiamo a partire da zero; otteniamo “due 0, zero 1, due 2, zero 3”. Se guardiamo nuovamente il numero, ci accorgiamo che l’abbiamo definito: ci sono effettivamente due zeri e due 2, mentre non ci sono né 1 né 3. 2020 è pertanto un numero autodefinito. Il problema è trovare tutti i numeri autodefiniti esistenti, “leggendo” il numero da sinistra a destra oppure nella direzione opposta.

Buon lavoro!

(vai alla pagina delle soluzioni)