Underc0de

Programación Scripting => Python => Mensaje iniciado por: Once en Diciembre 08, 2017, 12:15:03 AM

Título: [TPC-R] Reto #1: Phonewords
Publicado por: Once en Diciembre 08, 2017, 12:15:03 AM
The Python Challenges
el regreso
Reto #1: phonewords

(http://www.geeksforgeeks.org/wp-content/uploads/phoneKeyboard.png)

La idea de este reto es implementar un script que reciba un string y sea capaz de convertir cada caracter del string a su respectivo número en el teclado de un teléfono.

Consideraciones


Ejemplos

Código (python) [Seleccionar]
codificar("Underc0de.org") - > 86337233674
codificar("Esto es una prueba") -> 3786 37 862 774322


Reglas


Este reto lo gana el script más rápido

Plantilla

Código (python) [Seleccionar]
def codificar(mensaje):
    return None


Enviar la solución por mp a @Once con el asunto: "[TPC-R] Reto #1". El reto cerrará el domingo a las 23:59 horas. Hora Colombiana.

Saludos!
Título: Re:[TPC-R] Reto #1: Phonewords
Publicado por: Once en Diciembre 08, 2017, 12:23:32 AM
Soluciones de los participantes (en orden de llegada):

@n1sendev (https://underc0de.org/foro/index.php?action=profile;u=68000)

Código (python) [Seleccionar]
#Script hecho para  el reto: [TPC-R] Reto #1: Phonewords. Underc0de.org
#Hecho por n1sendev, año 2017

def codificar(string):
    alfa_num = {'A':'2', 'B':'22', 'C':'222', 'D':'3', 'E':'33',
    'F':'333', 'G':'4', 'H':'44', 'I':'444', 'J':'5', 'K':'55', 'L':'555',
    'M':'6','N':'66', 'O':'666', 'P':'7', 'Q':'77', 'R':'777', 'S':'7777',
    'T':'8', 'U':'88', 'V':'888', 'W':'9', 'X':'99', 'Y':'999', 'Z':'9999',
    ' ':' '}

    with open("codificado.txt", 'w') as archivo:
        archivo.write("Inicio mensaje Codificado:\n")
        archivo.write("==============================\n")
       
        for char in string:
            for alfa in alfa_num:
                if char == alfa:
                    codi = alfa_num[char]
                    archivo.write(codi)
                else:
                    pass

        archivo.write("\n==============================\n")
        archivo.write("Fin mensaje codificado")

    print('\nSe ha guardado el texto codificado en el archivo "codificado.txt"')
    return None

def main():
    string_org = input("Introduce una cadena para codificar: ")
    codificar(string_org.upper())

if __name__ == '__main__':
    main()


Observaciones: Primero, el reto no cumple con la plantilla y segundo, @n1sendev entendió mal el reto y el código no hace lo que se pide.

@cr4id3r

Código (python) [Seleccionar]
import re

CONVERSION_DICT = {
        '1': '',
        '2': 'ABC',
        '3': 'DEF',
        '4': 'GHI',
        '5': 'JKL',
        '6': 'MNO',
        '7': 'PQRS',
        '8': 'TUV',
        '9': 'WXYZ',
}


def codificar(mensaje):
        if mensaje:
                string_to_return = re.sub('[^A-Z| ]', '', mensaje.upper())
       
                for conversion_key, conversion_value in CONVERSION_DICT.items():
                        if conversion_value:
                                replace_pattern = '[' + '|'.join([letter for letter in conversion_value]) + ']'
                                string_to_return = re.sub(replace_pattern, conversion_key, string_to_return)
                       
                return string_to_return
        else:
                print("Need a string to convert")




if __name__ == '__main__':
        desired_conversion = input('Introduce el string:  ')
        print(codificar(desired_conversion))


Observaciones: Usa ocho espacios como identación, no cumple con las PEP8

@po6xsecpo

Código (python) [Seleccionar]
pad = {
    "a":2,"d":3,"g":4,"j":5,"m":6,"p":7,"s":7,"v":8,
    "b":2,"e":3,"h":4,"k":5,"n":6,"q":7,"t":8,"w":9,
    "c":2,"f":3,"i":4,"l":5,"o":6,"r":7,"u":8,"x":9,
    "y":9,"x":9}

def codificar(mensaje):
    converted = list()
    for c in mensaje:
        try:
            converted.append(pad[c.lower()])
        except:
            if(c==" "):converted.append(c)
    converted =''.join([str(c) for c in converted])
   


Observaciones: No cumple con la plantilla. Olvidó retornar el valor

@larry852

Código (python) [Seleccionar]
def codificar(mensaje):
    letras = '--abc-def-ghi-jkl-mno-pqrs-tuv-wxyz'
    teclado = letras.split('-')
    respuesta = ''

    for letra in mensaje:
        for index, tecla in enumerate(teclado):
            if letra == ' ':
                respuesta += ' '
                break
            elif tecla is not None and letra.lower() in tecla:
                respuesta += str(index)
                break

    return respuesta


print("Underc0de.org --> " + codificar("Underc0de.org"))
print("$$$$$$Underc0de.org$$$$$$ --> " + codificar("$$$$$$Underc0de.org$$$$$$"))
print("Esto es una prueba --> " + codificar("Esto es una prueba"))


Observaciones: N/A

Puntaje

Señores, ya los scripts están evaluados, no los publico ahora mismo porque aún me falta contar con los bonos y las penalizaciones. Lo que les puedo decir es que se realizaron seis pruebas para verificar que los scripts cumplieran los requisitos, cada una de estas pruebas se corrió 100 veces, se midió el tiempo de ejecución y se tomó el promedio.

Una vez calculado el promedio de ejecución, el puntaje para la prueba se calculó usando la función: e^(-t) donde t es el promedio de ejecución del script.

Saludos!
Título: Re:[TPC-R] Reto #1: Phonewords
Publicado por: Once en Diciembre 11, 2017, 12:37:43 PM
REsultados

Bueno señores, estás son las pruebas, lastimosamente @n1sendev (https://underc0de.org/foro/index.php?action=profile;u=68000) no pasó ninguna

(https://imgur.com/2f7LbECl.png)

Lástimosamente para este reto hubo penalizaciones:
@Cr4id3r (https://underc0de.org/foro/index.php?action=profile;u=29249) por usar identaciones a ocho espacios 0.0005 s
@po6xsecpo (https://underc0de.org/foro/index.php?action=profile;u=37409) por no cumplir con la plantilla: 0.0005 s

Los puntos por elegancia en la solución se los llevó: @larry852 (https://underc0de.org/foro/index.php?action=profile;u=50833) 0.0005 s

Al final, la ecuación para calcular el puntaje es: e^-(t-bonificacion+penalizacion)

Los resultados entonces son:

(https://imgur.com/9YIvitul.png)


  • larry852
  • po6xsecpo
  • Cr4id3r

Ganados
@larry852 (https://underc0de.org/foro/index.php?action=profile;u=50833)

Estad pendientes, el miércoles sale otroo reto, esta vez una más clásico.

Saludos!
Título: Re:[TPC-R] Reto #1: Phonewords
Publicado por: D3ivid en Diciembre 18, 2017, 02:03:15 PM
Felicidades tanto a los participantes, como al ganador, y al staff :)
Título: Re:[TPC-R] Reto #1: Phonewords
Publicado por: BlueNet en Diciembre 19, 2017, 09:22:56 AM
que acaban de ver mis ojos!!  :D :D
¿cada cuánto tiempo salen estos retos?
recién acabo de verlo y la verdad que interesantes si están  ;D
Título: Re:[TPC-R] Reto #1: Phonewords
Publicado por: Once en Diciembre 19, 2017, 01:25:54 PM
No tienes permitido ver enlaces. Registrate o Entra a tu cuenta
que acaban de ver mis ojos!!  :D :D
¿cada cuánto tiempo salen estos retos?
recién acabo de verlo y la verdad que interesantes si están  ;D

Hola @BlueNet (https://underc0de.org/foro/index.php?action=profile;u=63096), la idea es que salgan dos por semana, los miércoles unos retos "cortos" y los viernes retos un poco más largos, el segundo reto se ha tardado un poco porque un usuario tenía una idea, pero no hemos logrado cuadrar nada.

Estate pendiente que igual hoy por la tar o máximo mañana sale el segundo reto.

Saludos!
Título: Re:[TPC-R] Reto #1: Phonewords
Publicado por: coderdeco en Febrero 26, 2018, 02:51:03 AM
Recien acabo de llegar al foro y parece que el reto a terminado... De igual forma dejo otra solucion mas,  Ojala haya mas retos!

Código (python) [Seleccionar]

#!/usr/bin/env python

def encode(text):
    result = ''
    keys = ['abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv,' 'wxyz']
    for char in text:
        result += ' ' if char == ' ' else ''
        for i, key in enumerate(keys):
            result += str(i+2) if char.lower() in key else ''
    return result

print 'Undercode.org', '->', encode('Undercode.org')
print 'Esto es una prueba', '->', encode('Esto es una prueba')