|
Загадки Постим и отгадываем загадки. Флуд запрещён - только условия и обсуждение решений. |
17.03.2011, 14:55
|
#1
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Задачка на математику и логику.
В общем, т.к. у нас в компании я второй по должности (но это мне не мешает решать всё за себя самостоятельно и быть независимым), я не провожу тесты на приём на работу, но яро стараюсь участвовать в анализе кода, который пишут "тестируемые".
В общем т.к. это делается на форуме, задачка на честность - использовать средства разработки - нельзя. Пишите псевдокод сразу тут но обязательно оберните в тег "оффтоп".
Затем чтобы те кто заинтересуются задачкой, не смотрели на чужой результат прежде чем начинать свой.
Правила:
1. Писать пседво-код решения задачки в теге OFFTOP.
2. Использовать компиляторы или калькуляторы не разрешается, будьте честными для собственного спортивного интереса.
3. Проверять конечный результат в компиляторе не разрешается. Тут важен поток мысли и идеи, а не сам результат, т.к. естественно в нормальных условиях будет проверено. Если не допустите сильных логических и математических ошибок - плюс, но не сильно влияет на саму суть теста.
Задача:
Объявить двумерный массив m[x,y], размерностью 5x5.
Заполнить массив m числами делимыми на 5, от 5 до 100 (включая) (пример: 5, 10,15 ... 85, 90, ...) в массив пробегаясь по x и y последовательно. Пример: (i1 - m[1,1], i2 - m[1,2], ... , i8 - m[2,3], ...) ( in - итерации).
Вывезти на экран координату в массиве ( x,y) по которым в массиве m будет одно из чисел: 20, 40, 60, 80, 100. В такой форме: " m[x,y] = a" (заменить x,y на координаты, и a на число которое соответствует запрашиваемым).
Ожидаемый результат на экране:
m[0,3] = 20
m[1,2] = 40
m[2,1] = 60
m[3,0] = 80
m[3,4] = 100
Соблюдайте правила
Потом можно будет вместе разобрать варианты ответов и описать ошибки, ошибки "приветствуются"
Последний раз редактировалось moka, 17.03.2011 в 18:39.
|
(Offline)
|
|
17.03.2011, 17:17
|
#2
|
Бывалый
Регистрация: 16.09.2009
Адрес: Sun system
Сообщений: 831
Написано 442 полезных сообщений (для 1,836 пользователей)
|
Ответ: Задачка на математику и логику.
Язык не важен?
// Мне немного трудно перестроиться на другой язык, пишу на C#
int m[,]=new m[5,5];
int x;
for(int c=0;c<25;c++){
m[c%5][c/5]=(c+1)*5;
}
x=Сonvert.ToInt32(Concole.Read()); // Не помню правильный синтаксис.
Console.WriteLine("m[{0},{1}]={2}",((x/5)-1)%5,((x/5)-1)/5,x);
|
(Offline)
|
|
17.03.2011, 18:38
|
#3
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Задачка на математику и логику.
FireOwl, можно писать на чём угодно.
Вот немного комментариев по задаче и коду, моё имхо:
Задача видимо не совсем понята правильно, суть в чём:
Создаётся массив 5,5 (у тебя это есть), далее заполняется числами от 5 до 100. Заполнение есть, то что оно выходит за радиус 100 - не обговаривалось в задаче, поэтому то что ты заполнил до 125 - не проблема.
Далее идёт чтение номера, получается в коде ты получаешь номер, и далее находишь по числу (значение в массиве) индекс. По идее верно, с одним условием, что если мы изменим массив немного, получится что вычисления не будут корректными, т.к. подразумевается что массив всегда соответствует тому что был создан (условно "статичен").
Только первая часть задания была выполнена.
Но также, исходя из задачи, чередование было сперва по y затем x, в твоём решении наоборот, хотя результат от этого не меняется, лишь "логика" хранения данных, что порой может сбивать с толку.
Вторая часть задания не совсем была понята корректно, для ясности я внёс в первый пост пример вывода, который должен получиться.
Насчёт деталей. Они правда в основном на внимательность, и средство разработки поправит чаще всего, но всё же прокомментирую:
Двумерный массив объявляется так: Остальное весьма корректно.
По идее всё более менее конечно, если быть не грубым, но такой подход цикла не совсем корректен с математической и логической точки зрения, т.к. основывается на определённых условиях задания, это относится к числу 25 - как ограничение в цикле, что было тобою вычислено исходя из количества элементов в массиве и длине шага (5), 5*5 = 25 - столько элементов, в задании было сказано от 5 до 100. Как уже говорил не столь важно от части. Но при изменении размера массива, придётся пере вычислять его размер, и т.п. хотя в более корректном варианте всё равно будет тоже зависимость от количества элементов.
А так весьма неплохое начало.
имхо
ЗЫ, тоже на C# пишу, нравится язык и инструментарий.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
17.03.2011, 21:01
|
#4
|
Дэвелопер
Регистрация: 10.09.2007
Сообщений: 1,442
Написано 793 полезных сообщений (для 1,460 пользователей)
|
Ответ: Задачка на математику и логику.
Сообщение от MoKa
В общем, т.к. у нас в компании я второй по должности...
использовать средства разработки - нельзя.
|
страшно представить что ты будешь вытворять, когда дорвешься до собеседований..."эффект вахтера" в действии.
задачку не читал, похожа на "школьную" херню.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
17.03.2011, 21:06
|
#5
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Задачка на математику и логику.
Сообщение от ffinder
страшно представить что ты будешь вытворять, когда дорвешься до собеседований..."эффект вахтера" в действии.
задачку не читал, похожа на "школьную" херню.
|
Поясни что такое "эффект вахтера" в твоём понятии?
К чему вообще комментарий? Типо, делать нечего, но чёт делать нада, мол фигня для тебя, дык, давай своё решение тогда.
Если тебе не ясна суть анализа и ты не имеешь никакого понятия в анализе человеческого мышления в отдельных направлениях, то конечно, для тебя не будет иметь никакого значения такая задачка. Если ты читал внимательно начало, то понял что эта задачка для собеседования, и весьма популярна. И самое интересное, с ней мало кто достойно справляется, а половина вообще ахинею пишет. Это идёт речь о коммерчески опытных разработчиках!..
|
(Offline)
|
|
17.03.2011, 21:10
|
#6
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Задачка на математику и логику.
2 ffinder
Я думаю, МоКа, приведёт в конце разбор наших решений, продемонстрировав как различные алгоритмы характеризуют те или иные качества деятельности будущего сотрудника. Так что не стоит наперёд его называть http://lurkmore.ru/Синдром_вахтёра, МоКа этот тред не ради бахвальства затеял, а в целях просвятительских: систематизировать подход к подбору кадров.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
|
|
17.03.2011, 21:37
|
#7
|
Бывалый
Регистрация: 16.09.2009
Адрес: Sun system
Сообщений: 831
Написано 442 полезных сообщений (для 1,836 пользователей)
|
Ответ: Задачка на математику и логику.
Пробую принять замечания во внимание:
int mw=5,mh=5,x;
int[,] m=new int[mw,mh]; // Тут меня всегда поправляет студия, хотя я знаю как правильно =)
// Предполагаю, что массив заданных размеров способен вместить 100 чисел. Но можно условие присобачить.
for(int c=0;c<100;c++){
m[c%mw][c/mw]=(c+1)*5; // Здесь я наверное что-то не понимаю. Я заполняю массив "книжкой", т.е. построчно,
// справа налево, сверху вниз. А как надо?
}
// Массив возможно изменяется, предполагаю, что числа могли перемещаться любым случайным (или нет) образом. Переменные mw,mh принимают новое значение.
// Тут мне не приходит в голову других решений кроме поиска по числу.
for(int c=0;c<5;c++){
for(int a=0;a<mw*mh;a++){
if(m[a%mw][a/mw]==(c+1)*20){ Console.WriteLine("m[{0},{1}]={2}",(a%mw),(a/mw),(c+1)*20); break; }
}
}
// В остальных случаях можно подправить мое первое решение под поиск по новым размерам, или сохраненным старым.
// (Если новый массив числа заполнят по тому же принципу, или останутся "в уголке" с теми же координатами, что и в массиве старого размера)
P.S. Я не считаю себя еще настолько крутым программистом, что бы с презрением относиться к "школьным" задачкам. Мне интересно сравнить мое решение с не моим.
P.P.S. Почему форум затирает все отступы перед строкой? (Кроме текста внутри тега code)
|
(Offline)
|
|
17.03.2011, 21:40
|
#8
|
Дэвелопер
Регистрация: 10.09.2007
Сообщений: 1,442
Написано 793 полезных сообщений (для 1,460 пользователей)
|
Ответ: Задачка на математику и логику.
почему я должен доверять моке в анализе личности?
подбор кадров происходит гораздо проще. есть два фактора:
1) может/не может писать код
2) будет/не будет писать код за оговоренные деньги
фсё.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
17.03.2011, 21:51
|
#9
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Задачка на математику и логику.
Сообщение от ffinder
почему я должен доверять моке в анализе личности?
подбор кадров происходит гораздо проще. есть два фактора:
1) может/не может писать код
2) будет/не будет писать код за оговоренные деньги
фсё.
|
Зы, почитал на лукоморе про Синдром Вахтёра (Спасибо impersionalis), посмеялся, под конец рабочего дня, реально подняло настроение.
ffinder, Скудно..
Сообщение от ffinder
почему я должен доверять моке в анализе личности?
|
Никому ты ничего не должен. Только мне интересна твоя позиция, получается я в твоём видении не способен выполнять задачи, которые выполняет человек принимая другого на работу? Мне любопытны аргументы. "Возраст", сразу говорю, не аргумент, и без обсуждений.
Какие критерии доверия для тебя будет выражать другой работодатель?
Сообщение от ffinder
1) может/не может писать код
|
Fail.
Сообщение от ffinder
2) будет/не будет писать код за оговоренные деньги
|
Коммерческая разработка это не только писать код. Fail снова.
Сообщение от ffinder
фсё.
|
Третий Fail.
Если потребуются аргументы "фэйлов", предоставлю с радостью
|
(Offline)
|
|
17.03.2011, 22:05
|
#10
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Задачка на математику и логику.
FireOwl, я тоже обожаю задачки такого рода.
По поводу версии 2:
Первое заполнение массива было правильным в плане итераций, лишь поменяны местами индексы. Не "m[c%5,c/5]", а "m[c/5,c%5]". Тогда будет перелистывать все y для каждого x.
В новом примере, первый цикл теперь выходит за пределы массива, т.к. цикл до 100, а по формуле "c/mw" будут варианты больше 5, что вылезет как runtime ошибка.
Если поставить ограничение в первом цикле на 25, то программа продолжится.
Вторая часть программы с вложенным циклом верна, за исключением коррекции в первом (поменять вычисления для индексов местами, для y будет с модулем.
Результат правильный, с коррекциями.
Теперь относительно вложенного цикла (for (int a=0;a<mw*mh;a++) {). Посчитай количество итераций, с учётом первого цикла. В данном случае вложенный цикл почти не отличается от первого цикла, где ты заполняешь сам массив, это смекалка для данной задачи - ты бы мог вывезти результат при заполнении массива, плюс за смекалку, минус за то что меньше математики и дополнительного цикла, в данном бы случае, стоило бы узнать у тестируемого, как бы он разделил приложение, сделал бы второй цикл, для проверки математики.
В первом цикле ты устанавливаешь результат, но ты ведь его уже приписал в массиве, он уже есть в массиве, и его не нужно получать. Закономерность запрашиваемых циклов в том что они чередуются 20, думаю это ещё одна подсказка, что поможет упростить.
Второй цикл, можно разобрать для читаемости на два, как цикл по x и по y, но и этот вариант хорош, лишь менее читабелен и немного менее адаптируемый для модификаций.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
17.03.2011, 22:13
|
#11
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Задачка на математику и логику.
Я бы написал как-то так:
int[,] m= new int[5,5]; int step = 5; int current = 0; for(int x=0; x<5; x++) { for(int y=0; y<5; y++) { current += step; m[x,y] = current; if (current % 20 == 0) Console.WtiteLine("m[{0},{1}]={2}", x,y,current ); } }
|
(Offline)
|
|
17.03.2011, 22:17
|
#12
|
Разработчик
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений (для 638 пользователей)
|
Ответ: Задачка на математику и логику.
Вывезти на экран координату в массиве (x,y) по которым в массиве m будет одно из чисел: 20, 40, 60, 80, 100.
|
Судя по этой фразе, на экран нужно вывести всего одну координату.
Но приведенный ниже "Ожидаемый результат" противоречит этому выводу.
pax, твой код выведет и число 0, и 120, а их не нужно выводить.
PS: А что, обязательно нужно заполнять массив последовательными числами? Почему нельзя вставить в (0,0) число 50, а в (0,1) число 45?
//Java
int arrW = 5, arrH = 5;
int[][] arr = new int[arrW][arrH];
for (int i=0; i<arrW; i++) {
for (int j=0; j<arrH; j++) {
int num = (Rnd(20)+1)*5; //Rnd(int n) - возвращает целое число от 0 до n
arr[i][j] = num;
if (num>0 && num%20==0) {
System.out.println("m["+i+","+j+"] = "+num);
}
}
}
В общем, задача сформулирована расплывчато, можно трактовать ее по-разному
|
(Offline)
|
|
17.03.2011, 22:19
|
#13
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Задачка на математику и логику.
Сообщение от Romanzes
pax, твой код выведет и число 0, и 120, а их не нужно выводить.
|
0 не выведет, т.к. начинается с 5
Сообщение от Romanzes
Судя по этой фразе, на экран нужно вывести всего одну координату.
|
тут да не внимательно прочитал )
|
(Offline)
|
|
17.03.2011, 22:22
|
#14
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Задачка на математику и логику.
Сообщение от pax
Я бы написал как-то так:
int[,] m= new int[5,5]; int step = 5; int current = 0; for(int x=0; x<5; x++) { for(int y=0; y<5; y++) { current += step; m[x,y] = current; if (current % 20 == 0) Console.WtiteLine("m[{0},{1}]={2}", x,y,current ); } }
|
тогда мод:
int[,] m= new int[5,5]; int step = 5; int current = 0; bool found = false; for(int x=0; x<5; x++) { for(int y=0; y<5; y++) { current += step; m[x,y] = current; if (!found &¤t % 20 == 0) { Console.WtiteLine("m[{0},{1}]={2}", x,y,current ); found = true; } } }
|
(Offline)
|
|
17.03.2011, 22:26
|
#15
|
Разработчик
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений (для 638 пользователей)
|
Ответ: Задачка на математику и логику.
Сообщение от pax
0 не выведет, т.к. начинается с 5
|
Точно, я тоже ступил
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:28.
|