Perl:Dice roll";“固定”;将2-8,5-8翻译成2d4,1d4+;3.

Perl:Dice roll";“固定”;将2-8,5-8翻译成2d4,1d4+;3.,perl,dice,Perl,Dice,我正在尝试导入使用不同骰子滚动文本的数据。例如,您将有2-4、2-12、5-8、2-5。我试图写一个翻译,将他们转换为适当的骰子卷。到目前为止,我所掌握的知识将对其进行翻译,但最终我得到了一些奇怪的结果。例如,在5-8上,会出现5d1+3。对于其他的东西,比如2-8,它会给我一个合理的2d4。我想知道如何让它总是用“真正的”骰子 目前我正在使用这个perl脚本。你只需将你想要修正的骰子串传递给它,它就会返回它认为正确的骰子。我的问题是我想不出如何将骰子的“边”限制在这2、3、4、6、8、12、2

我正在尝试导入使用不同骰子滚动文本的数据。例如,您将有2-4、2-12、5-8、2-5。我试图写一个翻译,将他们转换为适当的骰子卷。到目前为止,我所掌握的知识将对其进行翻译,但最终我得到了一些奇怪的结果。例如,在5-8上,会出现5d1+3。对于其他的东西,比如2-8,它会给我一个合理的2d4。我想知道如何让它总是用“真正的”骰子

目前我正在使用这个perl脚本。你只需将你想要修正的骰子串传递给它,它就会返回它认为正确的骰子。我的问题是我想不出如何将骰子的“边”限制在这2、3、4、6、8、12、20边

# turn 2-7 into 1d6+1 or 2-8 into 2d4
sub fix_DiceRolls {
 my($diceRoll) = @_;
 use POSIX;

 if ($diceRoll =~ /^(\d+)(\-)(\d+)\b/i) {
  # 2-5
  #Group 1.     0-1     `2`
  #Group 2.     1-2     `-`
  #Group 3.     2-3     `5`

  my($count) = $1;
  my($size) = $3;

  if ($count == 1) {
   $diceRoll = "$1d$3";
  } else {
    my ($newSize) = $size/$count;
    my ($remainder) = $size % $count;
    my ($round_remainder)   = ceil($remainder);
    my ($round_newSize) = floor($newSize);
    if ($remainder == 0) {
     $diceRoll = $count."d".$newSize;
    } else {
     $diceRoll = $count."d".$round_newSize."+".$round_remainder;
    }

  }

 }

 return $diceRoll;
}

以下内容可能会对您有所帮助。它不知道如何执行
1d6/2
,但它正确地将
4-19
转换为
3d6+1 | 5d4-1

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

my @valid_dice = (4, 6, 8, 10, 12, 20);

sub fix_dice_roll {
    my ($dice_roll) = @_;

    my ($from, $to) = split /-/, $dice_roll;
    my $range = $to - $from + 1;

    my @translations;
    for my $dice (@valid_dice) {
        if (0 == ($range - 1) % ($dice - 1)) {
            my $times = ($range - 1) / ($dice - 1);
            my $plus = sprintf '%+d', $to - $times * $dice;
            $plus = q() if '+0' eq $plus;
            push @translations, [ $dice, $times, $plus ];
        }
    }

    @translations = sort { $a->[1] <=> $b->[1] } @translations;
    return map "$_->[1]d$_->[0]$_->[2]", @translations;
}

say join ' | ', fix_dice_roll($_) while <>;
#/usr/bin/perl
使用警告;
严格使用;
使用特征qw{say};
我的@valid_骰子=(4,6,8,10,12,20);
子修复骰子滚动{
我的($dice_roll)=@;
我的($from,$to)=分割/-/,$dice\u roll;
my$范围=$到-$从+1开始;
我的翻译;
我的$dice(@valid_dice){
如果(0==($range-1)%($dice-1)){
我的$times=($range-1)/($dice-1);
我的$plus=sprintf“%+d”,$to-$times*$dice;
$plus=q()如果“+0”等于$plus;
推@translations,[$dice,$times,$plus];
}
}
@翻译=排序{$a->[1]$b->[1]}@translations;
返回映射“$\>[1]d$\>[0]$\>[2]”,@translations;
}
说加入“|”,同时固定骰子滚动($);

您确定此转换是正确的吗?在2-8范围内滚动2d4会产生不均匀分布——滚动2或8比滚动5或6更不常见。我能说的是,在原文中,当他们使用“2-8”时,他们指的是滚动2个有4个边的骰子。i、 e.2d4。当我在脚本中按2-8时,它返回的结果是2d4。如果“2-8”在原文中是指2d4,“5-8”是什么意思?五个骰子和??侧面?5-8=1d4+4。挑战总是要找到一个包含真正骰子的范围。有时那些真正的骰子会变得,呃,很危险。。。1-3等于1d3,这不是真正的骰子,但可以用d6伪造,同样,1-2等于1d2,或者基本上是掷硬币。然后2-4或者是2d2或者是1d3+1,你看不出区别。10-40是10d4或4d10,同样,两者都有效。@Tanktalus 10-40不是4d10。4d10将是4-40I在允许的骰子中添加了一些2和3,并进行了一些检查,以使其能够选择某些骰子而不是其他骰子(>=4大小且无修改器/etc)。谢谢你的帮助!如果有其他条件,可以删除排序。我只是按“次数”排序,所以骰子数最少的解决方案总是第一个。