モールス信号を変換する関数があるとします。
.
->-.
-
->...-
この関数を2回適用すると、次のようになります。
.
-> -.
->...--.
入力文字列と繰り返し回数が与えられた場合、最終的な文字列の長さを知りたい。(フラマン語プログラミングコンテストVPWの問題1 、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())
これは最初の3つの入力では機能しますが、最後の入力ではメモリエラーで停止します。
これをより効率的な方法でどのように書き直しますか?
編集
与えられたコメントに基づいて書き直してください:
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))
スタイルとさらなる改善についてのコメントはまだ歓迎します