Failed test. Wrong answer
Извините за большой текст , я новенький , учу питон и пытаюсь решить задачу только теми способами , которые нам дали на обучении.
Задача на Stepik:
Узнав, что ДНК не является случайной строкой, только что поступившие в Институт биоинформатики студенты группы информатиков предложили использовать алгоритм сжатия, который сжимает повторяющиеся символы в строке. Кодирование осуществляется следующим образом: s = 'aaaabbсaa' преобразуется в 'a4b2с1a2', то есть группы одинаковых символов исходной строки заменяются на этот символ и количество его повторений в этой позиции строки. Напишите программу, которая считывает строку, кодирует её предложенным алгоритмом и выводит закодированную последовательность на стандартный вывод. Кодирование должно учитывать регистр символов
1)Не могу пройти один из тестов, все проверки которые мог придумать я реализовал( в том числе и на неверный символ ), но получаю ошибку:
Failed test #6 of 15. Wrong answer
2)Не совсем понимаю условие "Кодирование должно учитывать регистр символов" , что оно должно значить
Мой код:
s = input()
s = s.lower()
n = 0
j = 0
i = 0
ia = 0
ib = 0
ic = 0
simv_err = 0
# проверка всей строки на неверный символ
while j <= len(s)-1 :
if s[j] == 'a' or s[j] == 'b' or s[j] == 'c':
j += 1
else :
j += 1
simv_err += 1
if simv_err > 0 :
print('Неверный символ')
#если все символы в строке верные , начинаем считать
else :
while i <= (len(s)-1) :
if s[i] == 'a' :
i += 1
ia += 1
if i > (len(s)-1) or s[i] != 'a':
ic = 0
ib = 0
print("a",end='')
print(ia,end='')
elif s[i] == 'b' :
i += 1
ib += 1
ia = 0
if i > (len(s)-1) or s[i] != 'b' :
ic = 0
ia = 0
print("b",end='')
print(ib,end='')
elif s[i] == 'c' :
i += 1
ic += 1
ib = 0
ia = 0
if i > (len(s)-1) or s[i] != 'c' :
ia = 0
ib = 0
print("c",end='')
print(ic,end='')
Ответы (1 шт):
Кодирование должно учитывать регистр символов
Означает что большие и маленькие буквы должны считаться отдельно:
"aaaabbсaa" -> "a4b2с1a2"
"aAaabbсaa" -> "a1A1a2b2с1a2"
Решил эту задачу двумя способами:
# "Питоновский" подход - использование zip().
# Для упрощения кода в конец строки добавляется нулевой байт -
# это позволяет обработать последнюю букву внутри цикла без каких-либо
# дополнительных проверок.
# Условие - строка не должна содержать нулевых байтов.
def dna_compress_1(s):
compressed_s = ''
cnt = 0
s += '\x00'
for cur, nxt in zip(s, s[1:]):
cnt += 1
if cur != nxt:
compressed_s += cur + str(cnt)
cnt = 0
return compressed_s
# Классический подход - использование индексов
def dna_compress_2(s):
compressed_s = ''
cnt = 0
size = len(s)
i = 0
while i < size:
cnt += 1
# Если текущая буква не равна следующей или
# текущая буква является последней - запиши
# эту букву вместе с её счётчиком в сжатую строку.
if i == size - 1 or s[i] != s[i + 1]:
compressed_s += s[i] + str(cnt)
cnt = 0
i += 1
return compressed_s
Тестирование
test_lst = [
"aaaabbсaa",
"aAaabbсaa",
"a",
"ab",
"abb"
]
for test_str in test_lst:
print(dna_compress_1(test_str))
print(dna_compress_2(test_str))
print()
Вывод
a4b2с1a2
a4b2с1a2
a1A1a2b2с1a2
a1A1a2b2с1a2
a1
a1
a1b1
a1b1
a1b2
a1b2