Школа программиста

Забыли пароль?
[задачи] [курсы] [олимпиады] [регистрация]
Логин:   Пароль:    
Скрыть меню
О школе
Правила
Олимпиады
Фотоальбом
Гостевая
Форум
Архив олимпиад
Архив задач
Состояние системы
Рейтинг
Курсы
Новичкам
Работа в системе
Алгоритмы
Курсы ККДП
Дистрибутивы
Ссылки

HotLog


 
Вернуться
Тема: Runtime error testcase #5
1 2
  1  Зинов Вадим, 11 августа 2020 г. 14:03:33
      Не в коем случае. Я бы не стал делиться кодом если бы не ожидал его обсуждения. так называемый codereview. Это полезно как мне так и другим. Я получаю отзывы со стороны, принимаю к сведению, те кто смотрят - возможно найдут что-то полезное для себя. Так что я благодарен за потраченное Вами время и уж точно не держу никаких обид)
  2  Егоров Илья Валерьевич, 11 августа 2020 г. 13:45:59
      Так или иначе, я так критикую в большинстве своем из-за того, что мне самому грязный код неприятен. Смахивает на некую форму мизофобии, хотя в реальности настоящей не наблюдается (в крайность не ухожу, но стремление к чистоте есть, которое нередко заглушает лень). Это одновременно и дар, и болезнь: знание как хорошо надо писать софт имеет столь же хороший потенциал, но ценой видения насколько весь существующий гнилой с сопутствующим негативом, да и собственно написанный быстро загнивает, ибо осознание идет постоянно. Так что на всякий случай извиняюсь, если оно совсем не к месту иль задел чем.
  3  Егоров Илья Валерьевич, 11 августа 2020 г. 13:24:59
      Я знаю, что pii лишь псевдоним, но эти 3 строки можно запихнуть в отдельный namespace ... { ... }, чтоб не смешивать с самим кодом. И это не столь крайность, сколь выработка полезных привычек и навыков. Олимпиадное программирование — зачастую лишь проза к самому программированию (для себя или в проде), где можно легко свернуть на грязный путь. О чем и яркий заголовок "Школа программиста" говорит. Это не чистая математика, которая может служить как разминка для мозгов. Потому и критично, хотя с какой-то стороны оно и действительно крайность.
  4  Зинов Вадим, 11 августа 2020 г. 13:19:28
      Егоров Илья Валерьевич, вы уходите в крайности). Речь идет о олимпиадном программировании. На контесте ни кто не даст воспользоваться заготовленными вылизанными библиотеками. pii - не мой, это псевдоним к pair<int, int>. Данный код пишется не для пром использования, множественное его использование не планируется, потому вся эта суета с пространствами имен - только лишние затраты усилий, бессмысленные и беспощадные. Пару пробельных строк возможно имело смысл добавить "отделяющих тезис от содержания", хотя если вся функция насчитывает строк 10 и помещается на экране, большого смысла в этом нет.
  5  Егоров Илья Валерьевич, 11 августа 2020 г. 13:09:46
      ...(недостижимость оптимального времени разработки), пока не родится нечто новое, задающее строгие ограничения (а значит и не доступное для развития кода кем попало). Хорошо про это сказано тут: https://habr.com/ru/post/500286/#comment_21573040
Это все оффтоп, выходящий за пределы темы (которая вечером 9 августа уже себя исчерпала), так что на этом можно и закончить.
  6  Егоров Илья Валерьевич, 11 августа 2020 г. 13:07:38
      Зинов Вадим,
