Оцените тестовое задание на php

Прислали тествое задание.

Напишите на PHP функцию, получающую на входе строку, содержащую математическое выражение в обратной польской нотации (например, «5 8 3 + *»), и возвращающую значение этого выражения (в примере «55»).
listNotation = explode(' ', $_GET['inputNotation']);
$this->stackNotation = array();
$this->arifmeticSign = array();       
} 

function setArifmetic() 
{
foreach ($this->listNotation as $this->key => $this->value) 
   {
    if (preg_match('#^([\+\-\*\/]{1})$#', $this->value) ) 
    { 
     $this->arifmeticSign[]= $this->value;
    }
   }
}

function setStack() 
{
foreach ($this->listNotation as $this->key => $this->value) 
   {
    if (preg_match('#^(-[0-9]+|[0-9]+)$#', $this->value) ) 
    {
        $this->stackNotation []= $this->value;
    }
   }
}

function reverseStack()
{
$this->stackNotation = array_reverse($this->stackNotation);
$this->lenght = count($this->stackNotation);
return $this->lenght;
}


function calculateNotation()
{
$this->result = $this->stackNotation[0];
for($this->i = 1; $this->i < $this->lenght; $this->i++) {
      $this->j = $this->i - 1;
      switch($this->arifmeticSign[$this->j] ) {
        case '*':
          $this->result = $this->result * $this->stackNotation[$this->i];
          break;
        case '/':
          $this->result = $this->result / $this->stackNotation[$this->i];
          break;
        case '+':
          $this->result = $this->result + $this->stackNotation[$this->i];
            break;
        case '-':
          $this->result = $this->result - $this->stackNotation[$this->i];
        break;
      }
    }
 }

 function runCalculate() 
 {
    $this->setArifmetic();
    $this->setStack();
    $this->reverseStack();
    $this->calculateNotation();
    
    echo "$this->result";
 }
}

 
$n = new Notation;
$n->runCalculate();
 
?>


<form action="new.php">
<p>input the expression</p>
<input type="text" required="" name="inputNotation">
<input type="submit" value="clacni menya :)">
</form>
 

В результате отказали, вернее не ответили. В чем я ошибся?

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Оценяю. Тестовое задание нормальное. Его результат показывает знает ли кандидат конечные автоматы и может ли он это реализовать функцией.

Коментар порушує правила спільноти і видалений модераторами.

гм. тег code убивает строки. короче
вобщем, в моем случае функция (без проверок и после пива) выглядела бы вот так

pastebin.com/AcKHMv9G

Коментар порушує правила спільноти і видалений модераторами.

гм. пре еще хуже. режет по живому

Коментар порушує правила спільноти і видалений модераторами.

о боже...! мои глаза!

У вашего тестового задания ровно один недостаток — пхп.

Коментар порушує правила спільноти і видалений модераторами.

увы только для чего-то маленького

О, вы тут начинайте холивар, а я пойду за пивом и попкорном :)

для данной задачи хорош.

ну а также для проекта коротый можна за лярд продать фейсбуку :)

ух ты, код на доу :) а как насчет такого в цикле:

fn, args_num = ops.get(o, (lambda: o, 0))
args = []
if args_num: stack, args = stack[:-args_num], stack[-args_num:]
stack.append(fn(*args))

(проверки убрал для краткости).

golf anyone?

PS. inspect.getargspec(operator.add) не работает, увы :(

Аматоры..

from operator import *
ops = {’+’: add, ’-’: sub, ’*’: mul, ’/’: div}
def eval(l):
if l[0].isdigit(): return [int(l[0])] + l[1:]
l1 = eval(l[1:])
l2 = eval(l1[1:])
return [ops[l[0]](l1[0], l2[0])] + l2[1:]

о да. интересно, сколько лет пройдет, предже чем тебе станет стыдно и ты удалишь эту глупость? а то ведь кто-нибудь процитирует при случае :)

А не удосужишься ли предметно обьяснить что не так?

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

я не знаю питона (ну почти), но думаю это ни питон :)

