2017-09-03 9 views
1

이 다이아몬드를 만드는 데 문제가 있습니다. chars를 균등 한 길이로 만들면 언제나 괜찮습니다. 그러나 홀수 일 때는 다이아몬드의 바닥 부분 만 엉망이됩니다. 나는 이것에 대해 일하고 거의 끝났습니다. 도움에 미리 감사드립니다.파이썬으로 다이아몬드 아트 ASCII 만들기

chars = 'ABCDEF' 
length = len(chars) 
string = '' 
dots = (length*2 - 1)*2 - 1 
for i in range(length): 
    string1 = '' 
    string += chars[i] 
    length1 = len(string) 
    for j in range(0, length1): 
     if j % 2 != 0: 
      string1 += chars[length -1 - j].center(3, '.') 
     else: 
      string1 += chars[length - 1 - j] 
    for k in range(i - 1, -1, -1): 
     if k % 2 != 0: 
      string1 += chars[length - 1 - k].center(3, '.') 
     else: 
      string1 += chars[length - 1 - k] 
    string1 = string1.center(dots, '.') 
    print(string1) 

string='' 
for i in range(length - 1): 
    string1 = '' 
    string += chars[i] 
    length1 = len(string) 
    for j in range(length - 1 - i): 
     if j % 2 != 0: 
      string1 += chars[length - 1 - j] 
     else: 
      string1 += chars[length -1 - j].center(3, '.') 
    for k in range(i + 2, length): 
     if k % 2 != 0: 
      string1 += chars[k].center(3, '.') 
     else: 
      string1 += chars[k] 
    string1 = string1.center(dots, '.')  
    print(string1) 

숯 길이 이것은 파이썬에도

답변

9

때 문자 길이

홀수 인 경우. 몇 줄의 코드로 창의적인 ASCII 아트를 만드는 데 사용할 수있는 유용한 문자열 함수가 많이 있습니다.

가장 중요한 것들 중 일부는 str.join, str.Xjust입니다. 문자 범위를 반복하려면 chrord을 사용합니다.

먼저 패딩을 처리 할 함수를 정의하십시오.

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]]) 

첫 번째 코드 줄은 다이아몬드 선의 첫 번째 절반을 만듭니다. 두 번째 줄은 첫 번째 절반을 가운데 글자와 결합하고 전반을 반전시킨 것입니다.

다음으로 다이아몬드의 크기를 결정하십시오.

start = 'A' 
end = ... 
field_width = (ord(end) - ord('A')) * 2 - 1 

이제 두 개의 별도 루프가 필요합니다. 하나는 위쪽 다이아몬드 용이고 다른 하나는 아래쪽 루프 용입니다. 두 루프는 각 반복마다 pad을 호출합니다.

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)) 

end = 'E' :

........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........ 

end = 'F' :

..........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.......... 

Seth Difley's answer는 DIAM 전반 건물 관련된 다른 방법을 탐구 그리고 후반을 얻기 위해 그것을 뒤집었다. 실제로,이 접근법은이 솔루션에도 적용될 수 있습니다.

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) 

결과가 동일하고 결과가 더 빠릅니다.

+1

아름다운 코드. – Dark

2

전략 : 다이아몬드의 위쪽 절반이 기존 프로그램에서 올바르게 렌더링되므로 위쪽 절반을 생성 한 다음 위쪽 절반에서 선을 뒤집어서 아래쪽 절반을 생성하십시오. build_diamond은 위쪽 절반에 해당하는 문자열이 포함 된 목록을 반환합니다. print('\n'.join(string_list))이 위쪽 절반을 인쇄합니다. bottom_of_diamond_string_list = list(reversed(string_list))[1:]은 문자열을 위쪽에서 반전시키고 중간 문자열을 [1:]으로 제거하여 아래쪽 절반의 문자열을 얻습니다. print('\n'.join(bottom_of_diamond_string_list))은 아래쪽 절반을 인쇄합니다. 5 및 6 (균등하고 이상한) chars 길이를 테스트하고 작동합니다.원하는 경우 더 많은 코드 정리 작업을 수행 할 수 있습니다.

chars = 'ABCDEF' 
length = len(chars) 

def build_diamond(length): 
    dots = (length*2 - 1)*2 - 1 
    string = '' 
    string_list = [] 
    for i in range(length): 
     string1 = '' 
     string += chars[i] 
     length1 = len(string) 
     for j in range(0, length1): 
      if j % 2 != 0: 
       string1 += chars[length -1 - j].center(3, '.') 
      else: 
       string1 += chars[length - 1 - j] 
     for k in range(i - 1, -1, -1): 
      if k % 2 != 0: 
       string1 += chars[length - 1 - k].center(3, '.') 
      else: 
       string1 += chars[length - 1 - k] 
     string1 = string1.center(dots, '.') 
     string_list.append(string1) 
    return string_list 

if __name__ == '__main__': 
    string_list = build_diamond(length) 
    print('\n'.join(string_list)) 
    bottom_of_diamond_string_list = list(reversed(string_list))[1:] 
    print('\n'.join(bottom_of_diamond_string_list))