Menu Close

Juego de bloques con letras

Introducción

Para el juego de los bloques se dispone de un conjunto de bloques con una letra en cada una de sus dos caras. El objetivo del juego consiste en formar palabras sin que se pueda usar un bloque más de una vez y sin diferenciar mayúsculas de minúsculas. Por ejemplo, si se tiene tres bloques de forma que el 1º tiene las letras A y B, el 2ª la N y la O y el 3º la O y la A entonces se puede obtener la palabra ANA de dos formas: una con los bloques 1, 2 y 3 y otra con los 3, 2 y 1.

Enunciado

-- Definir la función 
--    soluciones :: [String] -> String -> [[String]]
-- tal que (soluciones bs cs) es la lista de las soluciones del juego de
-- los bloque usando los bloques bs (cada bloque es una cadena de dos
-- letras mayúsculas) para formar la palabra cs. Por ejemplo,
--    ghci> soluciones ["AB","NO","OA"] "ANA"
--    [["AB","NO","OA"],["OA","NO","AB"]]
--    ghci> soluciones ["AB","NE","OA"] "Bea"
--    [["AB","NE","OA"]]
--    ghci> soluciones ["AB","NE","OA"] "EvA"
--    []
--    ghci> soluciones ["AB","NO","OA","NC"] "ANA"
--    [["AB","NO","OA"],["AB","NC","OA"],["OA","NO","AB"],["OA","NC","AB"]]
--    ghci> soluciones ["AB","NO","OA","NC"] "Anca"
--    [["AB","NO","NC","OA"],["OA","NO","NC","AB"]]

Soluciones

import Data.List (delete)
import Data.Char (toUpper)
 
soluciones :: [String] -> String -> [[String]]
soluciones _ []      = [[]]
soluciones bs (c:cs) = [b:rs | b <- bs, 
                               toUpper c `elem` b,
                               rs <- soluciones (delete b bs) cs]
Posted in Avanzado

3 Comments

  1. Diego
    import Data.List
    import Data.Char
     
    soluciones :: [String] -> String -> [[String]]
    soluciones _ [] = [[]]
    soluciones xss (y:ys) = 
        [xs:rxs | xs <- xss, 
                  toUpper y `elem` xs, 
                  rxs <- soluciones (delete xs xss) ys]
  2. Jesús Navas Orozco
    soluciones :: [String] -> String -> [[String]]
    soluciones bs cs = aux bs (map toUpper cs)
        where aux _ [] = [[]]
              aux bs (c:cs) = [xs:ys | xs <- bs, 
                                       elem c xs, 
                                       ys <- soluciones (delete xs bs) cs]
    • Jesús Navas Orozco

      Con llamada recursiva a aux en vez de a la función:

      soluciones :: [String] -> String -> [[String]]
      soluciones bs cs = aux bs (map toUpper cs)
          where aux _ [] = [[]]
                aux bs (c:cs) = [xs:ys | xs <- bs, 
                                         elem c xs, 
                                         ys <- aux (delete xs bs) cs]

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.