마트 랩, 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
, say x = '12345'
및 결과 r
, say 를 사용하여 네 개의 연산자 를 사용하여 r = 15
평가할 수있는 모든 표현식 문자열을 반환합니다 .r
x
ones(length())
-type 또는 repmat(length())
-type 표현식을 사용 ~~p(1,:)
하지 않는 두 가지 길이의 동등한 방법을 사용했습니다 . 이는 not not not values p
(즉, 1
첫 번째 차원과 길이가 같은 목록 p
) 0|p(:,1)
를 반환하고 0을 반환하거나 -a-value-in- p
(즉, 1
의 두 번째 차원과 길이가 같은 목록 p
).
Matlab에는 nchoosek
대체 방법이 없으므로 연산자를 올바른 횟수만큼 복제하고 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없이 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,[])'
*
및/
보다 우선이+
와-
? 두 가지 예가 서로 모순됩니다.