Categorías
Blog Tutoriales

Resolviendo la edición Tuenti Challenge 10 con Python: Reto 3

Si estás leyendo esto probablemente es que hayas pasado los dos retos anteriores. Si no es así entonces te recomiendo empezar por los primeros retos, ya que este reto 3 es bastante complejo si lo comparamos con los anteriores. Por lo tanto si aún no has hecho los anteriores, aquí tienes los enlaces:

Si aún sigues por aquí entiendo que ya los hayas pasado, así que mi enhorabuena y supongo que estés deseando leer el Challenge 3 de este Tuenti Challenge. Pasemos por lo tanto a ver que nos dice:

Reto 3 – Fortunata and Jacinta

This year is 2020 and, for the centenary of the death of the famous writer, Benito Pérez Galdós, Tuenti is paying homage to the universal writer in this challenge.

Benito Pérez Galdós - Reto 3 del Tuenti Challenge 10 en La Isla del Faro.
We’re going to analyze Galdos’s masterpiece «Fortunata y Jacinta». You can find the Project Gutenberg EBook version at:

pg17013.txt

We want to count the number of instances of each word and rank all words according to a certain order.
The sort criteria will be:

  1. Descending frequency. Rank #1 will be the word with the highest frequency.
  2. When several words have the same frequency, UNICODE ORDER will be applied (sort by the unicode value of the char).

For example, consider the following list of words:

zumo ámbar doctor déjeme ejército ómnibus úlceras volveré ñoños baldomero ropa abrazo

The sorted order would be:

#1 abrazo
#2 baldomero
#3 doctor
#4 déjeme
#5 ejército
#6 ropa
#7 volveré
#8 zumo
#9 ámbar
#10 ñoños
#11 ómnibus
#12 úlceras

Limits

You must follow these rules:

  1. Convert all words to lowercase
  2. Only consider the following letters: a, b , c, d, e, f, g, h, i, j, k, l, m, n, ñ, o, p, q, r, s, t, u, v, w, x, y, z, á, é, í, ó, ú, ü. Discard replacing with SPACE any other letter, digit or punctuation mark.
    Sample:

    Release Date: November 5, 2005 [EBook #17013]
    [Last updated on December 21, 2019]
    Mi primer hijo--decía--nació cuando vino la tropa carlista
    «D. Plácido, ¿tiene usted pana azul?».--«¡Pana azul!
    --¿Vive aquí--le preguntó--el Sr. de Estupiñá?
    --¡Qué poca vergüenza!
    Pues apechuguemos con las _novedades_» dijo Isabel a su marido
    Barbarita declaraba riendo que con estos teje-manejes se había vuelto, sin saberlo, una doña Beatriz Galindo
    ¡Pero las niñas!... ¡Y con estas modas de ahora y este suponer!... ¿Viste la pieza de merino azul?, pues no fue bastante
    

    Output discarding invalid characters would be:

    release date  november          ebook
    last updated on december
    mi primer hijo  decía  nació cuando vino la tropa carlista
     d  plácido   tiene usted pana azul       pana azul
       vive aquí  le preguntó  el sr  de estupiñá
       qué poca vergüenza
     pues apechuguemos con las  novedades   dijo isabel a su marido
     barbarita declaraba riendo que con estos teje manejes se había vuelto  sin saberlo  una doña beatriz galindo
     pero las niñas      y con estas modas de ahora y este suponer      viste la pieza de merino azul   pues no fue bastante
    
  3. According to UNICODE ORDER, valid set of characters ordered should be: a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, á, é, í, ñ, ó, ú, ü
  4. Discard words with fewer than three characters. Example: y, a, o, de, el, la,…

Input

The first line will have an integer N, which is the number of cases for the problem. Each case can be a word or a number. The output depends on the input as described in the next section.

Output

When the input is a word W, the number of instances of the word W followed by a space, the character ‘#’ and the ranking of that word.
When the input is a number R, the word with ranking R followed by a space and the number of instances of that word.

Sample Input

10
fortunata
jacinta
dios
amor
1
50
100
1000
colegio
ómnibus

Sample Output

Case #1: 874 #27

Case #2: 576 #41 Case #3: 461 #58 Case #4: 156 #220 Case #5: que 15616 Case #6: ser 517 Case #7: alma 309 Case #8: motivo 33 Case #9: 12 #2574 Case #10: 1 #29893

Explicación.

Cómo puedes ver la complejidad ha aumentado y la longitud del texto también. Pasemos a desmigar un poco el texto, para poder llevar a cabo su resolución con éxito.

Si empezamos por el input vemos que vamos a recibir un con el número de casos a resolver. Y que cada caso puede ser un número o una palabra.

Según la introducción del reto 3, esos números que recibimos se corresponden con una palabra en un ranking en el que las palabras del texto de Benito Perez Galdós. El ranking está compuesto por todas las palabras del texto ordenadas en número de ocurrencias, donde la primera será la que más ocurrencias tenga y la última la que menos. Y en caso de empate en ocurrencias deberemos recurrir al orden alfabético en UNICODE.

En caso de recibir una palabra en el input deberemos de obtener el ranking de esta.

Además, si seguimos leyendo, veremos que lo que he dicho en el párrafo anterior es una verdad a medias. En realidad no tendremos todas las palabras del texto, sino solo aquellas que superen estos criterios:

  1. Que estén formadas por las siguientes letras: a, b , c, d, e, f, g, h, i, j, k, l, m, n, ñ, o, p, q, r, s, t, u, v, w, x, y, z, á, é, í, ó, ú, ü.
  2. Deben ser palabras con una longitud de 3 o más letras.

Debemos de trabajar con las palabras en minúscula y poner espacios donde se encontraban las palabras descartadas por el primer criterio, interrogaciones y demás, tal y como se muestra en los ejemplos.

El output deberá ser de la siguiente forma:

  1. Si el input es una palabra W deberemos devolver el número de repeticiones y el ranking de la palabra:
    Case #1: 874 #27
  2. Si el input es un número R deberemos de devolver la palabra y el número de repeticiones:
    Case #5: que 15616

 

Una vez creáis tener la solución del reto 3 no olvidéis visitar el enlace al Challenge correspondiente en Tuenti que pongo al comienzo de cada entrada, ya que allí podréis descargaros los inputs y subir vuestros outputs para comprobar si vuestro programa pasa la prueba.

Con estas ideas claras ya podemos proceder a la resolución del ejercicio.

Resolución del reto 3.

En este caso tenemos muchas alternativas, pero si de verdad queremos trabajar con algo óptimo deberemos ponernos las pilas con las expresiones RegEx para hacer los cambios en el texto y el uso de diccionarios para no aumentar mucho el procesamiento del número de repeticiones de cada palabra.

Además habrá qué hacer algunos cambios para poder obtener las palabras ordenadas por numero de ocurrencias y orden alfabético UNICODE.

Por lo tanto la solución por la que yo opté fue la siguiente:

Posiblemente haya mejores formas de plantearlo, porque mi código de este reto me pareció un poco caótico, pero con mis conocimientos y la velocidad de resolución que requiere este challenge, esta fue a la solución a la que llegué.

No obstante, os animo a comentar vuestra solución si pensáis que resulta más fácil de comprender o si es más optima para la resolución de este ejercicio.

Un saludo y nos vemos en el próximo reto 😉

Por JGarciaz

Developer, Student, MSP, Tuenti Master

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.