九九を50乗しようぜ☆(^~^)<その2>

読了目安:28分

<前回からの続き>

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 うーむ☆ うまくいかん☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 前回の説明をする☆ 九九を50乗すると末尾3桁に出てくる次の6つの数に
パワフルシックス と名付けたのだった☆」

20190707math26a2.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 パワフルシックス の空間は 末尾3桁 なのだった☆ つまり Mod 1000 が利いた空間☆
何が嬉しいかというと、奇数乗 すると 元に戻ることだぜ☆
例を示そう☆」

20190707math26a3.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 といっても☆、」

20190707math26a4.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 4つの数は 偶数乗しても 元に戻るんだけどな☆
249^2 mod 1000 は 1、
624^2 mod 1000 は 376 なので、
パワフルシックスを 累乗 mod 1000 すれば 4つの数のどれかに落ち着く☆」

20190707math27a1b1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 足しても 掛けても 面白いのだった☆
前回やったのは 掛け算 の図解で、
1×1×376 = 376、
1×1×624 = 624、
1×1×625 = 625
の3つの説明が できていないところだった☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 1 は 掛け算の最後に持っていくと うまくいくことに 気づいているんだが、
その説明は また今度だぜ☆ もう寝る☆」

つーぎーつぎ次の日

20190707math19a1b0.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 反例を消せていないので作りかけだが 1×1×376 などの計算ルールの案を教えよう☆」

20190708math28a1b1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 001、001、376を 角に持つ 直角四辺形を作れだぜ☆」

20190708math28a1b1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 右上が答えになるのだった☆
このとき、 追加ルール3 だぜ☆ 1の2乗は 対角線に置かなくていい☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 1 だけ 特別扱いしていいの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 図上に作れない長方形の場合、ルールを緩くしてく、という ルール があるのかも知れないな☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 これで すべてのルールを説明した☆ あとは 反例を消していこうぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 625×625×625 = 625 は 図上で作れないぜ☆
わたしは 図の外に 625 があることに 納得していない☆」

20190708math29a1.png

KIFUWARABE_80x100x8_01_Futu.gif
「 図の外に 625 があったならば、625×625×625=625 になるところと、
625×625×625=249 になるところ、
625×625×625=  1 になるところ が出てくるぜ☆」

20190708math29a2.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 正方形に延長するのではなく、長方形に延長するのならいけるかも知らん☆」

20190708math29a3.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 うーん☆? 反例が出てくるのは 右上の区画なのでは☆
右上の区画の底辺の 625、000、625、000 のラインから 625 を選ばれると
249 や 001 が出てきてダメになる☆ 選ばせないようにしないと☆」

20190708math29a4b1.png

KIFUWARABE_80x100x8_01_Futu.gif
「 625 は 左上隅、右上隅にもあるんだぜ☆
一番外の 直角四辺形の右上は 001☆ 反例☆」

20190708math29a5.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 うーむ☆ これでいいが 変だぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 なるほど長方形にしておけば 625 を3つ選んだ時に 4つ目の角は 625 になる☆
しかし 長方形にしておく理由が分からん☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ご主人さま☆ 好きなパワフルシックス数を 3つ言ってくれだぜ☆」

OKAZAKI_Yumemi_80x80x8_03_Zzz.gif
「 うーん、249、1、624」

20190708math30a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 3つ掛けた Mod 1000 は 多分 376☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 合ってるぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 うーむむむ☆ 合ってるところはあっても、反例が消えないぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 単に 右上の区画は選べない、というルールにしたら どうだぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 それは いけてそう……☆」

20190708math31a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 赤枠で囲ったところと、000 からは選べない☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 右上の足は 赤枠に入れるという条件を付けろだぜ☆」

20190708math31a1b1.png

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 376×249×624 のときに、001 のケースと 376 のケースがあるわよ?」

KIFUWARABE_80x100x8_01_Futu.gif
「 一番小さな数を 左下にするルールでも あるのかだぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 そんなルールがあるなら 一意に決めるところまで もっていけるかもしれないし、
より便利になりそう……☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 反例が出せなくなるまで 詰めよう☆
できたら NMT に投げれば 喜んで焼き肉が出てくるだろう☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 どうやって 反例が出ないか 分かるんだぜ☆?」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 はい反例! やっぱり 赤い枠の外に 625 を3つ、
赤い枠の中に 625 を1つ、という直角四辺形は作れないわよ?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 焼き肉が遠のく……☆」

