2

私はこれらの2つの機能を持っています:

def comparison(a, b):
    return [-1, 0, 1].index(cmp(b, a))

def base_3(seq):
    return [comparison(a, b) for a, b in itertools.combinations(seq, 2)]

関数 comparison は、これに基づいて比較番号を返します。

  1. a > b の場合は 0
  2. a = b の場合は 1
  3. a < b の場合は 2

関数 base_3 は、結合されたすべての要素間の比較を返します。

例えば:

x = [0, 1, 2]
y = [1, 2, 0]
z = [0, 1, 0]

>>> base_3(x)
[2, 2, 2]

>>> base_3(y)
[2, 0, 0]

>>> base_3(z)
[2, 1, 0]

可能であれば、特定の base_3 からシーケンスを返す関数が必要です。

>>> base_3_to_seq([2, 2, 2])
[0, 1, 2]

>>> base_3_to_seq([2, 1, 0])
[0, 1, 0]

>>> base_3_to_seq([0, 2, 1])
"Impossible"

この関数 base_3_to_seq をどのように記述できますか?

4

1 に答える 1

2

これは強引な方法です:

def base_3_to_seq(base3):
   for seq in itertools.product(range(3), repeat=3):
       if base_3(seq) == base3:
           return seq
   return "Impossible"

どの方法で呼び出すかにもよりますが、base_3 または base_3_to_seq のいずれかをメモ化することで、長時間実行する場合にコードを高速化できます。

于 2012-04-13T15:29:53.380 に答える