ค้นหาการดำเนินการที่จำเป็นเพื่อให้ได้ผลลัพธ์


10

เพื่อให้งานนั้นง่ายชุดของตัวเลขและผลลัพธ์คุณต้องค้นหาการดำเนินการที่คุณต้องใช้กับตัวเลขจากอาร์เรย์เพื่อให้ได้ผลลัพธ์ตามที่ร้องขอ

มาทำให้เป็นเรื่องง่ายสำหรับการเริ่มต้นและอนุญาตเฉพาะการดำเนินการพื้นฐานเช่น: การบวกการลบการคูณและการหาร

ตัวอย่าง:

Input  : [5,5,5,5,5] 100
Output : 5*5*5-5*5

เพื่อให้ข้อได้เปรียบบางอย่างกับภาษาเช่น Java คำขอคือการใช้ฟังก์ชั่นไม่ใช่โปรแกรมทั้งหมดและผลลัพธ์สามารถส่งคืนผ่านพารามิเตอร์หรือพิมพ์ไปที่คอนโซล

โค้ดจะทำคะแนนตามจำนวนไบต์และด้วยความท้าทายของรหัสกอล์ฟคะแนนต่ำสุดชนะ

ข้อกำหนดอีกประการหนึ่งคือคุณจะได้รับ -10 คะแนนเพิ่มเติมหากอาร์เรย์มีเพียงดิดไอดีโซลูชั่นสนับสนุนที่คุณสามารถสร้างตัวเลขจากตัวเลขต่อไปนี้ กล่าวคือ

Input  : [1,2,3,4,5] 0
Output : 12-3-4-5

โปรดทราบว่าเอาต์พุตที่ให้มาเป็นเอาต์พุตที่เสนอบางกรณีอาจมีมากกว่าหนึ่งโซลูชัน ขึ้นอยู่กับคุณว่าคุณจะมอบโซลูชั่นอย่างน้อยหนึ่งอย่างสำหรับงานที่ได้รับ

แก้ไข: ผลจะต้องถูกต้องจากมุมมองทางคณิตศาสตร์ดังนั้นการแบ่งเป็นส่วนที่มีเหตุผลไม่ใช่จำนวนเต็มและการดำเนินการที่สำคัญคือเช่นเดียวกับในคณิตศาสตร์คลาสสิก (การคูณครั้งแรกและการหารแล้วบวกและลบ)


4
ทำ*และ/มีความผิดพลาดมากกว่า+และ-? ตัวอย่างทั้งสองของคุณขัดแย้งกัน
Leun Nun

1
โปรดในอนาคตตรวจสอบให้แน่ใจว่าคุณสร้างค่าหัวตามเปอร์เซ็นต์สำหรับภาษาเช่น java, -10 ไบต์ไม่ดีเท่าเยลลี่
Bálint


4
จำเป็นต้องใช้ตัวเลขตามลำดับหรือไม่ นอกจากนี้สำหรับความท้าทายในอนาคตฉันขอแนะนำให้ใช้แซนด์บ็อกซ์อย่างจริงจังซึ่งปัญหาเหล่านี้สามารถถูกแก้ไขก่อนที่จะโพสต์ที่หน้าหลัก
AdmBorkBork

2
@ mbomb007 มันไม่ซ้ำกันอย่างใดอย่างหนึ่ง สิ่งเหล่านี้เป็นอินพุตตัวเลขโดยพลการและอนุญาตให้ใช้งานการดำเนินการทางคณิตศาสตร์ขั้นพื้นฐานเท่านั้นไม่ควรส่งออกโปรแกรมจริง
Patrick Roberts

คำตอบ:



4

Oracle SQL 11.2, 322 304 270 ไบต์

SELECT o FROM(SELECT REPLACE(SUBSTR(:1,1,1)||REPLACE(SYS_CONNECT_BY_PATH(a||SUBSTR(:1,LEVEL*2+1,1),','),','),'_')o,LEVEL l FROM(SELECT SUBSTR('+-*/_',LEVEL,1)a FROM DUAL CONNECT BY LEVEL<6)CONNECT BY LEVEL<LENGTH(:1)/2)WHERE:2=dbms_aw.eval_number(o)AND l>LENGTH(:1)/2-1;

