Google Sheets TTRPG骰子合并需求:剔除整数,同类骰子分组
解决方案:TTRPG骰子项合并(剔除整数+正负分离)
核心逻辑
- 精准提取骰子项:用正则过滤所有纯整数(含0),仅保留带
D的掷骰项(支持正负前缀) - 分组累加同类骰子:按骰子类型(如D4、D6)和符号(正/负)分别统计数量,正负项完全分离不抵消
- 格式化输出结果:将统计后的项拼接成简洁表达式,正项默认省略开头
+(多正项时后续加+)
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
相关产品推荐
相关产品推荐

