fork download
  1. #!/usr/bin/env runhaskell
  2.  
  3. {-
  4. Solution to: https://r...content-available-to-author-only...d.it/5seexn
  5. Posted at: https://w...content-available-to-author-only...t.com/r/dailyprogrammer/comments/5seexn/20170206_challenge_302_easy_spelling_with/ddxljoi/
  6.  
  7. I've only read the Haskell Basics and Elementary Haskell chapters
  8. of the [Haskell Wikibook](https://e...content-available-to-author-only...s.org/wiki/Haskell),
  9. so I've only been able to use things based on principles introduced there.
  10.  
  11. A notable exception is the succinct use of `interact` in `main`,
  12. which I found [here](https://w...content-available-to-author-only...l.org/Haskell_IO_for_Imperative_Programmers).
  13. -}
  14.  
  15. module Main
  16. ( Element(..)
  17. , symToEl
  18. , elify
  19. , elsToStr
  20. , main
  21. ) where
  22.  
  23. import Data.List
  24. import Data.Char
  25.  
  26. data Element = BadSymbol
  27. | Element {name::String, symbol::String, weight::Double}
  28. deriving (Show, Eq)
  29.  
  30. symToEl :: String -> Element -- The provided string should be lowercase!
  31. symToEl "ac" = Element "Actinium" "Ac" 227
  32. symToEl "al" = Element "Aluminum" "Al" 26.9815
  33. symToEl "am" = Element "Americium" "Am" 243
  34. symToEl "sb" = Element "Antimony" "sb" 121.75
  35. symToEl "ar" = Element "Argon" "ar" 39.948
  36. symToEl "as" = Element "Arsenic" "as" 74.9216
  37. symToEl "at" = Element "Astatine" "At" 210
  38. symToEl "ba" = Element "Barium" "Ba" 137
  39. symToEl "bk" = Element "Berkelium" "Bk" 247
  40. symToEl "be" = Element "Beryllium" "Be" 9.0122
  41. symToEl "bi" = Element "Bismuth" "Bi" 208.980
  42. symToEl "b" = Element "Boron" "B" 10.81
  43. symToEl "br" = Element "Bromine" "Br" 79.904
  44. symToEl "cd" = Element "Cadmium" "Cd" 112.40
  45. symToEl "ca" = Element "Calcium" "Ca" 40.08
  46. symToEl "Cf" = Element "Californium" "Cf" 251
  47. symToEl "c" = Element "Carbon" "C" 12.011
  48. symToEl "ce" = Element "Cerium" "Ce" 140.12
  49. symToEl "cs" = Element "Cesium" "Cs" 132.9054
  50. symToEl "cl" = Element "Chlorine" "Cl" 35.453
  51. symToEl "cr" = Element "Chromium" "Cr" 51.996
  52. symToEl "co" = Element "Cobalt" "Co" 58.9332
  53. symToEl "cu" = Element "Copper" "Cu" 63.546
  54. symToEl "cm" = Element "Curium" "Cm" 247
  55. symToEl "dy" = Element "Dysprosium" "Dy" 162.50
  56. symToEl "es" = Element "Einsteinium" "Es" 254
  57. symToEl "er" = Element "Erbium" "Er" 167.26
  58. symToEl "eu" = Element "Europium" "Eu" 151.96
  59. symToEl "fm" = Element "Fermium" "Fm" 257
  60. symToEl "f" = Element "Fluorine" "F" 18.9984
  61. symToEl "fr" = Element "Francium" "Fr" 223
  62. symToEl "gd" = Element "Gadolinium" "Gd" 157.25
  63. symToEl "ga" = Element "Gallium" "Ga" 69.72
  64. symToEl "ge" = Element "Germanium" "Ge" 72.59
  65. symToEl "au" = Element "Gold" "Au" 196.966
  66. symToEl "hf" = Element "Hafnium" "Hf" 178.49
  67. symToEl "he" = Element "Helium" "He" 4.00260
  68. symToEl "ho" = Element "Holmium" "Ho" 164.930
  69. symToEl "h" = Element "Hydrogen" "H" 1.0079
  70. symToEl "in" = Element "Indium" "In" 114.82
  71. symToEl "i" = Element "Iodine" "I" 126.904
  72. symToEl "ir" = Element "Iridium" "Ir" 192.22
  73. symToEl "fe" = Element "Iron" "Fe" 55.847
  74. symToEl "kr" = Element "Krypton" "Kr" 83.80
  75. symToEl "la" = Element "Lanthanum" "La" 138.905
  76. symToEl "lr" = Element "Lawrencium" "Lr" 256
  77. symToEl "pb" = Element "Lead" "Pb" 207.2
  78. symToEl "li" = Element "Lithium" "Li" 6.941
  79. symToEl "lu" = Element "Lutetium" "Lu" 174.97
  80. symToEl "mg" = Element "Magnesium" "Mg" 24.305
  81. symToEl "mn" = Element "Manganese" "Mn" 54.9380
  82. symToEl "md" = Element "Mendelevium" "Md" 258
  83. symToEl "gg" = Element "Mercury" "Hg" 200.59
  84. symToEl "mo" = Element "Molybdenum" "Mo" 95.94
  85. symToEl "nd" = Element "Neodymium" "Nd" 144.24
  86. symToEl "ne" = Element "Neon" "Ne" 20.179
  87. symToEl "np" = Element "Neptunium" "Np" 237.048
  88. symToEl "ni" = Element "Nickel" "Ni" 58.70
  89. symToEl "nb" = Element "Niobium" "Nb" 92.9064
  90. symToEl "n" = Element "Nitrogen" "N" 14.0067
  91. symToEl "no" = Element "Nobelium" "No" 255
  92. symToEl "os" = Element "Osmium" "Os" 190.2
  93. symToEl "o" = Element "Oxygen" "O" 15.9994
  94. symToEl "pd" = Element "Palladium" "Pd" 106.4
  95. symToEl "p" = Element "Phosphorus" "P" 30.9738
  96. symToEl "pt" = Element "Platinum" "Pt" 195.09
  97. symToEl "pu" = Element "Plutonium" "Pu" 244
  98. symToEl "po" = Element "Polonium" "Po" 210
  99. symToEl "k" = Element "Potassium" "K" 39.098
  100. symToEl "pr" = Element "Praseodymium" "Pr" 140.908
  101. symToEl "pm" = Element "Promethium" "Pm" 147
  102. symToEl "pa" = Element "Protactinium" "Pa" 231.036
  103. symToEl "ra" = Element "Radium" "Ra" 226.025
  104. symToEl "rn" = Element "Radon" "Rn" 222
  105. symToEl "re" = Element "Rhenium" "Re" 186.207
  106. symToEl "rh" = Element "Rhodium" "Rh" 102.906
  107. symToEl "rb" = Element "Rubidium" "Rb" 85.4678
  108. symToEl "ru" = Element "Ruthenium" "Ru" 101.07
  109. symToEl "rf" = Element "Rutherfordium" "Rf" 261
  110. symToEl "sm" = Element "Samarium" "Sm" 150.4
  111. symToEl "sc" = Element "Scandium" "Sc" 44.9559
  112. symToEl "se" = Element "Selenium" "Se" 78.96
  113. symToEl "si" = Element "Silicon" "Si" 28.086
  114. symToEl "ag" = Element "Silver" "Ag" 107.868
  115. symToEl "na" = Element "Sodium" "Na" 22.9898
  116. symToEl "sr" = Element "Strontium" "Sr" 87.62
  117. symToEl "s" = Element "Sulfur" "S" 32.06
  118. symToEl "ta" = Element "Tantalum" "Ta" 180.948
  119. symToEl "tc" = Element "Technetium" "Tc" 98.9062
  120. symToEl "te" = Element "Tellurium" "Te" 127.60
  121. symToEl "tb" = Element "Terbium" "Tb" 158.925
  122. symToEl "tl" = Element "Thallium" "Tl" 204.37
  123. symToEl "th" = Element "Thorium" "Th" 232.038
  124. symToEl "tm" = Element "Thulium" "Tm" 168.934
  125. symToEl "sn" = Element "Tin" "Sn" 118.69
  126. symToEl "ti" = Element "Titanium" "Ti" 47.90
  127. symToEl "w" = Element "Tungsten" "W" 183.85
  128. symToEl "u" = Element "Uranium" "U" 238.029
  129. symToEl "v" = Element "Vanadium" "V" 50.9414
  130. symToEl "xe" = Element "Xenon" "Xe" 131.30
  131. symToEl "yb" = Element "Ytterbium" "Yb" 173.04
  132. symToEl "y" = Element "Yttrium" "Y" 88.9059
  133. symToEl "zn" = Element "Zinc" "Zn" 65.38
  134. symToEl "zr" = Element "Zirconium" "Zr" 91.22
  135. symToEl _ = BadSymbol
  136.  
  137. elify :: String -> [Element]
  138. elify "" = []
  139. elify word =
  140. case filter (all (/= BadSymbol)) (recurse (map toLower word)) of
  141. [] -> []
  142. [[]] -> []
  143. words -> maximumBy compareBySumOfWeights words
  144.  
  145. where
  146. compareBySumOfWeights :: [Element] -> [Element] -> Ordering
  147. compareBySumOfWeights a b =
  148. let sumOfWeights els = sum [ w | Element {weight=w} <- els ]
  149. in compare (sumOfWeights a) (sumOfWeights b)
  150.  
  151. recurse :: String -> [[Element]]
  152. recurse "" = [[]]
  153. recurse word =
  154. concat [ let el = symToEl sym
  155. in case el of
  156. BadSymbol -> [[el]]
  157. Element {} -> map (el:) (recurse remaining)
  158. | (sym,remaining) <- map (`splitAt` word) [1 .. length word]
  159. ]
  160.  
  161. elsToStr :: [Element] -> String
  162. elsToStr els = foldl' (++) "" [ sym | Element {symbol=sym} <- els ]
  163.  
  164. main = interact (unlines . map (elsToStr . elify) . lines)
Success #stdin #stdout 0s 8388607KB
stdin
functions
bacon
poison
sickness
ticklish
stdout
FUNCTiONS
BAcON
PoISON
SICKNEsS
TiCKLiSH