日刊 あおのうま Vol.2294(2017.07.12)【アラビアンナイト】

投稿者: | 2017/07/12

行 と 列

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)を使うと簡単です。

余談

左右どちらから読んでも同じ読みになる文を「回文」と呼びますが、この様な数値は「回文数」と呼ぶそうです。
そして、回文数はまたの名を「シェヘラザード数」とも言うそうです。

千夜一夜物語の語り手、シェヘラザードから取った名前だとのこと。
なかなか洒落っ気のあるネーミングですね。

Screenshot of www.wikiwand.com

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください