This graph shows how many times the word ______ has been mentioned throughout the history of the program.
Hola, muy buenas, que ya estamos aquí otra vez de vuelta en vivo y en directo y vamos a hacer el reto de programación que os he dicho, que os he prometido, porque este mes estamos haciendo el Advent.js, el calendario de retos de programación del 1 al 25 de diciembre y tenemos aquí una persona súper experta, súper crack, que sé que es profesor en Lemon Code, en el máster de Full Stack Book Camp, es que ya no sé ni cómo llamarle, porque hacéis tantas cosas.
He visto que hacéis UX, frontend, accesibilidad, que me parece espectacular, que además cada profesor dé exactamente cada uno de los contenidos y eso está genial, Braulio. Oye, que te doy la bienvenida. Buenas tardes, Braulio.
Muy buenas. ¿Qué tal? ¿Cómo estamos?
Nada, súper bien. Justo le estaba comentando a la gente que íbamos a hacer esto, ¿no? Pues un reto de programación, que lo ibas a estar explicando, que además es una cosa, muchas veces la gente me pide de, pero molaría que hicieras los retos y que los explicaseis.
Bueno, pues aquí vamos a tener el bueno de Braulio, que los va a hacer, ¿vale? Pero antes, antes de empezar, voy a enseñaros un poquito de dónde viene Braulio, porque aquí la gente me va a decir, bueno, pero esto, ¿de dónde ha venido la cosa?
A ver, vamos a ver. Braulio viene de Lemon Code, ¿vale? Que ya sabéis que es un centro de formación donde tenéis bootcamps, masters y en este caso tienen la edición número 16 del master frontend de Lemon Code.
No sé si nos queréis explicar un poquito más, Braulio, del master.
Bueno, pues la verdad me pillo así un poco en frío. No soy un buen vendedor, soy desarrollador, pero bueno, comentar de este master que ya son 16 ediciones, ya un montón. Partió todo de primeras de la Universidad de Málaga.
Monde el Germen fue el master Riatec, lo montamos con la Universidad de Málaga, estuvimos cinco años con ellos y después dijimos, oye, ¿por qué no montamos nosotros uno de especializado en front?
Y pillamos un cartel de profesores espectacular, son súper majos y nos ponemos las pilas. Empezamos con la primera edición, con JQuery y con AngularJS y fíjate ya por dónde vamos, ¿no? Ya por Soli, Terbelte, todo lo que se pille.
Eso está genial, tengo que decir, porque normalmente una cosa que a mí particularmente me da mal sabor de boca es un profesor que te lo da todo, que te da UX, accesibilidad, ¿qué tal?
Y dices, ostras, es que lo que sería genial es que un experto de cada materia te diese justamente esa materia, ¿no? O sea, Carmen, pues te va a dar diseño web.
Y qué mejor que Carmen. Accesibilidad, Juan José Montiel, que es un crack que trabaja en Microsoft especializado en accesibilidad web, escritorio y muchas cosas más, ¿no?
Y eso es lo que justamente marca la diferencia.
Sí, sí, sí, sí, sí. Son profesos súper majos y, oye, potente el tema y aparte una cosa muy chula que tiene, la mentorización.
Porque, por ejemplo, tú haces un material estupendo, pero si alguien se queda trancado, pues igual le hace falta algo de ayuda y, oye, pues aquí estamos nosotros para,
echar una manita, oye, nos conectamos a la videoconferencia, por Slack, resolvemos dudas y tiramos para adelante.
Pues que sepáis que si queréis más información de Lemon Code, aparte de que podéis ir a Lemon Code y ver todos los másters y bookcams y cursos que tienen, que tienen un montón,
porque tienen, no solo de JavaScript, también tienen temas de DevOps, Backend, o sea que le podéis echar un vistazo, que hay un montón.
Ahora sé que va a empezar lo próximo, va a ser el máster de Frontend de Lemon Code. ¿Cuándo empieza?
En abril, a finales de abril y tenemos ofertita de Iliber en diciembre, si lo apuntáis, y aparte un descuento adicional si venís de parte de Mediudep.
Vale, a ver, ¿cómo es el descuento? ¿Te lo sabes?
Sí, es un 10% de descuento a la oferta que tenga en ese momento. O sea, si nos decís, oye, mira, os interesáis, vengo de Mediudep y Apple JS y me quiere matricular al máster,
ahora mismo el máster hasta el 31 de diciembre tiene un precio de 2.190 euros y sería aplicarle un 10% de descuento adicional a ese precio.
Vale, pues ahí lo tenéis. Descuento de 10% a la oferta si dices que vienes de Mediudep.
O sea, locurón. Le decís, oye, que yo vengo de parte de Mediudep y un 10% de descuento.
Mediud.link barra Lemon Code, ¿vale? Luego os va saliendo por el chat porque está justamente que vaya pasando ahí cada 15 minutos, me parece,
o cada 10 minutos, entonces vais saliendo. Pero si no, yo iré añadiendo este pequeño aviso aquí abajo para que no os lo perdáis, ¿ok?
Entonces, al bueno de Braulio, aparte, porque, ¡ay! Spoiler, spoiler.
Claro, no solo tenemos aquí para que nos hable de Lemon Code y no sé qué, claro, vamos a ver.
Braulio que nos tiene que demostrar su nivel, su nivelazo.
Y es que Braulio, pues, lo hemos invitado también para que haga uno de los retos de programación de las 20s,
que tenemos un montón disponibles. Estos están cerrados, vosotros no los veréis, solo los veo yo,
porque soy usuario VIP y también creo que Braulio los puede ver.
Pero sí que tenéis disponible el número 12, que es el que tenemos hoy.
Y entonces, lo que vamos a hacer es que Braulio se va a enfrentar al reto número 12,
va a intentar solucionarlo y lo va a ir explicando sobre la marcha, ¿vale?
Entonces, no sé si te atreves, Braulio.
Sí, sí, vamos a divertirnos un ratito.
Venga, pues, voy a dejar de compartir yo la pantalla, pues, si la quieres compartir tú.
Y ahora sí, vamos a enfrentarnos al reto de programación de hoy.
Vale.
Voy a intentar compartir la pantalla, a ver si Chrome Tab no, pantalla completa, esta de aquí, compartir.
Que siempre esta herramienta te lía las primeras veces que la usa.
¿Veis mi pantalla?
Sí, ya vemos tu pantalla.
Vale, buenísimo.
Mira, de hecho, en el reto de hoy, que como podéis ver, tenéis el banner justo debajo de la solución de Lemon Code.
O sea, que si por lo que sea, os olvidáis del enlace o lo que sea, veis justo debajo de Enviar Solución,
ahí tenéis información de Lemon Code, le dais un clic y ahí entráis directamente en la página de Lemon Code.
Perfecto, perfecto.
Pues, nada, yo voy a simular que estoy haciendo ejercicio y me voy a poner del lado de los que están empezando.
Porque seguro que muchas cosas que vaya a ver, vais a decir, vaya, esto lo habría aplicado así, esto lo habría aplicado así, este no tal.
Oye, hay que hacer las cosas que se entiendan y, por ejemplo, el tema de optimizaciones y como decimos nosotros en esta profesión,
fumársela en pipa, con mucho cuidado.
Vamos paso a paso y cuando haga falta, pues, oye, me hace falta optimizar algo.
Por ahí me pongo a muerte y ese código no lo va a entender ni Dios y va a ir como una moto.
Pero la primera, yo soy muy amigo de hacer las cosas que se puedan leer, ¿no?
Una cosilla, yo soy amigo de siempre sacar funciones, sacar variables fuera, si voy a utilizar una red con índices tal,
oye, lo saco una variable porque yo empiezo a ver un if, un montón de corchetes y cosas y ya me empiezo a marear, no doy una, ¿no?
Y después, a la hora de nombrar variables y funciones, una cosa que yo hago es, en consultoría y open source, todo en inglés.
Pero cuando hay formación, ya que hay mucha polémica, a mí me gusta ponerlo en español.
¿Por qué? Porque, oye, yo estoy empezando, yo veo un texto y digo, ¿esto es del lenguaje, es de la librería o es código mío?
Pues, mira, aquí lo tienen en español y ya está.
Ya hay mucha polémica.
La vez que hay soltado eso, me ha empezado a caer hostias por un lado y por otro lado me han dicho que bien.
Entonces, tú, Miguel, ¿eso cómo lo ves?
Yo, sinceramente, para ejercicios lo veo bien, hacerlo en español. Para un código que fuese rollo a un proyecto de verdad, sí que lo evitaría.
Pero en tema didáctico y formativo sí que me parece normal. No pasa nada.
Totalmente de acuerdo. Vale, pues, venga, vamos a arrancarnos.
Lo primero, yo le...
¿Puedes dar un poquito de zoom, por favor, a la...
Claro que sí.
Un nivel más.
¿Se ve bien así?
A ver, uno más, si puede ser.
Venga, chan, chan, chan.
Vale, yo creo que ahora bien. Lo que pasa es que a lo mejor se corta y luego no...
Lo pongo por aquí.
Ah, mira, mira.
Qué bueno estás ahí, Mar, ¿eh?
Vale.
Pues, a ver, yo lo primero. Cuando leí denunciado, no sé si lo habéis leído vosotros, una cosa que me quedé acojonado es decir esto de la serie de caracteres.
Y yo pensé, hostia, verás tú que tiene que venir un carácter, después el otro, después saltar.
Y yo digo, madre mía, madre mía. En el momento, ¿no? Que vi tu foto, ¿no? Con dos cuernos de demonio y diciendo, este tío es un malvado, ¿no?
Hubiera sido más difícil, ¿eh? Ya te digo yo.
Es curioso como un ejercicio plus, ¿eh? Lo que pasa es que, bueno, menos mal que no, que más abajo se dice que no, que es algo random y ya está.
Entonces, bueno, pues, ahí está. Yo es que tengo la cosita del perro viejo amargado.
Siempre que veo un ejercicio, digo, ¿y esto? ¿y lo otro? Y luego te voy sacando aristas por todos los sitios y al final, pues, ya la hemos liado.
Vale. Pues, siguiente paso.
Vale. Antes de empezar, porque hay gente que a lo mejor no lo sabe.
Sí, claro, a lo mejor hay gente que no ha visto el reto o que le falta y tal.
Si quieres, ponla arriba y yo lo leo rápidamente.
A ver, en el Polo Norte todavía usan fotocopiadoras de papel. Parece raro, pero ocurre.
Los elfos las usan para copiar las cartas que los niños envían a Santa y así pueden enviarlas a todos los departamentos de regalos.
Sin embargo, las fotocopiadoras ya son muy viejas porque es que son viejas y no funcionan muy bien.
Y cada vez que hacen una copia de una de estas cartas, la calidad de la copia disminuye ligeramente y a este fenómeno se le conoce como pérdida generacional, ¿vale?
Ahora, necesitamos detectar si una carta es una copia de otra.
¿Qué pasa? Que las cartas son muy largas y no las vamos a leer para ver si son copias o no.
Tenemos que hacerlo con un algoritmo.
¿Cómo funciona esto de las copias que se va degenerando?
Pues que existe una gran probabilidad de que un carácter de esta cadena de texto, cada vez que se hace una copia, se degrada.
Es algo que no pasa siempre.
O sea, no siempre tiene por qué degradarse cada uno de los caracteres de esta cadena de texto.
Pero si ocurre, la regla es que los caracteres de la A a la Z, que son en mayúsculas, se degradarían a minúsculas, ¿vale?
Luego, las letras se degradan una serie de carácteres en este orden.
Cuando están en minúsculas, luego podrían pasar a ser el hash, la almohadilla o como le queráis llamar.
Después, una vez que es la almohadilla, si se degrada, pasaría al símbolo de más.
Después al dos puntos.
Después al punto y después a un espacio en blanco.
Que, ojo, cuidado, que no se ve muy bien.
El espacio en blanco también es verdad.
Aunque le he puesto el espacio en blanco, pero que no se ve muy bien.
Y luego lo digo, ¿eh?
Porque pone ahí, ten en cuenta que el último es un espacio en blanco, no un carácter vacío.
Es que no se ve, no se podía hacer nada.
Los caracteres que no son letras, por ejemplo, los números o otros símbolos, como los dígitos y tal, no se degradan.
Con esto, luego, abajo tenemos unos pequeños ejemplos de chequear el original y la copia.
Y ahí deberíamos de dar true o false en el caso de que teniendo en cuenta estas reglas de posible degradación de la copia respecto al original,
si es verdad que la copia que le pasamos sí que es una posible copia del original.
La damos true si es posible, false si no es posible.
En el primer ejemplo, pues hemos visto que sí que es true, porque sí que encaja, que podría ser un degradado normal.
Pero la segunda es false, porque si os fijáis, el primer carácter es una P y no tendría sentido respecto al original.
Es una degradación que sea realista.
Lo mismo en el tercer caso, que sí que es una degradación que tiene sentido, pero la última no.
Porque donde tendríamos el espacio entre Santa y Klaus, resulta que se ha metido un hash o una almohadilla.
Y eso no tendría sentido.
Entonces, tenemos que detectar un patrón que nos diga si la copia es una degradación natural.
Y ahora, para entender cómo funcionan las fotocopiadoras y la degradación esta,
al final tenemos un ejemplo donde partimos del original, ¿no?
Y vais viendo en cada copia, en cada copia, cómo va degradando.
Pero ya veis que hay algunas letras que no se degradan o que se degradan un poco más tarde,
porque ya hemos dicho que tienen probabilidad, no que siempre se tengan que degradar sí o sí, ¿vale?
Así que ahí tenéis toda la información.
Perdona, Braulio, que te he cortado, pero ya puedes darle cañita.
Nada, nada, genial. Muchas gracias. Menos mal que lo has leído.
He hecho la del informático. ¡Ah, pica!
Bueno, pues vamos al lío.
Lo primero, ¿a qué aprendemos de este enunciado?
No dice nada de que se pierdan o se añadan caracteres.
Es decir, primera cosa muy interesante, es decir, fuera.
Si no tiene misma longitud, tracatrán.
Segundo, los caracteres, ¿cómo se degradan?
Pues si estoy en mayúsculas, me voy a minúsculas y si no pueden aparecer los caracteres son raros.
La arroba, la almohadilla, la boñequita, esas cositas.
Y eso solo explica las letras.
Los números se ve que la fotocopiadora tiene los números nuevos y los caracteres raros.
Y eso es, o sale bien o no es copia.
Vale, pues vámonos al lío.
Lo primero que vamos a hacer en este, yo he elegido TypeScript para trabajar con esto.
A ver si voy a intentar hacer más espacio.
Quitamos el enunciado y me vengo aquí.
Lo primero que vamos a hacer es comprobar aquí si la longitud coincide.
Entonces, oye, si la longitud original no es igual o igual a la copia,
a la longitud de la copia, a ver si soy capaz de escribir bien.
Ya estoy demasiado acostumbrado a Copilot y me lo chivo a todos.
Y ahora te ves con los dedos por rugos.
Y aquí vamos a hacer return false.
Vale, entonces lo primero es lo primero.
Oye, si no coincide la longitud, no es copia válida.
Una cosa interesante.
Aquí en los shift, cuando es una sola línea, suelo poner siempre las llaves.
Esto ya no pasa.
O sea, antes con pre-tier ya no es tan normal.
Pero antes, cuando no tenías pre-tier, era muy fácil poner una línea,
equivocarte en la tabulación y liar la parda.
Yo no sé, tú, Miguel, ¿eso cómo lo ves?
Tú lo haces así, ¿no?
Yo si lo pongo en una sola línea, o sea, si lo pongo el if y justo después el return en la misma línea,
entonces no utilizo las llaves.
Pero siempre que hago salto de línea, sí que pongo llaves siempre, siempre.
Aunque sea una línea.
Me parece hasta mala práctica si no lo pones porque es muy fácil liar la parda.
Sí, eso es.
Yo ya voy con esa regla.
No la quiero liar parda, soy un torpe y me voy a equivocar seguro tecleando.
Lo que pueda meter de seguro, pues, para adelante.
Vale, pues, siguiente paso.
Vamos a recorrer ahora el array original, carácter a carácter.
Pues, mira, yo aquí he elegido utilizar un bucle.
Y tiramos millas.
Seguro que hay otra forma de hacerlo, pero está sencillita, la entendemos todo el mundo.
Y la típica condición de que la longitud sea menor que esto y más, más.
Una curiosidad con esto de la I, los que estén empezando.
Seguramente habréis visto un mogollón de ejemplos que pone for I, for J, for K.
Y diréis, oye, ¿de dónde viene esto?
No sé si Miguel ya lo habrá contado alguna vez y yo soy un pesado.
Pero hasta donde yo sé, me lo contó el amigo Bruno Capuano.
Viene de la notación de matemáticas y de Fortran, que reservaba ese nombre de variables para los bucles.
Creo que van por ahí los tiros, ¿no, Miguel?
Sí, no me sé si la hiciste entera, pero sí que sé que viene de ahí.
Y ahí estamos y de entonces para ahí lo le damos.
Y desde entonces se ha quedado.
Sí, sí.
Había gente que decía que era de I de índice.
Pero, claro, tiene sentido hablar de I de índice, ¿no?
Pero parece ser que a lo mejor era eso por lo que originalmente se hizo en aquel entonces.
Sí, sí, pero es divertida.
Ahí estamos.
Saluda a la gente de Fortran, si hay alguno por aquí y ya está.
Vale, estupendo.
Pues, bueno, siguiente paso.
Voy a leer el carácter original en concreto que estoy procesando.
A mí no me gusta liarme a poner corchetes por todos los sitios.
Empiezo a meterlo en los if, me cuesta leerlo, por ejemplo.
If original de I más o el otro de lo otro.
Entonces, lo que voy a hacer es sacarle una variable.
Y ahora aquí, algunos de los que estáis van a sangrar los ojos porque ya pone un nombre de español.
Carácter original actual es igual a original de I.
Aquí lo tenemos.
Aquí tenemos el carácter original actual.
Ahora, ¿qué podría hacer?
Podría empezar aquí dentro a meter un montón de if y casuística para controlar cada caso.
¿Qué pasa?
Con eso consigues lo que se llama el PHP Hadouken.
No sé si lo...
¿Tú lo has visto ese meme de aquí?
Sí, o el calvo, el calvac, ¿no?
También, sí, sí, era.
A mí me encanta este.
O lo que dice la gente más fina, que dice complejidad ciclomática y términos de esos, ¿no?
El tema es, si empezamos a poner aquí cosas, se va a complicar y nos va a costar leer el código.
¿Qué podemos hacer?
Empezar a meter aquí cosas y empezar a refactorizar en funciones lo que haga falta.
Y la cosa va a quedar bien.
Pero, ¿sabes qué?
Que un pajarito me dijo, oye, ¿y por qué no te hace una función que te diga las combinaciones de degradar?
Y así vaciar el for.
Que es lo que yo digo, vaciar el cangrejo.
Vamos a vaciar el cangrejo y vamos a dejar el cangrejo vacío.
Y anda, hostia, pues hay gente lista en este mundo.
Yo soy más torpe.
Entonces, pues vamos a ello.
Vamos a crearnos una función.
La sandbox esta tiene una restricción y es que no puedes sacar funciones fuera.
Yo lo normal es haber sacado la función fuera.
Incluso si es reusable, la saca a un fichero, le metes prueba bonitaria, todas esas cositas.
Y vamos a llamarla dame opciones de degradación.
Hay que reconocer que esto en inglés hubiese quedado mucho más chulo.
Ok, mi opción de degradación, opción, oh, de degradación, cómo suena, tal.
Pues aquí tenemos ese dos puntos string y tenemos esta función aquí vacía.
Ok, y ahora qué vamos a hacer.
Vamos a pensar en los casos que podemos tener.
Yo cuando no tengo ni idea de qué voy a picar, yo me pongo aquí y digo, oye, un comentario.
Caso uno, si quiero después, si está claro en el código, lo quito o lo dejo como sea.
Pues los comentarios que tiene cuidado, se ayudan y otras veces mienten porque tú estás tirando un comentario, se queda desfasado y dices, esto pinta la caja roja, la caja roja.
Ah, ahora pinto verde, bueno.
Bueno, pues anda, caso uno, si es mayúsculas, la combinación de degradación.
Es decir, si yo si la tengo mayúsculas, ¿qué me tengo que dar?
Oye, pues mayúsculas de ese carácter es correcto.
Minúsculas de ese carácter es correcto.
Y símbolos, los símbolos de esos que hemos visto antes, la almohadilla, el punto, el más, esas cositas, también es correcto para eso.
Caso dos.
Oye, si es minúsculas, pues ¿qué tengo aquí?
Pues entonces la combinación es minúsculas, o sea, ese carácter es minúsculas y los símbolos raros.
Y ahora el caso tres.
Si no es mayúscula ni minúscula, no es una letra.
Si no es una letra, hemos dicho, ah, la fotocopiadora aquí no tiene garantía, ¿no?
Pues caso tres, si no es una letra, entonces la combinación válida es simplemente el mismo carácter.
Ahora es cuando le da el tabulador y Copilot te da todo y ya está, ¿no?
Y ya se acabó el curso, ¿no?
Bueno, pues lo dicho, en un proyecto real, ¿qué haríamos?
Esto es un candidato súper chulo para aplicar TDD y decir, venga, vamos a hacer una prueba, un casito, una prueba, un casito.
Que no siempre aplica.
Aquí cuando encuentro a uno a mí me sale el lagrimón.
Y digo, qué chulo, aquí puedo aplicar TDD, soy un tío profesional.
Pues eso.
Entonces, bueno, ¿ahora qué pasa?
Que si yo empiezo a implementar esto, lo mismo, voy a mancharlo de un montón de cosas que no tienen que ver con darme las opciones.
De, pásame mayúsculas, pásame minúsculas, me esto, pues, ¿qué voy a hacer?
Sacar cosas fuera.
Lo mismo, lo que voy a hacer es sacarme unas cuantas variables o constantes de ayuda y unas cuantas funciones de ayuda,
las saco fuera y así, si a futuro quiero hacerlo mejor, es mucho más fácil porque esa funcióncita solo la puedo optimizar.
Pues nada, vengo aquí y digo, venga, pues, tengo los símbolos.
Los símbolos no me los sé de memoria, así que los voy a copiar y pegar, incluido el espacio en blanco de la muerte.
Aquí va, plan.
Vale, ¿ahora qué voy a hacer?
Me voy a sacar las letras mayúsculas.
Que aquí lo mismo, un pajarito me dijo, criatura, utiliza una expresión regular.
Y digo, bueno, yo aquí lo pongo en modo antiguo, como cuando buscas validar DNI, y te sale el código Javascript.
Pues aquí lo que voy a hacer es poner todas las mayúsculas que hay.
Y esto de aquí, estas mayúsculas, esto tiene truco.
Ahora aquí vienen los casitos, aristas.
Esto es lo típico que lo saca, estás contento.
Y cuando va a Proyecto Real, alguien tiene un nombre con ñ, moño, por poner, por no decir otra cosa.
Entonces, pues, pues, la hemos liado.
Ñ, tilde, tal, aquí, Miguel, se podía haber hecho un soy un cabroncete y haber puesto las pruebas bonitarias con esos casos y no lo saca ni Dios.
Vale, más cosas.
Como por suerte esto no lo he tenido en cuenta y he obviado las ñ y cosas raras, para que no me odie a nadie.
Sí, sí, sí, eso es como cuando escapa la URL, ¿verdad?
O sea, que se te voy a escapar, no pasa nada hasta que llega un tío con un nombre con un arroba y hace todo, ¡fla! ¡Toma!
A reventar.
Eso es.
Bueno, pues, ahora lo siguiente.
Ya tengo las letras, pues, vamos a hacernos ahora una función que se llame es mayúscula.
A ver, ¿me escucháis por ahí o se ha perdido?
Ah, sí, me escucháis.
Perdón, perdón, perdón.
Sí, sí, te he escuchado.
Perfecto.
Vale, pues, hacemos una función que se llama es mayúscula.
¿Y aquí qué voy a tener?
Aquí voy a tener, recibo un string y hago lo siguiente.
Miro si en mayúsculas, es decir, el string este que he puesto contiene con includes esa letra.
Ya con eso de, uy, mira, menos mal que estaba ahí.
Se ha colado ahí un buen higo raro.
Vale, pues, bueno, aquí en mayúscula, ¿qué hago?
Pues, compruebo si una letra está en mayúscula o no.
Se podría haber hecho otra manera más elegante, menos elegante, pero esta de momento funciona.
Después puedo volver y refactorizarla si quisiera.
Y otra cosa que voy a hacer, es hacer una función que voy a llamar pasa a minúscula.
A ver si lo escribo bien.
Vale, y aquí simplemente esta es un poquito overkill, ¿no?
De lo que se dice, que un poco no haría tanta falta, pero bueno, lo leemos bien y si queremos después la quitamos.
Y aquí en pasa a minúscula lo que voy a hacer es un return de ese punto to lowercase.
Ya está, lo pasamos a minúscula, así fuera.
Aquí lo típico, si eres más chispa, puedes quitar las llaves, puedes quitar el return, dejarlo todo súper fino.
Aunque después el día que vaya a depurar, dices tú, ay, joder, para poner breakpoint que tengo que irme aquí a un ladito o tal.
Pero yo siempre me acuerdo, ¿eh?
Yo siempre que utilizo el código me quedo de pancho y cuando voy a depurar digo, ay, ay, ay.
Se está olvidado.
Sí.
Vale, pues ya tenemos el pasa a minúscula aquí y ahora vamos a por el caso 1.
Si es mayúsculas, devuelvo mayúsculas, minúsculas y símbolos.
¿Qué voy a hacer aquí?
Bueno, venga, en este if.
If es mayúscula de S.
Voy a decir que devuelvo.
Tengo el teclado un poco cascaete.
La cadena más pasa como en minúscula, paso a minúscula, la cadena, ese string en concreto, ese carácter.
Y los símbolos.
Es decir, la combinación válida para comparar es o esa letrita o la letra en minúscula o el listado de símbolos,
el almohadilla, el más, los puntos y el punto y el espacio en blanco.
Ya hemos cubierto el primer paso.
Y sería propio para decir, en cada pruebecita la hemos hecho, va, esto funciona bien.
Siguiente.
Vamos ahora al caso 2, que es minúsculas.
¿Qué vamos a hacer?
Por lo mismo que hicimos aquí, un const con mayúsculas, vamos a hacernos un const con las minúsculas que hay.
Me vengo para acá.
Lo suelto aquí.
Aquí están las minúsculas.
Y ahora me voy a hacer una funcióncita de ayuda que se va a llamar const es minúscula es igual a ese dos puntos de string.
Y pregunto, oye, del listado de minúsculas que tengo, de la a a la z en minúsculas, dime si está el carácter en concreto que estoy pasando.
Uy, falta una de ese aquí.
Qué bien que te avisa, ¿eh?
De todo ahí.
Sí, sí.
Pues yo ya sin taif.
Hace poco, yo siempre caigo cada X año, me dicen, Javascript ahora está la leche, ahora hay no sé qué, JS2, tal.
Y entro en un proyecto y digo, adiós.
Y salgo por la puerta.
Ya ves, cuando estamos mal acostumbrados ya es difícil ir hacia atrás.
Sí, es productividad al final.
Al final yo lo que quiero es o picar más código o irme antes a casa.
Entonces, ir hacia atrás.
Literal.
Vale, perfecto.
Pues bueno, ya tenemos el minúscula aquí y ahora nos vamos al caso 2.
Y el caso 2, ¿qué hacemos?
Pues si es minúscula, ¿qué tengo que devolver aquí?
Pues if es minúscula, hacemos un return y vamos a devolver, perdón, es mayúscula, soy un crack escribiendo.
Estoy diciendo una cosa y picando otra.
Minúscula, vale, de ese.
Ahí está.
Bueno, aquí devolvemos entonces o la letrita que hay en minúscula o una cosa válida son los símbolos.
Ya está, ya tenemos aquí el caso 2 cubierto.
Siguiente, el caso más fácil.
Si no es mayúscula ni en minúscula o es la letra en concreto, la letra no, o es el carácter, pues ya no es una letra, un número o lo que sea o no vale nada.
Aquí lo que hacemos es un return de ese.
Y ya lo tenemos aquí puesto.
¿Qué tal? ¿Se entiende lo que estoy haciendo?
Sí, pero faltaría un caso, ¿no?
Dime.
Ah, vale, vale. No, entonces no quiero spoiler.
Ah, amigo, vamos a ver si pasan los test o no porque a lo mejor pueden faltar casos de test porque esto puede ser que pasen los test.
Es decir, oye, tú tienes carácteres raros, tienes letras, tienes tal.
Claro.
O sea que, claro, puede ser que a lo mejor faltan casos de test por lo que coméntate.
Vale, vale, me parece interesante eso.
Si ahora lo picas.
Lo he liado yo.
Si ahora lo vas picando en background me deja de ridículo que te cagas, ¿eh?
No, no, no, no.
Ahora.
Toma, toma.
Y la Angie, la Tidle, ya no te enteras.
Vale, bien, bien, estupendo.
Pero, pues, ahí se me ha podido pasar algo.
Vamos a verlo.
Mira, dice, ahora entiendo todo, creo que puedo codear.
Pero es que a veces, muchas veces, para que veáis un poco, está muy bien cómo lo ha hecho Braulio porque al final lo que ha hecho es explicar paso a paso cómo lo ha ido pensando.
Porque muchas veces cuando vemos este tipo de retos, lo que veo mucho es que la gente se agobia con todo.
¿Sabes?
Se empieza a agobiarse de, es que no soy capaz de por dónde empezar.
Y fijaos con lo que ha empezado, con lo más sencillo de pensar, bueno, pero si el original y la copia tienen que tener la misma longitud.
Solo con ese detalle, seguro que ya empezáis a tener un montón de decir, ostras, me he quitado un montón de casos.
Y ahora lo de las mayúsculas.
Lo importante, como siempre, es separarlo caso por caso y irlos adaptando.
Que luego mejoraréis el código.
Pero en este caso, pues, tiene todo sentido el mundo.
Eso, y para eso las pruebas unitarias ayudan mucho.
Sobre todo en este código que es de negocio.
O sea, que no es en un componente tal.
A ver si dices tú, una prueba unitaria aquí la voy a liar parda.
Pero en este código que es puro negocio, tú haces tus pruebecitas, te vas animando y te da menos miedo refactorizar el código.
No me ha pasado veces sin prueba unitaria hacer un troncho de código.
Voy a mejorarlo, no funciona.
Discard, discard.
Ala, ahí se queda el código.
Tal cual.
Pues eso.
Y también otra cosa que yo suelo hacer cuando pico es poner un montón de to-do's.
Es decir, yo pico algo, esto no me convence.
En vez de centrarme en eso y perder el foco, pongo, to-do, oye, esto después hay que refactorizarlo.
O mirar este caso que no se me olvide.
Y así cuando tengo mi código, hago la pull-recual, lo miro, reviso, miro todos los to-do's y voy poquito a poquito mejorando cosas.
Sobre todo quitar el, a ver, yo llevo, yo qué sé, tío, 30 años programando y 25 como profesional.
Y yo siempre que me voy a poner delante de un ejercicio de esto me echo a temblar.
Y digo, madre mía, acaba de entrar mi perrita.
Espérate, la voy a asomar por aquí.
A ver si la veis.
¡Ojo!
¡Ojo!
¡Ojo!
¡Ojo, perrita!
¡Pel programming, eh!
¡Pel programming!
Esto es lo que me chiva las cosas.
Por eso ha entrado.
Si ahora viene la parte difícil, voy a deciros las cosas.
Perro programming.
Perro programming, nunca mejor dicho.
Vale, pues, entonces, dejo de enrollarme que empiezo a hablar, tino, paro, soy una abuela cebolleta.
Bueno, pues lo que hemos dicho.
Ya tenemos la opción de degradación.
Entonces está muy chulo.
Ya sé cómo, de un carácter de partida, sé si es válido o no.
Entonces, el siguiente paso es venirme aquí al bucle for y empezar.
Tengo el carácter original actual.
Ahora, ¿qué voy a hacer?
Voy a pedir, como tengo mi función tan chula de darme opciones de degradación, voy a pedir las combinaciones con fallos válidos.
Pues me vengo aquí y digo, oye, pues tengo aquí una variable que voy a llamar combinaciones con fallos válidos.
Que es también muy divertido, cómo nombrar variable, ¿verdad?
Si encuentro un nombre corto, genial.
Pero a veces no hay manera.
Y pon un chorizo de variable.
Una vez se burlaron de mí porque tenía un nombre de variable que era una niña entera.
Y me dijeron, oye, y esto, digo, sí, es verdad, soy un paquete.
No he sido capaz de nombrarla.
Bien, ahora léela, ¿qué haces?
Y me dijeron, pues hace esto.
Digo, ah, pues eso, ya estamos.
Total, mucho mejor que sea descriptiva y larga, que no que sea una letra y que nadie sea capaz de entenderla.
Bueno, eso es, ahora, si ya eres capaz de hacerlo bien cortito, tal, oye, pues enhorabuena, pero a veces no sale.
Vale, pues bueno, aquí tenemos combinaciones con fallos válidos.
¿Qué vamos a hacer por aquí?
Pues vamos a llamar a dame opciones de degradación y le voy a pasar el carácter original actual.
Es decir, este nombraco, ¿de dónde viene?
Este nombraco viene de aquí y del bucle de original de i.
¿Por qué me he creado la variable?
Porque si pongo aquí original de i corchete ya empiezo a liarme.
Pues nada.
O sea, si un día esto va lento, ya empezaremos a optimizar y empezaremos a poner cosas raras y esas cosillas.
Como anécdota, yo me acuerdo al principio del 2000, un supuesto desarrollador front-end experto que cogía y hacía un código, todo legible, estupendo,
y después quitaba todas las variables, las ponía con una letra, quitaba los comentarios y me decía, no, es para optimizar, para el navegador.
Y digo, bueno, pues ya está.
Y después me dijo, no, es que mi niño tiene que comer de algo.
Digo, también.
A mí eso me lo dijeron en una empresa.
Que le pregunté una vez, oye, ¿por qué haces las variables de una letra?
Y dice, bueno, porque así me hago imprescindible.
Y yo, cabrón.
De aquí a dos meses va a ser imprescindible, vamos, tampoco te vas a acordar.
Ya ves, va a ser imprescindible el tú del pasado, que se iba a acordar de esto.
Eso es, eso es.
Pues bueno, pues venga, ya tenemos ya las combinaciones con los fallos válidos, con dame y acciones de degradación.
¿Qué vamos a hacer ahora?
Pues vamos a sacar también el carácter de copia actual.
O sea, voy a comparar aquí el original con el de copia.
Pues tenemos aquí un const, carácter copia actual y va a ser igual a copy de i.
Aquí tenemos una cosa muy chula y es lo que dijo Miguel antes.
Oye, esta comprobación de arriba no ha salvado el culo.
¿Por qué?
Porque yo ahora tranquilamente, como sé que es la misma longitud, puedo comparar el de i de aquí con el de i de aquí.
Si no hubiese hecho esta comparación, cuando es un caso tipo Miguel con los cuernos del demonio,
ahí pone todos los que tienen distintas, flas, todo bate, estoy roto, ala.
Bueno, pues seguimos.
Ya tenemos el carácter copia actual y el siguiente paso es decir, vale, pues ahora voy a ver,
voy a sacar las combinaciones con fallos que tengo y voy a ver si el carácter copia actual
está en la lista de combinaciones de fallos permitidos o entradas permitidas.
Pues me vengo aquí y digo, oye, sí, combinaciones con fallos válidos, me meto un no delante.
Punto, includes el carácter copia actual, es decir, tengo el carácter de copia y tengo el listado de combinaciones.
Vamos a ver si este carácter está ahí.
Y, pues, si no está, devuelvo un false.
Y después del for, lo que voy a hacer es, si has sobrevivido a todo este bucle, devuelvo un true.
Que aquí viene una cosa también súper divertida, ¿eh?
Bateita de vuelo a cebolleta.
A mí en la facultad, me acuerdo, cuando yo estudié hace más de mil años,
recuerdo que tú ponías una función, varios return, y te suspendían directamente.
Decían, esto es mala práctica, te va a castigar el señor, vas al infierno.
Y yo ahora soy viejo y digo, depende.
¿Tú cómo lo ves, Miguel?
Yo lo veo que hay malas prácticas que se han quedado en la mente de la gente, ¿no?
De que ahora, hacía muchos años, era una mala práctica y a día de hoy depende a veces del contexto, ¿sabes?
Y es una pena, ¿no?
Porque, por ejemplo, lo de tener más de un return, en este caso, ¿no?
Es una cosa que se hacía en C y tenía un sentido y tenía una explicación.
Pero sí, hay gente que tiene todavía como la piel muy fina hablando de estas cosas.
Pero hoy en día, por ejemplo, en este código tiene muchísimo sentido tener más de un return.
Por ejemplo, el en primer if.
No tendría ningún sentido, ¿no?
No hacer el en primer if, hacer un early return para justamente salir cuanto antes.
Y que además se entiende mucho mejor.
Te evitas un montón de anidamiento dentro de toda la función.
Pero sí, por desgracia, la gente se vuelve muy loca con las buenas prácticas.
A veces en las buenas prácticas falta contexto para hablar de buenas prácticas.
Sí, sí, sí.
Yo ya en las buenas prácticas, yo me grabé a fuego el no hay bala de plata.
No hay bala de plata.
Esto es lo que hay.
Oye, aquí aplica, aquí no aplica.
Lo difícil es saber cuándo aplica y cuándo no aplica.
Exacto.
Pero para eso somos programadores, para dedicarnos a esto.
Exacto.
Genial, genial.
Pues nada, pues ya tenemos esto.
Tenemos el return true aquí.
Y probamos suerte a ver si esto pasa o no.
Dale.
Ah, me da miedo.
¿Has metido esa prueba bonitaria de más?
No, no, no.
No, pero ahora estoy pensando por qué no pasa.
Y es porque he sido demasiado bueno.
¡Ojo!
He hackeado a Miguel.
He hackeado a Miguel.
Me has hackeado, me has hackeado.
Pero porque he sido muy bueno y no he querido ir de malas.
¿Y cuál es el tema?
¿Cuál es el tema?
El tema es que no he puesto ningún test donde el original tuviese algún símbolo, ya que
tuviese algún símbolo, que es lo que tenía que haber hecho.
Pero es que si tiene ya algún símbolo, yo lo trataría como un carácter normal, si
coincide bien, si no o no, porque no es una letra.
Claro, pero si haces que el original tenga algún símbolo y la copia tenga un símbolo
diferente, que es lo que puede ocurrir.
No cuadra, porque hemos dicho que sean solo letras.
No, pero claro, por eso, que no funcionaría, entonces ya el código.
Habría un tercer caso, porque sí que puede haber un degradamiento del símbolo.
Y en este caso, como todos los originales que he puesto, todas las cartas originales,
he pensado que era la original original, pero en realidad no tenía que haber sido así,
no tenía que haber sido la original original.
Tenía que haber pensado más que podría haber sido el original una copia y saber si es
una copia, ¿sabes?
Que el original hubiese una tercera copia, por ejemplo, ¿sabes?
Si quieres, cambio un test en Vue.
Oiga, oiga, Roel, dale, dale, dale, caña, dale, caña.
Los puntos los tienes ya, mira.
Pero hay una cosa, aquí tú dices que son caracteres de mayúsculas y minúsculas.
O sea, un carácter de almohadilla no debe nunca degradarse.
Sí, sí, una almohadilla se degrada aún más.
Del más puede pasar a los dos puntos.
No se puede degradar, pero aquí dice que son del carácter de la Z y las letras.
No, pero pone, las letras se degradan en una serie de carácteres en este orden.
Claro, claro, claro, vale.
La almohadilla no es una letra.
Si es una almohadilla, si lo degradas tiene que fallar el test.
Las letras...
Vale, vamos a poner entonces otra, pongamos.
Si cambia el enunciado, si me has pillado.
Vale.
Las letras se degradan en una serie de carácteres en este orden.
Una vez degradadas las letras en los símbolos, se pueden continuar degradando.
¿Vale?
Y vamos a poner...
A ver, es una línea de código, ¿eh?
Tampoco es muy complicado.
Pero, claro, a lo mejor habría que cambiar porque pues te necesitas si una carta es una copia de otra.
Claro, es que ya lo digo en el enunciado.
Necesitas detectar si una carta es una copia de otra.
No si es una carta original, ¿sabes?
Entonces, más que hablar de original, estaría bien hablar de...
Recibiendo la carta...
Recibiendo...
Recibiendo esto, recibiendo y recibiendo dos cartas.
La supuesta original y la copia.
Recibiendo la copia es una copia, si la copia es una copia de la supuesta, la otra.
Vale.
Y vamos a poner un caso de uso.
Por ejemplo, voy a hacerlo aquí fácil para que no...
Por ejemplo, si esto...
¿Cómo eran los puntos?
Esto tiene que pasar aquí y esto...
Claro, y entonces lo hace más difícil porque además puedes tener casos...
Los que tengas que mirar si era una copia...
¿Sabes?
Imagínate que en la original pongo un hash y en la copia pongo algo que no podría degradarse,
pero sí que es un símbolo válido.
O sea, por ejemplo, en una pongo un punto y en el otro, en ese sitio,
pongo un hash.
Es como una degradación al revés, ¿sabes?
Bueno, no vamos a llegar a eso.
No vamos a llegar a eso, que lo complica un poquillo.
Pero yo creo que en este caso, por ejemplo...
A ver, para que lo veamos...
Para que lo veamos.
Para que lo veamos todos en vivo y en directo, sin enseñar nada raro.
Pero...
Voy a enseñar dos casos, por ejemplo.
Venga, si quieres compartir tú.
Sí, ahora comparto la pantalla.
Vale, esto debería dar true y esto debería dar true.
¿Vale?
A verlo, a verlo.
Chan, chan, chan.
Vale, a ver, ¿qué os parece esto?
Bueno, presento yo, comparto pantalla, otra pantalla, aquí.
O sea, por ejemplo, este caso y este caso, este debería dar true.
¿No?
Porque este, aunque ya tiene un degradado, digamos aquí, en realidad esto podría ser uno
y luego hacer la copia, podría ser esta y esto debería dar true.
Bueno, porque es una copia válida.
Al final este era el original de la copia.
Fíjate que esto dice...
Sí, sí, pero...
Yo lo he cambiado porque debería ser...
Ah, amigo, amigo.
Vale, vale.
Una vez degradadas las letras, los símbolos se pueden continuar degradando.
A ver, es que tiene sentido porque si no, nunca se degradarían, ¿no?
¿Sabes?
¿Entiendes?
O sea, si esta secuencia ya dice que pasa de esto a esto, a esto, o sea, que realmente
ya estaba la explicación, pero es verdad que a lo mejor no quedaba muy claro, ¿no?
Pero, claro, una serie de carácteres en este orden.
El orden es, primero son letras, pero luego pasa esto, luego pasa esto.
Sí, una moda día se puede degradar una suma y eso teníamos que mirarlo.
Claro.
Y tendríamos que recortarlo, joder, se tiene de tela, ¿eh?
Claro, lo hace un poquito más complicado.
Entonces, bueno, la gente que ha mandado solución hasta ahora, pues bien.
Pero, por ejemplo, aquí esto debería funcionar todavía.
Esto también debería dar true.
Podríamos poner aquí dos puntos, aquí esto.
Lo que no debería ser válido es si en este caso hago esto al revés.
Porque esta degradación no es correcta.
No puede ir hacia atrás.
El orden siempre debe ser correcto, ¿no?
Bueno, entonces, no pasa nada porque me parece muy...
Me has pillado.
Lo que voy a hacer es...
Voy a añadir estos test porque me parece que está bastante bien.
Para que...
Dice, pero algunas letras no están respetando el orden de grado.
Están pasando directamente al más o al A.
Claro, pero hay.
Por eso esto es el false, por ejemplo.
En este caso es el false.
Y en este caso, que a lo mejor me lo...
Este caso es porque tú no sabes cuántas copias...
Es que alguien está diciendo, algunas letras no están respetando el orden.
Claro, pero el orden es que tú sabes que de aquí puedes llegar aquí, pero no al revés.
Entonces, tú no sabes cuántas copias hay entre esta y esta, ¿vale?
Tú no sabes cuántas copias han hecho.
Solo tienes que saber si es una copia válida, ¿vale?
Ese es el tema.
¿Intentamos sacarlo?
A ver, ¿qué tal en este código?
¿Sí? ¿Tú dices?
Venga.
A ver, no pasa nada, ¿eh?
Ahí me echas tú un cable, ¿eh?
Que ahí voy a hacer...
¡Ay, Dios mío!
Vale, a ver.
Bueno, voy a...
Espérate, que tengo que...
Voy a quitar la pantalla.
Voy a añadir...
Voy a añadir...
Sí.
Voy a añadir un test.
A ver, test de galos.
Vale.
Voy a compartir pantalla de nuevo.
Voy a añadir un test que sea este.
Tres regalos.
True.
Y a ver, espero no haberla liado.
Parda.
Pero al menos con esto...
Add...
Affix.
Esto por aquí.
Y en el test...
Solo he cambiado un test.
Solo he cambiado un test para hacerlo un poco más complicado.
Fix.
Test.
Solo he cambiado un test para no liar la parda, que si no a lo mejor lo complicamos demasiado.
A ver.
Voy a puxar los cambios.
Vaya por Dios, que me da...
Tengo cuenta que el último espacio es un espacio en blanco.
Vale.
Aceptar ambos cambios.
El último espacio es un espacio en blanco.
Vale.
Emergear.
Venga.
Aquí, en vivo y en directo, amigos.
Se siente el poder.
Bueno, vamos a intentarlo, ¿no?
Vale.
Pues ahora con esto...
Te aviso cuando esté.
Que a lo mejor...
Pero es verdad que...
Pero ves, eso me pasa por ser bueno.
Porque he pensado, bueno, no voy a poner unos test muy complicados.
Pero claro, no está bien del todo planteado.
Porque al final los test tenían que haber mirado los casos estos del símbolo.
No había caído en eso.
A ver, ya se está desplegando.
No voy a tardar mucho.
Tarda un minuto.
Vale.
Te voy a poner por aquí...
Con tu pantalla.
Vale.
Le ponemos ahí el caso extra.
Vale.
Venga.
Caso 3.
Caso 3.
Vale.
Me...
Me ha pillado.
Me...
No, no, me ha...
Y no puedo irme a casa.
Me has pillado.
Me has pillado a mí.
Me has pillado a mí.
Me has pillado a mí.
No, pero tienes toda la razón.
Ahí ya es donde se entiende el tema de la secuencia.
Porque ya al principio cuando le he anunciado digo, hostia, la secuencia.
Y la entendí por otro sitio.
Y ahora cuando dices, hostia, son copias de copias, ahora se entiende lo que tú comentas
y lo que le añade veneno a este ejercicio.
Que es decir, oye, caso 3.
Si vengo de varias copias, un carácter especial...
Pero vas a ver que no es muy complicado.
¿Sabes?
Porque, claro, ya la lógica la tienes bien.
Lo que pasa es, claro, que al ser un caso, al final lo que tenemos que hacer es un...
Dice, cámbialo de medio a difícil.
No, hombre.
Yo creo que tal y como lo ha hecho Braulio hubiera sido a nivel fácil.
Y yo creo que ahora pasa a nivel medio.
Pero igual que ha hecho ya lo de mirar si es mayúscula y mirar si es minúscula,
ahora lo que tendría que mirar es mirar si es símbolo.
Claro.
Entonces...
Eso es muy bueno.
El tema de aquí es que tú aquí en los símbolos...
Si tú ya estás en un más, la almohadía no es válida.
Entonces, tienes su chicha.
Tienes su chicha porque tienes que ir diciendo, vale, encuéntrame el índice de lo que...
Donde estés, córtame el string y quédate con el trozo que haya y evalúa si está o no está ahí.
Que un poquito la gracia, ¿verdad?
Exacto.
Ahí está.
Pues vamos a ver, vamos a ver.
Lo que pasa es que esto es escribirlo bien después.
Te lo habría que hacer un ratito.
Porque es que teníamos que hacer, por un lado, tendríamos que encontrar el índice de ese carácter raro.
Y si es un carácter raro, porque a lo mejor no es.
Entonces, yo lo que haría aquí es, voy a decir, oye, const es un símbolo.
Es un símbolo, sí, me puede valer, es un símbolo.
Pues es un símbolo, es igual a, tengo los símbolos por aquí, ¿no?
Óptima, y tiemblan las manos y todo esto de picar en directo da Juju, ¿eh?
Yo no voy a hacer lo que tú haces, estar ahí donde te da a esta gente.
Aquí vamos, ahí, como si lo vieras mañana.
Bueno, al final te acostumbras y total, la gente, la gente, hay alguna rata, pero en general son bastante buena gente.
Son bastante buena gente.
Y te ayudan y todo eso también, eso ayuda, cuando me dicen, chico, el putico, el tightro, ay, ay, gracias.
Y si no lo has leído y te lo dicen, se quejan y te dicen, pero si te lo he dicho, ¿por qué? No sé qué.
Nada, pero lo estás haciendo muy bien, o sea, que sin problema.
Estupendo, pues mira, aquí tenemos símbolos y tenemos el include y de la S, y vamos a ver si es un símbolo.
Pues nos metemos aquí, mira, if es un símbolo, nos metemos adentro.
Ahora, ¿qué vamos a hacer? Ahora lo que vamos a hacer es buscar el índice de donde empieza el símbolo.
Porque, claro, hemos dicho que en el momento que estoy en un más, la fotocopiadora va a degradarse a dos puntos y un punto.
Pero si se degrada una mojadilla, la he cagado.
Entonces, vale, pues vamos a encontrar aquí.
Si es un símbolo, vamos a buscar el índice de eso.
Entonces, símbolos punto index of, ese aquí, index of, sí.
Aquí te das cuenta los array methods, lo que ayudan, o sea, de echar un ratito y aprendértelo.
Porque si no, empezaríamos a meter bucle y cosas por ahí.
¡Hala! Un trocho de código tremendo.
Pero bueno, aquí tenemos el índice.
Vamos a guardarlo.
Y el siguiente paso sería trocear el array que tengo.
Exacto.
O sea, el array, no, perdón, el string.
Vamos a trocear este string que tengo aquí para quedarme solo.
Claro, porque nos vamos a quedar solo con los símbolos que ahora tienen sentido revisar, ¿no?
Que podrían ser degradados.
Entonces, del symbols deberíamos hacer un slice.
Sublistas, símbolos.
Vale.
Símbolos, ahí está.
Un slice a partir del índice que hemos encontrado.
Vale, y yo esto del slice, siempre con slice, con splice, con slice con parámetros, tal.
Yo siempre me lío y acabo viendo la documentación.
Tío, yo soy un paquete, pero yo me lío la documentación.
O le pregunto a chat GPT y después lo compruebo la documentación y vuelvo y da y vuelta porque siempre se me olvida.
Es lo que tiene ya.
Menos mal que en la cadena de texto no hay splice.
Porque entonces sí que es verdad que sería un poco rollo.
Sí, sí, sí.
Y ya está.
Ya tienes la sublista de símbolos.
Ahora sería cuestión de devolverla ahí, como el retur que has hecho en la 19.
Pues aquí, retur de la sublista.
Tengo la sublista.
Lo suyo quizás sea buscar si está, ¿no?
O no, devolverla.
Tienes toda razón.
Claro, claro, porque este método ya mira, ahí está.
Claro, y aquí no me hace falta ni mayúscula, ni minúscula, ni nada.
Es decir, aquí lo que estoy haciendo con este codiquito de aquí es venirme acá arriba y decirle,
vale, de esto igual no me vale todo.
Dime de dónde empiezo.
Una copia, la almohadilla.
Dos copias, el más.
Pues voy haciéndolo más chiquitito.
Y con eso ya, en teoría, igual hasta pasa y todo.
Vamos a ver su lista de símbolos.
Soy un crack, ¿eh?
Mira, he puesto 30 meses.
Cómo te lo chivas, ¿eh?
Menos mal.
Es que yo estoy aquí con Copilot ya.
Sí, sí, sí.
Ya lo corón.
Es súper vasto.
Vale, y ahora me da miedo darle aquí.
Uy, le he dado a grabar, tío.
Tengo todavía el chip en la cabeza del control S.
Le voy a dar la solución y estoy acojonado, tío.
Solo ha cambiado un T.
Solo ha cambiado un T.
Solo puede fallar uno.
¡Ay, ay, ay!
¡Vale, ay, ay!
Eso sí, se ha cambiado menos puntos.
Eso no puede ser.
Pero mira que si comentas ese código ahora, no te pasaría.
Vamos a verlo, vamos a verlo.
Si comentas todo y a 24 horas.
Ahora pasa y no empezamos a reír, ¿no?
Bueno, sí, me lo puedo creer.
Me lo puedo creer.
El momento bombero-tolero.
Se mete uno ahí a improvisar y vamos a darle a la solución.
A ver, voy a dar solución.
¿Ves?
Y ahí vemos el caso de lo que comentaba.
El caso puñetero.
Exacto.
Claro, es que habría...
Lo voy a revisar para poner alguna cosa.
Porque aquí está la gracia.
Pero bueno, yo creo que...
O sea, es un poquito más complicado.
Pero tampoco es que sea mucho más complicado.
Porque al final, siguiendo la misma lógica que has utilizado, ¿no?
Al principio de S mayúscula, minúscula.
Y esto sí que es un poquito más difícil.
Pero si lo haces caso por caso, pues tampoco.
Sí, sí, sí.
No, está chulo.
Si haces caso por caso.
Y este, bueno, este sí.
Si no caes en poner esto.
Oye, pues te hace un bucle.
Te lo saca una función.
Lo prueba.
Y ya después te pondrás con la IA de turno.
Con quien sea.
Investigar.
Y ver cómo pone ese código más sucinto.
Porque es verdad.
Hay una cosa que a mí me pasa con estas cosas.
Index of, slice.
Si yo lo voy a usar en un proyecto.
Yo lo que hago es a los compañeros de proyecto.
Decirle.
Oye, ¿conocéis esto?
Porque esto hace falta usarlo.
Y se lo explico.
Y todos estamos en la misma página y tiramos.
A veces hay código.
Por ejemplo, ¿hay código hecho con Reduce?
¿Qué dices tú, criatura?
A mí me cuesta a veces.
Sí, ¿para qué?
Pongo un filter, pongo un tal.
Son dos líneas de código.
Van a ser 20 entradas.
No vas a tener problemas de rendimiento.
No te metas a fumarte la pipa.
Que sí, que eres muy listo, pero...
A veces tiene sentido, pero siempre que...
Hay un vídeo muy bueno de la gente de Google, de dos desarrolladores que son buenísimos,
que hablan de por qué no deberías usar Reduce.
Y tienen un montón de casos de código que han sacado de bibliotecas como RIAG y tal, de los internals.
Y está muy chulo porque no solo hablan de se lee peor, ni yo lo entiendo, y además es peor en rendimiento, pensando que es mejor.
Cuando muchas veces...
Lo que pasa es que lo hacemos a veces porque no queremos mutar la variable, pero a veces es que es una tontería, especialmente si tienes la variable cerca.
Pero bueno, entiendo que por temas de programación funcional muchas veces la gente pues le da bastante cañón.
Hay que utilizar herramienta adecuada cuando toque y justificada, no meterse en más lío de la cuenta.
Lo mismo que con temas de programación funcional y esas cosas.
Úsalo, que te ayude, pero no para ser más listo de la clase.
Al final más listo de la clase no coges vacaciones, se queda trabajando.
Exacto. Y lo peor es cuando se quedan los demás. Ese sí que es el problema.
También, también, también, también.
Bueno, Braulio, muchísimas gracias.
Os dejo por aquí el pedazo de descuento.
10% a la oferta que tenga Lemon Code en este momento.
Le decís que venís de parte de MiduDev, midu.link barra Lemon Code, ¿vale?
Ya sabéis que tenéis un montón de formaciones y que van a empezar ahora la formación del máster de Frontend.
Que aprendéis React, Vue, Angular, Svelte, NextGS, GraphQL, Webpack, Vite.
Tenéis un montón, pero es que además tenéis un montón de profesores que son muy cracks,
como la gran Carmen Ancio, Juan José Montiel, también mi amigo Paul Melero, que os enseña Vue.
O sea, tenéis un montón de expertos en la materia y el propio Braulio, por supuesto,
que también lo tendrías como profesor.
Así que si os estáis buscando un máster para pasar al siguiente nivel, ¿vale?
Pues que sepáis que aquí lo tenéis y además con un 10% de descuento.
Braulio, muchísimas gracias por pasarte.
Gracias por haber aguantado ahí el reto y por haberlo explicado también.
Para la gente especialmente que le da un poquito de miedo.
Pero nada, ha sido un verdadero placer por haber podido disfrutar de tu paso a paso
y haberte enfrentado después al PSP.
Ahí te lo has jugado.
Eso es.
Pues nada, encantado.
Muchísimas gracias por invitarme.
Hasta luego.
Nada.
Un abrazo, Braulio.
Y nos vemos mañana todos y todas aquí para aplicaciones en tiempo real,
que lo vamos a hacer desde cero y que os va a volar la cabeza.
Así que no lo perdáis.
Muchas gracias a todos por estar.
Nos vemos mañana.
Hasta luego.
Hasta luego.
Hasta luego.