Skip to content

Commit a1e29ca

Browse files
committed
Solución Reto 11
1 parent 7f91b27 commit a1e29ca

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed

retos/reto-11/README.md

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
# Reto 11
2+
3+
En el taller de Santa, los elfos aman los acertijos 🧠. Este año, han creado uno especial: un desafío para formar un palíndromo navideño.
4+
5+
**Un palíndromo es una palabra que se lee igual hacia adelante y hacia atrás.** Los elfos quieren saber si es posible formar un palíndromo haciendo, como mucho, un intercambio de letras.
6+
7+
Crea una función getIndexsForPalindrome que reciba una cadena de caracteres y devolverá:
8+
9+
- Si ya es un palíndromo, un array vacío.
10+
- Si no es posible, null.
11+
- Si se puede formar un palíndromo con un cambio, un array con las dos posiciones (índices) que se deben intercambiar para poder crearlo.
12+
13+
Por ejemplo:
14+
15+
```js
16+
getIndexsForPalindrome('anna') // []
17+
getIndexsForPalindrome('abab') // [0, 1]
18+
getIndexsForPalindrome('abac') // null
19+
getIndexsForPalindrome('aaaaaaaa') // []
20+
getIndexsForPalindrome('aaababa') // [1, 3]
21+
getIndexsForPalindrome('caababa') // null
22+
```
23+
24+
Si se puede formar el palíndromo con diferentes intercambios, **siempre se debe devolver el primero que se encuentre.**
25+
26+
# Solución
27+
28+
Recorreremos todos los `swaps` posibles, es decir, cada una de las posibilidades que tenemos para intercambiar dos posiciones, así que debemos generar primero los índices que vamos a intercambiar:
29+
30+
```js
31+
for (let a = 0; a < word.length; a++) {
32+
for (let b = 0; b < word.length; b++) {
33+
console.log([a, b]);
34+
}
35+
}
36+
```
37+
38+
Este código nos dará por cada letra de `word`, todas las otras letras de `word` con las que puede intercambiarse, si `word` es `"Hola"`, la `"H"` tendrá otro ciclo (el ciclo de b), donde estará en la primera iteración `"H"`, luego `"o"`, luego `"l"` y luego `"a"`.
39+
40+
Ahora realizaremos el intercambio, por comodidad trabajaremos `word` como un arreglo, cuidado con la variable `aux`, ya que sin esta no es posible el intercambio.
41+
42+
```js
43+
let swapped = [...word];
44+
let aux = word[a];
45+
swapped[a] = word[b];
46+
swapped[b] = aux;
47+
```
48+
49+
Ahora solo debemos comparar cada mitad de la palabra, esto es posible porque en los casos de tamaño impar, la letra del centro da igual. Así que cortaremos desde 0 hasta el `Math.floor(word.length/2)`, que redondeará hacia abajo, y luego desde `Math.ceil(word.length/2)` que redondeará hacia arriba.
50+
51+
```js
52+
let left = swapped.slice(0, Math.floor(word.length / 2)).join("");
53+
let right = swapped
54+
.slice(Math.ceil(word.length / 2))
55+
.reverse()
56+
.join("");
57+
```
58+
59+
Para revisar si es palíndromo uno de los strings debe de estar reversado. Si los dos índices son iguales, eso significa que la palabra es palíndroma y no necesita ningún cambio, entonces tendremos que usar otro condicional:
60+
61+
```js
62+
if (left == right) {
63+
if(a == b) {
64+
return []
65+
}
66+
return [a, b];
67+
}
68+
```
69+
70+
# Optimización
71+
72+
Muy similar a retos anteriores, se usa `for .. of` y arreglos con dos posiciones en lugar de condicionales, revisar retos anteriores donde está mejor explicada este tipo de optimización.

0 commit comments

Comments
 (0)