现代高尔夫的编程难题


43

您的任务是打印文本Good morning, Green orb!,并将每个字符重复出现在位置(模式)中最频繁出现的字节中。尾随换行符是允许的,不需要重复。

例如,如果您的来源是

print p

因为p出现两次,并且每隔一个字节出现一次,则需要打印

GGoooodd  mmoorrnniinngg,,  GGrreeeenn  oorrbb!!

答案将通过其字节数与重复输出次数的乘积来评分。例如,上面的代码(如果可行)将获得7 * 2 = 14的评分。目标应该是最小化分数。

您的代码必须至少包含1个字节。

使用此程序来验证您的代码和输出是否匹配


允许使用功能吧?
totallyhuman

1
@totallyhuman是的,只要他们不接受输入即可。
小麦巫师

1
这不应该标记为quine吗?
FantaC

早上不能大写,可以哈哈吗?
魔术章鱼缸

@magicoctopusurn不,文本应该是相同的。
小麦巫师

Answers:


18

脑高射炮384 * 106 366 * 100 = 36600

(((((((()()()))))))(()({}{}{}(([(({}{})){}()]((((({}())){})){}{}()(({})<([{}](((({}()())))([{}]([{}]()((()()())(()()({}()([(({})){}()](((((({}))))({}({}{}{}){})(({}){}()))))<((((([]){}){}){}<>)<>)>[])))))))(((((()()())()){}{}){}){})<>(((({})<>)))>{}{})))))<(<>({})<>)>))(<>((({}))()){}{}<>)<>(((({}<>()))))({}{}{}<>)<>{((<>{}<><({}<>)>)<{({}[()]<(({}))>)}{}>)<>}<>{}

在线尝试!

说明

我要做的第一件事是推弦

!bro neerG ,gninrom dooG

使用相当标准的脑性Kolmogorov复杂性策略将其添加到堆栈中。

(((((((()()()))))))(()({}{}{}(([(({}{})){}()]((((({}())){})){}{}()(({})<([{}](((({}()())))([{}]([{}]()((()()())(()()({}()([(({})){}()](((((({}))))({}({}{}{}){})(({}){}()))))<((((([]){}){}){}<>)<>)>[])))))))(((((()()())()){}{}){}){})<>(((({})<>)))>{}{})))))<(<>({})<>)>))(<>((({}))()){}{}<>)<>({}<>())

然后,我们将计数器推入堆栈外,以告诉我们重复每个字符多少次。但是,直到完成编写程序,我才能确定该计数器是什么。

接下来,我们同时反转字符串,并将每个字符重复正确的次数。特别是计数器+ 1。

{((<>{}<><({}<>)>)<{({}[()]<(({}))>)}{}>)<>}<>{}

程序的这两部分的模式为99个开放括号。但是,由于我们肯定会需要至少一个括号。在这里,我注意到我们!方便输入的最后一个字符的字符代码为33,这意味着我们可以使用它来创建99,这是我们想要的确切数字,仅需使用一个附加的括号即可。这是很巧合,但确实可行。


9
嗯,是的,这只是相当标准的脑筋急转弯Kolmogorov复杂性策略。这些就是东西。
约翰·基茨

你,我的好人,肯定是疯了,甚至尝试。在我的大脑因试图理解所有括号而爆炸之前,我只是要+1并走开。
Caird coinheringaahing

15

Haskell,37字节×3 = 111

-20感谢H.PWiz。-25感谢妮米。

"Good m\111rning, Green orb!"<*[2..4]

在线尝试!

Haskell的运营商FTW。

自我提醒,永远不会在手机上打高尔夫球。我一直在犯愚蠢的错误。我至少可以将责任归咎于移动设备。:P


5
使用<*保存字节(请注意,我没有检查其有效性)
H.PWiz

...糟糕透顶,Haskell的操作员几乎太多了。谢谢!
totallyhuman

15

brainfuck,235 X 77 = 18095点

编辑:-2字节感谢@Dennis

-[>--<-------]>-[>+++++>+>+>+>+++++>+>+>+>+>+++>+++++>-->+>+>+>+>+>+>+>+++++>+>+>+>+++[<]>-]>>----------->+++++>++>->+>-------->-------->+++++>>->++++++>------>+>---->+>+++++>++>>->--------->++>++>>-[>+<---]>--------<<[>>[-<+<.>>]<<,<]

