質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

4305閲覧

Pythonで覆面算(SEND + MORE==MONEY)のコードの書き方

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/06/16 02:24

編集2020/06/16 03:05

Cryptarithmetic(覆面算というらしいのですが)という課題で、有名な例題らしいのですが、
SEND + MORE ==MONEY の関数を今まで習ったfor ループとif文だけで書けということです。
そもそも覆面算とうのがどういうものかわからなかったため、ネットなどで調べたところ、各文字に数値を当てはめ計算上、その文字の数字になればよいということはわかりました。
ただ、それを具体的にコードではどう描くのかが全く思い浮かびません。
ネットなどで調べますとintertoolsといったツールを使っているようですが、まだ習っていないためか、今回の課題は「for ループとif文だけで書け」ということです。
どこからどう始めていいのかご教示いただきたくよろしくお願いします。
なお、これより文字数が少ないからまずこれをやれという課題では、
BE × BE = MOB を解けということです。
これを例にコードの書き方をお教えいただきたくよろしくお願いします。

BEMOの値は自分で条件から当てはめてみたところ、BE=19、MOB=361となりました。
ただそれをPythonでどう定義してかくかがわかりません。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

BE × BE = MOBは、

Python

1for B in range(10): 2 for E in range(10): 3 for M in range(10): 4 for O in range(10): 5 if (B * 10 + E) ** 2 == M * 100 + O * 10 + B: 6 print(B, E, M, O) 7```とかになって、 8`itertools`だったら、 9```Python 10from itertools import product 11 12for B, E, M, O in product(range(10), range(10), range(10), range(10)): 13 if (B * 10 + E) ** 2 == M * 100 + O * 10 + B: 14 print(B, E, M, O) 15```とかになるのではないでしょうか? 16-----追記----- 17`S`,`E`,`N`,`D`,`M`,`O`,`R`,`Y`を`for`文で回して、 18```Python 19if int("{}{}{}{}".format(S,E,N,D)) + int("{}{}{}{}".format(M,O,R,E)) == int("{}{}{}{}{}".format(M,O,N,E,Y)): 20 print(S,E,N,D,M,O,R,Y) 21````if`で分岐 22[format関数](https://note.nkmk.me/python-format-zero-hex/#strformat)を使っています。

投稿2020/06/16 03:00

編集2020/06/16 03:47
ForestSeo

総合スコア2722

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/06/16 03:14

素早い解答、本当にありがとうございます! こういうことが望まれていたのかとコードをはしらせてみてある程度理解できました。 ただ、質問があります。 文頭の0について 最初の文字には0は使わないとありました。 その場合、BとMの範囲を(1,9+1)にすればよいのでしょうか。 If文の中の式をみて、何をやっているかはこうやって表せばいいのだとよくわかりました。
退会済みユーザー

退会済みユーザー

2020/06/16 03:25

自分でBとMの範囲を(1、9+1)にしてやってみたらすべてゼロのものだけ省かれました。 とても図々しいお願いで恐縮なのですが、SENDMOREMONEYの方のコードもお願いできませんでしょうか。可能であればよろしくお願いします。
ForestSeo

2020/06/16 03:47 編集

編集してみました。 コードすべてはちょっと控えました。 課題なら最後は自分で考えることをお勧めします。 (多分 BE × BE = MOB を応用して解けるはずです。)
退会済みユーザー

退会済みユーザー

2020/06/16 03:56

ありがとうございます。 if文の中をどうするかを考えればよいのだと思います。 format関数はまだ習っていないので、どうかけばいいのかちょっと考えてみます。
ForestSeo

2020/06/16 04:06

だったら、S * 1000 + E * 100 + N * 10 + D とかにする必要があります。
退会済みユーザー

退会済みユーザー

2020/06/16 04:08

そうですね いま試していますがすごく時間がかかっています。 いろいろありがとうございました。 どうゆうふうにやればいいのかがわかったのでとても助かりました。 またよろしくお願いします。
guest

0

総当たりでやれ、ということだと思います。

python

1for b in range(10): 2 for e in range(10): 3 ... 4 if ( ( b * 10 + e ) * ... ) ...

投稿2020/06/16 02:54

Lhankor_Mhy

総合スコア36960

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/06/16 03:22

ありがとうございます。 おっしゃる通りだと思います。 他の方のコードも参考にこれはなんとかなりました。
Lhankor_Mhy

2020/06/16 03:24

蛇足ですが、覆面算は違う文字に同じ値が入ることはないので、そのチェックもした方がいいですよ。
退会済みユーザー

退会済みユーザー

2020/06/16 03:29

確かに!おっしゃる通りです コードの中にそれをチェックするためにはどうすればいいのかお分かりになりますか? 最後にチェックすればいいのでしょうか? 解決済みにしたのにすみません。
Lhankor_Mhy

2020/06/16 03:36

この程度の計算量なら最後にやっても問題ないと思いますが、各ループの頭にチェックして continue した方が無駄な計算が減ると思います。
退会済みユーザー

退会済みユーザー

2020/06/16 03:39

なるほど、そういうやり方があるのですね。 今回最後に4つは同じ数じゃないといれてprintしたらとりあえずは正しいものだけでてきました。 ご丁寧にありがとうございました。 してきされなければ気が付きませんでした。
Lhankor_Mhy

2020/06/16 03:41

いえいえ、課題頑張ってください。
退会済みユーザー

退会済みユーザー

2020/06/16 04:40

なんども大変申し訳ないです。 先ほどの数が4つのときは最後にまとめてif文の中にB != E != M != Oでうまくいったのですが、数がおおくなったSENDMONEYのほうですと同じ文字がでてきてしまいます。 各ループの頭にチェックをいれるとはforの前にif文でいれるのでしょうか。どうもうまくいきません。 すみませんが、お時間ありましたらチェック方法、なにをどう使えばいいのかおおしえいただけませんでしょうか。よろしくお願いします。
退会済みユーザー

退会済みユーザー

2020/06/16 05:54

ありがとうございます。 試してみましたが使い方がよくわかっていないため、FalesやTrueがでてきます。 if文のなかにいれるということでしょうか?何度もすみません。
Lhankor_Mhy

2020/06/16 05:59

>if文のなかにいれるということでしょうか? その通りです。 if 1 in [1,2,3]: print('1は、1と2と3の中に含まれています')
退会済みユーザー

退会済みユーザー

2020/06/16 06:05

ありがとうございました。 すっきりしたコードではないのですが、正しい答えが出てくるようにはなりました。 何度もお付き合いいただき本当にありがとうございました。大変助かりました。
Lhankor_Mhy

2020/06/16 06:09

「for と if で」という条件があるので、すっきりしたコードにはなりにくいと思いますから、仕方がありません。 お疲れ様でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問