20190708math32a1.png

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 なぜなら 左下の区画に 625 が無いからよ」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 上なり 右なり 1つずらせば 625 はあるんだが……☆
非対称性が 気になるよな☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 青い枠を縦に伸ばすと 赤い枠は縦に縮まる☆ 無理☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 赤枠の境界の底辺は 踏んでいいということにしたら どうだぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 数学的に意味があるのか分からん……☆」

20190708math33a1b1.png

KIFUWARABE_80x100x8_01_Futu.gif
「 対角線上の 右上の区画は踏めない、ということにしたらどうだぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 応用が利きそうなルールだよな☆ しかも 対称的だし、すっきりしている☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 今日はもう寝よ☆」

つぎぎぎぎ! 次の日

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Python3 で 四角形掛け算 の理論が成り立つか 総当たりで調べようぜ☆」

for i in range(1, 21):
    for j in range(1, 21):
        for k in range(1, 21):
            for l in range(1, 21):
                print("0 ", end="")
            print("")
        print("")
    print("")

print("Info    : Finished.")

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 16万個の 0 が表示されたんだが☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 直角四辺形になるのだから、もっと少なくて済むんじゃないのか☆?」

count = 0
end = 21
for x in range(1, end):
    for y in range(1, end):
        for x2 in range(x+1, end):
            for y2 in range(y+1, end):
                count += 1
                print("{:>5} ".format(count), end="")
            print("")
        print("")
    print("")

print("Info    : Finished.")

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 3万6100個の 0 が表示されたんだが☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 四辺形になってないのも数えてるだろ☆」

count = 0
end = 21
for y in range(1, end-1):
    for x in range(1, end-1):
        for y2 in range(y+1, end):
            for x2 in range(x+1, end):
                count += 1
                print("{:>5} ".format(count), end="")
            print("")
        print("")
    print("")

print("Info    : Finished.")

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 こう書いても 3万6100個の 0 が表示されたから 四角形にはなってるんじゃないか☆?」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 右上の角は 赤い枠の中に収めましょう」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 枠の中判定が めんどうくさいんで 関数を書こう……☆」

def is_red_zone(x, y):
    """
    九九エリアの右上の区画。
    """
    x2 = x % 10
    y2 = y % 10
    if(5 <= x2 and x2 <= 9):
        if(1 <= y2 and y2 <= 5):
            return True

    return False

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 こんなんで いいんだろうか……☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 テストを書きましょう。
納期に迫られたシステムエンジニアが床に崩れ落ちようとも、
霧の中から神を名乗るヒゲ面のおじいさんが現れて東の山を指差しても、まずはテストを書くのよ」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 こんなんで いいのかだぜ☆?」

count = 0
end = 21
for y in range(1, end-1):
    for x in range(1, end-1):
        count += 1
        if is_red_zone(x, y):
            print("[{:>5}] ".format(count), end="")
        else:
            print(" {:>5}  ".format(count), end="")
    print("")

print("Info    : Finished.")

KIFUWARABE_80x100x8_01_Futu.gif
「 実行してみようぜ☆?」

     1       2       3       4  [    5] [    6] [    7] [    8] [    9]     10      11      12      13      14  [   15] [   16] [   17] [   18] [   19]
    20      21      22      23  [   24] [   25] [   26] [   27] [   28]     29      30      31      32      33  [   34] [   35] [   36] [   37] [   38]
    39      40      41      42  [   43] [   44] [   45] [   46] [   47]     48      49      50      51      52  [   53] [   54] [   55] [   56] [   57]
    58      59      60      61  [   62] [   63] [   64] [   65] [   66]     67      68      69      70      71  [   72] [   73] [   74] [   75] [   76]
    77      78      79      80  [   81] [   82] [   83] [   84] [   85]     86      87      88      89      90  [   91] [   92] [   93] [   94] [   95]
    96      97      98      99     100     101     102     103     104     105     106     107     108     109     110     111     112     113     114
   115     116     117     118     119     120     121     122     123     124     125     126     127     128     129     130     131     132     133
   134     135     136     137     138     139     140     141     142     143     144     145     146     147     148     149     150     151     152
   153     154     155     156     157     158     159     160     161     162     163     164     165     166     167     168     169     170     171
   172     173     174     175     176     177     178     179     180     181     182     183     184     185     186     187     188     189     190
   191     192     193     194  [  195] [  196] [  197] [  198] [  199]    200     201     202     203     204  [  205] [  206] [  207] [  208] [  209]
   210     211     212     213  [  214] [  215] [  216] [  217] [  218]    219     220     221     222     223  [  224] [  225] [  226] [  227] [  228]
   229     230     231     232  [  233] [  234] [  235] [  236] [  237]    238     239     240     241     242  [  243] [  244] [  245] [  246] [  247]
   248     249     250     251  [  252] [  253] [  254] [  255] [  256]    257     258     259     260     261  [  262] [  263] [  264] [  265] [  266]
   267     268     269     270  [  271] [  272] [  273] [  274] [  275]    276     277     278     279     280  [  281] [  282] [  283] [  284] [  285]
   286     287     288     289     290     291     292     293     294     295     296     297     298     299     300     301     302     303     304
   305     306     307     308     309     310     311     312     313     314     315     316     317     318     319     320     321     322     323
   324     325     326     327     328     329     330     331     332     333     334     335     336     337     338     339     340     341     342
   343     344     345     346     347     348     349     350     351     352     353     354     355     356     357     358     359     360     361

