<p>这是Python。有许多有用的字符串函数可以用来在几行代码中创建创造性的ASCII艺术。在</p>
<p>其中最重要的是<code>str.join</code>,<code>str.Xjust</code>。我们还将使用<code>chr</code>和<code>ord</code>来迭代字符范围。在</p>
<p>首先,定义一个处理填充的函数。在</p>
<pre><code>def pad(c1, c2, sep='.', field_width=10):
out = sep.join(chr(x) for x in range(c2, c1, -1)).rjust(field_width, sep) # build the first part
return sep.join([out, chr(c1), out[::-1]])
</code></pre>
<p>第一行代码将构建菱形行的前半部分。第二行将上半部分与中间字母连接起来,与前半部分相反。在</p>
<p>下一步,确定范围-你的钻石将有多大。在</p>
^{pr2}$
<p>现在,您需要两个单独的循环-一个用于上部菱形,另一个用于下部菱形。两个循环在每次迭代时都调用<code>pad</code>。在</p>
<pre><code>for e in range(ord(end), ord(start), -1):
print(pad(e, ord(end), '.', field_width))
for e in range(ord(start), ord(end) + 1):
print(pad(e, ord(end), '.', field_width))
</code></pre>
<hr/>
<p><code>end = 'E'</code>:</p>
<pre><code>........E........
......E.D.E......
....E.D.C.D.E....
..E.D.C.B.C.D.E..
E.D.C.B.A.B.C.D.E
..E.D.C.B.C.D.E..
....E.D.C.D.E....
......E.D.E......
........E........
</code></pre>
<p><code>end = 'F'</code>:</p>
<pre><code>..........F..........
........F.E.F........
......F.E.D.E.F......
....F.E.D.C.D.E.F....
..F.E.D.C.B.C.D.E.F..
F.E.D.C.B.A.B.C.D.E.F
..F.E.D.C.B.C.D.E.F..
....F.E.D.C.D.E.F....
......F.E.D.E.F......
........F.E.F........
..........F..........
</code></pre>
<hr/>
<p><a href="https://stackoverflow.com/a/46019773/4909087">Seth Difley's answer</a>探索了另一种方法,即构建钻石的前半部分,然后将其反转以获得下半部分。事实上,这种方法也可以用于这种解决方案,大致如下:</p>
<pre><code>lines = []
for e in range(ord(end), ord(start) - 1, -1):
lines.append(pad(e, ord(end), '.', field_width))
for x in lines + lines[-2::-1]:
print(x)
</code></pre>
<p>这也会产生相同的输出,而且速度更快。在</p>