木炭打高尔夫球的技巧


15

木炭是一种仅由ASCII和DLosc创建的语言,专门处理ASCII艺术挑战。

您在木炭上打高尔夫球有哪些技巧?显然,我在寻找与木炭特别相关的技巧,而不是那些可以应用于大多数(即使不是全部)语言的技巧。


拧紧它,我去尝试对某物做一个木炭的答案,老兄。也许我可以在该线程上给出一些次要的指针。
魔术八达通Ur

Answers:


5

利用deverbosifier

使用deverbosifier意味着您可以用ASCII编写(--dv--deverbosify去混响,-v--verbose以详细代码执行)。此外,它还可以为您压缩字符串,当要压缩的字符串太长时,在某些ASCII技术挑战中很有用。

@Neil建议使用-vl-v --sl。这是的缩写--verbose --showlength,表示将被解释为冗长的木炭,并显示正常木炭代码的长度。另外,在取消混响时,请检查输出以确保输入实际上已正确解析,因为木炭通常会忽略解析错误。如果语法错误,使用-a--astify)或--oa--onlyastify),以帮助找出问题。


此外,我建议使用-v -sl。另外,在消除混响效果时,请检查输出以确保输入实际上已正确解析,因为您并不总是会遇到解析错误。
尼尔

3

使用重载

例如,许多命令只需要一个参数:

  • RectangleOblongBox让方如果只指定了一个参数
  • Reflect 命令默认为正确显示
  • Rotate 命令默认为逆时针90度
  • PolygonPolygonHollow可以接受多方向和边长。如果所有边的长度都相同,则可以使用此方法。

我偶然发现了这个事实PolygonHollow。您甚至可以具有多个多向,但是它们必须位于普通箭头之前(我不知道此限制是否是有意的)。我在回答“画一个立方体”挑战时使用了它。
尼尔

嗯,这种限制是故意的,但我想我应该更改它,因为它无论如何都不会受到损害
仅ASCII格式,

我看到您修复了多边形,可以按任意顺序接受箭头和多向,谢谢!当我在这里时,我希望ReflectButterfly dls可以呼叫ReflectButterfly每个方向,但是(正如Wiki正确地记载了)它实际上可以呼叫ReflectOverlap
尼尔

@Neil大声笑,我将尝试尽快解决该问题(我也认为这是一个巧合哈哈)
仅ASCII格式,

3

避免相同类型的连续常量

例如,Plus(Times(i, 2), 1)转换为⁺×鲦¹,但是您可以通过切换参数来保存一个字节:Plus(1, Times(i, 2))转换为as ⁺¹×ι²Plus(Times(2, i), 1)as ⁺ײι¹都保存一个字节。Plus(1, Times(2, i))(译为⁺¹×²ι),如果紧随其后的是另一个数字常量,效果会更好。


3

使用预定义的变量

这是所有可以使用的变量的列表,给出简洁的希腊字母和代表它的冗长字母。

α/a: The uppercase alphabet
β/b: The lowercase alphabet
γ/g: A string of all the ASCII characters from space to ~
δ/d: The fifth input
ε/e: The fourth input
ζ/z: The third input
η/h: The second input
θ/q: The first input
υ/u: An empty array
φ/f: 1000
χ/c: 10
ψ/y: The null character
ω/w: The empty string

如果没有足够的输入,表示输入的变量将为空,但是在使用之前必须分配此处未显示的所有其他变量。


这些现在应该固定在TIO,这将是很好,如果你可以验证它的工作原理
ASCII-仅

