PHP форум на ПЫХА.РУ

PHP форум на ПЫХА.РУ

Языки программирования => JavaScript => Тема начата: adw0rd от 12 Май, 2009, 04:31:44



Название: Вычисление комбинаций по факториалу
Отправлено: adw0rd от 12 Май, 2009, 04:31:44
Есть ли в JavaScript готовая ф-ия для вычисления всех комбинаций по факториалу?

Комбинаторное определение
 
В комбинаторике факториал определяется как количество перестановок множества из n элементов. Например, элементы множества {A,B,C,D} можно линейно упорядочить 4!=24 способами:
 
ABCD  BACD  CABD  DABC
ABDC  BADC  CADB  DACB
ACBD  BCAD  CBAD  DBAC
ACDB  BCDA  CBDA  DBCA
ADBC  BDAC  CDAB  DCAB
ADCB  BDCA  CDBA  DCBA

Мне надо, например из 3-х слов
раз, два, три

составить комбинации

раз-два-три
раз-три-два
два-раз-три
два-три-раз
три-раз-два
три-два-раз


Название: Вычисление комбинаций по факториалу
Отправлено: phpdude от 12 Май, 2009, 04:35:58
почти уверен что такой штуки в яваскрипте нету ..


Название: Вычисление комбинаций по факториалу
Отправлено: adw0rd от 12 Май, 2009, 04:39:35
helldude, тоже так думаю, интересно а в фреймворках...? Я сейчас сам напишу конечно, но просто интересно...


Название: Вычисление комбинаций по факториалу
Отправлено: phpdude от 12 Май, 2009, 04:42:42

helldude, тоже так думаю, интересно а в фреймворках...? Я сейчас сам напишу конечно, но просто интересно...
 
такие задачи .. ну оооочень уж редки имхо и в фрейм выносить просто нерационально, поэтому думаю нету)


Название: Вычисление комбинаций по факториалу
Отправлено: adw0rd от 12 Май, 2009, 04:54:28
helldude, ну возможно есть плагины... ну ладно, сейчас напишу и выложу... пока что еклипс апдейтится...


Название: Вычисление комбинаций по факториалу
Отправлено: phpdude от 12 Май, 2009, 04:57:13

helldude, ну возможно есть плагины... ну ладно, сейчас напишу и выложу... пока что еклипс апдейтится...
КОД В СТУДИЮ! ждем! :)


Название: Вычисление комбинаций по факториалу
Отправлено: Убийца от 12 Май, 2009, 04:57:42
писал такое года 4 назад на x86 ассемблере)


Название: Вычисление комбинаций по факториалу
Отправлено: phpdude от 12 Май, 2009, 05:08:02

писал такое года 4 назад на x86 ассемблере)
выкладывай))


Название: Вычисление комбинаций по факториалу
Отправлено: mario от 12 Май, 2009, 05:36:39


писал такое года 4 назад на x86 ассемблере)
выкладывай))
+1 очень интересно глянуть на асу :)


Название: Вычисление комбинаций по факториалу
Отправлено: Убийца от 12 Май, 2009, 05:45:13
старый код не нашел, но идея здесь: http://www.wasm.ru/article.php?article=cycle_pwd


Название: Вычисление комбинаций по факториалу
Отправлено: adw0rd от 12 Май, 2009, 10:14:19
ссылки в помощь http://tvsh2004.narod.ru/alg08.html и http://symmetrica.net/algorithms/combinations.htm


Название: Вычисление комбинаций по факториалу
Отправлено: phpdude от 12 Май, 2009, 10:44:33
обе ссылки - ужас


Название: Вычисление комбинаций по факториалу
Отправлено: phpdude от 12 Май, 2009, 10:58:34
PHP
<?
$data = array("Раз","Два","Три");
 
$wdata = array_merge($data,$data);
$count = count($data);
 
$result = array();
foreach($data as $i=>$v)
{
    $c = $wdata;
    unset($c[$i],$c[$i+$count]);
    $c = array_values($c);
 
    for($j=0;$j<$count-1;$j++)
    {
        $return[] = $v."-".join("-",array_slice($c,$j,$count-1));
    }
}
 
echo join("\n",$return);

ну и у мну пиздец код конечно, но как вариант может и пойдет :))
 
имхо главное - прозрачность кода.
 
Раз-Два-Три
Раз-Три-Два
Два-Раз-Три
Два-Три-Раз
Три-Раз-Два
Три-Два-Раз


