Computar minha geometria sagrada [fechado]

10

No RPG de mesa chamado Pathfinder, há uma façanha que os personagens podem fazer, chamada Geometria Sagrada , que permite que um personagem que possui o recurso aprimore seus feitiços em troca de fazer algumas contas: para usá-lo, o personagem rola um número de seis lados. dados iguais às suas classificações em uma habilidade específica, consulta uma tabela com base no nível da magia para determinar quais três números primos são as "Constantes Primárias" para esse nível de mágica e calcula se é ou não possível produzir uma das Constantes Primárias por executando alguma combinação de adição, subtração, multiplicação e divisão e agrupamento entre parênteses em todos os números acumulados.

A tabela de constantes principais por nível de feitiço é a seguinte:

+-------------+-----------------+
| Spell Level | Prime Constants |
+-------------+-----------------+
| 1st         | 3, 5, 7         |
| 2nd         | 11, 13, 17      |
| 3rd         | 19, 23, 29      |
| 4th         | 31, 37, 41      |
| 5th         | 43, 47, 53      |
| 6th         | 59, 61, 67      |
| 7th         | 71, 73, 79      |
| 8th         | 83, 89, 97      |
| 9th         | 101, 103, 107   |
+-------------+-----------------+

Assim, por exemplo, se um personagem tem 5 níveis de habilidade e está lançando uma mágica de 4º nível, jogaria cinco dados de seis lados e precisaria calcular um valor de 31, 37 ou 41. Se eles rolou 6, 6, 4, 3 e 1, então eles poderiam produzir um valor de 37 executando o seguinte cálculo: (6 × 6) + (4-3) × 1 = 37, ou eles poderiam produzir um valor de 41 fazendo ([6 + 6] × 3) + 4 + 1 = 41. Como resultado, o lançamento do feitiço seria bem-sucedido.

Para este quebra-cabeça de programação, seu trabalho é escrever uma função com dois parâmetros de entrada, Nível de ortografia e Nível de habilidade, rolar um número de dados de seis lados igual ao parâmetro Nível de habilidade e calcular se você pode produzir (pelo menos) um dos as constantes principais associadas ao parâmetro Spell Level e, em seguida, produz um valor booleano.

As respostas seriam classificadas principalmente pela eficiência de seu algoritmo (tenho certeza de que um algoritmo de força bruta seria dimensionado muito rapidamente à medida que o parâmetro Skill Ranks aumenta) e, em seguida, pelo tamanho do código-fonte enviado em bytes.

nick012000
fonte
Eu não acho que o Pathfinder exija que o personagem jogue dados, mas o jogador , certo?
Mbomb007 10/07/19
3
Além disso, como você pretende classificar a eficiência do algoritmo que alguém usa?
mbomb007
Por curiosidade, por que o programa está rolando para você? Não seria mais útil se você fornecesse os resultados do teste em vez do ranking de habilidades (para não mencionar mais fácil de testar) ...?
Triggernometry
1
@ mbomb007 Sempre há um xkcd relevante.
Khuldraeseth na'Barya 10/07/19
3
Por padrão, a aleatoriedade não precisa ser justa, mas deve abranger todas as possibilidades. No entanto, nesse caso, as etapas extras entre elas não são observáveis, portanto, basicamente, um envio precisa apenas gerar aleatoriamente verdadeiro ou falso. Seria melhor se as respostas tivessem os valores dos dados como entrada
Jo King

Respostas:

1

Python 2.7, 285 bytes

from itertools import*
from random import*
def f(s,r):
 p=[];n=1;k=1;P=1;d=choices('123456',k=r);D=permutations(d,r);O=product('+-*/',repeat=r-1)
 while-~s*3>n:p+=P%k*[k];n,k,P=n+P%k,k+1,P*k*k
 return any(n in{eval('int(%s)'%'%s'.join(i)%o)for i in D for o in O}for n in p[-4:-1])

Está tecnicamente em conformidade com as especificações do desafio. Apenas retorna Verdadeiro / Falso, não expõe os dados utilizados ou a expressão usada para o chamador.

Além disso, esse algoritmo ignora o agrupamento, pois podemos executar as mesmas operações sem agrupar usando a ordenação. (Isso não seria verdade se a exponenciação fosse uma das operações possíveis, por exemplo.)

Tempo de execução exponencial, pois gera todas as possibilidades e verifica se existe pelo menos uma solução.

Triggernometria
fonte