莎士比亚编程语言中的高尔夫技巧


43

您对莎士比亚编程语言的高尔夫有什么一般提示?我正在寻找可以应用于代码高尔夫球问题的想法,并且这些想法至少也特定于SPL(例如,“删除注释”不是答案)。

请为每个答案发布一个提示。


17
我不确定您可以打SPL。SPL非常冗长,我几乎觉得这个问题需要代码拖曳标签。:P
Alex A.

你就是不能打高尔夫球。至少,就我对莎士比亚传说的了解不足...
Rodolfo Dias

@RodolfoDias:有感觉吗?我认为您是PPCG的莎士比亚常驻学者。
Alex A.

8
@AlexA。这可能不是一件好事:这只是意味着我痴呆了,无法尝试并理解SPL :-)
Rodolfo Dias 2015年

@AlexA。Sp可以做到...
Conor O'Brien

Answers:


18

(嗯...因为这是我采用的语言1,我觉得我不得不在这里添加一些内容)

使用简短的变量名

是的,这是代码高尔夫球的相当标准,您只使用一个字母长度的变量名,这里没有消息。还是在那里?因为创建SPL的家伙很古怪,不允许为其语言的变量输入任何名称:它们必须来自莎士比亚的戏剧,就字符长度而言,这是王室的痛苦-但是,如果您使用SPL编码,您已经知道。因此,我的建议是每个实例都使用带有短名称的字符,例如AjaxFordPagePuck,而不要使用Canterbury的大主教

恐怕这就是我所拥有的。


1-因为我的Java技能等同于新生儿。



13

(在做完前一个之后,我只记得了几​​件事)

仔细选择您的代码

一个例子,试图解释这意味着什么。

Ajax:
 You are as warm as a big red rich fair cute bold cat!

Ajax:
 Thou art as blossoming as an embroidered trustworthy bottomless peaceful charming handsome chihuahua!

产生完全相同的结果,这就是说出来的字符采用值64(因为假设您阅读了我与SPL的漫长战斗,您知道这两行等效于2 * 2 * 2 * 2 * 2 * 2 * 1); 但是,第一个具有59个字节,而第二个具有107个字节数。

尽管如此,没有人会痴呆于使用SPL 进行挑战,所以...


10
您可以在描述中多次使用相同的形容词吗?例如a big big big big big big cat,再节省4个字节?我知道这会破坏艺术性……但这毕竟是代码高尔夫。;)
DLosc 2015年

@DLosc,据我所知,没有任何东西禁止您这样做。所以...你是一个比我更好的高尔夫球手^ _ ^
Rodolfo Dias

1
啊 不要叫罗伯特·弗雷泽(Robert Fraser)痴呆。codegolf.stackexchange.com/a/69360/43394
wizzwizz4 '16

12

任何罗马数字都是有效的场景编号

这意味着,而不是:

Scene I
Scene II
Scene III
Scene IV
Scene V

你可以做:

Scene L
Scene I
Scene C
Scene X
Scene V

D有效的罗马数字吗?IIRC,它是500(但我不确定它在SPL中是否有效)
Giuseppe

@Giuseppe我不明白为什么您不只是检查一下,但官方的SPL解释器支持M,C,D,X,L,I和
V。– NieDzejkob

10

删除不需要的词

看一下这个(插入换行符和空格以提高可读性):

Puck:You is a big big cat!
     Open your heart!
Ajax:Be you worse than I?
     If so, let us return to Scene V!
     If not, you is a cat.
     You is the sum of I and the sum of a cat and you
     Speak thy mind!
     [Exeunt]

看起来很漂亮,是吗?这是一种更加简化的难以理解的形式:

Puck:You big big cat!
     Open heart!
Ajax:Be you worse I?
     If so, let us Scene V!
     If not, you cat.
     You is the sum of I the sum of a cat you
     Speak mind!

作为参考,以下是可从代码中轻松删除的单词的列表:

  • 说出您的想法 -> 说出您的想法
  • 敞开心 heart-> 敞开心 * *
  • 听你的心 -> 听你的
  • 敞开心mind- > 敞开心 * *
  • 你是猫 -> 你猫 *
    • 仅适用于,例如big cat,否则您仍然需要'is'
  • 让我们回到 -> 让我们
  • 是X [op]比Y? ->是X [op] Y吗?
  • 您是X和Y的[op] -> 您是X Y的[op]
  • [执行] ->(完全删除)

传说:

  • XY像常量catIyou
  • [op]是操作,比如nicerthe sum of
  • *表示您可以删除标点符号(如果这是该剧的最后一句话)

如果遇到其他任何人,请将其添加到列表中。

作为其他参考,这是启动程序的最短标头:

,.Ajax,.Puck,.Act I:.Scene I:.[Enter Ajax and Puck]

