Day 6
This commit is contained in:
parent
0d9eb13b5b
commit
170d9a3447
3 changed files with 117 additions and 39 deletions
|
|
@ -1,44 +1,5 @@
|
||||||
Object subclass: Posn [
|
|
||||||
| x y | x [^x] y [^y] x: n [x:=n] y: n [y:=n]
|
|
||||||
+ o [ ^Posn x: x + o x y: y + o y ]
|
|
||||||
* n [ ^Posn x: x * n y: y * n ]
|
|
||||||
rotateCw [ ^Posn x: y y: x negated ]
|
|
||||||
rotateCcw [ ^Posn x: y negated y: x ]
|
|
||||||
rotate180 [ ^Posn x: x negated y: y negated ]
|
|
||||||
|
|
||||||
printOn: s [ s << '<' << x << ', ' << y << '>'. ]
|
|
||||||
]
|
|
||||||
Posn class extend [
|
|
||||||
x: x y: y [ ^Posn new x: x; y: y ]
|
|
||||||
up: n [ ^Posn x: 0 y: n negated ]
|
|
||||||
down: n [ ^Posn x: 0 y: n ]
|
|
||||||
left: n [ ^Posn x: n negated y: 0 ]
|
|
||||||
right: n [ ^Posn x: n y: 0 ]
|
|
||||||
up [^Posn up: 1]
|
|
||||||
down [^Posn down: 1]
|
|
||||||
left [^Posn left: 1]
|
|
||||||
right [^Posn right: 1]
|
|
||||||
]
|
|
||||||
|
|
||||||
Array extend [ asPosn [ ^Posn x: (self at: 1) y: (self at: 2) ] ]
|
|
||||||
Iterable extend [
|
Iterable extend [
|
||||||
orPats [ ^self fold: [:l :r | l or: r] ]
|
orPats [ ^self fold: [:l :r | l or: r] ]
|
||||||
asPosns [ ^self collect: [:it | it asPosn] ]
|
|
||||||
]
|
|
||||||
|
|
||||||
Object subclass: Grid [
|
|
||||||
| rows | rows: n [rows:=n]
|
|
||||||
at: pos [ ^(rows at: pos y ifAbsent: [^nil]) at: pos x ifAbsent: [nil] ]
|
|
||||||
height [^rows size] width [^(rows at: 1) size]
|
|
||||||
allPosnsOf: elt
|
|
||||||
[ | oc p | oc := OrderedCollection new.
|
|
||||||
(1 to: self height) do:
|
|
||||||
[ :y | (1 to: self width) do:
|
|
||||||
[ :x | p := Posn x: x y: y.
|
|
||||||
elt = (self at: p) ifTrue: [ oc add: p ] ] ].
|
|
||||||
^oc ]
|
|
||||||
|
|
||||||
printOn: st [ rows do: [ :r | st << r; nl ] ]
|
|
||||||
]
|
]
|
||||||
|
|
||||||
Object subclass: Pattern [
|
Object subclass: Pattern [
|
||||||
|
|
|
||||||
58
days/day06.st
Normal file
58
days/day06.st
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
Grid extend [
|
||||||
|
| guard dir origGuard visitedPosns |
|
||||||
|
|
||||||
|
visitedPosns: n [visitedPosns:=n]
|
||||||
|
visitedPosns [^visitedPosns]
|
||||||
|
dir [^dir]
|
||||||
|
guard
|
||||||
|
[ guard ifNotNil: [:it|^it] ifNil:
|
||||||
|
[ self allPosnsDo:
|
||||||
|
[ :pos |
|
||||||
|
(self at: pos) = $^ ifTrue: [
|
||||||
|
origGuard := pos.
|
||||||
|
self at: pos put: $..
|
||||||
|
self resetGuard.
|
||||||
|
^guard.
|
||||||
|
]]].
|
||||||
|
^nil ]
|
||||||
|
|
||||||
|
resetGuard [ guard := origGuard. dir := Posn up. ]
|
||||||
|
|
||||||
|
isSolid: p [ ^(self at: p) = $# ]
|
||||||
|
|
||||||
|
copy [ ^Grid new rows: rows; restore: self state ]
|
||||||
|
|
||||||
|
stepGuard
|
||||||
|
[ self guard.
|
||||||
|
[self isSolid: (guard + dir)] whileTrue:
|
||||||
|
[ dir := dir rotateCcw. ].
|
||||||
|
guard := guard + dir. ]
|
||||||
|
|
||||||
|
state [^{self guard . self dir}]
|
||||||
|
restore: st [guard := st at: 1. dir := st at: 2]
|
||||||
|
|
||||||
|
guardOob [^(self at: self guard) isNil]
|
||||||
|
|
||||||
|
walkDo: block
|
||||||
|
[ [self guardOob] whileFalse: [block value. self stepGuard] ]
|
||||||
|
|
||||||
|
hasCycle
|
||||||
|
[ | fast | fast := self resetGuard copy.
|
||||||
|
[fast guardOob] whileFalse:
|
||||||
|
[self stepGuard. fast stepGuard stepGuard.
|
||||||
|
self state = fast state ifTrue: [^true]].
|
||||||
|
^false ]
|
||||||
|
]
|
||||||
|
|
||||||
|
AOC input: [ Grid new rows: stdin toLines asArray ];
|
||||||
|
part1: [ :grid | | posns |
|
||||||
|
posns := Set new.
|
||||||
|
grid walkDo: [posns add: grid guard].
|
||||||
|
grid visitedPosns: posns.
|
||||||
|
posns ];
|
||||||
|
part2: [ :grid | | i | i := 1.
|
||||||
|
grid visitedPosns select:
|
||||||
|
[ :p | grid at: p put: $#. i printNl. i := i + 1.
|
||||||
|
[grid hasCycle] ensure: [grid at: p put: $.] ] ];
|
||||||
|
result: [ :grid :part | (part value: grid resetGuard) size ];
|
||||||
|
finish.
|
||||||
|
|
@ -189,3 +189,62 @@ nil subclass: MessageChain [
|
||||||
MessageChain class >> new [ ^self basicNew ]
|
MessageChain class >> new [ ^self basicNew ]
|
||||||
]
|
]
|
||||||
Object extend [ chain [ ^MessageChain new pipelineValue: self ] ]
|
Object extend [ chain [ ^MessageChain new pipelineValue: self ] ]
|
||||||
|
|
||||||
|
Object subclass: Posn [
|
||||||
|
| x y | x [^x] y [^y] x: n [x:=n] y: n [y:=n]
|
||||||
|
+ o [ ^Posn x: x + o x y: y + o y ]
|
||||||
|
* n [ ^Posn x: x * n y: y * n ]
|
||||||
|
rotateCw [ ^Posn x: y y: x negated ]
|
||||||
|
rotateCcw [ ^Posn x: y negated y: x ]
|
||||||
|
rotate180 [ ^Posn x: x negated y: y negated ]
|
||||||
|
|
||||||
|
< o [ ^(x < o x) & (y < o y) ]
|
||||||
|
<= o [ ^(x <= o x) & (y <= o y) ]
|
||||||
|
> o [ ^(x > o x) & (y > o y) ]
|
||||||
|
>= o [ ^(x >= o x) & (y >= o y) ]
|
||||||
|
= o [ ^(x = o x) & (y = o y) ]
|
||||||
|
hash [ ^{x. y} hash ]
|
||||||
|
|
||||||
|
printOn: s [ s << '<' << x << ', ' << y << '>'. ]
|
||||||
|
]
|
||||||
|
Posn class extend [
|
||||||
|
x: x y: y [ ^Posn new x: x; y: y ]
|
||||||
|
up: n [ ^Posn x: 0 y: n negated ]
|
||||||
|
down: n [ ^Posn x: 0 y: n ]
|
||||||
|
left: n [ ^Posn x: n negated y: 0 ]
|
||||||
|
right: n [ ^Posn x: n y: 0 ]
|
||||||
|
up [^Posn up: 1]
|
||||||
|
down [^Posn down: 1]
|
||||||
|
left [^Posn left: 1]
|
||||||
|
right [^Posn right: 1]
|
||||||
|
zero [^Posn x: 0 y: 0]
|
||||||
|
]
|
||||||
|
|
||||||
|
Array extend [ asPosn [ ^Posn x: (self at: 1) y: (self at: 2) ] ]
|
||||||
|
Iterable extend [ asPosns [ ^self collect: [:it | it asPosn] ] ]
|
||||||
|
|
||||||
|
Object subclass: Grid [
|
||||||
|
| rows | rows: n [rows:=n]
|
||||||
|
|
||||||
|
at: pos [ ^(rows at: pos y ifAbsent: [^nil]) at: pos x ifAbsent: [nil] ]
|
||||||
|
at: pos put: elt
|
||||||
|
[ ^(rows at: pos y ifAbsent: [self error: 'Out of bounds'])
|
||||||
|
at: pos x put: elt ]
|
||||||
|
|
||||||
|
isInBounds: posn
|
||||||
|
[ posn > Posn zero ifFalse: [^false].
|
||||||
|
^posn <= (Posn x: self width y: self height) ]
|
||||||
|
|
||||||
|
height [^rows size] width [^(rows at: 1) size]
|
||||||
|
|
||||||
|
allPosnsDo: block
|
||||||
|
[ (1 to: self height) do:
|
||||||
|
[ :y | (1 to: self width) do:
|
||||||
|
[ :x | block value: (Posn x: x y: y) ] ] ]
|
||||||
|
allPosnsOf: elt
|
||||||
|
[ | oc | oc := OrderedCollection new.
|
||||||
|
self allPosnsDo: [ :p | elt = (self at: p) ifTrue: [ oc add: p ] ].
|
||||||
|
^oc ]
|
||||||
|
|
||||||
|
printOn: st [ rows do: [ :r | st << r; nl ] ]
|
||||||
|
]
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue