<p>灵感来自@avysk response。在</p>
<p>@avysk的回复有两个问题。在</p>
<ol>
<li>处理zzzz-xy。它应该环绕并返回000000XY。它不应该溢出。然而,我没有在问题本身中涵盖这一部分。在</li>
<li>000000XY未正确处理以返回000001XY。取而代之的是
返回1XY。在</li>
</ol>
<p>在以下代码中修复了这些问题,这些代码借用了@avysk的响应。在</p>
<pre><code>digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
def digit_helper(num):
while num > 0:
yield Tape.digits[num % 36]
num = num / 36
# This function, using the utility digit_helper, increments the string by 1.
# It produces string in following order:
# "A00000XY", "A00000XY", "A00001XY", "A00002XY", ...,
# "A00009XY", "A0000AXY", "A0000BXY", ...,
# "A0000YXY", "A0000ZXY", "A00010XY", "A00011XY", ...,
# "ZZZZZZXY", "000000XY", "000001XY", ...
# Logic:
# 1. Strip the string of last two chars.
# 2. Convert to base 36 equivalent integer and increment by one.
# 3. Convert back to Base 36 representation of incremented value.
# 3.1. [0:6] handles the overflow. Overflow happens after "ZZZZZZXY" and produces "1000000XY".
# 3.2. [::-1] reverses the string.
# 3.3. zfill(6) handles underflow, like converting integer 1 to "000001XY".
def increment(string):
incremented = int(string[:-2], base=36) + 1
return "".join(Tape.digit_helper(incremented))[0:6][::-1].zfill(6) + string[-2:]
</code></pre>