Всем привет меня зовут Барышев Эмиль, я преподаватель ГАПОУ "МЦК-КТИТС", сегодня я погружу вас в увлекательный мир программирования.

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

Зачем полезно решать головоломки и задачи на Python?

**Решение головоломок с использованием Python** позволяет нам применить на практике знания и навыки, полученные в процессе обучения. Это также способ разнообразить обучение и сделать его более увлекательным.

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

Головоломка #1: Криптографический Лабиринт

Криптографический Лабиринт представляет собой зашифрованный текст, который требуется раскодировать с использованием Python. Вам предоставляется строка, состоящая из букв, цифр и специальных символов. Ваша задача - разработать программу, которая раскодирует эту строку и выведет исходный текст.

Вот зашифрованный текст: 2h 2l i3s 2s1 t2ex3t

Решение Задачи #1
def decrypt_labyrinth(text):
    result = ""
    i = 0

    while i < len(text):
        if text[i].isdigit():
            count = int(text[i])
            i += 1
            result += text[i] * count
        else:
            result += text[i]
        i += 1

    return result

# Используем функцию
encrypted_text = "2h 2l i3s 2s1 t2ex3t"
decoded_text = decrypt_labyrinth(encrypted_text)
print(decoded_text)

Подробное объяснение решения:

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

Применяя этот подход ко всей строке, вы раскодируете текст.

Головоломка #2: Математическая Задача с Последовательностью

У вас есть последовательность чисел, представленная в виде списка. Ваша задача - найти среднее арифметическое всех элементов этой последовательности, округлить его до целого числа и вернуть результат.

Вот сам список: [10, 20, 30, 40, 50]

Решение Задачи #2
def find_average(sequence):
    total = sum(sequence)
    average = total / len(sequence)
    return round(average)

# Используем функцию
numbers = [10, 20, 30, 40, 50]
result = find_average(numbers)
print(result)

Подробное объяснение решения:

Для решения этой задачи, мы сначала находим сумму всех элементов в последовательности с помощью sum(). Затем, делим эту сумму на количество элементов в последовательности, чтобы найти среднее арифметическое.

Функция round() используется для округления результата до целого числа. В итоге, мы возвращаем это округленное среднее значение.

Головоломка #3: Логическая Задача с Использованием Множеств

У вас есть два списка чисел. Ваша задача - найти все общие элементы в этих списках и вернуть их в виде нового списка.

Вот два списка:

list1 = [1, 2, 3, 4, 5]
list2 = [3, 4, 5, 6, 7]
Решение Задачи #3
def find_common_elements(list1, list2):
    set1 = set(list1)
    set2 = set(list2)
    common_elements = list(set1.intersection(set2))
    return common_elements

# Используем функцию
list1 = [1, 2, 3, 4, 5]
list2 = [3, 4, 5, 6, 7]
result = find_common_elements(list1, list2)
print(result)

Для решения этой задачи, мы сначала преобразуем оба списка в множества с помощью set(). Затем, с использованием метода intersection(), находим пересечение этих множеств, то есть все общие элементы.

Функция list() преобразует результат обратно в список, который мы и возвращаем.

Головоломка #4: Решение Задачи с Использованием Рекурсии

У вас есть задача - найти факториал числа. Факториал числа n обозначается n! и равен произведению всех положительных целых чисел от 1 до n.

Ваша задача - написать рекурсивную функцию, которая будет вычислять факториал числа.

Решение Задачи #4
def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)

# Используем функцию
result = factorial(5)
print(result)

Подробное объяснение решения:

В данной головоломке используется рекурсивный метод. Функция factorial(n) вычисляет факториал числа n следующим образом:

  • Если n равно 0, то факториал равен 1 (это базовый случай).

  • В противном случае, функция вызывает саму себя с аргументом n−1 и умножает результат на n.

Этот процесс повторяется до тех пор, пока n не достигнет 0.

Заключение

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

Решение головоломок не только развивает навыки программирования, но и способствует логическому мышлению и креативности. Я надеюсь, что вы получили удовольствие от этого процесса и научились что-то новое.

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

Благодарю вас за внимание к моей статье! Надеемся, что она вдохновила вас на новые творческие подходы к программированию. Следите за обновлениями и продолжайте исследовать мир IT!

