Skip to content

Instantly share code, notes, and snippets.

@uneco

uneco/answer.md Secret

Last active December 17, 2021 06:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save uneco/949a33051148ad69c44b1493855369d3 to your computer and use it in GitHub Desktop.
Save uneco/949a33051148ad69c44b1493855369d3 to your computer and use it in GitHub Desktop.

1. 盤の示す数の計算

マス目の状態を数値で表すルールを

何も置かれていない = 0
表のコイン = 1
裏のコイン = 2

としたとき、特定範囲の数値の総和を3で割った余りを、「その範囲のダイジェスト値」と呼び、 𝑫𝒊𝒈𝒆𝒔𝒕 { 範囲1, 範囲2, ... } と書く。
次に4桁の3進数の数 𝐃𝟏, 𝐃𝟐 を計算する。この計算は各桁ごとに行い、添字は左から数えて何桁目かをあらわす。

𝐃𝟏[0] = 𝑫𝒊𝒈𝒆𝒔𝒕 { 4列, 5列, 6列 }
𝐃𝟏[1] = 𝑫𝒊𝒈𝒆𝒔𝒕 { 2列, 5列, 8列 }
𝐃𝟏[2] = 𝑫𝒊𝒈𝒆𝒔𝒕 { 4行, 5行, 6行 }
𝐃𝟏[3] = 𝑫𝒊𝒈𝒆𝒔𝒕 { 2行, 5行, 8行 }

𝐃𝟐[0] = 𝑫𝒊𝒈𝒆𝒔𝒕 { 7列, 8列, 9列 } × 2 mod 3
𝐃𝟐[1] = 𝑫𝒊𝒈𝒆𝒔𝒕 { 3列, 6列, 9列 } × 2 mod 3
𝐃𝟐[2] = 𝑫𝒊𝒈𝒆𝒔𝒕 { 7行, 8行, 9行 } × 2 mod 3
𝐃𝟐[3] = 𝑫𝒊𝒈𝒆𝒔𝒕 { 3行, 6行, 9行 } × 2 mod 3

次に 𝐃𝟏 と 𝐃𝟐 を用いて 𝐄 を計算する。この計算も同様に各桁ごとに行う。

𝐄[n] = (𝐃𝟏[n] + 𝐃𝟐[n] × 2) mod 3
(n は桁数)

𝐄 を10進数に変換したものが 0 から 80 の「盤の示す数」となる。
このように、盤の状態から単一の数を計算できるようにした上で、その数字を用いてマスを特定するルールを「マスを左上から数えた時、何番目か」といったように事前に共有することによって、二人目はマスを特定することが出来る。
一人目の任務は、一度の操作で「正解の数」を盤面に埋め込むことである。

2. 一人目の操作

あらかじめ二人目と共有していたマスと数の変換ルールを元に、すべてのマスに 0 から 80 までの番号を振る。
それぞれのマスの番号を4桁の3進数に変換する。0番目のマスが 0000, 80番目のマスが 2222 となる。これを番地と呼ぶ。
光ったマスの番地を、正解の番地 𝐓 とする。
一人目が入った時点での 𝐄 を上記の方法で計算する。この 𝐄 を 𝐓 にするための1回きりの操作を考える。
まず、操作対象の番地 𝐌 を以下のように得る。この計算も各桁ごとに行う。

𝐌[n] = (𝐓[n] - 𝐄[n] + 3) mod 3
(n は桁数)

次に、操作対象の番地のコインを次のように動かす

何も置かれていない → コインを表向きに置く (0 → 1)
表のコイン → コインを裏返す (1 → 2)
裏のコイン → コインを取り除く (2 → 0)

以上で操作は完了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment