Pythonで文字を使ってドアマット模様を出力する方法|WELCOMEパターン
2つの整数 n と m が与えられ、m は n の倍数であるとします。このとき、中央に「WELCOME」という文字列が配置されたドアマットの模様を描くことを考えます。マットのサイズは n × m とし、使用できるのはドット(.)、ハイフン(-)、縦線(|)の3種類の記号と、中央に配置するテキストだけです。
例えば、入力が n = 5、m = 15 の場合、出力は次のようになります。
------.|.------ ---.|..|..|.--- ----WELCOME---- ---.|..|..|.--- ------.|.------
このように、模様は上下対称になっており、中央の一行目から順に「.|.」の数が増えていき、真ん中に WELCOME の文字が来る構造になっています。
解き方の手順
この問題を解くには、以下のステップに従います。
- i を 1 から n-1 まで 2 ずつ増やしながら、次の処理を繰り返す
- int((m - i*3) / 2) 個の「-」、続けて i 回繰り返した「.|.」、最後に int((m - i*3) / 2) 個の「-」を出力する
- int((m - 7) / 2) 個の「-」+「WELCOME」+ int((m - 7) / 2) 個の「-」を出力する(WELCOME は7文字なので左右に同じ数のハイフンを配置)
- i を n-2 から -1 まで 2 ずつ減らしながら、最初と同じパターン行を出力し、下側の対称部分を作る
ポイントは、「.|.」を i 回並べるとその長さが i × 3 文字になるため、全体の幅 m との差分を2で割れば、左右それぞれに必要なハイフンの数が求まるという点です。
実装例
理解を深めるために、実際のPythonコードを見てみましょう。
def solve(n, m):
for i in range(1, n, 2):
print('-' * int((m - i * 3) / 2) + '.|.' * i + '-' * int((m - i * 3) / 2))
print('-' * int((m - 7) / 2) + 'WELCOME' + '-' * int((m - 7) / 2))
for i in range(n - 2, -1, -2):
print('-' * int((m - i * 3) / 2) + '.|.' * i + '-' * int((m - i * 3) / 2))
n = 15
m = 45
solve(n, m)
入力
15, 45
出力
---------------------.|.--------------------- ------------------.|..|..|.------------------ ---------------.|..|..|..|..|.--------------- ------------.|..|..|..|..|..|..|.------------ ---------.|..|..|..|..|..|..|..|..|.--------- ------.|..|..|..|..|..|..|..|..|..|..|.------ ---.|..|..|..|..|..|..|..|..|..|..|..|..|.--- -------------------WELCOME------------------- ---.|..|..|..|..|..|..|..|..|..|..|..|..|.--- ------.|..|..|..|..|..|..|..|..|..|..|.------ ---------.|..|..|..|..|..|..|..|..|.--------- ------------.|..|..|..|..|..|..|.------------ ---------------.|..|..|..|..|.--------------- ------------------.|..|..|.------------------ ---------------------.|.---------------------
n = 15、m = 45 の場合でも、同じロジックで正しく対称的なドアマット模様が出力されていることが確認できます。この手法は、文字列の乗算('-' * n)によるリピート処理と、range() 関数のステップ指定を組み合わせたシンプルかつ効率的なアプローチです。
-
【Python】ループを使わずに数列を出力する方法:再帰呼び出しを活用した実装
はじめに 本記事では、以下の問題に対する解決策について詳しく解説します。 問題の概要 2つの整数 N と K が与えられたとき、N が 0 より大きい間は N から K を引き続けます。そして N が 0 以下になったら、今度は元の値 N に戻るまで K を足していきます。 入力例 N = 10 K = 4 出力例 10 6 2 -2 2 6 10 アルゴリズムの考え方 N が 0 より大きい間、関数を再帰的に呼び出し続けます(各呼び出しごとに N から K を減算します)。 数値が 0 以下になったら、元の値に戻るまで各呼び出しごとに K を加算します。 加算と減算は同じ1つの関数
-
ループを使わずに数列を出力するPythonプログラム|再帰とフラグで実現する方法
本記事では、for文やwhile文などのループ構文を一切使わずに数列を表示するという問題の解法について解説します。問題の定義問題: 2つの数値 N と K が与えられます。まずNが0より大きい間はNからKを繰り返し引き、Nが0以下(ゼロまたは負)になったら、今度は逆にKを足していきます。そして値が元の数値Nに戻った時点で処理を終了します。実行例N = 10K = 4出力: 10 6 2 -2 2 6 10アルゴリズムNが0より大きい間、関数を再帰的に呼び出し続けます。各呼び出しのたびにNからKを減算します。数値が0以下になったら加算モードに切り替え、各呼び出しごとにKを加算します。元の数値Nに