Я внедряю ящик для судоку, и я хотел бы допустить возможность судоку более высокого измерения.В 2-х измерениях есть 3 группы, которые необходимо проверить на корректность (простое правило содержит только 3 подправила), а для положения (по определению) требуются только 2 координаты, но в более высоких измерениях это очевидно увеличивается.
Я написал следующую сигнатуру метода, но она не работает, и я хотел бы избежать упаковки любой ценой из-за сред, для которых я разрабатываю.
pub fn groups(position: [u8; DIMENSIONS]) -> [impl Group; DIMENSIONS + 1]
Фактический типкаждой группы будет известно во время компиляции (фактический тип будет выглядеть примерно так: [Box, Stack, Band]
), но, похоже, компилятору это не понравится, даже если он будет знать размер каждого элемента.
Мне бы очень хотелось иметь возможность использовать кортеж с размером, определенным во время компиляции, но это, кажется, не так легко поддерживать, если я что-то упустил.
Идея состоит в том, чтоЕсть три типа Group
: Stack
(столбец), Band
(строка) и Box
.Определение для Group
дано ниже.
pub trait Group {
/// A group is considered valid if it has contains only unique elements.
fn is_valid(&self) -> bool { /* Default implementation elided. */ }
/// Returns an owned copy of the group's constituent elements.
fn elements(&self) -> Vec<Option<Element>>;
}
Начнем с двумерного случая.Для данного элемента мы можем записать индекс элемента в виде двойного (т. Е. 2-кортежа) (x, y)
.Группы, ассоциированные с этим элементом, представляют собой одну Box
(как всегда; отсюда DIMENSION + 1
), одну Stack
и одну Band
.
В трех измерениях данный элементиндексируется (по определению) тройкой (т. е. 3-кортеж) (x, y, z)
.В этом случае группы, связанные с этим элементом: одна Box
, одна Stack
и две Band
с.
Эта тенденция продолжается в более высоких измерениях, и я хочу включитьпользователь может использовать другую размерность - таким образом, определение размеров во время компиляции.
Чтобы проверить правильность головоломки, вызывающий просто вызывает Group::is_valid()
для каждого из puzzle.groups()
;они также могут перебирать каждый из них, чтобы отобразить загадку соответствующим образом.