KIFUWARABE_80x100x8_01_Futu.gif
「 多分 そこらへんだな☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 赤い枠は 対角線上だけにできる?」

def is_red_zone(x, y):
    """
    対角線上に現れる、九九エリアの右上の区画。
    """

    # 1辺10を1区画と考えたときの、対角線上にある区画。
    x3 = x // 10
    y3 = y // 10
    if(x3 == y3):
        # 九九エリアの右上の区画。
        x2 = x % 10
        y2 = y % 10
        if(5 <= x2 and x2 <= 9):
            if(1 <= y2 and y2 <= 5):
                return True

    return False

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 10で割ることで、10倍縮小ズームしたような効果を出して、ナナメを取ればいいんじゃないか☆
こんなんで いいのかだぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 実行してみようぜ☆?」

     1       2       3       4  [    5] [    6] [    7] [    8] [    9]     10      11      12      13      14      15      16      17      18      19
    20      21      22      23  [   24] [   25] [   26] [   27] [   28]     29      30      31      32      33      34      35      36      37      38
    39      40      41      42  [   43] [   44] [   45] [   46] [   47]     48      49      50      51      52      53      54      55      56      57
    58      59      60      61  [   62] [   63] [   64] [   65] [   66]     67      68      69      70      71      72      73      74      75      76
    77      78      79      80  [   81] [   82] [   83] [   84] [   85]     86      87      88      89      90      91      92      93      94      95
    96      97      98      99     100     101     102     103     104     105     106     107     108     109     110     111     112     113     114
   115     116     117     118     119     120     121     122     123     124     125     126     127     128     129     130     131     132     133
   134     135     136     137     138     139     140     141     142     143     144     145     146     147     148     149     150     151     152
   153     154     155     156     157     158     159     160     161     162     163     164     165     166     167     168     169     170     171
   172     173     174     175     176     177     178     179     180     181     182     183     184     185     186     187     188     189     190
   191     192     193     194     195     196     197     198     199     200     201     202     203     204  [  205] [  206] [  207] [  208] [  209]
   210     211     212     213     214     215     216     217     218     219     220     221     222     223  [  224] [  225] [  226] [  227] [  228]
   229     230     231     232     233     234     235     236     237     238     239     240     241     242  [  243] [  244] [  245] [  246] [  247]
   248     249     250     251     252     253     254     255     256     257     258     259     260     261  [  262] [  263] [  264] [  265] [  266]
   267     268     269     270     271     272     273     274     275     276     277     278     279     280  [  281] [  282] [  283] [  284] [  285]
   286     287     288     289     290     291     292     293     294     295     296     297     298     299     300     301     302     303     304
   305     306     307     308     309     310     311     312     313     314     315     316     317     318     319     320     321     322     323
   324     325     326     327     328     329     330     331     332     333     334     335     336     337     338     339     340     341     342
   343     344     345     346     347     348     349     350     351     352     353     354     355     356     357     358     359     360     361

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 上下反転するのは めんどくさいんで☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 しかし それでは 検証しにくいぜ☆」

end = 21
for y in reversed(range(1, end-1)):
    for x in range(1, end-1):
        address = (y-1)*(end-1)+x
        if is_red_zone(x, y):
            print("[{:>5}] ".format(address), end="")
        else:
            print(" {:>5}  ".format(address), end="")
    print("")

