пятница, 11 февраля 2011 г.

Ханойские башни на Питоне

Несколько программ, бесполезно пылятся на моём жестком диске несколько лет, они могли бы быть кому нибудь интересны . Буду их по немного выкладывать здесь.
Например решение ханойской башни.


Есть три параметра:
  • Количество колец
  • Задержка для каждого шага
  • На какую сторону перекладывать



    from os import system
    from time import sleep
    stack1=[]
    stack2=[]
    stack3=[]
    def fill(s1,x):
        i=x
        while i>0:
            s1.append(i)
            i=i-1
    def move(row,direct):
        if row==1:
            if direct==1:
                stack2.append(stack1.pop())
            if direct==0:
                stack3.append(stack1.pop())
        if row==2:
            if direct==1:
                stack3.append(stack2.pop())
            if direct==0:
                stack1.append(stack2.pop())
        if row==3:
            if direct==1:
                stack1.append(stack3.pop())
            if direct==0:
                stack2.append(stack3.pop())
    def request(row,direct):
        if row==1:
            if direct==1:
                s1=stack1
                s2=stack2
            if direct==0:
                s1=stack1
                s2=stack3
        if row==2:
            if direct==1:
                s1=stack2
                s2=stack3
            if direct==0:
                s1=stack2
                s2=stack1
        if row==3:
            if direct==1:
                s1=stack3
                s2=stack1
            if direct==0:
                s1=stack3
                s2=stack2
        if s1==[]:
            return 0
        elif s2==[]:
            return 1
        v1=s1.pop()
        s1.append(v1)
        v2=s2.pop()
        s2.append(v2)
        if v1>v2:
            return 0
        elif v1<v2:
            return 1
        else:
            return -1
            print "XYNTA"
    def draw():
        try:
             system('cls')
        except:
             system('clear')
        print stack1
        print stack2
        print stack3
    def countstep(rang):
        j=2
        result=1
        rang=rang+1
        while j<rang:
            result=result*2+1
            j=j+1
        print '\n\nMESSAGE: Counting will take',result+2,'steps.'
        sleep(2)
        return result+2
    def solve(start,numer,direct,timesleep):
        i=1
        j=0
        if numer%2==0:
            if direct==2: dir=0
            elif direct==3: dir=1
        else:
            if direct==2: dir=1
            elif direct==3: dir=0
        parity=start
        numer=countstep(rang)
        for i in range(1,numer):
            draw()
            print ('\n\n')
            print 'Step #:',i
            sleep(timesleep)
            if i%2==0:
                var1=parity+1
                if var1>3: var1=1
                var2=parity-1
                if var2<1: var2=3
                if request(var1,1)==1:
                    move(var1,1)
                    continue
                elif request(var1,0)==1:
                    move(var1,0)
                    continue
                elif request(var2,1)==1:
                    move(var2,1)
                    continue
                elif request(var2,0)==1:
                    move(var2,0)
                    continue
            else:
                if dir==1:
                    move(parity,1)
                    parity=parity+1
                    if parity>3: parity=1
                    continue
                elif dir==0:
                    move(parity,0)
                    parity=parity-1
                    if parity<1: parity=3
                    continue
    rang=input("Enter range(1-XX):")
    timesleep=input("Input Sleep Time(0.0-X.X):")
    side=input("Input OUT side(2 or 3):")
    fill(stack1,rang)
    solve(1,rang,side,timesleep)
    exit=input('\nPress any key for exit ')

    4 комментария:

    1. много надо времени чтобы питон освоить?

      ОтветитьУдалить
    2. Сам язык сверх легкий, разве что конструкции массива-цикла особенные.

      ОтветитьУдалить
    3. Ханю~кские башни :3. Покормил колечком, протри башенку.

      ОтветитьУдалить
    4. def Hanoi(n, A, C, B):
      if n != 0:
      Hanoi(n - 1, A, B, C)
      print 'Move the plate from', A, 'to', C
      Hanoi(n - 1, B, C, A)

      ОтветитьУдалить