mapping = str.maketrans(
"f,dult`;pbqrkvyjghcnea[wxio]sm'.z",
"абвгдеёжзийклмнопрстуфхцчшщъыьэюя",
)
calc = {
'квадрат': {
'площадь': lambda **kwargs: bottom ** 2,
'периметр':lambda **kwargs: bottom * 4,
},
'прямоугольник': {
'площадь': lambda **kwargs: bottom * height,
'периметр':lambda **kwargs: (bottom + height) * 2,
},
'треугольник': {
'площадь': lambda **kwargs: bottom * height / 2,
}
}
def ask(question, options=None, expected=str):
if options:
question = '{} ({}): '.format(question, '|'.join(options))
answer = None
while (options and answer not in options) or (type(answer) is not expected):
answer = input(question)
if expected is str:
answer = answer.lower().translate(mapping)
candidates = set(option for option in options if option.startswith(answer))
if len(candidates) == 1:
answer = candidates.pop()
else:
try:
answer = expected(answer)
except ValueError:
pass
return answer
if __name__ == '__main__':
figure = ask('Какую фигуру необходимо рассчитать?', set(calc))
parameter = ask('Какой параметр требуется вычислить?', set(calc[figure]))
bottom = ask('Введите длину основания: ', expected=float)
if figure == 'квадрат':
height = bottom
else:
height = ask('Введите высоту: ', expected=float)
result = calc[figure][parameter](bottom=bottom, height=height)
print(f'{parameter.title()} {figure}а: {result:.3f}')