|
| 1 | +# Reto 12: Es una copia valida |
| 2 | + |
| 3 | +## Problema |
| 4 | + |
| 5 | +En el Polo Norte **todavía usan fotocopiadoras de papel.** Los elfos las usan para copiar las cartas que los niños envían a Santa y así poder enviarlas a todos los departamentos de regalos. |
| 6 | + |
| 7 | +Sin embargo **ya son muy viejas y no funcionan muy bien.** Cada vez que hacen una copia, la calidad de la copia disminuye ligeramente, un fenómeno conocido como pérdida generacional. |
| 8 | + |
| 9 | +**Necesitas detectar si una carta es una copia de otra.** Las cartas son muy largas y no puedes leerlas, pero puedes compararlas con un algoritmo. |
| 10 | + |
| 11 | +Existe una gran **probabilidad** de que un caracter se degrade en cada copia (¡no pasa siempre!). Y al ocurrir, la regla que sigue es: |
| 12 | + |
| 13 | +- Los caracteres de la A a la Z se degradan de mayúsculas a minúsculas (A-Z ⇒ a-z) |
| 14 | +- Las letras se degradan en una serie de caracteres en este orden: a-z ⇒ # ⇒ + ⇒ : ⇒ . ⇒ |
| 15 | +- Una vez degradadas las letras en los símbolos, se pueden continuar degradando. |
| 16 | +- Ten en cuenta que el último es un espacio en blanco, no un caracter vacío. |
| 17 | +- Los caracteres que no son letras (como los dígitos) no se degradan. |
| 18 | + |
| 19 | +Sabiendo esto y recibiendo dos cartas. La supuesta original y la copia. Debes determinar si la copia es una copia de la otra. |
| 20 | + |
| 21 | +```js |
| 22 | +checkIsValidCopy( |
| 23 | + 'Santa Claus is coming', |
| 24 | + 'sa#ta Cl#us i+ comin#' |
| 25 | +) // true |
| 26 | +checkIsValidCopy( |
| 27 | + 's#nta Cla#s is coming', |
| 28 | + 'p#nt: cla#s #s c+min#' |
| 29 | +) // false (por la p inicial) |
| 30 | +checkIsValidCopy('Santa Claus', 's#+:. c:. s') // true |
| 31 | +checkIsValidCopy('Santa Claus', 's#+:.#c:. s') // false (hay un # donde no debería) |
| 32 | +``` |
| 33 | + |
| 34 | +Para entender cómo funcionan las fotocopiadoras y su degradación, mira este ejemplo: |
| 35 | + |
| 36 | +```txt |
| 37 | +original: 'Santa Claus' |
| 38 | +1ª copia: 'santa cla#s' |
| 39 | +2ª copia: 'sa#t# cl#+s' |
| 40 | +3ª copia: 'sa+## c#+:s' |
| 41 | +4ª copia: 's#++. c+:.s' |
| 42 | +5ª copia: 's#+:. c:. s' |
| 43 | +``` |
| 44 | + |
| 45 | +Por lo tanto s#+:. c+:++ es una copia válida de Santa Claus. Y, como ves, la degradación de las letras no se produce en un orden específico, es aleatorio. |
| 46 | + |
| 47 | +Basado en el desafío de CodeWars Photocopy decay |
| 48 | + |
| 49 | +## Mi solución |
| 50 | + |
| 51 | +```js |
| 52 | +function checkIsValidCopy(original, copy) { |
| 53 | + let isValidCopy = true; |
| 54 | + const symbolSequence = '#+:. '; |
| 55 | + |
| 56 | + let copyIndex = 0; |
| 57 | + |
| 58 | + // eslint-disable-next-line no-restricted-syntax |
| 59 | + for (const letter of original) { |
| 60 | + const copyLetter = copy[copyIndex]; |
| 61 | + const symbolIndex = symbolSequence.indexOf(letter); |
| 62 | + |
| 63 | + const symbols = symbolIndex !== -1 |
| 64 | + ? symbolSequence.slice(symbolIndex) |
| 65 | + : symbolSequence; |
| 66 | + |
| 67 | + const isValidLetter = `${letter}${letter.toLowerCase()}${symbols}` |
| 68 | + .includes(copyLetter); |
| 69 | + |
| 70 | + const isLetterBlankSpace = letter === ' '; |
| 71 | + const isCopyLetterBlankSpace = copyLetter === ' '; |
| 72 | + |
| 73 | + const isValidCharacter = isLetterBlankSpace |
| 74 | + ? isCopyLetterBlankSpace |
| 75 | + : isValidLetter; |
| 76 | + |
| 77 | + if (!isValidCharacter) { |
| 78 | + isValidCopy = false; |
| 79 | + break; |
| 80 | + } |
| 81 | + |
| 82 | + copyIndex++; |
| 83 | + } |
| 84 | + |
| 85 | + return isValidCopy; |
| 86 | +} |
| 87 | +``` |
0 commit comments