- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个脚本,它循环超过 5 个数字向量,并将它们与所有四个操作混合,以搜索给出特定目标数字的组合作为结果。
脚本打印如下输出:
312 / 130 x 350 - 122 + 282 = 1000.0
312 / 130 x 350 + 282 - 122 = 1000.0
312 - 282 x 372 / 15 + 256 = 1000.0
142 + 350 - 372 x 125 / 15 = 1000.0
142 + 350 - 372 / 15 x 125 = 1000.0
350 / 130 x 312 + 282 - 122 = 1000.0
350 + 142 - 372 x 125 / 15 = 1000.0
每一行都根据数字列表和操作列表进行格式化。
我想做的是删除等效结果,即输出如下:
312 / 130 x 350 - 122 + 282 = 1000.0
312 - 282 x 372 / 15 + 256 = 1000.0
142 + 350 - 372 x 125 / 15 = 1000.0
作为解决方案,起初,我想“记住”已经给出 1000 的数字并跳过这些数字,但后来我意识到这可能会影响新的结果,所以我不知道该怎么做。
如何根据分配律和交换律找到等价结果?
注意:在呈现的输出中没有显示括号,但顺序类似于 reduce,这意味着,例如:
142 + 350 - 372 x 125 / 15 = 1000.0
计算如下:
(((142 + 350) - 372) x 125) / 15 = 1000.0
这是我目前的代码:
import operator
from itertools import permutations, product, count
from functools import reduce
vectors = [[87, 125, 209, 312],
[29, 122, 254, 372],
[15, 130, 277, 369],
[142, 197, 282, 383],
[64, 157, 256, 350]]
OPER = {operator.add: '+', operator.sub: '-', operator.mul: 'x',
operator.truediv: '/'}
def format_result(nums, ops, res):
s = ' '.join('{} {}'.format(n,OPER[op]) for n,op in zip(nums, ops))
s += ' {} = {}'.format(nums[-1], res)
return s
def calc(vectors, test=lambda x: x == 1000.):
for vv in permutations(vectors):
for indexes in product((0,1,2,3), repeat=5):
numbers = tuple(v[i] for i,v in zip(indexes, vv))
for operations in permutations(OPER):
res = reduce(lambda x,y,n=count(0): operations[next(n)](x,y),
numbers)
if test(res):
print(format_result(numbers, operations, res))
calc(vectors)
最佳答案
我认为可以根据对操作数执行的操作对操作数进行分组来解决这个问题。示例:
312 / 130 x 350 + 122 + 282 => (/, [312, 130]), (x, [350]), (+, [122, 282])
然后您可以对这些组的顺序施加某些限制:
-
组不能直接出现在 +
组之前/
组不能直接出现在*
组可能的分组如下所示:
+
连接,然后 2 asc. 操作数与 *
连接”+
连接,然后2个asc.操作数与*
连接,然后2个asc.操作数与/<连接
”不可能是这样的:
-
连接,然后 3 个 asc. 操作数与 +
连接”(会与“前 3 个 asc. 操作数与 a 连接”发生冲突+
,然后是-
我尝试了一种蛮力方法来创建和填充此类分组,但速度慢得令人难以忍受。也许你可以优化它以提高效率:)也可能是那里有一些微妙的错误,但不幸的是我没有更多的时间来处理它:
import operator
import fractions
from itertools import permutations, product, count
from functools import reduce
vectors = [[87, 125, 209, 312],
[29, 122, 254, 372],
[15, 130, 277, 369],
[142, 197, 282, 383],
[64, 157, 256, 350]]
vectors = [[fractions.Fraction(x) for x in v] for v in vectors]
operators = {
'+': operator.add,
'-': operator.sub,
'*': operator.mul,
'/': operator.div,
}
def create_groupings(n, exclude = ()):
if n <= 0: yield ()
for i in range(1, n+1):
if not '+' in exclude:
for rest in create_groupings(n - i, ('+',)):
yield ((i, '+'),) + rest
if not '-' in exclude:
for rest in create_groupings(n - i, ('+', '-')):
yield ((i, '-'),) + rest
if not '*' in exclude:
for rest in create_groupings(n - i, ('*',)):
yield ((i, '*'),) + rest
if not '/' in exclude:
for rest in create_groupings(n - i, ('/', '*')):
yield ((i, '/'),) + rest
def fill_grouping(groups, vectors):
if len(groups) == 0:
yield ()
return
(group_size, op), grest = groups[0], groups[1:]
for vv in permutations(vectors):
vecs, vrest = vectors[:group_size], vectors[group_size:]
for operands in map(list, product(*vecs)):
# enforce ascending ordering to avoid collisions
# like A + B == B + A
if operands != sorted(operands): continue
for rest in fill_grouping(grest, vrest):
yield ((op, operands),) + rest
groupings = create_groupings(5)
for g in groupings:
for groups in fill_grouping(g, vectors):
evaluated = ((op, reduce(operators[op], x)) for (op, x) in groups)
_, value = reduce(lambda (_, x), (op, y): (None, operators[op](x,y)), evaluated)
if 1000 == value:
print groups
希望这会有所帮助(至少是想法:)
关于python - 在分配律和交换律下找到等价结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9241729/
是: x -= y; 相当于: x = x - y; 最佳答案 不,它们并不等同于您表达它们的方式。 short x = 0, y = 0; x -= y; // This compiles f
这个问题在这里已经有了答案: What is the rationale for all comparisons returning false for IEEE754 NaN values? (1
我在哪里可以找到与 Python maketrans 和 translate 等效的 C# 代码?谢谢! 最佳答案 这应该带你到那里的大部分方式: public class MakeTrans {
我正在 SwiftUI 中构建一个应用程序其中包含很多组件,包括 Text包含长字符串的 View 。 当我在 iPhone 11 上启动该应用程序时,一切正常,但当我在较小的设备(例如 iPhone
这个问题已经有答案了: What is the equivalent lambda expression for System.out::println (2 个回答) Function pointe
我最近在使用 postgres,我必须做一些计算。然而我一直没能模仿Excel的HOUR()函数,我看了official information但这对我帮助不大。 函数接收一个小数,并得到小数的时、分
如果在 cython 中定义了一个指针 vector ,那么与 python 中的 enumerate 类似的函数或过程是什么,用于遍历指针数组中元素的索引和值在 C 声明类型函数内的循环中? 测试.
要选择: select user_id, max(case when value > 0 then timestamp else 0 end) as max_timestamp_whe
如果没有例子,这个问题很难问,所以这里是: #include struct O { }; struct C { template void function1(void (C::*call
我得到了这个结构的实现: struct NodoQ { Etype elem; NodoQ *sig; }; 下面是这段代码吗, typedef NodoQ *PtrNodoQ; PtrNod
我有一些宏需要访问当前类的类型,目前我通过违反 DRY 的模式解决了这个问题: struct ThisScruct{ int a; double b; //example st
我想知道 TensorFlow 的 softmax_cross_entropy_with_logits 是否有等效的 PyTorch 损失函数? 最佳答案 is there an equivalent
我找到了一个 trie 的 java 实现,并希望在 J2ME 中有一个类似的实现。这是代码。 节点类 import java.util.Collections; import java.util.L
我刚刚学习了 GraphQL,我想找到用户 id=2 OR 用户 id=3 现在我将如何进行 GraphQL 查询,我正在使用以下查询获取整个集合 { users() {
假设我有两个 Web 服务:A 和 B。两者都在 Apache 上运行。我希望它们可以从我的主机的不同端口访问:A 来自端口 88,B 来自端口 89。 我可以手动完成(首先创建图像,然后使用“doc
我一直在 excel 中使用一个非常简单的数组公式来处理一些数据集,但是它们变得太大并且在我更新计算时完全破坏了我的计算机性能。 excel表格和MySQL数据库布局如下: +-Timestamp-+
我有一个类,其实例要通过不同于它们携带的数据值的标识来区分。在我的代码中,我打算使用 == 来表示两个实例在它们的数据方面是等价的,并且 is 表示两个变量引用同一个实例,也就是说,他们是相同的。根据
我正在 Windows 中使用 WinSock 2.0 开发代理服务器。如果我想在阻塞模型中开发它,select() 是等待客户端或远程服务器从中接收数据的方法。是否有任何适用的方法可以使用 I/O
我正在将我制作的 Android 应用移植到 iOS。 Android 有一个 Yield() 函数可以将线程从运行中移到线程队列的后面(?)。这很有用,这样该线程就不会占用过多的 CPU 并使其他一
这是否保证始终为真: std::numeric_limits::max() == INT_MAX C++ 标准对此有何规定?我在标准中找不到任何明确说明这一点的引用资料,但我一直在阅读这些内容应该是等
我是一名优秀的程序员,十分优秀!