@ ASCII-不仅可以确认,yf有其他的方式从我身边粘贴?(当我最初写这篇文章时,我可能看错了希腊字母。)
尼尔(Neil

是的,他们是周围的其他方法
ASCII-仅

3

了解您的思考和旋转

基本反射和旋转有很多变化,因此有必要知道什么是细微的差异。表的关键:

  • 命令:详细模式下的命令名称。
  • 转换:木炭在镜像或旋转字符时是否应尝试翻转或旋转字符。例如,旋转或翻转后/可能会变成\a。
  • 保持原始:木炭是否应将结果与原始画布合并。
  • 重叠:(仅当“保持原稿”为“是”时适用。)确定反射/旋转轴的位置,从边框起半个字符。在反射的情况下,等于不受影响的行/列的数量,并最终位于结果的中间。在旋转的情况下,允许旋转的副本覆盖原稿中的空白区域(但不能覆盖空格)。

感言

|         Command         | Transform | Keep Original | Overlap |
|-------------------------|-----------|---------------|---------|
| Reflect                 | No        | No            | n/a     |
| ReflectCopy             | No        | Yes           | 0       |
| ReflectOverlap          | No        | Yes           | 1       |
| ReflectOverlapOverlap   | No        | Yes           | n       |
| ReflectTransform        | Yes       | No            | n/a     |
| ReflectMirror           | Yes       | Yes           | 0       |
| ReflectButterfly        | Yes       | Yes           | 1       |
| ReflectButterflyOverlap | Yes       | Yes           | n       |

反射方向是可选的。默认值为向右反射一次。对于保留原始图像的那些反射,允许使用多个方向,只需向每个方向重复该命令即可。(这意味着,例如,ReflectMirror(:¬)实际上总共将创建四个副本。)

光标与反射一起移动(即使保留了原件)。

轮换

|         Command         | Transform | Keep Original | Overlap |
|-------------------------|-----------|---------------|---------|
| Rotate                  | No        | No            | n/a     |
| RotateCopy              | No        | Yes           | 0       |
| RotateOverlap           | No        | Yes           | 1       |
| RotateOverlapOverlap    | No        | Yes           | n       |
| RotateTransform         | Yes       | No            | n/a     |
| RotatePrism             | Yes       | Yes           | 0       |
| RotateShutter           | Yes       | Yes           | 1       |
| RotateShutterOverlap    | Yes       | Yes           | n       |

对于那些保留原稿的旋转,有一个可选的旋转原点。默认值为画布的右下角。允许的值是任何对角线方向。

旋转量(以45°为增量)是可选的。默认值为2,即逆时针(逆时针)为90°。对于保留原始值的那些旋转,有两个替代选项:一个多位整数指定对每个数字旋转画布一次,然后合并结果,而一个整数列表仅对每次旋转重复该命令,其可变结果取决于如何画布在两者之间改变。


问题:什么Transform意思?
CalculatorFeline

@CalculatorFeline好问题。Transform为no的情况只是字符对字符的复制。例如,标准反射“ 4> 2”只是字符的倒序,即“ 2> 4”。这并不总是可取的,因此Transform尝试以最适当的方式切换字符,因此“ 4> 2”的反射将变为“ 2 <4”。变换可能不是对此的最好描述,所以请随时提出更好的建议。
尼尔

想不到更好的方法了,所以您应该Transform在某个地方解释答案的工作方式。
CalculatorFeline

@CalculatorFeline我在表中添加了一个键,以防万一其他列都不清除。
尼尔

这些错误应立即修复。也非常感谢您抽出宝贵的时间编写此说明!

2

使用不带命令字符的命令

打印不属于命令的表达式。
如果在方向之前,则按指定的方向打印表达式。
使用从中选择的字符,数字以指定的长度打印为一行\/-|

如果一个方向后没有表达式,则将其计为在指定方向上移动一个空格。

注意:有时这可能被视为上一个命令的一部分,因此实际上可能需要该命令字符。(感谢尼尔提醒我)


1
但是,您必须提防歧义,因为前面的命令可能接受可选参数。
尼尔

2

使用多向

一些命令可以接受多向命令:+X*|-\/<>^KLTVY7¬⌊⌈。他们扩展到这里。通常,方向列表从上开始,然后顺时针继续。


为什么某些命令接受多向命令而其他命令需要一个方向列表,是否有任何特定原因?(这可能是我忽略的一个很好的原因,但我正在尝试这样做ReflectButtterflyOverlap(:¬, Modulo(g, 2));。)
Neil

@Neil,我不这样认为,它将尽快更改
仅ASCII的

0

充分利用 Sum

Sum 有很多方便的重载:

  • 在字符串列表上,将它们连接在一起。但是,如果列表可能为空,则将给出None,因此在这种情况下,请Join(..., "")改用。
  • 在非空数字列表上,只需取它们的和即可。
  • 在列表的非空列表上,将它们串联在一起(展平到深度1)。
  • 在整数上,取其数字的总和。(浮点值将被截断为整数。如果要小数点后的总和,请先转换为字符串。)
  • 在仅包含数字和一个可选.字符的字符串上,取数字的总和。
  • 在包含数字和分隔符的字符串上,采用强制转换为int或float的数字的总和(但请注意,这-算作分隔符)。

后两个规则的一个方便的副作用是,如果Sum在字符上使用该字符,则数字1-9将强制转换为它们的值,而其他所有值都将返回零,这与Cast,对于非数字值不一样。


0

对字符串数组使用split,对数字数组使用split和cast

字符串数组的拆分仅开销的三个字符,而拆分和转换仅开销的四个字符。相比之下,将其与从字面上写出数组(这需要数组的开始和结束)以及每个数组元素之间的分隔符进行比较。

如果您的数字数组仅具有小于95的数字,请使用强制转换(如果所有数字均小于10)或索引到预定义变量之一。


0

使用过滤器从数组或字符串中切出第一个字符

即使您很幸运,Slice用于从字符串中切出第一个字符也需要2个字节:Slice(..., 1)。如果要切片的表达式以数字结尾,需要分隔符,或者如果以下代码可以解释为表达式,则将花费更长的时间,因为在这种情况下,Slice它将要使用它作为附加参数。

而是使用Filter(..., k)删除第一个元素,从而获得所需的结果。(如果您的表达式嵌套在另一个循环中,则可以使用适当的循环索引变量。)该字节始终为2个字节,并且不受周围代码的影响。

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.