ゴルフの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'ありません(説明については後述)。あなたの弦を知ることは、コードゴルフで非常に役立ちます。

複数の文字列リテラルを1つに結合することもできます。

'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のみであるため、改行やその他の特殊文字は使用できません。
  • 出力は、ゴルフの文字列リテラルです。複数のソリューションがある場合は、1つを出力します。
  • 非で、挑戦を簡単にするためにr、文字列以外の任意のエスケープを\\\'そして\"無効とみなされます。Pythonで'\m'同等であっても、出力で使用しないでください'\\m'。これにより、などの特別なエスケープコードを処理する必要がなくなり\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テストケースとして追加します。
-PurkkaKoodari

5
言語タグでの良い挑戦の良い例。
アダム

何についてu'b'
ケアニアン共犯

@cairdcoinheringaahing彼らはゴルフに便利な機能を提供しておらずb、通常のストリングと組み合わせることさえできないので、私はそれらを省いた。
-PurkkaKoodari

回答:


7

Pythonの3264の 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)

テストケースの1つに対する改善されたソリューションが見つかりました。

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.