Первый метод: sorted(..., key = len) Второй метод: from collections import Counter Третий метод: len([s for s in text if s in ".,/';][ и так далее]). Это если без гугла, а гугл показывает, что есть ещё метод "s.isalnum()", который ещё гораздо все упрощает Четвертый метод: сделать список words с помощью split(), потом ", ".join(w for w in words if w == w[::-1])
В такого рода задачках лучше проговорить подход, а не бросаться сразу решать. Думаю, Андрей мог бы дать наводки, которые позволили задачку решить быстрее и правильно. В целом, посоветовал бы человеку взять один-два популярных питоновских курсов на степике, чтобы руку набить. И немного литкода порешать, можно изичные задачки.
Ну, весьма противоречивые чувства. Скажем так: если выкинуть все минусы и ошибки вида off-by-one, то я бы сказал что-то типа "+-". Из минусов: 1. Питона она не знает. Прям совсем. Банальный сплит решил бы много проблем. 2. В скрипте бесконечный цикл - поэтому не было ошибок в ассертах - функция просто не завершилась. 3. isalpha() - проверяет: буква или нет. То есть, все цифры попадут в счетчик спецсимволов. 4. Проверка на палиндром в целом не рабочая: и регистр может быть разный, и цифры могут быть. 5. Использование 2 while это, конечно, можно, но внутренний словит IndexError, если строка будет заканчиваться на спецсимволах. 6. Также циклы некорректно отработают в случае вида "word, word, word" - k будет указывать на пробел, в итоге след. слово будет не "word", а " word". Ну и нет обработки граничный условий (последнее слово). В целом, вроде бы логика и рассуждения есть. Изучить Питон, порешать алгосы - и будет норм, КМК.
А я вот думаю шта пехона не знаешь ты. Давай сплитани мне вот такую строку по словам "cat^$,*89home,9843r2**@ggg#$*(Long(@9,8025--" И да способ разбить одной строкой есть, но это регекспы
Я считаю она молодец. В условии стресса не плохо так сообразила, логика работает, а руку постепенно набьет. Я вот как решила. Я только начинаю программировать, поэтому не судите строго. class Text: def __init__(self, text): self.text = text def list_words(self): # Normalize text: lowercase and split into words words = re.findall(r'\b\w+\b', self.text.lower()) # Remove empty strings that may result from the split words = [word for word in words if word] return words def longest_word(self): words = self.list_words() return max(words, key=len) if words else None def most_frequent_word(self): words = self.list_words() count_words = {} for word in words: if word in count_words: count_words[word] += 1 else: count_words[word] = 1 # Find the word with the highest frequency most_frequent = None max_count = 0 for word, count in count_words.items(): if count > max_count: max_count = count most_frequent = word return most_frequent def spec_symbols(self): list_symbols = [".", "!", ":", ","] count = sum(1 for symbol in self.text if symbol in list_symbols) return count def palindrom(self): words = self.list_words() list_palindrom = [word for word in words if len(word) > 1 and word == word[::-1]] return list_palindrom
Прикол, найти самое длинное слово, а она находит длину.😅 И Андрея это не смутило. Проверка палиндрома уходит в бесконечный цикл. Неужели сложно запустить код?
Важное качество для программиста - читать сообщения об ошибках. Меня больше всего шокировало, что простая ошибка "TypeError: < не поддерживается для int и range" вызвала не очевидный поиск тривиальной ошибки уровня опечатки, а какие-то жонглирования с типом Exception при валидации параметра, перемещением этой проверки и т.п. - вообще в другом месте. Сразу в строку с ошибкой разве нельзя посмотреть - всё же подсвечивается?
Всем привет, вчера проходила второе техническое собеседование в жизни. Готовилась по материалам, по которым училась, такого рода видео, про решала задачи такого рода. На собеседование спросили что под капотом асинхронности, под капотом джанго и алгоритмы. В общем успешно провалила собеседование. При чем собесудющий знал, что только закончила курсы. 😅😅😅 Вывод ещё учиться и учиться.
@@AndyProninа можно мне попробовать? Эти задачи я за 30 мин решил, первая и последняя в одну строку. Библиотеки re и Counter. Еще C знаю на базовом. Делаю проекты на ардуино под ключ
я бы написал функцию которая решает одновременно все задачи и записывает их решение в атрибуты класса, и если значение атрибута класса пустое - то вызывать эту функцию в первый и последний раз). Тогда для решения всех задач нужно только один раз пройтись по каждому элементу text, и каждый раз при вызове какого-то метода не нужно будет заново считать
Не совсем понял твою идею (интересно было бы посмотреть код), но вопрос такой: а когда упадет какой-то кусок с решением определенной задачи, как будешь фиксить? При добавлении новых задач функция разрастется на сотни строк кода, как поддерживать будешь? И очень хотелось бы посмотреть на юнит-тесты! :)
Добавлю со стороны ООП клацальщика: не показала знания по ООП - их очень мало тут, если делать то красиво - сделать слоты, проперти исключив сеттер и делетер, закрывать обработку текста от юзера, точнее ее механику, плюс реализовать магию перебора и обработку входа с обработкой текста внутри с ходу при создании экземпляра, это своего рода сплиты и стрипы (если конечно же не пишем голый алгос), к тому же - если переменные типа греческого алфавита то аннотировать их хотя бы или же если функция на первый взгляд непонятна по названию и функционалу - писать докстроку. На это уйдет не так много времени на все это, тем более ты показываешь свою грамотность и демонстрируешь свою практику абы глаз радуется и грузить неохота, но положительно все же отмечу: то что с ходу понимает концепцию решения задачи это конечно плюс, однако, однако... как говорится - необходимый но недостаточный в целом. Аллес
Зачем тут вообще трогать слоты, делиттер и сеттер? Самое что, это невнимательность чтения условия!!! Запрос был на вывод слов, а выводилась длина слова!
Ну, "слоты, проперти исключив сеттер и делетер" - это оверинжиниринг, как по мне. Тут, КМК, достаточно скрыть text в __text. А вот что реально стоило бы сделать - вынести в отдельный метод разбиение текста на слова и записать слова в какой-нибудь приватный метод - в целях переиспользования.
@@Konstantin_Stalnov так Андрей же задал вопрос, что будет если в переменную текст занесут что попало. Сеттер позволит проводить валидацию на любом этапе изменения этой переменной.
@@cyber_engine Ааа теперь понятно, почему моё решение назвал говном, да ты сам чувак говнокодер, если так уверен, что это гуд уровень, тьфу на тебя, ещё один микротик)))
На таких собесах когда еще и запись идет можно сильно переволноваться, что у меня собственно и было, поэтому какие-то глупые ошибки точно можно простить. Накидал за несколько минут решение задачки, чтобы сравнить с тем что получилось в итоге, но не ожидал что девушка будет все вот так прямо решать. В любом случае молодец, но над базой надо работать это факт. Мое решение за 5 мин на коленке, может где-то ошибся, особо его не тестировал, просто то что сходу пришло: from collections import Counter import string class Text: def __init__(self, text:str): self.txt = text self.words = [i.strip() for i in self.txt.split()] def longest(self): return sorted(self.words, key = len)[-1] def more_used(self): return max(Counter(self.words)) def special_symbols(self): return len(list(filter(lambda x: x in string.punctuation, self.txt))) def polindroms(self): l = [] for i in self.words: if i == i[::-1] and i.isalpha(): l.append(i) return ','.join(l)
после того, как она посчитала, что for перебирает в тексте слова, хотя оно перебирает одиночные символы, можно выключать.
Первый метод:
sorted(..., key = len)
Второй метод:
from collections import Counter
Третий метод:
len([s for s in text if s in ".,/';][ и так далее]). Это если без гугла, а гугл показывает, что есть ещё метод "s.isalnum()", который ещё гораздо все упрощает
Четвертый метод:
сделать список words с помощью split(), потом ", ".join(w for w in words if w == w[::-1])
У тебя решения первого и четвертого метода ломаются на факте того, что в конце слова может быть поставлена запятая или иной символ
В такого рода задачках лучше проговорить подход, а не бросаться сразу решать. Думаю, Андрей мог бы дать наводки, которые позволили задачку решить быстрее и правильно.
В целом, посоветовал бы человеку взять один-два популярных питоновских курсов на степике, чтобы руку набить. И немного литкода порешать, можно изичные задачки.
В первом методе чеки не прошли. Оно зависло на while навечно :) while - опасная штука ))
Андрей, Елена спасибо🙏
Ну, весьма противоречивые чувства.
Скажем так: если выкинуть все минусы и ошибки вида off-by-one, то я бы сказал что-то типа "+-".
Из минусов:
1. Питона она не знает. Прям совсем. Банальный сплит решил бы много проблем.
2. В скрипте бесконечный цикл - поэтому не было ошибок в ассертах - функция просто не завершилась.
3. isalpha() - проверяет: буква или нет. То есть, все цифры попадут в счетчик спецсимволов.
4. Проверка на палиндром в целом не рабочая: и регистр может быть разный, и цифры могут быть.
5. Использование 2 while это, конечно, можно, но внутренний словит IndexError, если строка будет заканчиваться на спецсимволах.
6. Также циклы некорректно отработают в случае вида "word, word, word" - k будет указывать на пробел, в итоге след. слово будет не "word", а " word". Ну и нет обработки граничный условий (последнее слово).
В целом, вроде бы логика и рассуждения есть. Изучить Питон, порешать алгосы - и будет норм, КМК.
давай солидарны будем: это пока что в реале доподготовка, но не оффер)
Вы сеньор? 😮
Акелла промахнулся, походу (
@@AndyPronin, ну, не на постоянной же основе без ошибок жить.
А я вот думаю шта пехона не знаешь ты. Давай сплитани мне вот такую строку по словам "cat^$,*89home,9843r2**@ggg#$*(Long(@9,8025--" И да способ разбить одной строкой есть, но это регекспы
А можно мне себя предложить на вакансию?
Я считаю она молодец. В условии стресса не плохо так сообразила, логика работает, а руку постепенно набьет. Я вот как решила. Я только начинаю программировать, поэтому не судите строго.
class Text:
def __init__(self, text):
self.text = text
def list_words(self):
# Normalize text: lowercase and split into words
words = re.findall(r'\b\w+\b', self.text.lower())
# Remove empty strings that may result from the split
words = [word for word in words if word]
return words
def longest_word(self):
words = self.list_words()
return max(words, key=len) if words else None
def most_frequent_word(self):
words = self.list_words()
count_words = {}
for word in words:
if word in count_words:
count_words[word] += 1
else:
count_words[word] = 1
# Find the word with the highest frequency
most_frequent = None
max_count = 0
for word, count in count_words.items():
if count > max_count:
max_count = count
most_frequent = word
return most_frequent
def spec_symbols(self):
list_symbols = [".", "!", ":", ","]
count = sum(1 for symbol in self.text if symbol in list_symbols)
return count
def palindrom(self):
words = self.list_words()
list_palindrom = [word for word in words if len(word) > 1 and word == word[::-1]]
return list_palindrom
Где она работу находила? Я все задачи за полчаса написал.
Первая и последняя решаются в одну строку.
Регулярку и счетчик из коллекции использовал
Эх, прям себя увидел, 🙂 спасибо за собес 🤝
Прикол, найти самое длинное слово, а она находит длину.😅 И Андрея это не смутило. Проверка палиндрома уходит в бесконечный цикл. Неужели сложно запустить код?
Л - лоялити
Важное качество для программиста - читать сообщения об ошибках. Меня больше всего шокировало, что простая ошибка "TypeError: < не поддерживается для int и range" вызвала не очевидный поиск тривиальной ошибки уровня опечатки, а какие-то жонглирования с типом Exception при валидации параметра, перемещением этой проверки и т.п. - вообще в другом месте. Сразу в строку с ошибкой разве нельзя посмотреть - всё же подсвечивается?
Всем привет, вчера проходила второе техническое собеседование в жизни. Готовилась по материалам, по которым училась, такого рода видео, про решала задачи такого рода. На собеседование спросили что под капотом асинхронности, под капотом джанго и алгоритмы. В общем успешно провалила собеседование. При чем собесудющий знал, что только закончила курсы. 😅😅😅 Вывод ещё учиться и учиться.
Что не убьёт, то сделает сильнее
@@AndyProninа можно мне попробовать? Эти задачи я за 30 мин решил, первая и последняя в одну строку. Библиотеки re и Counter. Еще C знаю на базовом. Делаю проекты на ардуино под ключ
@@ВасилийБаритонов-щ5ы в телеграмме розыгрыши время от времени проводятся. Участвуй и получится
я бы написал функцию которая решает одновременно все задачи и записывает их решение в атрибуты класса, и если значение атрибута класса пустое - то вызывать эту функцию в первый и последний раз). Тогда для решения всех задач нужно только один раз пройтись по каждому элементу text, и каждый раз при вызове какого-то метода не нужно будет заново считать
Не совсем понял твою идею (интересно было бы посмотреть код), но вопрос такой: а когда упадет какой-то кусок с решением определенной задачи, как будешь фиксить? При добавлении новых задач функция разрастется на сотни строк кода, как поддерживать будешь? И очень хотелось бы посмотреть на юнит-тесты! :)
Вместо .isalpha() лучше использовать .isalnum(), так как числа могут быть палиндромами (101, 2442, 333333 и т.д.)
да. согласен
@@AndyPronin А я не согласен, с таким подходом '7a7a7a7a7a7a7a7a' может быть самым длинным словом, а это не слово :)
@@vitaliy3521 ах жеж ты же)
Похоже оба профнепригодные. Как можно не заметить, что программа в бесконечном цикле повисла?
Ага
Андрей просто не такой душнила, как в чате ))
У меня, как у чайника, есть вопрос, если кто ответит буду благодарен. split, strip почему не использовали?
Патамушта
Я бы пошутил про women, но тут почти все такие выпускники яп))
А что это за голодные игры? и еще вопрос , там функциональной парадигме учат у вас?
t.me/UA-camPronin/41113
То-то фамилия знакомая. Моя студентка это.
Добавлю со стороны ООП клацальщика: не показала знания по ООП - их очень мало тут, если делать то красиво - сделать слоты, проперти исключив сеттер и делетер, закрывать обработку текста от юзера, точнее ее механику, плюс реализовать магию перебора и обработку входа с обработкой текста внутри с ходу при создании экземпляра, это своего рода сплиты и стрипы (если конечно же не пишем голый алгос), к тому же - если переменные типа греческого алфавита то аннотировать их хотя бы или же если функция на первый взгляд непонятна по названию и функционалу - писать докстроку. На это уйдет не так много времени на все это, тем более ты показываешь свою грамотность и демонстрируешь свою практику абы глаз радуется и грузить неохота, но положительно все же отмечу: то что с ходу понимает концепцию решения задачи это конечно плюс, однако, однако... как говорится - необходимый но недостаточный в целом. Аллес
Зачем тут вообще трогать слоты, делиттер и сеттер?
Самое что, это невнимательность чтения условия!!!
Запрос был на вывод слов, а выводилась длина слова!
@@Konstantin_Stalnov чего ты заводишься? я же написал от себя потому что до меня уже по работе кода дали основные ошибки, марку держу как никак)
@@furiousrunner4388 нет, я вообще норм! Просто рассуждаю! Уважаю мнение всех! Без наезда!
Ну, "слоты, проперти исключив сеттер и делетер" - это оверинжиниринг, как по мне.
Тут, КМК, достаточно скрыть text в __text.
А вот что реально стоило бы сделать - вынести в отдельный метод разбиение текста на слова и записать слова в какой-нибудь приватный метод - в целях переиспользования.
@@Konstantin_Stalnov так Андрей же задал вопрос, что будет если в переменную текст занесут что попало. Сеттер позволит проводить валидацию на любом этапе изменения этой переменной.
По самому длинному слову
У вас бесконечный цикл.
По этой причине и тесты якобы прошли все
max(arr, key=len/count) вот решение…
Вспомнить max в режиме с колёс не так просто, мне кажется
@@AndyPronin но спускаться на уровень писания на сях это не ответ. Ответ , я думаю, подумать.
Тем более что делать в таком случае со словами с апострофом вовнутрях типа isn't
@@НиколайРюмин-й6и зато показала что она на сях писать умеет. уже умнее среднестатистического питонизта :3
@@cyber_engine Ааа теперь понятно, почему моё решение назвал говном, да ты сам чувак говнокодер, если так уверен, что это гуд уровень, тьфу на тебя, ещё один микротик)))
18:18 Чуть со стула не упал, зачем так кричать.
Первый получается
Душные комментаторы такие.
Девушка молодец, но есть над работать.
Да не, без знаний С она непригодна
Да ей на заводе место
На таких собесах когда еще и запись идет можно сильно переволноваться, что у меня собственно и было, поэтому какие-то глупые ошибки точно можно простить. Накидал за несколько минут решение задачки, чтобы сравнить с тем что получилось в итоге, но не ожидал что девушка будет все вот так прямо решать. В любом случае молодец, но над базой надо работать это факт.
Мое решение за 5 мин на коленке, может где-то ошибся, особо его не тестировал, просто то что сходу пришло:
from collections import Counter
import string
class Text:
def __init__(self, text:str):
self.txt = text
self.words = [i.strip() for i in self.txt.split()]
def longest(self):
return sorted(self.words, key = len)[-1]
def more_used(self):
return max(Counter(self.words))
def special_symbols(self):
return len(list(filter(lambda x: x in string.punctuation, self.txt)))
def polindroms(self):
l = []
for i in self.words:
if i == i[::-1] and i.isalpha():
l.append(i)
return ','.join(l)
Вы трансгендерной ориентациия?