골프 파이썬 문자열 리터럴


21

배경

파이썬 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 문자열이 주어지면 파이썬에서 가장 짧은 리터럴 표현 을 출력해야 합니다.

현 역학에 대한 세부 사항

문자열을 사용하여 구분 될 수있다 ', ", '''""". 시작 분리 문자가 다시 이스케이프되지 않으면 문자열이 종료됩니다.

문자열 리터럴로 시작 '''하거나 """구분 기호로 사용되는 경우 그렇지 않으면 '또는 "사용됩니다.

문자를 \앞에 배치하여 이스케이프 처리 할 수 ​​있습니다 . 문자열에 문자를 삽입하고 특별한 의미를 제거합니다. 예를 들어, 'a \' b'가운데 '에서 이스케이프되어 리터럴을 끝내지 않으므로 결과 문자열은 a ' b입니다.

선택적으로 시작 구분 기호 중 하나 r또는 R앞에 삽입 기호를 삽입 할 수 있습니다. 이 작업이 완료되면 \결과에 이스케이프 가 나타납니다. 예를 들어로 r'a \' b'평가됩니다 a \' b. 이것이 a ' b로 구분할 수없는 이유 r'입니다.

탈출 '''하거나 """, 하나는 단지 문자 중 하나 탈출해야합니다.

이 리터럴은 함께 연결되어 내용을 연결합니다.

규칙

  • 입력은 골프 문자열입니다. 인쇄 가능한 ASCII 전용이므로 줄 바꿈이나 기타 특수 문자가 없습니다.
  • 출력은 골프 문자열 리터럴입니다. 솔루션이 여러 개인 경우 하나를 출력하십시오.
  • 비의 도전, 단순화하기 위해 r어떤 탈출을 제외하고 문자열을 \\, \'그리고 \"유효하지 않은 것으로 간주한다. 파이썬 '\m'과 같 더라도 출력에 사용해서는 안됩니다 '\\m'. 따라서와 같은 특수 이스케이프 코드를 처리 할 필요가 없습니다 \n.
  • 골프 문자열을위한 내장은 허용되지 않습니다. 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''\''''

이러한 추가 사례에 대해 Anders Kaseorg 에게 감사드립니다 .

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

"또는 '->로 시작하거나 끝나는 문자열은 어떻습니까?"""t"'e"'s"'t"'s"'t"'r"'i"'n"'g'''
Rod

@로드 나는 그것을 테스트 사례로 추가 할 것입니다.
PurkkaKoodari

5
언어 태그로 좋은 도전의 좋은 예입니다.
Adám

무엇에 대한 u'그리고 b'?
caird coinheringaahing

@cairdcoinheringaahing 그들은 골프를위한 유용한 기능을 제공하지 않으며 b일반 문자열과 결합 할 수 없으므로 방금 제외했습니다.
PurkkaKoodari

답변:


7

파이썬 3 , 264262 바이트

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.