Показать сообщение отдельно
Старый 17.03.2016, 18:28
a7s1h1 вне форума Посмотреть профиль Отправить личное сообщение для a7s1h1 Найти все сообщения от a7s1h1
  № 9  
Ответить с цитированием
a7s1h1

Регистрация: Oct 2013
Сообщений: 126
Попробовал сделать, как вы сказали.
Напоминаю условия:
- массив из 10 ячеек необходимо заполнить случайными цифрами от 0 до 9 с соблюдением ряда условий
- первая и последняя ячейка всегда 0
- максимальное количество не нолей - 6
- максимальная цифра известна заранее
- максимальное количество одинаковых цифр: единиц, двоек, троек по 4, 4-6 максимум по 3, 7-8 максимум по 2, девятка только одна
- максимальное количество одинаковых цифр подряд - 2

Вот что получилось:
Код AS3:
var max_level:uint = 9; // максимальная цифра - пусть сейчас это будет 9
 
// вектор, который необходимо заполнить. Заполняем его нулями
var temp_vector:Vector.<uint> = new < uint > [0,0,0,0,0,0,0,0,0,0];
 
// если максимальный уровень = 0, то ничего не проверяем, везде остаются нули
if (max_level > 0) {
	// создаём мешок с цифрами, откуда будем их вытаскивать
	var bag:Vector.<uint>;
	// в мешок суём все цифры до максимальной
	// количество каждой цифы ставим максимальное (т.к. из 10 ячеек первая и последняя точно нули, то будем проверять только 8 ячеек, соответственно суём в мешок максимально возможное количество каждой цифры: 8 нолей, остальные смотря по цифре)
	switch (max_level) {
		case 1: bag=new <uint>[0,0,0,0,0,0,0,0,1,1,1,1]; break; //1 не более 4
		case 2: bag=new <uint>[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2]; break; //2 не более 4
		case 3: bag=new <uint>[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3]; break; //3 не более 4
		case 4: bag=new <uint>[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4]; break; //4 не более 3
		case 5: bag=new <uint>[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,5,5,5]; break; //5 не более 3
		case 6: bag=new <uint>[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,5,5,5,6,6,6]; break; //6 не более 3
		case 7: bag=new <uint>[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,5,5,5,6,6,6,7,7]; break; 		//7 не более 2
		case 8: bag=new <uint>[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,5,5,5,6,6,6,7,7,8,8]; break; 	//8 не более 2
		case 9: bag=new <uint>[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,5,5,5,6,6,6,7,7,8,8,9]; break; 	//9 не более 1
	}
 
	var testee:uint=0; 	// проверяемая цифра
	var previous1:uint = 0; // предыдущая цифра
	var previous2:uint = 0; // предпредыдущая цифра
	var tvl:int = temp_vector.length; // длина временного вектора для ссылки в цикле
 
 
 
	// перебор каждой ячейки, кроме первой и последней (получается 8)
	for (var i:int = 1; i < tvl - 1; i++) {
		var bag_length:uint = bag.length; // длина мешка для ссылки в цикле
		// достаём из мешка случайную цифру, пока не выпадет та, которая не совпадает с предыдущими двумя
		while (testee == previous1) {
			testee = bag[MyMath.randomRange(0, bag_length - 1)]
			if (testee != previous2) {break	}
		}
 
		// найдя подходящую цифру,
		temp_vector[i] = testee; // заносим её в соответствующую ячейку временного вектора
		previous2 = previous1; // записываем предыдущие цифры
		previous1 = testee; // записываем предыдущие цифры
		bag.splice(i, 1); // удаляем выбранную цифру из мешка
	}
}
//проверяем, что получилось
trace('temp_vector='+temp_vector)
Код работает, как надо, только есть две проблемы:
1. Выглядит не очень, поможете оптимизировать?
2. Не соблюдается правило "не больше 6 цифр, отличных от нуля". В какой момент и как
Цитата:
Сообщение от Wolsh Посмотреть сообщение
рандомно вставляете два нолика.
, пока не смекнул Подскажите, пожалуйста