在线尝试!

根据需要添加Page和Ford作为额外字符。


1
如果您需要更多的字符,请在此处
NieDzejkob,

:| 条纹下来
ASCII-仅

6

用简短的话

因此,它们是:

  • 使用a代替anthe,但表达式the sum of和类似符号除外,因为它们不适用于a
  • 使用ambeis代替areart
  • 使用I代替memyself
  • 使用you替代theethouthyselfyourself
  • 使用big的形容词。
  • 使用cat正数。
  • 使用pig负数。
  • 使用zero零。
  • 使用worseA < B(而不是smallerpunier)。
  • 使用nicerA > B(代替betterbiggerfresherfriendlierjollier)。
  • 角色名称:
    • 4个字母:Ajax,Ford,Page,Puck
    • 5个字母:Egeus,Helen,Julia,Lucio,Mopsa,巴黎,Pinch,Priam,Regan,Robin,Romeo,Timon,Titus,Venus,Viola
    • 6个字母:Adonis,Aegeon,Alonso,Angelo,Arthur,Banquo,Bianca,Brutus,Cicero,Dorcas,Duncan,Emilia,Fenton,Hamlet,Hecate,Hector,Helena,Hermia,Imogen,Juliet,Lenox,Oberon,Olivia,Orsino ,Portia,Thaisa,Thurio,Tybalt
    • 7个字母:Adriana,Aemilia,Agrippa,Antonio,Capulet,Cassius,Claudio,Dionyza,Escalus,Goneril,Horatio,Leonato,Luciana,Macbeth,Macduff,Malcolm,Mariana,Miranda,Miranda,Octavia,Ophelia,Orlando,Othello,Pantino,Proteus ,Publius,浅,Shylock,细长,Solinus,us修斯,Titania,Troilus,尤利西斯
    • 8个字母:阿喀琉斯,比阿特丽斯,本尼迪克,本伏里奥,克劳迪乌斯,科尔迪利亚,克雷西达,多贝里,唐·约翰,法尔斯塔夫,格特鲁德,赫莫妮,伊莎贝拉,莱桑德,默尔库蒂奥,蒙塔古,伯里克利,波洛纽斯,庞贝ius,普罗佩斯罗,罗莎琳德,斯蒂芬诺
    • 9个字母:Agamemnon,Antiochus,Autolycus,Balthazar,Brabantio,Cassandra,Cleopatra,Cornelius,Demetrius,Desdemona,Donalbain,Don Pedro,Ferdinand,Francisca,Hippolyta,King John,King Lear,Lychorida,Sebastian,Ghost,情人,Vincentio
    • 10个字母:Andromache,Cymberline,Fortinbras,男修道士约翰,亨利国王
    • 11个字母:Mark Antony
    • 12个字母:凯斯博士,理查德国王,卡普莱特夫人,麦克白夫人,麦克杜夫夫人,亨利王子,埃里诺女王
    • 13封信:约翰·冈特,凯撒大帝,蒙塔古夫人,福特情妇,情妇佩奇
    • 14封信:男修道士弗洛拉·劳伦斯
    • 15封信:克里斯托弗·斯莱,明锐凯撒
    • 17封信:兰开斯特的约翰,情妇过度,米兰公爵
    • 18个字母:威尼斯公爵
    • 24封信:威斯敏斯特大教堂
    • 28个字母:坎特伯雷大主教
    • 如果您确实需要更多,绝对应该考虑使用每个字符的堆栈。

需要注意的是多字字符可以忽略他们的名字后的任何空间(从user202729的小费),所以他们最好字符只有一个字
乔金

5

即使说话的角色不在舞台上,也可以使用“让我们回到场景X”。所以代替:

Puck:Am I as fat as the sum of a big big big big big big cat and a cat?
Ajax:If not,let us return to scene III.
[Exit Puck]
[Enter Page]
Ajax:You is a big big big big big big cat.

你可以做:

Puck:Am I as fat as the sum of a big big big big big big cat and a cat?
[Exit Puck]
[Enter Page]
Ajax:If not,let us return to scene III.You is a big big big big big big cat.

5

删除多余的空间

