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
(เช่นรายการ1
s 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+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,[])'
*
และ/
มีความผิดพลาดมากกว่า+
และ-
? ตัวอย่างทั้งสองของคุณขัดแย้งกัน