LINUX.ORG.RU
ФорумTalks

Анекдот на Python


0

0

Вот блин показл одному знакомому Питон, теперь достаёт, скажи говорит что здесь не правильно:

''' def read(): file=open("Matrix") matrix[x.split(' ') for x in File(file)] trans=lambda X:map(list,apply(map,[None]+X)) matr=trans(matrix) return matr '''

M=[[3,5],[1,4],[2,5],[1,2,3],[2,4]]

def all(ver=1,gam_cir=[]): a=filter(lambda x:x>0,M[ver]) for okr in a: gam_cir.append(M[ver][okr]) break if not a: for i in M[ver]: i=map(abs,i) all(gam_cir[len(gam_cir)-1:],gam_cir[:-1]) ver=M[ver][okr] M[ver][okr]=-M[ver][okr] if gam_cir[:1]==abs(okr) and len(gam_cir)==len(M)+1: spis.append(gam_cir) elif okr not in gam_cir: all(ver,gam_cir) else: for okr in M[ver]: okr=map(abs,okr) all(gam_cir[len(gam_cir)-1:],gam_cir[:-1]) return spis def main(): #M=read() spis=all() if spis: print "Poluchennye gamil`tonovy cikly:", spis else: print "Gamil`tonovy cikly ne polucheny"

main()

★★★

'''
def read():
    file=open("Matrix")
    matrix[x.split(' ') for x in File(file)]
    trans=lambda X:map(list,apply(map,[None]+X))
    matr=trans(matrix)
    return matr
'''

M=[[3,5],[1,4],[2,5],[1,2,3],[2,4]]

def all(ver=1,gam_cir=[]):
    a=filter(lambda x:x>0,M[ver])
    for okr in a:
       gam_cir.append(M[ver][okr])
       break
    if not a:
        for i in M[ver]:
            i=map(abs,i)
        all(gam_cir[len(gam_cir)-1:],gam_cir[:-1])
    ver=M[ver][okr]
    M[ver][okr]=-M[ver][okr]
    if gam_cir[:1]==abs(okr) and len(gam_cir)==len(M)+1:
        spis.append(gam_cir)
    elif okr not in gam_cir:
        all(ver,gam_cir)
    else:
        for okr in M[ver]:
            okr=map(abs,okr)
        all(gam_cir[len(gam_cir)-1:],gam_cir[:-1])
    return spis            
            
def main():
    #M=read()
    spis=all()
    if spis:
        print "Poluchennye gamil`tonovy cikly:", spis
    else:
        print "Gamil`tonovy cikly ne polucheny"

main()    

CrazyPit ★★★
() автор топика
Ответ на: комментарий от CrazyPit

1) обычно графы в питоне принято представлять dict-ами

2)
    for okr in a:
       gam_cir.append(M[ver][okr])
       break                 ^^^^^
okr это элемент из M[ver], а не индекс этого элемента.
поскольку стоит break, проще было бы написать

    if a: gam_cir.append(a[0])

3)       
     all(gam_cir[len(gam_cir)-1:],gam_cir[:-1])

функция all вызывается со списком на месте первого аргумента,
тогда как там предполагается целое число

то же самое здесь:

    if gam_cir[:1]==abs(okr) and len(gam_cir)==len(M)+1:

список сравнивается с числом.

надо объяснить товарищу, что последний элемент списка берется через
l[-1], и чем это отличается от l[-1:]. аналогично про l[0] и l[:1]


по-моему нормальная программа для начинающего, ничего анекдотического

а насчет работы с графами полезно прочитать вот этот текст
http://www.python.org/doc/essays/graphs.html

ID19999
()

Вот прикол:
for i in M[ver]:
            i=map(abs,i)

Я ему два раза объяснял зачем нужен map, и сказал, что если не понял то не надо его юзать.

Вот тоже:
    matrix[x.split(' ') for x in File(file)]
    trans=lambda X:map(list,apply(map,[None]+X))

Беда в том что человек пытается использовать разные фичи не вникнув в их суть. 

Но самый анекдот если разбирать как (не)работает эта прога и что она должна делать (метод Робертса-Флоренса по нахождению Гамильтонова цикла)

CrazyPit ★★★
() автор топика
Ответ на: комментарий от CrazyPit

> Но самый анекдот если разбирать как (не)работает эта прога и что она должна делать (метод Робертса-Флоренса по нахождению Гамильтонова цикла)

честно говоря, не хочется вникать, слишком неаккуратно написано.
по крайней мере задача вменяемая, а не парсинг xml левой пяткой

ID19999
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.