print("Info    : Finished.")

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 じゃあ yをひっくり返そうぜ☆」

   361     362     363     364     365     366     367     368     369     370     371     372     373     374     375     376     377     378     379
   341     342     343     344     345     346     347     348     349     350     351     352     353     354     355     356     357     358     359
   321     322     323     324     325     326     327     328     329     330     331     332     333     334     335     336     337     338     339
   301     302     303     304     305     306     307     308     309     310     311     312     313     314     315     316     317     318     319
   281     282     283     284     285     286     287     288     289     290     291     292     293     294  [  295] [  296] [  297] [  298] [  299]
   261     262     263     264     265     266     267     268     269     270     271     272     273     274  [  275] [  276] [  277] [  278] [  279]
   241     242     243     244     245     246     247     248     249     250     251     252     253     254  [  255] [  256] [  257] [  258] [  259]
   221     222     223     224     225     226     227     228     229     230     231     232     233     234  [  235] [  236] [  237] [  238] [  239]
   201     202     203     204     205     206     207     208     209     210     211     212     213     214  [  215] [  216] [  217] [  218] [  219]
   181     182     183     184     185     186     187     188     189     190     191     192     193     194     195     196     197     198     199
   161     162     163     164     165     166     167     168     169     170     171     172     173     174     175     176     177     178     179
   141     142     143     144     145     146     147     148     149     150     151     152     153     154     155     156     157     158     159
   121     122     123     124     125     126     127     128     129     130     131     132     133     134     135     136     137     138     139
   101     102     103     104     105     106     107     108     109     110     111     112     113     114     115     116     117     118     119
    81      82      83      84  [   85] [   86] [   87] [   88] [   89]     90      91      92      93      94      95      96      97      98      99
    61      62      63      64  [   65] [   66] [   67] [   68] [   69]     70      71      72      73      74      75      76      77      78      79
    41      42      43      44  [   45] [   46] [   47] [   48] [   49]     50      51      52      53      54      55      56      57      58      59
    21      22      23      24  [   25] [   26] [   27] [   28] [   29]     30      31      32      33      34      35      36      37      38      39
     1       2       3       4  [    5] [    6] [    7] [    8] [    9]     10      11      12      13      14      15      16      17      18      19

KIFUWARABE_80x100x8_01_Futu.gif
「 赤枠が 下に4つ ずれてるぜ☆ 4つ 上げてくれだぜ☆」

def is_red_zone(x, y):
    """
    対角線上に現れる、九九エリアの右上の区画。
    """

    # 1辺10を1区画と考えたときの、対角線上にある区画。
    x3 = x // 10
    y3 = y // 10
    if(x3 == y3):
        # 九九エリアの右上の区画。
        x2 = x % 10
        y2 = y % 10
        if(5 <= x2 and x2 <= 9):
            if(5 <= y2 and y2 <= 9):
                return True

    return False

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 4つ上げるだけでいいのかだぜ☆ if文の中のマジックナンバーを 4 増やすぜ☆」

   361     362     363     364     365     366     367     368     369     370     371     372     373     374  [  375] [  376] [  377] [  378] [  379]
   341     342     343     344     345     346     347     348     349     350     351     352     353     354  [  355] [  356] [  357] [  358] [  359]
   321     322     323     324     325     326     327     328     329     330     331     332     333     334  [  335] [  336] [  337] [  338] [  339]
   301     302     303     304     305     306     307     308     309     310     311     312     313     314  [  315] [  316] [  317] [  318] [  319]
   281     282     283     284     285     286     287     288     289     290     291     292     293     294  [  295] [  296] [  297] [  298] [  299]
   261     262     263     264     265     266     267     268     269     270     271     272     273     274     275     276     277     278     279
   241     242     243     244     245     246     247     248     249     250     251     252     253     254     255     256     257     258     259
   221     222     223     224     225     226     227     228     229     230     231     232     233     234     235     236     237     238     239
   201     202     203     204     205     206     207     208     209     210     211     212     213     214     215     216     217     218     219
   181     182     183     184     185     186     187     188     189     190     191     192     193     194     195     196     197     198     199
   161     162     163     164  [  165] [  166] [  167] [  168] [  169]    170     171     172     173     174     175     176     177     178     179
   141     142     143     144  [  145] [  146] [  147] [  148] [  149]    150     151     152     153     154     155     156     157     158     159
   121     122     123     124  [  125] [  126] [  127] [  128] [  129]    130     131     132     133     134     135     136     137     138     139
   101     102     103     104  [  105] [  106] [  107] [  108] [  109]    110     111     112     113     114     115     116     117     118     119
    81      82      83      84  [   85] [   86] [   87] [   88] [   89]     90      91      92      93      94      95      96      97      98      99
    61      62      63      64      65      66      67      68      69      70      71      72      73      74      75      76      77      78      79
    41      42      43      44      45      46      47      48      49      50      51      52      53      54      55      56      57      58      59
    21      22      23      24      25      26      27      28      29      30      31      32      33      34      35      36      37      38      39
     1       2       3       4       5       6       7       8       9      10      11      12      13      14      15      16      17      18      19