Название: Вычисление комбинаций по факториалу
Отправлено: phpdude от 12 Май, 2009, 10:59:48
Раз-Два-Три-Четыре-Пядь
Раз-Три-Четыре-Пядь-Два
Раз-Четыре-Пядь-Два-Три
Раз-Пядь-Два-Три-Четыре
Два-Раз-Три-Четыре-Пядь
Два-Три-Четыре-Пядь-Раз
Два-Четыре-Пядь-Раз-Три
Два-Пядь-Раз-Три-Четыре
Три-Раз-Два-Четыре-Пядь
Три-Два-Четыре-Пядь-Раз
Три-Четыре-Пядь-Раз-Два
Три-Пядь-Раз-Два-Четыре
Четыре-Раз-Два-Три-Пядь
Четыре-Два-Три-Пядь-Раз
Четыре-Три-Пядь-Раз-Два
Четыре-Пядь-Раз-Два-Три
Пядь-Раз-Два-Три-Четыре
Пядь-Два-Три-Четыре-Раз
Пядь-Три-Четыре-Раз-Два
Пядь-Четыре-Раз-Два-Три


Название: Вычисление комбинаций по факториалу
Отправлено: phpdude от 12 Май, 2009, 11:00:36
Раз-Два-Три-Четыре-Пядь-Жесдь-Семь-Восемь-Девядь-Десядь
Раз-Три-Четыре-Пядь-Жесдь-Семь-Восемь-Девядь-Десядь-Два
Раз-Четыре-Пядь-Жесдь-Семь-Восемь-Девядь-Десядь-Два-Три
Раз-Пядь-Жесдь-Семь-Восемь-Девядь-Десядь-Два-Три-Четыре
Раз-Жесдь-Семь-Восемь-Девядь-Десядь-Два-Три-Четыре-Пядь
Раз-Семь-Восемь-Девядь-Десядь-Два-Три-Четыре-Пядь-Жесдь
Раз-Восемь-Девядь-Десядь-Два-Три-Четыре-Пядь-Жесдь-Семь
Раз-Девядь-Десядь-Два-Три-Четыре-Пядь-Жесдь-Семь-Восемь
Раз-Десядь-Два-Три-Четыре-Пядь-Жесдь-Семь-Восемь-Девядь
Два-Раз-Три-Четыре-Пядь-Жесдь-Семь-Восемь-Девядь-Десядь
Два-Три-Четыре-Пядь-Жесдь-Семь-Восемь-Девядь-Десядь-Раз
Два-Четыре-Пядь-Жесдь-Семь-Восемь-Девядь-Десядь-Раз-Три
Два-Пядь-Жесдь-Семь-Восемь-Девядь-Десядь-Раз-Три-Четыре
Два-Жесдь-Семь-Восемь-Девядь-Десядь-Раз-Три-Четыре-Пядь
Два-Семь-Восемь-Девядь-Десядь-Раз-Три-Четыре-Пядь-Жесдь
Два-Восемь-Девядь-Десядь-Раз-Три-Четыре-Пядь-Жесдь-Семь
Два-Девядь-Десядь-Раз-Три-Четыре-Пядь-Жесдь-Семь-Восемь
Два-Десядь-Раз-Три-Четыре-Пядь-Жесдь-Семь-Восемь-Девядь
Три-Раз-Два-Четыре-Пядь-Жесдь-Семь-Восемь-Девядь-Десядь
Три-Два-Четыре-Пядь-Жесдь-Семь-Восемь-Девядь-Десядь-Раз
Три-Четыре-Пядь-Жесдь-Семь-Восемь-Девядь-Десядь-Раз-Два
Три-Пядь-Жесдь-Семь-Восемь-Девядь-Десядь-Раз-Два-Четыре
Три-Жесдь-Семь-Восемь-Девядь-Десядь-Раз-Два-Четыре-Пядь
Три-Семь-Восемь-Девядь-Десядь-Раз-Два-Четыре-Пядь-Жесдь
Три-Восемь-Девядь-Десядь-Раз-Два-Четыре-Пядь-Жесдь-Семь
Три-Девядь-Десядь-Раз-Два-Четыре-Пядь-Жесдь-Семь-Восемь
Три-Десядь-Раз-Два-Четыре-Пядь-Жесдь-Семь-Восемь-Девядь
Четыре-Раз-Два-Три-Пядь-Жесдь-Семь-Восемь-Девядь-Десядь
Четыре-Два-Три-Пядь-Жесдь-Семь-Восемь-Девядь-Десядь-Раз
Четыре-Три-Пядь-Жесдь-Семь-Восемь-Девядь-Десядь-Раз-Два
Четыре-Пядь-Жесдь-Семь-Восемь-Девядь-Десядь-Раз-Два-Три
Четыре-Жесдь-Семь-Восемь-Девядь-Десядь-Раз-Два-Три-Пядь
Четыре-Семь-Восемь-Девядь-Десядь-Раз-Два-Три-Пядь-Жесдь
Четыре-Восемь-Девядь-Десядь-Раз-Два-Три-Пядь-Жесдь-Семь
Четыре-Девядь-Десядь-Раз-Два-Три-Пядь-Жесдь-Семь-Восемь
Четыре-Десядь-Раз-Два-Три-Пядь-Жесдь-Семь-Восемь-Девядь
Пядь-Раз-Два-Три-Четыре-Жесдь-Семь-Восемь-Девядь-Десядь
Пядь-Два-Три-Четыре-Жесдь-Семь-Восемь-Девядь-Десядь-Раз
Пядь-Три-Четыре-Жесдь-Семь-Восемь-Девядь-Десядь-Раз-Два
Пядь-Четыре-Жесдь-Семь-Восемь-Девядь-Десядь-Раз-Два-Три
Пядь-Жесдь-Семь-Восемь-Девядь-Десядь-Раз-Два-Три-Четыре
Пядь-Семь-Восемь-Девядь-Десядь-Раз-Два-Три-Четыре-Жесдь
Пядь-Восемь-Девядь-Десядь-Раз-Два-Три-Четыре-Жесдь-Семь
Пядь-Девядь-Десядь-Раз-Два-Три-Четыре-Жесдь-Семь-Восемь
Пядь-Десядь-Раз-Два-Три-Четыре-Жесдь-Семь-Восемь-Девядь
Жесдь-Раз-Два-Три-Четыре-Пядь-Семь-Восемь-Девядь-Десядь
Жесдь-Два-Три-Четыре-Пядь-Семь-Восемь-Девядь-Десядь-Раз
Жесдь-Три-Четыре-Пядь-Семь-Восемь-Девядь-Десядь-Раз-Два
Жесдь-Четыре-Пядь-Семь-Восемь-Девядь-Десядь-Раз-Два-Три
Жесдь-Пядь-Семь-Восемь-Девядь-Десядь-Раз-Два-Три-Четыре
Жесдь-Семь-Восемь-Девядь-Десядь-Раз-Два-Три-Четыре-Пядь
Жесдь-Восемь-Девядь-Десядь-Раз-Два-Три-Четыре-Пядь-Семь
Жесдь-Девядь-Десядь-Раз-Два-Три-Четыре-Пядь-Семь-Восемь
Жесдь-Десядь-Раз-Два-Три-Четыре-Пядь-Семь-Восемь-Девядь
Семь-Раз-Два-Три-Четыре-Пядь-Жесдь-Восемь-Девядь-Десядь
Семь-Два-Три-Четыре-Пядь-Жесдь-Восемь-Девядь-Десядь-Раз
Семь-Три-Четыре-Пядь-Жесдь-Восемь-Девядь-Десядь-Раз-Два
Семь-Четыре-Пядь-Жесдь-Восемь-Девядь-Десядь-Раз-Два-Три
Семь-Пядь-Жесдь-Восемь-Девядь-Десядь-Раз-Два-Три-Четыре
Семь-Жесдь-Восемь-Девядь-Десядь-Раз-Два-Три-Четыре-Пядь
Семь-Восемь-Девядь-Десядь-Раз-Два-Три-Четыре-Пядь-Жесдь
Семь-Девядь-Десядь-Раз-Два-Три-Четыре-Пядь-Жесдь-Восемь
Семь-Десядь-Раз-Два-Три-Четыре-Пядь-Жесдь-Восемь-Девядь
Восемь-Раз-Два-Три-Четыре-Пядь-Жесдь-Семь-Девядь-Десядь
Восемь-Два-Три-Четыре-Пядь-Жесдь-Семь-Девядь-Десядь-Раз
Восемь-Три-Четыре-Пядь-Жесдь-Семь-Девядь-Десядь-Раз-Два
Восемь-Четыре-Пядь-Жесдь-Семь-Девядь-Десядь-Раз-Два-Три
Восемь-Пядь-Жесдь-Семь-Девядь-Десядь-Раз-Два-Три-Четыре
Восемь-Жесдь-Семь-Девядь-Десядь-Раз-Два-Три-Четыре-Пядь
Восемь-Семь-Девядь-Десядь-Раз-Два-Три-Четыре-Пядь-Жесдь
Восемь-Девядь-Десядь-Раз-Два-Три-Четыре-Пядь-Жесдь-Семь
Восемь-Десядь-Раз-Два-Три-Четыре-Пядь-Жесдь-Семь-Девядь
Девядь-Раз-Два-Три-Четыре-Пядь-Жесдь-Семь-Восемь-Десядь
Девядь-Два-Три-Четыре-Пядь-Жесдь-Семь-Восемь-Десядь-Раз
Девядь-Три-Четыре-Пядь-Жесдь-Семь-Восемь-Десядь-Раз-Два
Девядь-Четыре-Пядь-Жесдь-Семь-Восемь-Десядь-Раз-Два-Три
Девядь-Пядь-Жесдь-Семь-Восемь-Десядь-Раз-Два-Три-Четыре
Девядь-Жесдь-Семь-Восемь-Десядь-Раз-Два-Три-Четыре-Пядь
Девядь-Семь-Восемь-Десядь-Раз-Два-Три-Четыре-Пядь-Жесдь
Девядь-Восемь-Десядь-Раз-Два-Три-Четыре-Пядь-Жесдь-Семь
Девядь-Десядь-Раз-Два-Три-Четыре-Пядь-Жесдь-Семь-Восемь
Десядь-Раз-Два-Три-Четыре-Пядь-Жесдь-Семь-Восемь-Девядь
Десядь-Два-Три-Четыре-Пядь-Жесдь-Семь-Восемь-Девядь-Раз
Десядь-Три-Четыре-Пядь-Жесдь-Семь-Восемь-Девядь-Раз-Два
Десядь-Четыре-Пядь-Жесдь-Семь-Восемь-Девядь-Раз-Два-Три
Десядь-Пядь-Жесдь-Семь-Восемь-Девядь-Раз-Два-Три-Четыре
Десядь-Жесдь-Семь-Восемь-Девядь-Раз-Два-Три-Четыре-Пядь
Десядь-Семь-Восемь-Девядь-Раз-Два-Три-Четыре-Пядь-Жесдь
Десядь-Восемь-Девядь-Раз-Два-Три-Четыре-Пядь-Жесдь-Семь
Десядь-Девядь-Раз-Два-Три-Четыре-Пядь-Жесдь-Семь-Восемь


