CheckSum CheckSum
Elementary
EN Spanish

Los errores durante una transcripción son bastante comunes. Pulsaciones no intencionales de teclas pueden hacer que los caracteres sean reorganizados, omitidos o insertados en un texto tecleado manualmente.

Por suerte para los robots, tú tienes herramientas para solucionar este tipo de problemas. Tu módulo CheckSum ayuda a reducir la probabilidad de errores mediante la introducción de un carácter final que se calcula a partir de los caracteres anteriores. Con un procedimiento adecuado, el carácter final siempre se puede calcular, de manera que, cuando se completa una entrada, puedes verificar instantáneamente que el carácter final coincide con el carácter predicho por CheckSum. Si los dos no coinciden, la entrada es rechazada. El resultado al final es que reduces los errores de entrada de datos.

¿Cómo funciona CheckSum?:

Para implementar CheckSum necesitarás una tabla 'map point character lookup'. Dicha tabla es simplemente, una búsqueda de definiciones sobre como procesar la información necesaria para generar el carácter final (que nos permitirá verificar al instante si nuestra entrada es correcta). En otras palabras, para cada secuencia de caracteres de una entrada, estamos seguros de que sólo puede haber una entrada posible, y todo gracias al carácter final.

Los pasos que debes seguir para obtener el carácter final son los siguientes:
  1. Atraviesa una entrada de derecha a izquierda, y aplica 'map point character lookup' a cada carácter con índice par.
  2. Suma los resultados que obtuviste en el paso anterior, con los dígitos que no fueron cambiados (índice impar), del número original.
  3. Encuentra el residuo de esta suma dividida por 10. Por ejemplo, para una suma igual a 67, el residuo es 7 (67 módulo 10 = 7).
  4. Tu carácter final deberá ser 0 si la suma es un múltiplo de 10. En caso contrario, deberá ser igual a 10 menos el residuo.
Para generar la tabla 'map point character lookup':
  1. Duplica el valor de un carácter.
  2. Si el producto de esta operación es mayor que 9 (por ejemplo: 7 * 2 = 14), redúcelo sumando los dígitos del producto, (ejemplo 10: 1 + 0 = 1, 14: 1 + 4 = 5). Nota: Esto sólo deberás hacerlo una vez, incluso si la suma resultante es mayor que 9.

¿Podrías darme un ejemplo por favor?

Por supuesto. Dale un vistazo a este ejemplo para un número de cuenta (ficticio): "7992739871". Vamos a añadir el carácter final a esta entrada, lo cual resulta en algo así como: "7992739871x," siendo x el carácter final que debemos encontrar.

A continuación puedes ver como se construye un 'map point character... para dígitos del 0 al 9:



Y así es como calculamos nuestro carácter final:

Index : 0 1 2 3 4 5 6 7 8 9
Reversed : 1 7 8 9 3 7 2 9 9 7
From table : 2 7 6 4 9 Total: 67
Unchanged : 7 9 7 9 7
Final Character : 10 - ( 67 % 10 ) = 10 - 7 = 3

Así, podríamos transmitir el número de cuenta de la siguiente manera: 799 273 9871 3

Entradas alfanuméricas

Para hacer esto más interesante, podríamos utilizar entradas alfanuméricas, que corresponden a posibles combinaciones de 10 dígitos y 26 letras mayúsculas. Esto significa que tenemos que actualizar nuestro map point, para que pueda tabular letras. ¿Cómo lo logramos? Una alternativa es utilizar el valor ASCII de cada carácter y usar este valor para completar nuestra tabla. Ten en cuenta que para determinar su secuencia en nuestro mapa, siempre tendremos que restar 48.

Por ejemplo: "A" tiene un valor ASCII 65, y en nuetro 'map point character lookup' le asignamos 7. Ya que 65-48 = 17, 17 * 2 = 34 y 3 + 4 = 7. NOTA: Recuerda que sólo aplicas 'map point character lookup' a caracteres con índice par. Si ' A ' corresponde a un carácter con índice impar, su valor es 17, (65-48=17).

Ejemplo con entradas alfanuméricas

Muy bien, aquí tenemos otro ejemplo: "139MT". Veamos cómo podemos obtener el carácter final ...

Reversed : T M 9 3 1
Sum of digits : 9 29 9 3 2 Total: 52
Final Character : 10 - ( 52 % 10 ) = 10 - 2 = 8

A continuación explicamos en detalle como lo obtuvimos:

  • T:  ASCII = 84, 84 - 48 = 36, 36 * 2 = 72, y 7 + 2 = 9
  • M:  ASCII = 77, y 77 - 48 = 29
  • 9:  Según nuestra tabla 'map point character lookup' es 9. También se podría usar el valor ASCII = 57, 57 - 48 = 9, 9 * 2 = 18, y 1 + 8 = 9
  • 3:  Simplemente 3, ya que su índice es impar , ó ASCII = 51, y 51 - 48 = 3
  • 1:  Según nuestra tabla 'map point character lookup' es 2 , ó ASCII = 49, 49 - 48 = 1, and 1 * 2 = 2
  • La suma de los dígitos es 52, 9 + 29 + 9 + 3 + 1 = 52
  • Y nuestro carácter final es 8, ya que 10 - ( 52 % 10 ) = 10 - 2 = 8

¡Ahora es el momento de probar tu módulo CheckSum!

Datos de Entrada: Cadenas (str) con valores alfanuméricos.

Salida: una lista con dos elementos: el carácter final, como una cadena (str) y la suma de los dígitos correspondiente.

Ejemplo:

checkio("799 273 9871") == ["3", 67]
checkio("139-MT") == ["8", 52])
checkio("123") == ["0", 10])
checkio("999_999") == ["6", 54])
checkio("+61 820 9231 55") == ["3", 37])
checkio("VQ/WEWF/NY/8U") == ["9", 201])
You should be an authorized user in order to see the full description and start solving this mission.