123456789から数100または0にする方法

科学の有名な普及者であるヤコフ・イシドロビッチ・ペレルマンの「面白い算術」で、最初の章の終わりに、次の「算数の好奇心」の例を見つけました。



100 = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 * 9

100 = 12 + 3-4 + 5 + 67 + 8 + 9

100 = 12-3-4 + 5-6 + 7 + 89

100 = 123 + 4-5 + 67-89

100 = 123-45-67 + 89



数学オリンピアードの小学校で最初に見つけたこれらの解決策の1つであり、その勝利が私の将来の発展に影響を与えているのではないかと考え、このタスクに敬意を表し、適切なPythonスクリプトを作成してすべての可能な解決策を見つけることにしました。



タスクを次のように記述します:123456789という数字の行があります(私は本当にゼロにはあまり興味がありませんが)、その間に4つの算術演算(+、-、*、/)を任意の場所に置くか、何も入れない(つまり、空の行を置きます)上記の本の例のように、結果として一般式が100になるように、2桁以上の数字が形成されます。 他には何も許されず、括弧も、順列も、テイクも、キックもありません。



私はプログラミングを学ばず、思いついたタスクを実現しました。 したがって、私は質問があります: 「どうすればこれをより良くできるでしょうか?」



そして、私はこれを思いつきました:スペースの文字を挿入するためのすべての可能なオプションをソートするために(そしてそれらの5つがあります:空の文字列、または+、-、*、/のいずれか)、左にゼロを追加したベース5の数字のバリアントとしてそれらを提示しました。 数字は9であるため、この数字の長さは8文字で、その間に8つのスペースがあります。 ゼロは空行に対応し、残りはすべて算術演算に対応します。 起こったことは次のとおりです。



Copy Source | Copy HTML<br/> from __future__ import division # for 2.x version <br/> <br/>s = '123456789' <br/>d = { '0' : '' , '1' : '+' , '2' : '-' , '3' : '*' , '4' : '/' }<br/>sum_num = 100 <br/>count = 0 <br/> <br/> def to_new_base (n, new_base):<br/> s = []<br/> if n == 0 :<br/> s.append( '0' )<br/> while n:<br/> s.append( str (n % new_base))<br/> n = n // new_base<br/> num = '{0:0>8}' .format( '' .join(s[::- 1 ]))<br/> return num<br/> <br/> <br/> for n in xrange ( int ( '44444444' , 5 )):<br/> num = to_new_base (n, 5 )<br/> expr = '' <br/> for i, j in zip (s, num):<br/> expr += i + d[j]<br/> expr += '9' <br/> if eval (expr) == sum_num:<br/> print ( '{0} = {1}' .format(expr, sum_num))<br/> count += 1 <br/> <br/> <br/> print 'So, {0} expressions for {1}' .format(count, sum_num) <br/>







100の場合、そのようなソリューションは101あり、それらのいくつかは非常に面白いです。



123 + 45-67 + 8-9 = 100

123 + 4-5 + 67-89 = 100

123 + 4 * 5-6 * 7 + 8-9 = 100

123-45-67 + 89 = 100

123-4-5-6-7 + 8-9 = 100

12 + 34 + 5 * 6 + 7 + 8 + 9 = 100

12 + 34-5 + 6 * 7 + 8 + 9 = 100

12 + 34-5-6 + 7 * 8 + 9 = 100

12 + 34-5-6-7 + 8 * 9 = 100

12 + 3 + 4 + 5-6-7 + 89 = 100

12 + 3 + 4-56 / 7 + 89 = 100

12 + 3-4 + 5 + 67 + 8 + 9 = 100

12 + 3 * 45 + 6 * 7-89 = 100

12 + 3 * 4 + 5 + 6 + 7 * 8 + 9 = 100

12 + 3 * 4 + 5 + 6-7 + 8 * 9 = 100

12 + 3 * 4-5-6 + 78 + 9 = 100

12-3 + 4 * 5 + 6 + 7 * 8 + 9 = 100

12-3 + 4 * 5 + 6-7 + 8 * 9 = 100