在线尝试!

TIO测试

等等,这不是代码保龄球吗?\ s

仅有8个可用字符,brainfuck是解决此问题的最糟糕的语言之一。我必须从最小化不可避免地出现最多的字符开始,通常是+-。在编写了代码的第一个迭代之后,我发现它非常不平衡,而支持+s。我重新排列了代码的一部分,例如生成更大的数字,以使用更多代码-。最后,我结束了在一个相等的量的两个字符中的77少一个-+。当然,有可能进一步减少这种情况,我明天去讨论。

但是,至少我击败了Brainflak的答案


嘿,恭喜!我不敢相信甚至有可能在BF中做到这一点。。。如果它可以用以下;#语言完成,那就很漂亮
RedClover

13

果冻,13个字节* 1 = 13

“¢Ȧ@XĊ'WÑṭḂ#»

在线尝试!


3
最后,有人来管理难以捉摸的* 1答案。我感到果冻将是做到这一点的语言……
ETHproductions

@ETHproductions哈哈,将代码减半,同时保留* 1
Xcoder先生17年

Haha dang,我刚编辑

出于好奇,到底有什么区别?新压缩字符串的长度是旧压缩字符串的一半吗?
ETHproductions '17

@ETHproductions首先我基本上使用了非最佳的压缩字符串,然后使用了优化的Jelly压缩器,该压缩器在字典中找到了匹配项。
Xcoder先生17年

10

爱丽丝,49字节* 2 = 98144

/:G!4o3r8"1=5',0Grey9Z<@
\"b0=dnm 2'i%g<7R6~e.;o/

在线尝试!

说明

/...@
\.../

这是完全在Ordinal模式下运行的线性程序的常用框架。展开之字形控制流,我们得到:

"G04d3m821i5g,7G6ee9;<:b!=onr "'=%'<0Rr~y.Zo@

基本思想是避免在音译的帮助下重复两次以上的字符。我们将要进行的音译如下:

input: "G04d3m821i5g,7G6ee9;<:b!"
from:  "0123456789:;<"
to:    "onr "

在Alice中音译的工作方式是,首先将fromand to字符串重复到其长度的LCM,尽管在这种情况下,所有事项都是from字符串的长度,因此我们得到:

from:  "0123456789:;<"
to:    "onr onr onr o"

通过这种方式,我们可以得到四个不同的字符表示oS,以及三个分别用于nr和空间。我们可以from使用范围扩展生成字符串,如下所示:

'<   Push "<".
0    Append a zero.
R    Reverse.
r    Range expansion.

现在唯一的问题是,"对于input和,我们都需要四个to。为避免这种情况,我们将它们都放在一个字符串中,并在=用作分隔符的位置将其拆分。

"G04d3m821i5g,7G6ee9;<:b!=onr "
     Push the string containing both parts.
'=%  Split around "=".

其余的只是:

~   Swap "from" and "to".
y   Transliterate.
.Z  Duplicate and interleave. This duplicates each character.
o   Print.
@   Terminate the program.



5

C(gcc),68×3 = 204

0000000: 6a 3b 6d 61 69 6e 28 29 7b 77 68 69 6c 65 28 6a  j;main(){while(j
0000010: 3c 37 32 29 70 75 74 63 68 61 72 28 7e 22 b8 90  <72)putchar(~"..
0000020: 90 9b df 92 90 8d 91 96 91 98 d3 df b8 8d 9a 9a  ................
0000030: 91 df 5c 32 32 30 8d 9d de 22 5b 6a 2b 2b 2f 33  ..\220..."[j++/3
0000040: 5d 29 3b 7d                                      ]);}

感谢@MDXF节省了9分并为另外6个铺平了道路!

在线尝试!

备用版本,可打印ASCII,69×3 = 207

j;main(k){while(j<72)putchar("Gnmg$hiuf`dl -I}ut|3{gt6"[k=j++/3]^k);}

在线尝试!




5

Vim,42 41次击键×3 = 123

iGod morning, Green orb!<Esc>2|qsyl2pl@sqX0@s