Комментарии (21)


  1. yAndre
    26.10.2023 10:08
    +1

    Решение Задачи #3

    result = [k for k in list1 if k in list2]


    1. leeemonjuice Автор
      26.10.2023 10:08

      Спасибо, за предоставленное, интересное, решение!


    1. celen
      26.10.2023 10:08
      +2

      Постойте, уважаемый коллега! При всех недостатках авторского решений, обусловленных, несомненно, не очень высоким уровнем знания языка, это решение:

      result = list(set(list1) & set(list2))

      работает за O(n log n) времени. А ваше - за O(n^2). В этом отношении, на длинных списках, авторское решение превосходит ваше!


      1. yAndre
        26.10.2023 10:08

        Да, сударь, соглашусь. Предложенное мной решение изрядно зубодробительней будет


      1. leeemonjuice Автор
        26.10.2023 10:08

        Спасибо за вашу обратную связь, приму к сведению

        Я работаю в основном с детьми, которым более сложное, но производительное решения покажется не понятным


      1. santjagocorkez
        26.10.2023 10:08

        Да, но есть нюанс: что, если элементы списка (хотя бы один) — non-hashable? Плюс, на коротких списках, конечно же, накладные расходы на построение сетов будут превосходить выгоду от скорости их сопоставления.

        Или вот, известная уловка: [1.0, 1, True]


        1. lair
          26.10.2023 10:08

          Да, но есть нюанс: что, если элементы списка (хотя бы один) — non-hashable?

          В условиях задачи:

          У вас есть два списка чисел.

          Числа в python, вроде бы, всегда hashable.


          1. santjagocorkez
            26.10.2023 10:08

            Тоже правда. Пробовал сейчас придумать числа (в том числе, комплексные), которые не имеют __hash__(). Тем не менее, `1, 1.0` всё еще удовлетворяют условиям задачи.

            В дополнение к комментарию выше:

            def lists_intersect_cmp(l1, l2):
                 return [i for i in l1 if i in l2]
            
            
            def lists_intersect_set(l1, l2):
                return list(set(l1) & set(l2))
            
            
            # In [119]: %timeit lists_intersect_cmp([1, 2, 3], [3, 4, 5])
            # 837 ns ± 50.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
            
            # In [120]: %timeit lists_intersect_set([1, 2, 3], [3, 4, 5])
            # 981 ns ± 37.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
            

            Как видим, на коротких коллекциях квадратичное сравнение "каждый с каждым" выгоднее, чем строить два сета. И это я еще взял числа из free lists.


            1. lair
              26.10.2023 10:08

              ...и по условиям задачи неизвестно, что должно получиться.


      1. mostodont32
        26.10.2023 10:08

        Ваше решение работает так-то заО(n)


        1. celen
          26.10.2023 10:08

          Ваша правда. Подумал почему-то, что set.intersection имеет О(n log n) сложность но оказывается, что нет, O(N). Ну, тем более.


  1. BRIKS
    26.10.2023 10:08

    Решение задачи #1

    def decrypt(text):
    decrypted_text = ""
    i = 0

    while i < len(text):
        if text[i].isdigit():
            count = int(text[i])
            i += 1
            decrypted_text += text[i] * count
        else:
            decrypted_text += text[i]
        i += 1
    
    return decrypted_text
    

    encrypted_text = "2h 2l i3s 2s1 t2ex3t"
    decrypted_text = decrypt(encrypted_text)
    print("Decrypted Text:", decrypted_text)


  1. lair
    26.10.2023 10:08
    +2

    У вас есть последовательность чисел, представленная в виде списка. Ваша задача - найти среднее арифметическое всех элементов этой последовательности, округлить его до целого числа и вернуть результат.
    У вас есть два списка чисел. Ваша задача - найти все общие элементы в этих списках и вернуть их в виде нового списка.

    Это головоломки?..

    Выглядит слишком тривиально, или я что-то пропускаю?

    У вас есть задача - найти факториал числа. Факториал числа n обозначается n! и равен произведению всех положительных целых чисел от 1 до n.
    Ваша задача - написать рекурсивную функцию, которая будет вычислять факториал числа.

    ..нет, это точно не головоломки. Это тривиальные задачи по программированию.


    1. leeemonjuice Автор
      26.10.2023 10:08

      Задачи рассчитаны в основном для тех, кто только начинает разбираться в програмировании, в основном на детскую аудиторию


      1. lair
        26.10.2023 10:08
        +2

        Они от этого головоломками не становятся. Вычисление среднего арифметического по формуле - не головоломка. Использование стандартного метода из библиотеки - не головоломка.

        PS

        Задачи рассчитаны [...] в основном на детскую аудиторию

        ...и поэтому в послесловии статьи на Хабре вы пишете:

        Каждая задача предложила нам новые вызовы и позволила применить знания в практических задачах. [...] Я надеюсь, что вы [...] научились что-то новое (sic!). [...] Надеемся, что она вдохновила вас на новые творческие подходы к программированию.

        Не очень понятно, какова цель вашей статьи конкретно здесь.


  1. lair
    26.10.2023 10:08
    +4

    Криптографический Лабиринт представляет собой зашифрованный текст, который требуется раскодировать с использованием Python. Вам предоставляется строка, состоящая из букв, цифр и специальных символов. Ваша задача - разработать программу, которая раскодирует эту строку и выведет исходный текст.
    Вот зашифрованный текст: 2h 2l i3s 2s1 t2ex3t
    ...
    [объяснение решения] Ваша программа должна сначала пройтись по символам строки. Если текущий символ является числом, то это означает, что следующий символ нужно повторить столько раз, сколько указано в числе.

    ...а как надо догадаться, что это правильное решение? Где-то дан плейнтекст соответствующий зашифрованному? Или может быть это единственное решение, которым из зашифрованного текста получается осмысленный плейнтекст?


  1. celen
    26.10.2023 10:08
    +2

    У меня складывается стойкое ощущение, что нейросеть здесь не только рисовала картинки, но и текст статьи писала. Живой программист никогда бы не назвал тривиальный алгоритм вычисления факториала "головоломкой".


    1. leeemonjuice Автор
      26.10.2023 10:08

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


  1. BRIKS
    26.10.2023 10:08

    s = "3a2b1c"

    result = "" # Создаем пустую строку для хранения результата
    i = 0 # Инициализируем индекс для итерации по строке

    while i < len(s):
    if s[i].isdigit(): # Если текущий символ - число
    num = int(s[i]) # Преобразуем его в целое число
    next_char = s[i + 1] # Получаем следующий символ
    result += next_char * num # Добавляем следующий символ, повторенный num раз, к результату
    i += 2 # Пропускаем два символа: число и следующий символ
    else:
    result += s[i] # Если текущий символ не число, просто добавляем его к результату
    i += 1 # Переходим к следующему символу

    print(result)

    aaabbc

    где тут ошибка?)


  1. Scott_Leopold
    26.10.2023 10:08

    Щас ТС огребёт от местных снобов.


  1. myswordishatred
    26.10.2023 10:08
    +1

    Но это же обычные задачи с семинаров, а не головоломки...

    Я уж надеялся, что мне тут подкинут идей про написание головоломок на python в качестве учебных проектов.