除了琐碎的空格(两个相邻空格,与标点符号相邻,最后与换行符相邻)(某些情况除外),可以删除以下标记后的空格:

  • the sum of
  • let us
  • the ghost像这样)(但是谁会使用这个字符)
  • if soif not(除去,在此之后,并不需要添加任何空间,例如:if solet usact I
  • listen to(这样listen tothy的作品,像这样
  • 以及基本上所有的多字标记

注意:这不适用于Perl解释器。这可能只是Flex的解析行为引起的意外效果。在“语言标准”不明确有关。


是时候回去编辑我的一些答案了……非常好!
乔·金

这是令牌生成器中的错误,还是该行为是用语言定义的?
心教堂

2
@Cœur请参阅更新。
user202729 '18

5

您无需在条件转换中切换人员。

例如,

Ajax:Is you better than the sum of a fat fat fat fat cat and a fat cat?
Puck:If so,let us return to Scene I.

超过

Ajax:Is you better than the sum of a fat fat fat fat cat and a fat cat?If so,let us return to Scene I.

1
WHOOps。定影。
奥利弗·尼

4

代替减法,添加常量

You is the difference between I and a big cat.

超过

You is the sum of I and a big pig.

4

跳跃可以更短

return to即使场景在前方,也可以使用,反之亦然。实际上,即使您完全省略了解释器,它也不在乎。这意味着这三个语句是100%等效的:

Let us proceed to Scene X.
Let us return to Scene X.
Let us Scene X.

Jo King(codegolf.stackexchange.com/a/164394/76162)发现,“让我们场景X”就足够了。
艾德·永利

@EdWynn很高兴知道。我重写了答案以包含此内容。
NieDzejkob '18年


4

仅使用一个场景

通常,您不能重用一个动作的第一个场景,因为它总是有[Enter Ajax and Puck]第一件事。但是,您可以在此之前添加前缀,[Exeunt]以能够重用剧本的第一个场景。[Exeunt]比声明新场景短一个字节,跳转到Act比跳转到场景少两个字节。

例如:一个简单的猫程序

,.Ajax,.Page,.Act I:.Scene I:.[Enter Page and Ajax]Scene V:.Ajax:Open mind!Speak thy!Let usScene V!

在线尝试!

至:

,.Ajax,.Page,.Act I:.Scene I:.[Exeunt][Enter Page and Ajax]Ajax:Open mind!Speak thy!Let usAct I!

在线尝试!


3

使用简短的单词

例子:

Thy并且thyselfyour和短yourself

Is 短于 are

和更多...


3

使用智能条件

例如,不要使用

Ajax:Are you as good as or better than me?If so,let us return to Scene I.

反而,

Ajax:Are you worse than me?If not,let us return to Scene I.

3

If (so|not) 不必立即进行比较。

Am I as big as you?You big big big big big cat.If so, you is the sum of you and a big big cat.

4
实际上,比较的结果被存储为标记,并且可以在场景转换或多个If sos上重复使用。这有助于避免重复比较!
Jo King

2

使用常量存储大量数字

例如,如果您有

Ajax:You is a fat fat fat fat fat fat fat fat fat fat cat!
Puck:You is the sum of thyself and a fat fat fat fat fat fat fat fat fat fat cat
Ajax:You is the sum of the difference of me and thyself and a fat fat fat fat fat fat fat fat fat fat cat!

您可以在顶部声明另一个人

Ford,a fat fat fat fat fat fat fat fat fat fat cat.

并将您的代码更改为

Ajax:You is Ford.
Puck:You is the sum of thyself and Ford.
Ajax:You is the sum of the difference of me and thyself and Ford.

8
官方解释器不支持这样声明常量。
NieDzejkob

2

Gotos不是唯一可用于的命令 If (so|not)

Am I as big as you?If so,you is the sum of you and a big big cat.If not,you is the sum of you and twice I.

2

所有换行符都将被忽略

,.Ajax,.Puck,.Page,.Act:.Scene:.[Enter Ajax and Puck]Ajax:You Puck.[Exeunt]

2

使用<>代替==

并非适用于所有情况,但要短很多:

帕克==阿贾克斯

Puck:Is I as bad as you?

Puck <Ajax或Puck> Ajax

Puck:Is I worse you?
Puck:Is I nicer you?

两者都短4个字节!


2

您不需要结尾.!

在线尝试!

也可以在之前使用[。(感谢jimmy23013)

,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:You cat[Exeunt]

例子:

  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:You cat
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Open mind[Exeunt]

不适用于:

  • ,.Ajax,.Page,.Act I:.Scene I:[Enter Ajax](右后Scene {number}:)(然而,作品,我不知道为什么)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Listen to your heart (以及更短的变体)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Let us return to scene I (以及更短的变体)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Recall(仅在空之后RecallRecall xRecall@等作品)
  • ,.Ajax,.Page,.Act I:.Scene I:.[Enter Ajax and Page]Ajax:Speak thy(无mind

在某些情况下,您已经删除了某个单词,这是行不通的,例如Speak thyLet us Scene I
Jo King

2

使用“两次”和分配属性

代替:

You is the sum of a big big big big cat a big big big cat.

采用:

You is twice twice twice the sum of a big cat a cat.

这样每次可节省2个字节,twice因为2次使用big为8个字节(带空格),twice仅为6个字节。

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.