虫食い算に挑戦してみました
けんちょんさんの虫食い算ツイートに挑戦してみました!
軽い気持ちで取り組んでみたのですが、解けそうなのになかなか解けない!という絶妙な難しさで、3時間かけて答えが出た時は思わず「できたーーーー!!」と叫び声をあげてしまいました。
とても楽しい時間を過ごせたので、答えが出るまでのあれこれを残しておこうと思います。
どこから手をつけていくか
それぞれの行にA~Fを割り当ててみました。
3か所わかっているDから攻めていきましょう。Dは割る数×商の十の位になります。
商の十の位を絞り込んでいく
下1桁が7になる組み合わせは「1×7」「7×1」「3×9」「9×3」の4通りですが、以下より商の候補から7・9が外れます。
・Dの万の位が7なので商に9はきません。
・Dの最大は79797なので、商の十の位が7の時、割る数は最大でも11399。ここでFを見ると、6桁かつ万の位が7なので170000以上の数になりますが、11399は9を掛けても102591でFに届きません。そのため7も商にはなりません。
商の十の位は1か3に絞られました。どうやらDとFを使うと候補を絞り込んでいけそうです。
商の十の位が1の時、割る数とFを調べてみる
商の十の位が1であれば、割る数はDそのものになるので、70707~79797の間になります。一方、Eに注目すると、いちばん上の位に値があることからCの頭は8か9になり、Eの頭は7を引いた1か2です。また、EとFの差が0であるのでE=Fになります。
ここで割る数とFの範囲を整理してみます。
・70707 <= 割る数 <= 79797
・170700 <= F <= 179799、または、270700 <= F <= 279799
Fは商の一の位×割る数なので、1~9倍してFの範囲内に収まるかチェックしてみると、
・79797(割る数の最大値)× 2 = 159594(<170700)なので、商の一の位は2より大きい。
・70707(割る数の最小値)× 4 = 282828(>279799)から、商の一の位は4より小さい。
・70707 × 3 = 212121、79797 × 3 = 239391 なので、Fの上から2番目の位が7になるものがない。よって、商の一の位は3ではない。
以上より、商の十の位が1の時、Fを満たすものがありませんでした。よって商の十の位は3で確定となります。
わかったところを問題に反映
商の十の位が確定したので、そこからわかることを問題に反映させました。
反映させた箇所は下記のとおりです。
・商の十の位は3。
・商が3であれば、B・Dのように下一桁が7になるのは9の時。よって割る数の一の位は9。
・割る数の一の位が9であれば、下一桁が7になるのは一組だけなので、商の百の位も3。これによりB・Dは同じ値になる。
・B・Dの範囲が70707~79797なので、割る数の範囲は3で割った23569~26599。よって割る数の万の位は2。
・E=Fであるため、Fのわかっている部分をEに反映。
※ちょっと長くなったので、もう一度反映部分を記載します。
Fに注目して商の一の位を求める
割る数は23569~26599の間、Fは170700~179799、または、270700~ 279799ということがわかっていますので、最小と最大に注目しつつ、商の一の位を絞り込んでいきます。
・26599(割る数の最大値)× 6 = 159594(<170700) より、商の一の位は6より大きい。
・23569(割る数の最小値)× 8 = 188552(>179799)、26599(割る数の最大値)× 9 = 239391(<270700)より、商の一の位は8より小さい。
以上より、商の一の位は7になります。範囲を確認してみると、23569 × 7 =164983、26599 × 7 =186193のため、170700~179799を範囲に含んでいます。
商の一の位に7を反映させてみます。E・Fの頭が1であることもここで判明しました。
予想外に苦しい仕上げ
商が出たのでゴール間近かと思っていましたが、ある程度まで絞れても決め手が見つからず、ここからの方がかなり悩みました。とりあえずFと比べて割る数を絞ってみます。
・Fの取り得る値は170703~179793。よって7で割った24387~25684が割る数の候補です。さらに割る数の下1桁が9なので、24389~25679まで候補が狭まります。
ここから先はいい方法が見つからなかったので、気合いで絞っていった感じです。総当たりに近い方法なので、ちょっとしたコードを書いて条件に合う数値を出した方がスマートかもしれません。
なお、下記のコードを実行すると、秒で答えが出ました。
#Python(3.8.2)
import re
for i in range(24389,25679+1,10):
cul1 = str(i * 3)
if re.match('7.7.7',cul1):
cul2 = str(i * 7)
if re.match('17.7.3',cul2):
print(i)
以下、気合い解法
・24389~25679の中で、「24□□9・25□□9」に3を掛けた結果が「7□7□7」になるパターンをすべて書き出します。(24□□9・25□□9の十の位に1~9を入れた後、結果の百の位が7になるよう、24□□9・25□□9の百の位を調整)
※24□□9と25□□9で十の位を1~9まですべて書き出したため、範囲外の数値も含まれています(24239、25919など)
書き出した割られる数候補に7を掛けて17□7□3になるものを探します。
ようやっと見つけたで~。
検算
商と割る数が判明したので、すべての数値を入れて条件を満たしているか確認します。
いいんじゃないでしょうか!!
振り返りと感想
商の十の位を決めるのにかなり手間取りました。Dだけ見ていると絞り込めず、Fと割る数の関係に目がいって、あっ!て感じになりました。
あとは商が出てからの解き方ですね。力技で答えにたどり着きましたが、もう少しきれいに解けるポイントがあるような気もします。
実は、最初に解けた~!!と思って出した答え、間違ってました……。この記事を書いていて「あれ? BとD、真ん中の7ないじゃん!」と気付いて計算し直してます。
この桁数でも割り切れる組み合わせは、けっこうあるんですよね。でも、力技で答えを出す過程で、条件を満たす組み合わせがひとつしか出てこなかったのを見て、詰将棋のような美しさを感じました。正解以外が間違いになるのってすごいことだと思います。
余談になりますが、計算式の画像を作るのが大変でした……。方眼スプシであれこれ工夫してそこそこ見やすいように作ったんですが、ちょっとした数式・画像を作りたい時に使う定番ツールがありましたら、教えて頂けると嬉しいです。
謝辞
けんちょんさん、面白い問題を作ってくださってありがとうございました! AtCoderの資料でも大変お世話になっております。本記事のコードを2分ぐらいで書けるようになったのは、けんちょんさんの資料を参照しながらAtcoderに取り組み始めた賜物です。
この記事が気に入ったらサポートをしてみませんか?