わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

36通り,61通り

2019年になりました.今年もよろしくお願いします.
いきなりですが問題です.

九九で,「3×5」と「5×3」のように,かけられる数とかける数を反対にしてできる,異なる式の組み合わせをすべて,答えましょう.

「組み合わせ」ですので,「3×5と5×3」を1つの組としたら,「5×3と3×5」を別の組としてはいけません.「異なる式」というのは,「2×2」のような,かけられる数とかける数が同じになる式は,対象外(「2×2と2×2」は不可)となることを意味します.
といったところで解答です.Rubyワンライナーで求められます.

$ ruby -e 'puts (1..8).map{|x|((x+1)..9).map{|y|"%dx%d=%dx%d"%[x,y,y,x]}}.inject(:+)'
1x2=2x1
1x3=3x1
1x4=4x1
1x5=5x1
1x6=6x1
1x7=7x1
1x8=8x1
1x9=9x1
2x3=3x2
2x4=4x2
2x5=5x2
2x6=6x2
2x7=7x2
2x8=8x2
2x9=9x2
3x4=4x3
3x5=5x3
3x6=6x3
3x7=7x3
3x8=8x3
3x9=9x3
4x5=5x4
4x6=6x4
4x7=7x4
4x8=8x4
4x9=9x4
5x6=6x5
5x7=7x5
5x8=8x5
5x9=9x5
6x7=7x6
6x8=8x6
6x9=9x6
7x8=8x7
7x9=9x7
8x9=9x8

コマンドの後ろに「|wc -l」を付けると「36」と出ます.36通りとなります*1Rubyのコードについて,2つのmapに替えてeachを使い,入れ子の中でputsを用いれば,injectの呼び出しをする必要もなくなり,もっと字数は減ります.上の書き方にしたのは,求めた値(putsの引数)を配列としたかったからです.
さらにですが問題です.

九九で,「2×4」と「8×1」のように,かけ算の答えが等しくなる,異なる式の組み合わせをすべて,答えましょう.

この問題では「2×2」も考慮しないといけません.例えば「2×2と4×1」も,条件に合います.
こちらも,Rubyワンライナーにしてみます.

$ ruby -e 'puts (1..81).map{|z|(1..9).map{|x|z%x==0&&z/x<=9?"%dx%d"%[x,z/x]:nil}.compact.combination(2).map{|p|p.join("=")}}.inject(:+)'
1x2=2x1
1x3=3x1
1x4=2x2
1x4=4x1
2x2=4x1
1x5=5x1
1x6=2x3
1x6=3x2
1x6=6x1
2x3=3x2
2x3=6x1
3x2=6x1
1x7=7x1
1x8=2x4
1x8=4x2
1x8=8x1
2x4=4x2
2x4=8x1
4x2=8x1
1x9=3x3
1x9=9x1
3x3=9x1
2x5=5x2
2x6=3x4
2x6=4x3
2x6=6x2
3x4=4x3
3x4=6x2
4x3=6x2
2x7=7x2
3x5=5x3
2x8=4x4
2x8=8x2
4x4=8x2
2x9=3x6
2x9=6x3
2x9=9x2
3x6=6x3
3x6=9x2
6x3=9x2
4x5=5x4
3x7=7x3
3x8=4x6
3x8=6x4
3x8=8x3
4x6=6x4
4x6=8x3
6x4=8x3
3x9=9x3
4x7=7x4
5x6=6x5
4x8=8x4
5x7=7x5
4x9=6x6
4x9=9x4
6x6=9x4
5x8=8x5
6x7=7x6
5x9=9x5
6x8=8x6
6x9=9x6
7x8=8x7
7x9=9x7
8x9=9x8

組み合わせは61通りです.奇数になるのは,九九の範囲で「積が平方数になるとき,組み合わせは奇数通り(そうでない場合は偶数通り)」なのと「積が平方数になるのは9(奇数)通り」であるためです.
こちらでは,1から81までを積の候補とし,「積が等しくなる,かけられる数×かける数の式」を求めて配列に格納し,そこから,Array#combinationで組み合わせを獲得するという方法をとりました.

*1:「何通りか」だけであれば,すべて書き出す必要はなく,8+7+6+5+4+3+2+1や(9・9−9)/2といった式で,求めることができます.