Непонятное состояние и некорректная работа функции - PullRequest
0 голосов
/ 30 октября 2018

Существует следующий код ( здесь демо ), функция (с рекурсией) идет по матрице по спирали, собирая значения:

function spiralmatrix($arr)
{
    return  $arr 
            ? array_merge(
                    array_shift($arr), 
                    spiralmatrix(array_reverse(transpose($arr)))
            )
            : $arr;
}

function transpose($arr)
{ 
    return $arr
            ? count($arr) == 1
                ? array_chunk($arr[0], 1) 
                : array_map(null, ...$arr)
            : $arr;
}

Я понимаю, что использование нескольких троичных выражений способствует нечитаемому коду. Но есть более преобладающий спортивный интерес к Code-Golf.

И так, на вопрос, можно ли как-то изменить условие, чтобы вырезать больше символов? Можно использовать любые методы.

Я также хотел бы спросить, странно, что следующее прекрасно работает ( демо ):

function transpose($arr)
{ 
    return $arr
            ? count($arr) == 1
                ? array_chunk($arr[0], 1) 
                : array_map(null, ...$arr)
            : $arr;
}

И выражение работает немного неправильно ( демо) :

function transpose($arr)
{ 
    return count($arr) > 1 ? array_map(null, ...$arr) : $arr; 
}

Хотя в отдельных тестах (не в этой функции spiralmatrix) они показывают одинаковые результаты, в чем может быть эта проблема? ( демонстрационные сравнения ). Благодарен за любую помощь ..

1 Ответ

0 голосов
/ 02 ноября 2018

Проблема с вашим:

return count($arr) > 1 ? array_map(null, ...$arr) : $arr;

означает, что вы пропускаете начальную проверку по истине / фальши:

return $arr
//      v----------------------------truthy----
        ? count($arr) == 1                    |
            ? array_chunk($arr[0], 1)         |
            : array_map(null, ...$arr)        |
        : $arr;                               |
//      ^----------------------------falsey----

Теперь я не игрок в код, так что я не знаю, считаются ли пробелы, которые вы разместили, символами. Я не знаю, когда в «игровое время» все разбивают свой код, а вы просто делаете нам одолжение, делая код читабельным. Тем не менее, вот пара идей:

function transpose($arr)
{ 
    return $arr
            ? //count($arr) == 1
              //!isset($arr[1])                  <-- if spaces "count", this is shorter
              //!next($arr)                      <-- because no 0 in the arrays
              @!$arr[1]                  //      <-- the dirty stfu operator
                ? array_chunk($arr[0], 1) 
                : array_map(null, ...$arr)
            : $arr;
}

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

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

Редактировать: Я только что понял, !next($arr) работает, потому что в примерах данных нет нулей.

На самом деле, почему я играю с отрицанием, переверните все вокруг. Duh!

function transpose($arr)
{ 
    return $arr
            ? //isset($arr[1])                  <-- if spaces "count", this is shorter
              //next($arr)                      <-- because no 0 in the arrays
              @$arr[1]                  //      <-- the dirty stfu operator
                ? array_map(null, ...$arr)
                : array_chunk($arr[0], 1) 
            : $arr;
}
...