QRコードを1ピクセルずつ消していく闇のゲームの攻略法
QRコードを1人1ピクセルずつ消していき、リーダーで認識できなくなったら負けという闇のゲームで、全てのスターチップを失いました pic.twitter.com/8N4IC4AyRI
— あさくら🍃🥜 (@asakura_dev) December 19, 2021
QRコードを肉眼で読めるので()、固定パターンを避けて同じブロック内だけ消していくという攻略ができるのです。そして誤り訂正レベルも見えるのであとどれだけ消したら死ぬかもわかってしまうのです。 https://t.co/xzFuO46vtv
— MakKi (@makki_d) December 20, 2021
固定パターンを避けてワード単位で消すだけでは全然攻めきれてないので、ちゃんとした攻略法を書き残しておきます。
QRコードの構造
まずは構造を知らねばお話にならない。 とりあえずWikipediaから画像を拝借。
リプライで何人か書いているように、最低限の固定パターンは消さないほうが良いのは間違いない。 まずは固定パターン以外をどう攻めるかがポイント。
Format情報
まず攻めるべきはFormat情報。 左上のPositionパターンの周りにあるやつのコピーが、右上左下のPositionパターンのところにも配置されている。
ZXingをはじめ、多くのQRコードリーダーはまず左上のFormat情報を読もうとして、 失敗したら右上左下のものを読もうとする。 なので、右上左下のパターンは全消ししてOK。
さらに残った左上のFormat情報も、BCH符号(15, 5)で符号化されていて、3ピクセルまでは誤り訂正可能なので3つ消せる
Version情報
バージョン7(45x45)以上の大きいQRコードには18ピクセルのVersion情報が2箇所ある。 (QRコードの「バージョン」はサイズのことを指すぞ!覚えておいてね!)
これもFormat情報と同じく、右上のものと左下のものは全く同じコピー。 つまり片方は全消しできる。 ZXingでは先に右上を読むので、消すなら左下からがよいかも?
そして残った方も、BCH符号(18, 6)なので3ピクセルまで訂正可能。3つ消せる。
データ+エラーコレクション
いよいよ本命?の一番広い部分。
これらはリード・ソロモン符号で誤り訂正できるようになっている。 この符号はワード単位なので、同じワードの中がいくつ消されていても1ワードの誤りとしかカウントされない。 つまり、消すなら同じワードを集中して消すのが鉄則。
この図のように、2列ずつ8ピクセルで1ワードとして、使用済みの場所を避けながらジグザグに配置されている。
まず手を付けるのは末尾の未使用領域。問答無用で消せる。 あとはできるだけ黒いピクセルの多いワードから消し潰していけばいい。
消せるワードの数はバージョンとエラー訂正レベルで決まる。 Format情報からエラー訂正レベルを読み取って計算すれば良い。 例えばバージョン3のエラー訂正レベルMなら、全部で70ワードなのでその約15%の10ワードまでなら消せる。
固定パターン
これ以上は消したら基本的にエラー訂正では回復しきれないところまできたので、固定パターンに手を付ける。 ここからはQRコードリーダーの性能を信じての運試し。
まずAlignmentパターンが沢山ある場合、一番右下以外は消しても大丈夫なことがある。 ちなみにZXingは右下のやつしか見ていない。
Positionパターンは縦横ともに黒白黒白黒が1:1:3:1:1の場所を探せと規格としても書かれている。 見つけてくれると信じて、中央を十字に残すように端の方から消していく。
あとはTimingパターン。 元ツイートのリプライでは何人も大事だから消しちゃダメと言っているけど、実はそんなこと無かったりする。 実際ZXingでは使わずに、PositionパターンとAlignmentパターンだけで歪み補正している。 QRコードリーダーの実装次第にはなるけれど、消しても大丈夫な可能性がある。
本当の闇のゲームの始まりだぜ
ここまでやったらもう理論的に消せる場所は残っていないはず。 自分の運命を信じよう。
おまけ:QRコードジェンガやってみた
多分これが限界。 https://t.co/42FPIzSfdO pic.twitter.com/PfY5sRURgG
— MakKi (@makki_d) December 21, 2021