Касательно атомарности могу заявить, что, скажем, определение используемых переменных в функции и сама идущая далее логика (фактический код по сути, ибо всякое вроде груды namespace, using, макросов, шаблонов да type_traits — своего рода мета, не задающая напрямую реализацию, а лишь "собирающая" таковую (кстати, свой pii и сопутствующее вы могли выделить в отдельное пространство имен)) — вещи разные, первое в терминах чего-нибудь вроде (Free)Pascal является отдельной секцией var. Вот если бы определение было бы близко к самому использованию, то слитность допускалась бы (но в определенных пределах), соответствующая структура кода этому способствует. А так посмотрите, например, на свой bfs. Ну там ж явно не хватает разделения переменных и цикла, равно как и ветвей. Или на make_ans: все подряд; даже первая ветвь, завершающая функцию, никак не отделяется. Такое трудно читается. Но в целом, это пока всяко лучше, нежели тот стиль, который в начале нулевых (хотя иногда и ныне бытует) использовался для написания на сишке софта под GTK+ (особенно первые версии). Хотя что уж, от всякого вроде исходников lxtask, где даже единство стиля никак не соблюдается, хочется блевать. Никогда не стоит без заготовленного тазика смотреть в исходники используемого софта.
Проблема времени разработки решается разбиением выточенных решений на компоненты с дальнейшим переиспользованием. Написали хорошо, обобщили как в Boost, довели до ума как физико-математические библиотеки на Фортране — выделили в отдельный компонент (модуль библиотеки, например), содержащий решение строго определенной задачи. Знаете, на деле так почти никто не делает, даже банально разбить исходники по поддиректориям не удосуживаются. Восхищаются вон люди философией Unix, продвигают, а по факту поддерживают такие велосипеды, как поделки Поттеринга. Да и вообще, нормальной экосистемы нет ни в BSD-подобных, ни в Solaris-подобных (хотя эти ближе к первому семейству, особенно учитывая таких существ, как OpenIndiana), ни в Linux-подобных. И так будет до тех пор
  7  Зинов Вадим, 11 августа 2020 г. 12:22:43
      Пожалуй, так выглядит и вправду посимпатичнее. Надо почаще пользоваться. Спасибо.
switch (pool[i][j]) {
case 'X': s = {i, j}; break;
case '@': e = {i, j}; break;
}
  8  Зинов Вадим, 11 августа 2020 г. 12:11:09
      Насчет отсутствия разделения на блоки пробелами... Ну они разнесены по функциям))) А сами функции достаточно атомарны, чтобы в них не было ярко выраженных блоков. Да и в принципе, злоупотребление пустыми строками сильно раздувает код и мешает чтению. Хотя в разумных пределах они конечно полезны. Насчет if... вы правы безусловно, однако тут вступает в силу тот факт что switch слишком громоздкий, точно так же как и if()else. Замена их на if()[return/continue/break] не сильно портит прозрачность кода, но так легче воплотить свою мысль, меньше вложенность кода, меньше отвлекающих скобок, что упрощает разработку. (Я не претендую на истину. Говорю как вижу сам, вы можете не согласиться.)
  9  Зинов Вадим, 11 августа 2020 г. 11:59:13
      Егоров, спасибо за оценку.
В свое оправдание скажу что у меня основной целью была скорость разработки решения. Я могу написать решение эффективнее, как по времени, так и по памяти. Могу дополнительно вылизать код, разбавить комментами, помагичить с абстрагированием. Но все это бы увеличило время разработки решения, чего я хочу избежать.
Код достаточно эффективен, как по времени, так и по памяти, чтобы залезать в ограничения с запасом. Код достаточно читабелен, чтобы быстро находить недочеты и баги и исправлять их.
  10  Егоров Илья Валерьевич, 11 августа 2020 г. 7:54:30
      Болатбеков Мейрбек, это не всегда возможно. Например, Матус Даниил Дмитриевич выложил на pastebin свое решение публично как гость (и без срока: существовать будет вечно). Поскольку не авторизовано, удалить (или даже отредактировать) не представляется возможным без обращения в саппорт.
  11  Егоров Илья Валерьевич, 11 августа 2020 г. 7:51:39
      Зинов Вадим, ваше решение действительно чище, но все же тоже далеко от совершенства. Если касательно распространенных незначительных косяков, то вот, например, у всех кинутых тут решений нет разделения логических блоков пустыми строками и наблюдается повсеместно обработка взаимоисключающих условий только через ряд if'ов (что у вас в read_data), без else или даже оформления switch'ем. И за излишнее разложение на стандартные (и/или нет) типы нередко платят рантаймом (но не столь в случае использования napr, тут идет заметный выигрыш в силу выноса на время компиляции, хотя можно было завернуть цикл и лучше), так что нужно быть на золотой середине. Вот, например, на простом тесте под N=1000 с -O3 решение Болатбекова Мейрбека быстрее вашего в ~3 раза, а Матуса Даниила Дмитриевича — в ~7 раз.
  12  Болатбеков Мейрбек, 11 августа 2020 г. 7:39:40
      Прошу деактивировать свои ссылки на решения
  13  Егоров Илья Валерьевич, 11 августа 2020 г. 6:15:13
      Зинов Вадим, "категорически запрещается размещать тексты правильных решений" может трактоваться и как "категорически запрещается размещать тексты правильных решений где бы то ни было, равно как и ссылаться на таковые в пределах данного сайта". В конце концов, это всего лишь ссылочный вид: размещены тексты "физически", конечно, на других сайтах, но вот ссылка указана тут, что может уподобиться размещению "логическому" и как подпадать под правило, так и не подпадать. Скажем, если рассмотреть правило как цель "чтоб пользователь случайно решение не увидел", то ссылка действует как спойлер: не откроет пользователь — и не узнает => ссылка на правильное решение легальна. Но вот если целью стоит "чтоб пользователь не искусился взять готовое решение (что актуально при использовании ACMP для проведения практической на экзамене)", то даже выкладывание на стороннем сайте без указания ссылки рискованно.
  14  Зинов Вадим, 10 августа 2020 г. 18:42:34
      Кстати, в Правилах указано, что в обсуждениях категорически запрещено выкладывать тексты правильных решений. Формально правила нарушены не были. 1) Тексты решений выложены не были, были выложены ссылки на тексты решений. 2) Не в обсуждении, а на форуме. (тут уже виноват топик-стартер).
