На колу мочало, начинай сначала. Я уже ответил на все эти вопросы. Описал, почему, что и как. И то, нафига это написал, и то, что имел ввиду, говоря, что задача тривиальная. Там все написано русским по светло-серому. Могу повторить в кратком виде: 1) Я сказал, что это какая-то извращенная форма тривиальной задачи. 2) Ты начал диалог со мной, спросив решение того, что я назвал тривиальной задачей. При этом контекст был задан пунктом 1. 3) Я ответил на твой вопрос. Пожалуйста, не спрашивай и в третий раз один и тот же вопрос. Впервые в жизни, когда меня переспрашивают, я отвечаю каждый раз не в более расширенном варианте, а в более кратком. Я ответил тебе максимально развернуто в нескольких вариациях. Исчерпывающе настолько, насколько можно. С описанием логики моих действий от и до. По-моему этого должно быть достаточно.
ты написал "это трививальная задача". Без пояснения, что ты имеешь в виду совсем другую, не эту, задачу. Я хочу, чтобы ты просто согласился с такой трактовкой. Для меня это важно.
Контекст, Игорь. Контекст. В нем все, что ты хочешь узнать. Мне казалось, что то, что я говорю не конкретно о том, что задали автору, а о том, чем это является в общем виде, очевидно. Если недостаточно очевидно без пояснений, то их было уже несколько. Исчерпывающих. Разве не очевидно, что я имел ввиду? Разве не очевидно, что тривиальной задачей я назвал именно разворачивание дерева в памяти? Разве не очевидно, что я при этом подчеркнул отдельно, что для тривиальной задачи почему-то требуют странное и глупое решение? Разве это не было написано прямо? У меня ощущение, что ты про привычке бесед с известными товарищами, пытаешься устроить провокацию, сам того не осознавая, но я не понимаю, почему тот факт, что тривиальной задачей я назвал развертывание MPath-дерева, а не то, как попросили это сделать автора, до сих пор тебе не очевиден. Очевиднее только снег на северном полюсе. Я даже жирным шрифтом выделял это. Серьезно. Я несколько раз это говорил прямо. И говорю снова. Прямо. Вот честно. Прямо как линия, лежащая всего на двух точках. И подчеркивал, что нигде не говорил обратного. Ну чесслово, хватит прокидывать мои простыни текста и пытаться вытащить на свет то, что никто не скрывал, и чем сам машет перед всеми.
мне не очевидно. Я вижу, что чел говорит про то, что нужно разбираться в странных задачах. А ты говоришь, что это тривиальная задача. Ты называешь странную задачу тривиальной. Это у меня так мозги работают, сори. понятно, что тебе это очевидно, ведь у тебя в голове есть ход твоей беседы. А у меня-то нет твоих мыслей. Мне кажется это нормально. =) Ничего плохого не имел в виду, просто для меня это выглядело именно так.
Может это задача с подвохом. Типа ты должен возмутится. - Ребята вы мне какую-то дичь втираете, так не делается. А делается так... - О чувак, да ты шаришь. Завтра к 9 утра.
Да, я про это тоже написал выше. Эдакий тест на профпригодность. CodeMonkey возьмется пилить любой ценой не думая. Джун или Миддл призадумается и начнет задавать вопросы. Сеньор увидит, что это и к чему, и скажет, что "да вы все ебанулись, если у вас и все остальное так же, вы мне не подходите".
Может быть и так, потому что они на собеседование все равно позвали) Но задача и вправду странная, на собеседовании попрошу решение
крайне хуёвый тест, который может отвернуть людей, которые не хотят уже тратить своё профессиональное время на танцы с морочками болявых HR.
=( я считаю, что нанимать команду должен непосредственный руководитель этой команды. А не HR болявые. Да...
напомнило: Знакомый на работу устраивался. Сварщиком. Собеседование в отделе HR (Модно сейчас — "эйчар"). Мастер цеха пришёл и сидят вместе с девочкой–кадровичкой общаются. Мастер спрашивает что варил, разряд и прочие тонкости. Вопросов много задавал, знакомый отвечал и рассказывал. Девочка слушала. Побеседовали минут двадцать. Мастер говорит девочке прямо при знакомом: "Ну, специалист, вроде, толковый — прошу оформить к нам." Девочка: "Подождите! Надо пройти ещё психологический тест!" Мастер: "А что за тест?" Девочка: "Ну, психологический! Мы должны понять же, человек подходит нам или нет, как Вы не понимаете?" Мастер: "Так а что в этом тесте то?" Девочка: "Ну, линии там, круглешочки, картинки показываем человеку, а на основании его ответов составляем картину совместимости, даём руководству ясное представление о работнике, которого принимаем." Мастер: "Давай бумажку — я за него нарисую." Девочка оху..вает слегка, но даёт лист А4 и ручку. Мастер выводит на ней контуры (без анатомических подробностей!) фига, протягивает её и спрашивает:"Что я нарисовал?" Девочка краснеет, но говорит: "Член." Мастер девочке говорит: "Юля! Будь добра, оформи человека без всей этой твоей х..йни, пока я всем не сказал, что ты деталь НВ–46–39–00 из каталога нашего завода с х..ем путаешь."
Если кому интересно, я решил задачу путешествия по ветвям развернутого дерева через mPath-адреса, без рекурсий и циклов. Кому отборнейшей индусятинки? Серьезно, этот код настолько индусский, что он пахнет карри. PHP: <?php function getElementByPath($array, $path) { $shame = false; $wow_such_result = [$path,&$shame]; $fucking_madness = json_encode($array); $fucking_madness = str_replace('":{"', '.', $fucking_madness); $fucking_madness_so_madness = explode(',', $fucking_madness); array_walk($fucking_madness_so_madness, function ($shit, $shitted_key, $ohmygod) { $shit = str_replace(['"','{','}'], '', $shit); $holy_shit = explode(':',$shit); if ($holy_shit[0] === $ohmygod[0]) { $ohmygod[1] = $holy_shit[1]; } },$wow_such_result); return $shame; } $arr = ['s1' => ['s2' => ['s3' => ['s8' => '123']]], 's4' => ['s5' => ['s6' => '321']]]; var_dump(getElementByPath($arr,'s1.s2.s3.s8')); // 123 var_dump(getElementByPath($arr,'s4.s5.s6')); // 321 var_dump(getElementByPath($arr,'s4.s5.s6.s555')); // false Да, там есть легкая, кхм, обфускация названий переменных, дабы автор не скопипастил не глядя. Иначе будет конфуз. Надо, чтобы он попытался для себя разобраться, что там, черт возьми, происходит.
Осталось написать функцию, которая делает то же самое, но через циклы и рекурсию (первый код, что я выложил, не пойдет, он решает задачу развертывания дерева из MPath в массив, в то время как тут задача навигации по такому массиву через MPath, что само по себе дебилизм, ну да ладно), задать тяжелую структуру и проверить, что работает быстрее и экономинее. Да, мой индусский код работает только в случае, если по адресу вы выбираем конечное значение, а не подветвь. Про подветви у автора в задании ничего не было. В крайнем случае - сам допишет. Джими Джими Димими, айха айха! --- Добавлено --- Не, надеюсь, я еще не настолько обезумел.
Написал рекурсивно-цикловую альтернативу: PHP: function getElementByPath_no_indus($array, $path) { $result = false; if (!is_array($path)) { $path_nodes = explode('.', $path); $result = getElementByPath_no_indus($array, $path_nodes); } foreach ($array as $key => $val) { if ($key === $path[0]) { if (is_array($val)) { array_shift($path); $result = getElementByPath_no_indus($val, $path); } else { if (sizeof($path) === 1) { $result = $val; } else { break; } } break; } } return $result; } Напилил массивчик небольшой: PHP: $arr = ['s1' => ['s2' => ['s3' => ['s8' => '123']]] , 's24' => ['s5' => ['s6' => '321']] , 's34' => ['s5' => ['s6' => '321']] , 's44' => ['s5' => ['s6' => '321']] , 's54' => ['s5' => ['s6' => '321']] , 's64' => ['s5' => ['s6' => '321']] , 's74' => ['s5' => ['s6' => '321']] , 's84' => ['s5' => ['s6' => '321']] , 's94' => ['s5' => ['s6' => '321']] , 's04' => ['s5' => ['s6' => '321']] , 's114' => ['s5' => ['s6' => '321']] , 's124' => ['s5' => ['s6' => '321']] , 's134' => ['s5' => ['s6' => '321']] , 's144' => ['s5' => ['s6' => '321']] , 's154' => ['s5' => ['s6' => '321']] , 's164' => ['s5' => ['s6' => '321']] , 's14' => ['s5' => ['s6' => '321']] , 's194' => ['s5' => ['s6' => '321']] , 's104' => ['s5' => ['s6' => '321']] , 's1234' => ['s5' => ['s6' => '321']] , 's324' => ['s5' => ['s6' => '321']] , 's414' => ['s5' => ['s6' => '321']] , 's2354' => ['s5' => ['s6' => '321']] , 's634' => ['s5' => ['s6' => '321']] , 's224' => ['s5' => ['s6' => '321']] ]; Прогнал все это тысячу раз. Результаты тестов: На не индусятину ушло 0.0313119888 сек. Расход памяти, 'Не индусятина': 584 байт На индусятину ушло 0.1418280602 сек. Расход памяти, 'Индусятина': 144 байт Предварительные выводы: индусскиое решение в 4 раза экономнее по памяти, чем цикл с рекурсией, что, в общем, логично, ибо рекурсия любит похавать, ведь между вызовами накапливаются дубликаты данных и контексты вызова надо где-то хранить, но, в то же время, цикл с рекурсией отрабатывает в те же 4 раза быстрее, чем индусское решение. По-своему классика. --- Добавлено --- Прогон 10к раз: На не индусятину ушло 0.1927959919 сек. Расход памяти, 'Не индусятина': 584 байт На индусятину ушло 1.1899449825 сек. Расход памяти, 'Индусятина': 144 байт Затраты по памяти неизменны, затраты по времени выросли и стали отличаться примерно в 6 раз в пользу цикла с рекурсией.
Чуть углубил массив: PHP: $arr = ['s1' => ['s2' => ['s3' => ['s8' => '123']]] , 's24' => ['s5' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => '321']]]]]]]]]]]] , 's34' => ['s5' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => '321']]]]]]]]]]]] , 's44' => ['s5' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => '321']]]]]]]]]]]] , 's54' => ['s5' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => '321']]]]]]]]]]]] , 's64' => ['s5' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => '321']]]]]]]]]]]] , 's74' => ['s5' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => '321']]]]]]]]]]]] , 's84' => ['s5' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => '321']]]]]]]]]]]] , 's94' => ['s5' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => '321']]]]]]]]]]]] , 's04' => ['s5' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => '321']]]]]]]]]]]] , 's114' => ['s5' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => '321']]]]]]]]]]]] , 's124' => ['s5' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => '321']]]]]]]]]]]] , 's134' => ['s5' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => '321']]]]]]]]]]]] , 's144' => ['s5' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => '321']]]]]]]]]]]] , 's154' => ['s5' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => '321']]]]]]]]]]]] , 's164' => ['s5' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => '321']]]]]]]]]]]] , 's14' => ['s5' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => '321']]]]]]]]]]]] , 's194' => ['s5' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => '321']]]]]]]]]]]] , 's104' => ['s5' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => '321']]]]]]]]]]]] , 's1234' => ['s5' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => '321']]]]]]]]]]]] , 's324' => ['s5' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => '321']]]]]]]]]]]] , 's414' => ['s5' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => '321']]]]]]]]]]]] , 's2354' => ['s5' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => '321']]]]]]]]]]]] , 's634' => ['s5' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => '321']]]]]]]]]]]] , 's224' => ['s5' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => ['s6' => '321']]]]]]]]]]]] ]; При этом первый элемент остался коротким. Соответственно, поменялся код вызовов: PHP: for ($i = 0; $i < 1000; $i++) { getElementByPath_no_indus($arr, 's1.s2.s3.s8'); // Короткий элемент getElementByPath_no_indus($arr, 's1234.s5.s6.s6.s6.s6.s6.s6.s6.s6.s6.s6.s6'); // Длинный элемент getElementByPath_no_indus($arr, 's4.s5.s6.s555'); // Несуществующий элемент } for ($i = 0; $i < 1000; $i++) { getElementByPath($arr, 's1.s2.s3.s8'); // Короткий элемент getElementByPath($arr, 's1234.s5.s6.s6.s6.s6.s6.s6.s6.s6.s6.s6.s6'); // Длинный элемент getElementByPath($arr, 's4.s5.s6.s555'); // Несуществующий элемент } Результаты на 1к проходов: На не индусятину ушло 0.0397579670 сек. Расход памяти, 'Не индусятина': 584 байт На индусятину ушло 0.2034401894 сек. Расход памяти, 'Индусятина': 144 байт Расходы по памяти вообще не изменились в абсолютном выражении и все так же 4 к одному в относительном в пользу индусятины. Расходы по времени в среднем расходятся в 5 раз в пользу цикла с рекурсией. Результаты на 10к проходов: На не индусятину ушло 0.3209419250 сек. Расход памяти, 'Не индусятина': 584 байт На индусятину ушло 2.0017540455 сек. Расход памяти, 'Индусятина': 144 байт По памяти без изменений, по времени 6-кратное превосходство рекурсии как и ранее. При этом в абсолютном выражении время, относительно тестов с "коротким" деревом, выросло работы примерно в полтора раза в обоих случаях. xdebug и opcache отключены. Откуда такая постоянность в расходе памяти - не знаю. Мб какая-то внутренняя оптимизация пыха. Версия php - 5.6.
Предварительный итог: Покуда процессорное время дороже памяти, циклы и рекурсия рулят. --- Добавлено --- пхп 7 у меня не стоит на локальном сервере, боевой тоже пока не мигрировал, а ради этого говнища - не хочу заморачиваться. Передача по ссылке в рекурсии экономит 1-2% времени, и никак не влияет на память. Да и по времени отклонения, возможно не более чем погрешность. Какая-то оптимизация в этом плане там явно ощущается. Возможно, при вызове, все параметры неявно передаются по ссылке, а, например при изменении параметра в теле функции идет проверка, мол, если не было указано передавать явно по ссылке, то значение копируется, если было, то нет.
Какой такой цикл? В документации php в разделе "циклы" есть for, foreach, while и, прстигспди, do..while. Никаких array_walk() там нет. По логике работы, оно, конечно, делает перебор, но циклом не является. Мб вечером гляну. Но сдаетс я мне, что изменения будут только в абсолютных величинах, в относительных же мало что поменяется. Хотя, поглядев в свое воспаленное поделие, я увидел, где можно докинуть немного индусской оптимизации.