def mprint(data,w=4,h=4):
    for i,v in enumerate(data):
        if i % w ==0:
            print()
        print(v,end=",")
    print()
    print("----")

sleep = 0
if __name__ == "__main__":
    sleep = 0.01321

print("y--")
class DIR():
    def __init__(self,w=4,h=4,w_min=0,h_min=0):
        self.d = 0
        self.w= w
        self.h= h

        self.x_max= w
        self.y_max= h

        self.x_min= w_min
        self.y_min= h_min
        self.x = 0 #//2
        self.y = 0 #//2
        self.i = 0
        self.i_max = self.x_max*self.y_max

    def get(self):
        if self.i >= self.i_max:
            return None # end
        out = self.x,self.y*self.w
        self.i += 1
        return out

    def right_reset(self):
        self.x = self.x_min
    def left_reset(self):
        self.x = self.x_max -1
    def down_reset(self):
        self.y = self.y_min
    def up_reset(self):
        self.y = self.y_max -1
    def right(self):
        if self.x < self.x_max-1:
            self.x+=1
            return 1
    def down(self):
        if self.y < self.y_max-1:
            self.y+=1
            return 1
    def up(self):
        if self.y > self.y_min:
            self.y-=1
            return 1
    def left(self):
        if self.x > self.x_min:
            self.x-=1
            return 1

    def x(self):
        return self.out
 
data = [ "1A","1B" ,"1C","1D","2A","2B","2C","2D","3A","3B","3B","3D"]



def right(w,h):
    out = ["----"] *(w*h) #*w*h
    d = DIR(w=w,h=h)
    r = d.get()
    i = 0
    import time
    while type(r) is not type(None):
        x,y = r
        #print("r",r,x,y, d.i)
        #out[x+y] = i 
        out[x+y] = "{:-4}".format(i) 
        if sleep:
            mprint(out,w,h)
        r=d.right()
        #print(r)
        if not r:
            d.right_reset()
            d.down()

        r = d.get()
        i += 1
        time.sleep(sleep)
    return out

if __name__ == "__main__":
    w = 40
    h = 30
    #out = right(w,h)
    #mprint(out,w,h)

def left(w,h):
    #mprint(data,w,h)


    out = ["----"] *(w*h) #a+2
    d = DIR(w=w,h=h)
    #d.up_reset()
    d.left_reset()
    r = d.get()
    i = 0
    import time
    while type(r) is not type(None):
        x,y = r
        #print("r",r,x,y, d.i)
        #out[x+y] = i 
        out[x+y] = "{:-4}".format(i) 
        #mprint(out,w,h)
        if sleep:
            mprint(out,w,h)
        r=d.left()
        #print(r)
        if not r:
            d.left_reset()
            #d.up()
            d.down()

        r = d.get()
        i += 1
        #time.sleep(.0151)
        time.sleep(sleep)
    return out

if __name__ == "__main__":
    w = 40
    h = 30
    #out = left(w,h)
    #mprint(out,w,h)


def up(w,h):
    #mprint(data,w,h)


    out = ["----"] *(w*h) #a+2
    d = DIR(w=w,h=h)
    #d.up_reset()
    d.up_reset()
    r = d.get()
    i = 0
    import time
    while type(r) is not type(None):
        x,y = r
        #print("r",r,x,y, d.i)
        #out[x+y] = i 
        out[x+y] = "{:-4}".format(i) 
        #mprint(out,w,h
        if sleep:
            mprint(out,w,h)
        r=d.up()
        #print(r)
        if not r:
            d.up_reset()
            #d.up()
            d.right()

        r = d.get()
        i += 1
        #time.sleep(.0151)
        time.sleep(sleep)
    return out

if __name__ == "__main__":
    w = 40
    h = 30
    #out = up(w,h)
    #mprint(out,w,h)




def down(w,h):
    #mprint(data,w,h)


    out = ["----"] *(w*h) #a+2
    d = DIR(w=w,h=h)
    #d.up_reset()
    d.down_reset()
    r = d.get()
    i = 0
    import time
    while type(r) is not type(None):
        x,y = r
        #print("r",r,x,y, d.i)
        #out[x+y] = i 
        out[x+y] = "{:-4}".format(i) 
        #mprint(out,w,h)
        if sleep:
            mprint(out,w,h)

        r=d.down()
        #print(r)
        if not r:
            d.down_reset()
            #d.up()
            d.right() #left()

        r = d.get()
        i += 1
        #time.sleep(.0151)
        time.sleep(sleep)
    return out

if __name__ == "__main__":
    w = 40
    h = 30
    #out = down(w,h)
    #mprint(out,w,h)





def spiral(w=10,h=4):
    mprint(data,w,h)


    out = ["----"] *(w*h) #*30 #*w*h+2
    d = DIR(w=w,h=h)
    d.up_reset()
    d.left_reset()
    r = d.get()
    i = 0
    import time
    q = 0
    while type(r) is not type(None):
        x,y = r
        #print("r",r,x,y, d.i)
        out[x+y] = "{:-4}".format(i) 
        #mprint(out,w,h)

        if sleep:
            mprint(out,w,h)
        if q == 0:
            m=d.left()
            #print(m)
            if not m:
                q+=1
                d.x_min += 1
        if q == 1:
            m=d.up()
            if not m:
                q+=1
                d.y_min += 1
        if q == 2:
            m=d.right()
            if not m:
                q+=1
                d.y_max -= 1
        if q == 3:
            m=d.down()
            if not m:
                d.left()
                q=0
                d.x_max -= 1
            

        r = d.get()
        i += 1
        #time.sleep(.01)
    return out

if __name__ == "__main__":
    w = 10
    h = 40
    #out = spiral(w,h)
    #mprint(out,w,h)






def left_right(w=10,h=4):
    mprint(data,w,h)


    out = ["----"] *(w*h) #*30 #*w*h+2
    d = DIR(w=w,h=h)
    d.down_reset()
    d.left_reset()
    r = d.get()
    i = 0
    import time
    q = 0
    while type(r) is not type(None):
        x,y = r
        #print("r",r,x,y, d.i)
        out[x+y] = "{:-4}".format(i) 

        if sleep:
            mprint(out,w,h)

        if q == 0:
            m=d.left()
            #print(m)
            if not m:
                q+=1
                d.down()
        elif q == 1:
            m=d.right()
            if not m:
                q=0
                d.down()
            

        r = d.get()
        i += 1
        time.sleep(sleep)
    return out

if __name__ == "__main__":
    w = 10
    h = 40
    out = left_right(w,h)
    mprint(out,w,h)

    #def dubble_spiral():
    #    pass
    #dubble_spiral()


def up_down(w=10,h=4):
    mprint(data,w,h)


    out = ["----"] *(w*h) #*30 #*w*h+2
    d = DIR(w=w,h=h)
    d.up_reset()
    d.left_reset()
    r = d.get()
    i = 0
    import time
    q = 0
    while type(r) is not type(None):
        x,y = r
        #print("r",r,x,y, d.i)
        out[x+y] = "{:-4}".format(i) 

        if sleep:
            mprint(out,w,h)

        if q == 0:
            m=d.up()
            #print(m)
            if not m:
                q+=1
                d.left()
        elif q == 1:
            m=d.down()
            if not m:
                q=0
                d.left()
            

        r = d.get()
        i += 1
        time.sleep(sleep)
    return out

if __name__ == "__main__":
    w = 40
    h = 20
    out = up_down(w,h)
    mprint(out,w,h)