1

あなたが私を助けてくれるかどうか疑問に思っています。次のような数値ピラミッドを表示する Python 3 で、ネストされた for ループを作成しようとしています。

                              1
                         1    2   1
                     1   2    4   2   1
                 1   2   4    8   4   2   1
             1   2   4   8   16   8   4   2  1
          1  2   4   8  16   32  16   8   4  2  1
       1  2  4   8  16  32   64  32  16   8  4  2  1
    1  2  4  8  16  32  64  128  64  32  16  8  4  2  1

誰でも私を助けることができますか?それは大歓迎です!

これは私がこれまでに持っているものです:

col = 1

for i in range(-1, 18, col*2):        

    for j in range(1, 0, 1):
        print("  ", end = "")

    for j in range(i, 0, -2):
        print(j, end = " ")

    print()   

そのため、ピラミッドの半分しか表示できません。

私が抱えている主な問題は次のとおりだと思います。

増加してから減少する値 (つまり、1、2、4、2、1) を出力に表示するにはどうすればよいですか?

4

3 に答える 3

6

リスト内包表記を使用する別の方法。

問題を常に消化可能なチャンクに分割します。各行はそれ自体のミラーであるため、最初に必要な数のセットを作成することに対処しましょう。

これは、これが生成しているものであるすべての2の累乗を保持する文字列のリストを生成します

lines = []
for i in range(1,9):
  lines.append([str(2**j) for j in range(i)])

しかし、このリストを単に印刷すると、a) 半分しかないことになり、b) 数字がまとまりません。数値をスペースでバッファリングする必要があります。幸いなことに、最後の行にはどの列でも最大の桁があるため、次のようになります。

まず、各行が最終的にどのくらいの長さになる必要があるか (これは後で必要になります)、また、各列の最も長い数は何ですか。上記の文字列に数値をキャストする際に len を使用できます。

b = len(lines[-1])
buffers = [len(x) for x in lines[-1]]

これで、文字列を出力するために必要なものがすべて揃いました (上記では数字の使用をやめました)。

したがって、各行の長さを調べ、配列の左側を空の文字列で埋めることにより、配列を最も長い行の長さに拡張します (このため、左側のみを出力するふりをしています)三角形の半分):

for line in lines:
  l = len(line)
  line = [" "]*(b-len(line)) + line

各行がバッファリングされたので、印刷元の新しい配列を作成します。zip()行とバッファを一緒に ing することで、必要な長さに拡張された数値文字列を簡単に右寄せ ( )String.rjust()できます。

  out = []
  for x,y in zip(line,buffers):
    out.append(x.rjust(y))

今まで覚えておいてください、私たちはまだピラミッドの左半分を扱ってきました. したがって、出力配列を取得し、それを逆にして ( array[::-1])、最初の要素を除くすべての要素を取得し ( array[1:])、すべてを文字列で結合して出力します。

  print(" ".join(out+out[::-1][1:]))

出来上がり!完成したコード:

lines = []
for i in range(1,9):
  lines.append([str(2**j) for j in range(i)])

b = len(lines[-1])
buffers = [len(x) for x in lines[-1]]

for line in lines:
  l = len(line)
  line = [" "]*(b-len(line)) + line
  out = []
  for x,y in zip(line,buffers):
    out.append(x.rjust(y))
  print(" ".join(out+out[::-1][1:]))

出力:

                   1                 
               1   2  1              
            1  2   4  2  1           
         1  2  4   8  4  2  1        
      1  2  4  8  16  8  4  2 1      
    1 2  4  8 16  32 16  8  4 2 1    
  1 2 4  8 16 32  64 32 16  8 4 2 1  
1 2 4 8 16 32 64 128 64 32 16 8 4 2 1
于 2013-10-02T06:04:45.027 に答える
1

これは、他の 9 行ソリューションである可能性があります。

  • 2 のべき乗数を級数として生成する
  • 各行に追加する必要があるオフセットを見つけます
  • 回文リストを印刷する前に、各行の空白を印刷します。
  • すなわち。(オフセット * (n - i)) 回 " "(空白)
  • スライス操作によって回文シリーズを構築します。温度 + 温度[::-1][1:]
  • 回文級数を出力し、出力する数値の長さに対してスペースをオフセットします。

コード:

n = 8
numbers = [2**x for x in range(n)]                 # Generate interseted series.
offset = len(str(numbers[-1:])) -1                 # Find the max offset for the tree.
for i in range(1, n+1):                            # Iterate n times. 1 to n+1 helps eazy   slicing.
  temp = numbers[:i]                               # Slice series to get first row numbers.
  print(' ' * (offset * (n - i)), end=" ")         # Prefix spaces, multiples of offset.
  for num in temp + temp[::-1][1:]:                # Generate palindromic series for the row.
    print(num, end=" " * (offset - len(str(num)))) # Adjust offset for the number.
  print('')

出力:

                             1   
                         1   2   1   
                     1   2   4   2   1   
                 1   2   4   8   4   2   1   
             1   2   4   8   16  8   4   2   1   
         1   2   4   8   16  32  16  8   4   2   1   
     1   2   4   8   16  32  64  32  16  8   4   2   1   
 1   2   4   8   16  32  64  128 64  32  16  8   4   2   1   
于 2013-10-02T09:10:09.773 に答える