Matlab, 234 238 258 bayt
Giriş dizisinin sayı sırasının fiat tarafından tutulduğu diğer cevapların sınırlamalarına dayanarak varsayıyorum.
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,[])'
Bu kod sayı dizisi alır x
, demek x = '12345'
ve bir sonuç r
, demek r = 15
ve iadeler ifadelerin dizeleri tüm almak için değerlendirebilir r
gelen x
dört operatörleri kullanarak.
ones(length())
-Type veya repmat(length())
-type ifadelerini kullanmaktan kaçınmak için iki farklı uzunluk eşdeğeri yol kullandım : ~~p(1,:)
bu, not-not değerlerini döndürmez p
(yani, 1
ilk boyut olarak sam uzunluğunun listesi p
) ve 0|p(:,1)
0 veya orada döndürür -a-değer-in- p
(yani, 1
ikinci boyutuyla aynı uzunlukta bir liste p
).
Matlab'ın bir nchoosek
değiştirme yöntemi yok, bu yüzden operatörleri doğru sayıda kopyaladım, nchoosek
daha geniş operatör seçimi için tüm alanı hesapladım ve ardından unique
sonucu olması gerektiği şekilde çözümlemek için bir çağrı kullandım ('*** +' ve '*** +' gibi eşdeğer kombinasyonları kaldırmak). Birleştirme amacıyla giriş vektörünün uzunluğunu eşleştirmek için bir boşluk ekler ve ardından giriş dizeleri ile operatör dizelerini bir matrisin sütunlarına oluştururum. Daha sonra, sonuçları almak ve girdilerimizle eşleşen sonuçlarla bu sütunlara karşılık gelen işleçlerin sırasını bulmak için ifadeleri sütun olarak değerlendiririm r
.
Test: x = '12345'
, r = 15
:
1*2*3+4+5
1+2+3+4+5
1-2*3+4*5
Eğer çift kesinlik değerleri bir dizi almak zorunda olsaydım , benim puan için x = num2str(x,'%d');
21 (20 olmadan ;
) ekleyerek, bir dizeye rakamları dönüştürmek gerekir . * Ekstra baytlar tamamen bıraktığım noktalı virgüllerdi, böylece bu kodu çalıştıran herkes komut dizisinin uzun dizilerle patlamasını görmeyecekti. Düzenlemem zaten mantıksal ve iki nokta üstüste işlenenlerle ilgili dev bir uyarı yığını ürettiğinden, yeni sürümdeki noktalı virgülleri kaldırdım.
Düzenleme 2: a 2*n+2
ile değiştirmeyi unuttum k
.
Eski cevap:
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,[])'
*
ve/
üzerinde precendence var+
ve-
? İki örneğiniz birbiriyle çelişiyor.