Golf chuỗi chữ Python


21

Lý lịch

Python 3 có nhiều loại chuỗi ký tự. Ví dụ: chuỗi this 'is' an exa\\m/plecó thể được biểu diễn dưới dạng:

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

Như bạn có thể thấy, sử dụng các dấu phân cách khác nhau cho các chuỗi có thể kéo dài hoặc rút ngắn chuỗi bằng cách thay đổi lối thoát cần thiết cho một số ký tự nhất định. Một số dấu phân cách không thể được sử dụng cho tất cả các chuỗi: r'bị thiếu ở trên (xem phần giải thích sau). Biết chuỗi của bạn là rất hữu ích trong mã golf.

Người ta cũng có thể kết hợp nhiều chuỗi ký tự thành một:

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

Thử thách

Thách thức là, đưa ra một chuỗi ASCII có thể in được, để đưa ra biểu diễn bằng chữ ngắn nhất của nó trong Python.

Chi tiết về cơ học chuỗi

Strings có thể được phân tách ', ", '''""". Một chuỗi kết thúc khi dấu phân cách bắt đầu được nhấn lại không được thoát.

Nếu một chuỗi ký tự bắt đầu bằng '''hoặc """nó được sử dụng như là dấu phân cách. Nếu không 'hoặc "được sử dụng.

Nhân vật có thể được trốn thoát bằng cách đặt một \trước họ. Điều này chèn ký tự trong chuỗi và loại bỏ bất kỳ ý nghĩa đặc biệt nào nó có thể có. Ví dụ, ở 'a \' b'giữa 'được thoát và do đó không kết thúc bằng chữ và chuỗi kết quả là a ' b.

Tùy chọn, một trong rhoặc Rcó thể được chèn trước dấu phân cách bắt đầu. Nếu điều này được thực hiện, việc thoát \sẽ xuất hiện trong kết quả. Ví dụ, r'a \' b'đánh giá để a \' b. Đây là lý do tại sao a ' bkhông thể được phân định bởi r'.

Để trốn thoát '''hoặc """, người ta chỉ cần thoát khỏi một trong các nhân vật.

Những chữ này có thể được nối với nhau, nối các nội dung của chúng.

Quy tắc

  • Đầu vào là chuỗi để chơi gôn. Chỉ có thể in ASCII, do đó không có dòng mới hoặc ký tự đặc biệt nào khác.
  • Đầu ra là chuỗi golf. Nếu có nhiều giải pháp, đầu ra một.
  • Để đơn giản hóa các thách thức, trong phi rchuỗi bất kỳ thoát trừ \\, \'\"được coi là không hợp lệ. Chúng không được sử dụng trong đầu ra, mặc dù '\m'bằng với '\\m'Python. Điều này loại bỏ sự cần thiết phải xử lý mã thoát đặc biệt như \n.
  • Các chuỗi tích hợp để chơi gôn Python không được phép. Python reprđược cho phép, vì dù sao nó cũng nhảm nhí.
  • Luật tiêu chuẩn được áp dụng.

Ví dụ đầu vào / đầu ra

Tôi đã cố gắng hết sức để xác minh những điều này, nhưng hãy cho tôi biết nếu có sai sót. Nếu có nhiều đầu ra hợp lệ cho các trường hợp, tất cả chúng đều được liệt kê bên dưới đầu vào.

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

Cảm ơn Anders Kaseorg vì những trường hợp bổ sung này:

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

Điều gì về chuỗi bắt đầu hoặc kết thúc bằng "hoặc '-> """t"'e"'s"'t"'s"'t"'r"'i"'n"'g'''
Rod

@Rod Tôi sẽ thêm nó như là một trường hợp thử nghiệm.
PurkkaKoodari

5
Ví dụ đẹp về một thử thách tốt với một thẻ ngôn ngữ.
Adám

Còn về u'b'?
caird coinheringaahing

@cairdcoinheringaahing Họ không cung cấp bất kỳ tính năng hữu ích nào cho việc chơi gôn và bthậm chí không thể kết hợp với các chuỗi thông thường, vì vậy tôi chỉ bỏ qua chúng.
PurkkaKoodari

Câu trả lời:


7

Python 3 , 264 262 byte

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)

Hãy thử trực tuyến!

Điều này hoạt động nhưng rất chậm mà không cần ghi nhớ, mà bạn có thể thêm bằng

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

Nó tìm thấy một giải pháp cải tiến cho một trong những trường hợp thử nghiệm:

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

Các phiên bản trước của câu trả lời này đã trả về kết quả không chính xác ở phần sau, có thể được thêm vào dưới dạng các trường hợp thử nghiệm:

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

1
Công việc tốt đẹp! Cảm ơn về trường hợp thử nghiệm, tôi đã sửa nó trong thử thách.
PurkkaKoodari
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.