Делаю реализацию игры Mastermind взял за основу алгоритм Кнута.
Столкнулся с проблемой создания Set всех возможных значений.
Значение хранится в массиве для которого я написал класс обертку.
Есть несколько параметров которые влияют на наш массив. Его длинна и количество возможных цифр.
То есть при длине массива 4 и количестве максимальных значений 6 у меня должно получится множество массивов от [0, 0, 0, 0] до [5, 5, 5, 5].
Вопрос в том как это можно сделать в цикле с отсечкой по максимальному значению. И как int превратить в массив, что-бы 1 давала массив [0, 0, 0, 1], а не [1].
Сделайте цикл по числам 0..6^4-1 и представьте счётчик цикла как четырёхразрядное число в шестеричной системе счисления (с помощью операций целочисленного деления и остатка от деления (взятия модуля)). Каждый получившийся разряд соответствует элементу массива.
десятичное => шестиричное
0 => 0 0 0 0
1295 => 5 5 5 5
679 => 3 0 5 1 (216*3 + 36*0 + 6*5 + 1)
Псевдокод:
Digits = [0,0,0,0]
for i = 0.. 6*6*6*6-1:
t = i
for d = 0..3:
Digit[d] = t % 6
//младший разряд слева - в нулевом индексе
//для того, чтобы 1 соответствовал массиву [0,0,0,1] - сделать
//Digit[3 - d] = t % 6
t = t / 6 ///целочисленное деление
Просто добавлю реализацию описанного в соседнем ответе механизма с использованием Stream API и встроенными методами перевода значений между системами счисления:
int count = 4, max = 6;
long[][] array = LongStream
.range(0, Math.round(Math.pow(max, count)))
.mapToObj(i -> Long.toString(i, max))
.map(s -> Stream.generate(() -> "0")
.limit(count - s.length())
.collect(Collectors.joining()) + s
)
.map(s -> s.chars()
.mapToLong(l -> Long.parseLong(String.valueOf((char) l), max))
.toArray())
.toArray(long[][]::new);
System.out.println(Arrays.deepToString(array));
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости