CodeWars #1
Если вы хотите прокачаться во владении каким-либо языком программирования, параллельно прокачаться в алгоритмах, структурах данных и т.д., то вы можете воспользоваться различными сервисами, предлагающими такие задачи.
Например, CodeWars. Выбираете язык, сложность, и вперед. Есть еще LeetCode, HackerRank.
Когда-то я решал задачки на CodeWars, но потом надоело. Возможно, было бы неплохо снова к этому вернуться, чтобы заставить мозг поработать.
На сегодня предлагаю решение одной из задач.
Задача: Написать функцию, которая принимает массив из слов и склеивает их вместе в предложение, возвращая его. Нет необходимости проверять правильность строк со словами, очищать их, или добавлять пунктуацию, но вы должны добавить пробелы между словами. Будьте осторожны, пробелов в начале и конце предложения быть не должно!
Решение:
Самым банальным решением для такого сценария было бы написать цикл, однако в питоне у строки есть метод join(), который может принять в качестве аргумента список, и "склеить" элементы между собой, используя строку, на которой join был вызван.
Используем это. По-хорошему, мы должны проверить, что переданный нам аргумент является списком, и что он не пуст.
Для этого, во-первых, используем функцию isinstance(), она принимает два аргумента. Первый - объект какого-то типа, второй - тип, на соответствие которому мы хотим проверить объект. Функция вернет True если тип совпадет, и False, если нет. Также мы проверим, что список не пустой. В Python пустой список автоматически приводим к False, что исключает необходимость проверять на пустоту путём сравнения длины списка с нулём.
Итоговая функция на картинке к посту.
#codewars #python
Если вы хотите прокачаться во владении каким-либо языком программирования, параллельно прокачаться в алгоритмах, структурах данных и т.д., то вы можете воспользоваться различными сервисами, предлагающими такие задачи.
Например, CodeWars. Выбираете язык, сложность, и вперед. Есть еще LeetCode, HackerRank.
Когда-то я решал задачки на CodeWars, но потом надоело. Возможно, было бы неплохо снова к этому вернуться, чтобы заставить мозг поработать.
На сегодня предлагаю решение одной из задач.
Задача: Написать функцию, которая принимает массив из слов и склеивает их вместе в предложение, возвращая его. Нет необходимости проверять правильность строк со словами, очищать их, или добавлять пунктуацию, но вы должны добавить пробелы между словами. Будьте осторожны, пробелов в начале и конце предложения быть не должно!
Решение:
Самым банальным решением для такого сценария было бы написать цикл, однако в питоне у строки есть метод join(), который может принять в качестве аргумента список, и "склеить" элементы между собой, используя строку, на которой join был вызван.
",".join([1,2,3]) # 1,2,3
Используем это. По-хорошему, мы должны проверить, что переданный нам аргумент является списком, и что он не пуст.
Для этого, во-первых, используем функцию isinstance(), она принимает два аргумента. Первый - объект какого-то типа, второй - тип, на соответствие которому мы хотим проверить объект. Функция вернет True если тип совпадет, и False, если нет. Также мы проверим, что список не пустой. В Python пустой список автоматически приводим к False, что исключает необходимость проверять на пустоту путём сравнения длины списка с нулём.
Итоговая функция на картинке к посту.
#codewars #python
👍1
CodeWars #2
Продолжаем решать задачи с CodeWars.
Сегодня у нас простая задача: дан список целых чисел и наша задача в том, чтобы найти минимальное число из массива.
Например:
Дан список [34, 15, 88, 2], мы должны вернуть 2.
Дан список [34, -345, -1, 100], мы должны вернуть -345.
Список на пустоту можно не проверять.
В стандартной библиотеке Python предусмотрены различные функции, в том числе математические. В частности есть функции min() и max() для поиска минимального и максимального значения в списке. Функцией min() мы и воспользуемся. Наше решение будет простым, и лаконичным.
#codewars #python
Продолжаем решать задачи с CodeWars.
Сегодня у нас простая задача: дан список целых чисел и наша задача в том, чтобы найти минимальное число из массива.
Например:
Дан список [34, 15, 88, 2], мы должны вернуть 2.
Дан список [34, -345, -1, 100], мы должны вернуть -345.
Список на пустоту можно не проверять.
В стандартной библиотеке Python предусмотрены различные функции, в том числе математические. В частности есть функции min() и max() для поиска минимального и максимального значения в списке. Функцией min() мы и воспользуемся. Наше решение будет простым, и лаконичным.
def find_smallest_int(arr):
return min(arr)
#codewars #python
👍1
Python для троллинга Java\C#\PHP разработчиков
Как известно, объектно-ориентированное прогаммирование, позволяет создавать объекты, вступающие друг с другом в отношения родитель-наследник.
Например:
Здесть класс BlackCat будет наследником по отношению к классу Cat. Зачем это нужно? Во-первых, на основе наследования легко работать с дополнением. Нам не нужно полностью копировать класс Cat, чтобы добавить в него что-то новое. Мы можем наследоваться от него.
В языках со строгой системой типов вы уже на этапе компиляции получите ошибку, если передадите объект не того типа в метод или функцию. Python же язык с достаточно специфическим отношением к типобезопасности, и, хотя тайп-хинты (возможность указать, что вот в эту функцию вот этим аргументом передайте, пожалуйста, вот такой вот тип) существуют, ничто не мешает творить непотребства.
В частности, в Python, для проверки является ли некоторый наследником по отношению к другому типу, можно использовать функцию issubclass(). Она принимает два аргумента - проверяемый на родство тип, и предполагаемый родитель.
Пример 1:
Пример 2:
Собственно в Python есть возможность переопределить это поведение с помощью специального метода subclasshook, реализуемого в родительском классе.
Пример 3:
Спасибо, Гвидо, что дал нам возможность жирно потроллить джавистов!
#python
Как известно, объектно-ориентированное прогаммирование, позволяет создавать объекты, вступающие друг с другом в отношения родитель-наследник.
Например:
class Cat:
pass
class BlackCat(Cat):
pass
Здесть класс BlackCat будет наследником по отношению к классу Cat. Зачем это нужно? Во-первых, на основе наследования легко работать с дополнением. Нам не нужно полностью копировать класс Cat, чтобы добавить в него что-то новое. Мы можем наследоваться от него.
В языках со строгой системой типов вы уже на этапе компиляции получите ошибку, если передадите объект не того типа в метод или функцию. Python же язык с достаточно специфическим отношением к типобезопасности, и, хотя тайп-хинты (возможность указать, что вот в эту функцию вот этим аргументом передайте, пожалуйста, вот такой вот тип) существуют, ничто не мешает творить непотребства.
В частности, в Python, для проверки является ли некоторый наследником по отношению к другому типу, можно использовать функцию issubclass(). Она принимает два аргумента - проверяемый на родство тип, и предполагаемый родитель.
Пример 1:
class Cat:
pass
class Dog:
pass
issubclass(Dog, Cat) # False - Собака не наследует кошку
Пример 2:
class Cat:
pass
class Dog(Cat):
pass
issubclass(Dog, Cat) # True - собака воспитана кошками
Собственно в Python есть возможность переопределить это поведение с помощью специального метода subclasshook, реализуемого в родительском классе.
Пример 3:
from abc import ABC
class Cat(ABC):
def __subclasshook__(cls, *agrs):
print(cls)
return True
class Dog:
pass
issubclass(Dog, Cat) # True
issubclass(int, Cat) # True - видели когда-нибудь целочисленных кошек?
Спасибо, Гвидо, что дал нам возможность жирно потроллить джавистов!
#python
😁2
CodeWars #3
Решаем следующую задачу: нужно подсчитать количество гласных в строке, которая нам дана в качестве аргумента. Считаем, что символы a, e, i, o, u это гласные. Входная строка будет состоять из символов в нижнем регистре (это важно, потому что в некоторых случаях требуется данные привести к какому-то виду) и пробелов.
Задача достаточно простая - берем список гласных, идем циклом по строке (да-да, по строкам в Python можно ходить циклом, на каждой итерации мы получаем следующий символ), проверяем входит ли очередной символ в список искомых. Если да - инкрементируем счетчик.
А можно ли лаконичнее? Да!
Здесь использован так называемый list comprehension - специальный синтаксис, который позволяет в одну строчку кода описать создание последовательности. Базово, он состоит из выражения
Здесь x - это переменная цикла, которая заполняется значением из последовательности inputStr. На выходе у такого выражения будет список из всех элементов, что были в inputStr. По ходу пьесы x можно модифицировать.
Соответственно, как и в теле цикла, в list comprehension можно дописывать условие, чтобы отбраковать те элементы, которые нам не нужны. Делается это с помощью if.
Таким образом, выражение из второго примера даст нам список символов, которые точно входят в интересующий нас диапазон (aeoiu).
Остается взять его длину с помощью функции len(), и вернуть. Кстати, знаете, почему значение, возвращенное функцией len() не проверяется на равенство с нулём, а просто возвращается как есть? Дело, опять же, в системе типов. Ноль приводится к False для целых чисел, все остальное - к True. Да и сами константы True и False в Python это целые числа. True = 1, False = 0. Поэтому выражение 1 + True будет равно 2.
#codewars #python
Решаем следующую задачу: нужно подсчитать количество гласных в строке, которая нам дана в качестве аргумента. Считаем, что символы a, e, i, o, u это гласные. Входная строка будет состоять из символов в нижнем регистре (это важно, потому что в некоторых случаях требуется данные привести к какому-то виду) и пробелов.
Задача достаточно простая - берем список гласных, идем циклом по строке (да-да, по строкам в Python можно ходить циклом, на каждой итерации мы получаем следующий символ), проверяем входит ли очередной символ в список искомых. Если да - инкрементируем счетчик.
def get_count(sentence):
# Список гласных букв
vowels = ["a", "e", "i", "o", "u"]
# Счетчик, инициализируем нулём
count = 0
# Цикл по строке, допустим для строки `hello` тело цикла выполнится пять раз
# На каждой итерации в переменной letter будет буква из строки
# Сначала h, потом e, потом l, и т.д.
for letter in sentence:
# Оператор in проверяет вхождение элемента letter в список vowels
# Если элемент присутствует - тело if выполнится
if letter in vowels:
# Инкрементируем (увеличиваем на 1) наш счетчик
count += 1
# Возвращаем значение счетчика
return count
А можно ли лаконичнее? Да!
def get_count(inputStr):
return len([x for x in inputStr if x in 'aeoiu'])
Здесь использован так называемый list comprehension - специальный синтаксис, который позволяет в одну строчку кода описать создание последовательности. Базово, он состоит из выражения
[x for x in inputStr]
Здесь x - это переменная цикла, которая заполняется значением из последовательности inputStr. На выходе у такого выражения будет список из всех элементов, что были в inputStr. По ходу пьесы x можно модифицировать.
digits = [1,2,3,4]
# Квадраты чисел в digits, операция ** (две звездочки) - возведение в степень
squares = [x**2 for x in digits]
Соответственно, как и в теле цикла, в list comprehension можно дописывать условие, чтобы отбраковать те элементы, которые нам не нужны. Делается это с помощью if.
digits = [1,2,3,4]
# Квадраты чисел в digits, операция ** (две звездочки) - возведение в степень
# В блоке if мы отбираем x только если он четный (% - остаток от деления, если он равен нулю - берем)
squares = [x**2 for x in digits if x % 2 == 0]
Таким образом, выражение из второго примера даст нам список символов, которые точно входят в интересующий нас диапазон (aeoiu).
[x for x in inputStr if x in 'aeoiu']
Остается взять его длину с помощью функции len(), и вернуть. Кстати, знаете, почему значение, возвращенное функцией len() не проверяется на равенство с нулём, а просто возвращается как есть? Дело, опять же, в системе типов. Ноль приводится к False для целых чисел, все остальное - к True. Да и сами константы True и False в Python это целые числа. True = 1, False = 0. Поэтому выражение 1 + True будет равно 2.
#codewars #python
👍1
Codewars #4
Создайте функцию, которая вернет сумму двух наименьших неотрицательных чисел из предоставленного списка, в котором будут минимум 4 элемента. Гарантируется, что в массиве будут только целые положительные числа.
Пример: для списка [19, 5, 42, 2, 77] функция вернет 7 (5 + 2).
Итак, у нас есть функция:
И мы точно знаем, что numbers - это список. Но мы не знаем какие два элемента будут наименьшими. Кроме того непонятно будут ли повторения - но так, как в примере их не было, не будем принимать их во внимание. Решение "в лоб" - перебор с помощью циклов.
Примерно так, в первом цикле мы берем первый элемент, и далее сравниваем его со всеми последующими. Если мы видим, что следующий элемент меньше предыдущего - то берем уже его. Для поиска второго элемента делаем то же самое, только сравниваем еще и с первым. Способ рабочий, но громоздкий и долгий.
Есть решение лучше - сортировка! Отсортируем список по возрастанию и просто вернем сумму двух первых элементов!
#codewars #python
Создайте функцию, которая вернет сумму двух наименьших неотрицательных чисел из предоставленного списка, в котором будут минимум 4 элемента. Гарантируется, что в массиве будут только целые положительные числа.
Пример: для списка [19, 5, 42, 2, 77] функция вернет 7 (5 + 2).
Итак, у нас есть функция:
def sum_two_smallest_numbers(numbers):
pass
И мы точно знаем, что numbers - это список. Но мы не знаем какие два элемента будут наименьшими. Кроме того непонятно будут ли повторения - но так, как в примере их не было, не будем принимать их во внимание. Решение "в лоб" - перебор с помощью циклов.
first_num = 0
second_num = 0
for i in numbers:
if not first_num:
first_num = i
if first_num < i:
first_num = i
for i in numbers:
if not second_num:
second_num = i
if second_num >= first_num and second_num < i:
second_num = i
Примерно так, в первом цикле мы берем первый элемент, и далее сравниваем его со всеми последующими. Если мы видим, что следующий элемент меньше предыдущего - то берем уже его. Для поиска второго элемента делаем то же самое, только сравниваем еще и с первым. Способ рабочий, но громоздкий и долгий.
Есть решение лучше - сортировка! Отсортируем список по возрастанию и просто вернем сумму двух первых элементов!
def sum_two_smallest_numbers(numbers):
numbers = sorted(numbers)
return numbers[0] + numbers[1]
#codewars #python
👍1