KIFUWARABE_80x100x8_01_Futu.gif
「 フーム☆
いいんじゃないか☆」

count = 0
end = 21
for y in reversed(range(1, end-1)):
    for x in range(1, end-1):
        for y2 in range(y+1, end):
            for x2 in range(x+1, end):
                # 右上角はレッドゾーンの中にあること。
                if is_red_zone(x2, y):
                    count += 1
                    print("{:>5} ".format(count), end="")
    print("")

print("Info    : Finished.")

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 じゃあ 作った関数で 総当たりをしよう☆
3150個の数字が表示されたぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 31600の 16分の2 は 3950 だが、それより少ないな☆
合ってるのかだぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 赤枠は 4分の1 より少し大きいからな☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 左上、左下、右下の角は 赤い枠 を踏んじゃだめなのよ。 できる?」

count = 0
end = 21
for y in reversed(range(1, end-1)):
    for x in range(1, end-1):
        for y2 in range(y+1, end):
            for x2 in range(x+1, end):
                # 右上角はレッドゾーンの中にあること。
                # 左上角、左下角、右下角はレッドゾーンの外にあること。
                if is_red_zone(x2, y) and not is_red_zone(x, y) and not is_red_zone(x, y2) and not is_red_zone(x2, y2):
                    count += 1
                    print("{:>5} ".format(count), end="")
    print("")

print("Info    : Finished.")

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 処理時間を気にしなくていいなら 4つの角がそれぞれ 赤い枠の中にあるか、ないか 判定するだけだぜ☆
1450個の数字が表示されたぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 左上、左下、右下の角は 0 も踏んじゃだめなのよ。 できる?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 パワフルシックスのテーブルを 事前に作っておきたいよな☆
繰り返しパターンなのは 決まっているし……☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Python3 で二次元配列って どうやって作るんだぜ☆?」

# 19x19。
table = []
for y in range(1, 20):
    line = []
    for x in range(1, 20):
        num = (x*y) ** 50 % 1000
        line.append(num)
    table.append(line)

print("table = {}".format(table))

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 こんなんで いいのかだぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 実行してみようぜ☆?」

table = [
    [1, 624, 249, 376, 625, 376, 249, 624, 1, 0, 1, 624, 249, 376, 625, 376, 249, 624, 1],
    [624, 376, 376, 624, 0, 624, 376, 376, 624, 0, 624, 376, 376, 624, 0, 624, 376, 376, 624],
    [249, 376, 1, 624, 625, 624, 1, 376, 249, 0, 249, 376, 1, 624, 625, 624, 1, 376, 249],
    [376, 624, 624, 376, 0, 376, 624, 624, 376, 0, 376, 624, 624, 376, 0, 376, 624, 624, 376],
    [625, 0, 625, 0, 625, 0, 625, 0, 625, 0, 625, 0, 625, 0, 625, 0, 625, 0, 625],
    [376, 624, 624, 376, 0, 376, 624, 624, 376, 0, 376, 624, 624, 376, 0, 376, 624, 624, 376],
    [249, 376, 1, 624, 625, 624, 1, 376, 249, 0, 249, 376, 1, 624, 625, 624, 1, 376, 249],
    [624, 376, 376, 624, 0, 624, 376, 376, 624, 0, 624, 376, 376, 624, 0, 624, 376, 376, 624],
    [1, 624, 249, 376, 625, 376, 249, 624, 1, 0, 1, 624, 249, 376, 625, 376, 249, 624, 1],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [1, 624, 249, 376, 625, 376, 249, 624, 1, 0, 1, 624, 249, 376, 625, 376, 249, 624, 1],
    [624, 376, 376, 624, 0, 624, 376, 376, 624, 0, 624, 376, 376, 624, 0, 624, 376, 376, 624],
    [249, 376, 1, 624, 625, 624, 1, 376, 249, 0, 249, 376, 1, 624, 625, 624, 1, 376, 249],
    [376, 624, 624, 376, 0, 376, 624, 624, 376, 0, 376, 624, 624, 376, 0, 376, 624, 624, 376],
    [625, 0, 625, 0, 625, 0, 625, 0, 625, 0, 625, 0, 625, 0, 625, 0, 625, 0, 625],
    [376, 624, 624, 376, 0, 376, 624, 624, 376, 0, 376, 624, 624, 376, 0, 376, 624, 624, 376],
    [249, 376, 1, 624, 625, 624, 1, 376, 249, 0, 249, 376, 1, 624, 625, 624, 1, 376, 249],
    [624, 376, 376, 624, 0, 624, 376, 376, 624, 0, 624, 376, 376, 624, 0, 624, 376, 376, 624],
    [1, 624, 249, 376, 625, 376, 249, 624, 1, 0, 1, 624, 249, 376, 625, 376, 249, 624, 1]
]

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 手で整形した☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 これを そのまま さっきのプログラムで利用してみましょう」

