无法理解的条件和功能的错误操作
Incomprehensible condition and incorrect operation of the function
有以下代码(demo here),函数(带递归)以螺旋方式收集值的矩阵:
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;
}
我知道使用多个三元表达式会导致代码不可读。但是代码高尔夫有更主要的运动兴趣。
所以,对于这个问题,是否可以通过某种方式改变条件来剪切更多的字符?可以使用任何方法。
我也想问一下,奇怪的是下面可以正常工作(demo):
function transpose($arr)
{
return $arr
? count($arr) == 1
? array_chunk($arr[0], 1)
: array_map(null, ...$arr)
: $arr;
}
表达式有点错误 (demo):
function transpose($arr)
{
return count($arr) > 1 ? array_map(null, ...$arr) : $arr;
}
虽然,在单独的测试中(不是在这个函数中 spiralmatrix
),它们显示相同的结果,这个问题可能是什么? (demo comparisons)。感谢您的帮助..
你的问题:
return count($arr) > 1 ? array_map(null, ...$arr) : $arr;
是你忽略了truthy/falsey初始检查:
return $arr
// v----------------------------truthy----
? count($arr) == 1 |
? array_chunk($arr[0], 1) |
: array_map(null, ...$arr) |
: $arr; |
// ^----------------------------falsey----
现在,我不是代码高尔夫球手,所以我不知道您张贴的空格 "count" 是否为字符。我不知道 "game time" 时是否每个人都把他们的代码搞砸了,你只是在帮我们一个忙,让代码更易读。也就是说,这里有几个想法:
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 运算符,但如果手套脱落,也许值得一看。 Demo
我会一直盯着代码看,如果有任何问题,我会插话。
编辑:我刚刚意识到 !next($arr)
有效,因为示例数据中没有零。
其实,我为什么要玩否定,颠倒一切。呸!
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;
}
有以下代码(demo here),函数(带递归)以螺旋方式收集值的矩阵:
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;
}
我知道使用多个三元表达式会导致代码不可读。但是代码高尔夫有更主要的运动兴趣。
所以,对于这个问题,是否可以通过某种方式改变条件来剪切更多的字符?可以使用任何方法。
我也想问一下,奇怪的是下面可以正常工作(demo):
function transpose($arr)
{
return $arr
? count($arr) == 1
? array_chunk($arr[0], 1)
: array_map(null, ...$arr)
: $arr;
}
表达式有点错误 (demo):
function transpose($arr)
{
return count($arr) > 1 ? array_map(null, ...$arr) : $arr;
}
虽然,在单独的测试中(不是在这个函数中 spiralmatrix
),它们显示相同的结果,这个问题可能是什么? (demo comparisons)。感谢您的帮助..
你的问题:
return count($arr) > 1 ? array_map(null, ...$arr) : $arr;
是你忽略了truthy/falsey初始检查:
return $arr
// v----------------------------truthy----
? count($arr) == 1 |
? array_chunk($arr[0], 1) |
: array_map(null, ...$arr) |
: $arr; |
// ^----------------------------falsey----
现在,我不是代码高尔夫球手,所以我不知道您张贴的空格 "count" 是否为字符。我不知道 "game time" 时是否每个人都把他们的代码搞砸了,你只是在帮我们一个忙,让代码更易读。也就是说,这里有几个想法:
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 运算符,但如果手套脱落,也许值得一看。 Demo
我会一直盯着代码看,如果有任何问题,我会插话。
编辑:我刚刚意识到 !next($arr)
有效,因为示例数据中没有零。
其实,我为什么要玩否定,颠倒一切。呸!
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;
}