#!/usr/local/cpython-3.4/bin/python3

import dbm
import copy
import collections

def get_max_size(results_db):
    max_size = -1
    for key in results_db.keys():
        fields = key.split(b'/')
        size = int(fields[4])
        max_size = max(max_size, size)
    assert max_size != -1
    return max_size

def get_by_kind(results_db, max_size):
    result_dict = collections.defaultdict(list)
    for db_key in results_db.keys():
        fields = db_key.split(b'/')
        size = int(fields[4])
        value = results_db[db_key]
        if size == max_size and value != b'too_long':
            result_key = tuple(fields[:3])
            tuple_ = (float(results_db[db_key]), fields[3])
            result_dict[result_key].append(tuple_)
    return result_dict

def get_best_4s(by_kind):
    my_by_kind = copy.deepcopy(by_kind)
    for value in my_by_kind.values():
        value.sort()
        value[:] = value[:5]
    return my_by_kind

def get_final_set(best_4s):
    final_set = set()
    for value in best_4s.values():
        for tuple_ in value:
            final_set.add(tuple_[1])
    return final_set
        
def main():
    results_db = dbm.open('results', 'r')
    max_size = get_max_size(results_db)
    #print('max size is {}'.format(max_size))
    by_kind = get_by_kind(results_db, max_size)
    #pprint.pprint(by_kind)
    best_4s = get_best_4s(by_kind)
    final_set = get_final_set(best_4s)
    for dict_name in sorted(list(final_set)):
        print(dict_name)
    
    
main()