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

Imágen de perfil
Val: 553
Bronce
Ha aumentado 1 puesto en JavaScript (en relación al último mes)
Gráfica de JavaScript

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


JavaScript

Publicado el 18 de Septiembre del 2017 por Kip (28 códigos)
13.556 visualizaciones desde el 18 de Septiembre del 2017
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(3)

Actualizado el 28 de Octubre del 2017 (Publicado el 18 de Septiembre del 2017)gráfica de visualizaciones de la versión: 1.0
13.557 visualizaciones desde el 18 de Septiembre del 2017
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 (3)

Imágen de perfil
18 de Septiembre del 2017
estrellaestrellaestrellaestrellaestrella
Excelente Kip!!!
Responder
walnic
11 de Enero del 2018
estrellaestrellaestrellaestrellaestrella
Excelente
Responder
15 de Abril del 2020
estrellaestrellaestrellaestrellaestrella
Hola. Necesito hacer esto peroen visual basic. Sera posible que me ayuden
Gracias
Responder

Comentar la versión: 1.0

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad

http://lwp-l.com/s4190