class TStr:
def __init__(self, chars = ()) -> None:
self.chars = chars if type(chars) == tuple else tuple(chars)
def __len__(self) -> int:
return len(self.chars)
def __str__(self) -> str:
return ''.join(self.chars)
def __repr__(self) -> str:
return f'{type(self).__name__}("{self}")'
def __add__(self, s) -> 'TStr':
return TStr(self.chars + s.chars)
def __mul__(self, n: int) -> 'TStr':
return TStr(n * self.chars)
def __rmul__(self, n: int) -> 'TStr':
return TStr(n * self.chars)
def __eq__(self, x: object) -> bool:
return self.chars == x.chars
def __lt__(self, x: 'TStr') -> bool:
return self.chars < x.chars
def __le__(self, x: 'TStr') -> bool:
return self == x or self < x
def __hash__(self) -> int:
return hash(self.chars)
def __getitem__(self, i: int) -> 'TStr':
return TStr(self.chars[i])
def find(self, x: 'TStr') -> int:
return next((i for i in range(len(self) - len(x) + 1) if self[i:i + len(x)] == x), -1)
def __contains__(self, x: 'TStr') -> bool:
return self.find(x) >= 0
def startswith(self, prefix: 'TStr') -> bool:
return self[:len(prefix)] == prefix
def endswith(self, suffix: 'TStr') -> bool:
return self[-len(suffix):] == suffix
def replace(self, old: 'TStr', new: 'TStr') -> 'TStr':
k = self.find(old)
return self[:k] + new + self[k+len(old):].replace(old, new) if k >= 0 else self
def join(self, sequence) -> 'TStr':
res: list[str] = []
for word in sequence:
if res:
res.extend(self.chars)
res.extend(word.chars)
return TStr(tuple(res))
'''
Π’Π΅ΠΏΠ΅ΡΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΊΠ°ΠΊ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ join. Π₯ΠΎΡΠΈΠΌ ΡΡΠΎΠ±Ρ Π·Π°ΡΠ°Π±ΠΎΡΠ°Π» ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄:
'''
space = TStr(' ')
words = [TStr('hello'), TStr('my'), TStr('dear'), TStr('friend')]
print(repr(space.join(words)))
print(repr(space.join([TStr('hello')])))
print(repr(space.join([])))
print(repr(TStr(':').join([TStr('hello')]*5)))
'''
Output:
TStr("hello my dear friend")
TStr("hello")
TStr("")
TStr("hello:hello:hello:hello:hello")
ΠΠ΅ΡΠΎΠ΄ join Π°ΠΊΠΊΡΠΌΡΠ»ΠΈΡΡΠ΅Ρ Π²ΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ Π² ΡΠΏΠΈΡΠΊΠ΅ res (ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ: list[str]),
ΠΊΠΎΡΠΎΡΡΠΉ Π² ΠΊΠΎΠ½ΡΠ΅ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΡΠ΅ΡΡΡ Π² tuple ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ TStr:
Π’ΡΡ Ρ Π½Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ __init__ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ ΡΡΡΠΎΠΊΡ, Π° Π½Π΅ tuple. ΠΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ __init__:
def __init__(self, chars: str | tuple[str] = ()) -> None:
self.chars = chars if type(chars) == tuple else tuple(chars)
ΠΠΎΡΡΠ½ΠΈΠΌ, Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΡΠ·ΠΎΠ²Π° ΠΌΠ΅ΡΠΎΠ΄Π°: space.join(words), Π² ΡΠΈΠΊΠ»Π΅ for, self -- ΡΡΠΎ space, sequence -- ΡΡΠΎ words, Π° ch -- ΡΡΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ words.
ΠΡΠ»ΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡΡ, ΡΡΠΎ ΡΠΏΠΈΡΠΎΠΊ ΡΠ»ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΠ³ΡΠΎΠΌΠ΅Π½, ΡΠΎ ΠΌΠ΅ΡΠΎΠ΄ join Π²ΡΠ΄Π΅Π»ΠΈΡ ΠΎΠ³ΡΠΎΠΌΠ½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² (ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ Π±ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ ΡΡΠΌΠΌΠ° Π²ΡΠ΅Ρ
ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π²ΠΎ Π²ΡΠ΅Ρ
ΡΠ»ΠΎΠ²Π°Ρ
). ΠΠ°Π»Π΅Π΅ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ ΠΊΠΎΡΡΠ΅ΠΆ, ΠΊΠΎΡΠΎΡΡΠΉ Ρ Π±ΡΠ΄Π΅Ρ ΡΠ°ΡΡΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° (TStr). Π€Π°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π·ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΠΏΠ°ΠΌΡΡΡ ΠΏΠΎΠ΄ ΡΠΏΠΈΡΠΊΠΎΠ², Π²Π΅Π΄Ρ Π½Π°ΠΌ Π½ΡΠΆΠ΅Π½ ΠΊΠΎΡΡΠ΅ΠΆ. ΠΠΎΠΆΠ½ΠΎ Π»ΠΈ ΡΠ»ΡΡΡΠΈΡΡ?
Π‘Π»Π΅Π΄ΡΡΡΠ°Ρ Π²Π΅ΡΡΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ (ΡΡΠ½ΠΊΡΠΈΡ yield_chars):
import itertools
def join(self, sequence: Iterable['TStr']) -> 'TStr':
def yield_chars():
for word in sequence:
yield self.chars
yield word.chars
return TStr(tuple(
itertools.chain.from_iterable(
itertools.islice(
yield_chars(),
1,
None)
)
))
ΠΠΎΠΆΠ½ΠΎ ΠΈ Π² ΠΎΠ΄Π½Ρ, Π½ΠΎ ΠΎΡΠ΅Π½Ρ Π΄Π»ΠΈΠ½Π½ΡΡ, ΡΡΡΠΎΠΊΡ:
def join(self, sequence: Iterable['TStr']) -> 'TStr':
return TStr(tuple(
itertools.chain.from_iterable(
t.chars for t in itertools.islice(
itertools.chain.from_iterable(zip(itertools.repeat(self), sequence)),
1,
None
)
)
))
ΠΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ (ΠΈΠ· str) ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠΏΠΈΡΠ°ΡΡ (Π² TStr) Π±Π΅Π· ΠΎΡΠΎΠ±ΡΡ
ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ ΠΈΠ· Π½ΠΈΡ
Π±ΡΠ΄ΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠΌΠΈ, Π° ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΡΠΌΠΈ.
Π§Π΅ΠΌ Π΅ΡΠ΅ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ ΡΡΡΠΎΠΊΠΈ Π² ΡΠ°Π·Π½ΡΡ
Π―Π, ΠΊΡΠΎΠΌΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΉ?
ΠΠ»Π°Π²Π½ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ ΡΡΡΠΎΠΊ -- ΡΡΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠ΅ΠΊΡΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ, Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅, ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ English, Π½ΠΎ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ°Π·Π½ΡΠ΅ ΡΠ·ΡΠΊΠΈ.
ΠΠΎΠΏΡΠΎΡ ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°ΡΡ Π±ΡΠΊΠ²Ρ ΡΠ°Π·Π½ΡΡ
Π°Π»ΡΠ°Π²ΠΈΡΠΎΠ² (ΠΊΠΈΡΠΈΠ»Π»ΠΈΡΠ°, ΠΊΠΈΡΠ°ΠΉΡΠΊΠΈΠΉ, ΠΈΠ²ΡΠΈΡ) -- ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΠΎΠΉ ΠΈ ΡΡΡΠ΄Π½ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ. ΠΠΎΠ΄Ρ
ΠΎΠ΄Ρ ΠΊ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΠ°ΠΌ ΡΠ°Π·Π½ΡΡΡΡ Ρ ΡΠ°Π·Π½ΡΡ
Π―Π, Π΅ΡΡΡ Π΄Π°ΠΆΠ΅ ΡΠ°Π·Π½ΠΈΡΠ° Π² ΠΏΠΎΠ΄Ρ
ΠΎΠ΄Π°Ρ
ΠΌΠ΅ΠΆΠ΄Ρ Python 2 ΠΈ Python 3.
Π‘ΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ Π²Π΅ΡΠ½ΠΎ, ΡΡΡΠΎΠΊΠΈ Π² Python 2 Π½Π΅ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡ Ρo ΡΡΡΠΎΠΊΠ°ΠΌΠΈ Π² Python 3.
'''