public override string Solve(Bomb bomb) { var message = ""; Solution acidSolution = Solutions.First(x => x.Color == Color); Solution baseSolution; //Defining base to add if (bomb.HasLitIndicator("NSA") && bomb.HasExactlyBatteries(3)) { baseSolution = Solutions.First(x => x.Name == "ammonia"); } else if (bomb.HasLitIndicator("CAR") || bomb.HasLitIndicator("FRQ") || bomb.HasLitIndicator("IND")) { baseSolution = Solutions.First(x => x.Name == "potassium hydroxide"); } else if (!bomb.HasManyPorts(1) && bomb.HasSerialVowel()) { baseSolution = Solutions.First(x => x.Name == "lythium hydroxide"); } else if (bomb.HasIndicatorWithLetterInWord(acidSolution.Formula)) { baseSolution = Solutions.First(x => x.Name == "potassium hydroxide"); } else if (bomb.GetDBatteries() > bomb.GetAABatteries()) { baseSolution = Solutions.First(x => x.Name == "ammonia"); } else if (acidSolution.AnionAtomicNumber < 20) { baseSolution = Solutions.First(x => x.Name == "sodium hydroxide"); } else { baseSolution = Solutions.First(x => x.Name == "lythium hydroxide"); } message += baseSolution.Message; //Defining acid concentration double acidConcentration = 0; acidConcentration += acidSolution.AnionAtomicNumber; acidConcentration -= baseSolution.CationAtomicNumber; if (InternalFunctions.HasVowelInWord(acidSolution.AnionFormula) || InternalFunctions.HasVowelInWord(baseSolution.CationFormula)) { acidConcentration -= 4; } if (acidSolution.AnionFormula.Length == baseSolution.CationFormula.Length) { acidConcentration *= 3; } acidConcentration = InternalFunctions.GetNumber(acidConcentration.ToString().Last().ToString()); if (acidConcentration == 0) { acidConcentration = Volume * 2 / 5; } acidConcentration /= 10; //Defining base concentration double baseConcentration = 0; if (bomb.GetBatteriesHolders() > bomb.GetPortsQuantity() && bomb.GetBatteriesHolders() > bomb.GetIndicators()) { baseConcentration = 5; } if (bomb.GetPortTypesQuantity() > bomb.GetBatteriesHolders() && bomb.GetPortTypesQuantity() > bomb.GetIndicators()) { baseConcentration = 10; } if (bomb.GetIndicators() > bomb.GetBatteriesHolders() && bomb.GetIndicators() > bomb.GetPortTypesQuantity()) { baseConcentration = 20; } if (bomb.GetBatteriesHolders() == bomb.GetPortTypesQuantity() && bomb.GetPortTypesQuantity() == bomb.GetIndicators()) { var difference5 = Math.Abs(5 - baseSolution.CationAtomicNumber); var difference10 = Math.Abs(10 - baseSolution.CationAtomicNumber); var difference20 = Math.Abs(20 - baseSolution.CationAtomicNumber); if (difference5 < difference10 && difference5 < difference20) { baseConcentration = 5; } if (difference10 < difference5 && difference10 < difference20) { baseConcentration = 10; } if (difference20 < difference5 && difference20 < difference10) { baseConcentration = 20; } } if ((acidSolution.Formula == "HI" && baseSolution.Formula == "KOH") || (acidSolution.Formula == "HCl" && baseSolution.Formula == "NH3")) { baseConcentration = 20; } //Defining drops double drops = 20; drops /= baseConcentration; drops *= Volume; drops *= acidConcentration; message += $"{(int)drops} drops. "; //Defining filter switch (acidSolution.Formula) { case "HBr": if (baseSolution.Formula == "NH3" || baseSolution.Formula == "NaOH") { message += "Filter off."; } else { message += "Filter on."; } break; case "HF": if (baseSolution.Formula == "KOH" || baseSolution.Formula == "NaOH") { message += "Filter off."; } else { message += "Filter on."; } break; case "HCl": if (baseSolution.Formula == "LiOH") { message += "Filter off."; } else { message += "Filter on."; } break; case "HI": if (baseSolution.Formula != "NaOH") { message += "Filter off."; } else { message += "Filter on."; } break; } Solved = true; return(message); }