end = 21
for y in reversed(range(1, end-1)):
    for x in range(1, end-1):
        cell = table[y-1][x-1]
        if is_red_zone(x, y):
            print("[{:>3}] ".format(cell), end="")
        else:
            print(" {:>3}  ".format(cell), end="")
    print("")

print("Info    : Finished.")

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 こうかだぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 実行してみようぜ☆?」

   1   624   249   376   625   376   249   624     1     0     1   624   249   376  [625] [376] [249] [624] [  1]
 624   376   376   624     0   624   376   376   624     0   624   376   376   624  [  0] [624] [376] [376] [624]
 249   376     1   624   625   624     1   376   249     0   249   376     1   624  [625] [624] [  1] [376] [249]
 376   624   624   376     0   376   624   624   376     0   376   624   624   376  [  0] [376] [624] [624] [376]
 625     0   625     0   625     0   625     0   625     0   625     0   625     0  [625] [  0] [625] [  0] [625]
 376   624   624   376     0   376   624   624   376     0   376   624   624   376     0   376   624   624   376
 249   376     1   624   625   624     1   376   249     0   249   376     1   624   625   624     1   376   249
 624   376   376   624     0   624   376   376   624     0   624   376   376   624     0   624   376   376   624
   1   624   249   376   625   376   249   624     1     0     1   624   249   376   625   376   249   624     1
   0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
   1   624   249   376  [625] [376] [249] [624] [  1]    0     1   624   249   376   625   376   249   624     1
 624   376   376   624  [  0] [624] [376] [376] [624]    0   624   376   376   624     0   624   376   376   624
 249   376     1   624  [625] [624] [  1] [376] [249]    0   249   376     1   624   625   624     1   376   249
 376   624   624   376  [  0] [376] [624] [624] [376]    0   376   624   624   376     0   376   624   624   376
 625     0   625     0  [625] [  0] [625] [  0] [625]    0   625     0   625     0   625     0   625     0   625
 376   624   624   376     0   376   624   624   376     0   376   624   624   376     0   376   624   624   376
 249   376     1   624   625   624     1   376   249     0   249   376     1   624   625   624     1   376   249
 624   376   376   624     0   624   376   376   624     0   624   376   376   624     0   624   376   376   624
   1   624   249   376   625   376   249   624     1     0     1   624   249   376   625   376   249   624     1

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 いーんじゃないの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 これを使って1450回ぐらいループすれば 長方形掛け算 が成立するか くまなく調べられるな☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 やってみようぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 インスタント・コーヒーを飲んでからな☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
( ずずずっ……☆)

KIFUWARABE_80x100x8_01_Futu.gif
「 のんびりしてんなあ☆!」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
( ずずずっ……☆)

KIFUWARABE_80x100x8_01_Futu.gif
( いらいらっ☆!)

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Python3 の配列の添え字は 0 オリジンかだぜ☆? 直そ☆」

def is_red_zone(x, y):
    """
    対角線上に現れる、九九エリアの右上の区画。
    """

    # 1辺10を1区画と考えたときの、対角線上にある区画。
    x3 = x // 10
    y3 = y // 10
    if(x3 == y3):
        # 九九エリアの右上の区画。
        x2 = x % 10
        y2 = y % 10
        if(4 <= x2 and x2 <= 8):
            if(4 <= y2 and y2 <= 8):
                return True

    return False

for y in reversed(range(0, 19)):
    for x in range(0, 19):
        cell = table[y][x]
        if is_red_zone(x, y):
            print("[{:>3}] ".format(cell), end="")
        else:
            print(" {:>3}  ".format(cell), end="")
    print("")

