You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript解码TXT文件:金字塔取词函数异常求助

问题分析与修正

你的代码只返回单个值,核心问题是错误计算了金字塔每层末尾的数字。原来的current_num = (current_line + 1) / 2逻辑完全不符合金字塔末尾数的规律,导致匹配完第一个数字后,后续的current_num变成非整数,无法和文件中的数字匹配,自然只能收集到第一个单词。

正确的金字塔末尾数规律

金字塔第n层的末尾数字是前n个自然数的和,公式为:n*(n+1)/2。比如:

  • 第1层末尾:1*2/2 = 1
  • 第2层末尾:2*3/2 = 3
  • 第3层末尾:3*4/2 = 6
  • 以此类推,直到末尾数超过文件中的最大数字为止。

修正后的代码

function decode(message_file) {
  const fs = require("fs");
  const data = fs.readFileSync(message_file, "utf8");
  const lines = data.split("\n").filter(Boolean);
  
  // 构建数字到单词的映射表,方便快速查找
  const numToWord = new Map();
  let maxNum = 0;
  for (const line of lines) {
    const [numStr, word] = line.split(" ");
    const num = parseInt(numStr);
    numToWord.set(num, word);
    if (num > maxNum) maxNum = num;
  }

  const messageWords = [];
  let n = 1;
  while (true) {
    // 计算当前层的末尾数字
    const endNum = n * (n + 1) / 2;
    if (endNum > maxNum) break; // 超过最大数字就停止循环
    messageWords.push(numToWord.get(endNum));
    n++;
  }

  return messageWords.join(" ");
}

const decodedMessage = decode("message.txt");
console.log(decodedMessage); // 输出: I love computers

代码说明

  1. 构建映射表:先把所有数字和对应的单词存入Map,同时记录文件中的最大数字,避免无效循环。
  2. 循环计算末尾数:用n表示金字塔的层数,通过公式计算每层末尾数字,直到超过最大数字就停止。
  3. 收集单词并拼接:根据末尾数字从映射表中取出对应单词,最后拼接成句子。

这样修改后,就能正确提取金字塔每层末尾对应的单词,得到预期的结果。

内容的提问来源于stack exchange,提问作者Noel Pena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 09:22:51