Гольфінг-рядкові літерали 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 заборонені. Python reprдозволений, так як це все одно шалено.
  • Діють стандартні правила .

Приклади входів / виходів

Я намагався це перевірити, але дайте мені знати, чи є помилки. Якщо у випадках є кілька дійсних виходів, всі вони перераховані нижче вхідних даних.

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''\''''

Дякуємо Андерсу Касеоргу за такі додаткові випадки:

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

Як щодо струн, що починаються або закінчуються "або '-> """t"'e"'s"'t"'s"'t"'r"'i"'n"'g'''
Пд

@Rod Я додам це як тестовий випадок.
PurkkaKoodari

5
Хороший приклад гарного виклику з мовним тегом.
Adám

Що про u'і b'?
caird coinheringaahing

@cairdcoinheringaahing Вони не надають корисних функцій для гри в гольф і bнавіть не можуть поєднуватися зі звичайними струнами, тому я просто їх покинув.
PurkkaKoodari

Відповіді:


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.