public override string Solve(Bomb bomb) { SetInitialPosition(bomb); if (StartPosition == null) { return("Cut all the wires on descending numeral order."); } var result = "Cut wires "; var letter = bomb.GetSerialCharacters()[0]; while (!StartPosition.Resolved) { if (!StartPosition.Previous.Resolved || (ReversedOrder && !StartPosition.Next.Resolved)) { result += StartPosition.Start + "-" + StartPosition.End + ", "; StartPosition.Resolved = true; StartPosition.ShouldBeCut = true; if (ReversedOrder) { StartPosition = StartPosition.Previous; } else { StartPosition = StartPosition.Next; } continue; } switch (letter.ToUpper()) { case "A": case "N": { if (StartPosition.Previous.Color != "yellow" && StartPosition.Previous.Color != "blue" && StartPosition.Previous.Color != "green") { StartPosition.ShouldBeCut = true; result += StartPosition.Start + "-" + StartPosition.End + ", "; } if (ReversedOrder) { StartPosition = StartPosition.Previous; var number = InternalFunctions.GetNumberFromLetter(letter) - 1; if (number == -1) { number = 26; } letter = InternalFunctions.GetLetterFromNumber(number); } else { StartPosition = StartPosition.Next; var number = InternalFunctions.GetNumberFromLetter(letter) + 1; if (number == 27) { number = 1; } letter = InternalFunctions.GetLetterFromNumber(number); } break; } case "B": case "O": { if (StartPosition.Start % 2 == 0) { result += StartPosition.Start + "-" + StartPosition.End + ", "; StartPosition.ShouldBeCut = true; } if (ReversedOrder) { StartPosition = StartPosition.Previous; var number = InternalFunctions.GetNumberFromLetter(letter) - 1; if (number == -1) { number = 26; } letter = InternalFunctions.GetLetterFromNumber(number); } else { StartPosition = StartPosition.Next; var number = InternalFunctions.GetNumberFromLetter(letter) + 1; if (number == 27) { number = 1; } letter = InternalFunctions.GetLetterFromNumber(number); } break; } case "C": case "P": { if (StartPosition.Previous.ShouldBeCut) { result += StartPosition.Start + "-" + StartPosition.End + ", "; StartPosition.ShouldBeCut = true; } if (ReversedOrder) { StartPosition = StartPosition.Previous; var number = InternalFunctions.GetNumberFromLetter(letter) - 1; if (number == -1) { number = 26; } letter = InternalFunctions.GetLetterFromNumber(number); } else { StartPosition = StartPosition.Next; var number = InternalFunctions.GetNumberFromLetter(letter) + 1; if (number == 27) { number = 1; } letter = InternalFunctions.GetLetterFromNumber(number); } break; } case "D": case "Q": { if (StartPosition.Previous.Color == "red" || StartPosition.Previous.Color == "blue" || StartPosition.Previous.Color == "black") { result += StartPosition.Start + "-" + StartPosition.End + ", "; StartPosition.ShouldBeCut = true; } if (ReversedOrder) { StartPosition = StartPosition.Previous; var number = InternalFunctions.GetNumberFromLetter(letter) - 1; if (number == -1) { number = 26; } letter = InternalFunctions.GetLetterFromNumber(number); } else { StartPosition = StartPosition.Next; var number = InternalFunctions.GetNumberFromLetter(letter) + 1; if (number == 27) { number = 1; } letter = InternalFunctions.GetLetterFromNumber(number); } break; } case "E": case "R": { var list = new List <string>(); if (!list.Exists(x => x == StartPosition.Previous.Previous.Previous.Color)) { list.Add(StartPosition.Previous.Previous.Previous.Color); } if (!list.Exists(x => x == StartPosition.Previous.Previous.Color)) { list.Add(StartPosition.Previous.Previous.Color); } if (!list.Exists(x => x == StartPosition.Previous.Color)) { list.Add(StartPosition.Previous.Color); } if (list.Count == 2) { result += StartPosition.Start + "-" + StartPosition.End + ", "; StartPosition.ShouldBeCut = true; } if (ReversedOrder) { StartPosition = StartPosition.Previous; var number = InternalFunctions.GetNumberFromLetter(letter) - 1; if (number == -1) { number = 26; } letter = InternalFunctions.GetLetterFromNumber(number); } else { StartPosition = StartPosition.Next; var number = InternalFunctions.GetNumberFromLetter(letter) + 1; if (number == 27) { number = 1; } letter = InternalFunctions.GetLetterFromNumber(number); } break; } case "F": case "S": { if ((StartPosition.Previous.Previous.Color == StartPosition.Color && StartPosition.Previous.Color != StartPosition.Color) || (StartPosition.Previous.Color == StartPosition.Color && StartPosition.Previous.Previous.Color != StartPosition.Color)) { result += StartPosition.Start + "-" + StartPosition.End + ", "; StartPosition.ShouldBeCut = true; } if (ReversedOrder) { StartPosition = StartPosition.Previous; var number = InternalFunctions.GetNumberFromLetter(letter) - 1; if (number == -1) { number = 26; } letter = InternalFunctions.GetLetterFromNumber(number); } else { StartPosition = StartPosition.Next; var number = InternalFunctions.GetNumberFromLetter(letter) + 1; if (number == 27) { number = 1; } letter = InternalFunctions.GetLetterFromNumber(number); } break; } case "G": case "T": { if (StartPosition.Previous.Color == "yellow" || StartPosition.Previous.Color == "white" || StartPosition.Previous.Color == "green") { result += StartPosition.Start + "-" + StartPosition.End + ", "; StartPosition.ShouldBeCut = true; } if (ReversedOrder) { StartPosition = StartPosition.Previous; var number = InternalFunctions.GetNumberFromLetter(letter) - 1; if (number == -1) { number = 26; } letter = InternalFunctions.GetLetterFromNumber(number); } else { StartPosition = StartPosition.Next; var number = InternalFunctions.GetNumberFromLetter(letter) + 1; if (number == 27) { number = 1; } letter = InternalFunctions.GetLetterFromNumber(number); } break; } case "H": case "U": { if (!StartPosition.Previous.ShouldBeCut) { result += StartPosition.Start + "-" + StartPosition.End + ", "; StartPosition.ShouldBeCut = true; } if (ReversedOrder) { StartPosition = StartPosition.Previous; var number = InternalFunctions.GetNumberFromLetter(letter) - 1; if (number == -1) { number = 26; } letter = InternalFunctions.GetLetterFromNumber(number); } else { StartPosition = StartPosition.Next; var number = InternalFunctions.GetNumberFromLetter(letter) + 1; if (number == 27) { number = 1; } letter = InternalFunctions.GetLetterFromNumber(number); } break; } case "I": case "V": { if (StartPosition.Previous.Start + 1 != StartPosition.Start) { result += StartPosition.Start + "-" + StartPosition.End + ", "; StartPosition.ShouldBeCut = true; } if (ReversedOrder) { StartPosition = StartPosition.Previous; var number = InternalFunctions.GetNumberFromLetter(letter) - 1; if (number == -1) { number = 26; } letter = InternalFunctions.GetLetterFromNumber(number); } else { StartPosition = StartPosition.Next; var number = InternalFunctions.GetNumberFromLetter(letter) + 1; if (number == 27) { number = 1; } letter = InternalFunctions.GetLetterFromNumber(number); } break; } case "J": case "W": { if (StartPosition.Previous.Color != "white" || StartPosition.Previous.Color != "black" || StartPosition.Previous.Color != "red") { result += StartPosition.Start + "-" + StartPosition.End + ", "; StartPosition.ShouldBeCut = true; } if (ReversedOrder) { StartPosition = StartPosition.Previous; var number = InternalFunctions.GetNumberFromLetter(letter) - 1; if (number == -1) { number = 26; } letter = InternalFunctions.GetLetterFromNumber(number); } else { StartPosition = StartPosition.Next; var number = InternalFunctions.GetNumberFromLetter(letter) + 1; if (number == 27) { number = 1; } letter = InternalFunctions.GetLetterFromNumber(number); } break; } case "K": case "X": { if (StartPosition.Previous.Previous.Color != StartPosition.Previous.Color) { result += StartPosition.Start + "-" + StartPosition.End + ", "; StartPosition.ShouldBeCut = true; } if (ReversedOrder) { StartPosition = StartPosition.Previous; var number = InternalFunctions.GetNumberFromLetter(letter) - 1; if (number == -1) { number = 26; } letter = InternalFunctions.GetLetterFromNumber(number); } else { StartPosition = StartPosition.Next; var number = InternalFunctions.GetNumberFromLetter(letter) + 1; if (number == 27) { number = 1; } letter = InternalFunctions.GetLetterFromNumber(number); } break; } case "L": case "Y": { if (!(StartPosition.Previous.End <= 6)) { result += StartPosition.Start + "-" + StartPosition.End + ", "; StartPosition.ShouldBeCut = true; } if (ReversedOrder) { StartPosition = StartPosition.Previous; var number = InternalFunctions.GetNumberFromLetter(letter) - 1; if (number == -1) { number = 26; } letter = InternalFunctions.GetLetterFromNumber(number); } else { StartPosition = StartPosition.Next; var number = InternalFunctions.GetNumberFromLetter(letter) + 1; if (number == 27) { number = 1; } letter = InternalFunctions.GetLetterFromNumber(number); } break; } case "M": case "Z": { var list = new List <string> { "white", "black" }; if (!list.Contains(StartPosition.Previous.Previous.Color) || !list.Contains(StartPosition.Previous.Color)) { result += StartPosition.Start + "-" + StartPosition.End + ", "; StartPosition.ShouldBeCut = true; } if (ReversedOrder) { StartPosition = StartPosition.Previous; var number = InternalFunctions.GetNumberFromLetter(letter) - 1; if (number == -1) { number = 26; } letter = InternalFunctions.GetLetterFromNumber(number); } else { StartPosition = StartPosition.Next; var number = InternalFunctions.GetNumberFromLetter(letter) + 1; if (number == 27) { number = 1; } letter = InternalFunctions.GetLetterFromNumber(number); } break; } } StartPosition.Previous.Resolved = true; } Solved = true; return(result.Substring(0, result.Length - 2) + "."); }
public void SetInitialPosition(Bomb bomb) { var position = StartPosition; if (bomb.HasPort("rj")) { while (position.Start != 4) { position = position.Next; } if (position.End == 5) { while (StartPosition.Start != 4) { StartPosition = StartPosition.Next; } return; } } position = StartPosition; while (position.Start != bomb.GetBatteries() && position.End != 1) { position = position.Next; } if (position.End != 1) { while (StartPosition.Start != bomb.GetBatteries()) { StartPosition = StartPosition.Next; } return; } position = StartPosition; var bombNumber = bomb.GetSerialFirstNumberDigit(); while (position.Start != bombNumber && position.End != 1) { position = position.Next; } if (position.End != 1) { while (StartPosition.Start != bomb.GetBatteries()) { StartPosition = StartPosition.Next; } return; } if (bomb.HasLitIndicator("clr")) { StartPosition = null; return; } while (StartPosition.Previous.Start < StartPosition.Start) { StartPosition = StartPosition.Previous; } ReversedOrder = true; }