py_compress_decompress · Python
▶ Aprender py_compress_decompress (Python) paso a paso · explicación de py_compress_decompress
Código línea a línea
Tres columnas: el código, el trozo del subject o del main que obliga a escribir esa línea, y el por qué.
py_compress_decompress.py
| Código | Subject | Por qué |
|---|---|---|
def compress(s: str) -> str: | `compress(s: str) -> str`: | Firma tal cual la pide el subject: nombre, parámetro y tipo de retorno. |
out = "" | return an empty string | Acumulador vacío: si s está vacío, sale tal cual. |
i = 0 | Índice del carácter que empieza la racha. | |
while i < len(s): | consecutive repeated characters | Recorro racha a racha, no carácter a carácter: i salta al final de cada racha. |
j = i | j avanza mientras el carácter sea el mismo que en i. | |
while j < len(s) and s[j] == s[i]: | consecutive repeated characters | Primero el límite, luego la comparación: así s[j] nunca se sale. |
j += 1 | Un carácter más en la racha. | |
run = j - i | appending the count after the character | Longitud de la racha = cuántas veces se repite. |
out += s[i] if run == 1 else s[i] + str(run) | If a character appears only once consecutively, omit the number '1'. | Racha de 1 → solo la letra. Si no, letra + número (en texto, str). |
i = j | Siguiente racha empieza donde acabó esta. | |
return out | Devuelvo, no imprimo: el corrector compara el valor devuelto. | |
| ||
| ||
def decompress(s: str) -> str: | `decompress(s: str) -> str`: | Segunda función en el mismo fichero: se corrigen juntas. |
out = "" | return an empty string | Acumulador vacío: si s está vacío, sale tal cual. |
i = 0 | Índice del carácter que empieza la racha. | |
while i < len(s): | consecutive repeated characters | Recorro racha a racha, no carácter a carácter: i salta al final de cada racha. |
ch = s[i] | expands it back to its uncompressed form | La letra actual. |
i += 1 | Avanzo: lo que venga ahora son dígitos (o la siguiente letra). | |
digits = "" | Handles multi-digit counts | Los dígitos se acumulan como texto porque pueden ser varios ("12"). |
while i < len(s) and s[i].isdigit(): | Handles multi-digit counts (e.g., "a12" -> 12 'a's). | Trago todos los dígitos seguidos. isdigit evita int() sobre una letra. |
digits += s[i] | Un dígito más al número. | |
i += 1 | Avanzo: lo que venga ahora son dígitos (o la siguiente letra). | |
out += ch * (int(digits) if digits else 1) | If no count follows a character, it counts as 1. | Sin dígitos → 1 copia. str * int repite la letra. |
return out | Devuelvo, no imprimo: el corrector compara el valor devuelto. |