Fracciones cancelativas

Una fracción x/y es cancelativa si se cumplen las siguientes condiciones:

  • x/y es propia (es decir, x < y),
  • ninguno de los números x e y son múltiplos de 10 y
  • existe un dígito d tal que al borrar una ocurrencia de d en x y otra en y se obtiene una fracción cuyo valor coincide con x/y.

Por ejemplo, 16/64 es cancelativa ya que borrando el 6 en el numerador y el denominador se obtiene 1/4 que es igual a la original: 16/64 = 1/4.

Definir la función

tal que (cancelativas m n) es la lista de las fracciones cancelativas con su denominador entre m y n. Por ejemplo,

Soluciones

8 Comentarios

  1. El coste cuadrático interno puede hacerse muy rápido.

    1. A mí me salen más casos que tu código no detecta. Por ejemplo:

      1. Chema, tienes razón que hay un error, pero no es que no detecte casos, sino que itera en el intervalo (m, n] en lugar de hacerlo en el intervalo [m, n]. Es cambiar "drop a" por "drop (a - 1)".

        Por otro lado creo que las soluciones como "((104,1625),(40,625)),((1508,1625),(580,625))" no son válidas ;P

  2. Puede que se vea más claro usando compresiones de listas:

  3. Una versión optimizada de la que había puesto antes:

    1. Me he dado cuenta que se puede optimizar mucho la función comb mediante una función recursiva. Así mismo, es muchísimo más rápido si se busca antes por el segundo denominador que por el primero.

      La versión definitiva quedaría así:

Escribe tu solución