Descrição
Escreva uma função f(m, G)que aceite como argumentos um mapeamento me um conjunto / lista de números inteiros distintos e não negativos G.
mdeve mapear pares de números inteiros Gpara novos números inteiros em G. ( G, m) é garantido para formar um grupo abeliano finito , mas qualquer elemento de Gpode ser a identidade.
Existe um teorema importante que diz:
fdeve retornar uma lista de poderes principais [p1, ... pn]em ordem crescente, de modo que
Exemplos
f((a, b) → (a+b) mod 4, [0, 1, 2, 3])deve retornar[4], pois os parâmetros descrevem o grupo Z 4 .f((a, b) → a xor b, [0, 1, 2, 3])deve retornar[2, 2], pois os parâmetros descrevem um grupo isomórfico para Z 2 × Z 2 .f((a, b) → a, [9])deve retornar[], pois os parâmetros descrevem o grupo trivial; isto é, o produto de grupos cíclicos zero.Defina da
mseguinte maneira:(a, b) → (a mod 3 + b mod 3) mod 3 + ((floor(a / 3) + floor(b / 3)) mod 3) * 3 + ((floor(a / 9) + floor(b / 9)) mod 9) * 9Em seguida,
f(m, [0, 1, ..., 80])deve retornar[3, 3, 9], pois esse grupo é isomórfico para Z 3 × Z 3 × Z 9
Regras
mpode ser uma função (ou ponteiro de função para alguma função)Int × Int → Intou um mapeamento de dicionário associadoG × Ga novos elementos deG.fpode levar seus parâmetros na ordem oposta, ou seja, você também pode implementarf(G, m).Teoricamente, sua implementação deve funcionar com entradas arbitrariamente grandes, mas na verdade não precisa ser eficiente.
Não há limitação no uso de built-ins de qualquer tipo.
Aplicam-se as regras de código-golfe padrão . O código mais curto em bytes vence.
Entre os melhores
Para que sua pontuação apareça no quadro, ela deve estar neste formato:
# Language, Bytes
for a in G: for b in G: d[(a, b)] = m(a, b)).
AABC, tratando-os como triplos (A, B, C), com módulo de adição par a par (9, 3, 3).
mé permitido ser um dicionário, você também pode fornecer os casos de teste como dicionários?