Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 5, 2017 20:32:27

Franek
От: Беларусь
Зарегистрирован: 2016-05-09
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Подскажите, можно ли улучшить решение задачи?

Подскажите, можно ли было решить задачу более эффективно? Если да, то как?
Дано четырехзначное число. Поменяйте местами наименьшую и наибольшую цифры.

 lst = list('1812')
newlst = []
a = max(lst)
b = min(lst)
for i in range(len(lst)):
    if a == lst[i]:
        newlst.insert(i, b)
    else:
        newlst.append(lst[i])
#  ['1', '1', '1', '2']
for i in range(len(lst)):
    if b == lst[i]:
        del newlst[i]
        newlst.insert(i, a)
        break
result = ''
for st in newlst:  # Преобразование списка в строку
    result += st
print(int(result))
#  8112

Офлайн

#2 Ноя. 5, 2017 20:43:18

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Подскажите, можно ли улучшить решение задачи?

это жесть
вы определили масксимальную цифру и минимальную, зачем вам после этого ТРИ!!! цикла?

 c = "123413"
max_ = max(c)
min_ = min(c)
res = []
change_min = change_max = False
for i in c:
   if i == min_ and not change_min:
       res.append(max_)
       change_min = True
   elif i == max_ and not change_max:
       res.append(min_)
       change_max = True
   else:
       res.append(i)
print("".join(res))



Офлайн

#3 Ноя. 6, 2017 06:42:27

Franek
От: Беларусь
Зарегистрирован: 2016-05-09
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Подскажите, можно ли улучшить решение задачи?

FishHook
да, так лучше, спасибо!

Офлайн

#4 Ноя. 6, 2017 19:06:10

Franek
От: Беларусь
Зарегистрирован: 2016-05-09
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Подскажите, можно ли улучшить решение задачи?

Подскажите еще одну задачу. Правильное решение, или можно лучше решить?
Даны числа h и m, где h - количество часов, m - количество минут некоторого момента времени. Найдите угол между часовой и минутной стрелками в этот момент времени.

 h = int(input("h "))
m = int(input("m "))
h *= 5
if m > h:
    print((m - h)*6)
else:
    print(360+(m - h)*6)

Отредактировано Franek (Ноя. 6, 2017 19:07:06)

Офлайн

#5 Ноя. 6, 2017 19:19:48

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2683
Репутация: +  182  -
Профиль   Отправить e-mail  

Подскажите, можно ли улучшить решение задачи?

1)

 >>> s = list("1812")
>>> s[s.index(max(s))], s[s.index(min(s))] = s[s.index(min(s))], s[s.index(max(s))]
>>> "".join(s)
'8112'
2)
 >>> h = 3
>>> m = 45
>>> h *= 360/12
>>> m *= 360/60
>>> h - m
-180



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#6 Ноя. 6, 2017 19:35:30

Franek
От: Беларусь
Зарегистрирован: 2016-05-09
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Подскажите, можно ли улучшить решение задачи?

Rodegast
спасибо. (Про index совсем забыл).

Офлайн

#7 Ноя. 10, 2017 12:10:33

Franek
От: Беларусь
Зарегистрирован: 2016-05-09
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Подскажите, можно ли улучшить решение задачи?

Помогите, пожалуйста. Можно ли было улучшить решение задачи? Если да, то как?
Вывести все пятизначные числа, которые делятся на 2, у которых средняя цифра нечетная,
# и сумма всех цифр делится на 4.

 def func(number):
    n = str(number)[2]     # Проверка четности средней цифры и числа
    if int(n) % 2 == 0 or number % 2 != 0:
        return False
    total = 0
    for i in str(number):  # Проверка суммы цифр числа
        total += int(i)
    return total % 4 == 0
print(list(filter(func, range(10000, 99999))))

Отредактировано Franek (Ноя. 10, 2017 12:14:50)

Офлайн

#8 Ноя. 10, 2017 13:43:59

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9727
Репутация: +  843  -
Профиль   Отправить e-mail  

Подскажите, можно ли улучшить решение задачи?

Franek
Можно ли было улучшить решение задачи?
Здесь неправильно то, что ты с числами работаешь как со строками. С числами надо работать числовыми методами, так как они быстрее во много раз и меньше памяти тратят.
Нужно просто использовать операции // и %.



Офлайн

#9 Ноя. 10, 2017 18:20:48

Franek
От: Беларусь
Зарегистрирован: 2016-05-09
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Подскажите, можно ли улучшить решение задачи?

py.user.next
Я использовал преобразование числа в строку, т. к. для получения суммы цифр используется срез каждой цифры или sum. Срез числа сделать нельзя, во втором случае требует итерируемый объект, а число им не является.

Офлайн

#10 Ноя. 10, 2017 21:49:29

Franek
От: Беларусь
Зарегистрирован: 2016-05-09
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Подскажите, можно ли улучшить решение задачи?

py.user.next
Наверное так?

 def func(number):
    if number % 2 == 0:
        n = 0
        for i in range(5):
            if i == 2 and (number % 10) % 2 == 0:
                return False
            n += (number % 10)
            number = number // 10
        return n % 4 == 0
    return False
print(list(filter(func, range(10000, 99999))))

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version