Código de JavaScript - Combinaciones únicas o permutaciones incompletas en array

Imágen de perfil

Combinaciones únicas o permutaciones incompletas en arraygráfica de visualizaciones


JavaScript

estrellaestrellaestrellaestrellaestrella(2)
Publicado el 18 de Septiembre del 2017 por kip
1.757 visualizaciones desde el 18 de Septiembre del 2017. Una media de 42 por semana
Código creado a partir de un tema del foro http://www.lawebdelprogramador.com/foros/JavaScript/1622319-Combinaciones-en-array.html, muy débil ya que no obtiene las permutaciones completas pero es posible obtener las combinaciones únicas en su totalidad, tal como comenta el usuario:

Estimados, alguna idea de algoritmo en javascript para generar las combinaciones posibles de n numero de elementos en un array sin repeticion, pongo un ejemplo practico, si tengo "[A,B,C,D]", me retorne en un array
"[A-B-C-D,A-B-C,A-B-D,A-C-D,B-C-D,A-B,A-C,A-D,B-C,B-D,C-D,A,B,C,D]", cualquier idea me sirve muchas gracias.


El algoritmo es simple, creo un array temporal y en base a este creo las combinaciones tomando en cuenta el número de combinaciones, este número es creado a partir del tamaño del array principal.

No es perfecto para arrays con un tamaño muy elevado.

Por defecto trae las permutaciones, se deberia enviar un true para que traiga combinaciones unicas.

Ejemplo permutaciones

1
console.log(combinations(['A', 'B', 'C', 'D']));

Obtendriamos algo asi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[ 'A-B-C-D',
  'A-C-D-B',
  'A-D-B-C',
  'B-C-D-A',
  'B-D-A-C',
  'B-A-C-D',
  'C-D-A-B',
  'C-A-B-D',
  'C-B-D-A',
  'D-A-B-C',
  'D-B-C-A',
  'D-C-A-B',
  'A-B-C',
  'A-C-D',
  'A-D-B',
  'B-C-D',
  'B-D-A',
  'B-A-C',
  'C-D-A',
  'C-A-B',
  'C-B-D',
  'D-A-B',
  'D-B-C',
  'D-C-A',
  'A-B',
  'A-C',
  'B-C',
  'B-D',
  'C-D',
  'C-A',
  'D-A',
  'D-B',
  'A',
  'B',
  'C',
  'D' ]

Como se ve, faltan ciertas permutaciones, ya que fue pensado mas bien para obtener combinaciones unicas.

Ejemplo combinaciones

1
console.log(combinations(['A', 'B', 'C', 'D'], true));

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[ 'A-B-C-D',
  'A-B-C',
  'A-C-D',
  'A-B-D',
  'B-C-D',
  'A-B',
  'A-C',
  'B-C',
  'B-D',
  'C-D',
  'A-D',
  'A',
  'B',
  'C',
  'D' ]

1.0
estrellaestrellaestrellaestrellaestrella(2)

Actualizado el 28 de Octubre del 2017 (Publicado el 18 de Septiembre del 2017)gráfica de visualizaciones de la versión: 1.0
1.758 visualizaciones desde el 18 de Septiembre del 2017. Una media de 42 por semana
estrellaestrellaestrellaestrellaestrella
estrellaestrellaestrellaestrella
estrellaestrellaestrella
estrellaestrella
estrella

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
function combinations(array, unique) {
    return (function(){
        'use strict';
        return main(array, unique);
        function create_array(array, value) {
            var r_array = [];
            var limit = array.indexOf(value);
            for (var i = 0; i < limit; i++) {
                r_array.push(array[i]);
            }
            while (limit--) {
                array.shift();
            }
            return array.concat(r_array);
        }
        function combinations(array, number, unique) {
            var r_array = [];
            var c_number = number;
            var first = array.shift();
            while (number--) {
                r_array.push([first].concat(array.slice(0, c_number - 1)));
                array.push(array.shift());
            }
            if (unique) {
                r_array.map(function(value) {
                    return value.sort();
                });
            }
            return r_array;
        }
        function remove_duplicate(array, value) {
            return array.filter(function(item, index, inputArray) {
                return inputArray.indexOf(item) == index;
            });
        }
        function repopulate_array(array, new_value) {
            for (var i = 0, s = new_value.length; i < s; i++) {
                array.push(new_value[i].join('-'));
            }
            return array;
        }
        function main(array) {
            unique = typeof unique === 'undefined' ? false : unique;
            var len = array.length + 1;
            var c_array = array.slice();
            var r_array = [];
            var t_array = [];
            var value;
            while (len--) {
                while (c_array.length) {
                    value = c_array.shift();
                    t_array = create_array(array.slice(), value);
                    repopulate_array(r_array, combinations(t_array, len, unique));
                }
                c_array = array.slice();
            }
            r_array = remove_duplicate(r_array);
            return r_array;
        }
    })();
}



Comentarios sobre la versión: 1.0 (2)

Imágen de perfil
xve
18 de Septiembre del 2017
estrellaestrellaestrellaestrellaestrella
Excelente Kip!!!
Responder
walnic
11 de Enero del 2018
estrellaestrellaestrellaestrellaestrella
Excelente
Responder

Comentar la versión: 1.0

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios
Es necesario revisar y aceptar las políticas de privacidad

http://lwp-l.com/s4190  
Revisar política de publicidad