day2_part1.carbon 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  2. // Exceptions. See /LICENSE for license information.
  3. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. // https://adventofcode.com/2024/day/2
  5. import Core library "io";
  6. import library "day2_common";
  7. import library "io_utils";
  8. class ReportState {
  9. fn Make() -> ReportState {
  10. return {.levels_so_far = 0, .previous = 0,
  11. .increasing = false, .safe_so_far = true};
  12. }
  13. fn Add[ref self: Self](level: i32) {
  14. ++self.levels_so_far;
  15. if (self.levels_so_far >= 2) {
  16. if (not IsSafeDelta(self.previous, level)) {
  17. // Difference is zero or too large.
  18. self.safe_so_far = false;
  19. }
  20. var is_increase: bool = level > self.previous;
  21. if (self.levels_so_far == 2) {
  22. self.increasing = is_increase;
  23. } else if (is_increase != self.increasing) {
  24. // Not monotone.
  25. self.safe_so_far = false;
  26. }
  27. }
  28. self.previous = level;
  29. }
  30. var levels_so_far: i32;
  31. var previous: i32;
  32. var increasing: bool;
  33. var safe_so_far: bool;
  34. }
  35. fn ReadReport() -> ReportState {
  36. returned var report: ReportState = ReportState.Make();
  37. var n: i32;
  38. while (ReadInt(&n)) {
  39. report.Add(n);
  40. SkipSpaces();
  41. }
  42. return var;
  43. }
  44. fn Run() {
  45. var safe_reports: i32 = 0;
  46. while (true) {
  47. var report: ReportState = ReadReport();
  48. if (report.levels_so_far == 0) {
  49. break;
  50. }
  51. if (report.safe_so_far) {
  52. ++safe_reports;
  53. }
  54. SkipNewline();
  55. }
  56. Core.Print(safe_reports);
  57. }