最後に残る謎、回転
盤上のイメージを持ったうえで処理を追うと、それほど複雑な印象もなくなってくるが、最後まで異質なのは145という謎の数字で、これを解説してくれる人はどこにもいなかった。回転をしているというのは前後からわかるのだが、145というのがどういう根拠なのかよくわからない。
7: 回転先の座標を回転行列を用いて計算
回転行列は (x',y') = (cos sin, -sin cos)(x,y) というやつです。
ブロックの座標が p=x+y*12 で表されるため、x=p%12, y=Math.round(p/12) を求める
ただしビットORを用いることで実数→整数変換可能なので、
Math.floor(p/12) と p/12|0 が等価になる
ここでは、Math.round でありフィールドの大きさが小さいため p/9|0 が y に等価
ビットORを用いることで実数→整数変換可能:
JavaScriptにおいて、数値nに対してn|0というビット操作を適用すると、nの小数部分が切り捨てられ、整数に変換されます。これは、浮動小数点数を整数に変換する際の高速な方法として知られています。
Math.floor(p/12) と p/12|0 が等価になる:
ここで言いたいことは、Math.floor(p/12)(p/12の結果を小数点以下で切り捨てる)とp/12|0(p/12の結果をビットORを使って整数に変換する)が同じ結果になるということです。具体的には、両方ともp/12の小数点以下を切り捨てる効果があります。
ここでは、Math.round でありフィールドの大きさが小さいため p/9|0 が y に等価:
これは少し情報が足りないため完全な解釈は難しいですが、一般的にはp/9|0の結果がyと等しいということを示しています。
この式C[i]=p*A-(p/9|0)*145;は、JavaScriptのコードの一部として見えます。この式を順に解説していきます。
p/9|0: これは、pを9で割った結果を整数に変換しています。具体的には、p/9の小数部分を切り捨てる操作を行います。|0はビットワイズOR演算子で、この文脈では小数点以下を切り捨てるために使用されています。
*(p/9|0)145: 上記で整数に変換した結果を145倍します。つまり、pが9で割り切れる度に145が加算されるということを意味します。
p*A: pとAという2つの変数または定数を掛け合わせた値です。
**C[i]=pA-(p/9|0)145: この式全体では、pとAの積から、(p/9|0)*145を減算した結果を配列Cのi番目の要素に代入しています。
この式は、特定の計算を高速に行うためのテクニックを使用している可能性があります。145という数字の具体的な意味や背後にある理論は、与えられた情報だけでは判断できませんが、コードの文脈や目的に応じて特定の操作や変換を行っている可能性があります。
GTP4に聞いてみる

Gtp4oさんに聞く
コード内の145という数字は、テトリスの回転処理に関連する数値のようです。この数字の具体的な意味を理解するためには、コードの回転処理部分を詳しく見てみる必要があります。以下に該当部分のコードを再度示します。
for (C = [q = c = i = 4]; f = i-- * KEY; c -= !Z[h + (KEY + 6 ? p + KEY : C[i] = p * ROW - (p / 9 | 0) * 145)]) p = B[i];
この部分では、`145`という数字が以下の式の中で使用されています。
C[i] = p * ROW - (p / 9 | 0) * 145
この式を分解してみると、
`p * ROW` - `p`の位置に基づいて、行の位置を計算しています。
`(p / 9 | 0)` - `p`を9で割り、ビットOR操作で整数部分を取得しています。
`* 145` - この数値を掛けることで、特定の変換を行っています。
テトリスのブロック回転では、通常、現在のブロックの位置を中心に90度回転させます。このとき、新しいブロックの位置を計算するための補正が必要です。この`145`という数値は、その補正値である可能性が高いです。特に、特定のブロック形状やその回転によって、新しい位置がどのように決定されるかに影響する補正値です。
145の可能な意味
補正値: 回転によってブロックの位置を補正するための特定の定数として使用される。
ブロック形状の特性: 特定のブロック形状(例:L字型、T字型など)に対して適用される補正値。
実際にこの数値の正確な意味を知るには、テトリスの回転アルゴリズムの詳細な設計や他の部分のコードも見て総合的に判断する必要がありますが、上記の説明が一般的な解釈になります。
GPTo1にも聞いてみる
なぜ 145 なのか
145 という数値自体は、フィールドの幅(12)やミノの配置パターン(特に 3×3 や 4×4 のグリッド)に関連しています。以下の点が考えられます。
フィールド内の位置関係:
フィールドは一次元配列で表現されているため、二次元座標を一次元インデックスに変換する必要があります。
145 は、この変換や回転時の位置補正に適した値として選ばれています。
数式の最適化:
コードゴルフでは、コードの文字数を減らすために数式を極限まで簡略化します。
145 を使用することで、複雑な計算を簡潔に表現でき、コード全体のサイズを削減できます。
まとめ
145 は、テトリスのブロック回転時に各ミノの新しい位置を計算するための重要な定数です。フィールドのサイズやブロックの形状、位置補正の必要性など、複数の要因を考慮して導出された値であり、この値を用いることで効率的に回転処理を実現しています。https://note.com/rodz/n/nf2d56ad054ba