<前回からの続き>
「 前回の説明をする☆ 九九を50乗すると末尾3桁に出てくる次の6つの数に
パワフルシックス と名付けたのだった☆」
「 パワフルシックス の空間は 末尾3桁 なのだった☆ つまり Mod 1000 が利いた空間☆
何が嬉しいかというと、奇数乗 すると 元に戻ることだぜ☆
例を示そう☆」
「 4つの数は 偶数乗しても 元に戻るんだけどな☆
249^2 mod 1000 は 1、
624^2 mod 1000 は 376 なので、
パワフルシックスを 累乗 mod 1000 すれば 4つの数のどれかに落ち着く☆」
「 足しても 掛けても 面白いのだった☆
前回やったのは 掛け算 の図解で、
1×1×376 = 376、
1×1×624 = 624、
1×1×625 = 625
の3つの説明が できていないところだった☆」
「 1 は 掛け算の最後に持っていくと うまくいくことに 気づいているんだが、
その説明は また今度だぜ☆ もう寝る☆」
「 反例を消せていないので作りかけだが 1×1×376 などの計算ルールの案を教えよう☆」
「 001、001、376を 角に持つ 直角四辺形を作れだぜ☆」
「 右上が答えになるのだった☆
このとき、 追加ルール3 だぜ☆ 1の2乗は 対角線に置かなくていい☆」
「 図上に作れない長方形の場合、ルールを緩くしてく、という ルール があるのかも知れないな☆」
「 これで すべてのルールを説明した☆ あとは 反例を消していこうぜ☆」
「 625×625×625 = 625 は 図上で作れないぜ☆
わたしは 図の外に 625 があることに 納得していない☆」
「 図の外に 625 があったならば、625×625×625=625 になるところと、
625×625×625=249 になるところ、
625×625×625= 1 になるところ が出てくるぜ☆」
「 正方形に延長するのではなく、長方形に延長するのならいけるかも知らん☆」
「 うーん☆? 反例が出てくるのは 右上の区画なのでは☆
右上の区画の底辺の 625、000、625、000 のラインから 625 を選ばれると
249 や 001 が出てきてダメになる☆ 選ばせないようにしないと☆」
「 625 は 左上隅、右上隅にもあるんだぜ☆
一番外の 直角四辺形の右上は 001☆ 反例☆」
「 なるほど長方形にしておけば 625 を3つ選んだ時に 4つ目の角は 625 になる☆
しかし 長方形にしておく理由が分からん☆」
「 ご主人さま☆ 好きなパワフルシックス数を 3つ言ってくれだぜ☆」
「 うーむむむ☆ 合ってるところはあっても、反例が消えないぜ☆」
「 単に 右上の区画は選べない、というルールにしたら どうだぜ☆?」
「 376×249×624 のときに、001 のケースと 376 のケースがあるわよ?」
「 一番小さな数を 左下にするルールでも あるのかだぜ☆?」
「 そんなルールがあるなら 一意に決めるところまで もっていけるかもしれないし、
より便利になりそう……☆」
「 反例が出せなくなるまで 詰めよう☆
できたら NMT に投げれば 喜んで焼き肉が出てくるだろう☆」
「 はい反例! やっぱり 赤い枠の外に 625 を3つ、
赤い枠の中に 625 を1つ、という直角四辺形は作れないわよ?」
「 上なり 右なり 1つずらせば 625 はあるんだが……☆
非対称性が 気になるよな☆」
「 赤枠の境界の底辺は 踏んでいいということにしたら どうだぜ☆?」
「 対角線上の 右上の区画は踏めない、ということにしたらどうだぜ☆?」
「 応用が利きそうなルールだよな☆ しかも 対称的だし、すっきりしている☆」
「 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.")
「 直角四辺形になるのだから、もっと少なくて済むんじゃないのか☆?」
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.")
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.")
「 こう書いても 3万6100個の 0 が表示されたから 四角形にはなってるんじゃないか☆?」
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
「 テストを書きましょう。
納期に迫られたシステムエンジニアが床に崩れ落ちようとも、
霧の中から神を名乗るヒゲ面のおじいさんが現れて東の山を指差しても、まずはテストを書くのよ」
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.")
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
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
「 10で割ることで、10倍縮小ズームしたような効果を出して、ナナメを取ればいいんじゃないか☆
こんなんで いいのかだぜ☆?」
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
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.")
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
「 赤枠が 下に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
「 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
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.")
「 じゃあ 作った関数で 総当たりをしよう☆
3150個の数字が表示されたぜ☆」
「 31600の 16分の2 は 3950 だが、それより少ないな☆
合ってるのかだぜ☆?」
「 左上、左下、右下の角は 赤い枠 を踏んじゃだめなのよ。 できる?」
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.")
「 処理時間を気にしなくていいなら 4つの角がそれぞれ 赤い枠の中にあるか、ないか 判定するだけだぜ☆
1450個の数字が表示されたぜ☆」
「 左上、左下、右下の角は 0 も踏んじゃだめなのよ。 できる?」
「 パワフルシックスのテーブルを 事前に作っておきたいよな☆
繰り返しパターンなのは 決まっているし……☆」
「 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))
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]
]
「 これを そのまま さっきのプログラムで利用してみましょう」
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.")
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
「 これを使って1450回ぐらいループすれば 長方形掛け算 が成立するか くまなく調べられるな☆」
「 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.")
「 625×624×376 mod 1000 = 0 なので 右上625 は反例という指摘だぜ☆」
「 任意選択できる箇所があるのが原因だな☆
これらは ルールで どちらか一方が自動的に選択されるように しておかなければいけないぜ☆」
# 長方形
Info : Succeed 180
Info : Failed 2856
Info : Rate 0.0592
# 正方形縛り
Info : Succeed 14
Info : Failed 170
Info : Rate 0.0760
「 正方形では ぜんぜん 答えにならないのか、14通りで 多くを答えているのか☆」
「 0 を踏まないから残り 5つの数があって、組み合わせは 5×4×3 の60通りあるんじゃないの?
14 じゃ全然足りなくない?」
「 あっ、間違えていた……☆ 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.")
# 正方形縛り
Info : Succeed 162
Info : Failed 22
Info : Rate 0.8804
# 長方形
Info : Succeed 2396
Info : Failed 640
Info : Rate 0.7892
「 もし正方形で すべてをカバーしているとしたら、正方形だけを調べるようにしたいぜ☆
162+22=184☆ 目視確認ができそうな現実的な数だぜ☆」
「 そういえば 追加ルール をまだ実装してなかったな……☆ 今日はもう寝る☆」
「 3つの角のうち、001 以外のパワフルシックス数で 同じ数が2つあれば 左上と右下に配置しなければいけない、
というルールがあったな☆」
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
「 レートが似てきたということは、正方形かどうかは どうでもいいのかだぜ☆?」
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("")
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.")
<書きかけ>
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント