Day 7 cleanup
This commit is contained in:
parent
2e5c426dcf
commit
6b558d9330
2 changed files with 42 additions and 10 deletions
|
|
@ -6,7 +6,9 @@ Object subclass: MulOp
|
||||||
^tgt quo: n ] ]
|
^tgt quo: n ] ]
|
||||||
MulOp subclass: CatOp
|
MulOp subclass: CatOp
|
||||||
[ tryDo: n target: tgt
|
[ tryDo: n target: tgt
|
||||||
[ | p10 | p10 := 10 raisedTo: ((n + 1) log: 10) ceiling.
|
[ | p10 |
|
||||||
|
p10 := (n + 1) ceilingLog: 10.
|
||||||
|
p10 := 10 raisedTo: p10.
|
||||||
^super tryDo: p10 target: tgt - n ] ]
|
^super tryDo: p10 target: tgt - n ] ]
|
||||||
|
|
||||||
Object subclass: Equation [
|
Object subclass: Equation [
|
||||||
|
|
@ -17,24 +19,27 @@ Object subclass: Equation [
|
||||||
|
|
||||||
printOn: dst [dst << target << ': ' << numbers]
|
printOn: dst [dst << target << ': ' << numbers]
|
||||||
|
|
||||||
|
"Backtracking search right-to-left over the number sequence."
|
||||||
canSolveFrom: idx target: tgt with: ops
|
canSolveFrom: idx target: tgt with: ops
|
||||||
[ | n | n := numbers at: idx.
|
[ | n n1 ok | n := numbers at: idx.
|
||||||
idx = 1 ifTrue: [^n = tgt].
|
idx = 1 ifTrue: [^n = tgt].
|
||||||
tgt < n ifTrue: [^false].
|
tgt < n ifTrue: [^false].
|
||||||
ops do: [
|
ops do: [
|
||||||
:op |
|
:op | n1 := op tryDo: n target: tgt.
|
||||||
(op tryDo: n target: tgt) ifNotNil:
|
n1 ifNotNil: [
|
||||||
[:it|(self canSolveFrom: idx - 1 target: it with: ops) ifTrue: [^true]]].
|
ok := self canSolveFrom: idx - 1 target: n1 with: ops.
|
||||||
|
ok ifTrue: [^true] ]].
|
||||||
^false ]
|
^false ]
|
||||||
canSolveWith: ops [^self canSolveFrom: numbers size target: target with: ops]
|
canSolveWith: ops [^self canSolveFrom: numbers size target: target with: ops]
|
||||||
]
|
]
|
||||||
|
|
||||||
Equation class extend [
|
Equation class extend [
|
||||||
parse: line
|
parse: line
|
||||||
[ ^(line tokenize: ': ') letArrayInBlock:
|
[^(line tokenize: ': ') letArrayInBlock: [
|
||||||
[ :target :numbers |
|
:target :numbers |
|
||||||
Equation new target: target asNumber;
|
Equation new target: target asNumber;
|
||||||
numbers: ((numbers tokenize: ' ') collect: [:it|it asNumber]) ] ]
|
numbers: ((numbers tokenize: ' ')
|
||||||
|
collect: [:it|it asNumber])]]
|
||||||
]
|
]
|
||||||
|
|
||||||
AOC input: [ stdin toLines collect: [:line | Equation parse: line] ];
|
AOC input: [ stdin toLines collect: [:line | Equation parse: line] ];
|
||||||
|
|
@ -42,6 +47,6 @@ AOC input: [ stdin toLines collect: [:line | Equation parse: line] ];
|
||||||
part2: {CatOp new. MulOp new. AddOp new};
|
part2: {CatOp new. MulOp new. AddOp new};
|
||||||
result: [ :eqns :part |
|
result: [ :eqns :part |
|
||||||
eqns chain select: [:eqn | eqn canSolveWith: part];
|
eqns chain select: [:eqn | eqn canSolveWith: part];
|
||||||
collect: [:it|it testValue];
|
collect: [:it | it testValue];
|
||||||
sum ];
|
sum ];
|
||||||
finish.
|
finish.
|
||||||
|
|
|
||||||
|
|
@ -254,3 +254,30 @@ Object subclass: Grid [
|
||||||
|
|
||||||
printOn: st [ rows do: [ :r | st << r; nl ] ]
|
printOn: st [ rows do: [ :r | st << r; nl ] ]
|
||||||
]
|
]
|
||||||
|
|
||||||
|
Integer extend [
|
||||||
|
ceilingDiv: denom [ ^((self - 1) // denom) + 1 ]
|
||||||
|
|
||||||
|
"The original implementation was incorrect. Here is the correct code:"
|
||||||
|
ceilingLog: radix [
|
||||||
|
"Answer (self log: radix) ceiling. Optimized to answer an integer."
|
||||||
|
|
||||||
|
<category: 'math methods'>
|
||||||
|
| me answer |
|
||||||
|
self < self zero ifTrue:
|
||||||
|
[^self arithmeticError: 'cannot extract logarithm of a negative number'].
|
||||||
|
radix <= radix unity ifTrue:
|
||||||
|
[radix <= radix zero
|
||||||
|
ifTrue: [^self arithmeticError: 'base of a logarithm cannot be negative'].
|
||||||
|
radix = radix unity
|
||||||
|
ifTrue: [^self arithmeticError: 'base of a logarithm cannot be 1'].
|
||||||
|
^(self floorLog: radix reciprocal) negated].
|
||||||
|
radix isInteger ifFalse: [^(radix coerce: self) ceilingLog: radix].
|
||||||
|
me := self.
|
||||||
|
answer := 1.
|
||||||
|
[me > radix] whileTrue:
|
||||||
|
[me := me ceilingDiv: radix. "originally: me // radix."
|
||||||
|
answer := answer + 1].
|
||||||
|
^answer
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue