行 と 列
n桁(n = 2 or 3)の整数同士の積が左右どちらから読んでも同じ値になる数の中で最大のものを求めるimmutable な関数。
require 'matrix' DIGITS = (2 .. 3) def max_sheherazade_numerics(digits) digits.map{ |digit| min_multiplier = 10 ** (digit - 1) max_multiplier = 10 ** (digit) - 1 row_size = (min_multiplier .. max_multiplier).size column_size = row_size {digit: digit, max_sheherazade_numeric: Matrix.build(row_size, column_size){ |row, column| (min_multiplier + row) * (min_multiplier + column) }.select{ |n| n.to_s == n.to_s.reverse }.max} } end p max_sheherazade_numerics(DIGITS)
行列(Matrix)を使うと簡単です。
余談
左右どちらから読んでも同じ読みになる文を「回文」と呼びますが、この様な数値は「回文数」と呼ぶそうです。
そして、回文数はまたの名を「シェヘラザード数」とも言うそうです。
千夜一夜物語の語り手、シェヘラザードから取った名前だとのこと。
なかなか洒落っ気のあるネーミングですね。