miércoles, 4 de mayo de 2011

Dorefasi Faredo: solución al piano gigantesco.

La verdad es que por causas personales (mudanza de piso) no he podido atender mis deberes blogueriles y he dejado algunos de los de desafíos Matemáticos de la Real Sociedad Matemática Española y El País sin resolver ni mencionar en el blog.

Mi situación ya se ha arreglado y volvemos esta semana a publicar el enunciado correspondiente a este nbuevo desafío y que lleva por título Un piano Gigantesco. El enunciado lo podéis escuchar aquí mismo







En él, dado un piano muy muy grando, tocamos un DO, a continuación tocamos la siguiente tecla, RE; aahora nos saltamos 1 y tocamos la siguiente FA; ahora saltamos 2 y tocamos la siguiente, SI, saltamos 3 y tocamos la siguiente, FA; y así sucesivamente hasta que hayamos tocado 7000 teclas. Se nos pide determinar cuántas teclas DO tocaremos y si hay alguna nota que nunca toquemos.

La solución no es demasiado complicada, de hecho, creo que cualquiera que lo intente por el método de la cuenta de la vieja (ojo, que la vieja sabe contar muy bien) se da cuenta del quid: las notas se repiten de 7 en 7. La solución original, con sorpresa musical, la podéis ver a continuación




Y ahora os comento lo que yo hice, que es prácticamente lo mismo que viene en el vídeo: trabajar en , o dicho de otro modo, en módulo 7. Para ello, las notas Do-Re-Mi-Fa-Sol-La-Si se corresponderán con 0-1-2-3-4-5-6 respectivamente.

En mi método, como trabajamos módulo 7, da igual sumar 0, que 7, que 14, que... ; o bien, da igual sumar 1 que 8, que 15, que... etc... Por eso, como al cabo de 7 notas volvemos al DO y habría que sumar 8 (que es lo mismo que 1), se vuelve a repetir cíclicamente, la sucesión de las 7 primeras notas. Así que, como bien dicen en el vídeo, basta con contar lo que ocurre en las primeras 7 notas.... y multiplicar por 1000.

Pero bueno, por si acaso, también comprobé mi solución con el Mathematica haciendo un pequeño programita (la verdad es que me da vergüenza llamarlo así, pero en fin). En primer lugar, en vez de notas, trabajamos con números, así que buscamos una sucesión numérica . Como comenzamos en un DO, sabemos que , , y sucesivamente, . De esta forma, es fácil comprobar que la sucesión con la que vamos a trabajar es la de los números triangulares pero comenzandoen 0; así .

Así, y gracias a la potencia del Mathematica (versión 8, en mi caso), basta definir en primer lugar la sucesión


a[n_] := n (n - 1)/2


A continuación, para cada , escribo una lista en la que sólo aparezcan, de los 7000 primeros términos de , aquéllos que sean iguales a módulo 7


Nota[k_] := Table[If[Mod[a[n], 7] == k, a[n], ""], {n, 1, 7000}];


Realmente, lo que hago es escribir si es módulo 7, y escribir una cadena vacía ("") si no lo es. Finalmente, le digo que me cuente cuántos números naturales hay en cada una de las 7 listas anteriores.


Table[Count[Nota[k], _Integer], {k, 0, 6}]


El resultado es una lista de 7 elementos:


{2000, 2000, 0, 2000, 0, 0, 1000}


que corresponde con la cantidad de veces que aparece la nota DO-RE-MI-FA-SOL-LA-SI respectivamente. Así se comprueba que las notas DO-RE-FA aparecen 2000 veces, SI aparece 1000 veces y MI-SOL-LA no aparecen nunca.

En fin, un problema sencillo, pero que a mí me ha resultado muy bonito.

Tito Eliatron Dixit

5 comentarios:

  1. En Matlab/Octave:

    x=hist(rem(cumsum(0:6999),7),7)

    que da como resultado:

    2000 2000 0 2000 0 0 1000

    ResponderEliminar
  2. GRacias! pero como no sé MATLAB/Octave... me gustaría que me explicases un poco qué hace ese programita exactamente

    ResponderEliminar
  3. Explico:

    0:6999 es el vector [0,1,2,...6999] (en Matlab y su clon libre Octave casi todo son vectores o matrices, entendidos como arrays de uno o dos índices). Es la longitud de los saltos, incluyendo un 0 al principio que en realidad es la posición de la primera tecla.

    cumsum es una suma acumulativa, por lo que cumsum(0:6999) es la posición de las teclas.

    rem(a,b) es el resto de la división entera a entre b. Por tanto, rem(cumsum(0:6999),7) son las notas tocadas (0: do, 1:re, etc).

    Por último, hist(x,b) es una función para representar el histograma de x en b intervalos. El truco es que si se llama con un argumento de salida da las alturas de las barras del histograma en lugar de hacer la gráfica. Como hay 7 elementos diferentes, dividiendo en 7 intervalos lo que se está haciendo es contar las repeticiones de cada elemento.

    ResponderEliminar
  4. Ha dejado de funciones Latex?

    ResponderEliminar
  5. Yo lo hice con Excel y la función MOD. Para ser informático, una auténtica vergüenza; aunque eso sí rápido y efectivo :-)

    ResponderEliminar

Si no comentas, Gauss se comerá una integral.
Y, por favor, respeta a todos con tus opiniones.