: 1 คือรายการตัวเลข
: 2 คือผลลัพธ์การค้นหา

ยกเลิกการตีลูก:

SELECT o
FROM   (
         SELECT REPLACE(SUBSTR(:1,1,1)||REPLACE(SYS_CONNECT_BY_PATH(a||SUBSTR(:1,LEVEL*2+1,1),','),','),'_')o,LEVEL l 
         FROM ( -- Create one row per operator 
                SELECT SUBSTR('+-*/_',LEVEL,1)a FROM DUAL CONNECT BY LEVEL<6
              ) CONNECT BY LEVEL<LENGTH(:1)/2  -- Create every combination of operators, one per ','
)
WHERE :2=dbms_aw.eval_number(o)  -- filter on result = evaluation
  AND l>LENGTH(:1)/2-1           -- keep only expressions using every digits

4

TSQL (sqlserver 2016) 310 294 280 ไบต์

ช่างเป็นโอกาสที่ยอดเยี่ยมในการเขียนโค้ดที่น่าเกลียด:

แข็งแรงเล่นกอล์ฟ:

DECLARE @ varchar(max)= '5,5,5'
DECLARE @a varchar(20) = '125'

,@ varchar(max)='';WITH D as(SELECT @a a UNION ALL SELECT STUFF(a,charindex(',',a),1,value)FROM STRING_SPLIT('*,+,./,-,',',')x,d WHERE a like'%,%')SELECT @+=a+','''+REPLACE(a,'.','')+'''),('FROM D WHERE a not like'%,%'EXEC('SELECT y FROM(values('+@+'null,null))g(x,y)WHERE x='+@b)

ลองออนไลน์

สามารถอ่านได้: (การแทรกจุดทศนิยม (.) และการลบเดียวกันนั้นเป็นสิ่งจำเป็นเพื่อให้ sql ยอมรับว่า 4/5 ไม่ใช่ 0 - การลบที่ดีสำหรับผู้ทดสอบ)

DECLARE @a varchar(max)= '5,5,5'
DECLARE @b varchar(20) = '5'

,@ varchar(max)=''
;WITH D as
(
  SELECT @a a
  UNION ALL
  SELECT STUFF(a,charindex(',',a),1,value)
  FROM STRING_SPLIT('*,+,./,-,',',')x,d
  WHERE a like'%,%'
)
SELECT @+=a+','''+REPLACE(a,',','')+'''),('
FROM D
WHERE a not like'%,%'

EXEC('SELECT y FROM(values('+@+'null,null))g(x,y)WHERE x='+@b)

โซลูชันนี้ยังสามารถจัดการอินพุตประเภทนี้ได้:

อินพุต: [1,2,3,4,5] 0 เอาต์พุต: 12-3-4-5


3

JavaScript (ES6), 165 147 ไบต์

a=>o=>(c=[],i=c=>{for(j=0;!((c[j]?++c[j]:c[j]=1)%5);)c[j++]=0},eval(`while(eval(e=(a+'').replace(/,/g,(_,j)=>'+-*/'.charAt(c[~-j/2])))!=o)i(c);e`))

ซ้อนกันeval... น่ารัก

f=a=>o=>(c=[],i=c=>{for(j=0;!((c[j]?++c[j]:c[j]=1)%5);)c[j++]=0},eval(`while(eval(e=(a+'').replace(/,/g,(_,j)=>'+-*/'.charAt(c[~-j/2])))!=o)i(c);e`))
console.log(f([5,5,5,5,5])(100))
console.log(f([1,2,3,4,5])(0))
console.log(f([3,4])(0.75))
console.log(f([3,4,5,6])(339))


3

Python 3, 170 155 ไบต์

from itertools import*
def f(n,o):print({k for k in[''.join(map(str,sum(j,())))[1:]for j in[zip(x,n)for x in product('+-*/',repeat=len(n))]]if eval(k)==o})

สร้างเครื่องกำเนิดไฟฟ้าที่มีคำสั่งซื้อที่เป็นไปได้ทั้งหมดของผู้ประกอบการรวมที่มีจำนวนแล้ว eval จนกว่าเราจะได้คำตอบ

https://repl.it/C2F5


2
คุณสามารถบันทึกอักขระได้สองสามตัวโดยแทนที่['+','-','*','/']ด้วย'+-*/'; เนื่องจากstringมันสามารถทำซ้ำได้มันจะปฏิบัติต่อมันเหมือนกับarrayองค์ประกอบแต่ละตัวที่มีอักขระแต่ละตัวในstring- ดังนั้นมันจะทำหน้าที่เหมือนที่คุณให้กับอาร์เรย์ที่คุณมีอยู่ในปัจจุบัน
nasonfish

2

Python, 195 186 ไบต์

นี่คือวิธีที่ชั่วร้ายในการทำมัน

def x(i,r):
 t=""
 from random import choice as c
 while True:
  for j in i:
   t+=str(j)
   if c([0,1]):t+="."+c("+-/*")
  t=t.strip("+-*/.")+"."
  v=eval(t)
  if v == r:print t
  t=""

ฟังก์ชั่นxยอมรับการโต้แย้งของlistและresult- x([1,2,3,4,5], 15)ตัวอย่างเช่น

โปรแกรมเริ่มลูปที่เราเริ่มการสุ่มเลือกว่าเราควรผนวก"+", "-", "*", or "/"ระหว่างแต่ละหมายเลขหรือถ้าเราควรต่อกันเข้าด้วยกัน นี้ดูเหมือนจะเป็นตัวเลือกที่รัดกุมมากกว่าจริงจะผ่านพีชคณิตและพยายามทุกชุดที่จะหาทุกผลและแม้ว่ามันจะใช้เวลานานในการทำงานและเป็นมากมีประสิทธิภาพน้อยกว่า (โชคดีที่ไม่ใช่ข้อกังวลในบริบทนี้!)

นอกจากนี้ยังผนวก "." 6/4 = 1ไปยังหมายเลขแต่ละคนที่จะหลีกเลี่ยงการทำดำเนินงานจำนวนเต็มโค้งมนเหมือน มันคือevalการแสดงออกของเราและกำหนดว่าผลลัพธ์เท่ากับสิ่งที่เราคาดหวังและถ้าเป็นเช่นนั้นจะแสดงผลลัพธ์ออกมา

โปรแกรมนี้ไม่เคยออก - มันจะเก็บผลลัพธ์อย่างต่อเนื่องจนกว่าจะถูกฆ่า

แก้ไข 1 : ลบบรรทัดใหม่ที่ไม่จำเป็นซึ่งifสามารถใช้คำสั่งแบบบรรทัดเดียวได้


การใช้งานที่ตลกจริงๆ แต่ง่ายต่อการบันทึกไบต์เพิ่มเติมลองออนไลน์! (176 ไบต์)
bobrobbob

2

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,[])'

2

JavaScript (ES6), 88 ไบต์

a=>o=>eval(`while(eval(e=(a+'').replace(/,/g,_=>'+-*/'.charAt(Math.random()*5)))!=o);e`)

โยนแบบสุ่มเล็กน้อยเพื่อผสม ง่ายกว่าการวนซ้ำชุดอย่างเป็นระบบ

ชุดทดสอบ

f=a=>o=>eval(`while(eval(e=(a+'').replace(/,/g,_=>'+-*/'.charAt(Math.random()*5)))!=o);e`)
console.log(f([5,5,5,5,5])(100))
console.log(f([1,2,3,4,5])(0))
console.log(f([3,4])(0.75))
console.log(f([3,4,5,6])(339))


1

PHP, 108 ไบต์

for(;$i=$argc;eval("$s-$argv[1]?:die(\$s);"))for($s="",$x=$p++;--$i>1;$x/=4)$s.="+-*/"[$s?$x&3:4].$argv[$i];

รับอินพุตจากอาร์กิวเมนต์บรรทัดรับคำสั่งในลำดับย้อนกลับ -rทำงานด้วย

ทำให้พังถล่ม

for(;                   # infinite loop:
    $i=$argc;               # 1. init $i to argument count
    eval("$s-$argv[1]?:"    # 3. if first argument equals expression value,
        ."die(\$s);")       #    print expression and exit
    )
    for($s="",              # 2. create expression:
        $x=$p++;            #    init map
        --$i>1;                 # loop from last to second argument
        $x/=4)                  # C: shift map by two bits
        $s.="+-*/"[$s?$x&3:4]   # A: append operator (none for first operand)
            .$argv[$i];         # B: append operand

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.