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())หรือrepmat(length())-type: ~~p(1,:)ซึ่งคืนค่าไม่ใช่ - ไม่ใช่ในp(เช่นรายการ1s samelength เป็นมิติแรกของp) และ0|p(:,1)ส่งกลับ 0 หรืออยู่ที่นั่น -a-value-in- p(เช่นรายการของ1ความยาวเดียวกันกับมิติที่สองของp)
Matlab ไม่มีวิธีการnchoosek แทนที่ดังนั้นฉันจึงทำซ้ำตัวดำเนินการตามจำนวนที่ถูกต้องคำนวณพื้นที่ทั้งหมดของnchoosekการเลือกตัวดำเนินการที่มีขนาดใหญ่กว่านั้นจากนั้นใช้การuniqueเรียกเพื่อตัดผลลัพธ์ลงตามที่ควรจะเป็น (ลบชุดค่าผสมที่เทียบเท่าเช่น '*** +' และ '*** +') ฉันเพิ่มช่องว่างต่อท้ายเพื่อจับคู่ความยาวของเวกเตอร์อินพุตสำหรับจุดประสงค์ในการต่อข้อมูลแล้วประกอบสตริงตัวดำเนินการกับสตริงอินพุตลงในคอลัมน์ของเมทริกซ์ จากนั้นผมก็ประเมินการแสดงออก columnwise 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+2k
คำตอบเก่า:
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,[])'
*และ/มีความผิดพลาดมากกว่า+และ-? ตัวอย่างทั้งสองของคุณขัดแย้งกัน