与えられた数字を、対応する文字の可能なすべての組み合わせに変換します。たとえば、数字が与えられた場合、文字に対応する数字の組み合わせは、、またはである可能性があるため、 、、および1234
を吐き出す必要があります。abcd
lcd
awd
1 2 3 4
12 3 4
1 23 4
私はこれを Python で行う方法を考えていましたが、正直なところ困惑しました。ヒントはありますか?
基本的に、これまでのところ、1桁を文字に変換する単純なシステムをセットアップするだけです。
与えられた数字を、対応する文字の可能なすべての組み合わせに変換します。たとえば、数字が与えられた場合、文字に対応する数字の組み合わせは、、またはである可能性があるため、 、、および1234
を吐き出す必要があります。abcd
lcd
awd
1 2 3 4
12 3 4
1 23 4
私はこれを Python で行う方法を考えていましたが、正直なところ困惑しました。ヒントはありますか?
基本的に、これまでのところ、1桁を文字に変換する単純なシステムをセットアップするだけです。
作るstr
。
26 を超える数のリストをフィルタリングします。
文字を返す書き込み関数。
def alphabet(n):
# return " abcde..."[n]
return chr(n + 96)
def partition(lst):
for i in range(1, len(lst)):
for r in partition(lst[i:]):
yield [lst[:i]] + r
yield [lst]
def int2words(x):
for lst in partition(str(x)):
ints = [int(i) for i in lst]
if all(i <= 26 for i in ints):
yield "".join(alphabet(i) for i in ints)
x = 12121
print(list(int2words(x)))
# ['ababa', 'abau', 'abla', 'auba', 'auu', 'laba', 'lau', 'lla']
私はあなたに完全な解決策を与えるつもりはありませんが、どこから始めるべきかのアイデアを提供します:
数字を文字列に変換し、文字列を反復処理します。アルファベットには 26 文字あるため、チェックする必要があるのは 1 桁と 2 桁の数字だけです。
上記のコメントのように、再帰的なアプローチでうまくいきます。
番号は1234です
*) 最初の文字を取る -> 数字は 1
*) そこから、残りのすべての 1 桁の数字と組み合わせます -->
1 2 3 4
*) 次に、次の 2 桁の数字 (<= 26 の場合) と残りの 1 桁の数字を組み合わせます -->
1 23 4
*) ...等々
私が言ったように、それはどこから始めるべきかという考えにすぎませんが、基本的には、2桁の数字が26より大きくないかどうか、つまりアルファベットを超えているかどうかのチェックを含む組み合わせ論を使用した再帰的なアプローチです。