Answers:
提示可能太简单了,所以如果是这样,我将替换它或删除它。
假设您要输入两个字符“ a”和“ b”,并分别返回1和2。您可能会为此使用条件,因为它最有意义,在此特定示例中,我将使用更简洁的形式。
i:"a")+1+n
这将检查输入是否大于“ a”并加1。由于“ a”将返回0,而“ b”将返回1,则将得到1和2。这可以很好地完成工作,但是对于我们的情况投入,我们可以走得更远。
i:3%n
在mod 3中,“ a”的数值等效项97变为1,而“ b” s的98则成为2。对于两个不同的数字,可以保证一个mod给出两个结果都是唯一的。对于两个以上的对象,有一个mod给出独特的结果,但是我没有数学能力以简单的方式找到最小的那个(例如,如果您有{100,101,102,103}的集合,则mod 104会给出独特的结果)每个值,但不是很有帮助)。但是,在大多数情况下,由于输入被限制为几个字母字符,因此您通常可以找到一个有效的mod。
要找到对两个数字a和b产生唯一结果的最小模数,请执行以下操作。取a和b(|a - b|
)之差的绝对值,找到最小的数n,它不会除以它。例如,对于97和98,,则|98 - 97| = 1
2是最小的mod(但是对于我们的测试程序,这对于97给出1,对于98给出0,因此mod 3更好)。
有时,您会结束用> <>编写程序的工作,这些程序要求您在接收到不同的输入后执行不同的操作。通常,您将使用条件(?
)和换向器对此进行解析。在某些情况下,这种方法可以很好地工作(特别是当要处理的输入类型较少时),但是有时您最终会得到如下所示的结果。(忽略使用其他技巧可以减少此代码的事实,这只是为了演示)
i:"a"=?v:"b"=?v"c"=?v>
.00n1< .00n2<.00n3<
尽管这很好,但它确实有一些空格(我个人从来不喜欢看到),并且有很多重复(=?v
和.00n
)。取而代之的是,您可以使用跳转和不同的行作为条件。这是一个例子:
i:"a")$"b")+1+0$.>
v1
v2
v3
<.00n
这将减少10个字节。这是正在发生的事情:
i:
我们将输入重复一次,因此可以评估两次
"a")$"b")+
这可能是它自己的提示,但是我在这里所做的是检查输入是否大于字符“ a”,然后大于输入字符“ b”并添加结果。对于“ a”,这将产生0,对于“ b”,将产生0,对于“ c”,将产生2。
1+0$.
这就是魔术发生的地方。我们采用前面简化的结果并加1(给1表示“ a”,给2表示“ b”,给3表示“ c”),然后按0并交换值。当我们到达跳跃点时,它将移至与我们为这些字符分配的值相对应的行(例如,“ a”的第1行)。注意:第0行是程序的顶部。
!
当您想要向前和向后(或向上和向下)运行代码时,蹦床()非常方便。这些情况不太可能发生,但是对于回文或类似的挑战,此技巧可能会有用。
这是一个示例:我想运行一次代码,然后遍历堆栈并丢弃值,直到达到0,然后下降。指针从进入此循环>
。您可以使用跳转来完成此操作,例如
?!v80.>ao
(假设我要先打印换行符)
但是,如果我们要运行一次的代码(后面的代码>
)使该行的长度超过16个字符,那么我们将无法再使用三个字符的跳转。但是,这是一个示例,其中向前和向后运行都很简单...
?!v!?<>ao>
向前,我们打印换行符,然后单击?!v
它,如果它不为0,则将其丢弃,然后由于蹦床,我们跳过下一个?
并向后退。发生同样的事情,循环继续直到我们达到0。
这是一个奇怪的特定示例,但是有一些(也许不是很多)应用程序。