#P12093. [NERC2024] BitBitJump

[NERC2024] BitBitJump

Description

BitBitJump 是一种单指令集计算机,仅包含一条指令:bbj a, b, c\texttt{bbj a, b, c}。该指令将内存的第 aa 位复制到第 bb 位,然后跳转到地址 cc

我们考虑一台 16 位 BitBitJump 计算机,其内存包含 2162^{16} 位,组织为 2122^{12} 个 16 位字。字从 0 开始编号,每个字中的位从最低有效位(第 0 位)到最高有效位(第 15 位)编号。

该计算机有一个指令指针寄存器 (IP)(\mathrm{IP}),执行从 IP=0\mathrm{IP}=0 开始。如果当前 IP2122\mathrm{IP} \ge 2^{12}-2,计算机停止运行。否则,它将 IP\mathrm{IP} 指向的字作为 aa(IP+1)(\mathrm{IP}+1) 指向的字作为 bb(IP+2)(\mathrm{IP}+2) 指向的字作为 cc,执行 \texttt{bbj a, b, c} 指令:将 (a&15)(a \& 15)-th 位(即 aa 的低 4 位)从 (a4)(a \gg 4)-th 字(即 aa 右移 4 位后的值)复制到 (b&15)(b \& 15)-th 位(即 bb 的低 4 位)的 (b4)(b \gg 4)-th 字,并设置 IP=c\mathrm{IP}=c。这里 &\& 表示按位与运算,\gg 表示右移运算。注意 cc 的值是在位复制操作之后从内存中读取的,因此如果指令修改了自己的 cc,新值将被用作 IP\mathrm{IP}

我们称 (2121)(2^{12}-1)-th 字(内存的第 216162^{16}-1621612^{16}-1 位)为 IO-word\textit{IO-word}。一个 x-比较器\textit{x-比较器} 是检查 IO-word 的值是否等于 xx 的程序。它应在执行不超过 2122^{12} 条指令后停止,如果 IO-word 的原始值等于 xx,则将 IO-word 的最低位设为 1,否则设为 0。

请编写一个程序,为给定的 xx 值生成 xx-比较器。

Input Format

输入包含一个十进制整数 xx0x<2160 \le x < 2^{16}),表示要构建比较器的目标值。

Output Format

输出应包含 xx-比较器的内存转储。转储包含内存前 nn 个字的值(1n21211 \le n \le 2^{12}-1),其余字(除 IO-word 外)填充为零。

每个字的值用 4 个字符的十六进制数表示,值之间用空格或换行符分隔。

0
fff0 0026 0003  fff1 0056 0006  fff2 0086 0009  fff3 00b6 000c  fff4 00e6 000f 
fff5 0116 0012  fff6 0146 0015  fff7 0176 0018  fff8 01a6 001b  fff9 01d6 001e 
fffa 0206 0021  fffb 0236 0024  fffc 0266 0027  fffd 0296 002a  fffe 02c6 002d 
ffff 02f6 0030                                                  
0004 fff0 0fff                                                  
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 fff0 0fff  0000 fff0 0fff  0000 fff0 0fff  0000 fff0 0fff  0000 fff0 0fff 
0000 fff0 0fff  0000 fff0 0fff  0000 fff0 0fff  0000 fff0 0fff  0000 fff0 0fff 
0000 fff0 0fff  0000 fff0 0fff  0000 fff0 0fff  0000 fff0 0fff  0000 fff0 0fff 
0000 fff0 0fff

Hint

样例输出中的内存转储包含一个 0-比较器,由以下部分组成:

  1. 16 条指令:从 0 开始编号的第 ii 条指令将输入字的第 ii 位复制到自己 cc 的第 6 位。如果复制的位为 0,则继续执行下一条指令;否则,下一条指令的编号将增加 64。
  2. 后续指令将第 0 个字的第 4 位(值为 1)复制到 IO-word 的第 0 位,并跳转到停止地址。
  3. 16 个未使用的字,填充为 0。
  4. 16 条相同的指令(从第 67 个字开始):每条指令将第 0 个字的第 0 位(值为 0)复制到 IO-word 的第 0 位,并跳转到停止地址。