このCollatzシーケンス正の整数nから開始し、このように定義されています。
- nが偶数の場合は、2で割ります(
n' = n / 2
) - nが奇数の場合は、3を掛けて1を加えます(
n' = 3n + 1
)
nが1に達するまで上記の反復を繰り返します。
最初に選択された正の整数に関係なく、シーケンスが最終的に数値1に到達するかどうかは不明です(これは数値理論では未解決の主要な問題です)。
A 2つの逆マシン(2CM)非負の整数値を保持することができ、次の命令セットを用いてプログラムすることができる2つのレジスタを備えたマシンです。
INCX increase the value of register X
INCY increase the value of register Y
JMP n jump to instruction n
DJZX n if register X is zero jump to instruction n,
otherwise decrement its value
DJZY n if register Y is zero jump to instruction n,
otherwise decrement its value
HALT halt (and accept)
PRINTX print the content of register X
2CMプログラムは、単に一連の命令です。たとえば、次のプログラムは、レジスタXの内容をレジスタYにコピーするだけです。
cp: DJZX end
INCY
JMP cp
end: HALT
2CMは完全なチューリングであることに注意してください(つまり、適切な入力エンコーディングですべての計算可能な関数を計算できますが、ここでは関係ありません)。また、命令セットはウィキペディアの記事にあるものとは少し異なることに注意してください。
チャレンジ
collatzシーケンスを1まで計算して出力し、停止する最も短い2CMプログラムを作成します(レジスタXには最初に開始値が含まれ、n
レジスタYには最初に0が含まれます)。2CMプログラムの長さは、使用される命令の数であることに注意してください(テキストの長さではありません)。
たとえば、X = 3から開始した場合は、次を出力する必要があります:3 10 5 16 8 4 2 1
およびHALT。
したがって、お気に入りの言語を使用して2CMシミュレータ/インタプリタを構築できますが、回答に入れる最終(最短)コードは2CM言語である必要があります。