brainfuck,474个 176 154 151 149 137字节
采用的输入串8 0
和1
包括第一个0
小数点。
(例如帖子中表格的第二列)
输出0到9之间的数字。
,>,>,>,,,>,>,>+[[->]<++<<<<<<]>[>[>[>[->[>++++++<-<]>[--<]<]>>.>>]<[>
>[>->++<<-]>-[+>++++<]>+.>]]>[>>>+<<<-]>[>>+++.>]]>[>>>[>+++<-]>-.>]
在线尝试!
算法
通过观察特定段的状态,我们可以将一组可能的数字拆分为较小的子集。下面是我的代码中使用的静态二进制搜索树。左子树对应于段ON状态,右子对应于段OFF状态。
0,1,2,3,4,5,6,7,8,9
|
/-------[A]-------------------------\
0,2,3,5,6,7,8,9 1,4
| |
/-------------[B]----------------\ /----[G]----\
0,2,3,7,8,9 5,6 4 1
| |
/--------[E]--------\ /----[E]----\
0,2,8 3,7,9 6 5
| |
/----[F]----\ /----[F]----\
0,8 2 9 3,7
| |
/----[G]----\ /----[G]----\
8 0 3 7
一些对打高尔夫球有用的观察
- C和D位是冗余的,可以忽略。
- 前导零(小数点位)可以用作(值48),这对于解析输入和准备输出都很重要。
- 当到达叶子并打印数字时,我们只需要跳过所有其他条件。可以通过将数据指针移到足够零的区域以至于它不能返回来完成此操作。
- 为了兼容性,最好在右边使用零,因为某些BF实现不支持负数据指针。
- 因此,最好将输出值存储在最右边的单元格中,这样我们就可以轻松到达右边的零区域。
- 因此最好从左到右检查位:A,B,E,F,G,这样我们可以更轻松地到达输出单元。
- 不同的数字可能共享输出代码。例如,5和6在同一子树中。我们可以
+++++
对两个值都做,然后+
仅对六个值做。
+
如果预先在输出值上加2,则可以减少命令数。在这种情况下,我们需要减少它0
和1
仅获得优势,为其他数字。