Попробуйте напечатать рамку '*' и диагональ в питоне - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь напечатать '*' в рамке и по диагонали.

Это то, что я сделал:

x=10
y=10
def print_frame(n, m, c):
  print c * m
  for i in range(1, n - 1):
    print c ,' '*(n-2-i),c, ' '*i , c  , c
  print c * m

print_frame(10, 10, '*')

Это результат:

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

1 Ответ

0 голосов
/ 25 марта 2019

Как я указал в своем комментарии, диагональные матрицы имеют только квадратные матрицы. Но даже для них все «немного» сложнее, чем кажется:

  • Я мог бы сделать это за один цикл, но я думаю, что лучше увидеть все "разделы"
  • Также добавлен рекурсивный вариант (не используется). Я предпочитаю этот, так как он понятнее, особенно учитывая природу проблемы, рекурсия не идет так глубоко, чтобы генерировать StackOverflow или негативно влиять на производительность

code.py

#!/usr/bin/env python3

import sys


def print_square_frame(side, char="*"):
    print(char * side)  # Upper row
    if side == 1:
        return
    for i in range(side // 2 - 1):
        print(char + " " * i + char + " " * (side - 2 * i - 4) + char + " " * i + char)
    if side % 2:
        print(char + " " * ((side - 3) // 2) + char + " " * ((side - 3) // 2) + char)  # Mid row
    for i in range(side // 2 - 2, -1, -1):
        print(char + " " * i + char + " " * (side - 2 * i - 4) + char + " " * i + char)
    print(char * side)  # Lower row


# Recursion
def _print_square_frame_rec(side, char, i):
    if i == side // 2 - 1:
        if side % 2 :
            print(char + " " * ((side - 3) // 2) + char + " " * ((side - 3) // 2) + char)  # Mid row
        return
    else:
        s = char + " " * i + char + " " * (side - 2 * i - 4) + char + " " * i + char
        print(s)
        _print_square_frame_rec(side, char, i + 1)
        print(s)


def print_square_frame_rec(side, char="*"):
    print(char * side)
    if side == 1:
        return
    _print_square_frame_rec(side, char, 0)
    print(char * side)
# Recursion end


def main(argv):
    dim = 10
    if argv:
        if argv[0].isdigit():
            dim = int(argv[0])
    print_square_frame(dim)


if __name__ == "__main__":
    print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
    main(sys.argv[1:])

выход

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055342983]> "e:\Work\Dev\VEnvs\py_064_03.06.08_test0\Scripts\python.exe" code.py
Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] on win32

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

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q055342983]> "e:\Work\Dev\VEnvs\py_064_03.06.08_test0\Scripts\python.exe" code.py 7
Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] on win32

*******
**   **
* * * *
*  *  *
* * * *
**   **
*******
...