importmatplotlib.pyplotaspltimportmatplotlib.tickerasmtickerfromdyce.viz.matplotlibimportplot_ridgek_start,k_end=3,6# range: [start_k..end_k)n_start,n_end=5,11# range: [start_n..end_n)rows_by_k={k:[(f"{n}k{k}",nkk(n,k))forninrange(n_start,n_end)]forkinrange(k_start,k_end)}max_x=max(max(h)forrowsinrows_by_k.values()for_,hinrows)max_y=max(float(prob)forrowsinrows_by_k.values()for_,hinrowsfor_,probinh.probability_items())fork,rowsinrows_by_k.items():labels,hs=zip(*rows,strict=True)ax=plt.subplot2grid((k_end-k_start,1),(k-k_start,0))plot_ridge(*hs,labels=labels,cmap="cool",peak=max_y,ax=ax)forlineinax.lines:line.set_marker("")ax.xaxis.set_major_locator(mticker.MultipleLocator(5))ax.tick_params(axis="x",labelrotation=60)ax.set_title(f"Taking the {k} highest of $n$ exploding d10s")ax.set_xlim(left=0,right=max_x)# subplots should share a horizontal scale# subplots should share a vertical scaleaxes=plt.gcf().get_axes()y_lims=[ax.get_ylim()foraxinaxes]foraxinaxes:ax.set_ylim(min(loforlo,_iny_lims),max(hifor_,hiiny_lims))plt.gcf().set_size_inches(6.4,8.0)
fromdyce.viz.matplotlibimportplot_ridgelabels,hs=zip(*attr_results.items(),strict=True)ax=plot_ridge(*hs,labels=labels,cmap="jet")ax.set_title("Comparing various take-three-of-4d6 methods")
Original AnyDice source of brawl with an optional dice swap:
1 2 3 4 5 6 7 8 91011121314151617
function:setelementI:ninSEQ:stoN:n{NEW:{}loopJover{1..#SEQ} {ifI=J{NEW:{NEW,N}}else{NEW:{NEW,J@SEQ}}}result:NEW}function:brawlA:svsB:swithoptionalswap{if#A@A >= 1@B {result:[brawlAvsB]}AX:[sort[setelement#A in A to 1@B]]BX:[sort[setelement1inBto#A@A]]result:[brawlAXvsBX]}output[brawl3d6vs3d6withoptionalswap]named"A vs B Damage"
Translation:
1 2 3 4 5 6 7 8 91011121314
>>>defbrawl_w_optional_swap(p_result_a:PResult[int],p_result_b:PResult[int])->int:...roll_a,roll_b=p_result_a.roll,p_result_b.roll...ifroll_a[0]<roll_b[-1]:...roll_a,roll_b=roll_a[1:]+roll_b[-1:],roll_a[:1]+roll_b[:-1]...# Sort greatest-to-least after the swap...roll_a=tuple(sorted(roll_a,reverse=True))...roll_b=tuple(sorted(roll_b,reverse=True))...else:...# Reverse to be greatest-to-least...roll_a=roll_a[::-1]...roll_b=roll_b[::-1]...a_successes=sum(1forvinroll_aifv>=roll_b[0])...b_successes=sum(1forvinroll_bifv>=roll_a[0])...returna_successes-b_successesor(roll_a>roll_b)-(roll_a<roll_b)