forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Загадки (http://forum.boolean.name/forumdisplay.php?f=87)
-   -   Задачка на математику и логику. (http://forum.boolean.name/showthread.php?t=14432)

moka 17.03.2011 14:55

Задачка на математику и логику.
 
В общем, т.к. у нас в компании я второй по должности (но это мне не мешает решать всё за себя самостоятельно и быть независимым), я не провожу тесты на приём на работу, но яро стараюсь участвовать в анализе кода, который пишут "тестируемые".

В общем т.к. это делается на форуме, задачка на честность - использовать средства разработки - нельзя. Пишите псевдокод сразу тут но обязательно оберните в тег "оффтоп".
Затем чтобы те кто заинтересуются задачкой, не смотрели на чужой результат прежде чем начинать свой.

Правила:
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

Соблюдайте правила :)
Потом можно будет вместе разобрать варианты ответов и описать ошибки, ошибки "приветствуются" ;)

FireOwl 17.03.2011 17:17

Ответ: Задачка на математику и логику.
 
Язык не важен?

// Мне немного трудно перестроиться на другой язык, пишу на 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);

moka 17.03.2011 18:38

Ответ: Задачка на математику и логику.
 
FireOwl, можно писать на чём угодно.

Вот немного комментариев по задаче и коду, моё имхо:
Задача видимо не совсем понята правильно, суть в чём:
Создаётся массив 5,5 (у тебя это есть), далее заполняется числами от 5 до 100. Заполнение есть, то что оно выходит за радиус 100 - не обговаривалось в задаче, поэтому то что ты заполнил до 125 - не проблема.
Далее идёт чтение номера, получается в коде ты получаешь номер, и далее находишь по числу (значение в массиве) индекс. По идее верно, с одним условием, что если мы изменим массив немного, получится что вычисления не будут корректными, т.к. подразумевается что массив всегда соответствует тому что был создан (условно "статичен").
Только первая часть задания была выполнена.
Но также, исходя из задачи, чередование было сперва по y затем x, в твоём решении наоборот, хотя результат от этого не меняется, лишь "логика" хранения данных, что порой может сбивать с толку.
Вторая часть задания не совсем была понята корректно, для ясности я внёс в первый пост пример вывода, который должен получиться.

Насчёт деталей. Они правда в основном на внимательность, и средство разработки поправит чаще всего, но всё же прокомментирую:
Двумерный массив объявляется так:
Код:

int[,] m = new int[5,5];
Остальное весьма корректно.

По идее всё более менее конечно, если быть не грубым, но такой подход цикла не совсем корректен с математической и логической точки зрения, т.к. основывается на определённых условиях задания, это относится к числу 25 - как ограничение в цикле, что было тобою вычислено исходя из количества элементов в массиве и длине шага (5), 5*5 = 25 - столько элементов, в задании было сказано от 5 до 100. Как уже говорил не столь важно от части. Но при изменении размера массива, придётся пере вычислять его размер, и т.п. хотя в более корректном варианте всё равно будет тоже зависимость от количества элементов.

А так весьма неплохое начало. :)

имхо


ЗЫ, тоже на C# пишу, нравится язык и инструментарий.

ffinder 17.03.2011 21:01

Ответ: Задачка на математику и логику.
 
Цитата:

Сообщение от MoKa (Сообщение 183047)
В общем, т.к. у нас в компании я второй по должности...
использовать средства разработки - нельзя.

страшно представить что ты будешь вытворять, когда дорвешься до собеседований..."эффект вахтера" в действии.
задачку не читал, похожа на "школьную" херню.

moka 17.03.2011 21:06

Ответ: Задачка на математику и логику.
 
Цитата:

Сообщение от ffinder (Сообщение 183080)
страшно представить что ты будешь вытворять, когда дорвешься до собеседований..."эффект вахтера" в действии.
задачку не читал, похожа на "школьную" херню.

Поясни что такое "эффект вахтера" в твоём понятии?
К чему вообще комментарий? Типо, делать нечего, но чёт делать нада, мол фигня для тебя, дык, давай своё решение тогда.
Если тебе не ясна суть анализа и ты не имеешь никакого понятия в анализе человеческого мышления в отдельных направлениях, то конечно, для тебя не будет иметь никакого значения такая задачка. Если ты читал внимательно начало, то понял что эта задачка для собеседования, и весьма популярна. И самое интересное, с ней мало кто достойно справляется, а половина вообще ахинею пишет. Это идёт речь о коммерчески опытных разработчиках!..

impersonalis 17.03.2011 21:10

Ответ: Задачка на математику и логику.
 
