#!/usr/bin/env runhaskell
{-
Solution to: https://r...content-available-to-author-only...d.it/5seexn
Posted at: https://w...content-available-to-author-only...t.com/r/dailyprogrammer/comments/5seexn/20170206_challenge_302_easy_spelling_with/ddxljoi/
I've only read the Haskell Basics and Elementary Haskell chapters
of the [Haskell Wikibook](https://e...content-available-to-author-only...s.org/wiki/Haskell),
so I've only been able to use things based on principles introduced there.
A notable exception is the succinct use of `interact` in `main`,
which I found [here](https://w...content-available-to-author-only...l.org/Haskell_IO_for_Imperative_Programmers).
-}
module Main
( Element(..)
, symToEl
, elify
, elsToStr
, main
) where
import Data.List
data Element = BadSymbol
symToEl
:: String -> Element
-- The provided string should be lowercase!symToEl "ac" = Element "Actinium" "Ac" 227
symToEl "al" = Element "Aluminum" "Al" 26.9815
symToEl "am" = Element "Americium" "Am" 243
symToEl "sb" = Element "Antimony" "sb" 121.75
symToEl "ar" = Element "Argon" "ar" 39.948
symToEl "as" = Element "Arsenic" "as" 74.9216
symToEl "at" = Element "Astatine" "At" 210
symToEl "ba" = Element "Barium" "Ba" 137
symToEl "bk" = Element "Berkelium" "Bk" 247
symToEl "be" = Element "Beryllium" "Be" 9.0122
symToEl "bi" = Element "Bismuth" "Bi" 208.980
symToEl "b" = Element "Boron" "B" 10.81
symToEl "br" = Element "Bromine" "Br" 79.904
symToEl "cd" = Element "Cadmium" "Cd" 112.40
symToEl "ca" = Element "Calcium" "Ca" 40.08
symToEl "Cf" = Element "Californium" "Cf" 251
symToEl "c" = Element "Carbon" "C" 12.011
symToEl "ce" = Element "Cerium" "Ce" 140.12
symToEl "cs" = Element "Cesium" "Cs" 132.9054
symToEl "cl" = Element "Chlorine" "Cl" 35.453
symToEl "cr" = Element "Chromium" "Cr" 51.996
symToEl "co" = Element "Cobalt" "Co" 58.9332
symToEl "cu" = Element "Copper" "Cu" 63.546
symToEl "cm" = Element "Curium" "Cm" 247
symToEl "dy" = Element "Dysprosium" "Dy" 162.50
symToEl "es" = Element "Einsteinium" "Es" 254
symToEl "er" = Element "Erbium" "Er" 167.26
symToEl "eu" = Element "Europium" "Eu" 151.96
symToEl "fm" = Element "Fermium" "Fm" 257
symToEl "f" = Element "Fluorine" "F" 18.9984
symToEl "fr" = Element "Francium" "Fr" 223
symToEl "gd" = Element "Gadolinium" "Gd" 157.25
symToEl "ga" = Element "Gallium" "Ga" 69.72
symToEl "ge" = Element "Germanium" "Ge" 72.59
symToEl "au" = Element "Gold" "Au" 196.966
symToEl "hf" = Element "Hafnium" "Hf" 178.49
symToEl "he" = Element "Helium" "He" 4.00260
symToEl "ho" = Element "Holmium" "Ho" 164.930
symToEl "h" = Element "Hydrogen" "H" 1.0079
symToEl "in" = Element "Indium" "In" 114.82
symToEl "i" = Element "Iodine" "I" 126.904
symToEl "ir" = Element "Iridium" "Ir" 192.22
symToEl "fe" = Element "Iron" "Fe" 55.847
symToEl "kr" = Element "Krypton" "Kr" 83.80
symToEl "la" = Element "Lanthanum" "La" 138.905
symToEl "lr" = Element "Lawrencium" "Lr" 256
symToEl "pb" = Element "Lead" "Pb" 207.2
symToEl "li" = Element "Lithium" "Li" 6.941
symToEl "lu" = Element "Lutetium" "Lu" 174.97
symToEl "mg" = Element "Magnesium" "Mg" 24.305
symToEl "mn" = Element "Manganese" "Mn" 54.9380
symToEl "md" = Element "Mendelevium" "Md" 258
symToEl "gg" = Element "Mercury" "Hg" 200.59
symToEl "mo" = Element "Molybdenum" "Mo" 95.94
symToEl "nd" = Element "Neodymium" "Nd" 144.24
symToEl "ne" = Element "Neon" "Ne" 20.179
symToEl "np" = Element "Neptunium" "Np" 237.048
symToEl "ni" = Element "Nickel" "Ni" 58.70
symToEl "nb" = Element "Niobium" "Nb" 92.9064
symToEl "n" = Element "Nitrogen" "N" 14.0067
symToEl "no" = Element "Nobelium" "No" 255
symToEl "os" = Element "Osmium" "Os" 190.2
symToEl "o" = Element "Oxygen" "O" 15.9994
symToEl "pd" = Element "Palladium" "Pd" 106.4
symToEl "p" = Element "Phosphorus" "P" 30.9738
symToEl "pt" = Element "Platinum" "Pt" 195.09
symToEl "pu" = Element "Plutonium" "Pu" 244
symToEl "po" = Element "Polonium" "Po" 210
symToEl "k" = Element "Potassium" "K" 39.098
symToEl "pr" = Element "Praseodymium" "Pr" 140.908
symToEl "pm" = Element "Promethium" "Pm" 147
symToEl "pa" = Element "Protactinium" "Pa" 231.036
symToEl "ra" = Element "Radium" "Ra" 226.025
symToEl "rn" = Element "Radon" "Rn" 222
symToEl "re" = Element "Rhenium" "Re" 186.207
symToEl "rh" = Element "Rhodium" "Rh" 102.906
symToEl "rb" = Element "Rubidium" "Rb" 85.4678
symToEl "ru" = Element "Ruthenium" "Ru" 101.07
symToEl "rf" = Element "Rutherfordium" "Rf" 261
symToEl "sm" = Element "Samarium" "Sm" 150.4
symToEl "sc" = Element "Scandium" "Sc" 44.9559
symToEl "se" = Element "Selenium" "Se" 78.96
symToEl "si" = Element "Silicon" "Si" 28.086
symToEl "ag" = Element "Silver" "Ag" 107.868
symToEl "na" = Element "Sodium" "Na" 22.9898
symToEl "sr" = Element "Strontium" "Sr" 87.62
symToEl "s" = Element "Sulfur" "S" 32.06
symToEl "ta" = Element "Tantalum" "Ta" 180.948
symToEl "tc" = Element "Technetium" "Tc" 98.9062
symToEl "te" = Element "Tellurium" "Te" 127.60
symToEl "tb" = Element "Terbium" "Tb" 158.925
symToEl "tl" = Element "Thallium" "Tl" 204.37
symToEl "th" = Element "Thorium" "Th" 232.038
symToEl "tm" = Element "Thulium" "Tm" 168.934
symToEl "sn" = Element "Tin" "Sn" 118.69
symToEl "ti" = Element "Titanium" "Ti" 47.90
symToEl "w" = Element "Tungsten" "W" 183.85
symToEl "u" = Element "Uranium" "U" 238.029
symToEl "v" = Element "Vanadium" "V" 50.9414
symToEl "xe" = Element "Xenon" "Xe" 131.30
symToEl "yb" = Element "Ytterbium" "Yb" 173.04
symToEl "y" = Element "Yttrium" "Y" 88.9059
symToEl "zn" = Element "Zinc" "Zn" 65.38
symToEl "zr" = Element "Zirconium" "Zr" 91.22
symToEl _ = BadSymbol
elify "" = []
elify word =
case filter (all (/= BadSymbol
)) (recurse
(map toLower word
)) of [] -> []
[[]] -> []
where
compareBySumOfWeights
:: [Element
] -> [Element
] -> Ordering compareBySumOfWeights a b =
let sumOfWeights els
= sum [ w
| Element
{weight
=w
} <- els
] in compare (sumOfWeights a
) (sumOfWeights b
)
recurse
:: String -> [[Element
]] recurse "" = [[]]
recurse word =
in case el of
BadSymbol -> [[el]]
Element
{} -> map (el:
) (recurse remaining
) ]
elsToStr
:: [Element
] -> StringelsToStr els
= foldl' (++) "" [ sym | Element {symbol=sym} <- els ]
main = interact (unlines . map (elsToStr . elify) . lines)