Skip to content

Commit 5182c69

Browse files
committed
✨ add challenge-12 solution
1 parent 61634cc commit 5182c69

File tree

3 files changed

+158
-0
lines changed

3 files changed

+158
-0
lines changed

2023/12-es-una-copia-valida/README.md

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
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+
```

2023/12-es-una-copia-valida/index.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
function checkIsValidCopy(original, copy) {
2+
let isValidCopy = true;
3+
const symbolSequence = '#+:. ';
4+
5+
let copyIndex = 0;
6+
7+
// eslint-disable-next-line no-restricted-syntax
8+
for (const letter of original) {
9+
const copyLetter = copy[copyIndex];
10+
const symbolIndex = symbolSequence.indexOf(letter);
11+
12+
const symbols = symbolIndex !== -1
13+
? symbolSequence.slice(symbolIndex)
14+
: symbolSequence;
15+
16+
const isValidLetter = `${letter}${letter.toLowerCase()}${symbols}`
17+
.includes(copyLetter);
18+
19+
const isLetterBlankSpace = letter === ' ';
20+
const isCopyLetterBlankSpace = copyLetter === ' ';
21+
22+
const isValidCharacter = isLetterBlankSpace
23+
? isCopyLetterBlankSpace
24+
: isValidLetter;
25+
26+
if (!isValidCharacter) {
27+
isValidCopy = false;
28+
break;
29+
}
30+
31+
copyIndex++;
32+
}
33+
34+
return isValidCopy;
35+
}
36+
37+
module.exports = checkIsValidCopy;
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
const checkIsValidCopy = require('./index');
2+
3+
describe('12 => Es una copia valida', () => {
4+
const testCases = [
5+
{
6+
input: ['Santa Claus is coming', 'sa#ta Cl#us i+ comin#'],
7+
output: true,
8+
},
9+
{
10+
input: ['s#nta Cla#s is coming', 'p#nt: cla#s #s c+min#'],
11+
output: false,
12+
},
13+
{
14+
input: ['Santa Claus', 's#+:. c:. s'],
15+
output: true,
16+
},
17+
{
18+
input: ['Santa Claus', 's#+:.#c:. s'],
19+
output: false,
20+
},
21+
{
22+
input: ['s+#:.#c:. s', 's#+:.#c:. s'],
23+
output: false,
24+
},
25+
];
26+
27+
it('should return a boolean type', () => {
28+
expect(typeof checkIsValidCopy(...testCases[0].input)).toBe('boolean');
29+
});
30+
31+
it.each(testCases)('should return $output', ({ input, output }) => {
32+
expect(checkIsValidCopy(...input)).toBe(output);
33+
});
34+
});

0 commit comments

Comments
 (0)