end = 19
for y in reversed(range(0, end-1)):
    for x in range(0, end-1):
        for y2 in range(y+1, end):
            for x2 in range(x+1, end):
                # 左上角、右下角、左下角 はレッドゾーンの外にあること。
                # 右上角はレッドゾーンの中にあること。
                if not is_red_zone(x, y2) and not is_red_zone(x2, y) and not is_red_zone(x, y) and is_red_zone(x2, y2):
                    tl = table[y2][x]
                    br = table[y][x2]
                    bl = table[y][x]
                    tr = table[y2][x2]

                    # 左上角、右下角、左下角 は 0 を踏んではいけない。
                    if tl != 0 and br != 0 and bl != 0:
                        result = ""
                        if tl*br*bl == tr:
                            result = "o"
                        else:
                            result = "x"

                        print("[{} {}:{}][{} {}:{}][{} {}:{}]=[{} {}:{}]{} ".format(
                            x, y2, tl, x2, y, br, x, y, bl, x2, y2, tr, result), end="")
    print("")

print("Info    : Finished.")

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 はあ……、なるほど……☆」

20190709math34a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 625×624×376 mod 1000 = 0 なので 右上625 は反例という指摘だぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 早くも終了か☆?」

20190709math35a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 任意選択できる箇所があるのが原因だな☆
これらは ルールで どちらか一方が自動的に選択されるように しておかなければいけないぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 じゃあ試しに 正方形で 縛ってみるかだぜ☆?」

# 長方形
Info    : Succeed 180
Info    : Failed  2856
Info    : Rate 0.0592
# 正方形縛り
Info    : Succeed  14
Info    : Failed  170
Info    : Rate 0.0760

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 正方形では ぜんぜん 答えにならないのか、14通りで 多くを答えているのか☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 0 を踏まないから残り 5つの数があって、組み合わせは 5×4×3 の60通りあるんじゃないの?
14 じゃ全然足りなくない?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 あっ、間違えていた……☆ Mod 1000 するのを忘れていた……☆」

succeed = 0
failed = 0
end = 19
for y in reversed(range(0, end-1)):
    for x in range(0, end-1):
        for y2 in range(y+1, end):
            for x2 in range(x+1, end):
                # 左上角、右下角、左下角 はレッドゾーンの外にあること。
                # 右上角はレッドゾーンの中にあること。
                if not is_red_zone(x, y2) and not is_red_zone(x2, y) and not is_red_zone(x, y) and is_red_zone(x2, y2):
                    tl = table[y2][x]
                    br = table[y][x2]
                    bl = table[y][x]
                    tr = table[y2][x2]

                    # 左上角、右下角、左下角 は 0 を踏んではいけない。
                    if tl != 0 and br != 0 and bl != 0:
                        # 正方形であること。
                        if y2-y == x2-x:
                            result = ""
                            if tl*br*bl % 1000 == tr:
                                result = "o"
                                succeed += 1
                            else:
                                result = "x"
                                failed += 1

                            print("[{} {}:{}][{} {}:{}][{} {}:{}]=[{} {}:{}({})]{} ".format(
                                x, y2, tl, x2, y, br, x, y, bl, x2, y2, tr, tl*br*bl % 1000, result), end="")
    print("")

print("Info    : Succeed {:>3}".format(succeed))
print("Info    : Failed  {:>3}".format(failed))
print("Info    : Rate    {:>.4f}".format(succeed/(succeed+failed)))
print("Info    : Finished.")

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 今までの結果は 忘れろだぜ☆」

# 正方形縛り
Info    : Succeed 162
Info    : Failed   22
Info    : Rate    0.8804

# 長方形
Info    : Succeed 2396
Info    : Failed  640
Info    : Rate    0.7892

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 正解率が8割超えてて わらう」

KIFUWARABE_80x100x8_01_Futu.gif
「 もし正方形で すべてをカバーしているとしたら、正方形だけを調べるようにしたいぜ☆
162+22=184☆ 目視確認ができそうな現実的な数だぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 そういえば 追加ルール をまだ実装してなかったな……☆ 今日はもう寝る☆」

次の日の次の日はもしかして次の日

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 3つの角のうち、001 以外のパワフルシックス数で 同じ数が2つあれば 左上と右下に配置しなければいけない、
というルールがあったな☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 どうやって ふるい分けるんだぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 そうなって いないとき 弾けばいいんじゃないか☆?」