Название: Вычисление комбинаций по факториалу
Отправлено: CTAPbIu_MABP от 12 Май, 2009, 11:11:49
скрипт в студию


Название: Вычисление комбинаций по факториалу
Отправлено: phpdude от 12 Май, 2009, 11:13:30
http://pyha.ru/forum/topic/2446.msg45056#msg45056


Название: Вычисление комбинаций по факториалу
Отправлено: CTAPbIu_MABP от 12 Май, 2009, 11:15:35
куль


Название: Вычисление комбинаций по факториалу
Отправлено: phpdude от 12 Май, 2009, 11:16:10

куль
можно и без массивов, но я люблю массивы.


Название: Вычисление комбинаций по факториалу
Отправлено: CTAPbIu_MABP от 12 Май, 2009, 11:28:36
я люблю скорость
если работает быстро (и код читабелен) то все ништяк


Название: Вычисление комбинаций по факториалу
Отправлено: ghost от 17 Май, 2009, 08:38:59

PHP
<?
$data = array("Раз","Два","Три");
 
$wdata = array_merge($data,$data);
$count = count($data);
 
$result = array();
foreach($data as $i=>$v)
{
    $c = $wdata;
    unset($c[$i],$c[$i+$count]);
    $c = array_values($c);
 
    for($j=0;$j<$count-1;$j++)
    {
        $return[] = $v."-".join("-",array_slice($c,$j,$count-1));
    }
}
 