12-3-4 + 5-6 + 7 + 89 = 100

12-3-4 + 5 * 6 + 7 * 8 + 9 = 100

12-3-4 + 5 * 6-7 + 8 * 9 = 100

12 * 3-4 + 5-6 + 78-9 = 100

12 * 3-4-5-6 + 7 + 8 * 9 = 100

12 * 3-4 * 5 + 67 + 8 + 9 = 100

12/3 + 4 * 5-6-7 + 89 = 100

12/3 + 4 * 5 * 6-7-8-9 = 100

12/3 + 4 * 5 * 6 * 7 / 8-9 = 100

12/3/4 + 5 * 6 + 78-9 = 100

1 + 234-56-7-8 * 9 = 100

1 + 234 * 5 * 6/78 + 9 = 100

1 + 234 * 5 / 6-7-89 = 100

1 + 23-4 + 56 + 7 + 8 + 9 = 100

1 + 23-4 + 56/7 + 8 * 9 = 100

1 + 23-4 + 5 + 6 + 78-9 = 100

1 + 23-4-5 + 6 + 7 + 8 * 9 = 100

1 + 23 * 4 + 56/7 + 8-9 = 100

1 + 23 * 4 + 5-6 + 7-8 + 9 = 100

1 + 23 * 4-5 + 6 + 7 + 8-9 = 100

1 + 2 + 34-5 + 67-8 + 9 = 100

1 + 2 + 34 * 5 + 6-7-8 * 9 = 100

1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 * 9 = 100

1 + 2 + 3-45 + 67 + 8 * 9 = 100

1 + 2 + 3-4 + 5 + 6 + 78 + 9 = 100

1 + 2 + 3-4 * 5 + 6 * 7 + 8 * 9 = 100

1 + 2 + 3 * 4-5-6 + 7 + 89 = 100

1 + 2 + 3 * 4 * 56 / 7-8 + 9 = 100

1 + 2 + 3 * 4 * 5/6 + 78 + 9 = 100

1 + 2-3 * 4 + 5 * 6 + 7 + 8 * 9 = 100

1 + 2-3 * 4-5 + 6 * 7 + 8 * 9 = 100

1 + 2 * 34-56 + 78 + 9 = 100

1 + 2 * 3 + 4 + 5 + 67 + 8 + 9 = 100

1 + 2 * 3 + 4 * 5-6 + 7 + 8 * 9 = 100

1 + 2 * 3-4 + 56/7 + 89 = 100

1 + 2 * 3-4-5 + 6 + 7 + 89 = 100

1 + 2 * 3 * 4 * 5/6 + 7 + 8 * 9 = 100

1-23 + 4 * 5 + 6 + 7 + 89 = 100

1-23-4 + 5 * 6 + 7 + 89 = 100

1-23-4-5 + 6 * 7 + 89 = 100

1-2 + 3 + 45 + 6 + 7 * 8-9 = 100

1-2 + 3 * 4 + 5 + 67 + 8 + 9 = 100

1-2 + 3 * 4 * 5 + 6 * 7 + 8-9 = 100

1-2 + 3 * 4 * 5-6 + 7 * 8-9 = 100

1-2-34 + 56 + 7 + 8 * 9 = 100

1-2-3 + 45 + 6 * 7 + 8 + 9 = 100

1-2-3 + 45-6 + 7 * 8 + 9 = 100

1-2-3 + 45-6-7 + 8 * 9 = 100

1-2-3 + 4 * 56/7 + 8 * 9 = 100

1-2-3 + 4 * 5 + 67 + 8 + 9 = 100

1-2 * 3 + 4 * 5 + 6 + 7 + 8 * 9 = 100

1-2 * 3-4 + 5 * 6 + 7 + 8 * 9 = 100

1-2 * 3-4-5 + 6 * 7 + 8 * 9 = 100

1 * 234 + 5-67-8 * 9 = 100

1 * 23 + 4 + 56/7 * 8 + 9 = 100

1 * 23 + 4 + 5 + 67-8 + 9 = 100

1 * 23-4 + 5-6-7 + 89 = 100

1 * 23-4-56 / 7 + 89 = 100

