Es probable que alguna vez te hayas enfrentado a un amigo, que decía poder leerte la mente, haciendo el siguiente truco: piensa en un número entre el 1 y el 10; multiplícalo por 9; suma los dígitos del resultado (por ejemplo, 23 -> 2 + 3 = 5); y resta 5 a la suma. En este punto puede haber alcanzado el valor 4. ¿Cómo lo sé? Usando el mismo truco de tu amigo. Permítame mostrarle usando Clojure. En primer lugar, vamos a escribir una función que sume los dígitos de un número:
El valor se transforma en una cadena, la función map transforma cada carácter de los dígitos en una lista de enteros y la función apply suma la lista de enteros, devolviendo el total al llamante de la función sum-digits. Vamos a utilizar esta función para componer los cálculos del truco:
La función puzzle realiza los cálculos en la secuencia que le ha pedido su amigo. Primero, multiplica el número que hemos pensado por 9, luego suma los dígitos del resultado y, por último, resta el total por 5. A continuación, vamos a escribir otra función para desvelar el truco:
La función rango produce una secuencia de números que empiezan por el 1 hasta el 10 en la que no se incluye el 11 (1 2 3 4 5 6 7 8 9 10). La función map aplica la función puzzle a cada número de la lista y produce otra lista con los resultados. Ahora, ejecuta la función desvelar para ver el resultado:
¡Oh, mira! Para el rango de 1 a 10, el resultado será siempre 4. En otras palabras, un patrón. Los patrones están muy presentes en las multiplicaciones y cuando los eliminas todos tienes números primos, como señala Mark Haddon en su libro “The Curious Incident of the Dog in the Night-Time”. Daniel Tammet ejemplifica algunos patrones en su libro “Thinking in Numbers: Cómo las matemáticas iluminan nuestras vidas”. Cuando multiplicamos cualquier número par por 5 siempre obtenemos números acabados en cero (por ejemplo, 12 x 5 = 60) y cuando lo hacemos con números impares siempre obtenemos números acabados en 5. En el caso del 9, cada vez que multiplicamos el 9 por un número entre el 1 y el 10 y sumamos sus dígitos siempre obtenemos el 9.
En la secuencia, restar el 5 al 9 sólo distraerá tu atención del patrón de multiplicación e incluso mejorará el truco. Por ejemplo: imagina que a cada letra del alfabeto le corresponde un número (A – 1, B – 2, C – 3, …). Ahora, toma el resultado (4) y obtén su respectiva letra; piensa en un país que empiece por esta letra; toma la cuarta letra de este país y piensa en un animal que empiece por esta letra. Hay una alta probabilidad de que tu respuesta final sea “Dinamarca” y “mono”. Antes de que pienses que te estoy leyendo la mente, déjame explicarte lo que acaba de ocurrir.
En primer lugar, no hay muchos países que empiecen por “D”, la cuarta letra del alfabeto. Entre Dinamarca, Yibuti, Dominica y República Dominicana, recordarás fácilmente Dinamarca. La cuarta letra de Dinamarca es la “M” y ningún animal que empiece por “M” es más famoso que el mono, que viene inmediatamente a tu mente.
Me estoy divirtiendo programando en Clojure, no sólo porque Clojure es divertido de aprender y enseñar, sino porque programar no siempre se trata de cosas serias. Ser capaz de programar el código suficiente para hacer que las cosas sucedan estimula el pensamiento, la resolución de problemas y la creatividad por encima de la estructura, los patrones, las convenciones y los estilos. Se supone que programar es relajante, no estresante. Disfrútalo!