Чёт мне кажется у кода чукть разные задачи и результат будет разный, плюс во 2 варианте проц больше жрёт.
Плюс первый вариант гораздо лучше читается
Долго читал первый вариант и в конце думал, что понял суть. Прочитал второй вариант за 10 секунд и сразу всё понял.
Пришлось перечитать первый код, чтобы убедиться, что с первого раза всё понял не правильно. (facepalm). Ну и да, >=110 и [a-m] не одно и то же, однако мы не знаем условия, чтобы говорить кто прав.
Имхо, писать надо коротко, но не сжато.
Пришлось перечитать первый код, чтобы убедиться, что с первого раза всё понял не правильно. (facepalm). Ну и да, >=110 и [a-m] не одно и то же, однако мы не знаем условия, чтобы говорить кто прав.
Имхо, писать надо коротко, но не сжато.
У меня критерии другие, наверное) я когда читаю код, сразу представляю, как ко мне придут менеджеры и скажут "у нас там есть счётчик плохих символов, вот надо его вот так-то поправить/изменить", и в первом коде контекст задачи описан словами, а во втором нет.
Не знаю этого языка. Все равно понял что делает второй вариант. Это что то да говорит о читаемости
Правда не понятно, зачем создавать StringBuilder на 2 строке, а первое использование на 7.
Первый вариант - ебаное убожество, так писать вообще нельзя.
Вроде бы задача одна и та же. Просто в первом случае считаются только те символы, которые в таблице utf после m идут, а во втором он посчитает и заглавные буквы, и цифры, и операторы.
Ну. Это спортивная алгоритмизация. Очень хорошо развивает мозги. Мало чего общего имеет с программированием реальных проектов.
За редким исключением во всех таких соревнованиях оценивается то, как быстро ты смог придумать и закодировать безошибочное решение. Что влечет за собой достаточно экстравагантные практики написания кода. Рабочий код нужен как можно скорее, а когда закончится контест и его разборы, никто и никогда больше не будет читать, вносить расширения, правки и фиксы в этот код.
Перейдя на реальные проекты люди со спортивным прошлым, годами приходят в чувство. Некоторые, особенно те, что параллельно со спортивной деятельностью никогда не писали собственных маленьких проектиков, в чувство не приходят никогда. И навечно остаются "подающими надежды", лучшее место работы для которых - готовить эти самые спортивные соревнования.
За редким исключением во всех таких соревнованиях оценивается то, как быстро ты смог придумать и закодировать безошибочное решение. Что влечет за собой достаточно экстравагантные практики написания кода. Рабочий код нужен как можно скорее, а когда закончится контест и его разборы, никто и никогда больше не будет читать, вносить расширения, правки и фиксы в этот код.
Перейдя на реальные проекты люди со спортивным прошлым, годами приходят в чувство. Некоторые, особенно те, что параллельно со спортивной деятельностью никогда не писали собственных маленьких проектиков, в чувство не приходят никогда. И навечно остаются "подающими надежды", лучшее место работы для которых - готовить эти самые спортивные соревнования.
Уже на собеседовании спортивные программисты цирк устраивают, ища "подсказки" и "заковырки" в типовых задачах уровня fizzbuzz. Пособеседовав таких, внезапно понял почему военных летчиков в гражданскую авиацию берут неохотно, даже при дефиците пилотов.
А почему это как-то связано? Не вижу аналогии.
профдеформация
Банзаят часто и пытаются управлять боингами как истрибителями?
Часто выходят на предельный угол атаки
Я тогда тоже не брал бы много таких.
Что именно ты называешь спортивной алгоритмизацией (1 или 2 вариант)?
Просто я вижу тут (хоть сам из 1 группы, студент раздолбай) банальное незнание метода replaceAll...
Просто я вижу тут (хоть сам из 1 группы, студент раздолбай) банальное незнание метода replaceAll...
replaceAll - это и есть спортивная алгоритмизация.
спасибо
CodeForces - известная площадка для проведения спортивных соревнований.
На реальных проектах МОГУТ БЫТЬ СЛУЧАИ (например если мы глобально стараемся не создавать лишнюю нагрузку на GC), когда первый способ решения будет предпочтительней. Особенно, в случае если builder можно использовать повторно, а результат можно будет вернуть в более вменяймой форме чем строка.
Если не считать того, что он, вероятно, неправильно реализован. для случая когда в строке есимволы меньше 'a' .
В данном случае, задача совсем для новичков и не столь важно как её решать. но ДЛЯ ЗАДАЧ СЛОЖНЕЕ ЧЕМ ЭТА, при прочих равных, часто написание чуть более длинного, но более понятного кода, предпочтительней изощренных однострочных придумок (например заковыристых регексов). Если ты написал код, который никто кроме тебя не понимает, это не ты самый умный. А как раз даже наоборот.
На реальных проектах МОГУТ БЫТЬ СЛУЧАИ (например если мы глобально стараемся не создавать лишнюю нагрузку на GC), когда первый способ решения будет предпочтительней. Особенно, в случае если builder можно использовать повторно, а результат можно будет вернуть в более вменяймой форме чем строка.
Если не считать того, что он, вероятно, неправильно реализован. для случая когда в строке есимволы меньше 'a' .
В данном случае, задача совсем для новичков и не столь важно как её решать. но ДЛЯ ЗАДАЧ СЛОЖНЕЕ ЧЕМ ЭТА, при прочих равных, часто написание чуть более длинного, но более понятного кода, предпочтительней изощренных однострочных придумок (например заковыристых регексов). Если ты написал код, который никто кроме тебя не понимает, это не ты самый умный. А как раз даже наоборот.
о как, спасибо большое
А теперь смотрим длину функции replaceAll и сравниваем с первым решением
Вообще пофиг, сколько оно в библиотеке занимает. Ты же стрингбилдер в первом решении не считаешь.
Нууу, совсем нет, котоны. Первый вариант с билдером и индексами не только меньше ест процессора, но и не выделяет память на временные строки, а значит не нагружает сборщик мусора и аллокатор.
Заморачиваться производительностью регулярных выражений в 2020г. стоит только если эта хрень сидит внутри цикла с большим числом итераций или если идет работа с очень длинными строками (ну или если ты пишешь код, который должен работать на утюге).
В рамках этой задачи у мы видим решение, вызванное отнюдь не заботой о производительности, а банальным неумением использовать регулярные выражения.
В рамках этой задачи у мы видим решение, вызванное отнюдь не заботой о производительности, а банальным неумением использовать регулярные выражения.
Согласен с тобой во всем, кроме одного, мы не видим тут никакой задачи вообще.
Хотя, я не очень внимательно прочитал коммент, больший выигрыш тут всё-таки не в производительности регулярок, а в отсутствии временных аллокаций. Иначе, если функция будет дёргаться в цикле, гарантированно будет регулярный стопворлд. А такое не для игрушки, не для банк трейдера не допустимо, например.
Ну вот как это выглядит на "медленном" интерпретируемом языке на слабеньком домашнем ноуте:
use Time::HiRes (gettimeofday);
$start = gettimeofday();
my $string = 'abcdefghijklmopqrstuvwxyz'x100000;
$total = length($string);
$string=~s/[a-m]+//g;
$count = length($string);
$end = gettimeofday() - $start;
print "Total time: $end sec, result: $count of $total\n";
Total time: 0.0329160690307617 sec, result: 1200000 of 2500000
Т.е. три сотых секунды для строки размером в 2.5 миллиона символов.
use Time::HiRes (gettimeofday);
$start = gettimeofday();
my $string = 'abcdefghijklmopqrstuvwxyz'x100000;
$total = length($string);
$string=~s/[a-m]+//g;
$count = length($string);
$end = gettimeofday() - $start;
print "Total time: $end sec, result: $count of $total\n";
Total time: 0.0329160690307617 sec, result: 1200000 of 2500000
Т.е. три сотых секунды для строки размером в 2.5 миллиона символов.
Не знаю ничего о кишках перла, но в посте шарп, о нем и буду говорить.
1) Немножко самоцитирования "а в отсутствии временных аллокаций. Иначе, если функция будет дёргаться в цикле, гарантированно будет регулярный стопворлд. А такое не для игрушки, не для банк трейдера не допустимо, например.
2) Немножко логики. В реальном приложении или игрушке этот код будет висеть на сотне объектов и выполняться 60 раз в секунду, генерирую одну красивую строку статуса и кучу временного мусора, который прийдется чистить дот нету или ява машине.
3) Ссылочки на бесконечные "моя игра тормозит, што делать!?!?!"
"After some digging and playing around in the profiler, I found out those were due to some line named GC.Collect. In my project, it can take up to 8.62ms (on my high-end pc) of the 9.79ms needed for my behaviours updates on a given frame;"
"The strings create garbage as well, even when you concatenate them, so if you have to handle a lot of text somewhere and manipulate it heavily, use a StringBuilder that will take care of those memory issues alone and avoid the creation of garbage."
https://www.gamasutra.com/blogs/GrhyllJDD/20160119/263849/Reducing_memory_allocations_to_avoid_Garbage_Collection_on_Unity.php
https://forum.unity.com/threads/understanding-how-strings-related-to-memory-allocations.121140/
1) Немножко самоцитирования "а в отсутствии временных аллокаций. Иначе, если функция будет дёргаться в цикле, гарантированно будет регулярный стопворлд. А такое не для игрушки, не для банк трейдера не допустимо, например.
2) Немножко логики. В реальном приложении или игрушке этот код будет висеть на сотне объектов и выполняться 60 раз в секунду, генерирую одну красивую строку статуса и кучу временного мусора, который прийдется чистить дот нету или ява машине.
3) Ссылочки на бесконечные "моя игра тормозит, што делать!?!?!"
"After some digging and playing around in the profiler, I found out those were due to some line named GC.Collect. In my project, it can take up to 8.62ms (on my high-end pc) of the 9.79ms needed for my behaviours updates on a given frame;"
"The strings create garbage as well, even when you concatenate them, so if you have to handle a lot of text somewhere and manipulate it heavily, use a StringBuilder that will take care of those memory issues alone and avoid the creation of garbage."
https://www.gamasutra.com/blogs/GrhyllJDD/20160119/263849/Reducing_memory_allocations_to_avoid_Garbage_Collection_on_Unity.php
https://forum.unity.com/threads/understanding-how-strings-related-to-memory-allocations.121140/
C# используется не только для игрушек, но и для веба, где работа с регэкспами и строками - обычное дело. А скорость ограничена не производительностью кода, а ожиданием ответа СУБД и/или передачи данных.
И вот в таких раскладах читаемость и простота кода намного важнее оптимизации.
Собственно, это универсальное правило - простота всегда предварительно лучше скорости. Потому что потом ты можешь профайлером посмотреть, что именно тормозит и оптимизировать, а вот сразу зарываться в оптимизацию - путь к долгой и неприятной отладке.
И вот в таких раскладах читаемость и простота кода намного важнее оптимизации.
Собственно, это универсальное правило - простота всегда предварительно лучше скорости. Потому что потом ты можешь профайлером посмотреть, что именно тормозит и оптимизировать, а вот сразу зарываться в оптимизацию - путь к долгой и неприятной отладке.
Ну это естесна, всегда нужно понимать зачем что-то делаешь, писать сайт на ассемблере настолько же неблагодарное занятие как и высокопроизводительное приложение на однострочниках. Очевидно же и что автор мемеса намекает что первый код вообще никому не нужен, прочив чего я тут и холиварю.
В посте жава, блджад
А я на си пишу. И чтобы банально сканкатенировать две две строки мне приходиться ебаться. И думать, кто же очистит память, выделенную под новую строку.
В вызове realloc и free нет ничего сложного. Кроме того, есть библиотеки, где за тебя уже об этом подумали.
Valgrind знаю для анализа утечек. Насколько мне известно, в си нет механизмов, чтобы надежно защитить себя от выстрела в ногу памятью.
Linus Gabriel Sebastian тоже не понимает, какого хера он в таких темах появляется.
Чтобы написать коммент, необходимо залогиниться