≡ Menú

Transcripción del ARN con JavaScript

El siguiente ejercicio se llama “Transcripción del ARN” y el enunciado lo establece de la siguiente manera:

Dada una cadena de Ácido desoxirribonucleico, regresar su complemento en Ácido ribonucleico o ARN (a través de la transcripción del ARN).

Tanto la cadena de ADN como la de ARN son secuencias de nucleótidos.

Los cuatro nucleótidos que se encuentran en el ADN son

  • adenina (A),
  • citosina (C),
  • guanina (G) y
  • timina (T).

Los cuatro nucleótidos en el ARN son:

  • adenina (A),
  • citosina (C),
  • guanina (G) y
  • uracilo (U).

Dada una cadena de ADN, su transcripción a ARN se forma reemplazado cada nucleótido con su complemento:

  • GC
  • CG
  • TA
  • AU

Implementación

La prueba base para aprobar este ejercicio es convertir la citosina del ADN en guanina del ARN, es decir, que a la función se le da una C como parámetro y regresa una G.

  it('transcribes cytosine to guanine', function() {
    expect(dnaTranscriber.toRna('C')).toEqual('G');
  });

Esto se soluciona con un simple switch de JavaScript, ya que solo tenemos un solo nucleótido que transcribir.

var DnaTranscriber = function(){};

DnaTranscriber.prototype.toRna = function(strand) {
  switch(strand) {
    case 'G':
      return 'C';
      break;
    case 'C':
      return 'G';
      break;
    case 'T':
      return 'A';
      break;
    case 'A':
      return 'U';
      break;
    }
};

module.exports = DnaTranscriber;

De hecho, las pruebas opcionales verifican la transcripción de los cuatro nucleótidos de forma individual, así que esta función sirve para pasar las primeras cuatro pruebas.

Falla en la quinta prueba cuando el parámetro es una cadena de ADN de más de un nucleótido.

it('transcribes all dna nucleotides to their rna complements', function() {
  expect(dnaTranscriber.toRna('ACGTGGTCTTAA'))
    .toEqual('UGCACCAGAAUU');
});

Entonces el método para resolver este problema es crear una variable que contenga una cadena vacía e ir llenándola conforme se vaya transcribiendo el ADN en ARN.

  • primero creamos al principio nuestra variable rna,
  • luego hacemos un ciclo for que pase todos los nucleótidos por el switch,
  • por último cada nucleótido transcrito se agrega a la cadena.

Tengo algunos problemas porque no sé como sumar cada nucleótido a la cadena de RNA. ¿Debo hacer una función?
Vamos a intentarlo, envuelvo el switch en una función y después creo un ciclo for que agregue nucleótidos a la cadena de RNA,

for(var i = 0; i < strand.length; i++){
  rna += transcribe(strand[i]);
}

Como el algoritmo funciona, pasamos al último par de pruebas, que manejan caracteres no válidos de nucleótidos.

it('correctly handles completely invalid input', function () {
  expect(function () { dnaTranscriber.toRna('XXX') }).toThrow(
    new Error('Invalid input')
  );
});

Esto quiere decir que debemos lanzar un error cuando la entrada no corresponda a uno de los nucleótidos definidos.

Creo que lo que hay que hacer es agregar una cláusula default a nuestro switch que lance la excepción.
Este es el código con el que pasamos las 7 pruebas.

var DnaTranscriber = function(){};

DnaTranscriber.prototype.toRna = function(strand) {
  var rna = ''; 

  function transcribe(nucleotido) {
    switch(nucleotido) {
      case 'G':
        return 'C';
        break;
      case 'C':
        return 'G';
        break;
      case 'T':
        return 'A';
        break;
      case 'A':
        return 'U';
        break;
      default:
        throw new Error('Invalid input');
    };
  }

  for(var i = 0; i < strand.length; i++){
    rna += transcribe(strand[i]);
  }
  return rna;
};

module.exports = DnaTranscriber;

Sobre el autor: Auditor Líder ISO 9000 | Desarrollo Web Full Stack | JavaScript · Angular · VueJS · EmberJS | WordPress Advocator | Programador Django/Python | Lector | Generación X | Soy de Tlaxcala