echo join("\n",$return);

ну и у мну пиздец код конечно, но как вариант может и пойдет :))
 
имхо главное - прозрачность кода.
 
Раз-Два-Три
Раз-Три-Два
Два-Раз-Три
Два-Три-Раз
Три-Раз-Два
Три-Два-Раз

код пойдёт только для 1,2,3
для 1,2,3,4 - видим
1 - 2 - 3 - 4
1 - 3 - 4 - 2
1 - 4 - 2 - 3
2 - 1 - 3 - 4
2 - 3 - 4 - 1
2 - 4 - 1 - 3
3 - 1 - 2 - 4
3 - 2 - 4 - 1
3 - 4 - 1 - 2
4 - 1 - 2 - 3
4 - 2 - 3 - 1
4 - 3 - 1 - 2
очевидно комбинации 1-2-4-3 нет, и еще нескольких


Название: Вычисление комбинаций по факториалу
Отправлено: CTAPbIu_MABP от 17 Май, 2009, 08:53:06
ghost, кул! никто больше похоже не проверял


Название: Вычисление комбинаций по факториалу
Отправлено: phpdude от 17 Май, 2009, 09:10:13
ghost, понимаешь, эдво такие результаты и просил. мне то похуй что генерить


Название: Вычисление комбинаций по факториалу
Отправлено: phpdude от 17 Май, 2009, 09:10:33
Мне надо, например из 3-х слов
Цитата:
раз, два, три
 
 
составить комбинации
Цитата:
раз-два-три
раз-три-два
два-раз-три
два-три-раз
три-раз-два
три-два-раз