Ну глядя на предыдущие примеры у меня сложилось впечатление что читабельность не самый главный критерий в этой игре. Хотя и по нему мой вариант ИМХО намного выигрывает у остальных.

Ивал это не то что ты думаешь. Это мной обозначенная рекурсивная функция. Можешь придумать свое название.

гм. мой имхо совет — никогда не генери гавнокод, даже если его просят ... карма портицца

То что твоих когнитивных возможностей не хватило на то что бы что-то понять, не значит что это что-то — гавно.

Ну и в карму я не верю.

ггы. ты только-что пробежал пять верст что-бы сказать мне, что я тебе безразличен :)

Ну ты первый начал обкидывание какашками. Я обычно первым стараюсь не бросаться в неконструктив.

та забей. но гавнокод не генери даже если тебя попросят

гм. ржачно

г’О’внокод не пускает, а гавнокод — пускает

Это боян. Но мой любимый пример это слово — eвреи(счас написал латиницей)

ну... а ты запускать это пробовал? (вопрос риторический, содержит в себе совет)

Коментар порушує правила спільноти і видалений модераторами.

А как ты думаешь? Угадай с трех раз? (Вопрос содержит очень толстый намек что да, пробовал, и даже успешно)

блиин. не работает оно, и не может работать.

>>> def eval(l):
...     if l[0].isdigit(): return [int(l[0])] + l[1:]
...     l1 = eval(l[1:])
...     l2 = eval(l1[1:])
...     return [ops[l[0]](l1[0], l2[0])] + l2[1:]
... 
>>> eval(['1', '2', '+'])
[1, '2', '+']

а я, дурак, поевелся на дешевого тролля.

молодец. теперь осталось только прочесть, что же на самом деле нужно было сделать.

Сел в лужу, боишься признаться, ищешь отмазки? Ну-ну.

наибольшое зло что все сделано как форма хотя просили функцию :)

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

Сам бы такой вариант тоже бы не принял - хотя бы по тому что нет еррор хендлинга никакого. Это очень очень важно.

В конце дня ответили, заняты были наверное

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

наибольшое зло что все сделано как форма хотя просили функцию :)

Всегда думал что правильнее вставлять код в html, а не генерировать с помощью php. Так проще для верстальщиков и дизайнеров.

на PHP можно писать без всякого HTML если что :) банальное консольное приложение тут бы было лучше. но это уже вкусовщина.

Знаю, можно даже gtk использовать. Правда как-то не то, всеравно что на асме писать веб приложение

еще раз - php программа- не обязательно веб приложение

это может быть демон, веб сервис да что угодно

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

все переменные вынесены в переменные экземпляра,

Покажите как будет выглядить ваш вариант.

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

foreach ($this->listNotation as $this->key => $this->value)
ни значение ключа ни значение значения никому не интересно за пределами метода.
echo «$this->result»;
должно быть возвращение значения и уже клиентский код должен решать что с этим делать.
listNotation
не нужно получать в классе. эти данные предпочтительно получить за пределами класса и передать в конструктор, это сделает класс более универсальным и пригодным для повторного исспользования.
если глобально то весь код который ты написал, это попытка всунуть процедурный код и подать его как ООП.

Правда ли что Ваш код выдаст 55, если ему подсунуть на вход "+ 5 * 8 3"? Если да (я не спец по PHP, но код выглядит именно так), то это не очень хорошо.

39 Почему плохо? Конечно отсутствие исключений и устойчевости кода это очень плохо. Это следствия самообучения, я думаю я быстро смогу это исправить оказавшись в команде.

Сколько я понимаю «+ 5 * 8 3» это просто невалидная строка с обратной польской нотации. И правильный результат для такой строки — сказать, что она невалидная.

я бы хотел увидеть чтото типа

