JSFiddle - React, Tailwind, and code Playground
by mgibsonbr
HTML
A: <input value="1"><br>
B: <input value="10"><br>
M: <input value="4"><br>
Início: <input value="0"><br>
Fim: <input value="10"><br>
<button>Calcular</button>
<ul></ul>
<button>Anterior</button> <button>Próximo</button>
<span>Grande demais!</span>
CSS
span {
color: red;
display: none;
}
JavaScript
function quantas(n, m) {
m = ( m < n - m ? m : n - m );
var dividendo = 1;
var divisor = 1;
for ( var i = 2 ; i <= n ; i++ ) {
if ( i <= n-m && i <= m )
divisor *= i;
if ( m < i && n-m < i )
dividendo *= i;
}
return dividendo / divisor;
}
function combinacoes(a, b, m, inicio, fim, acc, retorno) {
if ( inicio === undefined ) inicio = 0;
if ( fim === undefined ) fim = quantas(b-a+1, m);
if ( fim <= 0 )
return retorno;
if ( acc == undefined ) acc = [];
if ( retorno === undefined ) retorno = [];
if ( m == 0 ) {
retorno.push(acc);
return retorno;
}
if ( a > b )
return retorno;
// Primeiro fazemos todas as combinações que incluem a
if ( inicio < quantas(b-a, m-1) )
combinacoes(a+1, b, m-1, inicio, fim, acc.concat([a]), retorno);
// Depois todas as que não incluem a
inicio -= quantas(b-a, m-1);
fim -= quantas(b-a, m-1);
return combinacoes(a+1, b, m, inicio, fim, acc, retorno);
}
$("button:eq(0)").click(function() {
var ul = $("ul").empty();
var a = parseInt($("input:eq(0)").val(), 10);
var b = parseInt($("input:eq(1)").val(), 10);
var m = parseInt($("input:eq(2)").val(), 10);
var inicio = parseInt($("input:eq(3)").val(), 10);
var fim = parseInt($("input:eq(4)").val(), 10);
var total = quantas(b-a+1, m);
$("span").toggle( total % 1 !== 0 );
$.each(combinacoes(a, b, m, inicio, fim), function() {
ul.append("<li>" + JSON.stringify(this) + "</li>");
});
}).click();
$("button:eq(1)").click(function() {
var inicio = parseInt($("input:eq(3)").val(), 10);
var fim = parseInt($("input:eq(4)").val(), 10);
var len = fim - inicio;
inicio -= len;
if ( inicio < 0 ) inicio = 0;
$("input:eq(3)").val(inicio);
...