在2D矩阵中导航是一个常见的问题。我们已经看过很多次了,以后还会再见。因此,让我们帮助未来,开发最短的解决方案,以在2D矩阵中生成所有八个可能的步骤。
挑战
您的代码必须以任何顺序输出以下8对-1,0,1:
(0,1)
(0,-1)
(1,0)
(-1,0)
(1,1)
(1,-1)
(-1,1)
(-1,-1)
规则
- 没有输入。
- 输出顺序不相关
- 输出灵活。对数字只需要区分即可
- 这是代码高尔夫球,因此最短答案以字节为单位
(1 + 0i)
?
在2D矩阵中导航是一个常见的问题。我们已经看过很多次了,以后还会再见。因此,让我们帮助未来,开发最短的解决方案,以在2D矩阵中生成所有八个可能的步骤。
您的代码必须以任何顺序输出以下8对-1,0,1:
(0,1)
(0,-1)
(1,0)
(-1,0)
(1,1)
(1,-1)
(-1,1)
(-1,-1)
(1 + 0i)
?
Answers:
SELECT-1n INTO t;INSERT t VALUES(0),(1)SELECT*FROM t,t z WHERE t.n<>0OR z.n<>0
创建一个包含的(永久)表t(-1,0,1)
,并使用WHERE
排除该0,0
行的子句执行自联接。我的代码未清理表t,您必须自行删除它。
可悲的是,它的长度几乎是无聊的解决方案(44个字节)的两倍,因为SQL允许以字符串形式返回:
PRINT'0,1
0,-1
1,0
-1,0
1,1
1,-1
-1,1
-1,-1'
WHERE t.n OR z.n
吗?(您可以使用某些但不是全部的SQL方言。)
An expression of non-boolean type specified in a context where a condition is expected
3p_2ẸƇ
我的第一个果冻答案!非常感谢Dennis的难题的最后一部分。
现在,让我们看看我能否解释一下……大声笑。
3p_2ẸƇ Main program, takes no input.
3p Product with Range 3, yields [[1,1], [1,2], [1,3], [2,1], [2,2], ...]
_2 Decrement twice, vectorizes, yields [[-1,-1], [-1,0], [-1,1], [0,-1], ...]
ẸƇ Comb, removes those that contain only falsey values, the [0,0]
Implicit output
-1个字节,感谢Erik;-1个字节,感谢Xcoder先生和Dennis
3p3_2ẸƇ
3
。
感谢@JDoe通过直接方法节省了另外两个字节:
paste(-1:1,-3:5%/%3)[-5]
原始解决方案:
outer(-1:1,-1:1,paste)[-5]
或为27个字节
sapply(-1:1,paste,-1:1)[-5]
或对于34个字节,并考虑以下因素:
(gl(3,3,,-1:1):gl(3,1,9,-1:1))[-5]
如果输出可能是1到3而不是-1到1,则最后一个解决方案可能是最复杂的。
请参阅另一个R答案,以了解带有expand.grid
或带的替代解决方案cbind
。
c
在矩阵内没有任何意义,所以我切换到paste
原始输出格式...
感谢@Shaggy节省了一个字节
9ó8_ìJõ é)Å
在线尝试!使用-R
标志将每个项目放在自己的行上。
9ó8_ìJõ é)Å
9ó8 Create the range [9, 9+8). [9, 10, ..., 16]
_ Map each item in this range through this function:
Jõ é) Generate the range [-1...1] and rotate to get [1, -1, 0].
ì Convert the item to an array of base-3 digits,
mapping [0,1,2] to [1,-1,0]. [[-1, 1, 1], [-1, 1,-1], [-1, 1, 0],
[-1,-1, 1], [-1,-1,-1], [-1,-1, 0],
[-1, 0, 1], [-1, 0,-1]]
Å Remove the first item (gets rid of the leading -1).
2Ý<ãʒĀZ
说明
2Ý< # Range of 2 decremented, yields [-1, 0, 1]
ã # Cartesian product of the list with itself
ʒ # Filter by ...
ĀZ # Maximum of the truthified values, yields 0 only if both values are 0.
-1字节感谢Emigna!
2Ý<ã
),但正在研究如何删除对列表的中间元素。.没有考虑过按绝对值排序并删除第一个。+ 1。
ʒĀZ
保存1
v->"1,1 1,0 1,-1 0,1 0,-1 -1,1 -1,0 -1,-1"
-41字节感谢@AdmBorkBork通过硬编码。
非硬编码版本作为参考(83 72 70 68字节):
v->{for(int i=9;i-->1;)System.out.println(~i%3+1+","+(~(i/3)%3+1));}
-11个字节,感谢@OlivierGrégoire。
-2个字节创建@ETHproductions的JavaScript(ES6)answer的端口。
v->{for(int i=9;i-->0;)if(i!=4)System.out.println((i/3-1)+","+(i%3-1));}
。
有很多不同的方式(摆脱了棘手/代价高昂的部分[0,0]
),由于Leo指出使用十进制转换()作为过滤器,我可以使用的最短字节数为7个字节:d
fdπ2ṡ1
fdπ2ṡ1 -- constant function (expects no arguments)
ṡ1 -- symmetric range [-n..n]: [-1,0,1]
π2 -- cartesian power of 2: [[-1,-1],[-1,0],[0,-1],[-1,1],[0,0],[1,-1],[0,1],[1,0],[1,1]]
f -- filter only elements that are truthy when
d -- | decimal conversion (interpret as polynomial and evaluate at x=10)
-- : [[-1,-1],[-1,0],[0,-1],[-1,1],[1,-1],[0,1],[1,0],[1,1]]
tπ2ṙ1ṡ1
tπ2ṙ1ṡ1 -- constant function (expects no arguments)
ṡ1 -- symmetric range [-n..n]: [-1,0,1]
ṙ1 -- rotate by 1: [0,1,-1]
π2 -- cartesian power of 2: [[0,0],[0,1],[1,0],[0,-1],[1,1],[-1,0],[1,-1],[-1,1],[-1,-1]]
t -- tail: [[0,1],[1,0],[0,-1],[1,1],[-1,0],[1,-1],[-1,1],[-1,-1]]
(1..-1|%{$i=$_;1..-1|%{"$i,$_"}})-ne'0,0'
该范围内的Double-for循环1..-1
,末尾有-n
ot e
限定符以拉出无关紧要的0,0
条目。它们每个都单独留在管道中,并且Write-output
在程序完成时隐式提供给我们免费的换行符。
可悲的是,仅准系统字符串输出要短两个字节:
'1,1
1,0
1,-1
0,1
0,-1
-1,1
-1,0
-1,-1'
但这很无聊。
echo }.>,{;~0 1 _1
TIO
echo}.>,{;~0 1 _1
echo
需要?
3,:(2m*{2b},`
3, e# Range [0,3): [0 1 2]
:( e# Decrement each: [-1 0 1]
2m* e# Cartesian square: [[-1 -1] [-1 0] [-1 1] [0 -1] [0 0] [0 1] [1 -1] [1 0] [1 1]]
{ e# Filter by
2b e# conversion to binary:
}, e# [[-1 -1] [-1 0] [-1 1] [0 -1] [0 1] [1 -1] [1 0] [1 1]]
` e# Stringify: "[[-1 -1] [-1 0] [-1 1] [0 -1] [0 1] [1 -1] [1 0] [1 1]]"
11#v91090~9~19~<
9.._@#,
我觉得这个挑战缺少2D语言的答案,即使大多数语言不是沿对角线移动。这将输出以空格分隔的数字,每对数字之间用制表符分隔。
3:qq2Z^[]5Y(
我的第一个认真的MATL回答!非常感谢Luis Mendo,Sanchises和DJMcMayhem的帮助。
3:qq2Z ^ [] 5Y(–完整程序。输出到STDOUT。 3:–范围3.将[1 2 3]推入堆栈。 qq –减少2。收益为[-1 0 1]。 2Z ^ – 2的笛卡尔幂。 5Y(–将索引5的行替换为... [] –空向量。
t^+U2_1 2
t^+U2_1 2
+U2_1 [0, 1, -1]
^ 2 Product with itself.
t Exclude the first.
等效地,我们可以使用t*J+U2_1J
,但这并不短。