当前位置: 首页 > 知识库问答 >
问题:

2048:使用lodash/fp的地图中reduceRight的奇怪行为

孙胜泫
2023-03-14

以下代码是尝试使用lodash fp制作我的2048版本(游戏)的开始。我习惯了普通的洛达斯,但这是我第一次接触fp口味。

它使用两个功能实现将一行的瓷砖向右推的操作:

  • 幻灯片将该行向右推,前提是有空格(由值0表示)。实际上,这相当于把所有的零放在左边。
  • 合并合并成对的相同值的连续磁贴,生成一个空空间和一个值加倍的新磁贴。(从那一步)。

这些函数使用_。减少右方法,该方法从右向左遍历磁贴。

import _ from "lodash/fp";


let game = [[2, 2, 0, 0], [4, 0, 4, 0], [8, 0, 0, 8], [16, 16, 0, 0]]; // Sample state

let slide = _.flow(
  _.reduceRight(
    (v, acc) =>
      v === 0 ? [_.concat(acc[0], v), acc[1]] : [acc[0], _.concat(v, acc[1])],
    [[], []]
  ),
  _.flatten
);

let merge = _.flow(
  _.reduceRight(
    (v, acc) => {
      acc[0].unshift(v);
      if (acc[0].length === 2) {
        if (acc[0][0] === acc[0][1]) {
          acc[1] = _.concat(0, _.concat(acc[0][0] + acc[0][1], acc[1]));
          acc[0] = [];
        } else {
          acc[1] = _.concat(acc[0].pop(), acc[1]);
        }
      }
      return acc;
    },
    [[], []]
  ),
  _.flatten
);

// Moves one line
let moveLine = _.flow(
  slide,
  merge,
  slide
);

// Moves the 4 lines
let moveBoard = _.map(moveLine);

moveLine似乎工作正常。例如,moveLine(游戏[0])[2,2,0,0]转换为[0,0,4]

奇怪的是,moveBoard(游戏)(将moveLine映射到4行上)给出了一个奇怪的结果,每次迭代都会变长,就好像前面步骤的结果被追加了一样:

[
  [0,0,0,4],
  [0,0,0,0,0,0,8,4],
  [0,0,0,0,0,0,0,0,0,16,8,4],
  [0,0,0,0,0,0,0,0,0,0,0,0,32,16,8,4]
]

我看到问题来自于合并,但我真的看不出这里发生了什么。

共有2个答案

颛孙博易
2023-03-14

我已经打开了一个GitHub问题,问题的简化版本是:https://github.com/lodash/lodash/issues/4287.

lodash创始人John David Dalton给出的简短回答:

对于fp合成,累加器不会为每个合成的还原函数创建新的累加器。这就是为什么要用fp创建一个无突变的累加器版本。concat()可以工作。

宋成天
2023-03-14

更改move方法以删除前4个元素

因为一些奇怪的原因,每次合并的迭代

ReduceRight的acc[1]与其中的前一个数组相同

这个补丁可以修复它

let take = arr => arr.slice(0,4);

// Moves one line

let moveLine = _.flow(
  slide,
  merge,
  take
);

这里是一个Runkit与实现

https://runkit.com/naor-tedgi/5ccf0862b0da69001a7db546

 类似资料:
  • 如果我们使用<code>系统使用本机库。loadLibrary()然后<code>SupportMapFragment。它在没有任何stacktrace的情况下实现了这一点。这是我能收集到的最好的日志: 我花了几天时间试图了解导致它的原因,似乎如果我们删除调用,即不使用我们的本机lib,那么就可以正常工作。有什么方法可以在不删除我们的本机lib的情况下解决它吗? 编辑:我创建了一个示例应用程序来重

  • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方

  • 我在http://www.nodebeginner.org上读了一篇教程,我在数据输出中有一个奇怪的行为。我知道,Stackoverflow也有类似的问题,但没有答案。所以我有这个Web-Server的代码: 调用RequestHandler.Upload的Router.js代码-我的buggy函数 和RequestHandler.Upload的代码 假设POST数据中有一个字符串。该函数的第一行

  • 这个程序打印00,但是如果我注释掉a.store和b.store,而取消注释a.fetch_add和b.fetch_add,这做了完全相同的事情,即都设置了a=1,b=1的值,我永远不会得到00。 是我错过了什么,还是“00”按标准永远不会出现? 下面打印00。 下图从不打印00 再看看这个,多线程原子a b打印00 for memory_order_refield

  • 我正在编写一个DocumentFilter,它将输入JTextField的所有单词“top”替换为逻辑top符号。 使用此代码很好,但是它很烦人,因为用户必须重新键入他们的空间,他们可以这样做,并且文本继续在同一行上 当用户继续键入文本时,使用此代码并在空格中添加替换符会导致顶部符号和JTextField中的所有文本稍微向上推,然后转到下面并开始一行新的内容 有人能解释一下这种行为,并希望能提供一

  • 我在做Maven项目。我用log4j做了一个日志。但它在给定的文件中显示了一些starnge日志。我试图理解,为什么会出现这种奇怪的日志,但我不明白。请帮助我,为什么这些不需要的行会进入日志文件。 请帮我把这个拿开。 log.properties 我通过阅读这个链接创建了这个文件。 代码是 日志txt-(log.txt的一些起始行)