跳到主要内容

Advent of Code 2022

· 阅读需 6 分钟

看群友聊天才知道有这样一个比赛:Advent of Code 2022

我的代码及数据仓库:https://github.com/Selflocking/Code/tree/master/others/AOC2022

比赛从12月1日开始,一直到圣诞节12月25日,每天发一道题,不限解题方法,只要最后答案,同时为了限制作弊,每个人拿到的数据不一样。

第一位解出题的人将获得100分,第二位获得99分,依次递减,最低递减到1。

Day 1: Calorie Counting

Part 1

大概意思是给你类似于如下的数据

1000
2000
3000

4000

5000
6000

7000
8000
9000

10000

数字被空行分隔开,求最大的数字和。 比如上面数据中,最大的数字和为:7000+8000+9000 = 24000

#include <iostream>
#include <string>

using namespace std;

int main() {
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
int ans = 0;
int tmp = 0;
string s;
while (getline(cin, s)) {
if (s.size() == 0) {
ans = max(ans, tmp);
tmp = 0;
} else {
tmp += stoi(s);
}
}
cout << ans;
fclose(stdin);
fclose(stdout);
return 0;
}

ctrl+d结束输入,得到答案。

Part 2

要求输出最大的三个数字和的和。

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

vector<int> ans;

int main() {
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
// int ans = 0;
int tmp = 0;
string s;
while (getline(cin, s)) {
if (s.size() == 0) {
// ans = max(ans, tmp);
ans.emplace_back(tmp);
tmp = 0;
} else {
tmp += stoi(s);
}
}
sort(ans.begin(), ans.end());
cout << ans[ans.size() - 1] + ans[ans.size() - 2] + ans[ans.size() - 3]
<< endl;
// cout << ans;
fclose(stdin);
fclose(stdout);
return 0;
}

最后喜提2分,排名 119865。😥

Day 2: Rock Paper Scissors

Part 1

题目样例:

A Y
B X
C Z

A石头 B布 C剪刀 X石头 Y布 Z剪刀 石头 1 分,布 2 分,剪刀 3 分 输了 0 分,平局 3 分,赢了 6 分

故样例总共得15分。

if else 就完了

#include <iostream>

using namespace std;

// A石头 B布 C剪刀
// X石头 Y布 Z剪刀
// 石头 1 分,布 2 分,剪刀 3 分
// 输了 0 分,平局 3 分,赢了 6 分

int score = 0;
int main() {
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
char a, b;
while (cin >> a >> b) {
if (a == 'A') {
if (b == 'X') {
score += 1 + 3;
} else if (b == 'Y') {
score += 2 + 6;
} else {
score += 3 + 0;
}
} else if (a == 'B') {
if (b == 'X') {
score += 1 + 0;
} else if (b == 'Y') {
score += 2 + 3;
} else {
score += 3 + 6;
}
} else {
if (b == 'X') {
score += 1 + 6;
} else if (b == 'Y') {
score += 2 + 0;
} else {
score += 3 + 3;
}
}
}

cout << score << endl;
fclose(stdin);
fclose(stdout);
return 0;
}

Part 2

A石头 B布 C剪刀 X输 Y平局 Z赢 石头 1 分,布 2 分,剪刀 3 分 输了 0 分,平局 3 分,赢了 6 分

#include <iostream>

using namespace std;

// A石头 B布 C剪刀
// X输 Y平局 Z赢
// 石头 1 分,布 2 分,剪刀 3 分
// 输了 0 分,平局 3 分,赢了 6 分

int score = 0;
int main() {
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
char a, b;
while (cin >> a >> b) {
if (a == 'A') { //石头
if (b == 'X') {
score += 0+3;
} else if (b == 'Y') {
score += 3+1;
} else {
score += 6+2;
}
} else if (a == 'B') { //布
if (b == 'X') {
score += 0+1;
} else if (b == 'Y') {
score += 3+2;
} else {
score += 6+3;
}
} else { //剪刀
if (b == 'X') {
score += 0+2;
} else if (b == 'Y') {
score += 3+3;
} else {
score += 6+1;
}
}
}

cout << score << endl;
fclose(stdin);
fclose(stdout);
return 0;
}

4分了😅

Day 3: Rucksack Reorganization

Part 1

给一堆字符串,对半分,求两半的公共字符。

a-z 分别赋分 1-26

A-Z 分别赋分 27-52

鸽了很多天,这么多天不做的原因是很多人都是在整活,有人用小众语言写,有人用ChatGPT写,甚至还有人用Excel写。。。

才疏学浅,整不出活,憋了半天用蹩脚的js写了一个:

const dataUrl = "https://adventofcode.com/2022/day/3/input"
const ansUrl = "https://adventofcode.com/2022/day/3/answer"
const cookie = "paste your cookie here"

const request = new Request(dataUrl, {
method: 'GET',
headers: {
cookie: cookie,
},
})

fetch(request)
.then(res => res.text())
.then(data => {
// console.log(typeof data);
const arr = data.split('\n')
// console.log(arr.length);
let cnt = 0;
arr.forEach((str) => {
let set = new Set();
for (let i = 0; i < str.length / 2; ++i) {
set.add(str[i]);
}
for (let i = str.length / 2; i < str.length; ++i) {
if (set.has(str[i])) {
if (/[A-Z]/.test(str[i])) {
cnt += str[i].charCodeAt() - 'A'.charCodeAt() + 27;
} else {
cnt += str[i].charCodeAt() - 'a'.charCodeAt() + 1;
}
break;
}
}
})
console.log("The answer is", cnt);
return cnt;
}).then(result => {
let formData = new FormData();
formData.append("level", 1);
formData.append("answer", result);
// console.log(formData);
fetch(ansUrl, {
method: "POST",
headers: {
cookie: cookie,
},
body: formData,
}).then(res => {
console.log(res.headers.get("content-length"));
// return res.text();
})
// .then(data => console.log(data))

})

答案是正确的,本来想做成自动提交答案,没整成,在一次测试中不小心提交了答案,导致不能再测试了