Zen of Python
20.1K subscribers
1.29K photos
179 videos
36 files
3.3K links
Полный Дзен Пайтона в одном канале

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels

Сайт: https://tprg.ru/site

Регистрация в перечне РКН: https://tprg.ru/xZOL
Download Telegram
Задача об инверсии гласных

Вам даётся строка s. Напишите функцию, которая инвертирует порядок гласных:


>>> s = 'погода'
>>> invert_vowels(s)
... пагодо


#задача

@zen_of_python
👨‍💻2👍1🍌1
Поздравляем победителей

Задачу об идеальном квадрате верно решили:

@QuantumaStelata;
@nxiqns;
@WhonixMan;
@GeorKu;
@patriarch_chesslovo;
@maslyaev.

Кратчайшие верные решения предложили @QuantumaStelata:


x = lambda s: (s**(1/2)).is_integer()


@nxiqns:


def check_square_perfection(num):
    return (num**0.5).is_integer()


и @WhonixMan:


def check_square_perfection(num):
   return int(num**0.5) == num**0.5


Отдельно выделим решение @maslyaev, учитывающее случай очень больших чисел:


def check_square_perfection(area: int | float) -> bool:
  if area == 0 or area == 1: # На 0 и 1 ломается вавилонский метод
    return True
  if area < 4: # Отрицательная area даст False
    return False
  if area % 1 != 0: # Нецелая area даст False
    return False
  int_area = int(area)
  sqrt = int_area // 2
  while True:
    next_sqrt = (sqrt + int_area//sqrt)//2
    if next_sqrt == sqrt:
      break
    sqrt = next_sqrt
  return sqrt * sqrt == int_area


#задача

@zen_of_python
👍83🍌1
Задача о подстроке

Получаем две строки s и t . Напишите функцию проверки: является ли s подстрокой t.

Подстрока формируется из исходной строки путём удаления некоторых символов (может быть, ни одного) без нарушения положения остальных. "ace" является подстрокой "abcde", а "aec" — нет.

Ограничения:


0 <= len(s) <= 100
0 <= len(t) <= 10^4


s и t состоят только из строчных английских букв.

В качестве теста:


s = "abc"
t = "ahbgdc"

>>> is_substring(s, t)
... true


#задача

@zen_of_python
👍21🍌1
Поздравляем победителей

Задачу об инверсии строки верно решили:

— Cool and Fun Python (@Python3k);
— Лев Выскубов;
@sidor0912;
@lomserman;
@HackingSection;
@VasilTerekin (засчитываю, хотя запрошена функция);
@patriarch_chesslovo;
@IvanImmortal;
@Sentiago.

Кратчайшие верные решения предложили @patriarch_chesslovo:


VOWELS_LOWERCASE = set('aeoiuаоыуэяёиюе')

def invert_vowels(strng):
  reversed_vowels = (i for i in strng[::-1] if i.lower() in VOWELS_LOWERCASE)
  return ''.join([i if i.lower() not in VOWELS_LOWERCASE else next(reversed_vowels) for i in strng])


и @HackingSection:


def invert_vowels(s, vowels = "аяоёиыуюеэ"):
  vowelsInText = [j for j in s if j in vowels]
  return [vowelsInText.pop(-1) if i in vowels else i for i in s]


Отдельный респект Cool and Fun Python за разбор своего решения:


Предполагается, что все буквы в тексте строчные и русские. Иначе требуется доработать строку гласных.

У решения линейная асимптотика. Но если очень хочется, можно повысить быстродействие, превратив vowels в множество строк односимвольников: vowels = {'а', 'я', ...}

И преобразование строки в список и обратно - вынужденная мера. Строка в Python неизменяемая. Впрочем, на сохранение асимптотики O(N) это не влияет.

Кстати, если бы постановщик задачи гарантировал наличие гласных (всё же предлоги "в", "с" тоже считаются словами), можно было бы убрать проверки left < right в двух внутренних циклах.


Отдельная благодарность @lomserman за создание тестирующей функции:


def test(original: str, expected: str):
  result = invert_vowels(original)
  print(result)
  assert result == expected


p.s. Админ подписывается на всех ребятушек, что решают задачи. Если «провалиться» в профили решивших, там полно питонической годноты.

#задача

@zen_of_python
🔥6🍌21
Поздравляем победителей

Задачу о подстроке верно решили:

@GeorKu;
@StSav012;
@IPyth0n (@X_Python);
@stalker1337;
@HackingSection;
@Shihiyev;
@sidor0912
@patriarch_chesslovo.

Кратчайшие верные решения предложили @HackingSection:


def is_substring(s, t, nxt = 0):
  return len(s) == [nxt := nxt + 1 for i in t if i == s[nxt]][-1]


и @SmirnGreg:


def is_substring(s: str, t: str):
  return bool(re.match('.*' + '.*'.join(s) + '.*', t)) 


Отдельное спасибо @SmirnGreg за замер скорости исполнения функций (!)

NB! Учитывайте повторяющиеся буквы в подстроке s. Для некоторых решений следующая пара строк отдаёт True, что явно неверно:


s = "agggc"
t = "cgxggxxgxxa"


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

#задача

@zen_of_python
👍51❤‍🔥1🔥1😁1