高尔夫Python字符串文字


21

背景

Python 3具有许多类型的字符串文字。例如,字符串this 'is' an exa\\m/ple可以表示为:

'this \'is\' an exa\\\\m/ple'
"this 'is' an exa\\\\m/ple"
r"this 'is' an exa\\m/ple"
'''this 'is' an exa\\\\m/ple'''
"""this 'is' an exa\\\\m/ple"""
r'''this 'is' an exa\\m/ple'''
r"""this 'is' an exa\\m/ple"""

如您所见,为字符串使用不同的分隔符可以通过更改某些字符所需的转义来延长或缩短字符串。某些分隔符不能用于所有字符串:r'上面缺少(请参阅后面的说明)。知道您的琴弦在代码高尔夫中非常有用。

也可以将多个字符串文字组合为一个:

'this \'is\' an ''''exa\\\\m/ple'''
"this 'is' an "r'exa\\m/ple'

挑战

面临的挑战是,给定可打印的ASCII字符串,以Python 输出最短的文字表示形式。

弦力学的详细信息

字符串可以使用分隔'"'''"""。当再次不转义命中起始定界符时,字符串结束。

如果字符串文字以开头'''"""用作分隔符。否则使用'"

可以通过在字符\前面放一个字符来对其进行转义。这会将字符插入字符串,并消除其可能具有的任何特殊含义。例如,在'a \' b'中间'被转义,因此不以文字结尾,结果字符串为a ' b

可选地,可以在起始定界符之前插入r或之一R。如果这样做,转义\将出现在结果中。例如,r'a \' b'计算为a \' b。这就是为什么a ' b不能用分隔的原因r'

要转义'''""",只需要转义其中一个字符即可。

这些文字可以串联在一起,从而串联它们的内容。

规则

  • 输入是打高尔夫球的字符串。仅可打印的ASCII,因此没有换行符或其他特殊字符。
  • 输出是高尔夫球弦文字。如果有多个解决方案,请输出一个。
  • 为了简化挑战,在非r字符串中\\,除\'和以外的所有转义符\"均被视为无效。他们不能在输出中使用,即使'\m'是等于'\\m'在Python。这样就无需处理特殊的转义码,例如\n
  • 不允许使用内置的Python字符串打高尔夫球。repr允许使用Python ,因为它还是很烂。
  • 适用标准规则。

输入/输出示例

我尽力验证了这些内容,但是如果有错误,请告诉我。如果案例有多个有效输出,则所有这些都将列在输入下方。

test
 -> 'test'
 -> "test"
te\st
 -> 'te\\st'
 -> "te\\st"
 -> r'te\st'
 -> r"te\st"
te'st
 -> "te'st"
te"st
 -> 'te"st'
t"e"s't
 -> 't"e"s\'t'
te\'st
 -> "te\\'st"
 -> r'te\'st'
 -> r"te\'st"
te\'\"st
 -> r'te\'\"st'
 -> r"te\'\"st"
t"'e"'s"'t"'s"'t"'r"'i"'n"'g
 -> """t"'e"'s"'t"'s"'t"'r"'i"'n"'g"""
 -> '''t"'e"'s"'t"'s"'t"'r"'i"'n"'g'''
t"\e"\s"\t"\s'\t"\r"\i"\n"\g
 -> r"""t"\e"\s"\t"\s'\t"\r"\i"\n"\g"""
 -> r'''t"\e"\s"\t"\s'\t"\r"\i"\n"\g'''
t"""e"""s"""'''t'''s'''"""t"""r"""'''i'''n'''g
 -> 't"""e"""s"""'"'''t'''s'''"'"""t"""r"""'"'''i'''n'''g"
t\"""e\"""s\"""'''t'''s'''\"""t\"""r\"""'''i'''n'''g
 -> r"""t\"""e\"""s\"""'''t'''s'''\"""t\"""r\"""'''i'''n'''g"""
t"e"s"t"s"t"r"i"n"g"\'\'\'\'\'\'\'\
 -> r't"e"s"t"s"t"r"i"n"g"\'\'\'\'\'\'\'''\\'
 -> r't"e"s"t"s"t"r"i"n"g"\'\'\'\'\'\'\''"\\"
"""t"'e"'s"'t"'s"'t"'r"'i"'n"'g'''
 -> """\"""t"'e"'s"'t"'s"'t"'r"'i"'n"'g'''"""
 -> '''"""t"'e"'s"'t"'s"'t"'r"'i"'n"'g''\''''

感谢Anders Kaseorg提供的这些其他案例:

\\'"\\'\
 -> "\\\\'\"\\\\'\\"
''"""''"""''
 -> '''''"""''"""'\''''

"'-> """t"'e"'s"'t"'s"'t"'r"'i"'n"'g'''
Rod

@Rod我将其添加为测试用例。
PurkkaKoodari

5
语言标签很好挑战的一个很好的例子。
亚当

怎么样u'b'
caird coinheringaahing

@cairdcoinheringaahing它们不提供任何有用的高尔夫功能,b甚至不能与常规琴弦组合使用,因此我只将它们省略了。
PurkkaKoodari

Answers:


7

Python 3中264个 262字节

f=lambda s,b='\\',r=str.replace:min(sum([['r'+d+s+d,d+r(r(s[:-1],b,b+b),d,d[1:]+b+d[0])+b*(s[-1:]in[b,d[0]])+s[-1:]+d][d in r(r(s+d[1:],b+b,'x'),b+d[0],b)or r(s,b+b,'')[-1:]==b:]for d in["'",'"',"'''",'"""']],[f(s[:k])+f(s[k:])for k in range(1,len(s))]),key=len)

在线尝试!

这可以工作,但是没有备忘录的情况下非常慢,您可以添加备忘录

import functools
f=functools.lru_cache(None)(f)

它为其中一种测试用例找到了一种改进的解决方案:

t"e"s"t"s"t"r"i"n"g"\'\'\'\'\'\'\'\
 -> 't"e"s"t"s"t"r"i"n"g"'r"\'\'\'\'\'\'\'"'\\'
 -> r't"e"s"t"s"t"r"i"n"g"\'\'\'\'\'\'\'''\\'

此答案的先前版本在以下内容上返回了不正确的结果,可以将其添加为测试用例:

\\'"\\'\
 -> "\\\\'\"\\\\'\\"
''"""''"""''
 -> '''''"""''"""'\''''

1
干得好!感谢您的测试用例,我已在挑战中更正了它。
PurkkaKoodari
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.