Skip to content

Instantly share code, notes, and snippets.

@letsbreelhere
Last active July 6, 2017 21:44
Show Gist options
  • Save letsbreelhere/a2c3ec066120107767c335f6942076ee to your computer and use it in GitHub Desktop.
Save letsbreelhere/a2c3ec066120107767c335f6942076ee to your computer and use it in GitHub Desktop.
Element spelling solution
module Element where
import Data.List (isPrefixOf, (\\), intercalate)
import Control.Monad (guard)
import Data.Char (toLower)
elements :: [(String, String)]
elements =
[ ("Ac", "Actinium")
, ("Ag", "Silver")
, ("Al", "Aluminum")
, ("Am", "Americium")
, ("Ar", "Argon")
, ("As", "Arsenic")
, ("At", "Astatine")
, ("Au", "Gold")
, ("B", "Boron")
, ("Ba", "Barium")
, ("Be", "Beryllium")
, ("Bh", "Bohrium")
, ("Bi", "Bismuth")
, ("Bk", "Berkelium")
, ("Br", "Bromine")
, ("C", "Carbon")
, ("Ca", "Calcium")
, ("Cd", "Cadmium")
, ("Ce", "Cerium")
, ("Cf", "Californium")
, ("Cl", "Chlorine")
, ("Cm", "Curium")
, ("Cn", "Copernicium")
, ("Co", "Cobalt")
, ("Cr", "Chromium")
, ("Cs", "Cesium")
, ("Cu", "Copper")
, ("Db", "Dubnium")
, ("Ds", "Darmstadtium")
, ("Dy", "Dysprosium")
, ("Er", "Erbium")
, ("Es", "Einsteinium")
, ("Eu", "Europium")
, ("F", "Fluorine")
, ("Fe", "Iron")
, ("Fl", "Flerovium")
, ("Fm", "Fermium")
, ("Fr", "Francium")
, ("Ga", "Gallium")
, ("Gd", "Gadolinium")
, ("Ge", "Germanium")
, ("H", "Hydrogen")
, ("He", "Helium")
, ("Hf", "Hafnium")
, ("Hg", "Mercury")
, ("Ho", "Holmium")
, ("Hs", "Hassium")
, ("I", "Iodine")
, ("In", "Indium")
, ("Ir", "Iridium")
, ("K", "Potassium")
, ("Kr", "Krypton")
, ("La", "Lanthanum")
, ("Li", "Lithium")
, ("Lr", "Lawrencium")
, ("Lu", "Lutetium")
, ("Lv", "Livermorium")
, ("Md", "Mendelevium")
, ("Mg", "Magnesium")
, ("Mn", "Manganese")
, ("Mo", "Molybdenum")
, ("Mt", "Meitnerium")
, ("N", "Nitrogen")
, ("Na", "Sodium")
, ("Nb", "Niobium")
, ("Nd", "Neodymium")
, ("Ne", "Neon")
, ("Ni", "Nickel")
, ("No", "Nobelium")
, ("Np", "Neptunium")
, ("O", "Oxygen")
, ("Os", "Osmium")
, ("P", "Phosphorus")
, ("Pa", "Protactinium")
, ("Pb", "Lead")
, ("Pd", "Palladium")
, ("Pm", "Promethium")
, ("Po", "Polonium")
, ("Pr", "Praseodymium")
, ("Pt", "Platinum")
, ("Pu", "Plutonium")
, ("Ra", "Radium")
, ("Rb", "Rubidium")
, ("Re", "Rhenium")
, ("Rf", "Rutherfordium")
, ("Rg", "Roentgenium")
, ("Rh", "Rhodium")
, ("Rn", "Radon")
, ("Ru", "Ruthenium")
, ("S", "Sulfur")
, ("Sb", "Antimony")
, ("Sc", "Scandium")
, ("Se", "Selenium")
, ("Sg", "Seaborgium")
, ("Si", "Silicon")
, ("Sm", "Samarium")
, ("Sn", "Tin")
, ("Sr", "Strontium")
, ("Ta", "Tantalum")
, ("Tb", "Terbium")
, ("Tc", "Technetium")
, ("Te", "Tellurium")
, ("Th", "Thorium")
, ("Ti", "Titanium")
, ("Tl", "Thallium")
, ("Tm", "Thulium")
, ("U", "Uranium")
, ("V", "Vanadium")
, ("W", "Tungsten")
, ("Xe", "Xenon")
, ("Y", "Yttrium")
, ("Yb", "Ytterbium")
, ("Zn", "Zinc")
, ("Zr", "Zirconium")
]
search :: String -> [[(String, String)]]
search [] = [[]]
search word = do
(abbrev, full) <- elements
let abbrev' = map toLower abbrev
guard (abbrev' `isPrefixOf` word)
rest <- search (word \\ abbrev')
pure ((abbrev, full):rest)
main :: IO ()
main = do
word <- map toLower <$> getLine
let results = search word
display result = putStrLn . concat $
[ concatMap fst result
, " ("
, intercalate ", " (map snd result)
, ")"
]
mapM_ display results
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment