Захожу на Codewars, ставлю сложность 6-5 kyu, но некоторые задачи вообще не могу решить, хотя они кажутся максимально легкими. Когда я смотрю решение, все моментально понимаю, но самостоятельно решить задачу среднего уровня не получается. Читать книги или просто пытаться решать как можно больше?
Я тоже был на коде-варсе только для прокачки Scala. А если переключаюсь на Python
то там стоит 6 ky. Покажи пример задачи 5 уровня которую ты не смог решить.
С позволения хабра я перепечатаю текст задания ну русском.
ОПИСАНИЕ:
Дан массив целых чисел, найдите то, которое встречается нечетное количество раз.
Всегда будет только одно целое число, которое встречается нечетное количество раз.
[1,2,2,3,3,3,4,3,3,3,2,2,1] - вернет 4 потому что 4 встречается нечетное число раз.
Что скажете друзья? Решение может быть таким. Находим пары. И синхронно удаляем.
[1,2,2,3,3,3,4,3,3,3,2,2,1]
[1,3,3,3,4,3,3,3,2,2,1]
[1,3,4,3,3,3,2,2,1]
[1,3,4,3,2,2,1]
[1,3,4,3,1]
тут я-бы сортировал
[1,1,3,3,4]
[3,3,4]
[4]
с математикой тоже небольшие траблы, мб есть способ развить мышление такого типа
математика здесь не причем. И хотя на codewars есть математические задачи. Но все таки
большее число задач - инженерные. Ну они как-бы даже на смекалку. Они не требуют
интегралов или каких-то численных методов. По сути все это игры со структурами данных.
Строки. Хеш-таблицы. Массивы. Сортировки и поиски. Вот реально все крутиться вокруг этого.
Как развить такое мышление? Только практические решая подобные задачи. У меня был друг
которые серьезно готовился к олимпиадам. Он брал решебники по математике. И с утра садился
и до обеда просто прорешивал задачи. Сначала у него плохо шло. Потом все быстрее и быстрее.
И уже к олимпиаде он их решал как семечки. Есть еще Leetcode. CodeGolf. Да много всяких
песочниц. Для меня самая лучшая песочница - это хабр. Rsdn, Cyberforum e.t.c. Место где есть
живые люди. Где есть дискурс. Потому что от коде-варс я немного выгораю. Там можно увидеть
образцы решений только после того как сам решил.
GavriKos, а вот чорт его знает. Я честно скажу что я даже не интересовался. Мне был безразлична эта
прокачка кармы. Я просто хотел войти-в-scala как можно быстрее. Причем меня интересовали все эти
хвостовые рекурсии и игры с коллекциями больше чем сами задачи. Тупо тренировочный стенд.
За что мне нравиться Python? За то, что на нем такие задачи решаются в четыре строки кода.
lst=[1,2,2,3,3,3,4,3,3,3,2,2,1]
while len(lst)>0:
if lst.count(lst[0])%2 != 0:
print (lst[0])
break
else:
lst = list(filter(lambda x: x != lst[0], lst))
Если filter и прочие lambda еще не изучали, то последнюю строку можно заменить на lst = [i for i in lst if i != lst[0]]
Перед началом кода надо бы еще для красоты поставить условие:
if len(lst)%2 ==0:
print('Такого элемента нет!')
Но я не знаю, требуется это на обозначенном сайте или нет.
logitechf, Представьте, что у вас в seq 2001 элемент. 1000 раз повторяется "0", 1000 раз повторяется "1" и один раз повторяется "2". Ваш оператор if будет отрабатывать 2001 раз, каждый раз подсчитывая количество соответствующих элементов. Хотя надо-бы по уму - только 3 раза. Оценка алгоритма и есть один из навыков "алгоритмического мышления".
Сортировка и удаление пар - это просто концепт который я предложил. Я пока не думал
о производительности. В любом случае если мы хотим решать задачу эффективно в плане ресурса -
мы должны знать об ограничениях на input.
Например в олимпиадных задачах часто пишут что даны целые числа не больше 1000 или не больше 1000 000
и дальше олипмиадник когда пишет код на Паскале или Delphi имеет в голове расклад. В какие регистры
можно положить. Если задачи на длинные целые (криптография) то там целых явно не хватит и итерационные
алгортмы сдохнут не сделав еще миллиарда итераций. Тоесть надо внедрять структуры данных (Б-дерево или
хеш-табличка) чтобы уйти от полного перебора.
Еслибы я знал что кардинальность этой выборки мала - тогда можно завести массив счетчиков. И пробежав
по ним - быстро оценить какая величина имеет нечетный счет. Если кардинальность мала - но велик разброс
по диапазону чисел (long) тогда вместо массива счетчиков - можно взять хеш-табличку счетчиков.
Если массив - очень велик и все числа очень большие и встречаются по 1 или по 2 раза - то я-бы отсортировал
и нашел пары очень быстро.
В случае с хеш-табличкой и массивом кстати нам даже не нужен счетчик. Нам достаточно учета четности.
Счетчик по модулю 2 занимает 1 бит информации.
Вобщем путей для оптимизации - бесконечно много. Но это выходит за рамки постановок codewars.
mayton2019, Вы все написали правильно. Просто я увидев, что это задача аж шестого уровня сложности (ведь именно это и означает шестерка? ) а потом решение от автора на одну строку и метод count, и ваше более сложное, но более оптимальное решение с удалением просмотренных значений решил его еще немного "улучшить" пользуясь средствами Python. Но если там оптимизации не надо, тогда непонятно, в чем же там уровень 6 (сам я на этом сайте почему-то ;-) никогда не тренировался).
dmshar, кажется все стартуют с 8 уровня и идут к первому. Я побыл на codewars с одну неделю. Потом забросил на пол года. Как они оценивают уровни - непонятно. Скорее всео по общей статистике решений. Плюс еще там есть "Practice and Repeat" и "Rank up". Вот когда ты выбираешь повторения - то тебе дают задачки слабых уровней. Когда берешь повышение ранга - то тебе должны дать с 6 на 5 скорее всего. Проверь.
mayton2019, Не, я проверять это точно не буду :-). Думаю, моих знаний мне пока хватит. Оставлю сие занятие молодому поколению, познающему Python и прочие житейско-научные премудрости.
dmshar, ну про счетчики по модулю 2 это я точно не про Python писал. Это скорее про С++, Rust.
Python - конечно интересный но зело нетипизированный и жадный до мемори.
Мое предпочтение -> beecrowd.com.br
Здесь огромное количество заданий на различную тематику, причем писать можно не только на пайтоне, но и на практически любом другом.
Помню еще есть ресурс хороший -> py.checkio.org
Тут уже конкретно по пайтону, очень любил в свое время решать задачи именно там, вам тоже советую.