Допустим, у нас есть функция, которая переводит символы Морзе:
.
-> -.
-
-> ...-
Если мы применим эту функцию дважды, мы получим, например:
.
-> -.
-> ...--.
Учитывая входную строку и количество повторений, нужно узнать длину конечной строки. (Задача 1 из Фламандского соревнования по программированиюVPW, взята из этих слайдов, которые обеспечивают решение на Haskell).
Для данного входного файла
4
. 4
.- 2
-- 2
--... 50
Мы ожидаем решения
44
16
20
34028664377246354505728
Поскольку я не знаю Haskell, это мое рекурсивное решение на Python, которое я придумал:
def encode(msg, repetition, morse={'.': '-.', '-': '...-'}):
if isinstance(repetition, str):
repetition = eval(repetition)
while repetition > 0:
newmsg = ''.join(morse[c] for c in msg)
return encode(newmsg, repetition-1)
return len(msg)
def problem1(fn):
with open(fn) as f:
f.next()
for line in f:
print encode(*line.split())
которое работает для первых трех входных данных, но умирает с ошибкой памяти для последнего ввода.
Как бы вы переписали это более эффективно?
Редактировать
Переписать на основе комментариев:
def encode(p, s, repetition):
while repetition > 0:
p,s = p + 3*s, p + s
return encode(p, s, repetition-1)
return p + s
def problem1(fn):
with open(fn) as f:
f.next()
for line in f:
msg, repetition = line.split()
print encode(msg.count('.'), msg.count('-'), int(repetition))
Комментарии по стилю и дальнейшим улучшениям приветствуются