Share This
Связаться со мной
Крути в низ
Categories
//🐍🧩 5 задач с решениями на Python для начинающих разработчиков

🐍🧩 5 задач с решениями на Python для начинающих разработчиков

Освоили базу и руки чешутся испытать свои знания на практике? Ловите пять задачек на проверку своих знаний: пишем программу для перевода NRZI кода в двоичный, обнаруживаем лишние символы в строке, определяем «почти палиндром», создаем функцию для замены чисел на слова и находим лучшую покерную комбинацию.

5 zadach s reshenijami na python dlja nachinajushhih razrabotchikov 76f186a - 🐍🧩 5 задач с решениями на Python для начинающих разработчиков

1. Лишний символ

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

Формат ввода:

Строка А — исходное сообщение.

Строка Б — доставленное сообщение.

         #Пример ввода: スーパーハカー スーパーハッカー      

Формат вывода:

Лишний символ в доставленном сообщении.

         #Пример вывода: ッ      

Решение

Способ 1:

         a, b = input(), input()  for character in a:  	b = b.replace(character, '', 1)  print(b)       

Способ 2:

         x = input() + input()  for i in x:  	if x.count(i) % 2 != 0:  	print(i)  	break       

Способ 3:

         lst1, lst2 = list(input()), list(input())  for el1 in lst1:  	if el1 in lst2:  		lst2.remove(el1)  print(*lst2)       

Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека питониста» Интересно, перейти к каналу

2. Функция PythonGeek

Напишите функцию pythongeek(), которая принимает два целочисленных аргумента a и b (при этом a ≤ b), и возвращает строку, составленную из чисел от a до b включительно и слов Python, Geek и PythonGeek по следующим правилам:

  • если число делится без остатка на 3, то вместо него в строку добавляется слово Python;
  • если число делится без остатка на 7, то вместо него в строку добавляется слово Geek;
  • если число делится без остатка и на 3, и на 7, то вместо него в строку добавляется слово PythonGeek;
  • в остальных случаях в строку добавляется само число;
  • числа и слова в формируемой строке разделяются пробелами.

Пример вызова функции:

         print(pythongeek(14, 21))     

Возвращаемая строка:

         Geek Python 16 17 Python 19 20 PythonGeek     

Решение

Задача кажется простой до момента возвращения значения функции — возвращать нужно именно строку с распакованными значениями (не элементы списка).

Способ 1:

         def pythongeek(a, b):     sp = [i for i in range(a, b + 1)]     for i, j in enumerate(sp):         if j % 3 == 0 and j % 7 == 0:             sp[i] = 'PythonGeek'                     elif j % 3 == 0:             sp[i] = 'Python'         elif j % 7 == 0:             sp[i] = 'Geek'         else:             sp[i] = str(j)     return ' '.join(sp)      

Способ 2:

         def pythongeek(a, b):      return ' '.join(('Python' * (i % 3 == 0) + 'Geek' * (i % 7 == 0) or str(i)) for i in range(a, b + 1))       

Способ 3:

         def pythongeek(a,b):     answer = list(map(lambda n: 'PythonGeek' if(n % 3 == 0 and n % 7 == 0) else ('Python' if n % 3 == 0 else ('Geek' if n % 7 == 0 else str(n))), list(range(a, b + 1))))      return " ".join(answer)       

3. NRZI кодирование

NRZI (Non Return to Zero Invertive) — один из способов линейного кодирования. Если имеется некое устройство, которое способно находиться лишь в двух различных состояниях, можно построить диаграмму состояний устройства на каждом такте с помощью двоичных 1 и 0. Напишите программу для перевода NRZI кода в двоичный: изменение состояния устройства в этом случае обозначается двоичной единицей 1, а неизменное состояние принимается за 0.

Формат ввода:

Строка NRZI кода, состоящая из символов _, и |.

         #Пример ввода: _|¯|____|¯|__|¯¯¯      

Формат вывода:

Двоичный код.

         #Пример вывода: 011000110100      

Решение

Способ 1:

         code = ' ' + input() for i in range(1, len(code)):     if code[i] != '|':         print(int(code[i - 1] == '|'), end='')      

Способ 2:

         print(input().replace("|¯", "1").replace("|_", "1").replace("_", "0").replace("¯", "0"))     

Способ 3:

         code = input().split('|') res = '0' for i in code:     res += '0' * (len(i) - 1) + '1' print((res[1:-1], res[:-1])[bool(code[0])])      

4. Почти палиндром

Строка текста, которую можно превратить в палиндром после удаления одной буквы, называется «почти палиндромом». Напишите программу, которая принимает на вход строку, состоящую из букв, цифр и специальных символов, и определяет, можно ли превратить строку в палиндром, удалив одну из букв. В строке гарантированно есть хотя бы две буквы.

