はじめに
[HackerRank] Alphabet Rangoli
について再帰呼び出しを使用して解いたので記事にしたものです.
以下にネタバレがあるので先に解きたいひとは上のリンクからどうぞ.
問題文(要約)
整数Nが入力される.大きさNのアルファベット・ランゴリを出力せよ.(ランゴリはインドのフォークアートであるらしい.)
いくつかのサイズのアルファベット・ランゴリの例↓
size 3
----c----
--c-b-c--
c-b-a-b-c
--c-b-c--
----c----
size 5
--------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--------
アルファベット・ランゴリの中心はアルファベットのa
.その周囲にはアルファベット順にb c d ...
と続く.同じ行で隣接するアルファベットの間には-
が挿入されている.
###入力
整数N(アルファベット・ランゴリのサイズ)を含む一行.
###制約
0>N>27
###出力
サイズNのアルファベット・ランゴリ(上記の例の通り.)
解き方の例
アルファベット・ランゴリの例とにらめっこすると,いくつかのことに気づく.
幅は一定なので,-
でパディングした文字列を出せば良さそう.
一旦,外側の-
は無視して考える.すると例えばsize=3の中心部は以下のようになる.
c
c-b-c
c-b-a-b-c
c-b-c
c
size=2は
b
b-a-b
b
(一応)size=1は
a
ということは,あるサイズn
のランゴリがあって,サイズn+1
のランゴリは,
- サイズ
n
のランゴリを[次の文字]-
,-[次の文字]
で囲む. - さらにその上下に
[次の文字]
を追加する.
こういうこと↓
[次の文字]
[次の文字]-[サイズnのランゴリ]-[次の文字]
[次の文字]
で作れることがわかる.
今回は,再帰呼び出しを使ってこれを作っていく.
解答例
gen_rangoli(s,i)
リストs
を中心部として,大きさi
のランゴリを作る.
def gen_rangoli(s,i):
if i==1:
return s
gen_rangoli(s,i-1)
c2 = chr(ord(s[0])+1) # [次の文字]
# サイズnのランゴリを[次の文字]-,-[次の文字]で囲む.
for i in range(len(s)):
s[i] = c2 + "-" +str(s[i])+ "-" + c2
# さらにその上下に[次の文字]を追加する.
s.insert(0,c2)
s.append(c2)
return s
def print_rangoli(size):
c = gen_rangoli(["a"],size)
for i in range(len(c)):
print(c[i].center(4*(size-1)+1,"-"))
return
if __name__ == '__main__':
n = int(input())
print_rangoli(n)
gen_rangoli(s,i-1)
の部分で自分自身をi
を1ずつ減らしながら呼び出している(再帰呼び出し).これは,
例えばsize=3
のランゴリを作りたいときは
gen_rangoli("a",3)
は,gen_rangoli("a",2)
を取得して1段階拡大したもの.
gen_rangoli("a",2)
は,gen_rangoli("a",1)
を取得して1段階拡大したもの.
gen_rangoli("a",1)
は,["a"]
.
という手順で作ればよいからである.
「1段階拡大」に相当する部分が,
# サイズnのランゴリを[次の文字]-,-[次の文字]で囲む.
for i in range(len(s)):
s[i] = c2 + "-" +str(s[i])+ "-" + c2
# さらにその上下に[次の文字]を追加する.
s.insert(0,c2)
s.append(c2)
の部分.リストの要素がランゴリの各行に対応する.
ランゴリの中心部ができたら,あとは適切な幅で-
でパディングして出力する.
size=1
では幅は1.size
が1大きくなるごとに
- サイズnのランゴリを[次の文字]-,-[次の文字]で囲む.
ので,4ずつ大きくなる.つまり幅は4*(size-1)+1
.
おわりに
size=26
のランゴリをどうぞ.
--------------------------------------------------z--------------------------------------------------
------------------------------------------------z-y-z------------------------------------------------
----------------------------------------------z-y-x-y-z----------------------------------------------
--------------------------------------------z-y-x-w-x-y-z--------------------------------------------
------------------------------------------z-y-x-w-v-w-x-y-z------------------------------------------
----------------------------------------z-y-x-w-v-u-v-w-x-y-z----------------------------------------
--------------------------------------z-y-x-w-v-u-t-u-v-w-x-y-z--------------------------------------
------------------------------------z-y-x-w-v-u-t-s-t-u-v-w-x-y-z------------------------------------
----------------------------------z-y-x-w-v-u-t-s-r-s-t-u-v-w-x-y-z----------------------------------
--------------------------------z-y-x-w-v-u-t-s-r-q-r-s-t-u-v-w-x-y-z--------------------------------
------------------------------z-y-x-w-v-u-t-s-r-q-p-q-r-s-t-u-v-w-x-y-z------------------------------
----------------------------z-y-x-w-v-u-t-s-r-q-p-o-p-q-r-s-t-u-v-w-x-y-z----------------------------
--------------------------z-y-x-w-v-u-t-s-r-q-p-o-n-o-p-q-r-s-t-u-v-w-x-y-z--------------------------
------------------------z-y-x-w-v-u-t-s-r-q-p-o-n-m-n-o-p-q-r-s-t-u-v-w-x-y-z------------------------
----------------------z-y-x-w-v-u-t-s-r-q-p-o-n-m-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z----------------------
--------------------z-y-x-w-v-u-t-s-r-q-p-o-n-m-l-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z--------------------
------------------z-y-x-w-v-u-t-s-r-q-p-o-n-m-l-k-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z------------------
----------------z-y-x-w-v-u-t-s-r-q-p-o-n-m-l-k-j-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z----------------
--------------z-y-x-w-v-u-t-s-r-q-p-o-n-m-l-k-j-i-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z--------------
------------z-y-x-w-v-u-t-s-r-q-p-o-n-m-l-k-j-i-h-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z------------
----------z-y-x-w-v-u-t-s-r-q-p-o-n-m-l-k-j-i-h-g-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z----------
--------z-y-x-w-v-u-t-s-r-q-p-o-n-m-l-k-j-i-h-g-f-e-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z--------
------z-y-x-w-v-u-t-s-r-q-p-o-n-m-l-k-j-i-h-g-f-e-d-e-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z------
----z-y-x-w-v-u-t-s-r-q-p-o-n-m-l-k-j-i-h-g-f-e-d-c-d-e-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z----
--z-y-x-w-v-u-t-s-r-q-p-o-n-m-l-k-j-i-h-g-f-e-d-c-b-c-d-e-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z--
z-y-x-w-v-u-t-s-r-q-p-o-n-m-l-k-j-i-h-g-f-e-d-c-b-a-b-c-d-e-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z
--z-y-x-w-v-u-t-s-r-q-p-o-n-m-l-k-j-i-h-g-f-e-d-c-b-c-d-e-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z--
----z-y-x-w-v-u-t-s-r-q-p-o-n-m-l-k-j-i-h-g-f-e-d-c-d-e-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z----
------z-y-x-w-v-u-t-s-r-q-p-o-n-m-l-k-j-i-h-g-f-e-d-e-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z------
--------z-y-x-w-v-u-t-s-r-q-p-o-n-m-l-k-j-i-h-g-f-e-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z--------
----------z-y-x-w-v-u-t-s-r-q-p-o-n-m-l-k-j-i-h-g-f-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z----------
------------z-y-x-w-v-u-t-s-r-q-p-o-n-m-l-k-j-i-h-g-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z------------
--------------z-y-x-w-v-u-t-s-r-q-p-o-n-m-l-k-j-i-h-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z--------------
----------------z-y-x-w-v-u-t-s-r-q-p-o-n-m-l-k-j-i-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z----------------
------------------z-y-x-w-v-u-t-s-r-q-p-o-n-m-l-k-j-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z------------------
--------------------z-y-x-w-v-u-t-s-r-q-p-o-n-m-l-k-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z--------------------
----------------------z-y-x-w-v-u-t-s-r-q-p-o-n-m-l-m-n-o-p-q-r-s-t-u-v-w-x-y-z----------------------
------------------------z-y-x-w-v-u-t-s-r-q-p-o-n-m-n-o-p-q-r-s-t-u-v-w-x-y-z------------------------
--------------------------z-y-x-w-v-u-t-s-r-q-p-o-n-o-p-q-r-s-t-u-v-w-x-y-z--------------------------
----------------------------z-y-x-w-v-u-t-s-r-q-p-o-p-q-r-s-t-u-v-w-x-y-z----------------------------
------------------------------z-y-x-w-v-u-t-s-r-q-p-q-r-s-t-u-v-w-x-y-z------------------------------
--------------------------------z-y-x-w-v-u-t-s-r-q-r-s-t-u-v-w-x-y-z--------------------------------
----------------------------------z-y-x-w-v-u-t-s-r-s-t-u-v-w-x-y-z----------------------------------
------------------------------------z-y-x-w-v-u-t-s-t-u-v-w-x-y-z------------------------------------
--------------------------------------z-y-x-w-v-u-t-u-v-w-x-y-z--------------------------------------
----------------------------------------z-y-x-w-v-u-v-w-x-y-z----------------------------------------
------------------------------------------z-y-x-w-v-w-x-y-z------------------------------------------
--------------------------------------------z-y-x-w-x-y-z--------------------------------------------
----------------------------------------------z-y-x-y-z----------------------------------------------
------------------------------------------------z-y-z------------------------------------------------
--------------------------------------------------z--------------------------------------------------
ラミエルっぽい.