2023 day 4: remove goto and replace vector with set

Due to popular demand
This commit is contained in:
eriedaberrie 2023-12-04 11:46:32 -08:00
parent 40024cef5b
commit 9057173ca5
2 changed files with 26 additions and 32 deletions

View file

@ -15,18 +15,17 @@ int main() {
string left = line.substr(start + 2, bar - start - 3); string left = line.substr(start + 2, bar - start - 3);
string right = line.substr(bar + 2); string right = line.substr(bar + 2);
istringstream lss(left), rss(right); istringstream lss(left), rss(right);
vector<int> rv; set<int> ls;
while (!rss.eof()) {
int n;
rss >> n;
rv.push_back(n);
}
while (!lss.eof()) { while (!lss.eof()) {
int n; int n;
lss >> n; lss >> n;
for (auto no : rv) { ls.insert(n);
if (no == n) }
count <<= 1; while (!rss.eof()) {
int n;
rss >> n;
if (ls.find(n) != ls.end()) {
count <<= 1;
} }
} }
ret += count >> 1; ret += count >> 1;

View file

@ -5,45 +5,40 @@ int main() {
ios::sync_with_stdio(0); ios::sync_with_stdio(0);
cin.tie(0); cin.tie(0);
int ret = 0; vector<int> counts, copies;
vector<vector<int>> lefts, rights;
vector<int> copies;
string line; string line;
while (getline(cin, line) && !line.empty()) { while (getline(cin, line) && !line.empty()) {
copies.push_back(1);
int start = line.find(':'); int start = line.find(':');
int bar = line.find('|'); int bar = line.find('|');
string left = line.substr(start + 2, bar - start - 3); string left = line.substr(start + 2, bar - start - 3);
string right = line.substr(bar + 2); string right = line.substr(bar + 2);
istringstream lss(left), rss(right); istringstream lss(left), rss(right);
vector<int> rv, lv; set<int> ls;
while (!rss.eof()) { int count = 0;
int n;
rss >> n;
rv.push_back(n);
}
rights.push_back(rv);
while (!lss.eof()) { while (!lss.eof()) {
int n; int n;
lss >> n; lss >> n;
lv.push_back(n); ls.insert(n);
} }
lefts.push_back(lv); while (!rss.eof()) {
int n;
rss >> n;
if (ls.find(n) != ls.end())
count++;
}
counts.push_back(count);
copies.push_back(1);
} }
for (int cn = 0; cn < copies.size(); cn++) { int ret = 0;
for (int cn = 0; cn < counts.size(); cn++) {
ret += copies[cn]; ret += copies[cn];
int n = cn; int n = cn;
for (int ln : lefts[cn]) { for (int i = 0; i < counts[cn]; i++) {
for (int rn : rights[cn]) { if (++n == copies.size())
if (ln == rn) { break;
if (++n == copies.size()) copies[n] += copies[cn];
goto end;
copies[n] += copies[cn];
}
}
} }
end:;
} }
cout << ret << '\n'; cout << ret << '\n';
} }