Формат ввода:

Строка, состоящая из букв, цифр и символов.

         #Пример ввода: *#14&*@(a)!(@14112)!@$)!@*$!*a)$*099      

Формат вывода:

True, если строка является почти палиндромом, или False – в противном случае.

         #Пример вывода: True      

Решение

Алгоритмы, основанные на срезах строк и проверке на палиндромность с помощью функции any (или [::-1]), позволяют решить эту задачу буквально в пару строк. Но выполнение такого кода занимает слишком много времени, и подобные алгоритмы, как правило, не проходят тесты на временные лимиты.

Способ 1:

         s = ''.join([i for i in input() if i.isalpha()]) i, j, c = 0, -1, 0 for i in range(len(s)//2):     if s[i] != s[j]:         c += 1     i += 1     j += -1 print('True' if c == 1 or c == 0 or len(s) <= 2 or s[:-1] == s[:-1][::-1] else 'False')      

Способ 2:

         def isAlmostPalindrome(s):     for i in range(len(s) // 2):         if s[i] != s[-1 - i] and s[i + 1] != s[-i - 1] and s[i] != s[-i - 2]:             return False     return True s = ''.join(filter(str.isalpha, input())) print(isAlmostPalindrome(s))      

Способ 3:

         s = [elem for elem in input() if elem.isalpha()] mistake = 0 for i in range(len(s)-1):     if mistake > 1:         break     if s[i] != s[-i-1]:         if s[i] == s[-i-2]:             s.pop(-i-1)         else:             s.pop(i)         mistake += 1 print(mistake <= 1)      

5. Лучшая комбинация

Напишите программу, которая принимает на вход строку из 5 чисел от 1 до 13, представляющих собой номера карт, и выводит название лучшей комбинации, которую можно из этих карт составить. Валеты, дамы, короли и тузы обозначаются числами 11, 12, 13 и 1 соответственно.

Традиционные названия комбинаций в покере:

  • 4 одинаковые карты – Каре;
  • 3 одинаковые карты и 2 другие одинаковые карты – Фулл Хаус;
  • 5 последовательно идущих карт – Стрит;
  • 3 одинаковые карты – Сет;
  • 2 одинаковые карты и 2 другие одинаковые карты – Две пары;
  • 2 одинаковые карты – Пара;
  • ничего из вышеперечисленного – Старшая карта.

Если в руке окажется 5 одинаковых карт – вывести Шулер.

Формат ввода:

Строка из 5 чисел от 1 до 13 через пробел – номера карт в руке.

         #Пример ввода: 4 6 5 7 8      

Формат вывода:

Название лучшей комбинации карт.

         #Пример вывода: Стрит      

Решение

Способ 1:

         cards = sorted(map(int, input().split())) n, x = len(set(cards)), cards.count(cards[2]) if n == 1:      print('Шулер') elif n == 5 and cards[4] - cards[0] == 4:      print('Стрит') elif x == 4:      print('Каре') elif n == 2:      print('Фулл Хаус')     elif x == 3:      print('Сет') elif n == 3:      print('Две пары') elif n == 4:     print('Пара') else:     print('Старшая карта')      

Способ 2:

         cards = list(sorted(map(int, input().split()))) unique_cards = {crd: cards.count(crd) for crd in cards} if len(unique_cards) == 1:     print('Шулер') else:     count = sorted(list(unique_cards.values()))     if count == [1, 4]:         print('Каре')     elif count == [2, 3]:         print('Фулл Хаус')     elif cards == list(range(cards[0], cards[0] + 5)):         print('Стрит')     elif count == [1, 1, 3]:         print('Сет')     elif count == [1, 2, 2]:         print('Две пары')     elif count == [1, 1, 1, 2]:         print('Пара')     else:         print('Старшая карта')      

Способ 3:

         from collections import Counter COMBO = [     ("Шулер", lambda h: len(set(h)) == 1),     ("Каре", lambda h: Counter(h).most_common()[0][1] == 4),     ("Фулл Хаус", lambda h: len(set(h))==2),     ("Стрит", lambda h: len(set(h))==5 and h[-1]-h[0] == 4),     ("Сет", lambda h: Counter(h).most_common()[0][1] == 3),     ("Две пары", lambda h: len(set(h))==3),     ("Пара", lambda h: len(set(h))==4),     ("Старшая карта", lambda h: True) ] hand = sorted(list(map(int, input().split()))) for c in COMBO:     result, rule = c     if rule(hand):         print(result)         break      

***

Материалы по теме

  • 🐍🧩 Задача о поврежденной XML-строке
  • 🐍🧩 5 классических задач по Python для начинающих с решениями
  • 🐍🧩 5 задач по Python для новичков с решениями

  • 6 views
  • 0 Comment

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Связаться со мной
Close