Basta usar a comparação de sequências.
A documentação poderia explicar isso melhor, mas acontece que (com uma suposição sobre sua intenção) isso é realmente trivial com as comparações internas do Anydice. Na documentação sobre seqüências:
Compared to a sequence
The sequences are compared number by number, from left to right, resulting in either a 1 or a 0.
A experimentação mostra que isso significa que ela realmente percorre as sequências, comparando o valor enésimo do primeiro ao valor enésimo do outro. Se tivermos duas sequências, A e B, então A > B
itera a sequência:
-
retorna 1 se o enésimo valor de A for maior que o valor N de B
-
retorna 0 se o valor de N de A for menor que o valor de N de B
-
passa para o N + 1o valor se eles forem iguais
Ele também retorna 1 se B ficar sem elementos antes de A ou 0 se A ficar sem elementos antes ou ao mesmo tempo que B.
Então, se você comparar as sequências:
{6,4,3,2} > {6,4,2,1}
: 1
{6,4,3,2} > {6,4,3,3}
: 0
{6,4,3,2} > {6,4,3}
: 1
{6,4,3} > {6,4,3,1}
: 0
{6,6,5} > {6,5,5,1}
: 1
Você pode fazer esse tipo de comparação com dados se os converter em seqüências usando uma função antes de compará-las.
function: compare ATTACK:s to DEFENCE:s {
result: ATTACK > DEFENCE
}
output [compare 4d6 to 3d6]
Quando a função compare ATTACK to DEFENCE
é invocada, os ATTACK:s
e DEFENCE:s
na declaração convertem quaisquer argumentos fornecidos em uma sequência. Quando um conjunto de dados é convertido em uma sequência, ele se torna uma sequência que representa os resultados da rolagem desse conjunto de dados, classificado de alto a baixo (e a função é invocada uma vez para cada resultado possível do rolo e as estatísticas de resultados juntas) .
Este programa recebe paradas de dados e faz um pouco de comparação de sequências para lhe dizer qual delas ganha nessas circunstâncias. Isso supõe que sua regra é que 6,6,5
vence 6,5,5
, ou seja, esses dados se anulam em uma base de 1: 1; se você pretendia diferentemente, isso se torna muito mais complexo para descrever e Anydice começa a não ser muito eficiente.
Mas eu quero contar o número de empates!
Infelizmente, a comparação de sequências não permite que você faça isso. Mas se você escrever seu próprio iterador de loop manualmente, ele será executado com menos eficiência do que qualquer comparação construída com qualquer dado (assim você estará limitado a conjuntos de dados menores antes que qualquer dado desista do programa), mas você pode obter essas informações:
function: compare ATTACK:s to DEFENCE:s {
loop N over {1..[lowest of #ATTACK and #DEFENCE]} {
if N@ATTACK > N@DEFENCE { result: N }
if N@ATTACK < N@DEFENCE { result: -N }
}
if #ATTACK > #DEFENCE {result: #DEFENCE +1}
if #ATTACK < #DEFENCE {result: -#ATTACK -1}
result: 0
}
Basicamente, fazemos um loop sobre o comprimento da matriz mais curta fazendo o elemento por comparação de elementos, e quando obtemos uma vitória ou falha, retornamos N para o sucesso (ou -N para falha). Isso significa que alcançamos o enésimo elemento da matriz antes de obtermos um resultado e, portanto, N-1 pares de dados foram cancelados. Depois, há o bit extra de lógica no final que determina quem ganha se todos os dados que conseguiu comparar forem empates (e garante que o resultado seja consistente com o acima, subtraia 1 do valor absoluto para calcular quantos pares de dados foram cancelados).
Este programa implementa o código acima. No meu teste, ele pode fazer até 5d6 vs 5d6 antes de começar a demorar muito para que qualquer dado seja executado (como você espera que os conjuntos de dados estejam no intervalo de 1-4, esperamos que ainda seja útil para você).