Название: Вычисление комбинаций по факториалу
Отправлено: phpdude от 17 Май, 2009, 09:11:15
PHP
<?
$data = array("Раз","Два","Три");
 
$wdata = array_merge($data,$data);
$count = count($data);
 
$result = array();
foreach($data as $i=>$v)
{
    for($j=0;$j<$count;$j++)
    {
        $return[] = $v."-".join("-",array_slice($wdata,$j,$count-1));
    }
}
 
echo join("\n",$return);

-1 убери из второго фора + ансет вытри и будет тебе как ты говоришь :)


Название: Вычисление комбинаций по факториалу
Отправлено: ghost от 17 Май, 2009, 09:21:21
не, не будет.. тут либо рекурсию нужно, либо лишние циклы.. универсальной формулы в комбинаторике нет, и 2-я циклами ( множество размерности n^2) всех перестановок (множество размерности n!) ты не получишь


Название: Вычисление комбинаций по факториалу
Отправлено: phpdude от 17 Май, 2009, 09:30:20
ghost, ты права наверно


Название: Вычисление комбинаций по факториалу
Отправлено: phpdude от 17 Май, 2009, 09:30:39
думать не хочется, устал за сегодня уже)))
 
может завтра вернусь покопать эту тему)


Название: Вычисление комбинаций по факториалу
Отправлено: ghost от 17 Май, 2009, 10:25:37
че тут думать? тут трясти надо :)
 
PHP
<?php
$arr = array(1, 2, 3, 4, 5);
 
function shift($arr, $str) {
    $rez = '';
    if (count($arr)==1) return $str.($str ? ' - ' : '').array_shift($arr)."<br />";
    foreach ($arr as $key=>$val) {
        $arr1 = $arr;
        unset($arr1[$key]);
        $str1 = $str.($str ? ' - ' : '').$val;
        $rez .= shift($arr1, $str1);
    }
    return $rez;
}
$rez = shift($arr, '')
print $rez;
?>


Название: Вычисление комбинаций по факториалу
Отправлено: ghost от 17 Май, 2009, 11:03:46

не, не будет.. тут либо рекурсию нужно, либо лишние циклы.. универсальной формулы в комбинаторике нет, и 2-я циклами ( множество размерности n^2) всех перестановок (множество размерности n!) ты не получишь
да, пардон, не размерности а мощности. размерность это из другой оперы)


Название: Вычисление комбинаций по факториалу
Отправлено: CTAPbIu_MABP от 17 Май, 2009, 11:05:42
ghost, не грузи математикой тут все только первых три класса закончили


Название: Вычисление комбинаций по факториалу
Отправлено: Baboot от 17 Май, 2009, 11:15:55
да и не все... Я вот 1,258 класса.


Название: Вычисление комбинаций по факториалу
Отправлено: phpdude от 17 Май, 2009, 11:18:05
уху, гост умная ....


Название: Вычисление комбинаций по факториалу
Отправлено: phpdude от 17 Май, 2009, 11:18:13
я вот уже нихуя не соображаю)


Название: Вычисление комбинаций по факториалу
Отправлено: Baboot от 17 Май, 2009, 11:34:54
состояние тупняка, причом полного.


Название: Вычисление комбинаций по факториалу
Отправлено: ghost от 17 Май, 2009, 11:49:27
CTAPbIu_MABP, извини, больше не буду:)


Название: Вычисление комбинаций по факториалу
Отправлено: adw0rd от 18 Май, 2009, 12:26:10

ghost, понимаешь, эдво такие результаты и просил. мне то похуй что генерить

да если мне только для трех, то я бы делал так:
 
i++
123
231
312

i--
321
213
132

Тут ничего сложного... А вот далее...
 
ps. смотреть вертикальные столбы


Название: Вычисление комбинаций по факториалу
Отправлено: adw0rd от 19 Май, 2009, 12:07:08
ghost, огромное спасибо!


PHP форум на ПЫХА.РУ