> <>(鱼)打高尔夫球的技巧


14

因为我已经看到更多> <>提交左右浮动最近,我想这可能是一个好主意,有一个提示页面。

除非它们之间有密切的联系,否则请在每个帖子中坚持一个提示。

官方Python解释器

在线解释器(存在一些错误,但对于大多数情况而言是好的)


9
我只是在浏览esolang页面时才意识到:> <>的创建者的名字听起来像是“鱼叉”。
mbomb007

如何在鱼上打印换行符?
曼队长

@CaptainMan您可以使用来输出代码点o,并且由于换行符\n是ASCII 10,所以可以这样做ao
Sp3000

@Sp谢谢,我正在尝试CR而不是LF在推动d而不是a
曼队长

Answers:


5

对照0

使用?!代替0=?通常会节省一个字节。

但是,?如果您可以承担一些重组,仅使用标准有时可能会更好

?!vA
  B

?vB
 A

4

检查EOF

达到EOF时,> <>将-1推入堆栈,可以通过以下两种方式之一进行检查:

:0(?
:1+?

出于检查EOF的目的,这两个是否定的,因此哪种更有利取决于程序的结构。


3

跳转以规避新行

开始新的一行有时意味着在下一行上浪费大量的空白。在这种情况下,跳跃可能会很有用。

例如,

[lots of code here]>[loop body]v
                   ^ ......... <

可以使它适合一行,如下所示:

[lots of code here][loop body][jump]

举一个实际的例子,这是同一行的Hello World程序:

"!dlroW ,olleH"l?!;oe0.

3

使用模数简化输入

提示可能太简单了,所以如果是这样,我将替换它或删除它。

假设您要输入两个字符“ 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| = 12是最小的mod(但是对于我们的测试程序,这对于97给出1,对于98给出0,因此mod 3更好)。


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行是程序的顶部。


1

编写可以运行两种方式的代码

!当您想要向前和向后(或向上和向下)运行代码时,蹦床()非常方便。这些情况不太可能发生,但是对于回文或类似的挑战,此技巧可能会有用。

这是一个示例:我想运行一次代码,然后遍历堆栈并丢弃值,直到达到0,然后下降。指针从进入此循环>。您可以使用跳转来完成此操作,例如

?!v80.>ao (假设我要先打印换行符)

但是,如果我们要运行一次的代码(后面的代码>)使该行的长度超过16个字符,那么我们将无法再使用三个字符的跳转。但是,这是一个示例,其中向前和向后运行都很简单...

?!v!?<>ao>

向前,我们打印换行符,然后单击?!v它,如果它不为0,则将其丢弃,然后由于蹦床,我们跳过下一个?并向后退。发生同样的事情,循环继续直到我们达到0。

这是一个奇怪的特定示例,但是有一些(也许不是很多)应用程序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.