exercism / exercism/javascript-analyzer

Add analyzer for rna-transcription

Abierto
#53 0 comentarios 0 reacciones 0 asignados Ver en GitHub
Lenguaje dominante
TypeScript
Estrellas
16
Forks
21
Merge medio
6 h 53 min
PR fusionados (30 d)
2

Descripción

This issue is for discussion and assignment for the [`rna-transcription`][exercise] core exercise in the `javascript` track.

🔗 [implementation][exercise] | [mentor-notes][mentor-notes] | [problem-specification][problem-specification]

----

[mentor-notes]: https://github.com/exercism/website-copy/tree/master/tracks/javascript/exercises/rna-transcription/mentoring.md
[exercise]: https://github.com/exercism/javascript/tree/master/exercises/rna-transcription
[problem-specification]: https://github.com/exercism/problem-specifications/tree/master/exercises/rna-transcription

This exercise focuses on
- [`String`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String) iteration ([`String#replace`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace), [`String#split`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split))
- [`Object`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)/`Map`

## Optimal solution

```javascript
const TRANSCRIPTION = {
C: 'G',
G: 'C',
A: 'U',
T: 'A',
};

export function toRna(sequence) {
return sequence
.split('')
.map(nucleotide => TRANSCRIPTION[nucleotide])
.join('')
}
```

Variations include `Set` or `Map` with `#get`, which are valid!

### Variations (approvable without comment)

String destructuring can also be used:
```javascript
return [...sequence].map(/**/).join('')
```

[String#replace](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace) can also be used:
```javascript
return sequence.replace(/./g, (nucleotide) => /* */)
```

Variations include replacing only the "known" nucleotides:
```javascript
sequence.replace(/[CGAT]g/, (nucleotide) => /* */)
```

### Helper function variation

Instead of an anonymous function, a helper function may be used:

```javascript
function transcribe(nucleotide) {
return TRANSCRIPTION[nucleotide]
}
```

This also allows for a version without a _mapping_ object:

```javascript
function transcribe(nucleotide) {
switch(nucleotide) {
case 'C': { return 'G' }
case 'G': { return 'C' }
case 'A': { return 'U' }
case 'T': { return 'A' }
}
}
```

## SHOULD comment and disapprove

Cases we _SHOULD_ comment on with this analyzer:
- Use an [`Object`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) to keep track of the mapping instead of conditionals.
- Use iteration via [`String#split`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split) or [`String#replace`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace) instead of using `for`/`forEach` with [`Array#push`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push)
- Discourage [`Array#reduce`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce) for this particular solution, because it creates a lot of intermediary strings (more than the `split` approach), except if the rest of the solution is correct (then you can mention it but approve). Using `reduce` requires more interpretation by the reader to follow, change and maintain.
- Discourage [`String#substring`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substring) with foreach iteration, because character iteration via `split('')` is more idiomatic and maintainable than `substring` with 1. Using `split('')` requires less interpretation by the reader to follow, change and maintain.

## Approach

The suggested approach is to:
- detect which _type_ of solution it is (switch, map, or for/forEach)
- make sure the *optimal solution* is correctly handled. You can use the `batch` runner to generate output for all fixtures.
- go from there by adding paths to disapprove.

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.