- 追加された行はこの色です。
- 削除された行はこの色です。
*NLEの詳しい仕様 [#se575de9]
NLEとは''Numerical Limit Exceed''の略. 日本語にすると, 「数値の制限を超えました」というところでしょうか. ~
数値の制限とは, ルール説明において
> 絶対値が255を超える数値を扱うことは出来ません。
として説明されている部分です. ~
どのようなコードが, どのようなタイミングでNLE判定を食うかについて, 詳しく調べてみました. ~
なお, Herbert EditorはNLE判定までは本家と同じ実装がされていないようで, 今回の調査ではHOJ本家を用いています.
**256以上の数値が呼び出された瞬間 [#l12ab0fd]
NLEの基本は, 256以上の数値が呼び出されることです.
a(T):sa(T+T)
a(1)
とすると, a(128+128)が呼び出された時点でNLEします.
b(T):sb(256-T-T)
b(1)
とすると,
> b(1) = sb(254) = ssb(-252) = ss
となりそうですが, b(256-T-T)というコードをプログラム側で解釈する瞬間に, ~
まず「256」「T」「T」という数値を読み取るために?NLEになります. なお, 同じようでも~
c(T):sc(255+1-T-T)
c(1)
d(T):sd(256)
sss
などのコードはNLEにならずに実行できます. 前者は, 「255」「1」「T」「T」を認識し, ~
一気に「255+1-T-T」を計算し, その数値に対してNLE判定を行っていると考えられます. ~
後者は定義したもの実行しておらず, 定義するだけならNLE判定は起こらないことが分かります.
**優先順位は左から [#y75732d3]
**謎の一歩 [#e557a7d6]