Day 5
This commit is contained in:
parent
75482fe16c
commit
71c3cf9b38
4 changed files with 74 additions and 1 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -4,3 +4,4 @@ input
|
||||||
.tup
|
.tup
|
||||||
out
|
out
|
||||||
*.im
|
*.im
|
||||||
|
vis/
|
||||||
58
days/day05.st
Normal file
58
days/day05.st
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
Dictionary extend [
|
||||||
|
at: key inA: Type [^self at: key ifAbsentPut: [Type new]]
|
||||||
|
at: key inA: Type add: elt [ (self at: key inA: Type) add: elt ]
|
||||||
|
]
|
||||||
|
|
||||||
|
Object subclass: Ordering [
|
||||||
|
| beforeMap |
|
||||||
|
initialize [beforeMap := Dictionary new]
|
||||||
|
|
||||||
|
graphviz
|
||||||
|
[ AOC visualizeWithExt: '.dot' do: [
|
||||||
|
:stream |
|
||||||
|
stream << 'digraph {'.
|
||||||
|
beforeMap keysAndValuesDo: [
|
||||||
|
:k :vs | vs do: [
|
||||||
|
:v | stream << k << ' -> ' << v << ';'. ]].
|
||||||
|
stream << '}'.
|
||||||
|
]]
|
||||||
|
|
||||||
|
order: page1 before: page2
|
||||||
|
[ beforeMap at: page2 inA: Set add: page1 ]
|
||||||
|
addRule: ruleStr
|
||||||
|
[ ruleStr scanf: '%d|%d' with: [ :x :y | self order: x before: y ] ]
|
||||||
|
|
||||||
|
isValid: man
|
||||||
|
[ | mustNotOccur | mustNotOccur := Set new.
|
||||||
|
man do: [
|
||||||
|
:elt |
|
||||||
|
(mustNotOccur includes: elt) ifTrue: [^false].
|
||||||
|
mustNotOccur addAll: (beforeMap at: elt inA: Set). ].
|
||||||
|
^true ]
|
||||||
|
|
||||||
|
sort: man
|
||||||
|
[ ^man asSortedCollection: [ :x :y | ((beforeMap at: y) includes: x) ] ]
|
||||||
|
]
|
||||||
|
|
||||||
|
Collection extend [
|
||||||
|
middleElement [ ^self at: self size // 2 + 1 ]
|
||||||
|
]
|
||||||
|
|
||||||
|
AOC input: [ (stdin contents tokenize: (String with: $<10> with: $<10>))
|
||||||
|
letArrayInBlock: [
|
||||||
|
:rules :seqs | | ord mans |
|
||||||
|
ord := Ordering new.
|
||||||
|
rules lines do: [ :rule | ord addRule: rule ].
|
||||||
|
mans := seqs lines collect: [
|
||||||
|
:seq | seq chain tokenize: ','; collect: [:x | x asNumber] ].
|
||||||
|
"ord graphviz."
|
||||||
|
{ord . mans} ] ];
|
||||||
|
part1: [ :ord :mans | mans select: [ :man | ord isValid: man ] ];
|
||||||
|
part2: [ :ord :mans |
|
||||||
|
mans chain reject: [ :man | ord isValid: man ];
|
||||||
|
collect: [ :man | ord sort: man ] ];
|
||||||
|
result: [ :ordAndMans :part |
|
||||||
|
part chain valueWithArguments: ordAndMans;
|
||||||
|
collect: [:man | man middleElement];
|
||||||
|
sum ];
|
||||||
|
finish.
|
||||||
|
|
@ -22,10 +22,21 @@ AOC class extend [
|
||||||
"TODO: save as an image?"
|
"TODO: save as an image?"
|
||||||
finish
|
finish
|
||||||
[ | startTime stopTime |
|
[ | startTime stopTime |
|
||||||
|
(Smalltalk getenv: 'AOC_RUN') ifNil: [
|
||||||
|
stdout << 'AOC_RUN not set -- not running.'.
|
||||||
|
^nil ].
|
||||||
startTime := Time millisecondClock.
|
startTime := Time millisecondClock.
|
||||||
self run.
|
self run.
|
||||||
stopTime := Time millisecondClock.
|
stopTime := Time millisecondClock.
|
||||||
stdout << 'Time elapsed: ' << (stopTime - startTime) << 'ms'; nl. ]
|
stdout << 'Time elapsed: ' << (stopTime - startTime) << 'ms'; nl. ]
|
||||||
|
|
||||||
|
visualizeWithExt: ext do: block
|
||||||
|
[ | file io |
|
||||||
|
file := (Smalltalk getenv: 'AOC_VIS') ifNil: [^nil].
|
||||||
|
file := (file,ext) asFile.
|
||||||
|
file printNl.
|
||||||
|
file parent createDirectories.
|
||||||
|
io := file writeStream. [ block value: io ] ensure: [io close] ]
|
||||||
]
|
]
|
||||||
|
|
||||||
"--- Scanf ---"
|
"--- Scanf ---"
|
||||||
|
|
|
||||||
3
run.sh
3
run.sh
|
|
@ -22,4 +22,7 @@ else
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
export AOC_VIS="$DIR/vis/day$DAYP"
|
||||||
|
export AOC_RUN=1
|
||||||
|
|
||||||
exec gst -g "days/utils.st" "days/day$DAYP.st" < "$AOC_INPUT"
|
exec gst -g "days/utils.st" "days/day$DAYP.st" < "$AOC_INPUT"
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue