名古屋で数学するプログラマ(仮)

@antimon2 が趣味兼一部本職の数学で何かするときのブログ。

平方三角数(『CodeIQの問題・パズルを考えよう!』提案その2)

CodeIQの問題・パズルを考えよう!(by CodeIQ×はてな)』にまた応募してみます。
今回はコードゴルフ問題案。

提案する問題

コードゴルフ】平方三角数


■平方三角数とは?
三角数とは、n×(n+1)/2 で表すことの出来る整数(>0)のこと。
1 から n までの整数の総和(\sum_{k=1}^n k)のことですね。
下図のように、綺麗な三角形の形に並べることが出来るので「三角数」と呼ばれます。

                   ●
             ●    ●●
        ●   ●●   ●●●
    ●  ●●  ●●●  ●●●●
 ● ●● ●●● ●●●● ●●●●● …
  1   3    6    10     15 …

平方数(別名:四角数)は、n2 で表すことの出来る整数(>0)のこと。
三角数と同様、綺麗な四角形(正方形)の形に並べることが出来ます。

               ●●●●●
          ●●●● ●●●●●
      ●●● ●●●● ●●●●●
   ●● ●●● ●●●● ●●●●●
 ● ●● ●●● ●●●● ●●●●● …
  1   4    9    16     25 …

そして平方三角数とは、平方数でありかつ三角数でもある数のことです。
一番小さい平方三角数は 1 、2 番目は 36(= 8×(8+1)/2 = 62)、3 番目は 1225、… となります。


■問題
標準入力から整数 N(>0)を与えて、N 番目の平方三角数を標準出力に出力するプログラムを書いてください。


■注意事項
 ・N の最大値は 99 としておきます。1 から 99 までの整数を与えて正しい平方三角数が出力されれば OK です。
 ・言語は Ruby 2.0.0 とします(※1)。


■解答方法
完成したコードをテキストファイル(.txt)に変換し、ファイルアップロードにより提出してください。
複数回ご提出いただいた場合は、正しく出力されるコードの中で、コードサイズが最小のものを記録とします。

この問題の問題点・要考察点

Ruby 2.0.0(※1) ?

コードゴルフ問題なので言語を指定すべきですが、Ruby2.0 としたのは、私が一番得意でこの問題も解きやすそうだから。
なのでこれは別にこの言語・バージョンにこだわる必要は全くないですね。
むしろ あっという間に 64bit の壁を超えることを承知の上で 多倍長整数型を標準で持たない言語を指定する、というのもありかも。

平方三角数

少しだけネタばらししてしまうと、Wikipedia(日本語版)で wikipedia:平方三角数 を調べれば、一般項を求める式も漸化式も載っています。
だからこの問題、そんなに難しくないんですよね。
フィボナッチ数列を列挙する有名なコードゴルフ問題に触れたことがあれば、あっという間に《上級の壁》は突破できると思います。

ということで、そもそも『平方三角数』ではなく、Wikipedia には載っていないような(でも法則性は数学的に掴みやすそうな)別の数列で問題を考えた方が良いかも。