この記事では、Python秒が24ポイントをカウントし、紙のサンプルコードでは、非常に詳細に説明し、習得したり、作業するために私たちのすべてのための学習の一定の基準値を持って説明し、必要としている友人はを参照することができます
24ポイントされているもの
、我々は最初の古いの下に合意します王と彼の妻の再生ポイント規則24:4は、任意の数(0-9)を与え、次いで+によって、 - 、*、/、これらの4つの図24から算出します。
すべてのルールと子の演奏、私はしませんので、rootだけは、何とか高度なアルゴリズムではなく、楽しみの様々なを持って、育ちます。
いくつかは、それは非常に単純で見つけるが、本当に簡単なこと?
例えば:
8,3,3,3
7,3,3,3
あなたは答えて一目?それは本当にそうです......
一般的なアイデアは、
それらの間の演算符号を追加して、4つのフルデジタルの配置を考えます。
唯一の4桁ので、我々は唯一の3つの演算子、演算子、およびアルゴリズムは、例えば3つ、繰り返されてもよいように、オペレータの順列と組み合わせを必要とする+あります。
次いで、4つの数字、数値の各セット、すべての組み合わせの横断オペレータの完全な配列を横切ります。最後に、数字や演算子スプライシング動作は、最終的な結果を得ることができます。
デモ環境
オペレーティングシステム:windows10
Pythonのバージョン:パイソン3.7
コード・エディタ:pycharm 2018.2
使用モジュール:数学、itertools、collections.abc
特定のコード
1、まず第一に、我々はここで私たちは私たちを助けるためにitertools.permutationsを使用して、すべての数字の完全な配列を行きます。
iertools.permutationsの使用のデモ
from itertools import permutations
data_list = permutations([1,2,3,4],2)
for data in data_list:
print(data)
結果は
(1, 2)
(1, 3)
(1, 4)
(2, 1)
(2, 3)
(2, 4)
(3, 1)
(3, 2)
(3, 4)
(4, 1)
(4, 2)
(4, 3)
順列最初のパラメータは2番目のパラメータが選択された配置は、オブジェクトクラスの反復から配置された文字の数を指定する受信オブジェクトクラスの反復です。第二引数で渡されないことがあり、デフォルトでは、オブジェクトの長さは、反復可能です。そして、ジェネレータを返します。
すべての必要性は、数字の完全な配列であることを私たちは、あなたは次のように書くことができます。
def get_all_data_sequence(data_iter):
return permutations(data_iter)
2、我々は事業者のすべての操作のすべての組み合わせを取得する必要があります。ここでは、関数itertools.productを使用します。
itertools.product使い方のデモ
from itertools import product
sequence1 = product('ABCD','xy')
sequence2 = product([0,1],repeat=3)
for sequence in sequence1:
print(sequence)
print('-'*30)
for sequence in sequence2:
print(sequence)
結果は
('A','x')
('A','y')
('B','x')
('B','y')
('C','x')
('C','y')
('D','x')
('D','y')
------------------------------
(0, 0, 0)
(0, 0, 1)
(0, 1, 0)
(0, 1, 1)
(1, 0, 0)
(1, 0, 1)
(1, 1, 0)
(1, 1, 1)
itertools.product、すべてのタプルは、渡されたシーケンスパラメータは、入来配列の繰り返し回数のデカルト積を表す繰り返し返します。これは、発電機を返します。
次に機能によって取得することができるすべての操作オペレータを得ます
def get_all_operations_sequence():
operations = ['+','-','*','/']
return product(operations,repeat=3)
3、そして今、私たちは、それらをつなぎ合わせする次の意志の必要性をオペレーターとデジタルのすべての可能な組み合わせを持っています。その後、動作が行われます。
このステップでは、我々はitertools.zip_longest()とitertools.chain.form_iterable()関数を使用します。
itertools.zip_longest()の使用のデモ
data = zip_longest([1,2,3,4],['*','-','+'],fillvalue='')
for value in data:
print(value)
結果は
(1, '*')
(2, '-')
(3, '+')
(4, '')
zip_longest()とPython実際内蔵ZIP()関数の使用がほとんどであるが、zip_longestパラメータ値fillvalueフィルの使用に欠損値、基準として最も長いシーケンスの一つであります
itertools.chain.form_iterable()の使用のデモ
data = zip_longest([1,2,3,4],['*','-','+'],fillvalue='')
data_chain = chain.from_iterable(data)
for value in data_chain:
print(value)
結果は
1
*
2
-
3
+
4
データは、ここで我々はデータchain.form_iterable()、それは裏返しに回すことができる値を渡します、我々はそれを知っているものです。
これら二つの機能を理解した後、我々は事業者のスプライシングおよびデジタルの操作を開始することができます。
def calculate(self):
'''
计算值,返回对应的表达式和值
:return:
'''
for data_sequence in get_all_data_sequence():
operation_sequences = get_all_operation_sequence()
for operation_sequence in operation_sequences:
value = zip_longest(data_sequence, operation_sequence,
fillvalue='')
value_chain = chain.from_iterable(value)
calculate_str = ''
# 对得到的字符进行拼接成为表达式 calculate_str
for _ in value_chain:
calculate_str += _
try:
result = eval(calculate_str
# 处理被除数可能为零的情况,然后就直接跳过这次循环
except ZeroDivisionError:
continue
if math.isclose(result, 24):
return calculate_str,result
return None,None
コード分析
図1に示すように、評価()関数は、文字列を受け取り、文字列は、実行の戻り結果、コードは、Pythonとして実行することを可能にします。
2、math.isclose():なぜここ代わりに==演算子が行う使用するのでは、使用math.isclose()する必要がありますか?私たちは、私たちは二つの数が等しいかどうかを判断math.isclose()ヘルプの機能を使用する必要があるので、これは、最後の計算式は... 24.0を精度の問題、例えば、または23.9を持っている可能性があるためである...と他のデジタル、この機能は持っています精度範囲。状況上記のような表示されますが、我々は条件に合致することができました。
私たちは、コードを実行し、コードが私たちのニーズを達成できるかどうかをテストします。
まず、我々は4つの数字1,2,3,4をテストし、
結果1のうちプログラム2 3 * 4 24
私たちがコードを書いたかのように正確であると思われます
私たちは、データ8,8,3,3のセットをテストしてみましょう。
ああ?我々は結果を取得できませんでしたか?これらの4つの図は、24にそれを計算することはできませんか?
8 /(3--8 / 3)このような組み合わせは、それが、なぜこのような結果からそれを働いていないことができますか?
括弧の我々が考慮されていないためです。ブラケットは、動作の優先順位を変更することができます。我々は考慮にブラケットを取らなければならないので。
ブラケットは、いくつかのDOまで、約そう思いますか?どのように我々は、括弧それを追加する式を与えるのですか?
4桁の動作では、ブラケットは、3つだけの最大値を有することができます。
そして、ここでは、我々は、括弧を追加する簡単な方法を使用して、我々はすべての可能なシナリオは完全なリストを括弧、その後、演算式にスプライス、得られ置きます。
おそらく、あなたは多くの場合があるので、括弧に記載されたすべての状況は、非現実的に表示されていることを感じます
我々はリストに行くとき実際には、あなただけの11例があります。
FORM_STRS = [
# 数字 运算符 数字 运算符 数字 运算符 数字
# 一个括号 的情况
'(%s %s %s) %s %s %s %s',
'(%s %s %s %s %s) %s %s',
'(%s %s %s %s %s %s %s)',
'%s %s (%s %s %s) %s %s',
'%s %s (%s %s %s %s %s)',
'%s %s %s %s (%s %s %s)',
# 两个括号 的情况
'(%s %s %s) %s (%s %s %s)',
'( (%s %s %s) %s %s) %s %s',
'( %s %s (%s %s %s)) %s %s',
'%s %s ((%s %s %s) %s %s)',
'%s %s (%s %s (%s %s %s))',
# 三个括号是重复的,就不用罗列出来了
]
その後、我々は、横断中の式スプライシングを取得し、その後、我々は式を算術ます。
だから我々は正しい結果に来ることができること
コードは最終的に始めることができますし、娘は、ああ、いや、王の家族の娘と遊ぶために、終了し
、収集を学習全体のpythonされているリソースを推薦する最後の[入力する]をクリック]、研究ノートを体験学習する前に、私のコレクションがあり、ここで、我々は進歩を一緒に勉強します、前方に置くことを知らない、私たちは一番下に、メッセージを残すことができ、そこにビジネスにおける第一線の経験があり、実際のプロジェクトデータに基づいて、ゼロに沈静化