Как оптимизировать взвешенные значения и выводить наименьшее количество строк и символов? - PullRequest
0 голосов
/ 23 февраля 2020
def finalvalue(a,b,c,d):
    o=round(450-a-(b*2+c+d)*.75+.3)
    return ("Impossible, you " if(o)>100 else "You ")+"would need a "+str(o)+"%"

Итак, здесь у меня есть функция, которая вычисляет взвешенную оценку каждого из входных данных и какую итоговую оценку кто-то должен будет заработать, чтобы получить по крайней мере 90% в целом. Если значение НЕ является целым числом, в данном случае «o», то округляется до ближайшего верхнего целого числа. Если счет больше 100, вместо этого выведите другое сообщение с «невозможно».

Я уже поместил оператор return с условием if.

Итак, мой вопрос, как бы я оптимизировал это и сделал это в несколько строк кода?

1 Ответ

1 голос
/ 23 февраля 2020

Вот 144-символьное решение:

import math
def finalvalue(a,b,c,d):
 o=math.ceil(450-a-(b*2+c+d)*.75)
 return("Impossible, y"if o>100 else"Y")+"ou would need a "+str(o)+"%"

Если a, b, c и d являются целыми числами, то вы можете упростить дальнейшее, отметив наименьшую дробь, которую можете получить o равно 1/4, то есть 0,25, поэтому мы можем добавить 0,3 и округлить:

def finalvalue(a,b,c,d):
 o=round(450-a-(b*2+c+d)*.75+.3)
 return("Impossible, y"if o>100else"Y")+"ou would need a "+str(o)+"%"

В нем 127 символов.

Вы также можете упростить дальнейшее использование форматирование строки старого стиля и избавление от раунда:

def finalvalue(a,b,c,d):
 o=450.9-a-(b*2+c+d)*.75
 return("Impossible, y"if o>100else"Y")+"ou would need a %d%%"%o

Я думаю, что это 114.

Если у вас есть доступ к Python 3.8, вы можете использовать лямбда-выражение и оператор моржа для сокращения до 104 символов:

finalvalue=lambda a,b,c,d:("Y","Impossible, y")[(o:=450.9-a-(b*2+c+d)*.75)>100]+"ou would need a %d%%"%o
...