def dict_create(min_factor, max_factor):
dict_resulted = {}
for i in range(min_factor, max_factor + 1):
for j in range(min_factor, max_factor + 1):
num, list_of_factors = i * j, sorted([i, j])
if num not in dict_resulted:
dict_resulted[num] = [list_of_factors]
else:
if list_of_factors not in dict_resulted[num]:
dict_resulted[num].append(list_of_factors)
return dict_resulted
def largest(min_factor, max_factor):
if max_factor < min_factor:
raise ValueError("min must be <= max")
dict_operated = dict_create(min_factor, max_factor)
for num in sorted(dict_operated, reverse = True):
if str(num) == str(num)[::-1]:
return tuple([num, dict_operated[num]])
def smallest(min_factor, max_factor):
if max_factor < min_factor:
raise ValueError("min must be <= max")
dict_operated = dict_create(min_factor, max_factor)
for num in sorted(dict_operated):
if str(num) == str(num)[::-1]:
return tuple([num, dict_operated[num]])
print(largest(10, 99))
print()
print(smallest(10, 99))
ZGVmIGRpY3RfY3JlYXRlKG1pbl9mYWN0b3IsIG1heF9mYWN0b3IpOgogICAgZGljdF9yZXN1bHRlZCA9IHt9CiAgICBmb3IgaSBpbiByYW5nZShtaW5fZmFjdG9yLCBtYXhfZmFjdG9yICsgMSk6CiAgICAgICAgZm9yIGogaW4gcmFuZ2UobWluX2ZhY3RvciwgbWF4X2ZhY3RvciArIDEpOgogICAgICAgICAgICBudW0sIGxpc3Rfb2ZfZmFjdG9ycyA9IGkgKiBqLCBzb3J0ZWQoW2ksIGpdKQogICAgICAgICAgICBpZiBudW0gbm90IGluIGRpY3RfcmVzdWx0ZWQ6CiAgICAgICAgICAgICAgICBkaWN0X3Jlc3VsdGVkW251bV0gPSBbbGlzdF9vZl9mYWN0b3JzXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgbGlzdF9vZl9mYWN0b3JzIG5vdCBpbiBkaWN0X3Jlc3VsdGVkW251bV06CiAgICAgICAgICAgICAgICAgICAgZGljdF9yZXN1bHRlZFtudW1dLmFwcGVuZChsaXN0X29mX2ZhY3RvcnMpCiAgICByZXR1cm4gZGljdF9yZXN1bHRlZAogICAgICAKCmRlZiBsYXJnZXN0KG1pbl9mYWN0b3IsIG1heF9mYWN0b3IpOgogICAgaWYgbWF4X2ZhY3RvciA8IG1pbl9mYWN0b3I6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibWluIG11c3QgYmUgPD0gbWF4IikKICAgIGRpY3Rfb3BlcmF0ZWQgPSBkaWN0X2NyZWF0ZShtaW5fZmFjdG9yLCBtYXhfZmFjdG9yKQogICAgZm9yIG51bSBpbiBzb3J0ZWQoZGljdF9vcGVyYXRlZCwgcmV2ZXJzZSA9IFRydWUpOgogICAgICAgIGlmIHN0cihudW0pID09IHN0cihudW0pWzo6LTFdOgogICAgICAgICAgICByZXR1cm4gdHVwbGUoW251bSwgZGljdF9vcGVyYXRlZFtudW1dXSkKCgpkZWYgc21hbGxlc3QobWluX2ZhY3RvciwgbWF4X2ZhY3Rvcik6CiAgICBpZiBtYXhfZmFjdG9yIDwgbWluX2ZhY3RvcjoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtaW4gbXVzdCBiZSA8PSBtYXgiKQogICAgZGljdF9vcGVyYXRlZCA9IGRpY3RfY3JlYXRlKG1pbl9mYWN0b3IsIG1heF9mYWN0b3IpCiAgICBmb3IgbnVtIGluIHNvcnRlZChkaWN0X29wZXJhdGVkKToKICAgICAgICBpZiBzdHIobnVtKSA9PSBzdHIobnVtKVs6Oi0xXToKICAgICAgICAgICAgcmV0dXJuIHR1cGxlKFtudW0sIGRpY3Rfb3BlcmF0ZWRbbnVtXV0pCgoKcHJpbnQobGFyZ2VzdCgxMCwgOTkpKQpwcmludCgpCnByaW50KHNtYWxsZXN0KDEwLCA5OSkpCg==