function polska($str) {
    $op_functions = array(
        '+' => function($a, $b) { return $a + $b; },
        '-' => function($a, $b) { return $a - $b; },
        '*' => function($a, $b) { return $a * $b; },
        '/' => function($a, $b) { return $a / $b; }
    );
    $separate = function($res, $el) use ($op_functions) {
        if (is_numeric($el)) {
            $res[0]->push(intval($el));
        } else {
            $res[1]->push($op_functions[$el]);
        }
        return $res;
    };

    $seq = explode(' ', $str);
    list($numbers, $ops) = array_reduce($seq, $separate, array(new SplStack(), new SplQueue()));

    $res = $numbers->pop();
    while (!$numbers->isEmpty()) {
        $op = $ops->shift();
        $res = $op($res, $numbers->pop());
    }
    return $res;
}

echo polska('5 3 8 + *');

1. знание замыканий и лямб как особенности 5.3 пыха
2. знание Spl
3. может немного функционального подхода

в общем нестандартное решение будет плюсом

то что вы сказали как раз то что я бы ожидал увидеть - удивлять должен такой лобовой подход как у ОПа :)

херассе джуниорский код...

суровы, все же, наши джуны

Так джунам надо с SICP начинать, уже года 4 как в свободном доступе :)

на хайлоад проект я бы вас не взял

ну и
echo polska(’5 3 8 + *’);

echo polska(’5 3 + 8 *’);

возвращает одно и тоже ... что какбе намекает

Я бы тоже себя не взял, тем более на highload. Этот поход в поисках работы, был больше для оценки квалификации компаниями и определения требований к джуну.

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

не, ну каждый ССЗБ , но звать человека который не осилил спеку ... хотя да

Тогда распишите что за зверь ССЗБ :)

А Вы тоже структуру ответов не прослеживаете? :D

прослеживаю, я собственно про код выложенный Alex, а не топик стартером говорил

dou.ua/...ic/5548/#194622

Значит «не осилил» должно быть «осилил», по идее, что и сбило с толку. Ну ок, мысль понятна :)

нет. там именно «не осилил» потому что код Alex хоть и нафарширован «сахаром» но ошибочен

Возможно, мне алгоритм неизвестен, зато каков полёт мысли :)

вчера утром принял другое предложение, за пару часов до вашего.

Эмммм... да Вы и структуру ответов не прослеживаете :)

бегло и субъективно

похоже, что влез не весь код, но как минимум класс должен был бы принимать каким-то образом строку и возвращать число, а не самостоятельно выдёргивать запрос из $_GET и выводить ответ через echo

runCalculate

правильнее было бы назвать runCalculation

$this->listNotation as $this->key => $this->value

for($this->i = 1; $this->i < $this->lenght; $this->i++) {

зачем везде используется $this? переменные $key, $value, $i должны быть локальными

функция

reverseStack

бесполезна

$this->result = $this->stackNotation[0];

сомнительная строка

похоже, что все методы кроме

runCalculate()

стоило сделать приватными

ООП ради ООП

строка

$this->j = $this->i - 1;

выглядит ещё сомнительней

похоже, что влез не весь код, но как минимум класс должен был бы принимать каким-то образом строку и возвращать число, а не самостоятельно выдёргивать запрос из $_GET и выводить ответ через echo

Да был еще один файл index.php c формой
<form action="new.php">
<p>input the expression</p>
<input type="text" required="" name="inputNotation">
<input type="submit" value="clacni menya :)">

</form>

Нет, я не об этом.
Это должно выглядеть как-то так
$notationText = filter_input(INPUT_GET, ’inputNotation’);
$calculator = new Notation($notationText);
$result = $calculator->runCalculate();
echo $result;

То есть сам класс ничего не должен выдёргивать из ввода и так же ничего не должен писать в вывод. Потому, что это по сути глобальные ресурсы, которые при таком обращении могут потом значительно потрепать нервы:)

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

А у Вас такой функции нет :) Вы выполняете указанные действия через форму, и результат опять таки выводите на страницу. Это если смотреть со стороны постановки задачи. Про правильность кода судить не мне, я в ПХП не настолько разбираюсь, но как по мне, можно было обойтись и без $this->

Такая функция есть здесь. Задача стала не актуальной. Я уточнил условия задачи и написал класс чтобы легче было изменять код.

А отказали скорее всего из-за

$this->key => $this->value
echo “$this->result”;
и
clacni menya :)

Підписатись на коментарі