Программирование, Путешествия, Покер

Последний пост:1 апреля
810
Статистика
Всего постов
3225
844,802 просмотров
Новых постов
+0
1 в день
Лучшие посты автора
27.09.2022 +233
21.12.2019 +196
22.02.2023 +169
04.01.2023 +166
13.07.2019 +154
Лучшие посты читателей
inpace +111
justpus7 +98
vsobakekot +88
Gtrdy +85
s4ekotilla +78
Самые активные читатели
1 9 29 30 31 32 51 162
  • Я тебе скажу, что чтобы было эффективно, не обязательно вот так вот "мувить", жертвуя понятностью. Такой код, как у тебя - это жирнющий минус, тревожный сигнал для компании.
    Я тебе предлагаю написать функцию по подсчету числа вхождений. Как это влияет на эффективность? Напишешь с копированием, будет чуть медленнее, напишешь без - чуть быстрее. Единственный минус - вызвать " лишнюю" функцию два раза. Но это практически не значимо, это не какой-нибудь HFT, где важны микросекунды (и не нужна java).
    Ну и всегда приоритет такой, что код должен быть вначале написан максимально понятно. А потом ты посмотришь на производительность, если не устроит - будешь думать, как бы ускориться. И наверняка выйдет так, что тормозит сильнее всего не этот несчастный поиск подстроки в строке, а что-то совершенно другое.
    21/24
    Ответить Цитировать
    3
  • GAnd,
    Цитата (GAnd @ 15.8.2017)
    Как думаешь, на собеседовании лучше писать (если до этого дойдет) прямолинейный удобочитаемый код или можно применять "хитрые" решения

    Я думаю, что если бы кандидат написал приведенный тобой код для решения задачи, то наш разговор продлился бы недолго. Для новичков могу порекомедовать простое правило - один стейтмент (инструция) = одно действие. У тебя здесь 1 стеймент = хренова туча действий, в которых без 100 грамм не разберешься. И уж тем более, без описания задачи в жизнь не догадаешься, что должен делать этот код.
    Для примера мое решение этой же задачи (написано спустя где-то 4-5 месяцев изучения языка)
    public boolean catDog(String str) {
    int dogcount = 0;
    int catcount = 0;
    String dogstr = str;
    String catstr = str;
    while(dogstr.contains("dog")){
    dogstr = dogstr.replaceFirst("dog","");
    dogcount++;
    }
    while(catstr.contains("cat")){
    catstr = catstr.replaceFirst("cat","");
    catcount++;
    }
    if(dogcount == catcount) {
    return true;
    }
    return false;
    }

    Разумеется, оно тоже далеко от оптимального (можно упростить и сократить минимум в 2 раза), но уж точно куда понятнее.

    Цитата (GAnd @ 16.8.2017)
    современные реализации настолько хорошо оптимизируют выполнение кода, что скорость выполнения программы на разогретой java-машине не уступает нативному коду.

    Убогому коду никакие оптимизаторы не помогут.

    Далее
    Цитата (GAnd @ 16.8.2017)
    которое однозначно эффективнее стандартного решения

    Ну, откуда взялось это "стандартное" решение?) Я бы его таковым не назвал.

    По поводу различных замеров перфоманса и оптимизаций - об этом лучше вообще не думать, особенно если нету более глубоких знаний. Например,
    Цитата (GAnd @ 16.8.2017)
    при любом изменении строки создается новый объект (т.е. выделяется память, копируются данные и т.д.)

    Это не совсем так.

    Цитата (GAnd @ 16.8.2017)
    старой переменной присваивается ссылка на новый объект, в то время как старый "теряется" <...> и со временем будет уничтожен сборщиком мусора.

    Опять же, это не совсем корректно.

    Да и вообще, для проверки перформанса стоит использовать специально предназначенные для этого тулзы, например JMH.

    spaun, насколько я знаю, в стандартной библиотеке KMP нет. В сторонних наверняка можно найти при желании.
    251/1049
    Ответить Цитировать
    3
  • Недавно выпала свободная от обучения минутка, которую решил потратить на знакомство с питоном.
    Захожу в официальный туториал по языку, вижу там следующее:
    Цитата
    >>> 8 / 5 # division always returns a floating point number
    1.6


    Окей, запускаю интерпретатор у себя. И что я вижу?
    Цитата
    >>> 8/5
    1


    14007817843335.gif


    Оказалось, что в разных версиях питона даже банальное деление выдает разный результат. Туториал был для версии 3.6, а у меня установлена 2.7. После почти трех лет использования джавы увидеть такое было очень больно.
    Забавно - апгрейдишь версию языка и код начинает работать некорректно (а это еще хуже чем ошибки).
    Как питонисты вообще живут?
    252/1049
    Ответить Цитировать
    7
  • Наверно в каждом языке свои приколы :)
    У меня челюсть отвалилась, когда узнал, что в JS (99 == "99") возвращает true, равно как и другие сравнения типа (0==""), (true=="1") и что вообще вместо обычной boolean переменной можно подставить любую фигню)
    19/20
    Ответить Цитировать
    1
  • strkk, ну так они развиваются параллельно, ветка 2х и 3х, и везде все знают, что там нет обратной совместимости.

    P.S. Сам сейчас питон изучаю.
    6/129
    Ответить Цитировать
    4
  • Цитата (FlySoHigh @ 17.8.2017)
    У меня челюсть отвалилась, когда узнал, что в JS (99 == "99") возвращает true, равно как и другие сравнения типа (0==""), (true=="1") и что вообще вместо обычной boolean переменной можно подставить любую фигню)


    Именно поэтому там надо использовать оператор === (3 знака равенства), который проверяет в том числе и типы операндов. В таком случае перечисленные тобой выражения будут возвращать false.
    А вообще да, интерпретатор JS честно и максимально толерантно старается выполнить код, даже если ты пишешь полную хрень из серии 5 + true.
    Из серии "твой код - сам дурак".
    Looks+like+we+got+a+badass+over+here+_47ce4429e71abca7fcd268970de74305.jpeg


    Цитата (s4ekotilla @ 17.8.2017)
    ну так они развиваются параллельно, ветка 2х и 3х, и везде все знают, что там нет обратной совместимости.


    лолчто, две параллельные версии языка? Звучит как огромное поле для граблей.
    Ну все знают, а я вот не знал. И меня это очень сильно удивило.
    253/1049
    Ответить Цитировать
    2
  • strkk, по поводу простоты кода я уже понял, код из серии "смотрите, как я могу" лучше не показывать))

    Цитата
    Ну, откуда взялось это "стандартное" решение?) Я бы его таковым не назвал.

    Не имел в виду, что это прямо стандарт, просто именно оно предлагается в задаче по кнопке "See Our Solution".

    Цитата
    Это не совсем так.

    Этот ответ датирован 2010 годом, с тех пор кое что изменилось...

    Цитата
    Опять же, это не совсем корректно.

    Это, я думаю, справедливо только для литералов (захардкоденых в исходнике строк), хотя возможно, что в string pool попадают поголовно все строки, надо будет погуглить.
    6/10
    Ответить Цитировать
    1
  • Цитата (GAnd @ 17.8.2017)
    Этот ответ датирован 2010 годом, с тех пор кое что

    Да, действительно, у меня информация устаревшая :)
    Но есть и другие моменты. Например, многие забывают, что внутренняя реализация стринга не специфицирована. Что означает, что в случае использования другой JDK (например, от компании IBM, которая идет с вебсферой) он может быть реализован бог знает как.

    Короче говоря, слишком много переменных.

    Про уборку мусора - вроде как это только для литералов.
    Кстати, если брать в рассмотрение не только строки, но и другие объекты, то есть и исключительные случаи, когда мы не ссылаемся на объект, однако сборщик мусора удалить его не может.
    Сообщение отредактировал strkk - 18.8.2017, 0:25
    254/1049
    Ответить Цитировать
    0
  • Странно,я думал, что первое, что говорят при изучении питона, это как раз то, что есть питон2, а есть питон3, и не путайте, и мы с вами будем приверженцами такой-то версии.итак, начнём. а уж 3.2 или там 3.3 это неважно. ))
    а про boolean по мне так достаточно помнить "в этом языке всё что не ложь - то правда" и достаточно
    понятно, что null <> null и так далее. гораздо труднее запомнить как в каждом языке пишется "неравно" ))), != или <>.
    11/22
    Ответить Цитировать
    1
  • Цитата (GAnd @ 17.8.2017)
    ...
    Это, я думаю, справедливо только для литералов (захардкоденых в исходнике строк), хотя возможно, что в string pool попадают поголовно все строки, надо будет погуглить.


    Все-таки да, гугляндекс говорит, что в string pool попадают только литералы, вычисленные на этапе компиляции, кроме заданных через конструктор явно (String s = new String("abc")), а все строки, вычисленные в рантайме (как s = s1 + s2, только если s1 и s2 не final), всегда являются новыми объектами.
    Кроме того, любую строку можно явно поместить в string pool методом intern().
    7/10
    Ответить Цитировать
    0
  • Цитата (GAnd @ 18.8.2017)
    Кроме того, любую строку можно явно поместить в string pool методом intern().


    Опять же, это тоже не совсем верно) Смотрим джавадок метода - ты помещаешь туда строку только в том случае, если в пуле отсутствует такая же.
    Другими словами, этот метод возвращает тебе строку из пула строк, добавляя ее туда в случае отсутствия. Да, использование этого метода не рекомендуется, особенно на собесах :)
    255/1049
    Ответить Цитировать
    0
  • А в подобных задачах достаточно найти решение под конкретные данные или лучше общее?
    public boolean catDog (String str) {
    String a = str.replaceAll("cat", "");
    String b = str.replaceAll("dog", "");
    return (a.length() == b.length())? true : false;
    }
    6/14
    Ответить Цитировать
    0
  • Jumpman, Вообще, обычно всегда по умолчанию надо искать общее решение.
    По твоему варианту - не уверен, что оно будет корректно работать для произвольных строк, т.к. метод replaceAll принимает регулярное выражение в качестве первого параметра. Другими словами, если вместе cat будет что-то типа c*t, то работать будет некорректно.

    Ну и да, в return стейтменте скобки, вопросительный знак и все, что идет за ним - абсолютно лишнее, можно убрать спокойно)
    256/1049
    Ответить Цитировать
    1
  • функция называется же catDog, т.е. в данном случае не подразумевается обобщения :)
    22/24
    Ответить Цитировать
    0
  • Написал вчера портянку про собеседования, но потом отвлекли и я вырубил комп, забфв про пост. В итоге все удалилось.

    И телефон вчера уронил, разбив дисплей.

    Все тлен.
    257/1049
    Ответить Цитировать
    5
  • Сообщение отредактировал strkk - 23.8.2017, 23:37
    258/1049
    Ответить Цитировать
    4
  • Ура, пост сохранился. Дисплей телефона, к сожалению, все еще сломан.

    Также из новостей - меня вписали в проект, который стартует в начале сентября, как раз когда я должен закончить курс по биг дате. Проект, правда, с биг датой связан слабо, но все равно будут новые интересные вещи - а именно знакомство с machine learning и такой вещью, как ElasticSearch для полнотекстового поиска по документам.
    Думаю, более подробно напишу про проект, когда сам буду знать что-то более конкретно.

    Еще закончил модуль по Spark Core, где надо было писать код на Scala. Ну так вот, scala очень крута, очень понравилась. По сравнению с седьмой версией джавы (где не было стримов, лямбд и прочей функциональщины) scala совсем космос. Особенно порадовал pattern matching, который в джаве не предвидится в будущем.
    259/1049
    Ответить Цитировать
    3
  • Епрст, что происходит - я вставил в пост ссылку и он пропал.
    Если у кого сохранилась кэшированная версия страницы - поделитесь, пожалуйста :)

    Хорошо что хватило мозгов сохранить черновой вариант в текстовый файл на компе. Видимо, придется дописывать заново и выкладывать еще раз.
    260/1049
    Ответить Цитировать
    1
  • Спасибо, за мышь кодирующую, и головач хорошо.
    Ковырялся намедни, нашёл сайт http://www.codingame.com, может в полезные ресурсы попадёт.
    Пока сделал только одно задание легкого уровня, достаточно интересно. Плюс можно на куче языком писать.
    1/3
    Ответить Цитировать
    3
  • http://code.i-harness.com/ru/ вот еще хороший ресурс
    11/27
    Ответить Цитировать
    3
1 9 29 30 31 32 51 162
1 человек читает эту тему (1 гость):
Зачем регистрироваться на GipsyTeam?
  • Вы сможете оставлять комментарии, оценивать посты, участвовать в дискуссиях и повышать свой уровень игры.
  • Если вы предпочитаете четырехцветную колоду и хотите отключить анимацию аватаров, эти возможности будут в настройках профиля.
  • Вам станут доступны закладки, бекинг и другие удобные инструменты сайта.
  • На каждой странице будет видно, где появились новые посты и комментарии.
  • Если вы зарегистрированы в покер-румах через GipsyTeam, вы получите статистику рейка, бонусные очки для покупок в магазине, эксклюзивные акции и расширенную поддержку.