Matlab、234 238 258 バイト
他の回答の制限に基づいて、入力配列の番号順はfiatによって維持されると想定しています。
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
4つの演算子を使用して。
ones(length())
-typeまたはrepmat(length())
-type式の使用を回避する2つの異なる長さの同等の方法を使用しました:~~p(1,:)
でnot-not値p
(つまり、1
の最初の次元と同じ長さのリストp
)0|p(:,1)
を返し、0またはis-thereを返します-a-value-in- p
(つまり、1
の2番目の次元と同じ長さのsのリスト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,[])'
*
とは/
よりも優先を持っている+
と-
?あなたの二つの例は互いに矛盾しています。