Задача об инверсии гласных
Вам даётся строка s. Напишите функцию, которая инвертирует порядок гласных:
#задача
@zen_of_python
Вам даётся строка s. Напишите функцию, которая инвертирует порядок гласных:
>>> s = 'погода'
>>> invert_vowels(s)
... пагодо
#задача
@zen_of_python
👨💻2👍1🍌1
Поздравляем победителей
Задачу об идеальном квадрате верно решили:
— @QuantumaStelata;
— @nxiqns;
— @WhonixMan;
— @GeorKu;
— @patriarch_chesslovo;
— @maslyaev.
Кратчайшие верные решения предложили @QuantumaStelata:
@nxiqns:
и @WhonixMan:
Отдельно выделим решение @maslyaev, учитывающее случай очень больших чисел:
#задача
@zen_of_python
Задачу об идеальном квадрате верно решили:
— @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
👍8❤3🍌1
Задача о подстроке
Получаем две строки
Подстрока формируется из исходной строки путём удаления некоторых символов (может быть, ни одного) без нарушения положения остальных.
Ограничения:
В качестве теста:
#задача
@zen_of_python
Получаем две строки
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
👍2❤1🍌1
Поздравляем победителей
Задачу об инверсии строки верно решили:
— Cool and Fun Python (@Python3k);
— Лев Выскубов;
— @sidor0912;
— @lomserman;
— @HackingSection;
— @VasilTerekin (засчитываю, хотя запрошена функция);
— @patriarch_chesslovo;
— @IvanImmortal;
— @Sentiago.
Кратчайшие верные решения предложили @patriarch_chesslovo:
и @HackingSection:
Отдельный респект Cool and Fun Python за разбор своего решения:
Отдельная благодарность @lomserman за создание тестирующей функции:
p.s. Админ подписывается на всех ребятушек, что решают задачи. Если «провалиться» в профили решивших, там полно питонической годноты.
#задача
@zen_of_python
Задачу об инверсии строки верно решили:
— 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🍌2❤1
Поздравляем победителей
Задачу о подстроке верно решили:
— @GeorKu;
— @StSav012;
— @IPyth0n (@X_Python);
— @stalker1337;
— @HackingSection;
— @Shihiyev;
— @sidor0912
— @patriarch_chesslovo.
Кратчайшие верные решения предложили @HackingSection:
и @SmirnGreg:
Отдельное спасибо @SmirnGreg за замер скорости исполнения функций (!)
NB! Учитывайте повторяющиеся буквы в подстроке s. Для некоторых решений следующая пара строк отдаёт True, что явно неверно:
Присоединяйтесь: раз в неделю задачу решить — это вполне оптимальная нагрузка для занятого кодера.
#задача
@zen_of_python
Задачу о подстроке верно решили:
— @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
👍5❤1❤🔥1🔥1😁1
Задача о комбинировании подстрок
Впрочем, почему бы и нет! Задача от подписчика @StSav012:
Есть две последовательности элементами без повторов в каждой. Часть элементов одной последовательности есть в другой, часть из второй — в первой. Напишите функцию merge, чтобы сгенерировать общую последовательность, в которой будут обе подпоследовательности в неизменном порядке.
Если у вас есть интересная задачка, и вы хотите посмотреть на решения коллег-подписчиков (плюс опционально получить фидбэк своего решения), оставляйте задачи в комментах под этим постом.
#задача
@zen_of_python
Впрочем, почему бы и нет! Задача от подписчика @StSav012:
Есть две последовательности элементами без повторов в каждой. Часть элементов одной последовательности есть в другой, часть из второй — в первой. Напишите функцию merge, чтобы сгенерировать общую последовательность, в которой будут обе подпоследовательности в неизменном порядке.
>>> merge('acfg', 'bcht')
... 'abcfght'
Если у вас есть интересная задачка, и вы хотите посмотреть на решения коллег-подписчиков (плюс опционально получить фидбэк своего решения), оставляйте задачи в комментах под этим постом.
#задача
@zen_of_python
🍌2
Поздравляем победителей
Задачу о клумбе верно решили:
— Cool and Fun Python (@Python3k);
— @Cheshir78;
— Лев Выскубов;
— @patriarch_chesslovo;
— @vsugoyak;
— @sidor0912;
Кратчайшие верные решения предложили Лев Выскубов:
и @patriarch_chesslovo:
Отдельное спасибо @patriarch_chesslovo за описание пограничных случаев (одноместная клумба) и проверку некоторых решений.
Присоединяйтесь: одна задача в неделю — это вполне оптимальная нагрузка, а навык решать задачи все равно будет расти.
#задача
@zen_of_python
Задачу о клумбе верно решили:
— Cool and Fun Python (@Python3k);
— @Cheshir78;
— Лев Выскубов;
— @patriarch_chesslovo;
— @vsugoyak;
— @sidor0912;
Кратчайшие верные решения предложили Лев Выскубов:
def is_fitting(flowerbed, n):
flowerbed = [0] + flowerbed + [0] # Чтобы на краю можно было цветочек посадить :-)
k = 0
for slot in range(1, len(flowerbed) - 1):
if not any(flowerbed[(slot - 1) : (slot + 2)]):
flowerbed[slot] = 1
k += 1
return k >= n
и @patriarch_chesslovo:
def is_fitting(flowerbed, required_slots):
is_prev_slot_filled = sum(flowerbed[0:2]) == 0
vacant_slots = int(is_prev_slot_filled)
for i in range(1, len(flowerbed)):
is_curr_slot_filled = not is_prev_slot_filled and sum(flowerbed[i-1:i+2]) == 0
vacant_slots += int(is_curr_slot_filled)
is_prev_slot_filled = is_curr_slot_filled
if vacant_slots >= required_slots:
return True
return vacant_slots >= required_slots
Отдельное спасибо @patriarch_chesslovo за описание пограничных случаев (одноместная клумба) и проверку некоторых решений.
Присоединяйтесь: одна задача в неделю — это вполне оптимальная нагрузка, а навык решать задачи все равно будет расти.
#задача
@zen_of_python
🎉6
Поздравляем победителей
Задачу про комбинирование строк верно решили:
— @beibarysm;
— Лев Выскубов;
— @impreza555;
— @sidor0912;
— @vsugoyak
Кратчайшие верные решения предложили Лев Выскубов:
и @impreza555:
#задача
@zen_of_python
Задачу про комбинирование строк верно решили:
— @beibarysm;
— Лев Выскубов;
— @impreza555;
— @sidor0912;
— @vsugoyak
Кратчайшие верные решения предложили Лев Выскубов:
def merge(str1, str2):
return ''.join(sorted(set(list(str1) + list(str2))))
и @impreza555:
def merge(str1: str, str2: str) -> str:
return "".join(sorted(set(str1) | set(str2)))
#задача
@zen_of_python
👍6🍌1
Задача про поворот изображения
На вход подаётся двоичная матрица n x n из нулей и единиц. Наша задача — перевернуть изображение по горизонтали, затем инвертировать его значения.
— Переворот [1,1,0] по горизонтали приводит к [0,1,1].
— Инвертирование изображения означает, что каждый 0 заменяется 1, а каждая 1 заменяется 0.
1. Переворот по горизонтали: [[0,0,1,1],[1,0,0,1],[1,1,1,0],[0,1,0,1]]
2. Инверсия: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
#задача
@zen_of_python
На вход подаётся двоичная матрица n x n из нулей и единиц. Наша задача — перевернуть изображение по горизонтали, затем инвертировать его значения.
— Переворот [1,1,0] по горизонтали приводит к [0,1,1].
— Инвертирование изображения означает, что каждый 0 заменяется 1, а каждая 1 заменяется 0.
>>> image = [[1,1,0,0],[1,0,0,1],[0,1,1,1],[1,0,1,0]]
>>> flip(image)
... [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
1. Переворот по горизонтали: [[0,0,1,1],[1,0,0,1],[1,1,1,0],[0,1,0,1]]
2. Инверсия: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]
#задача
@zen_of_python
👍2❤1🍌1
Поздравляем победителей
Задачу о драгоценностях верно решили:
— Cool and Fun Python (@Python3k);
— @v1ktoriia_romanova;
— @leo5051;
— @lomserman;
— @vsugoyak;
— @sidor0912;
— @ganrre.
Тот редкий случай, когда кратчайшие верные решения в две строки предложили все: @Python3k, @v1ktoriia_romanova, @leo5051, @lomserman, @vsugoyak, @sidor0912, @ganrre.
#задача
@zen_of_python
Задачу о драгоценностях верно решили:
— Cool and Fun Python (@Python3k);
— @v1ktoriia_romanova;
— @leo5051;
— @lomserman;
— @vsugoyak;
— @sidor0912;
— @ganrre.
Тот редкий случай, когда кратчайшие верные решения в две строки предложили все: @Python3k, @v1ktoriia_romanova, @leo5051, @lomserman, @vsugoyak, @sidor0912, @ganrre.
#задача
@zen_of_python
❤5🍌2😍1🍾1