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

Google Sheets TTRPG骰子合并需求:剔除整数,同类骰子分组

解决方案:TTRPG骰子项合并(剔除整数+正负分离)

核心逻辑

  1. 精准提取骰子项:用正则过滤所有纯整数(含0),仅保留带D的掷骰项(支持正负前缀)
  2. 分组累加同类骰子:按骰子类型(如D4、D6)和符号(正/负)分别统计数量,正负项完全分离不抵消
  3. 格式化输出结果:将统计后的项拼接成简洁表达式,正项默认省略开头+(多正项时后续加+)

Excel/Google Sheets 精简复用公式

适用于表格工具,可直接复制到数千个单元格中:

=TEXTJOIN("+",TRUE,LET(
    raw, A1,
    matches, REGEXEXTRACT(raw, REPT("([+-]?\d+D\d+)|", LEN(raw))),
    filtered, FILTER(matches, NOT(ISBLANK(matches))),
    types, REGEXEXTRACT(filtered, "D\d+"),
    signs, IF(LEFT(filtered,1)={"+";"-"}, LEFT(filtered,1), "+"),
    counts, VALUE(REGEXEXTRACT(filtered, "[+-]?\d+")),
    grouped_pos, QUERY(HSTACK(signs, types, counts), "SELECT Col2, SUM(Col3) WHERE Col1='+' GROUP BY Col2 LABEL SUM(Col3)''"),
    grouped_neg, QUERY(HSTACK(signs, types, counts), "SELECT Col2, SUM(Col3) WHERE Col1='-' GROUP BY Col2 LABEL SUM(Col3)''"),
    pos_str, IFERROR(TEXTJOIN("+", TRUE, IF(INDEX(grouped_pos,,2)=1, INDEX(grouped_pos,,1), INDEX(grouped_pos,,2)&INDEX(grouped_pos,,1))), ""),
    neg_str, IFERROR(TEXTJOIN("", TRUE, IF(INDEX(grouped_neg,,2)=-1, "-"&INDEX(grouped_neg,,1), INDEX(grouped_neg,,2)&INDEX(grouped_neg,,1))), ""),
    result, IF(pos_str<>"", IF(neg_str<>"", pos_str&"+"&neg_str, pos_str), neg_str),
    IF(result="", "", result)
))

公式说明:

  • 替换A1为存放原始掷骰表达式的单元格
  • 自动过滤所有纯整数,仅处理带D的项
  • 分别统计正负骰子的累加数量,处理1D6→D6、-1D4→-D4这类简化显示

通用代码逻辑(编程实现)

如果用JavaScript/Python等语言开发,核心逻辑如下:

function mergeDice(input) {
    // 提取所有骰子项
    const diceRegex = /[+-]?\d+D\d+/g;
    const matches = input.match(diceRegex) || [];
    
    // 分组统计正负骰子
    const posGroups = {};
    const negGroups = {};
    
    matches.forEach(item => {
        const isNegative = item.startsWith('-');
        const [countStr, type] = item.replace(/^[+-]/, '').split('D');
        const count = isNegative ? -parseInt(countStr) : parseInt(countStr);
        
        const targetGroup = isNegative ? negGroups : posGroups;
        targetGroup[type] = (targetGroup[type] || 0) + count;
    });
    
    // 格式化输出
    const posParts = Object.entries(posGroups).map(([type, count]) => 
        count === 1 ? `D${type}` : `${count}D${type}`
    );
    const negParts = Object.entries(negGroups).map(([type, count]) => 
        count === -1 ? `-D${type}` : `${count}D${type}`
    );
    
    return [...posParts, ...negParts].join('+');
}

测试示例:

  • 输入:1D6+1D6+-1D6+2+0+3 → 输出:2D6+-1D6
  • 输入:1D6+2+0+1+8 → 输出:D6
  • 输入:-1D4+2D4+5-3D6 → 输出:D4+-3D6

关键注意事项

  • 正负骰子严格分离:正项与负项不会抵消,各自合并后保留
  • 完全剔除整数:所有纯数字(含0)都会被过滤,不会干扰结果
  • 精简显示逻辑:数量为1或-1时自动省略数字,缩短表达式长度

内容的提问来源于stack exchange,提问作者Rogue Scientist Allen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:15:47