1 * 23 * 4-56 / 7/8 + 9 = 100

1 * 2 + 34 + 56 + 7-8 + 9 = 100

1 * 2 + 34 + 5 + 6 * 7 + 8 + 9 = 100

1 * 2 + 34 + 5-6 + 7 * 8 + 9 = 100

1 * 2 + 34 + 5-6-7 + 8 * 9 = 100

1 * 2 + 34-56 / 7 + 8 * 9 = 100

1 * 2 + 3 + 45 + 67-8-9 = 100

1 * 2 + 3 + 4 * 5 + 6 + 78-9 = 100

1 * 2 + 3-4 + 5 * 6 + 78-9 = 100

1 * 2 + 3 * 4 + 5-6 + 78 + 9 = 100

1 * 2-3 + 4 + 56/7 + 89 = 100

1 * 2-3 + 4-5 + 6 + 7 + 89 = 100

1 * 2-3 + 4 * 5-6 + 78 + 9 = 100

1 * 2 * 34 + 56-7-8-9 = 100

1 * 2 * 3 + 4 + 5 + 6 + 7 + 8 * 9 = 100

1 * 2 * 3-45 + 67 + 8 * 9 = 100

1 * 2 * 3-4 + 5 + 6 + 78 + 9 = 100

1 * 2 * 3-4 * 5 + 6 * 7 + 8 * 9 = 100

1 * 2 * 3 * 4 + 5 + 6 + 7 * 8 + 9 = 100

1 * 2 * 3 * 4 + 5 + 6-7 + 8 * 9 = 100

1 * 2 * 3 * 4-5-6 + 78 + 9 = 100

1 * 2/3 + 4 * 5/6 + 7 + 89 = 100

1/2 * 34-5 + 6-7 + 89 = 100

1/2 * 3/4 * 56 + 7 + 8 * 9 = 100

1/2/3 * 456 + 7 + 8 + 9 = 100



次に、このような分解の可能な解の数が、非整数を含むすべての可能な和に完全に依存することを調べることにしました。 これを行うために、サイクルはディクショナリーにデータを取り込む機能を果たします。



Copy Source | Copy HTML<br/>figure = {}<br/>xlist = []<br/>ylist = []<br/> <br/> def func ():<br/> for n in range ( int ( '44444444' , 5 )):<br/> num = to_new_base(n, 5 )<br/> expr = '' <br/> for i, j in zip (line, num):<br/> expr += i + d[j]<br/> expr += '9' <br/> num_sum = eval (expr)<br/> if num_sum in figure:<br/> figure[num_sum] += 1 <br/> else :<br/> figure[num_sum] = 1 <br/> <br/> for key in sorted (figure):<br/> xlist.append(key)<br/> ylist.append(figure[key]) <br/>







依存関係リストylist = f(xlist)は、matplotlibを使用して描画されます。 依存関係は、167個のソリューションでゼロにピークがあります。







左の枝は右に対称ではありません。オプション1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9の前に、問題の状態によってマイナスを入れることができないためです。 ゼロに近づくほど、いくつかの可能な方法で表現できる実数が多くなります。



















分野[-1.1、1.1]のソリューションに関する別の考慮事項:ソリューションの最大数は、実際にはゼロになり、次に整数-1、1、そして半整数-0.5、0.5になります。







0〜100の整数のいずれかが次のように表現できることを確認します。







たぶん、このタスクは、たとえば小学校で私に与えられたものであり、1つの解決策を見つける必要があったので、カウントの速度と数字を処理する能力について、たとえば自分の子供や友人に尋ねるのが好きでしょう私が今見ているように、もっとたくさんありました。 そして、スクラッチ用の167のソリューションの少なくとも1つを見つけるために、自分の頭の中や紙の上で自分で試すことができます。



UPD:これらのグラフがすべて深刻なものだとは思わないでください。 タスク、コードを設定し、Pythonistsに何かをより速く書こうとすることを提案することを除けば、ここには深刻なことは何もありません。



UPD2:コードを改善するための素晴らしい方法は、ヘルマン コメントに書かれています



All Articles