Matlab,234页 238 258 个字节
基于其他答案的局限性,我假设输入数组的数字顺序由法定命令维护。
n=length(x)-1
k=n*2+2
p=unique(nchoosek(repmat('*-+/',1,n),n),'rows')
p=[p char(' '*~~p(:,1))]'
c=char(x'*~~p(1,:))
o=p(:,r==cellfun(@eval,mat2cell(reshape([c(:) p(:)]',k,[]),k,0|p(1,:))))
reshape([repmat(x',size(o,2),1) o(:)]',k,[])'
这段代码使用一串数字x
,说x = '12345'
和结果r
,说r = 15
并返回所有表达式的字符串可以评估获得r
从x
使用四个运营商。
我使用了两种不同的长度等效方式来避免使用ones(length())
-type或repmat(length())
-type表达式:~~p(1,:)
它返回in p
中1
的非非值(即与的第一维长度相同的s 列表p
),0|p(:,1)
并返回0或is-there -a-value-in- p
(即的列表,1
其长度与的第二维相同p
)。
Matlab没有nchoosek
with替换方法,因此我将运算符重复了正确的次数,nchoosek
为较大的运算符选择计算了整个空间,然后使用unique
调用将结果缩减为应有的值(删除等效的组合,例如“ *** +”和“ *** +”)。为了连接目的,我添加了一个尾随空格以匹配输入向量的长度,然后将运算符字符串与输入字符串组合到矩阵的列中。然后,我按列评估表达式以获取结果,并找到结果与我们输入匹配的那些列所对应的运算符顺序r
。
测试:x = '12345'
,r = 15
:
1*2*3+4+5
1+2+3+4+5
1-2*3+4*5
如果我必须采用双精度值数组,则需要x = num2str(x,'%d');
将数字转换为字符串,将21分(20分不带;
)加到我的分数中。*多余的字节纯粹是我留下的分号,因此任何运行此代码的人都不会看到命令提示符被长数组弄乱了。由于我的编辑现在无论如何都会产生大量有关逻辑和冒号操作数的警告,因此我在新版本中删除了分号。
编辑2:忘记更换2*n+2
用k
。
旧答案:
n=length(x)-1;
p=unique(nchoosek(repmat(['*','-','+','/'],1,n),n),'rows');
l=length(p);
p=[p repmat(' ',l,1)]';
c=reshape([repmat(x',l,1) p(:)]',n*2+2,[]);
o = p(:,r == cellfun(@eval, mat2cell(c,n*2+2,ones(l,1))));
reshape([repmat(x',size(o,2),1) o(:)]',n*2+2,[])'
*
和/
有超过precendence+
和-
?您的两个示例相互矛盾。