การเล่น 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

รายละเอียดเกี่ยวกับกลศาสตร์สตริง

Strings สามารถคั่นใช้', ", และ''' """สตริงสิ้นสุดลงเมื่อตัวคั่นเริ่มต้นถูกกดอีกครั้งโดยไม่ใช้ Escape

หากสตริงตัวอักษรเริ่มต้นด้วย'''หรือ"""จะใช้เป็นตัวคั่น มิฉะนั้น'หรือ"จะใช้

ตัวละครสามารถหลบหนีได้โดยวาง\ก่อนหน้าพวกเขา สิ่งนี้จะแทรกอักขระในสตริงและกำจัดความหมายพิเศษที่อาจมี ยกตัวอย่างเช่นใน'a \' b'ช่วงกลางจะหนีออกมาและทำให้ไม่ได้จบที่แท้จริงและสตริงที่เกิดคือ'a ' b

เป็นทางเลือกหนึ่งในrหรือRอาจแทรกก่อนตัวคั่นเริ่มต้น หากทำเสร็จแล้วการหลบหนี\จะปรากฏในผลลัพธ์ ยกตัวอย่างเช่นการประเมินr'a \' b' a \' bนี่คือเหตุผลที่ไม่สามารถคั่นด้วยa ' br'

ในการหลบหนี'''หรือ"""มีเพียงหนึ่งตัวเท่านั้นที่ต้องหลบหนีจากหนึ่งในตัวละคร

ตัวอักษรเหล่านี้สามารถรวมเข้าด้วยกันซึ่งเชื่อมต่อเนื้อหาของพวกเขา

กฎระเบียบ

  • อินพุตเป็นสตริงของกอล์ฟ ASCII ที่พิมพ์ได้เท่านั้นดังนั้นจึงไม่มีบรรทัดใหม่หรืออักขระพิเศษอื่น ๆ
  • ผลลัพธ์คือสตริงตัวอักษรกอล์ฟ หากมีหลายวิธีให้ส่งผลลัพธ์ออกมาหนึ่งรายการ
  • เพื่อให้ง่ายต่อความท้าทายในไม่ใช่rสตริงหนีใด ๆ ยกเว้นสำหรับ\\, \'และ\"ได้รับการพิจารณาที่ไม่ถูกต้อง พวกเขาจะต้องไม่ถูกใช้ในการส่งออกแม้ว่า'\m'จะเท่ากับ'\\m'ในหลาม \nนี้จะเอาความจำเป็นในการประมวลผลรหัสหนีพิเศษเช่น
  • สร้างขึ้นสำหรับการเล่นกอล์ฟสายไพ ธ อนไม่ได้รับอนุญาต 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

คำตอบ:


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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.