我正在玩功能性/默契式编程,特别是创建蛇游戏(游戏示例:http://patorjk.com/games/snake/)
具体问题是我正在使用一系列字符串:
[
['2 '],
['10']
]
并希望以'value'的数字顺序获取坐标列表。在域中,0是蛇的头部,2是尾部,整个是板。
所以我建立了:
var findSnake = function(rendered_board) {
return r.map(function(x) {
return r.map(function (y) {
return {
x: x,
y: y,
val: rendered_board[x][y]
};
})(r.keys(r.split('', rendered_board[x])));
})(r.keys(rendered_board));
};
让我回来:
[ [ { x: '0', y: '0', val: '2' }, { x: '0', y: '1', val: ' ' } ],
[ { x: '1', y: '0', val: '1' }, { x: '1', y: '1', val: '0' } ] ]
然后,我可以排序并获得我的坐标列表。它有效,但我对风格有疑问。
有没有办法以点自由风格编写findSnake?对这个问题有更惯用的方法吗?
答案 0 :(得分:1)
正如预期的那样,这似乎太难以变成一个可读的无点解决方案。我确实采用了一个更简单的子集,只是为了看看我能做些什么,而且它本身很丑陋,以至于我没有完成它。
如果我们开始使用此功能:
var fn = function(list) {
return R.map(function(y) {
return {
y: y
};
}, list);
}
......这显然可以被认为是原作的内在子问题,然后,我可以把它变成这个怪物:
var fn = R.pipe(R.converge(
R.zip,
R.pipe(R.length, R.repeat('y')),
R.identity
), R.map(R.apply(R.createMapEntry)));
(某些中间步骤位于 REPL )
但考虑到这在es6中看起来如何,这似乎非常适得其反:
var fn = R.map(y => ({y});
这就是为什么我在有意义的时候使用免费积分,但不要尝试在任何地方使用它。
<强>更新强>
自version 0.18起,Ramda将createMapEntry
重命名为objOf
,使converge
成为二元函数,这意味着上面的代码不再有效。 REPL链接也没有,因为REPL已经更新。您现在可以在 REPL 。