Advent of Code 2022の問題の日本語翻訳です。
この記事は筆者のYouTube動画「ゆるっとはじめるプログラミングクイズ」に対応しています。まだ動画を見たことがない方はぜひご覧ください。
動画で使用しているスターターキットは下記のGitHubリポジトリにあります。Day 2以降はDay 1のフォルダをコピーしてお使いください。
Part 1
秘密の作戦(下記、例題の入力)を使ってジャンケン大会で優勝しよう。
A Y
B X
C Z
最初の列ABCは対戦相手が出す手を表している。Aがグー、Bがパー、Cがチョキだ。
2番目の列は、、わからない!たぶん、XがグーでYがパー、Zがチョキだろう。
試合の得点は「何の手を出したか」と「勝敗」の点数で決まる。
グーは1点、パーは2点、チョキは3点。負けは0点、あいこは3点、勝ちは6点だ。
- 1試合目(1行目)は相手がグーであなたはパーを出す。得点はパーの2点と勝ちの6点で合計8点だ。
- 2試合目(2行目)は相手がパーであなたがグーだ。得点はグーの1点と負けの0点で合計1点。
- 3試合目(3行目)は相手がチョキであなたもチョキだ。得点はチョキの3点と引き分けの3点で合計6点。
3試合の合計得点は 8 + 1 + 6 で15点となる。
秘密の作戦で全試合の合計得点はいくつになる?
Part 2
XYZはグー・チョキ・パーではなく、勝ち負けを表していることがわかった!
Xは負け、Yはあいこ、Zは勝たなきゃいけないってことだ。
さっきの例題では、
- 1試合目、相手はグーを出す。あいこにならなきゃいけないので、あなたはグーを出す。得点はグーの1点とあいこの3点で合計4点だ。
- 2試合目、相手はパーを出す。負けなきゃいけないので、あなたはグーを出す。得点はグーの1点と負けの0点で合計1点。
- 3試合目、相手はチョキを出す。勝たなきゃいけないので、あなたはグーを出す。得点はグーの1点と勝ちの6点で合計7点。
3試合の合計得点は 4 + 1 + 7 で 12点となる。
この作戦で全試合の合計得点はいくつになる?
Part 1
エルフたちのリュックの整理を手伝おう。
エルフたちのリュックには左右2つのスペースがあり、荷物が入っている。
同じ荷物は左右の同じ側に入ってなきゃいけないが、彼らは荷造りを間違えてしまったらしい。
荷物のリスト(下記、例題の入力)を使って間違えて入ってしまった荷物を見つけ出そう。
リストは1行につき1個のリュックの荷物を表していて、1文字1文字が荷物の種類を表している(大文字・小文字は違う荷物として扱う)。
各行につき前半の半分が左側、後半の半分が右側の荷物を表している。
vJrwpWtwJgWrhcsFMMfFFhFp
jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
PmmdzqPrVvPwwTWBwg
wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
ttgJtRGJQctTZtZT
CrZsJsPPZsGzwwsLwLmpwMDw
- 1個目のリュックには
vJrwpWtwJgWrhcsFMMfFFhFp
の荷物が入っていて、前半がvJrwpWtwJgWr
で後半がhcsFMMfFFhFp
だ。唯一重複している荷物はp
だ。 - 2個目のリュックは、前半が
jqHRNqRjqzjGDLGL
で後半がrsFMfFZSrLrFZsSL
だから、 重複している荷物はL
だ。 - 3個目のリュックは
PmmdzqPrV
とvPwwTWBwg
なので重複はP
だ。 - 4個目のリュックの重複は
v
だ。 - 5個目のリュックの重複は
t
だ。 - 6個目のリュックの重複は
s
だ。
整理整頓のために、荷物は種類ごとに優先度が付けられる。
- 小文字の
a
からz
は1から26 - 大文字の
A
からZ
は27から52
優先度は、16 (p
)、38 (L
)、42 (P
)、22 (v
)、20 (t
)、19 (s
)で合計157となる。
荷物の優先度の合計はいくつになる?
Part 2
今度は3人のグループごとに共通している荷物が何かを特定することになった!
最初のグループは最初の3だ。
vJrwpWtwJgWrhcsFMMfFFhFp
jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
PmmdzqPrVvPwwTWBwg
次のグループは次の3行だ。
wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
ttgJtRGJQctTZtZT
CrZsJsPPZsGzwwsLwLmpwMDw
この例では、最初のグループの共通の荷物は r
で、次のグループは Z
だ。
優先度は18 (r
)と52 (Z
)となり、合計70となる。
3人ずつに共通する荷物の優先度の合計はいくつになる?
Part 1
補給物資を置くスペースを確保するためにキャンプの掃除が必要だ。
キャンプの各エリアにはIDが割り当てられている。
以下のリスト(例題の入力)は、各行が二人のエルフがどのエリアを担当するかを表している。
2-4,6-8
2-3,4-5
5-7,7-9
2-8,3-7
6-6,4-6
2-6,4-8
- 最初のペアでは、1人目のエルフが2から4のエリア(2, 3, 4)、2人目のエルフが6から8のエリア(6, 7, 8)に割り当てられている
- 2番目のペアもそれぞれ2つのエリアに割り当てられている
- 3番目のペアはそれぞれ5, 6, 7と7, 8, 9のエリアに割り当てられている
例題のリストを視覚的にわかりやすく表すと以下のようになる。
.234..... 2-4
.....678. 6-8
.23...... 2-3
...45.... 4-5
....567.. 5-7
......789 7-9
.2345678. 2-8
..34567.. 3-7
.....6... 6-6
...456... 4-6
.23456... 2-6
...45678. 4-8
すると、このうちいくつかは一方が一方を完全に含んでいることに気が付くだろう。例えば、 2-8
と 3-7
、そして 6-6
と 4-6
がそうだ。例題では全部で2個だ。
一方が一方を完全に含むペアの数はいくつか?
Part 2
一方が一方を完全に含むペアを探す代わりに、少しでも範囲が重複しているペアを知りたくなった!
例題では、
-
5-7,7-9
は7
が重複している -
2-8,3-7
は3
から7
まで重複している -
6-6,4-6
は6
が重複している -
2-6,4-8
は4
と5
と6
が重複している
つまり、重複しているペアの数は4個だ。
少しでも範囲が重複しているペアの数はいくつか?
Part 1
エルフたちから受け取った通信用デバイスの1つは、調子が悪いみたいだった。
このデバイスでエルフたちと通信できるようにするためには、それぞれのデバイスに割り振られた固有のコードを検出できるようにしなければならない。
このコードは全て異なる連続する4文字で構成される。コードを検出するためには、データストリームの中に現れた直近のコードの開始位置を知る必要がある。
例えば、以下のようなデータストリームを受信したとする。
mjqjpqmgbljsphdztnvjfqwrcgsmlb
最初の3文字(mjq
)を受信した時点では、まだ4文字未満なのでコードを検出することはできない。
4文字目を受信した時点で直近の4文字は mjqj
となるが、j
は重複しているのでコードではない。
コードが現れるのは7文字目を受信して直近の4文字が全て異なる jpqm
となったときだ。このとき、7文字目を受信してコードが判別できたとして、7を報告する。
下記は他の例だ。
-
bvwbjplbgvbhsrlpgdmjqwftvncz
: 最初のコードは5文字目の直後 -
nppdvjthqldpwncqszvftbrmjlhg
: 最初のコードは6文字目の直後 -
nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg
: 最初のコードは10文字目の直後 -
zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw
: 最初のコードは11文字目の直後
最初のコードを検出するのは何文字を受信したときか?
Part 2
通信デバイスが正しく動作するためには4文字ではなく14文字のコードが必要であることが判明した!
下記は前述の例だ。
-
mjqjpqmgbljsphdztnvjfqwrcgsmlb
: 最初のコードは19文字目の直後 -
bvwbjplbgvbhsrlpgdmjqwftvncz
: 最初のコードは23文字目の直後 -
nppdvjthqldpwncqszvftbrmjlhg
: 最初のコードは23文字目の直後 -
nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg
: 最初のコードは29文字目の直後 -
zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw
: 最初のコードは26文字目の直後
最初のコードを検出するのは何文字を受信したときか?
コメントを送る
コメントはブログオーナーのみ閲覧できます