说明:

  1. iGod morning, Green orb!<Esc>
    写字符串God morning, Green orb!(一个o丢失)。
  2. 2|
    跳到第一个o
  3. qsyl2pl@sq
    创建一个递归宏s。作为副作用,将电流增加三倍o
  4. X0
    删除一个o并跳到开头。
  5. @s
    运行宏s,每个宏重复两次。

4

C,78×4 = 312

*s=L" ÞÞÈ@ÚÞäÜÒÜÎX@äÊÊÜ@ÞäÄB";main(y){while(*++s)for(;y++%5;putchar(*s/2));}

在线尝试!

356 332


发表评论是因为每次我想打高尔夫球时,我都讨厌在浏览器历史记录中找到它:我用来查找重复字符的次数。
MD XF

以此编码字符串。
MD XF

3

Japt,24字节* 2 = 48

`Good ¶rÍÁ,
GÎ9 b!`m²·¸

包含不可打印的内容。在线测试!

该程序的大部分只是一个压缩的字符串,它解压缩为

Good morning,
Green orb!

然后m通过重复它APS每个字符²WICE 好,这是一个有点夸张。空格是唯一出现在压缩字符串中3次的字符。为了保存一个实例,我们将其替换为换行符,然后使用·¸拆分换行符并立即在空格处加入。虽然长了2个字节,但分数却大大降低了(从66降低到48)。

现在,如果有一种简短的方法可以做到两次不使用任何字符...


因为我看不到:哪个字符是来源中的三倍?我看到几件事情是具有计数2,而不是3
Draco18s

1
@ Draco18s无,得分为24 * 2。
ETHproductions '17

然后输出错误。您将每个字符打印3次,而不是两次。
Draco18s 17/12/28

@ Draco18s Dangit,发布了错误的链接...感谢您指出这一点。
ETHproductions '17

*salute*现在,我看着您的回答,我看到它带有²,而链接中
带有

3

SNOBOL4(CSNOBOL4),97字节* 10 = 970

	S ='Good Morning, Green orb!'
y	S	LEN(1) . y rem . s	:f(p)
	x	=x DUPL(y,10)	:(y)
p	OUTPUT	=x
END

在线尝试!

是的........ SNOBOL要求运算符之间必须用空格隔开,并且有些空格要求很尴尬。代码中有9 '\t'和10 ' ',因此,任何改进都需要对方法进行相当大的改变。


3

R65字节* 5 = 325 59字节* 5 = 295 62字节* 4 = 248

cat(gsub('(.)',strrep('\\1',4),"Good Mo\x72ning, Green orb!"))

在线尝试!

有4个(or,')字符。


2
我从未见过strrep,应该派上用场。
BLT


3

Perl 5,59×2 = 118点

$_="GSSdYmoVRing,YGVIen orb!";y<H-Z>[d-t ],s<.>[$&x2]eg;say

在线尝试!

Perl 5、51×3 = 153156 点数

s""GOOd morning, Green orb!";y'O'o';s/./$&x3/eg;say

在线尝试!

Perl 5,43×4 = 172点

say"Good morning, Green orb!"=~s/./$&x4/egr

在线尝试!

感谢@Xcali(在一些更改之前),每个解决方案中节省了2个字节。对于所有优化,请查看编辑。


将其作为程序而不是函数可以节省2个字节(4分):在线尝试!
Xcali

@Xcali,但是您的更改需要一个非标准选项-M5.010,该选项也很重要
mik


2

V,35字节* 2 = 70

IG²od morning, GreeN ORb!5h3~Óˆ/°°

在线尝试!

十六进制转储:

00000000: 4947 b26f 6420 6d6f 726e 696e 672c 2047  IG.od morning, G
00000010: 7265 654e 204f 5262 211b 3568 337e d388  reeN ORb!.5h3~..
00000020: 2fb0 b0                                  /..


2

的Python 2,62 * 4 = 248

感谢@ovs和@Giuseppe!

lambda:"".join(c*4for(c)in"G\x6f\x6fd mor\x6eing, Green orb!")

在线尝试!

蟒蛇 2,51 * 6 = 306

print"".join(c*6for c in"Good morning, Green orb!")

在线尝试!

Python 2,70 * 5 = 350

lambda:"".join(c*5for(c)in"Gxxd mxrning, Green xrb!".replace('x','o'))

在线尝试!

感谢@先生。Xcoder可从两个版本保存一个字节!


您可以删除之间的空间6for
Xcoder先生17年

@ Mr.Xcoder谢谢!
Steadybox


@ovs不太正确,我认为您需要两个\x6fs,这对于244来说仍然很好
Giuseppe



2

CJam,32字节×2 = 64

"Gnmg$hiuf`dl -I}ut|3orb!"K,.^:_

在线尝试!

推入一个字符串,然后将前20个字符与进行XOR运算[0, 1, …, 19],然后复制每个字符。


2

05AB1E,得分:22(22 字节 * 1)

…‚¿•´,„ˆ¨èã).ªðý23£'!«

