イーブイの答えの音は好きですが、実装を想像するのは困難でした。これが、イーブイから提供された回答の私の解釈、説明、および実装です。
- 2つのドミノ値の合計を辞書のキーとして使用します。
- いずれかのドミノ値をディクショナリ値として格納します。
たとえば、ドミノ「12」の場合、合計は3であるため、辞書キーは3になります。次に、いずれかの値(1または2)を選択して、その位置に格納できます(最初の値1を選択します)。 )。
domino_pairs = {}
pair = '12'
pair_key = sum(map(int, pair))
domino_pairs[pair_key] = int(pair[0]) # Store the first pair's first value.
print domino_pairs
出力:
{3: '1'}
ドミノペアから1つの値のみを格納していますが、他の値は辞書のキーと値から簡単に計算できます。
pair = '12'
pair_key = sum(map(int, pair))
domino_pairs[pair_key] = int(pair[0]) # Store the first pair's first value.
# Retrieve pair from dictionary.
print pair_key - domino_pairs[pair_key] # 3-1 = 2
出力:
2
ただし、2つの異なるペアの合計が同じである可能性があるため、1つのキーに対して複数の値を格納する必要があります。したがって、単一のキー(つまり、2つのペアの合計)に対する値のリストを格納します。これを関数に入れる:
def add_pair(dct, pair):
pair_key = sum(map(int, pair))
if pair_key not in dct:
dct[pair_key] = []
dct[pair_key].append(int(pair[0]))
domino_pairs = {}
add_pair(domino_pairs, '22')
add_pair(domino_pairs, '04')
print domino_pairs
出力:
{4: [2, 0]}
意味あり。両方のペアの合計は4になりますが、各ペアの最初の値は異なるため、両方を格納します。これまでの実装では、重複が許可されます。
domino_pairs = {}
add_pair(domino_pairs, '40')
add_pair(domino_pairs, '04')
print domino_pairs
出力
{4: [4, 0]}
'40'と'04'はDominoで同じであるため、両方を保存する必要はありません。重複をチェックする方法が必要です。これを行うために、新しい関数を定義しますhas_pair
:
def has_pair(dct, pair):
pair_key = sum(map(int, pair))
if pair_key not in dct:
return False
return (int(pair[0]) in dct[pair_key] or
int(pair[1]) in dct[pair_key])
通常どおり、合計(辞書キー)を取得します。辞書にない場合、ペアは存在できません。ディクショナリにある場合は、ペアのいずれかの値がディクショナリ「バケット」に存在するかどうかを確認する必要があります。このチェックをに挿入してadd_pair
、重複するドミノペアを追加しないようにします。
def add_pair(dct, pair):
pair_key = sum(map(int, pair))
if has_pair(dct, pair):
return
if pair_key not in dct:
dct[pair_key] = []
dct[pair_key].append(int(pair[0]))
重複するドミノペアの追加が正しく機能するようになりました。
domino_pairs = {}
add_pair(domino_pairs, '40')
add_pair(domino_pairs, '04')
print domino_pairs
出力:
{4: [4]}
最後に、print関数は、ドミノペアの合計と、同じペアからの1つの値のみを格納することと、ペア自体を格納することとがどのように同じかを示します。
def print_pairs(dct):
for total in dct:
for a in dct[total]:
a = int(a)
b = int(total) - int(a)
print '(%d, %d)'%(a,b)
テスト:
domino_pairs = {}
add_pair(domino_pairs, '40')
add_pair(domino_pairs, '04')
add_pair(domino_pairs, '23')
add_pair(domino_pairs, '50')
print_pairs(domino_pairs)
出力:
(4, 0)
(2, 3)
(5, 0)