1

我正在玩功能/默认风格的编程,特别是创建蛇游戏(游戏示例:http: //patorjk.com/games/snake/

具体问题是我正在使用一系列字符串,例如:

[
 ['2 '],
 ['10']
]

并希望按“值”的数字顺序获取坐标列表。在域中,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 ?有没有更惯用的方法来解决这个问题?

4

1 回答 1

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});

这就是为什么我在有意义的时候使用免积分,但不要试图在任何地方应用它。


更新

0.18 版本开始,Ramda 重命名createMapEntry为二进制函数,这意味着上面的代码不再有效。REPL 也没有链接,因为 REPL 已更新。您现在可以在REPL中看到它已更新。objOfconverge

于 2015-09-01T00:23:45.550 回答