musifter

AoC 2025, day 2 (smalltalk)

Dec 2nd, 2025
34
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Smalltalk 1.35 KB | Source Code | 0 0
  1. #!/usr/local/bin/gst -q
  2.  
  3. Symbol extend      [ value: arg [^arg perform: self] ]
  4. Collection extend  [ sum [^self inject: 0 into: [:a :b | a + b]] ]
  5.  
  6. String extend [
  7.     " Interpret (\d+)-(\d+) string as an Interval "
  8.     asInterval [
  9.         | range |
  10.         range := (self subStrings: '-') collect: [:n | n asInteger].
  11.         ^Interval from: range first to: range second.
  12.     ]
  13. ]
  14.  
  15. Integer extend [
  16.     " Concatenation operation for natural numbers "
  17.     , arg  [ ^self * (10 raisedToInteger: (arg + 1) log ceiling) + arg ]
  18.     length [ ^(self + 1) log ceiling ]
  19. ]
  20.  
  21.  
  22. "
  23. | Mainline
  24. "
  25. input := (stdin contents subStrings: ',') collect: #asInterval.
  26.  
  27. part1 := 0.
  28. part2 := 0.
  29.  
  30. input do: [:range |
  31.    | i num factor invalid |
  32.     range displayNl.
  33.  
  34.     invalid := Set new.
  35.  
  36.     i := 1.
  37.     [(num := i, i) <= range last] whileTrue: [
  38.         (num between: range first and: range last) ifTrue: [ part1 := part1 + num ].
  39.  
  40.         factor := 10 raisedToInteger: i length.
  41.         [num < range first] whileTrue: [ num := num * factor + i ].
  42.         [num <= range last] whileTrue: [ invalid add: num.  num := num * factor + i ].
  43.  
  44.         i := i + 1.
  45.         (i \\ 10000 == 0) ifTrue: [ stderr nextPutAll: i asString; cr; flush ].
  46.     ].
  47.  
  48.     part2 := part2 + invalid sum.
  49. ].
  50.  
  51. ('Part 1: %1' % {part1}) displayNl.
  52. ('Part 2: %1' % {part2}) displayNl.
Advertisement
Add Comment
Please, Sign In to add comment