2016-06-25 3 views
2

내가 파이썬에서이 패턴을 인쇄하기 위해 노력하고있어의 'X'패턴 :인쇄 '*'

*  * 
* * 
    * * 
    * 
    * * 
* * 
*  * 

을 그리고이 코드를 내놓았다 :

size = 7 
inner_size = size - 3 
space=0 

for i in range(inner_size): 
    print (' ' * space + '*' + ' ' * inner_size + '*') 
    inner_size -=2 
    space +=1 
print " *" 

t_size=7 
t_inner_size = 0 
space=3 
for i in range(inner_size): 
    print (' ' * space + '*' + ' ' * inner_size + '*') 
    inner_size +=2 
    space -=1 

그러나, 그것은이를 인쇄 :

* * 
* * 
    ** 
    ** 
    * 

필요한 패턴을 인쇄하는 방법은 무엇입니까? 하나의 루프에서이 작업을 수행 할 수 있습니까? i은 행 인덱스이고 j은 열 인덱스 (모두 제로)입니다 :

def pattern(size): 
    for i in range(size): 
     print("".join("*" if j == i or size - 1 - j == i else " " 
         for j in range(size))) 

세부 사항 :

답변

1

I을 너를 가지고있어. SED 질문에서 기존 코드에서 아이디어와 간단 명료 한 코드를 하나의 루프에서 그것을 할 수있는 몇 개조하면 되겠 어 만든 :

def xprint(size): 
    i,j = 0,size - 1 

    while j >= 0 and i < size: 

     initial_spaces = ' '*min(i,j) 
     middle_spaces = ' '*(abs(i - j) - 1) 
     final_spaces = ' '*(size - 1 - max(i,j)) 

     if j == i: 
      print initial_spaces + '*' + final_spaces 
     else: 
      print initial_spaces + '*' + middle_spaces + '*' + final_spaces 

     i += 1 
     j -= 1 

xprint(7) 

그것은 출력합니다 :

 
*  * 
* * 
    * * 
    * 
    * * 
* * 
*  * 

선형 타임 그것을하는 간단한 방법.

+0

완벽하게 작동했습니다. 도움을 많이 주셔서 감사합니다. –

3

여기에 그것을 할 수있는 한 가지 방법입니다. j == i 조건은 왼쪽 위부터 오른쪽 아래까지 대각선을 생성합니다. size - 1 - j == i 조건은 오른쪽 위부터 왼쪽 아래로 대각선을 생성합니다. 함께 X 모양을 만듭니다. (7)의 크기를 호출

:

pattern(7) 

그것은 인쇄 : 그것은 모두 짝수 및 홀수 크기와 함께 작동

*  * 
* * 
    * * 
    * 
    * * 
* * 
*  * 

하는 것으로. 짝수 크기의 경우, 결과 X는 중심에 2x2 블록의 별을 포함합니다.

2

'단일 루프'으로 수행 할 수 있는지 묻는 메시지가 나타납니다. 그래서 거기에 나중에 가서 :

n = 3 
for i in range(-n, n + 1): 
    print('{}*{}{}'.format(
     (n + 1 - abs(i)) * ' ', 
     (2 * abs(i) - 1) * ' ', 
     '' if i == 0 else '*')) 

설명 : 주어진 라인에 대한

, 우리는 공간의 2 개 세트가 필요합니다. 첫 번째 * 앞에 공백이 있고 첫 번째 공백 뒤에 공백이 있습니다. *. 우리는 문자열을 다음과 같이 포맷합니다 : {}*{}

중간 선을 제외하고 모든 줄에 2x '*'가 있기 때문에 이제 여분의 자리 표시자를 추가합니다. 우리는 -3 -2 -1 0 1 2 3과 비슷한 유행을 're고 있습니다. 중간 선은 색인 0을 가지고 있습니다. 이제 문자열 형식이 {}*{}{}이되었습니다.

이제 첫 번째 * 앞에 공백이 필요합니다. n + 1 - abs(i) 아니요. 공간의.
첫 번째 공백 후 공백이 * 인 경우 n + 1 - abs(i) 공백이 필요하지 않습니다.

출력 (N = 3) :

*  * 
    * * 
    * * 
    * 
    * * 
    * * 
*  * 

출력 (N = 5) :

*   * 
    *  * 
    *  * 
    * * 
    * * 
     * 
    * * 
    * * 
    *  * 
    *  * 
*   * 

명 입력으로 전체 패턴 크기를 사용하고 있지만, 나는 그것을 사용하는 것이 더 직관적 인 것 같아요 반복되는 크기를 입력으로 사용합니다. 따라서 원하는대로 n의 값을 변경하십시오.

추신 : 이것은 가장 우아하지도 않으며 가장 읽기 쉬운 해결책도 아닙니다. 그러나 그것은단일루프에서 작동합니다.

1

문제 해결의 단지 또 다른 방법 :

for i in range(5): 
     for j in range(5): 
      if ((i==j) or j==(5-i-1)): 
       print " *", 
      else: 
       print " ", 
     print "" 

~

1

또한 이런 식으로 작업을 수행 할 수 있습니다

pattern_size = 7 
for t in range(pattern_size): 
    pattern = list(" " * pattern_size) 
    pattern[t] = "*" 
    pattern[-(t+1)] = "*" 
    print("".join(pattern)) 

출력 :

*  * 
* * 
    * * 
    * 
    * * 
* * 
*  *