logo

midulive


Transcribed podcasts: 746
Time transcribed: 15d 5h 20m 39s

This graph shows how many times the word ______ has been mentioned throughout the history of the program.

Vamos a empezar con esta CodeSignal.
Si alguien dice, ostras, ¿por qué es interesante este?
Pues te voy a decir por qué es interesante, porque CodeSignal es la herramienta que utiliza Facebook para sus entrevistas.
Por lo tanto, creo que es muy interesante que te hagas todo esto del arcade y bueno, te lo puedes hacer conmigo, que lo vamos a hacer aquí juntos.
Pero las entrevistas que hace Facebook utiliza esta plataforma y sé que muchas de las que aparecen aquí, en este arcade, al final, han aparecido en entrevistas de Facebook.
Así que bueno, yo creo que es interesante.
Para que veamos un poco, voy a hacer la de Add, que la de Add no tiene ningún tipo de misterio porque es sumar, pero es un poco para que veamos la plataforma.
Aquí al final lo que tenemos es los puntos que puedes ganar y tienes aquí una explicación.
Escribe una función que devuelva la suma de dos números, pero ya os digo que esto va a ir escalando muy rápidamente.
Te dan un ejemplo, aquí te dicen para el parámetro 1 y el segundo parámetro que sea 2, el output tiene que ser 3, la suma de 1 más 2.
Y te dice diferentes condiciones, te dice el tiempo límite que se puede ejecutar, pues 4 segundos.
El input, ¿cómo va a ser? Pues va a tener unos constraints.
Por ejemplo, el primer parámetro va a ser, siempre va a estar entre menos 1000 y 1000.
No va a ser más de 1000 y menos de menos 1000.
Y el parámetro 2, pues lo mismo.
Y el output, pues tiene que ser eso, la suma de los dos inputs.
Y aquí, bueno, esto es la sintaxis de JavaScript que no sé para qué, porque se supone que si lo voy a hacer con JavaScript es que debo saber.
Aquí podéis cambiar el lenguaje, ¿veis? Tenéis un montón de lenguaje.
Lo digo por si en algún momento decís, ah, pues quiero practicar TypeScript, pues lo podéis poner en TypeScript y practicáis.
O Python, CoffeeScript, lo que queráis. Podéis cambiarlo con lo que queráis.
Aquí en Draft, creo que, mira, hace 3 meses se ve que empecé a intentar hacer algo.
Las soluciones, esto es de otra gente que podéis ver las soluciones que ha ido haciendo.
Esto está bien, sobre todo una vez que ya la has terminado, pues para ver cómo la gente lo ha hecho y todo esto.
Aunque veo que está cargando, no está encontrando mucha cosa.
Y el Ritme, el Ritme este no tiene mucha historia.
Esto es totalmente gratis, ¿eh? O sea, lo que vamos a hacer hoy es gratis.
Pero CodeSignal tiene una parte que sí que es de pago, que entiendo que más adelante pasaremos.
Pero sobre todo es de pago para las empresas que quieran hacer entrevistas.
Pero la parte que nosotros vamos a hacer es gratis, gratis.
Y entonces, ¿dónde está? Mira, aquí le puedes dar like o dislike.
Este no le ha gustado mucho a la gente porque total es una suma, ¿no?
Aquí nos está diciendo, vale, pues suma 1 y 2 y que devuelva esto.
Pero claro, ¿cómo te aseguras que esto funciona?
Ajá, me estarás preguntando.
Pues aquí tienes unos tests que tienen que pasar.
¿Ves? Si yo pongo param1 menos param2, pues esto no debería pasar.
Le doy a runtest, pasan los tests, te dice 0 es 6.
Y esto es genial porque además te va diciendo, oye, el output que ha dado es menos 1 y yo esperaba 3.
Si es más complicado puedes ver un div y todo.
Esto lo iremos viendo, ¿eh? Porque ya os digo que lo vamos a necesitar.
Así que nada, le das a más y entonces te ejecuta estos tests.
Pero, ojo, ojo, porque claro, es que este ejemplo es muy sencillo, pero ya veréis que se va complicando.
Esto lo que hace es pasar una suite de tests pequeñita, o sea, solo una parte.
Porque en realidad, ¿ves? Ahora te dice click submit to run de full test.
O sea, cuando le das a submit, bueno, que es este botón de aquí, entonces se ejecuta todos los tests en realidad, ¿vale?
Mira, fíjate.
Ahora ha ejecutado el doble de tests que antes.
¿Esto por qué lo hacen? Porque tienes 6 tests que te va a dar pistillas en el caso de que, por lo que sea, no ha funcionado algo.
Pero puede ser a veces que te pasen estos 6 tests y no te pasen los que están ocultos.
Así que, bueno, si os parece, pues vamos al primer ejercicio que yo no he hecho ni he hecho nada.
Así que, bueno, no os riáis mucho de mí en el caso de que falle mucho, pero iremos aprendiendo.
Lo que quiero hacer, además, es intentar, no intentar hacer la solución y ya está, sino os voy a explicar un poco cómo pienso también.
A ver si esto os ayuda, sobre todo a aquellos que queráis empezar a hacer catas, ¿vale?
Lo primero que hago, como siempre, leer el enunciado. No hay nada más importante que leer el enunciado.
Dado un año, ¿hay que devolver en qué siglo está? Bueno, este parece sencillito.
Bueno, sencillito. Nunca, nunca, con los algoritmos uno nunca puede decir sencillito porque normalmente tienen trampa.
El primer siglo empieza desde el año 1, incluyendo el año 100.
Yo normalmente, una cosa que hago para los algoritmos, o hacía, porque ya os digo que hace mil años que no hago algoritmos,
pero lo que hacía es que conforme yo voy leyendo, pues voy diciendo, vale, pues el primer siglo es del 1 al 100.
Del 1 al 100, esto sería el siglo 1, ¿vale? Entonces, del 101 al 200 sería siglo 2.
Voy leyendo, ¿no? Y ya, pues voy sacando un poquito de información.
Y me dice, ejemplo, pues el ejemplo igual. Si veo el ejemplo, dice, para el año 1905, el output tendría que ser el año igual a 20, ¿vale?
Esto debería ser el siglo XX. 1905 es el siglo XX. Así que 1905 es el siglo XX, ¿vale?
Voy a ponerlo con números porque total creo que queda un poquito más caro.
Y el 1700 es el siglo XVII. Muy bien. El límite de ejecución son 4 segundos, espero que no lleguemos.
Y el input es un integer, que es del año 1 al 2005. Esto es interesante. ¿Esto por qué te lo dicen?
Porque hay veces que te puedes evitar los if, ¿no? Si no, yo tendría que mirar si es un número negativo, si esto, lo otro.
Pero bueno, ya te dicen, no, no te preocupes que el year te viene del 1 al 2005. Perfecto.
Vale, pues bueno, yo creo que ya podemos empezar.
A ver, teniendo en cuenta esto, yo lo que veo aquí es que si tú divides entre 10, ¿no?
Tienes aquí el año, por ejemplo, el año 90. Vamos a poner ejemplos, ¿no?
Tienes el año 78. Por lo divido entre 10, esto me daría 7 con 8. 7 con 8. Vale.
Claro, es que con este año es un poco raro. Pero o sea, 7 con 8. 7 con 8 dividido entre 100 más 1, ¿no?
Y esto me debería dar ya... No, claro, pero no puede ser... Hay que redondear. Eso está claro, ¿vale?
Tendríamos que redondear, seguro. ¿Por qué? O sea, porque hay que dividir el año entre 100 y seguro que no...
Es que he puesto entre 10. Debería ser entre 100, ¿vale?
Entre 100, ¿vale? Sería 0,78. Y habría que redondearlo siempre hacia arriba, ¿no?
Porque esto es 78, sería tal. Pero esto lo que queremos es que nos dé 1.
Si yo pongo, por ejemplo, 1985 entre 100... Porque los siglos son de 100 años.
Es que he puesto 10, pero me había equivocado. Entre 100. ¿Vale?
Esto entre 100 nos debería dar 19,85. Lo tenemos que redondear a la 20.
Bueno, este creo que es bastante sencilla. Esto deberíamos hacer... Eso.
Dividir el year entre 100. Y esto, para redondearlo, claro.
Si utilizamos el mod round, yo creo que esto nos va a dar problemas.
Porque el mod round, claro, redondea, pero dependiendo al entero más cercano.
Y esto no es lo que queremos. Porque si es el entero más cercano, igual va hacia abajo.
Y eso no es lo que queremos. Así que vamos a utilizar el mod sale.
¿Vale? Tenemos el mod floor que siempre redondea hacia abajo y el mod sale que siempre redondea hacia arriba.
Yo creo que es esto. Yo creo que este es el correcto. ¿Vale?
Bueno, vamos a darle al rante, a ver qué hace.
¿Vale? Ha pasado los 9, bla, bla, bla. Bueno, como están todos bien perfectos, pues le puedo dar a submit y no hay ningún problema.
Básicamente, lo que hace el mod sale, por si alguien se lo está preguntando, mod sale.
Tú le pasas un número, por ejemplo, el 8.9, ¿vale?
Y esto te lo redondea siempre a 9. Pero fíjate que tú haces más sale 8.1 y esto te lo redondea siempre a 9.
¿Vale? Mira, vamos a verlo en Rangies, que ahí queda más claro. Aquí queda más claro.
Ya verás. Vamos a quitar esto. Vamos a quitar esto.
Este es útil para eso, ¿no? Mira, ¿ves? Que me lo redondea siempre hacia arriba.
Da igual cómo de cerca esté. 8.0005. Da igual. ¿Vale?
Siempre lo redondea hacia arriba. O sea que para eso necesitamos el más sale.
Este es el que no lo tiene que hacer. ¿Vale? Más sale.
¿Vale? Pues nada, submit. A ver qué tal.
¿Ves? Ahora ha pasado los test ocultos.
¿Vale? Pues bueno, ya hemos desbloqueado algo. Ya no me siento tan mal.
Continuar. Va.
Eh, ta, ta, ta.
Yo ahora champ. Bueno, 65%, 67% completado, pero de la primera.
O sea que vamos. Nivel 2. Vamos.
Ya veréis que esto empieza... Empieza poco a poco, pero luego vamos a estar ahí un buen rato con algunas.
Estas son las fáciles. Estas son de calentamiento.
¡No! ¡Odio esta! La odio.
Odio la del palíndromo. Bueno, va. Venga, vamos a ver.
Hay un montón de formas de hacer la del palíndromo.
Esta, la chusquera, ¿vale?
Eh, bueno, os voy a comentar que es el palíndromo, por si no lo sabéis.
Este es un ejercicio típico, ¿vale? Es un ejercicio típico de entrevistas.
Súper típico.
Entonces, ¿un palíndromo qué es?
Un palíndromo básicamente es ver si un...
Bueno, le he dado al... Ah, mira, que te lo hice.
Eh, un string que no cambia cuando le das la vuelta.
O sea, lo puedes leer del derecho y del revés y debería leerse igual.
Por ejemplo, I es un palíndromo.
Nun es un palíndromo.
Decaf faced y con este espacio en medio es un palíndromo, ¿no?
Porque si lo lees al revés, pues se lee igual.
Ahora, taco cat no lo es porque al revés no se lee igual.
Básicamente es eso. Es que del derecho y del revés se lee igual.
Hay que tener en cuenta también que una sola letra es un palíndromo.
Y tres veces la misma letra sería un palíndromo.
Cosas así.
Muy bien.
Aquí nos ponen ejemplos.
El aba, esto es un palíndromo.
Y el output, pues debería ser true.
Input string abac, esto no es un palíndromo, false.
Y ves, una sola letra es un palíndromo, pues debe ser true.
A ver, una forma muy chusquera y que suele...
Sí, capicúa, muy bien.
Muy bien, Germán.
Capicúa es como se dice en catalán.
Aquí en Cataluña decimos capicúa.
Una forma...
Yo no diría que chusquera.
No sé.
No chusquera tampoco.
Pero a ver, una forma fácil de hacer esto.
Sería, pues tener...
Darle la vuelta al input string.
El string que nos pasan, decimos, vale.
Pues reverse set.
Pues el input string tendríamos que separarlo.
Luego hacemos un reverse.
No sé por qué.
Reverse.
Luego un join.
Y ahora os explicaré por qué esto es un poco...
A ver, no es que sea mala, pero funcionar debería funcionar.
Entonces, haces...
Miras si el que le has dado la vuelta es igual al input string.
Realmente, esta es la solución que se entiende mejor, yo creo.
O sea, si tuvieras que entender la solución y escribirla, además es corta.
Es bastante corta.
Input string.
La convertimos en un array con el split.
¿Vale?
De hecho, lo podemos hacer en un momento para que vayamos viendo el tema.
Mira.
Tenemos este, ¿no?
Pues primero le hacemos el split.
¿Ves?
Entonces, esto me devuelve el array, le damos la vuelta y una vez que le damos la vuelta,
pues hacemos un join.
Ahora, lo único que tienes que hacer de esto es mirar si este sería el reverse set, ¿no?
Y esto lo que tendrías que hacer es si reverse set es igual a A.
Y esto debería ser true.
Esta es bastante...
Una cosa interesante de esta, que me gusta bastante, es que no tienes ningún loop y que además no estás...
O sea, porque mucha gente diría, no, es que claro, aquí la optimización no está muy bien porque la big O notation y tal.
Pero en realidad esto es más del motor que está utilizando JavaScript.
Y seguramente esto vaya bastante más rápido que en un loop que puedas hacer.
Porque en el loop es como que tú estás haciendo la optimización.
¿Vale?
Bueno, vamos a ver primero si esto funciona porque yo estoy hablando mucho.
Pero ya me imagino que sí.
¿Cuál es el problema de esta solución?
El problema de esta solución es que si esto es un string muy grande...
A ver, ¿de cuánto dice que esto puede ser?
De 10 elevado a la 5.
O sea, de 10.000.
¿10.000 o 100.000?
Ah, no sé.
Bueno, 10.000 o 100.000.
Bueno, puede ser un poco grande.
Pero bueno, ya nos pone aquí que el límite tiene que ser 4 segundos.
O sea, que tampoco estamos...
100.000, gracias Mario.
Nos dice que es 4 segundos y ya vemos que está pasando correctamente.
De hecho, me han pasado todos los tests, ¿vale?
Le damos a submit, a ver si pasan.
Dame los hidden.
Vale, han pasado todos.
Así que, perfecto.
A ver, antes de continuar, voy a cerrar esta.
No, no, déjame ya.
Vale.
¿Qué otra forma se podría hacer?
A ver, otra forma que esto se podría hacer es con el for.
Lo puedo intentar, aunque hace mil años que no hago un for.
Vamos a probar.
Hace mil millones de años que no hago un for.
A ver si así me acuerdo.
Bar i igual a cero, ¿vale?
Luego i menor a length, input, string, punto length.
Pero, claro, ¿cuál es la gracia de hacer el for?
Mira, voy a comentar esta.
Ay, no, no se puede comentar así.
La gracia de hacer el for, claro, la gracia está en el input string, punto length, pues dividirlo entre dos, ¿vale?
¿Por qué?
Porque lo que puedes hacer es, por un lado, es como hacer un sandwich, ¿no?
Tú vas leyendo por la izquierda, pero por la derecha vas comparando.
Y entonces ya debería ser exactamente lo mismo.
Esto está bastante, es bastante útil si te preocupa mucho por temas de rendimiento.
Pero, bueno, yo no sé si realmente el rendimiento va a ser muy diferente, ¿eh?
No sabría deciros si realmente va a ser la diferencia.
Lo que tenemos que hacer aquí es, input string, la i, a ver, input string, esto, ta, ta, ta.
Claro, estoy pensando que esto, aunque nos dé, vamos a ver, input string i, esto sería el cero, y luego input string, input string, punto length.
De hecho, podríamos sacar el length aquí, input string, punto length, vamos a sacarlo aquí, punto.
Length, length, menos i.
Y así iríamos comparando cada uno de ellos, pam, pam, pam.
O sea, primero compararíamos el último, ¿no?
Porque el length menos i, o sea, cuando es cero.
Ah, no, pero claro, esto debería empezar menos i menos uno, porque si no, lo va a comparar mal, ¿vale?
Si es igual, si es diferente, podríamos hacer un return false, y si no, hacer un return true.
O sea, vamos comparando, ¿no?
Y decimos, el primero que es cero, y este sería aquí.
Este sería el length.
Ay, no, pero esto tiene que ser el length total, ¿eh?
Perdón, perdón, perdón, perdón.
Ah, sí, vale, está bien, está bien.
Length total, el i es cero, menos uno, ¿vale?
Esto sería el último.
Luego el siguiente, la siguiente iteración sería el segundo.
Bueno, vamos a probar si esto funciona.
Vale, parece que sí ha funcionado.
¿Cuál es?
Bueno, vamos a probar todos, porque normalmente, vale, con los hidden también.
¿Qué se supone que estamos logrando con esto?
Lo que estamos logrando con esto es hacer el mínimo de iteraciones necesarias, ¿no?
Estamos, ya para empezar, hemos dividido por la mitad.
Pero es que, además, en cuanto encontramos uno que ya no corresponde, ¿no?
Pues ya salimos del loop.
Hacemos un return false y decimos, no, no, esto no es igual y ya está.
Esto, cualquier loop, esto lo podríais hacer con un while, lo podríais hacer con lo que queráis, ¿eh?
Pero, bueno, creo que con el for queda bien por el tema del length, pero si no, lo podéis hacer con un while, lo podéis hacer con lo que queráis.
Creo que la primera solución, esta de aquí que hemos hecho, es un poquito más bonita.
Esta, cuando empiezan ya los loops, es un poquito...
Pero, bueno, length, guardamos aquí el length y luego miramos esto y ya.
Bueno, de hecho...
Bueno, no, esto ya solo para hacer el return cuando haces esto, ya estaría.
Bueno, esta sería la otra forma, ¿eh?
Si no, con el while se gusta más y ya está.
Bueno, ya está.
Lo puedes hacer con un while y dos contadores, uno que va por la derecha y otro por la izquierda, y con eso validas.
Sí, totalmente.
A ver, lo mismo.
Lo bueno de...
Una cosa que me gusta de esta, ¿no?
A ver, que con el while lo podríamos lograr igual.
Pero es que ya de primeras ya solo vas a...
Ya te aseguras que solo vas a hacer un loop sobre la mitad.
Con el while lo podríamos hacer, pero ya sería un poco más...
¿Sabes? Porque si haces un while y al final lo que haces es pasarte del medio para seguir revisando, es un poco fail, ¿vale?
Porque la gracia justamente es de evitar de que lo haga todo.
Pero bueno, esta sería una solución.
Si no, podéis hacer la que queráis, hay un montón.
A ver, esta solución que hemos hecho antes la podríamos iterar un poco
para justamente también que hiciese lo mismo.
O sea, mezclarlas.
Lo que pasa es que sería un poco raro, ¿eh?
Pero podríamos mirar si...
Bueno, se podrían mirar muchas cosas.
Bueno, total.
Summit.
Fuera.
Vamos a la siguiente.
A ver qué.
Mira, y se pueden desbloquear los tests que están ocultos.
Supongo que eso...
La gracia será...
Si hay alguno que te cuesta.
Bueno, ya hemos pasado la primera.
Vamos con la siguiente, va.
Vamos con la siguiente.
Vamos con Edge of the Ocean.