Sla
|
|
« : 02-03-2012 21:42 » |
|
Нужно три элемента выровнять по высоте максимального. Любой из трех может быть выше всех На часах 12 ночи, может я просто туплю, но мне кажется, что есть что-то несложное в два-три действия.
вот такое родилось if (h1 >= h2 && h1 >= h3 { hmax = h1} if (h2 >= h1 && h2 >= h3 { hmax = h2} if (h3 >= h1 && h3 >= h2 { hmax = h3} h1 = h2 =h3 = hmax
Добавлено через 3 минуты и 51 секунду: Вот еще...
if (h1 >= h2) { h2 = h1 } else { h1 = h2 } if (h2 >= h3) { h3 = h2 } else { h1 = h2 =h3 }
|
|
« Последнее редактирование: 02-03-2012 21:46 от Sla »
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Вад
|
|
« Ответ #1 : 02-03-2012 22:18 » |
|
Я бы сделал (независимо от языка реализации) h1 = h2 = h3 = max(h1, h2, h3) или max(h1, max(h2, h3)). max уже дальше может быть любым из перечисленных вариантов, std::max, или что-то ещё. И пофиг на производительность - вдруг потом это будет читать психопат, знающий, где я живу
|
|
« Последнее редактирование: 02-03-2012 22:20 от Вад »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #2 : 02-03-2012 22:29 » |
|
И пофиг на производительность - вдруг потом это будет читать психопат, знающий, где я живу Ну второй алгоритм как раз и говорит об этом (о психопате) Ни слова о макс
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #3 : 03-03-2012 07:05 » |
|
и пофиг на производительность: int arr[]={h1,h2,h3}; int count=sizeof(arr)/sizeof(*arr);
std::sort(arr,arr+count); int hmax=arr[count-1]; или совсем пофиг на производительность: std::set<int> _set; _set.insert(h1); _set.insert(h2); _set.insert(h3);
int hmax=_set.rbegin();
|
|
« Последнее редактирование: 03-03-2012 07:09 от Алексей1153++ »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #4 : 03-03-2012 09:22 » |
|
Алексей1153++, Не.. так нечестно... у меня нет std
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #5 : 03-03-2012 09:36 » |
|
Sla, сам виноват ) Ну тогда Я бы сделал (независимо от языка реализации) h1 = h2 = h3 = max(h1, h2, h3) или max(h1, max(h2, h3)). max уже дальше может быть любым из перечисленных вариантов, std::max, или что-то ещё. И пофиг на производительность - вдруг потом это будет читать психопат, знающий, где я живу + локальный структур с единственной статической функцией, реализацией max Добавлено через 2 минуты и 59 секунд:хотя, если всё так запущено, пусть остаётся банальный if Добавлено через 1 минуту и 47 секунд:то есть int hmax=0; if (h1 > hmax)hmax=h1; if (h2 > hmax)hmax=h2; if (h3 > hmax)hmax=h3;
|
|
« Последнее редактирование: 03-03-2012 09:40 от Алексей1153++ »
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #6 : 03-03-2012 09:41 » |
|
hmax = 0; if(h1 > hmax) hmax = h1; if(h2 > hmax) hmax = h2; if(h3 > hmax) hmax = h3; h1 = h2 = h3 = hmax;
Алексей1153++, я опоздал
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #7 : 03-03-2012 09:48 » |
|
hmax = h1; if(h2 > hmax) hmax = h2; if(h3 > hmax) hmax = h3; h1 = h2 = h3 = hmax;
Мне так больше нравится
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Dale
|
|
« Ответ #8 : 03-03-2012 12:58 » |
|
Я бы выбрал вариант Вад'а: Во-первых, программа читается как обычный текст: "максимум от h1 и максимума от h2 и h3". Четко и ясно говорит о том, что нужно сделать, а не как это нужно сделать. Не нужно вникать во все выкрутасы, что чему при каких условиях присваивается. Не забываем, что программы читают не только компиляторы, но и люди. Принцип "грамотного программирования" Кнута. Во-вторых, если функция или макрос max не библиотечные, а самодельные, для них очень легко написать набор модульных тестов и поиметь уверенность, что данный фрагмент работоспосбен. А вот если в клудже "если ..., то ..., иначе если ..., то ..., иначе ... (и еще много раз)" что-то невзначай испортится, искать причину будете долго. Опять же, если вместо максмума, не дай бог, понадобится минимум... Или добавятся еще один-два параметра... По мне, чем меньше в программе клуджей, тем лучше.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Sla
|
|
« Ответ #9 : 03-03-2012 13:13 » |
|
Возможно так и сделаю Задача элементарная. Выровнять три блока по высоте на странице. Заранее неизвестно какой из блоков будет выше. Решение: Получить высоту блока (о методах здесь пока не говорим) Найти максимум Изменить высоту на максимальную.
1. Скорость? Это делается один раз при загрузке страницы 2. Оптимальность? Только в размере кода. h1=h2=h3 = Math.max(h1,h2,h3) 3. Читабельность и сопровождаемость. Это краеугольный камень
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
zubr
Гость
|
|
« Ответ #10 : 03-03-2012 13:53 » |
|
Один хрен, если что то испортится, то искать причину придется. А если на каждый клудж делать тест, то я бы точно уже без штанов ходил.
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #11 : 03-03-2012 14:29 » |
|
Если в программе есть клуджи и нет тестов, ее можно считать испорченной уже на этапе написания с достаточно высокой вероятностью. Штаны при таком подходе, пожалуй, лучше и не надевать вовсе, чтобы потом не тратить на их съем лишнее время, - все равно щеголять в них долго вряд ли придется.
P.S. Дабы не разводить бесплодных дискуссий, сразу же оговорюсь, что я не имею в виду совершенно неведомую мне область "социального программирования". Там действуют свои собственные законы и правила, ортогональные известным мне. Речь скорее о более привычных мне встроенном софте реального времени и серверных приложениях.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Sla
|
|
« Ответ #12 : 04-03-2012 09:34 » |
|
Если в программе есть клуджи и нет тестов, ее можно считать испорченной уже на этапе написания с достаточно высокой вероятностью. Штаны при таком подходе, пожалуй, лучше и не надевать вовсе, чтобы потом не тратить на их съем лишнее время, - все равно щеголять в них долго вряд ли придется.
P.S. Дабы не разводить бесплодных дискуссий, сразу же оговорюсь, что я не имею в виду совершенно неведомую мне область "социального программирования". Там действуют свои собственные законы и правила, ортогональные известным мне. Речь скорее о более привычных мне встроенном софте реального времени и серверных приложениях.
1. Чесслово не знаю что такое клудж... (инет в этом плане мне не помог) 2. Тесты - жизнь покажет На самом деле тест проводится, но не пишется 3. Элементарность задачи я описал, и... нет необходимости распространения на большой объем данных. Впрочем приведенное решение - для любого размера Поиск упрощенного алгоритма идет с очень давнего времени, когда " деревья контроллеры были большие", а скорости не хватало. Например. Как быстро умножить на 10. (инструкций умножения в контроллере нет)
|
|
« Последнее редактирование: 04-03-2012 09:37 от Sla »
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Dale
|
|
« Ответ #13 : 04-03-2012 10:26 » |
|
1. Чесслово не знаю что такое клудж... (инет в этом плане мне не помог) Строго говоря, это слово правильно произносится "кладж" (kludge), но в рускоязычном варианте почему-то больше прижился именно "клудж". Викисловарь: жарг. клудж (устройство, программа или часть программы, которые теоретически не должны работать, но почему-то работают). Английская Вики: A kludge (or kluge) is a workaround, a quick-and-dirty solution, a clumsy or inelegant, yet effective, solution to a problem, typically using parts that are cobbled together. This term is diversely used in fields such as computer science, aerospace engineering, Internet slang, and evolutionary neuroscience. Еще вариант: Практически все сходятся на том, что термин получил распространение в 1962 году после публикации статьи под названием «Как спроектировать клудж», иронично написанной компьютерным пионером по имени Джексон Гренхольм, определившим клудж как «набор несовместимых друг с другом плохо подогнанных элементов, образующих ужасающее целое». И далее: «создание клуджа – работа не для любителей. Тут требуется неизъяснимая мазохистская ловкость. Профессионал поймет это сразу. Любитель может предположить, что именно так и устроен компьютер». Как быстро умножить на 10. (инструкций умножения в контроллере нет) Например: 1. Сдвинуть множимое на 1 разряд влево (== умножить на 2). Запомнить. 2. Сдвинуть результат п.2 еще на 2 разряда влево (== умножить на 4). 3. Сложить результаты п.п. 1 и 2. (2*X + 8*X = 10*X). Сдвиг в системе команд наверняка найдется (хотя бы на 1 разряд за раз).
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Sla
|
|
« Ответ #14 : 04-03-2012 10:40 » |
|
Например. Как быстро умножить на 10. (инструкций умножения в контроллере нет) Ну да... Сдвинуть дважды влево и дважды прибавить само себя. по поводу клуджей... Я ознакомился с вики, у меня вопрос, скорей всего, относился вот к этому Если в программе есть клуджи и нет тестов, Т.е. мой моСК отказался это понимать. Наличие клуджей и тестов в данной задаче Т.е. теоретически не должны работать, но почему-то работают. Теоретически это работает, и практически это работает. Тестов нет и клуджей нет.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Dale
|
|
« Ответ #15 : 04-03-2012 10:56 » |
|
В данном контексте "клудж" относится скорее к неэлегантности и неуклюжести решения, хотя и работающего (a clumsy or inelegant, yet effective, solution to a problem).
Компьютеру все равно, он выполнит любой набор литер, не нарушающих требования формальной грамматики. А вот человеком, читающим программу, фразы "возьми максимальное значение из (h1, h2, h3)" и "если h1>h2, тогда возьми h1, иначе, если..." воспринимаются существенно по-разному.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
|