?({{&2'2':{):!/)'*/
オンラインでお試しください。
説明
これは、CJamとLabyrinthの回答で使用した計算と同じですが、Hexagonyの...特別な...メモリモデルのため、計算を19バイトに圧縮するのは少し複雑です(そのため、横長3六角形)。
私の迷路の答えのように、これは0除算エラーで終了します。
展開されたコードは次のとおりです。
私が言ったように、コードは完全に線形です。実行されたパスを、グレー、パープル、グリーン、レッド、ブルーの順につなげることができます。パスは実際には:
、左側に到達するまで少し続きます。/
(制御フローのみをリダイレクトする)を削除すると、プログラム全体が直線的に展開されます。
?({2':{)'*){&2':!:&?':
したがって、問題はそれがどのように機能するかです。六角形のメモリは、16進グリッドの折れ線グラフです。グリッドの各エッジには整数値(最初はゼロ)が含まれています。メモリポインター(MP)は常に1つのエッジにあり、そのエッジに沿って特定の方向を指します。通常、算術演算は、MPが置かれているエッジに向けられて保存されている2つのエッジに適用されます。
このプログラムでは、A、B、Cのラベルが付いた3つのエッジを使用し、MPは次のように開始します。
これがどのように機能するかです:
? Read an integer N from STDIN into edge A.
( Decrement to get N-1.
{ Move the MP forwards onto edge B.
2 Set the edge to 2.
' Move the MP backwards onto edge C.
: Divide edge A by edge B (rounding down) to compute (N-1)/2.
{ Move the MP forwards onto edge A.
) Increment to restore value of N.
' Move the MP backwards onto edge B.
* Multiply edges A and C to compute N*(N-1)/2.
) Increment to compute N*(N-1)/2 + 1.
{ Move the MP forwards onto edge C.
& This actually a copy operation, but we use it to reset the edge to zero.
2 Set the edge to 2.
' Move the MP backwards onto edge A.
: Divide edge B by edge C to compute (N*(N-1)/2 + 1)/2.
! Output the result as an integer. We're basically done now.
: no-op (we already have this value)
& Copy either B or C into A (doesn't matter).
? Read a zero (EOF) into A.
' Move the MP backwards onto an unused cell.
: Divide some unused cell by A (which is zero), terminating with an error.