你对在代祷打高尔夫球有什么一般的建议?我正在寻找的想法,可以应用于代码高尔夫挑战,并至少在一定程度上具体到调解(即“删除评论”不是一个有用的答案)。
我知道异国语言对于赢得高尔夫比赛是非常有用的,但是我在这里没有看到太多的代写代码。你有什么建议可以帮助人们通过调解获得有竞争力的代码大小吗?这种语言会有竞争力吗?
代祷被充分利用,甚至连标签都没有。如此悲伤..。
发布于 2016-12-28 12:43:20
同意的话
如果您需要编写相当于" If“语句的代码,则使用INTERCAL-72代码的正常方法是NEXT两次,然后执行计算的RESUME。(在现代代码中,通常计算的COME FROM会更好,但本技巧假设您的代码更喜欢NEXT。)您几乎肯定必须为第一个NEXT支付字节,因为它从"if“的一个分支跳到另一个分支。共享第二个NEXT也是很重要的,除非您有大量的"if“语句,这些语句在看到#1时会到达相同的位置。但是,RESUME可以在程序中的任何位置(因为控件会立即将它留在任何地方)。
有两种方法来处理这个问题。如果您有很多" If“语句,那么RESUME可能需要一个个位数的行号,这样您的第二个NEXT语句就可以尽可能短。如果可能的话,尝试将它变成一个自然会出现在代码中的计算RESUME (诚然,这很困难,因为在代码的“正常流”中出现而不是NEXT编辑的代码是很少见的);然后,唯一的成本是行号。您必须为所有这些NEXTS使用一个布尔变量;这里的普遍共识是使用.5,主要是因为它是标准库用于布尔返回值的变量。
或者,也可以使用标准库的无文档特性(技术上没有文档化,因为当我注意到时,我在中介文档中插入了一个提示)。由于RESUME的中心位置非常有用,标准库在内部使用一个。INTERCAL中的行号是全局的(有名称空间约定,但如果您知道自己在做什么,它可能会被打破),因此如果您愿意,可以将NEXT直接放入标准库内部,特别是可以将NEXT放到其中心简历位置。这在现有的中介代码中非常流行,标准库替换往往不得不实现它,以避免破坏现有的程序。
所涉线(字面上或实际上取决于执行情况)是:
(1001) DO RESUME .5不使用它的主要原因是它的长行号;如果您需要进行大量的中介-72风格的如果构造,最好使用您自己的,给它一个较短的数字。
当然,您可以将这些技术结合起来,编写类似于
(9)DO(1001)NEXT只是稍微长于
(9)DORESUME.5它的好处是布尔人变成了#2和#3 (这很难读,但通常更容易生成)。实际上,如果您要频繁地使用#0和#1,甚至可能需要额外的代码来处理这些代码(但是在这种情况下,计算出来的COME FROM可能会更好地工作,除非您的需求非常奇怪)。
发布于 2016-12-28 12:29:34
代祷是一种对空格不敏感的语言。然而,与大多数对空格不敏感的语言不同的是,这种不敏感的语言要比您预期的要远得多。
例如,DO NOT是两个令牌,但是可以在没有解析器抱怨的情况下编写DONOT (在几乎所有广泛使用的实现中)。(当然,您也可以编写DON'T,但它并不简单。不过,它可能更容易读懂。不过,PLEASEN'T可能比PLEASE NOT难读。)实际上,对于空格是否做任何事情存在一些争论;至少有一个中介解析器允许它即使在数字常量中(这在打高尔夫球时不是很有用)。要记住的一件事是,从DOREADOUT中删除空格会使DO READ OUT混淆一些较老的代间解析器,这是由于嵌入式DO (虽然他们的作者通常认为这是一个bug,因此现在它通常在一个有效的程序中工作,因此在语法错误附近放置这样的代码是不可取的,因为那时消除歧义可能要困难得多)。
还请记住,您可以越出字符以节省空间。在ASCII中,只有使用'.→!才能真正做到这一点,但这本身就是一个非常有用的技巧。(当不使用数组时,即使所有分组字符都相同,也不可能出现火花模糊,因此对于高尔夫条目,建议只使用',除非数组下标确实需要"。)一个书虫可以用一个字节来表示,方法是使用?缩写(C-INTERCAL)或拉丁文-1表示¥ (CLC-INTERCAL),而不是使用inter-72所需的三个字节。
发布于 2016-12-28 12:52:44
CREATE缩写代码
CREATE语句允许您创建新语法。这对于打高尔夫球特别有用,因为它允许你给出更短的名字。您还可以通过创建一个新的操作符来有效地“定义一个函数”(这有一个巨大的优势,它允许您在表达式的中间调用函数)。
这里的设置成本相当高,但是如果有一个您经常使用的构造,为它发明更短的语法可能是个好主意。
https://codegolf.stackexchange.com/questions/54409
复制相似问题