Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/local/bin/gst -q
- Symbol extend [ value: arg [^arg perform: self] ]
- Collection extend [ sum [^self inject: 0 into: [:a :b | a + b]] ]
- String extend [
- " Interpret (\d+)-(\d+) string as an Interval "
- asInterval [
- | range |
- range := (self subStrings: '-') collect: [:n | n asInteger].
- ^Interval from: range first to: range second.
- ]
- ]
- Integer extend [
- " Concatenation operation for natural numbers "
- , arg [ ^self * (10 raisedToInteger: (arg + 1) log ceiling) + arg ]
- length [ ^(self + 1) log ceiling ]
- ]
- "
- | Mainline
- "
- input := (stdin contents subStrings: ',') collect: #asInterval.
- part1 := 0.
- part2 := 0.
- input do: [:range |
- | i num factor invalid |
- range displayNl.
- invalid := Set new.
- i := 1.
- [(num := i, i) <= range last] whileTrue: [
- (num between: range first and: range last) ifTrue: [ part1 := part1 + num ].
- factor := 10 raisedToInteger: i length.
- [num < range first] whileTrue: [ num := num * factor + i ].
- [num <= range last] whileTrue: [ invalid add: num. num := num * factor + i ].
- i := i + 1.
- (i \\ 10000 == 0) ifTrue: [ stderr nextPutAll: i asString; cr; flush ].
- ].
- part2 := part2 + invalid sum.
- ].
- ('Part 1: %1' % {part1}) displayNl.
- ('Part 2: %1' % {part2}) displayNl.
Advertisement
Add Comment
Please, Sign In to add comment