如何将APL表达式{(+/3<?⍵⍴6)×100÷⍵}1000改写为tacit无点风格
APL无点风格转换方案
原函数功能为输入骰子投掷次数n,返回投掷结果中4/5/6占比的百分比,原实现代码:{(+/3<?⍵⍴6)×100÷⍵}
转换步骤
我们可以通过APL的函数组合特性逐步消去参数⍵:
- 原代码中
⍵⍴6的作用是生成形状为n、填充值为6的数组,可改写为无点形式⊢⍴6(⊢为恒等函数,直接取输入参数作为⍴的左操作数) - 随机骰子结果逻辑可以进一步简化:
?⍵⍴6等价于二目随机函数写法⍵?6,可直接简化为⊢?6 - 统计符合要求的次数逻辑
+/3<X可以改写为组合函数+/∘(3∘<) - 百分比换算逻辑
100÷⍵改写为无点形式100÷⊢ - 最后通过APL的叉组合子
(f g h)(语义为输入参数x时返回(f x) g (h x)),将次数统计和百分比计算两部分用乘法拼接即可
最终无点实现代码
(+/∘(3∘<)∘(⊢?6) × 100÷⊢)
直接传入参数即可调用,例如(+/∘(3∘<)∘(⊢?6) × 100÷⊢) 1000,运行结果和原函数完全一致。
内容的提问来源于stack exchange,提问作者Felix Dombek
相关产品推荐
相关产品推荐

