0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[HackerRank] Alphabet Rangoli と 再帰呼び出し

Last updated at Posted at 2020-03-01

はじめに

[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のランゴリは,

  1. サイズnのランゴリを[次の文字]--[次の文字]で囲む.
  2. さらにその上下に[次の文字]を追加する.
    こういうこと↓
[次の文字]
[次の文字]-[サイズ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大きくなるごとに

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

ラミエルっぽい.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?