annotate 2017/day08/app.d @ 35:1d99d733cf13 default tip @

day08: replace static foreach with workaround
author Jordi Gutiérrez Hermoso <jordigh@octave.org>
date Tue, 16 Jan 2018 11:28:55 -0500
parents bc652fa0a645
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
1 import std.algorithm: max, maxElement;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
2 import std.regex;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
3 import std.stdio;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
4 import std.conv: to;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
5
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
6 int[string] registers;
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
7 int maxSoFar = 0;
35
1d99d733cf13 day08: replace static foreach with workaround
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 33
diff changeset
8 bool function(int,int)[string] comparisons;
8
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
9
35
1d99d733cf13 day08: replace static foreach with workaround
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 33
diff changeset
10 auto getComparisons(Args...)() {
1d99d733cf13 day08: replace static foreach with workaround
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 33
diff changeset
11 foreach(cmp; Args) {
1d99d733cf13 day08: replace static foreach with workaround
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 33
diff changeset
12 comparisons[cmp] = mixin("function(int a, int b) => a "~cmp~" b");
1d99d733cf13 day08: replace static foreach with workaround
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 33
diff changeset
13 }
1d99d733cf13 day08: replace static foreach with workaround
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 33
diff changeset
14 return comparisons;
1d99d733cf13 day08: replace static foreach with workaround
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 33
diff changeset
15 }
1d99d733cf13 day08: replace static foreach with workaround
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 33
diff changeset
16
1d99d733cf13 day08: replace static foreach with workaround
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 33
diff changeset
17 shared static this() {
1d99d733cf13 day08: replace static foreach with workaround
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 33
diff changeset
18 comparisons = getComparisons!("<", ">", "==", "<=", ">=", "!=");
33
bc652fa0a645 Move all solutions to per-day subdirs
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 8
diff changeset
19 }
bc652fa0a645 Move all solutions to per-day subdirs
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 8
diff changeset
20
8
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
21 void evalInstruction(string line) {
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
22 static instructionRegex = regex(
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
23 r"(?P<reg>\w+) (?P<op>inc|dec) (?P<amt>-?\d+) "
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
24 ~ r"if (?P<condreg>\w+) (?P<comp>[=<>!]{1,2}) (?P<amtcond>-?\d+)"
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
25 );
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
26 auto row = matchFirst(line, instructionRegex);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
27 if(comparisons[row["comp"]](
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
28 registers.get(row["condreg"], 0),
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
29 to!int(row["amtcond"]))){
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
30 if(row["op"] == "inc") {
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
31 registers[row["reg"]] = registers.get(row["reg"], 0) + to!int(row["amt"]);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
32 }
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
33 else if(row["op"] == "dec") {
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
34 registers[row["reg"]] = registers.get(row["reg"], 0) - to!int(row["amt"]);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
35 }
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
36 }
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
37 maxSoFar = max(maxSoFar, registers.values.maxElement);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
38 }
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
39
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
40 void main(string[] args) {
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
41 foreach(line; File(args[1]).byLineCopy) {
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
42 evalInstruction(line);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
43 }
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
44 writeln(registers.values.maxElement);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
45 writeln(maxSoFar);
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
46 }