Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Альтернатива велосипеда. (https://javascript.ru/forum/server/26497-alternativa-velosipeda.html)

Duda.Ml1986@gmail.com 10.03.2012 21:23

Альтернатива велосипеда.
 
Всем привет.

Возник вопрос такой:
Есть 9 чисел от 1 до 9 (или от 1 до 99)
Нужно составить все возможные комбинации этого перечня, например
1 2 3 4 5 6 7 8 9
2 1 3 4 5 6 7 8 9 и т.д.

Естественно что рещение элементарно, но может есть что то стандартное ? (мало ли что)

П.С. Такой бред нужен для дальнейшего решения судоку.

Gvozd 10.03.2012 21:25

в STL есть такая штука
в JS нету

Duda.Ml1986@gmail.com 10.03.2012 21:31

Цитата:

Сообщение от Gvozd (Сообщение 162360)
в STL есть такая штука
в JS нету

Да мне на php бы.

Gvozd 10.03.2012 21:44

Цитата:

Сообщение от Duda.Ml1986@gmail.com
Да мне на php бы.

Телепатов здесь нету. надо было сразу сказать.
Готового инструмента также нету.
Вот че мне гугл навскидку выдал
http://docstore.mik.ua/orelly/webprog/pcook/ch04_26.htm

GuardCat 11.03.2012 09:10

Давно делал функцию, которая возвращает все перестановки в строке. На js, но, возможно, будет интересна логика или пригодится кому-то ещё.

alert(pers("123456789") );
/** Функция возвращает переданную ей строку,
	поменяв местами указанные символы.
	Принимает три аргумента: строку, и два
	порядковых номера символов для взаимозамены.
	Дуракоустойчивость не предусмотрена.
*/
function swapLetters (text,a,b) {
	if(a == b) {
		return text;
	}
	if(a > b) {
		var c = b; b = a; a = c;
	}
	return text.substr(0,a) + text.substr(b,1) +
			text.substr(a+1,b-a-1) + text.substr(a,1)+
			text.substr(b+1)
	;
}

/** Функция для синтеза всех возможных перестановок символов
	в переданной строке. Не учитывает повторения символов (каждый символов
	считает уникальным).
	Принимает один или два строковых аргумента. 
	Если аргумент один, возвращает все варианты перестановок.
	Если аргумента два, сообщает на каком шаге всех циклов
	найден второй аргумент или сообщает о неудачном поиске.
	Дуракоустойчивость не предусмотрена.
	Фильтрация дублей в результате не предусмотрена.
*/
function pers (txt,searchTxt) {
	var result = [""], letter, item, itemLetter, resultLen, sample;
	searchTxt = searchTxt || "";
	for (letter = 0; letter < txt.length; letter++) {
		resultLen = result.length;
		for (item = 0; item < resultLen; item++) {
			result[item] += txt.substr(letter, 1);
			for (itemLetter = 0; itemLetter <  result[item].length - 1; itemLetter++) {
				sample = swapLetters(result[item], itemLetter, result[item].length - 1);
				if (sample === searchTxt) {
					return "Образец '" + searchTxt + "' найден на шаге " + letter * result.length * sample.length;
				} else {
	 				result.push(sample);
				}
			}
		}
	}
	return searchTxt.length > 0 ? "Образец не найден" : result;
}

Kolyaj 11.03.2012 09:22

Цитата:

Сообщение от Duda.Ml1986@gmail.com
П.С. Такой бред нужен для дальнейшего решения судоку.

Вы брутфорсом собираетесь судоку решать?

Duda.Ml1986@gmail.com 11.03.2012 13:27

Цитата:

Сообщение от Kolyaj (Сообщение 162428)
Вы брутфорсом собираетесь судоку решать?

Нет не брутфорсом.
Была идея создать таблицу всех вариантов.

То есть не только 9 цифр. а 9 на 9 клеток))

Kolyaj 11.03.2012 13:33

А прикинули примерно сколько будет вариантов?

Duda.Ml1986@gmail.com 11.03.2012 14:16

Цитата:

Сообщение от Kolyaj (Сообщение 162456)
А прикинули примерно сколько будет вариантов?

что то многозначное)))

cuberboy 12.03.2012 12:12

это не перестановки а сочетания будет 9!=1*2*3* ... *8*9


Часовой пояс GMT +3, время: 15:08.