Golf Python string değişmezleri


21

Arka fon

Python 3'ün birçok string string değişkeni var. Örneğin, dize this 'is' an exa\\m/pleşu şekilde temsil edilebilir:

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

Gördüğünüz gibi, dizgiler için farklı sınırlayıcılar kullanmak, belirli karakterler için gereken kaçış değerini değiştirerek dizeleri uzatabilir veya kısaltabilir. Bazı sınırlayıcılar tüm karakter dizileri için kullanılamaz: r'yukarıda eksik (açıklama için daha sonra bakınız). Dizelerinizi bilmek, kod golfünde çok faydalıdır.

Ayrıca, birden çok dize değişmezi bire birleştirebilir:

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

Meydan okuma

Mücadeleye, yazdırılabilir bir ASCII dizgisi verildiğinde , Python'daki en kısa değişmez gösterimini göstermesi gerekiyor.

Tel mekaniği ile ilgili detaylar

Dizeleri kullanılarak ayrılmış olabilir ', ", '''ve """. Başlangıç ​​sınırlayıcısına tekrar basılmadan basıldığında bir dize biter.

Bir dize değişmez ile başlar '''veya """sınırlayıcı olarak tüketilir. Aksi takdirde 'veya "kullanılır.

Karakterler \önlerinden bir tane koyarak kaçabilir . Bu, karaktere karakter ekler ve sahip olabileceği herhangi bir özel anlamı ortadan kaldırır. Örneğin 'a \' b', ortada 'kaçar ve dolayısıyla değişmez biter ve sonuçta ortaya çıkan dize a ' b.

İsteğe bağlı olarak, başlangıç ​​sınırlayıcısından önce rveya bunlardan biri Ryerleştirilebilir. Bu yapılırsa, kaçış \sonuçta görünecektir. Örneğin, r'a \' b'değerlendirir a \' b. Bu yüzden a ' bsınırlandırılamaz r'.

Kaçmak için '''ya """bir tek karakterlerden biri kaçmak gerekiyor.

Bu değişmezler, içeriğini birleştiren birlikte birleştirilebilir.

kurallar

  • Giriş golf için dizedir. Yalnızca yazdırılabilir ASCII, bu nedenle yeni satırlar veya diğer özel karakterler yoktur.
  • Çıktı golfed string değişmezdir. Birden fazla çözüm varsa, bir tane çıktı.
  • Meseleyi basitleştirmek için, riplerde olmayanlar hariç \\, herhangi bir kaçış \'ve \"geçersiz sayılır. Python'a '\m'eşit olsalar bile çıktıda kullanılmamalıdırlar '\\m'. Bu gibi özel kaçış kodlarını işleme gereksinimini ortadan kaldırır \n.
  • Python dizelerinin golf oynamaları için izin verilmez. Python'a reprizin verilir, çünkü zaten berbattır.
  • Standart kuralları geçerlidir.

Örnek girişler / çıkışlar

Bunları doğrulamak için elimden geleni yaptım, ancak hatalar varsa bana bildirin. Durumlarda birden fazla geçerli çıktı varsa, tümü girişin altında listelenir.

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

Bu ek durumlar için Anders Kaseorg'a teşekkürler :

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

Peki ya "da '-> """t"'e"'s"'t"'s"'t"'r"'i"'n"'g'''
Rod

@Rod Bunu bir test durumu olarak ekleyeceğim.
PurkkaKoodari

5
Dil etiketi ile iyi bir mücadele için güzel bir örnek.
Adám

Peki ya u've b'?
caird coinheringaahing

@cairdcoinheringaahing Golf oynamak için kullanışlı bir özellik sağlamazlar ve bnormal dizelerle bile birleştirilemezler, bu yüzden onları dışarıda bıraktım.
PurkkaKoodari

Yanıtlar:


7

Python 3 , 264 262 bayt

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)

Çevrimiçi deneyin!

Bu çalışır, ancak ekleyebileceğiniz, not alma olmadan çok yavaştır

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

Test durumlarından biri için geliştirilmiş bir çözüm buldu:

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

Bu yanıtın önceki sürümleri, aşağıdakiler üzerinde test sonuçları olarak eklenebilecek yanlış sonuçlar verdi:

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

1
İyi iş! Test davası için teşekkürler, zorlukları düzelttim.
PurkkaKoodari
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.