JSFiddle - React, Tailwind, and code Playground

by Brondem Brondem

JavaScript

function Bailarin( posicion, valor ) {
    this.posicion  = posicion;
    this.izquierda = posicion-1;
    this.derecha   = posicion+1;
}

function Bailarines( n ) {
    var i;
    for( i = 0; i < n; ++i ) {
        this.push( new Bailarin( i ) );
    }
}
Bailarines.prototype = Array.prototype;

Object.defineProperty( Bailarines.prototype, 'asignarValores', {
    value : function( array ) {
        var n = array.length;
        for( var i = 0; i < n; ++i )
            this[i].valor = array[i];
    }
});

function Sombrero( bailarines, primero, ultimo ){
    this.bailarines = bailarines;
    this.primero    = primero;
    this.ultimo     = ultimo;
    for( var i = primero; i <= ultimo; ++i ) {
        this.bailarines[i].sombrero = this;
    }
}

Object.defineProperty( Sombrero.prototype, 'asignarSombrero', {
    value: function( color, pos ) {
        if       ( color === 'negro' ) {
            this.negro = this.bailarines[pos];
            this.negro.busca = 'menor';
            this.negro.margen = [ this.negro.posicion+1,this.ultimo ];
            console.log( this.negro.valor + ' se pone el sombrero negro' );
            return this.negro;
        } else if( color === 'granate' ) {
            this.granate = this.bailarines[pos];
            this.granate.hacia = 'izquierda';
            console.log( this.granate.valor + ' se pone el sombrero granate' );
            return this.granate;
        } else throw console.error( 'El baile hungaro sólo permite sombreros granates o negros' );
    }
});

Bailarin.prototype.parejaAdecuada = function( bailarin ) {
    if       ( this.busca === 'menor' ) {
    	if( bailarin.hacia === 'izquierda' || bailarin.hacia === 'derecha' )
            return bailarin.valor < this.valor;
    } else if( this.busca === 'mayor' ) {
    	if( bailarin.hacia === 'izquierda' || bailarin.hacia === 'derecha' )
            return bailarin.valor > this.valor;
    } 
    throw console.error( 'Alguno de los bailarines que bailan no tiene...