Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Меня формальные причины не особо интересуют.
Ну тебя может и не интересуют, но соискатели-то отвечают на тот вопрос, который ты им задал, а не на то, что тебя интересует.
То есть, если ты просишь их "сделайте без доп. памяти", а они тулят массив, то они НЕ РЕШИЛИ ЗАДАЧУ.
так же, как кто-то тут предлагал в рекурсивной процедуре возвращать имена узлов, вместо того, что бы получить на выходе обращённый списко из тех же узлов...
НС>Он плохой в контексте этой задачи. А так да, почти всегда можно придумать как так переиначить задачу, чтобы любой плохой код было проще исправить, чем хороший, особенно если код такой коротенький.
Ну, давай так, пусть у нас целый класс операций над списком, типа мы контейнер пишем. И если все операции переупорядочения сделаны похоже, то это лучше, правда это может быть слишком дорого, а может и не быть...
НС>
НС>Да не напишет он и с помощью гугла. Больше половины на обсуждаемую задачку не задумываясь пишут примерно такой код ...
Мне не понятно, что за имбицилы к вам идут, что они "не задумываясь пишут такий код", когда их явно попросили без доп. памяти?..
IMHO, ты чего-то тут не договариваешь...
НС>В контексте этой задачи он таки хуже.
В контексте этой задачи он не то что бы хуже там или лучше, а один является решением, а другой нет
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>То есть я обсуждаю конкретную задачу конкретно в контексте собеседования, но тут, в середине топика, не разобравшись с контекстом, влазишь ты и начинаешь что то доказывать вне этого контекста и для другой задачи. Извини, но с логикой у тебя не все хорошо.
Это у тебя нехорошо. Так как ты, оказывается, обсуждаешь как решение то, что решением вообще не является
При этом апеллируешь, не к простому утверждению, что это не соответствует требованию без доп. памяти, а к тому, что якобы этот код сложнее, написан без применения головы и т. п...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>При чём тут спорить?
А что ты тут делаешь? Лекции читаешь?
E> Речь о том, что один код устроен шаблонно
Докажи.
E>шаблон хорошо масштабируется
Докажи.
E> и применяется в куче аналогичных задач
Докажи.
Ты если реально хочешь именно шаблонный код увидеть, то он будет, например, таким:
IEnumerable<Item> AllElements(this Item head)
{
while (head != null)
{
yield return head;
head = head.Next;
}
}
Item ToSingleLinkedList(this IEnumerable<Item> src)
{
var head = new Item();
var cur = head;
foreach (var item in src)
{
cur.Next = new Item();
cur = cur.Next;
}
return head;
}
...
var reversed = head.AllElements().Reverse().ToSingleLinkedList();
А то что я привел, это не шаблонный код, это безмозглый код человека, который дальше книжки "C# за 21 день" не прошел. Более менее вменяемые C# программисты такой код не пишут.
На закуску — для добавления сортировки в этом коде нужно немного изменить одну строчку:
var reversed = head.AllElements().OrderByDescending(i => i.Name).ToSingleLinkedList();
Вот тут действительно модифицируемость кода выше.
НС>>А если надо не сортировку добавить, а просто изменить способ получения ссылки Next? В каком из вариантов больше изменений будет, а?
E>Одинаково, вообще-то...
Здравствуйте, Erop, Вы писали:
E>Демогогия -- это то, что ты тут пишешь. E>Если в твоей задаче есть В УСЛОВИИ требование не использовать доп. память, то ответ с массивом НЕ ВЕРНЫЙ по ФОРМАЛЬНЫМ причинам.
НС>>Ну да, и вместо того чтобы прямо спросить о том что ты не понял ты начал что то фантазировать и на основании этих фантазий спорить.
E>Я вообще никак не оценивал твои собеседования. Я оспариваю то, что код с массивом -- плохой. Он просто написан исходя из другой системы ценностей. Он не является решением твоей задачи и мне странно, что ты не упомянул это, когда приводил его...
Этот тред уже вырос до безумного размера... Но всё ж напишу. Тем более это не последняя такая тема. Сколько их уже было.
ИМХО, бОльшая часть этих аргументов мимо кассы. Даже те, что формально правильные.
В смысле люди держат в голове одно, а доводы придумывают по случаю.
А всё просто: есть плохо осознанная установка, что правильный программист — это примерно выпускник тех. вуза,
которому давали некоторые "базовые" знания. В число которых, естественно, входит разворот списка на месте.
Это я иронизирую, если что. Т.е. есть вроде как прогер должен понимать структуры данных. Но структуры данных
начинаются с односвязного списка (табличка "сарказм"). Т.е. если не знает про односвязный список, то скорее всего
человек случайный, пришел с улицы в надежде на халяву.
Самое смешное, что это долгое время было примерно правдой. Для средней конторы было нормальным
писать "высшее тех. образование" в требованиях. Как фильтр это работало, а потерями от такого фильтра можно
было пренебречь. Отсюда и традиция первым делом спрашивать разворот списка на месте. И даже подразумевать,
что кандидат сам поймёт, что разворот списка это именно на месте. И что это список, а не какой-то там List<T>.
Этому же всех учили!
Ну а сейчас ситуация поменялась. Просто те, кто проводят собеседования действуют по старинке,
потому что тут так принято, и потому что их в своё время мучали этим.
Многие к тому же не осознают или просто не знают, что ситуация таки поменялась.
Откуда же его [независимый суд] взять, если в нем такие же как мы? (c) VladD2
Здравствуйте, Erop, Вы писали:
НС>>Меня формальные причины не особо интересуют. E>Ну тебя может и не интересуют, но соискатели-то отвечают на тот вопрос, который ты им задал, а не на то, что тебя интересует.
И?
E>То есть, если ты просишь их "сделайте без доп. памяти", а они тулят массив, то они НЕ РЕШИЛИ ЗАДАЧУ.
Верно. Но причины нерешения могут быть разные. Может человек просто от волнения недочитал условие или не так понял. Мы ж не программу тестируем, а человека. А человеки, они такие, неформальные.
E>Ну, давай так, пусть у нас целый класс операций над списком, типа мы контейнер пишем. И если все операции переупорядочения сделаны похоже, то это лучше, правда это может быть слишком дорого, а может и не быть...
Все равно неправильный код. В этом случае лучше перевести базис не в список, а в IEnumerable, он легковеснее и гибче, и на ряде операций позволит таки обойтись без лишнего перевыделения памяти (реверс не из их числа, впрочем).
E>Мне не понятно, что за имбицилы к вам идут
Ну вот такой вот в своей массе соискатель. К вам они тоже идут в том же количестве, просто ХРы и первые собеседователи их отфильтровывают и до тебя оно не доходит, видимо.
E>IMHO, ты чего-то тут не договариваешь...
Скорее у тебя иллюзии по поводу среднего уровня. Да ты почитай целиком этот топик то — тут и про односвязный список люди впервые отсюда узнали, и программисты, которым концепция ссылок не нужна.
НС>>В контексте этой задачи он таки хуже. E>В контексте этой задачи он не то что бы хуже там или лучше, а один является решением, а другой нет
Здравствуйте, Erop, Вы писали:
E>Это у тебя нехорошо. Так как ты, оказывается, обсуждаешь как решение то, что решением вообще не является
Решением оно является, просто неправильным. И о том что оно неправильное я сказал с самого начала. Если ты это не прочел или прочел по иагонали(что тут нередко бывает) — тут я не виноват.
E>При этом апеллируешь, не к простому утверждению, что это не соответствует требованию без доп. памяти, а к тому, что якобы этот код сложнее, написан без применения головы и т. п...
Ну так это потому что мы не юнит-тест обсуждаем, а проверку знаний реальных человеков. У нас, в принципе, формально неработающие решения вполне принимались, если ход мысли правильный.
На что смотреть? На то, как ты не умеешь программировать?
Тебе надо ОДИН раз прочитать каждый Next при заполнени массива, и ОДИН раз прописать, при записи переупорядочения обратно в узлы...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Ну и чем это отличается от функции сливающей в массив
Тем что перечисление легковеснее, гибче и универсальнее.
E>На что смотреть? На то, как ты не умеешь программировать?
Перешел на личности — слил (С)
E>Тебе надо ОДИН раз прочитать каждый Next при заполнени массива, и ОДИН раз прописать, при записи переупорядочения обратно в узлы...
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Верно. Но причины нерешения могут быть разные. Может человек просто от волнения недочитал условие или не так понял. Мы ж не программу тестируем, а человека. А человеки, они такие, неформальные.
Вот про это я и писал тебе "ил он не понял вопроса", а ты что мне на это ответил?
На самом деле я твой вопрос про разворт списка на месте, при явном требовании O(1) по памяти считаю нормальным, но слегка наивным. Хотя если оно работает, то и хорошо. Тут у меня с тобой разногласий нет, хотя мне так кажется, что ты как-то очень пристрастно к теме относишься, нервно. Это же довольно простой и наивный вопрос и всё.
НС>Все равно неправильный код. В этом случае лучше перевести базис не в список, а в IEnumerable, он легковеснее и гибче, и на ряде операций позволит таки обойтись без лишнего перевыделения памяти (реверс не из их числа, впрочем).
Ну так тоже можно. Я согласен, что для шарпа это, наверное лучше, хотя накосячить с ним проще. Ты, вот, например, вроде как накосячил
Опять же IEnumerable, вроде как назад плохо мотается, так что меньше будет возможностей, но может и хватит.
Но это уже обсуждаемо вполне, и так можно смотреть и сяк. Вам, шарписатм, виднее, как в шарпе адекватнее.
Но, мне таки кажется, что ты понял наконец, что я имел в виду, когда говорил, что тот и другой вариант обращения списка просто написаны для разных целей. Для своих целей каждый хорош.
НС>Ну вот такой вот в своей массе соискатель. К вам они тоже идут в том же количестве, просто ХРы и первые собеседователи их отфильтровывают и до тебя оно не доходит, видимо.
Ну да, но их как-то проще отфильтровывают, без списков. Насколько я слышал есть большой процент, кто сыплется на задачке вроде посчитать устно/на пальцах сумму чисел от 1 до 1000 %)
НС>Именно.
Ну вот, то есть и тут у нас полное согласие. Просто мне странно называть "хуже" решение, которое вообще решением не явлеется, а тебе я не понял странно или привычно
Именно потому, что ты стал говорить про "хуже" и возникло впечатление, что в задачке не просят явно обойтись без доп. памяти
А так, в целом, не ясно о чём спор-то, я скорее разделяю твою позицию, чем оспариваю, просто немного уточняю в сторону своей ИМХИ
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Ну так это потому что мы не юнит-тест обсуждаем, а проверку знаний реальных человеков. У нас, в принципе, формально неработающие решения вполне принимались, если ход мысли правильный.
Ну, видимо, я как-то иначе, чем ты мыслю. IMHO, если в задаче сказали "без доп. памяти", то ход мыслей в сторону доп. массивов точно не в туда просто принципиально
Это вообще решение совсем другой задачи, что, кстати, не есть хорошая особенность программиста. Типа ты ему даёшь ТЗ, а он делает что-то совсем другое
Такие, кстати, не так уж и редки...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Тем что перечисление легковеснее, гибче и универсальнее.
но и ошибиться легче, увы. Но в целом да, мне тоже больше нравится, я же тебе сразу написал, что так логичнее, но немного сложнее. Но, по идее, шарпист должен таки уметь с ними работать достаточно легко.
E>>Тебе надо ОДИН раз прочитать каждый Next при заполнени массива, и ОДИН раз прописать, при записи переупорядочения обратно в узлы...
НС>А там последнюю строчку не приметил?
Если честно, я уже не помню, что конкретно ты там написал, что там в последней строчке такого было великого?
Казалось бы, пишем ссылки на узлы в массив, потом его переворачиваем, или не переворачиваем, тут по вкусу, а потом первому узлу в массиве говорим, что его Next -- второй, второму, что третий и т. д...
Последнему говорим, что 0
Зачем нам при этом дважды читать next какого-то узла?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>хотя мне так кажется, что ты как-то очень пристрастно к теме относишься, нервно
Оценивать эмоции по тексту — крайне неблагодарное занятие, легко промахнуться.
E>. Это же довольно простой и наивный вопрос и всё.
Ну вот некоторые считают, что могут быть такие программисты, которые на него не ответят даже после уточняющих вопросов.
НС>>Все равно неправильный код. В этом случае лучше перевести базис не в список, а в IEnumerable, он легковеснее и гибче, и на ряде операций позволит таки обойтись без лишнего перевыделения памяти (реверс не из их числа, впрочем). E>Ну так тоже можно. Я согласен, что для шарпа это, наверное лучше, хотя накосячить с ним проще. Ты, вот, например, вроде как накосячил
Я писал пост в форум, а не на собеседование ответ. Тут и опечаток в тексте целая пачка, это ж не означает что я по руски писать без ошибок не могу.
E>Но, мне таки кажется, что ты понял наконец, что я имел в виду
Я давно это понял, а вот ты меня понять никак не можешь.
E>Ну да, но их как-то проще отфильтровывают, без списков.
Например?
E> Насколько я слышал есть большой процент, кто сыплется на задачке вроде посчитать устно/на пальцах сумму чисел от 1 до 1000 %)
И какое это отношение имеет к программированию? Это математика про ряды, и она точно не обязательна для любых программистов (хотя это первый семестр любого негуманитарного ВУЗа, да). Вот формула:
Конечно, если немножко моск напрячь, можно ее и вывести. Только это будет опять разновидность задачи про гномиков.
Здравствуйте, Erop, Вы писали:
E>Ну, видимо, я как-то иначе, чем ты мыслю. IMHO, если в задаче сказали "без доп. памяти", то ход мыслей в сторону доп. массивов точно не в туда просто принципиально
Верно. Но если задать вопрос — а можно ли как то поменьше памяти расходовать, то тут уже зависит от ответа на него.
E>Это вообще решение совсем другой задачи, что, кстати, не есть хорошая особенность программиста.
Надо делать скидку на стресс во время собеседования или невнимательность. Скажем, если ошибка будет типа той, что я допустил в последнем примере, то это точно не будет основанием для отказа, особенно если человек ее найдет и исправит.
E> Типа ты ему даёшь ТЗ, а он делает что-то совсем другое
Ну, не все так однозначно. В вопросе сформулировано что то вроде "реализовать с минимальным расходом памяти", не уточняя каким конкретно. Так что кандидат может и не знать что его решение неправильное, если не знает правильного.
Здравствуйте, Erop, Вы писали:
НС>>А там последнюю строчку не приметил? E>Если честно, я уже не помню, что конкретно ты там написал, что там в последней строчке такого было великого?
Ничего великого, просто еще одно обращение к Next. Но это, вобщем то, неважно. Суть тут не в конкретном коде, а в том что, если заранее задать правильный вариант, то часто можно подобрать такое требование, чтобы именно это решение было лучше. И именно поэтому доказательство правильности варианта путем замены исходной задачи логически некорректно.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Ну вот некоторые считают, что могут быть такие программисты, которые на него не ответят даже после уточняющих вопросов.
Ну я тоже так читаю. Например 1С-пограммисты или там бэйсикисты, или как их надо называть? просто понятие "программист" широкое довольно. Но я вполне верю, что вам такие могут быть и не нужны.
НС>Я писал пост в форум, а не на собеседование ответ. Тут и опечаток в тексте целая пачка, это ж не означает что я по руски писать без ошибок не могу.
Я не хотел сказать что-то плохое про тебя, просто дал иллюстрацию, что с перечислением накосячить проще. даже тебе. С массивом же ты не накосячил? Или накосячил? Я уже не помню, если честно.
НС>Я давно это понял, а вот ты меня понять никак не можешь.
Почему? После того, как ты пояснил, что в твоём идиалекте неправильное решение, это тоже решение, только оно хуже правильного, я тебя прекрасно понял. но я вообще не обсуждал твою задачу и собеседования, на самом деле
НС>И какое это отношение имеет к программированию? Это математика про ряды, и она точно не обязательна для любых программистов (хотя это первый семестр любого негуманитарного ВУЗа, да). Вот формула: НС> НС>Конечно, если немножко моск напрячь, можно ее и вывести. Только это будет опять разновидность задачи про гномиков.
Думаешь?..
Я вот формулу не знаю, я знаешь как считаю такие суммы? Мне вот очевидно, что если добавить эти же числа, но в обратном порядке и через один, то есть 1 + 1000 + 2 + 999 + 3 + 998 + ... + 1000 + 1, и расставить там скобок (1 + 1000) + (2 + 999) + ... + (1000 + 1), то получится 1001000, и это будет искомая сумма взятая дважды, так что искомая будет 500500... Проверь по формуле, если тебе это не очевидно.
только я не считаю, что для этого упражнения надо "напрягать мозг"
Но в целом я просто рассказал тебе тайну, как отсеивают совсем глупых. Кажется эту задачку дают даже соискателям на позицию серетаря, кстати.
Ну и в целом, IMHO, это примерно всё равно как отсеивать настолько несклонных к аналитическому мышлению людей.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Ночной Смотрящий, Вы писали:
IO>>Этому же всех учили! НС>Нет, не поэтому, а потому что мозг нормального программиста должен щелкать подобные задачки за секунду.
Тут объяснили, что для многих областей этого не требуется. Не вижу оснований не верить.
Я тоже раньше думал, что нормальный тест на базовые умения. Задача вроде простая и ответ можно
увидеть чисто визуально, даже если раньше к односвязным спискам не прикасался.
Но на практике ненормальные программисты работают вместе с "нормальными" и по большей части над тем же.
IO>>Ну а сейчас ситуация поменялась. НС>У нас ситуация не менялась как минимум с 2003 года.
Поменялась. Народ стал менее однородный и с разным бекграундом.
Учить в ВУЗах стали хуже и меньше требовать.
Культура программизма внутри РФ стала менее специфична и замкнута.
И т.д.
А у вас — это точно РФ?
НС>ИМХО, не стоит по себе о других судить.
Не стоит. Я этого и не делаю. Кстати телепатией заниматься тоже не стоит.
Откуда же его [независимый суд] взять, если в нем такие же как мы? (c) VladD2
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Ну, не все так однозначно. В вопросе сформулировано что то вроде "реализовать с минимальным расходом памяти", не уточняя каким конкретно. Так что кандидат может и не знать что его решение неправильное, если не знает правильного.
Ага! Таки вопрос с хитрецой, и потом с уточняющим таки. Тогда понятнее всё становится и почему то таки решение, и почему его предлагают...
А почему бы прямо не написать в вопросе "с расходом памяти O(1)"? Ну тупо итерацию одну сэкономишь как бы...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Ничего великого, просто еще одно обращение к Next.
А зачем оно там?
НС>Но это, вобщем то, неважно. Суть тут не в конкретном коде, а в том что, если заранее задать правильный вариант, то часто можно подобрать такое требование, чтобы именно это решение было лучше. И именно поэтому доказательство правильности варианта путем замены исходной задачи логически некорректно.
Ну так мы не про задачу же, а про модель реального кода, как бы.
Впрочем, я уверен, что ты уже меня понял полностью, так что предмета для спора нет.
Про дополнительное образение к Next заитриговал. Завтра может найду сообщение с твоим кодом и посмотрю. Что-то никак не могу придумать на кой оно надо. IMHO, в любой верной реализаци надо ОДИН раз у каждого узла взять Next и ОДИН раз каждому прописать, хоть "на месте" оборачивай, хоть "через массив"
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Ну я тоже так читаю. Например 1С-пограммисты
Про них речь здесь не шла.
E> или там бэйсикисты
Бейсик нынче уже совсем не тот, это C# с другим синтаксисом.
E>, или как их надо называть? просто понятие "программист" широкое довольно. E>Но я вполне верю, что вам такие могут быть и не нужны.
Ну вот gandjustas утверждает, что под шерпоинт надо писать полноценный код, не сильно ограниченный в плане сложности и доступных фич. Врет?
А Undying утверждает, что для DSP не нужно не только понимание концепции ссылок, но даже и базовая для DSP математика.
НС>>Я писал пост в форум, а не на собеседование ответ. Тут и опечаток в тексте целая пачка, это ж не означает что я по руски писать без ошибок не могу. E>Я не хотел сказать что-то плохое про тебя, просто дал иллюстрацию, что с перечислением накосячить проще. даже тебе.
Я точно так же тем же самым способом мог накосячить и в варианте со списком — там же тоже последний элемент вне цикла обрабатывается.
E>Думаешь?.. E>Я вот формулу не знаю, я знаешь как считаю такие суммы? Мне вот очевидно, что если добавить эти же числа, но в обратном порядке и через один, то есть 1 + 1000 + 2 + 999 + 3 + 998 + ... + 1000 + 1, и расставить там скобок (1 + 1000) + (2 + 999) + ... + (1000 + 1), то получится 1001000, и это будет искомая сумма взятая дважды, так что искомая будет 500500...
Это и есть вывод формулы. Но графически ее вывести даже проще, формулу площади параллелепипеда и прямоугольного треугольника даже ты должен помнить.
А оценочно я вообще прикидываю как An/2*n — это интуитивно понятная формула, и для рядов типа твоего дает маленькую погрешность.
E>Но в целом я просто рассказал тебе тайну, как отсеивают совсем глупых.
Для совсем глупых у нас был тест на основы C# — 20 простейших вопросиков с вариантами ответов. Этот тест писался в кабинете у ХР.