在线尝试。

说明:

注意1:使用列表内置的包装堆栈)代替内置 ,因为已经是字典word的一部分good
注意2:代码中的两个逗号,可能看起来相同,但是是不同的unicode字符。第一个通常用于内置,第二个通常用于带有尾随换行符的内置打印到STDOUT。在这种情况下,它们用于字典单词good,但是在输出中使用期望的逗号。

…‚¿•´,        # 3-word dictionary string "good morning," (the comma counts as the third word)
„ˆ¨èã         # 2-word dictionary string "green orbit"
)             # Wrap everything on the stack into a list: ["good morning,","green orbit"]
            # Sentence capitalize all strings: ["Good morning,","Green orbit"]
   ðý         # Join by spaces: "Good morning, Green orbit"
     23£      # Only leave the first 23 characters: "Good morning, Green orb"
        '!«  '# Append a "!": "Good morning, Green orb!" (and output the result implicitly)

请参阅我的05AB1E技巧(如何使用字典?部分),以了解为什么…‚¿•´,"good morning,"„ˆ¨èã"green orbit"




1

果冻,31字节×2 = 62点

“2ðƈZ(Øṡdȷ¿Ɱ’ṃ“God mrnig,eb!”x2

在线尝试!

说明

“2ðƈZ(Øṡdȷ¿Ɱ’ṃ“God mrnig,eb!”x2
“2ðƈZ(Øṡdȷ¿Ɱ’                     Base 250 number
              “God mrnig,eb!”     Unique characters of "Good morning..."
             ṃ                    Convert the base 250 number in base 13 then index into the string "God mr..."
                             x2   Repeat each character twice because “ occurs twice in the source (and now 2)

1

JavaScript(ES6),61个字节* 3 = 183

_=>'Good morning, Gr\145en \x6f\x72b!'.replace(/./g,"$&$&$&")

JavaScript(ES6),51个字节* 4 = 204

_=>'Good morning, Green orb!'.replace(/./g,'$&$&$&$&')

答案由@ETHproductions建议

JavaScript(ES6),73个字节* 4 = 292

_=>`G00d mo1ning, G244n orb!`.replace(/./g,_=>(('o'+!0)[_]||_).repeat(4))

JavaScript(ES6),58个字节* 6 = 348

_=>'Good morning, Green orb!'.replace(/./g,_=>_.repeat(6))


或者,更改_=>_'$&'
ETHproductions

1
或者,我认为您可以'$&$&$&$&$&$&'进行替换,然后我认为您可以删除两个实例并下降到在4处绑上几个字符,从而大大降低了得分...
ETHproductions

@ETHproductions谢谢,不知道该替换模式!
darrylyeo



1

进取心,36 * 2 = 72

`GXVWOP^4W_[afdc\hiB`N$29+L-''.

在线尝试!

这个答案的主要原理是每个字符n都按原样存储,n + index - 29以避免在原始字符串中重复。此映射在反引号中创建了字符串。程序的其余部分仅对此进行解码,并将每个字符打印两次:

` ... `              \ Push the encoded string
       N             \ Remove printing delimiter
        $            \ While there are items left on stack:
         29+         \   Add 29 to top of stack
            L-       \   Subtract current length from top of stack
              ''.    \   Print twice, then pop

使用两次的字节: `'W

变更日志

  • 通过更改解码方法,高尔夫球长度从41延长到38。
  • 通过从每个编码字符中减去29来防止多字节字符,从而将长度从38扩展到37。
  • 使用隐式“结束循环”将高尔夫球的长度从37缩短至36
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.