2ffinder
Я думаю, МоКа, приведёт в конце разбор наших решений, продемонстрировав как различные алгоритмы характеризуют те или иные качества деятельности будущего сотрудника. Так что не стоит наперёд его называть http://lurkmore.ru/Синдром_вахтёра, МоКа этот тред не ради бахвальства затеял, а в целях просвятительских: систематизировать подход к подбору кадров.

FireOwl 17.03.2011 21:37

Ответ: Задачка на математику и логику.
 
Пробую принять замечания во внимание:

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)

ffinder 17.03.2011 21:40

Ответ: Задачка на математику и логику.
 
почему я должен доверять моке в анализе личности?
подбор кадров происходит гораздо проще. есть два фактора:
1) может/не может писать код
2) будет/не будет писать код за оговоренные деньги
фсё.

moka 17.03.2011 21:51

Ответ: Задачка на математику и логику.
 
Цитата:

Сообщение от ffinder (Сообщение 183086)
почему я должен доверять моке в анализе личности?
подбор кадров происходит гораздо проще. есть два фактора:
1) может/не может писать код
2) будет/не будет писать код за оговоренные деньги
фсё.

Зы, почитал на лукоморе про Синдром Вахтёра (Спасибо impersionalis), посмеялся, под конец рабочего дня, реально подняло настроение.

ffinder, Скудно..
Цитата:

Сообщение от ffinder (Сообщение 183086)
почему я должен доверять моке в анализе личности?

Никому ты ничего не должен. Только мне интересна твоя позиция, получается я в твоём видении не способен выполнять задачи, которые выполняет человек принимая другого на работу? Мне любопытны аргументы. "Возраст", сразу говорю, не аргумент, и без обсуждений.
Какие критерии доверия для тебя будет выражать другой работодатель?

Цитата:

Сообщение от ffinder (Сообщение 183086)
1) может/не может писать код

Fail.

Цитата:

Сообщение от ffinder (Сообщение 183086)
2) будет/не будет писать код за оговоренные деньги

Коммерческая разработка это не только писать код. Fail снова.

Цитата:

Сообщение от ffinder (Сообщение 183086)
фсё.

Третий Fail.

Если потребуются аргументы "фэйлов", предоставлю с радостью ;)

moka 17.03.2011 22:05

Ответ: Задачка на математику и логику.
 
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, но и этот вариант хорош, лишь менее читабелен и немного менее адаптируемый для модификаций.

pax 17.03.2011 22:13

Ответ: Задачка на математику и логику.
 
Я бы написал как-то так:

PHP код:

int[,] m= new int[5,5];
int step 5;
int current 0;
for(
int x=0x<5x++)
{
  for(
int y=0y<5y++)
  {
     
current += step;
     
m[x,y] = current;
     if (
current 20 == 0Console.WtiteLine("m[{0},{1}]={2}"x,y,current );
  }



Romanzes 17.03.2011 22:17

Ответ: Задачка на математику и логику.
 
Цитата:

Вывезти на экран координату в массиве (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);
                }
            }
        }

В общем, задача сформулирована расплывчато, можно трактовать ее по-разному

pax 17.03.2011 22:19

Ответ: Задачка на математику и логику.
 
Цитата:

Сообщение от Romanzes (Сообщение 183091)
pax, твой код выведет и число 0, и 120, а их не нужно выводить.

0 не выведет, т.к. начинается с 5


Цитата:

Сообщение от Romanzes (Сообщение 183091)
Судя по этой фразе, на экран нужно вывести всего одну координату.

тут да не внимательно прочитал )

pax 17.03.2011 22:22

Ответ: Задачка на математику и логику.
 
Цитата:

Сообщение от pax (Сообщение 183090)
Я бы написал как-то так:

PHP код:

int[,] m= new int[5,5];
int step 5;
int current 0;
for(
int x=0x<5x++)
{
  for(
int y=0y<5y++)
  {
     
current += step;
     
m[x,y] = current;
     if (
current 20 == 0Console.WtiteLine("m[{0},{1}]={2}"x,y,current );
  }



тогда мод:

PHP код:

int[,] m= new int[5,5];
int step 5;
int current 0;
bool found false;
for(
int x=0x<5x++)
{
  for(
int y=0y<5y++)
  {
     
current += step;
     
m[x,y] = current;
     if (!
found &&current 20 == 0
     {
        
Console.WtiteLine("m[{0},{1}]={2}"x,y,current );
        
found true;
     }
  }



Romanzes 17.03.2011 22:26

Ответ: Задачка на математику и логику.
 
Цитата:

Сообщение от pax (Сообщение 183093)
0 не выведет, т.к. начинается с 5

Точно, я тоже ступил


Часовой пояс GMT +4, время: 03:15.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot