Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 10, 2018 08:59:04

zagadka
Зарегистрирован: 2018-09-10
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Решаю загадку

Снова перебираю загадки. И отсюда много вопросов. Написал код, он вроде работает, но:
неужели в python нет способа разобрать число на составляющие иначе как чем через str?
как правильно переместить цикл в тело чтобы не повторять в каждой функции?
почему глобальную переменную нельзя изменить из функций без указания локальной переменной global?
как избавиться от большого количества if?
Заранее спасибо за помощь.

#На доске выписаны все пятизначные числа, у которых каждая цифра либо равна обеим соседним, либо отличается от соседних ровно на единицу - от одного в меньшую, а от другого в большую сторону.
#Сколько написанных на доске чисел содержат в своей записи цифру 5?
start = 1
end = 4
count_5 = 0

def check_the_same_high(nomer):
global count_5
for i in range(start, end, 1):
if ((int(nomer[i]) == (int(nomer[i-1]) -1)) and (int(nomer[i]) == (int(nomer[i+1]) +1))):
if i > 2:
print(nomer)
if ('5' in nomer):
count_5 += 1
else:
break

def check_the_same_low(nomer):
global count_5

for i in range(start, end, 1):
if ((int(nomer[i]) == (int(nomer[i-1]) +1)) and (int(nomer[i]) == (int(nomer[i+1]) -1))):
if i > 2:
print(nomer)
if ('5' in nomer):
count_5 += 1
else:
break

def check_the_summ(nomer):
global count_5

for i in range(start, end, 1):
if (int(nomer[i]) == int(nomer[i-1]) + int(nomer[i+1])):
if i > 2:
print(nomer + ' sum')
if ('5' in nomer):
count_5 += 1
else:
break

def check(dig):
nomer = str(dig)

check_the_same_high(nomer)
check_the_same_low(nomer)
check_the_summ(nomer)


for i in range(0, 99999, 1):
check('{:05}'.format(i))

print('чисел содержащих цифру 5 всего: ' + str(count_5))

Офлайн

#2 Сен. 10, 2018 10:24:08

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

Решаю загадку

zagadka
неужели в python нет способа разобрать число на составляющие иначе как чем через str?
Его и не нужно через str() разбирать. Число разбирают через последовательное деление на 10, пока оно не станет нулём.
out = список
пока number > 0
digit = number % 10
out добавить digit
number = number / 10



Офлайн

#3 Сен. 10, 2018 15:16:49

Vladimirv
Зарегистрирован: 2013-03-22
Сообщения: 108
Репутация: +  7  -
Профиль   Отправить e-mail  

Решаю загадку

Думаю, вам нужно уточнить задачу или разобраться с её описанием:

zagadka
у которых каждая цифра либо равна обеим соседним
111 => средняя цифра равна обеим соседним
121 => средняя цифра равна сумме соседних
т.е. вам нужно включить числа 11111, 22222, …, 99999
В выдачу у вас попадает 00000 это число 0, думаю его не должно быть.
 def get_num(lst):
    num = 0
    for i in range(5):
        num += lst[4-i]*10**i
    return num
def main():
    nums = []
    digits = [i for i in range(10)]
    for i in range(10):
        if i < 6:
            tmp = digits[i:i+5]
            nums.append(get_num(tmp))
            nums.append(get_num(list(reversed(tmp))))
        nums.append(i*11111)
    nums5digits = list(filter(lambda x: x > 10**4, nums))
    five_in_nums = list(filter(lambda x: '5' in str(x), nums5digits))
    print(five_in_nums, len(five_in_nums))
main()

Офлайн

#4 Сен. 11, 2018 09:47:37

zagadka
Зарегистрирован: 2018-09-10
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Решаю загадку

Vladimirv
В выдачу у вас попадает 00000 это число 0, думаю его не должно быть.

я рассматривал это как сумма соседних.

Vladimirv
Скажите, пожалуйста, что же такого надо почитать чтобы научиться видеть задачу как вы - только требуемое в тз, как отсечь весь мусор перебора и поэтапного исполнения? Скажите, вот вы задачу с конца начали читать? Иначе я не понимаю как мозг вывернуть чтобы такой краткий и правильный путь получался? И кстати nums.append(i*11111) предполагает, что мы знаем искомый результат почему вы не отдали программе поиск этого числа?

Офлайн

#5 Сен. 11, 2018 18:23:19

Vladimirv
Зарегистрирован: 2013-03-22
Сообщения: 108
Репутация: +  7  -
Профиль   Отправить e-mail  

Решаю загадку

zagadka вот вы мне и скажите, что надо было почитать и где это надо было учиться, чтобы 00000 рассматривать как 5-значное число? Думаю, это так и останется загадкой)

zagadka
я рассматривал это как сумма соседних.
Я вам только что указал на то, что вы не правильно поняли задачу. В задаче нет слова “сумма”. И это очевидно, т.к. не одно число не подходит под это определение. И еще раз 00000 это не 5-значное число, это просто 0.

zagadka
И кстати nums.append(i*11111) предполагает, что мы знаем искомый результат почему вы не отдали программе поиск этого числа?
Давайте, начнем с того, что это я знаю конечный результат), ну да теперь и вы. Поскольку в задаче говорится, что цифра равна соседним, то таки да, я знаю как получить это число.

Мой код это всего лишь один из вариантов решения задачи. И что вы хотите, чтобы я зашел через ваш вариант перебора? Зачем вам это? У вас есть этот код. Кстати перебирать числа нужно от 10000 до 99999, числа же 5-значные, а не как у вас с 0 до 99999.

Офлайн

#6 Сен. 11, 2018 20:17:37

zagadka
Зарегистрирован: 2018-09-10
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Решаю загадку

Vladimirv
zagadka вот вы мне и скажите, что надо было почитать и где это надо было учиться

Vladimirv

Да я же не язвил, реально восхитился умением увидеть суть задачи. Вот и спрашиваю как мозг на решение настроить, а не поэтапный перебор причин и следствий.

Офлайн

#7 Сен. 12, 2018 09:39:34

Vladimirv
Зарегистрирован: 2013-03-22
Сообщения: 108
Репутация: +  7  -
Профиль   Отправить e-mail  

Решаю загадку

Смотрите, вам очень много и часто придется искать ответы на вопросы. Поэтому очень важно научиться правильно формулировать вопросы. Поговаривают, что правильно поставленный вопрос это 50% ответа. Точно могу сказать, что на правильный вопрос быстрее можно нагуглить ответ, а также на него быстрее дадут ответ. Например сейчас, ваша формулировка про мозг выглядела для меня как-то так: вы подходите к футболисту и говорите: “Ваша нога сегодня забила отличный гол, великолепно обрабатывала мяч и отдавала шикарные пасы. Что нужно, чтобы моя нога выписывала такие финты?”. Думаю, не нужно так формулировать вопрос и тем более отделять мозг от себя) Более того, китайские мастера единоборств, оружие считали продолжением себя, своей руки. И поговаривают, что даже забывали название оружия.

Что почитать, придумали давно и до нас, это здесь. Если владеете английским, то это доки с оф. сайтов. Темы на этом форуме.

Мне понравилась, книга “Изучаем Python. Программирование игр, визуализация данных, веб-приложения.” Эрик Мэтиз.
Из ресурсов: www.codeabbey.com , www.codewars.com . Думаю, должны быть и на русском языке, вы ведь где-то взяли задачу на русском. Мне такие не известны.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version