<p>The string <code>&quot;PAYPALISHIRING&quot;</code> is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)</p>

<pre>
P   A   H   N
A P L S I I G
Y   I   R
</pre>

<p>And then read line by line: <code>&quot;PAHNAPLSIIGYIR&quot;</code></p>

<p>Write the code that will take a string and make this conversion given a number of rows:</p>

<pre>
string convert(string s, int numRows);
</pre>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;PAYPALISHIRING&quot;, numRows = 3
<strong>Output:</strong> &quot;PAHNAPLSIIGYIR&quot;
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;PAYPALISHIRING&quot;, numRows = 4
<strong>Output:</strong> &quot;PINALSIGYAHRPI&quot;
<strong>Explanation:</strong>
P     I    N
A   L S  I G
Y A   H R
P     I
</pre>

<p><strong class="example">Example 3:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;A&quot;, numRows = 1
<strong>Output:</strong> &quot;A&quot;
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= s.length &lt;= 1000</code></li>
	<li><code>s</code> consists of English letters (lower-case and upper-case), <code>&#39;,&#39;</code> and <code>&#39;.&#39;</code>.</li>
	<li><code>1 &lt;= numRows &lt;= 1000</code></li>
</ul>

from dataclasses import dataclass

class Solution:
    def convert(self, s: str, numRows: int) -> str:

        if numRows == 1: return s
        
        @dataclass
        class Point:
            x: int
            y: int
        
            def __add__(self, other):
                    return Point(self.x + other.x, self.y + other.y)

            def __lt__(self, other):
                return self.x < other.x or self.y < other.y
            
            def __repr__(self):
                return f'x:{self.x}, y:{self.y}'

        dirs = [Point(1,0), Point(-1, 1)]

        @dataclass
        class Walk:
            lines: int = numRows
            curr_dir: int = 0

            def __post_init__(self):
                self.currentPoint = Point(-1,0)

            def __next__(self):
                nxtPoint = self.currentPoint + dirs[self.curr_dir]
                if 0 <= nxtPoint.x < self.lines:
                    self.currentPoint = nxtPoint
                    return nxtPoint
                else:
                    self.curr_dir = (self.curr_dir + 1) % 2
                    return self.__next__()
            
            # def __iter__(self):
            #     return self
        
        walk = Walk()
        out = []
        
        for c in s:
            step = next(walk)
            out.append((step, c))

        out.sort()
        output = [p[1] for p in out]
        print(output)
            
        

            
        return ''.join(output)

        
17500