from collections import defaultdict
def cardflip( cards ):
# 'tops' maps the value to the count of cards
# showing that value on top
tops = defaultdict(int)
# 'bottoms' maps the value to the count of cards
# showing that value on bottom
bottoms = defaultdict(int)
for c in cards:
topvalue = c[0]
tops[topvalue] += 1
bottomvalue = c[1]
if bottomvalue != topvalue:
# if it's the same on both side we ignore the bottom
bottoms[bottomvalue] += 1
tops[bottomvalue] += 0
# topcounts is a list of pairs (value, count)
topcounts = list(tops.items())
# sort it by count, the biggest first
topcounts.sort( key = lambda x : -x[1] )
for (v, c) in topcounts:
if (c + bottoms[v]) * 2 >= len(cards):
final = v
break
else:
print( "there is no result" )
return
print( "value=", final, "moves=", (len(cards)+1)//2 - tops[final] )
cardflip( [ (3,10), (10,3), (5,4) ] )
cardflip( [ (1,3), (2,3), (4, 5), (6, 7), (9,3), (11,2)] )
ZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKZGVmIGNhcmRmbGlwKCBjYXJkcyApOgogICAgIyAndG9wcycgbWFwcyB0aGUgdmFsdWUgdG8gdGhlIGNvdW50IG9mIGNhcmRzCiAgICAjIHNob3dpbmcgdGhhdCB2YWx1ZSBvbiB0b3AKICAgIHRvcHMgPSBkZWZhdWx0ZGljdChpbnQpCiAgICAjICdib3R0b21zJyBtYXBzIHRoZSB2YWx1ZSB0byB0aGUgY291bnQgb2YgY2FyZHMKICAgICMgc2hvd2luZyB0aGF0IHZhbHVlIG9uIGJvdHRvbQogICAgYm90dG9tcyA9IGRlZmF1bHRkaWN0KGludCkKICAgIGZvciBjIGluIGNhcmRzOgogICAgICAgIHRvcHZhbHVlID0gY1swXQogICAgICAgIHRvcHNbdG9wdmFsdWVdICs9IDEKICAgICAgICBib3R0b212YWx1ZSA9IGNbMV0KICAgICAgICBpZiBib3R0b212YWx1ZSAhPSB0b3B2YWx1ZToKICAgICAgICAgICAgIyBpZiBpdCdzIHRoZSBzYW1lIG9uIGJvdGggc2lkZSB3ZSBpZ25vcmUgdGhlIGJvdHRvbQogICAgICAgICAgICBib3R0b21zW2JvdHRvbXZhbHVlXSArPSAxCiAgICAgICAgICAgIHRvcHNbYm90dG9tdmFsdWVdICs9IDAgCiAgICAjIHRvcGNvdW50cyBpcyBhIGxpc3Qgb2YgcGFpcnMgKHZhbHVlLCBjb3VudCkKICAgIHRvcGNvdW50cyA9IGxpc3QodG9wcy5pdGVtcygpKQogICAgIyBzb3J0IGl0IGJ5IGNvdW50LCB0aGUgYmlnZ2VzdCBmaXJzdAogICAgdG9wY291bnRzLnNvcnQoIGtleSA9IGxhbWJkYSB4IDogLXhbMV0gKQogICAgZm9yICh2LCBjKSBpbiB0b3Bjb3VudHM6CiAgICAgICAgaWYgKGMgKyBib3R0b21zW3ZdKSAqIDIgPj0gbGVuKGNhcmRzKToKICAgICAgICAgICAgZmluYWwgPSB2CiAgICAgICAgICAgIGJyZWFrCiAgICBlbHNlOgogICAgICAgIHByaW50KCAidGhlcmUgaXMgbm8gcmVzdWx0IiApCiAgICAgICAgcmV0dXJuCgogICAgcHJpbnQoICJ2YWx1ZT0iLCBmaW5hbCwgIm1vdmVzPSIsIChsZW4oY2FyZHMpKzEpLy8yIC0gdG9wc1tmaW5hbF0gKQoKCmNhcmRmbGlwKCBbICgzLDEwKSwgKDEwLDMpLCAoNSw0KSBdICkKY2FyZGZsaXAoIFsgKDEsMyksICgyLDMpLCAoNCwgNSksICg2LCA3KSwgKDksMyksICgxMSwyKV0gKQ==