Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 20, 2022 17:53:35

indiwiduum
Зарегистрирован: 2022-12-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Задача по шифрованию текста

Добрый день.
Самостоятельно по чуть-чуть изучаю питон. Не могу разобраться в одной задаче.
Задание: Кодирование осуществляется следующим образом:
s = ‘aaaabbсaa’ преобразуется в ‘a4b2с1a2’, то есть группы одинаковых символов исходной строки заменяются на этот символ и количество его повторений в этой позиции строки.

Написал следующий код:

 text = list(input())
total = 0
while len(text) > 0:
    for i in text:
        for j in range(len(text)):
            if i == text[j]:
                total += 1
            else:
                break
        print(i, total, sep='', end='')
        for _ in range(total):
            text.remove(i)
        total = 0

При вводе строки:aaaabbcaa выдает a4b2a0c1a2 - не могу понять откуда a4b2a0c1a2

Заранее благодарю за помощь.

Офлайн

#2 Дек. 20, 2022 19:17:02

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Задача по шифрованию текста

 text = 'aaaabbсaa'
accamulate = []
chunk = []
for i in text:
    if i in chunk:
        chunk.append(i)
    else:
        accamulate.append(chunk)
        chunk = []
        chunk.append(i)
else:
    accamulate.append(chunk)
outlet = []
for i in accamulate[1:]:
    outlet.append(i[0])
    outlet.append(str(len(i)))
print("".join(outlet))

сорян chunk конечно же а не chank
upd: выкинуто лишнее

решено? YES https://www.youtube.com/watch?v=Tgasmw3BTL0



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Дек. 20, 2022 22:10:58)

Офлайн

#3 Дек. 20, 2022 21:36:25

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1349
Репутация: +  118  -
Профиль   Отправить e-mail  

Задача по шифрованию текста

  
text = 'aaaabbсaa'
out = []
for n, i in enumerate(text):
    if n == 0:
        out.append([i, 1])
    else:
        if i == out[-1][0]:
            out[-1][1] += 1
        else:
            out.append([i, 1])
print(out)
res = ''.join(str(i) for pair in out for i in pair)
print(res)
 
[['a', 4], ['b', 2], ['с', 1], ['a', 2]]
a4b2с1a2

Офлайн

#4 Дек. 20, 2022 22:45:09

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Задача по шифрованию текста

xam1816
у вас 4 (плюс еще enumerate) цикла у меня 3
хорошо бы что то придумать как это уменьшить хотя бы до 2



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Офлайн

#5 Дек. 20, 2022 23:19:15

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9851
Репутация: +  853  -
Профиль   Отправить e-mail  

Задача по шифрованию текста

indiwiduum
не могу понять откуда a4b2a0c1a2
Не используй .remove() для списка, который перебираешь через for.

Пример
  
>>> lst = ['a1', 'b2', 'a3', 'c4', 'a5', 'd6', 'e7']
>>> 
>>> for i in lst:
...     if i[0] == 'a':
...         print(i)
...         lst.remove(i)
...     else:
...         print(i)
... 
a1
a3
a5
e7
>>>



Отредактировано py.user.next (Дек. 20, 2022 23:20:08)

Офлайн

#6 Дек. 21, 2022 13:44:17

indiwiduum
Зарегистрирован: 2022-12-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Задача по шифрованию текста

py.user.next

я долго эксперементировал с for и remove. Из-за сдвига списка получается фигня. Есть какой-то лайфхак это обойти?

Офлайн

#7 Дек. 21, 2022 14:45:17

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Задача по шифрованию текста

 text = 'aaaabbсaa'
accamulate = 1
chunk = ''
outlet = ''
# this is like this code ... but ...
'''
for i in text:
    if i == chunk:
        chunk = i
        accamulate += 1
    else:
        outlet += chunk
        outlet += str(accamulate)
        chunk = i
        accamulate = 1
else:
    outlet += chunk
    outlet += str(accamulate)
'''
# this uses side effects and global variables (it is no good
# but code can be much more faster ... probably)
# though  code in the first example
# uses global variables and this is ... unimportant ...
def to_try(var):
    global accamulate, chunk, outlet
    chunk = var
    accamulate += 1
def to_false(var):
    global accamulate, chunk, outlet
    outlet += chunk
    outlet += str(accamulate)
    chunk = var
    accamulate = 1
[to_try(i) if i == chunk else to_false(i) for i in text]
to_false(text[-1])
print(outlet[1:]) # 'a4b2c1a2'
# and i still think that it is better  to use OOP here  ...
class Enc:
    def __init__(self, var=''):
        '''it accepts only str without digits'''
        if sum(list([i.isdigit() for i in var])):
           raise ValueError(f'this str ({var}) is incorrect '\
                            f'accepts only str without digital numbers')
        else:
            self.var = var
        self._accamulate = 1
        self._chunk = ''
        self._outlet = ''
        [self._to_try(i) if i == self._chunk else self._to_false(i)\
            for i in self.var]
        self._to_false(self.var[-1])
        self.enc = self._outlet[1:]
    def _to_try(self, var):
        self._chunk = var
        self._accamulate += 1
    def _to_false(self, var):
        self._outlet += self._chunk
        self._outlet += str(self._accamulate)
        self._chunk = var
        self._accamulate = 1
    def set(self, var):
        '''reinitiated all variables of the exemplar
          and returns encrypted str'''
        self.__init__(var)
        return self.enc
    def __str__(self):
        '''return encrypted str to print,
         initiates your variable etc'''
        return self.enc
# because it is the coolest ... lets test it
print(Enc(text).enc) # 'a4b2c1a2'
test = Enc(text)
print(test) # 'a4b2c1a2'
print(test.enc) # 'a4b2c1a2'
test.set('qqwweeevvvvvvr')
print(test.var, test.enc) # 'qqwweeevvvvvvr q2w2e3v6r1'
# test for error
asdsf = Enc('dfgdfg')
# ValueError:
# 'this str (dfgdf1g) is incorrect accepts only str without digital numbers'
try:
    asdsf.set('dfgdf1g')
except ValueError as e:
    print(e)
finally:
    print(help(test))



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Дек. 21, 2022 15:34:16)

Офлайн

#8 Дек. 21, 2022 15:26:48

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Задача по шифрованию текста

indiwiduum
Есть какой-то лайфхак это обойти?
есть не пользоваться такими конструкциями тк это постояный источник ошибок



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Офлайн

#9 Дек. 21, 2022 15:52:51

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1349
Репутация: +  118  -
Профиль   Отправить e-mail  

Задача по шифрованию текста

  
text = list(input('>'))
out = ''
count = 0
while text:
    if not out:
        out += text.pop(0)
        count += 1
    else:
        current_ch = text.pop(0)
        if out[-1] == current_ch:
            count += 1
        else:
            out += str(count)
            out += current_ch
            count = 1
out += str(count)
print(out)

Офлайн

#10 Дек. 21, 2022 16:09:30

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Задача по шифрованию текста

ну … норм
надо подумать о варианте с сортировкой ну или подобном



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Дек. 21, 2022 17:32:26)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version