succeed = 0
failed = 0
end = 19
for y in reversed(range(0, end-1)):
    for x in range(0, end-1):
        for y2 in range(y+1, end):
            for x2 in range(x+1, end):
                # 左上角、右下角、左下角 はレッドゾーンの外にあること。
                # 右上角はレッドゾーンの中にあること。
                if not is_red_zone(x, y2) and not is_red_zone(x2, y) and not is_red_zone(x, y) and is_red_zone(x2, y2):
                    tl = table[y2][x]
                    br = table[y][x2]
                    bl = table[y][x]
                    tr = table[y2][x2]

                    # 左上角、右下角、左下角 は 0 を踏んではいけない。
                    if tl != 0 and br != 0 and bl != 0:
                        # 3つの角のうち 2つだけが同じなのに、それが左上と右下の配置でなければ、いけない。
                        if (bl == tl and bl != br) or (bl == br and bl != tl):
                            if bl != 1:
                                # ただし、001 は例外。
                                continue

                        # 正方形であること。
                        # if y2-y == x2-x:
                        result = ""
                        if tl*br*bl % 1000 == tr:
                            result = "o"
                            succeed += 1
                        else:
                            result = "x"
                            failed += 1

                        print("[{} {}:{}][{} {}:{}][{} {}:{}]=[{} {}:{}({})]{} ".format(
                            x, y2, tl, x2, y, br, x, y, bl, x2, y2, tr, tl*br*bl % 1000, result), end="")
    print("")

print("Info    : Succeed {:>3}".format(succeed))
print("Info    : Failed  {:>3}".format(failed))
print("Info    : Rate    {:>.4f}".format(succeed/(succeed+failed)))
print("Info    : Finished.")
# 正方形縛り
Info    : Succeed  92
Info    : Failed   18
Info    : Rate    0.8364
Info    : Finished.

# 長方形
Info    : Succeed 1500
Info    : Failed  288
Info    : Rate    0.8389

KIFUWARABE_80x100x8_01_Futu.gif
「 レートが似てきたということは、正方形かどうかは どうでもいいのかだぜ☆?」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 目視確認する?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 そんな便利な機能 付いてないんだが……☆」

def show_rect(corner):
    for y in reversed(range(0, 19)):
        for x in range(0, 19):
            cell = table[y][x]
            if 0 < corner.count([x, y]):
                # 赤枠が見えなくなるのは赦せだぜ☆(^~^)
                print("<{:>3}> ".format(cell), end="")
            elif is_red_zone(x, y):
                print("[{:>3}] ".format(cell), end="")
            else:
                print(" {:>3}  ".format(cell), end="")
        print("")

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 用が足せれば それでいい、というようなプログラム☆」

succeed = 0
failed = 0
end = 19
for y in reversed(range(0, end-1)):
    for x in range(0, end-1):
        for y2 in range(y+1, end):
            for x2 in range(x+1, end):
                # 左上角、右下角、左下角 はレッドゾーンの外にあること。
                # 右上角はレッドゾーンの中にあること。
                if not is_red_zone(x, y2) and not is_red_zone(x2, y) and not is_red_zone(x, y) and is_red_zone(x2, y2):
                    tl = table[y2][x]
                    br = table[y][x2]
                    bl = table[y][x]
                    tr = table[y2][x2]

                    # 左上角、右下角、左下角 は 0 を踏んではいけない。
                    if tl != 0 and br != 0 and bl != 0:
                        # 3つの角のうち 2つだけが同じなのに、それが左上と右下の配置でなければ、いけない。
                        if (bl == tl and bl != br) or (bl == br and bl != tl):
                            if bl != 1:
                                # ただし、001 は例外。
                                continue

                        # 正方形であること。
                        if y2-y == x2-x:
                            result = ""
                            if tl*br*bl % 1000 == tr:
                                result = "o"
                                succeed += 1
                            else:
                                result = "x"
                                failed += 1

                            # 反例だけ表示。
                            if result == "x":
                                print("[{} {}:{}][{} {}:{}][{} {}:{}]=[{} {}:{}({})]{} ".format(
                                    x, y2, tl, x2, y, br, x, y, bl, x2, y2, tr, tl*br*bl % 1000, result))
                                show_rect([[x, y2], [x2, y], [x, y], [x2, y2]])
    print("")

print("Info    : Succeed {:>3}".format(succeed))
print("Info    : Failed  {:>3}".format(failed))
print("Info    : Rate    {:>.4f}".format(succeed/(succeed+failed)))
print("Info    : Finished.")

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 これでどうか☆?」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 次の記事で見ていきましょう!」

<書きかけ>


むずでょ@きふわらべ第29回世界コンピューター将棋選手権一次予選36位

光速のアカウント凍結されちゃったんで……。ゲームプログラムを独習中なんだぜ☆電王戦IIに出た棋士もコンピューターもみんな好きだぜ☆▲(パソコン将棋)WCSC29一次予選36位、SDT5予選42位▲(パソコン囲碁)AI竜星戦予選16位

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

関連記事

コメント