You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
2.0 KiB

3 years ago
  1. using System;
  2. using static System.Console;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using Xunit;
  7. namespace AdventOfCode {
  8. public class Day05 {
  9. static int FindRow(string boardingPass, int low, int high) {
  10. if (low == high) {
  11. return low;
  12. }
  13. int midpoint = (high + low) / 2;
  14. if (boardingPass[0] == 'F' || boardingPass[0] == 'L') {
  15. return FindRow(boardingPass.Substring(1), low, midpoint);
  16. } else {
  17. return FindRow(boardingPass.Substring(1), midpoint + 1, high);
  18. }
  19. }
  20. static int FindRow(string boardingPass) {
  21. return FindRow(boardingPass, 0, 127);
  22. }
  23. static int FindColumn(string boardingPass) {
  24. return FindRow(boardingPass.Substring(7), 0, 7);
  25. }
  26. static int FindSeatId(string boardingPass) {
  27. return FindRow(boardingPass) * 8 + FindColumn(boardingPass);
  28. }
  29. static int Part1() {
  30. string[] passes = File.ReadAllLines(Util.RootDir + "day05.txt");
  31. int maxId = 0;
  32. foreach (string boardingPass in passes) {
  33. int id = FindSeatId(boardingPass);
  34. if (id > maxId) {
  35. maxId = id;
  36. }
  37. }
  38. return maxId;
  39. }
  40. static int Part2() {
  41. string[] passes = File.ReadAllLines(Util.RootDir + "day05.txt");
  42. var seatIds = new HashSet<int>();
  43. foreach (string boardingPass in passes) {
  44. int id = FindSeatId(boardingPass);
  45. seatIds.Add(id);
  46. }
  47. for (int i = 1; i < 828; i++) {
  48. if (!seatIds.Contains(i) && seatIds.Contains(i - 1) && seatIds.Contains(i + 1)) {
  49. return i;
  50. }
  51. }
  52. return -1;
  53. }
  54. [Fact]
  55. public static void Test() {
  56. Assert.Equal(44, FindRow("FBFBBFFRLR"));
  57. Assert.Equal(5, FindColumn("FBFBBFFRLR"));
  58. Assert.Equal(357, FindSeatId("FBFBBFFRLR"));
  59. Assert.Equal(567, FindSeatId("BFFFBBFRRR"));
  60. Assert.Equal(119, FindSeatId("FFFBBBFRRR"));
  61. Assert.Equal(820, FindSeatId("BBFFBBFRLL"));
  62. Assert.Equal(828, Part1());
  63. WriteLine(Part2());
  64. }
  65. }
  66. }