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);
   ...