2016-06-23 6 views
0

タイトルに記載されているように、私はpython 3.5を使ってダイヤモンドのテキストパターンを作るつもりですが、正しく動作するようにするにはちょっと固まっています。どのようにループを使ってpython 3.5でダイヤモンドのテキストパターンを作る

所望の出力:

    S 
        SAS 
       SAMAS 
       SAMPMAS 
       SAMPLPMAS 
       SAMPLELPMAS 
       SAMPLPMAS 
       SAMPMAS 
       SAMAS 
        SAS 
        S 

コード:

word=input("Enter characters: ") 
length=len(word) 
for i in range (0, length): 
    for j in range(length-i-1): 
     print(' ', end="") 
    for j in range(0, i+1): 
     print(word[j], end="") 
    for k in range (i-1, -1, -1): 
     print (word[k], end="") 
    print() 
for l in range (1,length): 
    for j in range(l) : 
     print(' ', end="") 
    for m in range (0,length-l-1): 
     print(word[m], end ="") 
    for n in range (length-l-1,-1,-1): 
     print(word[n], end="") 

電流出力:

 f 
    fof 
    fooof 
    fooboof 
    foobaboof 
foobaraboof 
    foobaboof fooboof fooof fof  f 
+0

解決策を質問に編集しないでください。 Chris Muellerのソリューションのバリエーションを他の人に見てもらえると便利だと思われる場合は、ページの下部にあるボックスを使用して追加の回答として追加してください。 – theB

+0

頭をアップしてくれてありがとう、私は未来のことを頭に入れておきます。 –

答えて

2

をループします。これは、rjust文字列メソッドを使用して、短縮された単語の前のスペースを適切に埋め込み、拡張されたスライスを使用して文字列の逆の部分を取得します。

1

あなたは空白をプリントアウトする必要があります。それをダイヤモンドではなく長方形のように考える。

する作業を開始するには:

for i in range (0, length): 
    for x in range(0, length-i): 
    print(" ", end="") 
    for j in range(0, i+1): 
    print(word[j], end="") 
    ... 
2

あなたはほとんど自分でそれを解決した、唯一の欠落は、各ラインの前でスペースがあります。今度は最初の行がn-1のスペースを持っていて、nの文字列の長さです.2行目は、n-2のスペースが前面にあります。中間の行にはスペースを入れないでください。

中間に達した後、見出しスペースの数を1つずつ増やします。

 
word=input("Enter characters: ") 
length=len(word) 
for i in range (0, length): 
    for j in range(length-i-1): 
     print(' ', end="") 
    for j in range(0, i+1): 
     print(word[j], end="") 
    for k in range (i-1, -1, -1): 
     print (word[k], end="") 
    print() 
for l in range (length, 0, -1): 
    for j in range(length-l+1): 
     print(' ', end="") 
    for m in range (l-1, 0, -1): 
     print(word[m], end ="") 
    for n in range (0, i-1): 
     print(word[n], end="") 
    print() 

これは残念なことにコード内の唯一の問題ではありません。

 f 
    fof 
    fooof 
    fooboof 
foobaboof 
foobaraboof 
raboofoob 
    aboofoob 
    boofoob 
    oofoob 
    ofoob 
     foob 
 
word=input("Enter characters: ") 
length=len(word) 
for i in range (0, length): 
    for j in range(length-i-1): 
     print(' ', end="") 
    for j in range(0, i+1): 
     print(word[j], end="") 
    for k in range (i-1, -1, -1): 
     print (word[k], end="") 
    print() 
for l in range (1,length): 
    for j in range(l) : 
     print(' ', end="") 
    for m in range (0,length-l-1): 
     print(word[m], end ="") 
    for n in range (length-l-1,-1,-1): 
     print(word[n], end="") 
    print() 

この版画:あなたはそれをテストすると、次のようなダイヤモンドを取得します、あなたがlength - i - 1またはlength - l - 1に等しい各行の先頭にパディングが欠落しているよう

 f 
    fof 
    fooof 
    fooboof 
foobaboof 
foobaraboof 
foobaboof 
    fooboof 
    fooof 
    fof 
    f 
+0

@BenS: 'foobar'を文字列としてローカルでテストしました。取得した出力で質問を更新できますか? –

+0

@BenS:よく見付かるエラーです。フラグメントを完全にコピー・ペーストしませんでした。最後の行がありませんでした。今すぐ修正する必要があります。 –

2

が見えますスペース。

def print_row(i, l): 
    print(" " * (l - i - 1), end="") 
    for j in range(0, i+1): 
     print(word[j], end="") 
    for k in range(i-1, -1, -1): 
     print(word[k], end="") 
    print() 

for i in range(0, length): 
    print_row(i, length) 
for l in range(length, -1, -1): 
    print_row(l, length) 

編集:簡体約

import itertools 
l = len(word) 
for j in itertools.chain(range(l), reversed(range(l-1))): 
    print(word[0:j].rjust(l) + word[j::-1]) 

あなたが探しているの出力を与える方法

+0

スペースの繰り返し文字列を印刷するための余分なループは必要ありません。 :D –

+0

プログラムがまだ正しくない、ダイヤモンドの下部が正しい文字を印刷しません。 –

+0

母、貼り付けられたOPコードをコピーします。私はちょうど2番目のforループ内で選択した文字がオフであり、ループが1回の反復で短く切っていることに気付きました。 –

1

このコードは、この問題のために動作し、非常に単純です:

def diamond(): 
    word = input("Enter characters : ") 
    space_length = len(word) 
    for i in range(len(word)): 
     space_length -= 1 
     for k in range(space_length, 0, -1): 
      print(" ", end="") 
     sliced = word[0:i+1] 
     for j in sliced: 
      print(j, end="") 
     for j in range(0, i): 
      print(sliced[len(sliced)-j-2], end="") 
     print() 
    space_length = 0 
    for i in range(len(word), 0, -1): 
     space_length += 1 
     for k in range(space_length): 
      print(" ", end="") 
     sliced = word[0:i-1] 
     for j in sliced: 
      print(j, end="") 
     for j in range(len(sliced) - 2, -1, -1): 
      print(sliced[j], end="") 
     print() 

出力例:文字を入力してください:foobarの

 f 
    fof 
    fooof 
    fooboof 
    foobaboof 
foobaraboof 
    foobaboof 
    fooboof 
    fooof 
    fof 
     f 
1

をあなたは生成されてもループし、リスト内包と中心に、文字列のパディングを使用することができますリストを作成して文字列をスライスして次のようにダイヤモンドを作成します。

# concatenated list comprehensions 
# form 0 to 11 to 0 in steps of 2 
diamondlist = [i for i in range(1,12,2)] + [i for i in range(9,0,-2)] 

# string to print in diamond shape 
text = 'SAMPLETEXTS' 

# loop through list using fomat to centre string 
# as i incr/decr string is sliced 
# y is length of text 
for i in diamondlist: 
    y = len(text) 
    print('{:^{}s}'.format(text[:i], y)) 

出力:

 S  
    SAM  
    SAMPL 
    SAMPLET 
SAMPLETEX 
SAMPLETEXTS 
SAMPLETEX 
    SAMPLET 
    SAMPL 
    SAM  
    S 

注:

これが唯一の1から始まるダイヤモンドのために働くだろうが、あまりにも多くの仕事では、文字列aとダイヤモンドの幅を取る関数にそれを回すことができます議論として。

関連する問題