Descrição
Escreva uma função f(m, G)
que aceite como argumentos um mapeamento m
e um conjunto / lista de números inteiros distintos e não negativos G
.
m
deve mapear pares de números inteiros G
para novos números inteiros em G
. ( G
, m
) é garantido para formar um grupo abeliano finito , mas qualquer elemento de G
pode ser a identidade.
Existe um teorema importante que diz:
f
deve 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
m
seguinte 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) * 9
Em seguida,
f(m, [0, 1, ..., 80])
deve retornar[3, 3, 9]
, pois esse grupo é isomórfico para Z 3 × Z 3 × Z 9
Regras
m
pode ser uma função (ou ponteiro de função para alguma função)Int × Int → Int
ou um mapeamento de dicionário associadoG × G
a novos elementos deG
.f
pode 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?