summaryrefslogtreecommitdiffstats
path: root/2024/tcl/02.tcl
blob: 8cc14f32e9c5d40059a9a7eb82d0483add4a008e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/bin/env tclsh

source lib.tcl
setup 2

puts {Part 1: Count "safe" ordered sequences with intervals such that 1 <= x <= 3.}

proc row_errs {row} {
  set report [lassign $row first second]
  set neg [expr {abs($second - $first) != ($second - $first)}]
  set prev $first

  set row_errs 0
  foreach num [concat $second $report] {
    if {$neg != (abs($num - $prev) != ($num - $prev)) ||
        abs($num - $prev) > 3 || abs($num - $prev) < 1} {
      incr row_errs
    } else {
      set prev $num
    }
  }
  return $row_errs
}

foreach report $input {
  if ![row_errs $report] { incr safe_count; continue }
  # naive, but handles a case like [1 4 2 3] where removing 2 makes it
  # safe but an iterative approach only trips on [2]. backtracking
  # might be better but idc
  for {set i 0} {$i < [llength $report]} {incr i} {
    if ![row_errs [lreplace $report $i $i]] {
      incr dampened_safe_count
      break
    }
  }
}

incr dampened_safe_count $safe_count

puts "Safe sequence count: $safe_count"

puts ""
puts {Part 2: Tolerate 1 bad entry in a report.}

puts "Dampened sequence count: $dampened_safe_count"