Опис
Напишіть функцію, f(m, G)
яка приймає в якості аргументів відображення m
та набір / список відмінних, негативних чисел G
.
m
має відображати пари цілих чисел у G
нових цілих чисел у G
. ( G
, m
) гарантовано утворює кінцеву абелеву групу , але будь-який елемент G
може бути ідентичним.
Існує важлива теорема, яка говорить:
f
повинні повернути перелік основних повноважень [p1, ... pn]
у порядку зростання, таким, що
Приклади
f((a, b) → (a+b) mod 4, [0, 1, 2, 3])
повинен повернутися[4]
, як параметри описують групу Z 4 .f((a, b) → a xor b, [0, 1, 2, 3])
повинен повернутися[2, 2]
, як параметри описують групу, ізоморфну Z 2 × Z 2 .f((a, b) → a, [9])
повинен повернутися[]
, як параметри описують тривіальну групу; тобто добуток нульових циклічних груп.Визначте
m
так:(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
Потім
f(m, [0, 1, ..., 80])
слід повернутися[3, 3, 9]
, оскільки ця група є ізоморфною Z 3 × Z 3 × Z 9
Правила
m
може бути або функцією (або покажчиком функції на якусь функцію)Int × Int → Int
, або словником, що відображає пари вG × G
нових елементахG
.f
може приймати його параметри в зворотному порядку, тобто ви також можете реалізуватиf(G, m)
.Ваша реалізація теоретично повинна працювати для довільно великих входів, але насправді не повинна бути ефективною.
Немає обмежень щодо використання вбудованих будь-яких типів.
Діють стандартні правила гольф-коду . Виграє найкоротший код у байтах.
Таблиця лідерів
Щоб ваш рахунок з’явився на дошці, він повинен бути у такому форматі:
# Language, Bytes
for a in G: for b in G: d[(a, b)] = m(a, b)
).
AABC
, трактуючи їх як трійки (A, B, C)
, з модулем додавання попарно (9, 3, 3)
.
m
дозволено бути словником, чи можете ви надати тестові приклади також як словники?