// challenge 302 Easy Spelling With Chemistry // https://w...content-available-to-author-only...t.com/r/dailyprogrammer/comments/5seexn/20170206_challenge_302_easy_spelling_with/ /* Challenge Input: functions bacon poison sickness ticklish Challenge Output: FUNCTiONS (flourine, uranium, nitrogen, carbon, titanium, oxygen, nitrogen, sulfur) BaCoN (barium, cobalt, nitrogen) POISON (phosphorus, oxygen, iodine, sulfur, oxygen, nitrogen) SiCKNeSS (silicon, carbon, potassium, neon, sulfur, sulfur) TiCKLiSH (titanium, carbon, potassium, lithium, sulfur, hydrogen) */ package challenge._302_easy import java.util.* import java.lang.* data class Element(val atNum: Int, val symbol: String, val name: String, val atWt: Double) val elements: MutableList = ArrayList() val symMap: MutableMap = HashMap() fun findSolutions(word: String) : List>? { if (word.length == 0) return null if (word.length == 1) { val elem = symMap[word] return if (elem != null) listOf(listOf(elem)) else null } if (word.length > 1) { val rlst: MutableList> = ArrayList>() val elem1 = symMap[word.substring(0..0)] if (elem1!=null) { val sol2 = findSolutions(word.substring(1)) if (sol2!=null) { for (lst in sol2) { val lst2: List = listOf(elem1) + lst rlst.add(lst2) } } } val elem2 = symMap[word.substring(0..1)] if (elem2 != null) { if (word.length == 2) { val lst2: List = listOf(elem2) rlst.add(listOf(elem2)) } else { val sol2 = findSolutions(word.substring(2)) if (sol2 != null) { for (lst in sol2) { val lst2: List = listOf(elem2) + lst rlst.add(lst2) } } } } return if (!rlst.isEmpty()) rlst else null } return null } fun formatSolution(solution: List): String { val sb = StringBuilder() val name = StringBuilder() for (element in solution) { name.append(element.symbol) } sb.append(name) sb.append(" (") val names: MutableList = ArrayList() for (element in solution) { names.add(element.name) } sb.append(names.joinToString(separator=" ")) sb.append(")") return sb.toString() } fun findMaxWeightInfo(solutions: List>): Pair { var maxWeight: Double = 0.0 var maxWeightIndex: Int = -1 for ((index,solution) in solutions.withIndex()) { var solutionWeight: Double = 0.0 for (element in solution) { solutionWeight += element.atWt } if (solutionWeight > maxWeight) { maxWeight = solutionWeight maxWeightIndex = index } } return Pair(maxWeightIndex, maxWeight) } fun main(args: Array) { for (elem in _elementData) { val spl = elem.split(",") val elem = Element(spl[0].toInt(), spl[1], spl[2].toLowerCase(), spl[3].toDouble()) elements.add(elem) symMap[spl[1].toLowerCase()] = elem } val words = arrayOf("functions", "bacon", "poison", "sickness", "ticklish") for (word in words) { val solutions = findSolutions(word) if (solutions != null) { val count:Int = solutions.size val weightInfo = findMaxWeightInfo(solutions) for ((index,solution) in solutions.withIndex()) { var text = formatSolution(solution) if (solutions.size > 1 && weightInfo.first == index) { text += " *" } println(text) } } } println("* - indicates max atomic weight in group") } val _elementData = arrayOf( //"Atomic Number,SI Symbol,Element,Atomic Weight", "1,H,Hydrogen,1.00794", "2,He,Helium,4.002602", "3,Li,Lithium,6.941", "4,Be,Beryllium,9.012182", "5,B,Boron,10.811", "6,C,Carbon,12.0107", "7,N,Nitrogen,14.0067", "8,O,Oxygen,15.9994", "9,F,Fluorine,18.9984032", "10,Ne,Neon,20.1797", "11,Na,Sodium,22.98976928", "12,Mg,Magnesium,24.3050", "13,Al,Aluminium,26.9815386", "14,Si,Silicon,28.0855", "15,P,Phosphorus,30.973762", "16,S,Sulfur,32.065", "17,Cl,Chlorine,35.453", "18,Ar,Argon,39.948", "19,K,Potassium,39.0983", "20,Ca,Calcium,40.078", "21,Sc,Scandium,44.955912", "22,Ti,Titanium,47.867", "23,V,Vanadium,50.9415", "24,Cr,Chromium,51.9961", "25,Mn,Manganese,54.938045", "26,Fe,Iron,55.845", "27,Co,Cobalt,58.933195", "28,Ni,Nickel,58.6934", "29,Cu,Copper,63.546", "30,Zn,Zinc,65.38", "31,Ga,Gallium,69.723", "32,Ge,Germanium,72.64", "33,As,Arsenic,74.92160", "34,Se,Selenium,78.96", "35,Br,Bromine,79.904", "36,Kr,Krypton,83.798", "37,Rb,Rubidium,85.4678", "38,Sr,Strontium,87.62", "39,Y,Yttrium,88.90585", "40,Zr,Zirconium,91.224", "41,Nb,Niobium,92.90638", "42,Mo,Molybdenum,95.96", "43,Tc,Technetium,98", "44,Ru,Ruthenium,101.07", "45,Rh,Rhodium,102.90550", "46,Pd,Palladium,106.42", "47,Ag,Silver,107.8682", "48,Cd,Cadmium,112.411", "49,In,Indium,114.818", "50,Sn,Tin,118.710", "51,Sb,Antimony,121.760", "52,Te,Tellurium,127.60", "53,I,Iodine,126.90447", "54,Xe,Xenon,131.293", "55,Cs,Cesium,132.9054519", "56,Ba,Barium,137.327", "57,La,Lanthanum,138.90547", "58,Ce,Cerium,140.116", "59,Pr,Praseodymium,140.90765", "60,Nd,Neodymium,144.242", "61,Pm,Promethium,145", "62,Sm,Samarium,150.36", "63,Eu,Europium,151.964", "64,Gd,Gadolinium,157.25", "65,Tb,Terbium,158.92535", "66,Dy,Dysprosium,162.500", "67,Ho,Holmium,164.93032", "68,Er,Erbium,167.259", "69,Tm,Thulium,168.93421", "70,Yb,Ytterbium,173.054", "71,Lu,Lutetium,174.9668", "72,Hf,Hafnium,178.49", "73,Ta,Tantalum,180.94788", "74,W,Tungsten,183.84", "75,Re,Rhenium,186.207", "76,Os,Osmium,190.23", "77,Ir,Iridium,192.217", "78,Pt,Platinum,195.084", "79,Au,Gold,196.966569", "80,Hg,Mercury,200.59", "81,Tl,Thallium,204.3833", "82,Pb,Lead,207.2", "83,Bi,Bismuth,208.98040", "84,Po,Polonium,209", "85,At,Astatine,210", "86,Rn,Radon,222", "87,Fr,Francium,223", "88,Ra,Radium,226", "89,Ac,Actinium,227", "90,Th,Thorium,232.03806", "91,Pa,Protactinium,231.03588", "92,U,Uranium,238.02891", "93,Np,Neptunium,237", "94,Pu,Plutonium,244", "95,Am,Americium,243", "96,Cm,Curium,247", "97,Bk,Berkelium,247", "98,Cf,Californium,251", "99,Es,Einsteinium,252", "100,Fm,Fermium,257", "101,Md,Mendelevium,258", "102,No,Nobelium,259", "103,Lr,Lawrencium,266", "104,Rf,Rutherfordium,267", "105,Db,Dubnium,268", "106,Sg,Seaborgium,269", "107,Bh,Bohrium,270", "108,Hs,Hassium,277", "109,Mt,Meitnerium,278", "110,Ds,Darmstadtium,281", "111,Rg,Roentgenium,282", "112,Cn,Copernicium,285", "113,Nh,Nihonium,284", "114,Fl,Flerovium,286", "115,Mc,Moscovium,290", "116,Lv,Livermorium,293", "117,Ts,Tennessine,294", "118,Og,Oganesson,294" )