Возможно стоит немного поправить формулировки Правил.
  15  Зинов Вадим, 10 августа 2020 г. 17:28:56
      https://rextester.com/XKC40621
При желании можете мое решение почекать. Пока Админ тему не порезал.
  16  Зинов Вадим, 10 августа 2020 г. 17:10:42
      Решил почекать ваши коды. Это жесть, как много кода. Как много лишнего кода.
Читабельнее код у Болатбекова Мейрбека. Всем добра!
  17  Егоров Илья Валерьевич, 09 августа 2020 г. 23:19:17
      Тьфу. static const сhar BALL = 'O';. Стоит заметить, static не обязателен (почти: он все же влияет на выхлоп компилятора даже на -O3), но явно говорит, что константа ограничена пределами файла.
  18  Егоров Илья Валерьевич, 09 августа 2020 г. 23:09:12
      P.s. Админы тут относительно редко бывают, так что удаление спустя лишь каких-нибудь 2-4 дня — норма.
  19  Егоров Илья Валерьевич, 09 августа 2020 г. 23:08:03
      Матус Даниил Дмитриевич, насчет третьего: символы, вообще говоря, и есть числа.
46 == '.',
64 == '@',
79 == 'O',
88 == 'X'.

Скажем, s[i] == '@' эквивалентно !(*(s + i) ^ 64).
Как пример, в вашем решении можно было бы вместо оперирования "магическими 0, 1, 2, 3" взять разницу между символом и '.' или же брать конкретные.

В целях лаконичности, конечно же, имеет смысл ввести дополнительный уровень абстракции, но главное сделать это аккуратно. Ибо вот, скажем, то преобразование '.' -> 0 -> '.', которое имеется в вашем решении, код явно не упрощает. Попробуйте поэкспериментировать с оформлением. Например, можно символы вынести в константы: что-нибудь вроде static const BALL = 'O';. Так вообще можно забыть с чем работаем: с числами или же символами, вместо этого решение получается в терминах задачи, как оно и должно быть.
  20  Матус Даниил Дмитриевич, 09 августа 2020 г. 18:01:30
      так первое по поводу id точки я не совсем понимаю зачем это нужно в данной задаче ибо код менее читабелен в плане кидания в очередь соседних клеток но ладно
второе место проверок легче огородить поле стеной но это берет чутка больше памяти ну да ладно
3 как по мне проще работать с числами чем с символами тем более что здесь хватает 1 байтовых
4 я удивлен что админы не удалили сразу этот пост ибо правило 7
5 удачи в изучении графов и сдайте вторую часть этой задачи она тоже самое почти)
1 2

Чтобы оставить сообщение необходимо зарегистрироваться и авторизоваться!

Красноярский краевой Дворец пионеров, (c)2006 - 2020, E-mail: admin@acmp.ru