s2Eva_IIT2017_T1 Citas San Valentin

Ejercicio: 2Eva_IIT2017_T1 Citas San Valentin

Propuesta de solución en Python:

# 2da Evaluación II Término 2017
# Tema 1. Citas San Valentin

def hayEmparejamiento(codigoP1, codigoP2, dicPersonas, aceptacion):
    tanimoto = 0
    aceptado = False
    gen1 = dicPersonas[codigoP1]['genero']
    gen2 = dicPersonas[codigoP2]['genero']
    caract1 = dicPersonas[codigoP1]['caracteristicas']
    caract2 = dicPersonas[codigoP2]['caracteristicas']
    tanimoto = len(caract1&caract2)/len(caract1|caract2)
    citaf = dicPersonas[codigoP1]['citas']['fallidas']
    citae = dicPersonas[codigoP1]['citas']['exitosas']
    if (gen1!=gen2 and
        tanimoto>=aceptacion and 
        not(codigoP2 in citaf) and
        not(codigoP2 in citae)):
        aceptado = True
    respuesta = (tanimoto,aceptado)
    return(respuesta)

def imprimirResultados(codigoPersona, dicPersonas,
                       aceptacionMinimo, aceptacionMaximo):
    narchivo = codigoPersona + '.txt'
    archivo = open(narchivo,'w')
    quienes = dicPersonas.keys()
    gen1 = dicPersonas[codigoPersona]['genero']
    for otra in quienes:
        gen2 = dicPersonas[otra]['genero']
        if (gen1 != gen2 and
            otra != codigoPersona):
            nombre = dicPersonas[otra]['nombre']
            linea = otra + '$' + nombre
            caract = dicPersonas[otra]['caracteristicas']
            cadena = ''
            for unacaract in caract:
                cadena = cadena + unacaract + ','
            cadena = cadena.strip(',')
            linea = linea + '$' + cadena
            tupla = hayEmparejamiento(codigoPersona, otra,
                                      dicPersonas, aceptacionMinimo)
            tanimoto = tupla[0]
            aceptado = tupla[1]
            linea = linea + '$' + str(tanimoto)
            responde = 'aceptar'
            if aceptado != False:
                responde = 'rechazar'
            linea = linea + '$' + responde + '\n'
            archivo.write(linea)
    archivo.close()
    respuesta = 'Archivos creados'
    return(respuesta)

def compatibles(codigoPersona, dicPersonas, aceptacion=0.43):
    respuesta={}
    quienes = dicPersonas.keys()
    gen1 = dicPersonas[codigoPersona]['genero']
    for otra in quienes:
        gen2 = dicPersonas[otra]['genero']
        if (gen1!= gen2 and otra != codigoPersona):
            tupla = hayEmparejamiento(codigoPersona, otra,
                                      dicPersonas, aceptacion)
            tanimoto=tupla[0]
            if tanimoto>=aceptacion:
                nombre2 = dicPersonas[otra]['nombre']
                caract2 = dicPersonas[codigoP2]['caracteristicas']
                citasf2 = len(dicPersonas[codigoP2]['citas']['fallidas'])
                respuesta[otra] = {'nombre':nombre2,
                                   'caracteristicas':caract2,
                                   'indice': tanimoto,
                                   'fallidas': citasf2
                                   }
    return(respuesta)

# PROGRAMA PRUEBA
# INGRESO datos de prueba
dicPersonas = {
    'p1021': {'nombre': 'Carlos S.',
              'genero': 'm',
              'caracteristicas': {'alegre',
                                  'fumador',
                                  'hacker',
                                  'deportista'},
              'citas': {'fallidas': ['P1902',
                                     'P2893',
                                     'P2310'],
                        'exitosas': ['P4025',
                                     'P1001']}
              },
    'p1001': {'nombre': 'Andrea V.',
              'genero': 'f',
              'caracteristicas': {'farrero',
                                  'programador',
                                  'fabuloso',
                                  'deportista'},
              'citas': {'fallidas': ['P1802'],
                        'exitosas': ['P1021',
                                     'P1002']}
              }
    }

codigoP1 = 'p1021'
codigoP2 = 'p1001'
aceptacionMin = 0.1
aceptacionMax = 0.8

# PROCEDIMIENTO
pareja = hayEmparejamiento(codigoP1,codigoP2, dicPersonas, aceptacionMin)
resultado = imprimirResultados(codigoP1, dicPersonas,
                               aceptacionMin, aceptacionMax)
posibles = compatibles(codigoP1, dicPersonas, aceptacionMin)

# Salida
print('emparejamiento de: ', codigoP1),
print(pareja)
print(resultado)
print('las parejas posibles: ')
print(posibles)