🔺

一日一処: ワンラインで作るJavaScriptでのピラミッド建設

2024/02/02に公開

ピラミッド建設

ピラミッドは古代の遺産だ。まだ謎も多く残されているピラミッドを仮想的ではあるもののプログラムで、建築してみようという試みだ。プログラムで、ピラミッドを生成するのは非常にありふれた問題であり、プログラミングの能力を図るために、よく用いられる課題となる。ここでは、私がこれまでに建設してきたピラミッドのプログラムの中で、更に何回で複雑なものを目指す。
ここで、出力してほしいピラミッドはこのようなものだ。この記事では、原則、以下の内容を出力することに注力していく。

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

古典的な記述

古典的なピラミッドのプログラムだと、多くの場合、二重に繰り返し構文を用いて、ピラミッドの高さと、ピラミッドの一段当たりの記号を算出し、生成することが多いのではないだろうか。
例えば、このようなプログラムだ。

const lines = 5

for (let i = 0; i < lines; i++) {
  let spaces = ''
  let blocks = '*'
  for (let k = 0; k < lines - i; k++) {
    spaces += ' '
  }
  for (let j = 0; j < i * 2; j++) {
    blocks += '*'
  }
  console.log(spaces + blocks)
}

内容はそれほど難しくない。必要となるスペースと実体となる*の個数をそれぞれ算出し表示しているだけだ。中心の軸となるそれぞれの段の中央の記号のみを事前に設置できれば、あとは、段数によって、左右に記号を増やすような形だ。

少し省略する

このようなプログラム自体はさほど長くないが、若干冗長的に見える。そのため、少しだけ簡略化に挑戦する。そこでできたのが、これだ。

const lines = 5

for (let i = 0; i < lines; i++) {
  let spaces = ' '
  let blocks = '*'
  spaces = spaces.repeat(lines - i - 1)
  blocks = blocks.repeat(i * 2 + 1)
  console.log(spaces + blocks)
}

明らかにスッキリした。書き換わった部分は簡単だ。繰り返し構文を使用していた箇所をJavaScript標準で組み込まれている文字列の繰り返し(repeat)メソッドを用いただけだ。機能一つ一つをしっかりと認知していれば、長々とした構文を記述する必要もなくなるので時間の節約にもなるだろう。

更に整理する

更に踏み込むと、不要な代入などは消せることに気づく。

const lines = 5

for (let i = 0; i < lines; i++) {
  const spaces = ' '.repeat(lines - i - 1)
  const blocks = '*'.repeat(i * 2 + 1)
  console.log(spaces + blocks)
}

最初のコードに比べれば、半分ほどになったのではないだろうか。文字数が命となる場合は、これほどまでに短縮できる方法を自ら探って実現していきたいところだ。
ただ、話はこれで終わらない。

個人的最終短縮形

そして、こうじゃ。
一番短くシンプルになったのではないだろうか。こういうのを考える時が一番楽しいと感じる。

for (let i=0, lines=5;console.log(`${' '.repeat(lines-i-1)}${'*'.repeat(i*2+1)}`)||i<lines-1;i++);

異論は認める。できればJavaScriptで、もっとコードを短くできる案があれば、ぜひ共有してもらえると、とても喜ぶ。

Discussion