ayuda con python

Iniciado por Cache01, 3 Abril 2014, 07:57 AM

0 Miembros y 1 Visitante están viendo este tema.

Cache01

No se como hacer el siguiente problema!!!!

Dada una lista de palabras, se pide encontrar un ordenamiento circular de las mismas en el cual una palabra B puede suceder a otra A si la primer letra de B es igual a la última letra de A. El ordenamiento debe ser circular (toda palabra debe tener una que la antecede y una que la sucede) y completo (debe incluir a todas las palabras de la lista). En caso de no existir un ordenamiento se debe informar "No existe ordenamiento

ej
entrada:
arbol
orden
susana
otro
listo
nexos

la salida seria:
susana
arbol
listo
otro
orden
nexos

archivo
http://www.oia.org.ar/_media/prob/c3a02n3p1.pdf

tincopasan

vamos por partes!
1) el tema dice "ayuda en python" así que dinos en que sentencias tienes problemas
2) usas 2.x o 3.x
3) tienes difinido algo de la función o esperas todo del foro?
4) quizá necesitas solo el seudocódigo con la solución
5) podrías empezar con algo como:
    pedir las palabras a ordenar        : perro,casa,reloj,orden, etc
    cada una de ellas es una cadena
    tomar la primera letra de la primer cadena (p,perro)
    buscar esa letra en la última letra de las cadenas restantes (no está)
    sino está tendría que ser la primera ordenada
    buscar la ultima letra de la cadena y buscar la primera de las restantes
    ver cuantas posibles hay                      (o, perro coincide o,orden)
    sino coincide con alguna es imposible ordenar
    repetir con la segunda cadena
    sino coincide con ninguna ya no es posible ordenar
   etc.
6)si avanzas hasta ahí y muestras tus progresos seguro que los que más saben te ayudan con gusto.
7) dudo que alguien quiera hacer todo por ti!
   

Cache01

El problema que tengo es que no se como relacionar las palabras con los inicios y los finales

inicios=[]
finales=[]
juntos=[]
palabras=[]
try:
    x=int(input("Digite 1 para ingresar palabra o 2 para finalizar "))
    while x==1 and x!=2:
         palabra=input("Digite la palabra a ingresar ")
         palabra=str.lower(palabra)
         inicio=palabra[0]
         inicios.append(inicio)
         final=palabra[len(palabra)-1]
         finales.append(final)
         palabras.append(palabra)
         for i in range (0,len(inicios)-1):
             for a in range(0,len(finales)-1):
                 if i==a:
                     juntos.append(inicios)
                     juntos.append(finales[a])
                     print(juntos)
         
             x=int(input("Digite 1 para ingresar palabra o 2 para finalizar "))
    else:
        print("Programa finalizado")
except:
    print("error dato invalido")

tincopasan

a ver:
ok se me ocurre lo siguiente:
tenes 2 listas
A) [a,l,n,o,o,s] primera letra de arbol listo nexos orden otro susana
B) [l,o,s,n,o,a] ultima letra de arbol listo nexos orden otro susana

siendo arbol la primer palabra de la lista busco la 2 para la solucion

1) buscar l (letra final de arbol e inicio de la próxima) en A hay 1 sola asi que la segunda palabra es listo
buscar o (letra final de listo e inicio de la proxima) en A hay 2
2) comparar que la letra final de la palabra encontrada sea distina de la misma de inicio
si son iguales o sea: o(A) y o (B) usar esa primero porque sigue dando como siguiente letra de inicio o otro
sino son iguales usar cualquiera! orden
repetir 1)
repetir 2)

y listo! 

como escribis el código no me meto porque no hay error en la sintaxis, solo distintos métodos de programación y cada uno elige la que quiere!

tincopasan

Hola de nuevo! no tengo mucho tiempo (ni ganas jeje) pero hice un código para que veas más o menos a que me refiero, espero te oriente!:
:CODE/
Lista=["nexos","arbol","listo","orden","susana"]
ListaFinal=[]
Orden= 0
LetrasInicio=[]
LetrasFinal=[]

def buscarElemento(lista, elemento):
    for i in range(0,len(lista)):
        if(lista == elemento):
            return i
           
print("Lista Original",Lista)
for i in Lista:
      LetrasInicio.append (i[0])   #letra inicial
      LetrasFinal.append(i[-1])     #letra final

ListaFinal.append (Lista[0]) #agrega palabra desde el lugar 0
for letras in LetrasFinal:
   LetraSiguientePalabra= buscarElemento(LetrasInicio,LetrasFinal[Orden])
   Repetido= LetrasInicio.count(LetrasFinal[Orden])  #busca si se repite la letra final en la letra inicial
   if Repetido== 1:
      SiguientePalabra= Lista[LetraSiguientePalabra]   
       ListaFinal.append(SiguientePalabra)
      Orden = LetraSiguientePalabra

ListaFinal.pop()
print ("Lista Ordenada",ListaFinal)

:\\CODE

Obvio que falta si está repetida una letra, pero mostrá avances y alguien que sepa(no es mi caso) te ayudará!

Cache01

Muchas Gracias !!!!!!! si le pude hacer pero con distintas funciones, en caso que de q quieras ver el codigo me avisas y te lo envio!!!!!!!