Форум сайта python.su
0
Снова перебираю загадки. И отсюда много вопросов. Написал код, он вроде работает, но:
неужели в 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))
Офлайн
857
zagadkaЕго и не нужно через str() разбирать. Число разбирают через последовательное деление на 10, пока оно не станет нулём.
неужели в python нет способа разобрать число на составляющие иначе как чем через str?
out = список
пока number > 0
digit = number % 10
out добавить digit
number = number / 10
Офлайн
7
Думаю, вам нужно уточнить задачу или разобраться с её описанием:
zagadka111 => средняя цифра равна обеим соседним
у которых каждая цифра либо равна обеим соседним
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()
Офлайн
0
Vladimirv
В выдачу у вас попадает 00000 это число 0, думаю его не должно быть.
Офлайн
7
zagadka вот вы мне и скажите, что надо было почитать и где это надо было учиться, чтобы 00000 рассматривать как 5-значное число? Думаю, это так и останется загадкой)
zagadkaЯ вам только что указал на то, что вы не правильно поняли задачу. В задаче нет слова “сумма”. И это очевидно, т.к. не одно число не подходит под это определение. И еще раз 00000 это не 5-значное число, это просто 0.
я рассматривал это как сумма соседних.
zagadkaДавайте, начнем с того, что это я знаю конечный результат), ну да теперь и вы. Поскольку в задаче говорится, что цифра равна соседним, то таки да, я знаю как получить это число.
И кстати nums.append(i*11111) предполагает, что мы знаем искомый результат почему вы не отдали программе поиск этого числа?
Офлайн
0
Vladimirv
zagadka вот вы мне и скажите, что надо было почитать и где это надо было учиться
Да я же не язвил, реально восхитился умением увидеть суть задачи. Вот и спрашиваю как мозг на решение настроить, а не поэтапный перебор причин и следствий.Офлайн
7
Смотрите, вам очень много и часто придется искать ответы на вопросы. Поэтому очень важно научиться правильно формулировать вопросы. Поговаривают, что правильно поставленный вопрос это 50% ответа. Точно могу сказать, что на правильный вопрос быстрее можно нагуглить ответ, а также на него быстрее дадут ответ. Например сейчас, ваша формулировка про мозг выглядела для меня как-то так: вы подходите к футболисту и говорите: “Ваша нога сегодня забила отличный гол, великолепно обрабатывала мяч и отдавала шикарные пасы. Что нужно, чтобы моя нога выписывала такие финты?”. Думаю, не нужно так формулировать вопрос и тем более отделять мозг от себя) Более того, китайские мастера единоборств, оружие считали продолжением себя, своей руки. И поговаривают, что даже забывали название оружия.
Что почитать, придумали давно и до нас, это здесь. Если владеете английским, то это доки с оф. сайтов. Темы на этом форуме.
Мне понравилась, книга “Изучаем Python. Программирование игр, визуализация данных, веб-приложения.” Эрик Мэтиз.
Из ресурсов: www.codeabbey.com , www.codewars.com . Думаю, должны быть и на русском языке, вы ведь где-то взяли задачу на русском. Мне такие не известны.
Офлайн