Найти - Пользователи
Полная версия: Решаю загадку
Начало » Python для новичков » Решаю загадку
1
zagadka
Снова перебираю загадки. И отсюда много вопросов. Написал код, он вроде работает, но:
неужели в 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))
py.user.next
zagadka
неужели в python нет способа разобрать число на составляющие иначе как чем через str?
Его и не нужно через str() разбирать. Число разбирают через последовательное деление на 10, пока оно не станет нулём.
out = список
пока number > 0
digit = number % 10
out добавить digit
number = number / 10
Vladimirv
Думаю, вам нужно уточнить задачу или разобраться с её описанием:
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()
zagadka
Vladimirv
В выдачу у вас попадает 00000 это число 0, думаю его не должно быть.

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

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

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

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

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

Vladimirv

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

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

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

Мне понравилась, книга “Изучаем Python. Программирование игр, визуализация данных, веб-приложения.” Эрик Мэтиз.
Из ресурсов: www.codeabbey.com , www.codewars.com . Думаю, должны быть и на русском языке, вы ведь где-то взяли задачу на русском. Мне такие не известны.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB