Distancia de Hamming con JavaScript

Archivada en Desarrollo Web

Distancia de Hamming con JavaScript

Según la Wikipedia, la “Distancia de Hamming” es la diferencia entre una palabra y otra. En este ejercicio se debe calcular la distancia de Hamming entre dos cadenas de ADN.

Qué es una mutación

Una mutación es simplemente un error que ocurre durante la creación o copiado de un ácido nucleico, en particular de ADN. Debido a que los ácidos nucleicos son vitales para el funcionamiento celular, las mutaciones tienden a provocar un efecto de onda en toda la célula. Aunque las mutaciones son técnicamente errores, una mutación puede equipar a la célula con un atributo benéfico. De hecho, los efectos a nivel macro de la evolución se atribuyen por la resultados acumuladores de mutaciones microscópicas benéficas acumuladas a lo largo de muchas generaciones.

La mutación de ácido nucleico mas simple y común es una mutación puntual, que reemplaza una base con otra en un nucleótido individual.

Al contar el número de diferencias entre dos cadenas de ADN homólogas obtenidas de diferentes genomas con un ancestro común, obtenemos una medida del número mínimo de puntos de mutación que podrían haber ocurrido en la ruta evolutiva entre las dos cadenas.

Esta medida se llama “Distancia de Hamming”.

Se encuentra comparando dos cadenas de ADN y contar cuántos nucleótidos son diferentes de sus equivalentes en la otra cadena.

GAGCCTACTAACGGGAT
CATCGTAATGACGGCCT
^ ^ ^  ^ ^    ^^

La distancia de Hamming de estas dos cadenas de ADN es de 7.

Implementación

La distancia de Hamming solo puede definirse con secuencias de la misma longitud. Esto significa que, de acuerdo a la definición, debemos manejar con un error cadenas de longitudes diferentes.

Para la realización de este ejercicio se usará el paradigma de Desarrollo Basado en Pruebas, que consiste en escribir y pasar todas las pruebas o test que aseguren el funcionamiento del programa.

Estas son las pruebas que controlan el desarrollo:

var Hamming = require('./hamming');

describe('Hamming', function () {
  var hamming = new Hamming();

  it('no difference between identical strands', function () {
    expect(hamming.compute('A', 'A')).toEqual(0);
  });

  it('complete hamming distance for single nucleotide strand', function () {
    expect(hamming.compute('A','G')).toEqual(1);
  });

  it('complete hamming distance for small strand', function () {
    expect(hamming.compute('AG','CT')).toEqual(2);
  });

  it('small hamming distance', function () {
    expect(hamming.compute('AT','CT')).toEqual(1);
  });

  it('small hamming distance in longer strand', function () {
    expect(hamming.compute('GGACG', 'GGTCG')).toEqual(1);
  });

  it('large hamming distance', function () {
    expect(hamming.compute('GATACA', 'GCATAA')).toEqual(4);
  });

  it('hamming distance in very long strand', function () {
    expect(hamming.compute('GGACGGATTCTG', 'AGGACGGATTCT')).toEqual(9);
  });

  it('throws error when strands are not equal length', function() {
    expect(function() { hamming.compute('GGACGGATTCTG', 'AGGAC'); }).toThrow(
      new Error('DNA strands must be of equal length.')
    );
  });

});

Y después de cuatro iteraciones, logré una función que pasa las ocho pruebas.

var Hamming = function(){};

Hamming.prototype.compute = function(adn1, adn2){
  var size = adn1.length - adn2.length;

  if(size !== 0) {
    throw new Error('DNA strands must be of equal length.');
  } else {
    if (adn1.length == 1) {
      if (adn1 === adn2) {
        return 0;
      } else {
        return 1;
      }
    } else {
      var i;
      var dist = 0;
      for (i = 0; i < adn1.length; i++){
        if (adn1[i] !== adn2[i]) {
          dist++;
        }
      }
      return dist;
    }
  } 
};

module.exports = Hamming;

Javier Sanchez Toledano

Auditor Líder ISO 9000 ● Desarrollo Web Full Stack ● Django/Python ● JavaScript · NodeJS · Angular · VueJS · EmberJS ● Swift 4 ● WordPress · Genesis Framework ● Lector ● Fotografo aficionado ● Generación X ● Soy de Tlaxcala

Tlaxcala, México

Comentarios