LINUX.ORG.RU

А вы бы приняли такой ответ?

 , ,


0

2

Привет ЛОР!

Недавно,между делом, хотел пройти маленький тест на php задача была такова: нужно объявить массив, в цикле от 1 до 100 заполнить его случайными цифрами (тоже от 1го до 100), и в итоге получить массив с уникальными значениями, реализовать минимальным кол-вом строк

Чтоб решить по-быстрому и красиво я прибегнул к жульничеству:

<?php
$arr = range(1, 100);
shuffle($arr);
foreach ($arr as $key) {
    echo "$key ";
    }
?>

То есть, результат вроде бы тот, что нужно, но достигнут не тем путём, который требовался.

А сжульничал я во-первых, потому, что если генерировать случайные числа через mt_rand() нам нужно после избавиться от дублей и, в то же время, обеспечить, чтобы в массиве точно были все числа от 1 до 100.

Во-вторых, потому, что посчитал это красивым решением да и требовали минимум строк :-)

Пацаны это лечится?!

★★★★★

Последнее исправление: Twissel (всего исправлений: 2)

Так пойдёт?

(let [n 100]
  (->> #(rand-int n)
       repeatedly
       distinct
       (take n)))

Одной строкой:

(let [n 100] (take n (distinct (repeatedly #(rand-int n)))))
Выхлоп:
(95 11 73 39 70 25 51 61 5 14 44 91 12 47 33 10 88 69 81 41 56 87 48 38 54 90 62 26 84 31 2 53 15 22 16 86 17 7 27 77 76 99 68 97 71 34 8 60 21 79 28 66 72 1 36 85 19 13 43 65 42 4 3 52 18 80 23 58 78 30 74 50 82 75 63 94 6 9 37 57 24 35 45 59 40 0 20 67 29 46 64 83 93 89 98 49 55 32 96 92)

Hertz ★★★★★
()
Последнее исправление: Hertz (всего исправлений: 1)

реализовать минимальным кол-вом строк

Зачем устраиваться в компанию где ставят такие глупые условия? Я бы просто пошёл на следующее собеседование.

vladimir-vg ★★
()
Последнее исправление: vladimir-vg (всего исправлений: 1)
Ответ на: комментарий от vladimir-vg

Не сказал бы, что оно особо глупое, просто они не знают для чего они его ставят это да.

Ну, так вышло :-)

Twissel ★★★★★
() автор топика

И, в качестве финала, ответ от представителя компании:

$a=array();
for($i=0;$i<100;$i++){
 $t=rand(1,100);
 $a[$t]=$t;
}

Жду комментов, напоследок то :-)

Twissel ★★★★★
() автор топика
Ответ на: комментарий от Twissel

я вот невкурсе как оно там в пхп, но разве этот код не создает массив в который по случайным индексам заносит значения этих же индексов? причем тут не факт, что будет 100 элементов, правильно? Чота странно.

anonymous
()
Ответ на: комментарий от Twissel

ответ от представителя компании

Полное говно. Там каждый раз разная длина массива выходит. В $t может одно и то же число раз 20 прописаться, и эти 20 раз затрётся соответствующий ключ. А количество оставшихся итераций уменьшается...
Так что у тебя получилось получше всяко.

Hertz ★★★★★
()
Ответ на: комментарий от Twissel

ответ от представителя компании

так он условию не соответствует, будут в массиве дырки-нули, и номера по порядку идут...

bormant ★★★★★
()
Ответ на: комментарий от Hertz

Вот и я о том же...

Ответил еще, что прочитав топик, много смеялся и понял, откуда в мире столько хренового кода.

Да-с, показательно, однако.

Хоть бы под аноном чего-то тут людям отписал

Twissel ★★★★★
() автор топика
Ответ на: комментарий от Twissel

Хоть бы под аноном чего-то тут людям отписал

Дык его ж зачморят тут сразу. Лучше пусть заявление на увольнение пишет этот напыщенный говнокодер, который «понял, откуда в мире столько хренового кода».

Hertz ★★★★★
()
Последнее исправление: Hertz (всего исправлений: 1)
Ответ на: комментарий от Twissel

И, в качестве финала, ответ от представителя компании:

Его (вместе с автором) нужно отнести в палату мер и весов, как эталонный быдлокод.

anonymous
()
Ответ на: комментарий от Twissel

Ответил еще, что прочитав топик,

Ты погоди, погоди ... я вот ваще ни разу не пхпшник, но как бы понимаю, что его вариант - ваще не вариант и не подходит под техзадание. Ну если только у пхпшников это в порядке вещей.

ну а если отписаться не хотит и предстать перед судом ЛОРа по обвинении в неадекватности и говнокодерстве, мож на всеобщее обозрение ссылочку на конторку дашь, ну чтоб не связываться с ними есси чо.

anonymous
()
Ответ на: комментарий от anonymous

Да он шифруется, ни в профиле скайпа, ни на фриланс-площадке данных о его компании нет.

Ссылка на само объявление есть в треде.

Просто были подходящие условия, думал к ним джуном пойти за символическую плату

на еду, но после такого я задумался: А может все-таки Руби, а?!

Twissel ★★★★★
() автор топика
Последнее исправление: Twissel (всего исправлений: 1)

//нужно объявить массив $a=array(); //в цикле от 1 до 100 for($i=1;$i<=100;$i++){ //заполнить его случайными цифрами (тоже от 1го до 100) $t=rand(1,100); //и в итоге получить массив с уникальными значениями, $a[$t]=$t; } //реализовать минимальным кол-вом строк

Для особо внимательных - нигде нет ни слова про то, что нужен массив из 100 чисел рандомно перемешанный. Для тех кто не знает PHP - пустых элементов там не будет, Такой подход аналог x=new Set<integer>() ; x.add(y) в Java и похоже реализуется в питоне.

Можно еще array_unique использовать вместо индекса, это правда будет в итоге лишний цикл внутри это функции и на большом кол-ве итераций(элементов массива) ключ в пхпешном массиве (а он хешированный) будет быстрее, но тоже правильно.

И даже настолько мелкую задачу поняли тут единицы людей, грустно господа ((

А потом имеем вот такие проекты http://ua.inter-pix.com/db/other/humor/humor08/m-require

anonymous
()
Ответ на: комментарий от anonymous

А вот и наш герой! На вилы его! На костер его!

anonymous
()
Ответ на: комментарий от anonymous

//нужно объявить массив $a=array(); //в цикле от 1 до 100 for($i=1;$i<=100;$i++){ //заполнить его случайными цифрами (тоже от 1го до 100) $t=rand(1,100); //и в итоге получить массив с уникальными значениями, $a[$t]=$t; } //реализовать минимальным кол-вом строк

Junior-Middle PHP программист, удаленка, частичная занятость

Откуда столько ошибок с слове «стенографистка»?

staseg ★★★★★
()
Ответ на: комментарий от anonymous

Для тех кто не знает PHP - пустых элементов там не будет, Такой подход аналог x=new Set<integer>() ; x.add(y) в Java и похоже реализуется в питоне.

То есть те значения, которые не будут установлены через цикл не будут равны друг другу и не нарушат условие

в итоге получить массив с уникальными значениями

? Ну, тут даже идиоту очевидно, что это не так.

loz ★★★★★
()
Ответ на: комментарий от loz

да не, судя по его коду это так. Ну подумаешь лишние итерации, подумаешь говнокод...

anonymous
()
Ответ на: комментарий от anonymous

Для особо внимательных - нигде нет ни слова про то, что нужен массив из 100 чисел рандомно перемешанный

сэкономлю тебе еще одну строку:

$a=array();
for($i=0;$i<100;$i++){
 $a[$i]=$i;
}

в результате получим

массив с уникальными значениями

от 1го до 100

И даже настолько мелкую задачу поняли тут единицы людей, грустно господа ((

это - не задача, этог кусок gousi. в текущем виде - это задача не для программиста, а для стенографистки. в которой до кучи намешаны ни разу не четкие критерии конечного результата. нормальная реакция адекватного специалиста - развернуться и уйти

anonymous
()

Блин, зачем я зашёл в этот тред изначально... Но забавно - у пыхокодеров какое-то своё, особое мышление и философия, особый талант ставить бессмысленную задачу, но так, чтобы она по формулировке была похожа на осмысленную, и кандидат подходит именно если он распознал и сделал бессмыслицу.

anonymous
()
Ответ на: комментарий от anonymous

И даже настолько мелкую задачу поняли тут единицы людей, грустно господа ((

Это говорит только о том, что ты не умеешь формулировать даже простые задачи.

anonymous
()
Ответ на: комментарий от anonymous

Эй, мы здесь таких не любим!

anonymous
()
Ответ на: комментарий от anonymous
//нужно объявить массив
$a=array();
//ок, объявили

//в цикле от 1 до 100
for($i=1;$i<=100;$i++){
//хорошо, цикл от 1 до 100

//заполнить его случайными цифрами (тоже от 1го до 100)
$t=rand(1,100);
//массив не заполнен!!!!

//и в итоге получить массив с уникальными значениями,
$a[$t]=$t;
//массив с уникальными значениями получен сразу, а не после его заполнения случайными _цифрами_
//такую простую задачу решить не можешь, увольняйся
}

Ах да,

$a=array();for($i=1;$i<=100;$i++){$t=rand(1,100);$a[$t]=$t;}
vs
$a=array();
for($i=1;$i<=100;$i++){
  $t=rand(1,100);
  $a[$t]=$t;
}
Последнее условие

реализовать минимальным кол-вом строк

тоже не выполнено.

templarrr ★★★★★
()
Последнее исправление: templarrr (всего исправлений: 1)
Ответ на: комментарий от templarrr

Я тоже не понял, где гарантия, что ВСЕ 100 элементов будут заполнены?

А не только те, индекс которых выпал при вызове rand(), а как проинициализуются элементы, индекс которых не выпал?

Ну, зато сам автор сделали умное лицо, чё!

Twissel ★★★★★
() автор топика
Ответ на: комментарий от Twissel

Я,конечно, за читинг с себя вины не снимаю, НО или четкая постановка задачи или моя вольная ее интерпретация...

По моему это не читинг, а адекватное решение. Я бы взял тебя на работу, вероятно.

AndreyKl ★★★★★
()
Ответ на: комментарий от Twissel

нет, ты не прав на мой взгляд. если есть базоывае навыки, то в коллективе с реальными задачами растёшь значительно быстрее чем в одиночку. да и деньги какие-никакие капают.

AndreyKl ★★★★★
()
Ответ на: комментарий от ilovewindows

для определения нового индекса и также получать повторы, чем ближе к концу тем чаще

есть ведь решение без ожидания из-за повторов, и оно кстати простое как две копейки, ещё в детском саду проходили же..

AndreyKl ★★★★★
()
Ответ на: комментарий от anonymous

Для тех кто не знает PHP - пустых элементов там не будет

Будут. Ты не знаешь php.

в цикле от 1 до 100 заполнить его

У нормальных людей это означает, что должно быть 100 значений.

случайными цифрами (тоже от 1го до 100)

В приведённом коде числа не случайные. Случайный только порядок заполнения и количество полученных значений.

В общем, эталонный говнокод, $a=range(1,100) реализованное через жопу.

no-such-file ★★★★★
()
Ответ на: комментарий от AndreyKl

Скинь свои контакты, пожалуйста. Если у тебя есть возможность работать удаленно джуном, в пределах Украины, после Нового года постучу, вероятно.

Twissel ★★★★★
() автор топика

мне первым делом пришло в голову решение:

  1. берем случайное число в диапозоне [0; 100!)
  2. представляем в факториальной системе счисления https://en.wikipedia.org/wiki/Factorial_number_system
  3. достаём из исходного массива в результирующий полученные индексы (там в статье подробнее написано)

без двух списков и удаления из списка, кажется, не обойдешься.

зато рандомное число можно сразу сформировать в факториальном представлении и получится гораздо эффективнее, чем с поиском дубликатов.

instant
()
Ответ на: комментарий от instant

А зачем ты это тут пишешь, если у ТС в ОП сразу приведено более эффективное решение чем твоё?

anonymous
()
Ответ на: комментарий от anonymous

Вот только я так и не понял: на хрена нам цикл от 1 до 100, если в среднем при таком подходе заполняются примерно 60 элементов твоего массива?!

Не поленился поставил xdebug и посмотрел красивый вывод через var_dump :-D

Twissel ★★★★★
() автор топика
Последнее исправление: Twissel (всего исправлений: 1)

Кстати, еще небольшой вопрос: как инициализируются не существующие элементы массива, NULLом или их просто нет?

И мы в этом примере сотню раз пишем по случайным индексам числа с «КПД» 60%?

Хочу понять последовательность операций в этом говнокоде.

Twissel ★★★★★
() автор топика
Ответ на: комментарий от Twissel

как инициализируются не существующие элементы массива, NULLом или их просто нет?

Их нет, но пых кидает notice: undefined index, а не ошибку, чтобы говнокод получил таки null.

no-such-file ★★★★★
()

И в довершение треда решение не от меня, а с govnokod.ru, в одну строку:

($a = range(1,100)) && shuffle($a);

Делу венец, как говорится.

Twissel ★★★★★
() автор топика
Последнее исправление: Twissel (всего исправлений: 1)
Ответ на: комментарий от Twissel

наочно вывести

Что?

А можно этот notice чем-то отловить

Оно само будет сыпать в логи и на экран, если не принять меры. Программно тоже можно ловить, но нужен кастомный error_handler, который будет ловить notice и бросать исключение. Есть надежда, что в новом седьмом пыхе можно просто ловить исключение, без приседаний и танцев, но я пока не щупал.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Хз, включил глобально в php.ini «display_errors = On» на локалхосте, а в phpinfo() все равно display_errors Off

Версия php из ppa:

PHP Version 5.6.16-1+deb.sury.org~trusty+1

Ну да фиг с ним, все очевидно.

Twissel ★★★★★
() автор топика
Ответ на: комментарий от Twissel

вообщето вы rand в цикле должны вызывать
вы очень невнимательно читаете описание задачи

И он прав в том смысле, что rand даже в ядре по сути псевдорандомный (хоть со 100500 оптимизациями). А что если rand должен вызываться свой? Да, тебе не дали всю картинку, но ты облажался, ибо в задаче прямо сказано что rand надо самому вызывать в цикле. А не то, что ты подумал: выводить результат в цикле (имхо, это дибилизм).

gh0stwizard ★★★★★
()
Ответ на: комментарий от Twissel

Зачем тебе мой код? Я просто защитил позицию работадателя, т.к. она имеет смысл, хотя для php это оверхед. Будь задача для сишнега можно завалить было на этом моменте. Ибо, он не узнал, что компания, например, делает смарт-карты (usb-ключи, называй как хочешь) со своим генератором чисел и дергать нужно его, а не псевдорандомный rand из ОС (лол). И в задницу простоту, быдлокод и т.п. Это вообще не играет роли. Оптимизации нах не сдались, если изначально задача сделана неправильно. НО ты и некоторые аналитеги ЛОРа сразу все заоптимизировали и считают, что они папки кодинга.

P.S. Ничего личнего. Просто так. К слову, о внимательности :)

gh0stwizard ★★★★★
()
Последнее исправление: gh0stwizard (всего исправлений: 1)
Ответ на: комментарий от gh0stwizard

Тоже ничего личного ;-)

Просто тут не такая сверхзадача же, чтобы не написать ее реализацию, потому и попросил. Насчет внимательности я и сам признал в ОП посте, что пошел на «жульничество».

И да, тот вариант, который привел собеседующий, это таки маленький финиш.

Twissel ★★★★★
() автор топика
Последнее исправление: Twissel (всего исправлений: 1)
Ответ на: комментарий от Twissel

я и сам признал

Ну, остается надеяться на верные выводы для себя. Просто это нормальная практика жизни: не видеть всей картины. Из-за этого много батхерта, да.

gh0stwizard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.