Tìm hoạt động cần thiết để có kết quả


10

Vì vậy, nhiệm vụ rất đơn giản, được đưa ra mảng số và kết quả, bạn cần tìm những thao tác bạn cần sử dụng trên các số từ mảng, để có được kết quả được yêu cầu.

Hãy làm cho nó đơn giản để bắt đầu và chỉ cho phép các hoạt động cơ bản như: cộng, trừ, nhân và chia.

Thí dụ:

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

Để cung cấp một số lợi thế cho các ngôn ngữ như Java, yêu cầu là thực hiện chức năng, không phải toàn bộ chương trình và kết quả có thể được trả về qua tham số hoặc in ra bàn điều khiển.

Mã được tính dựa trên số byte và khi thử thách mã golf, điểm thấp nhất sẽ thắng.

Một yêu cầu khác là Bạn có thể nhận thêm -10 điểm nếu mảng chỉ chứa các digids, các giải pháp hỗ trợ trong đó bạn có thể tạo các số từ các chữ số sau. I E

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

Lưu ý rằng, đầu ra được cung cấp là đầu ra được đề xuất, một số trường hợp có thể có nhiều hơn một giải pháp. Tùy thuộc vào bạn, bạn sẽ cung cấp một hoặc nhiều giải pháp cho nhiệm vụ nhất định.

EDIT: Kết quả phải có giá trị theo quan điểm toán học, do đó phép chia là phép chia hợp lý, không phải là số nguyên và ưu tiên hoạt động giống như trong toán học cổ điển (phép nhân và phép chia đầu tiên sau đó cộng và trừ).


4
*/có quyền ưu tiên hơn +-? Hai ví dụ của bạn mâu thuẫn với nhau.
Nữ tu bị rò rỉ

1
Xin vui lòng, trong tương lai, hãy đảm bảo bạn tạo tiền thưởng dựa trên tỷ lệ phần trăm, đối với một ngôn ngữ, như java, -10 byte không tốt như đối với thạch
Bálint


4
Các số cần phải được sử dụng theo thứ tự? Ngoài ra, đối với những thách thức trong tương lai, tôi chân thành khuyên bạn nên sử dụng Sandbox nơi các loại vấn đề này có thể được giải quyết trước khi đăng lên Main.
admBorkBork

2
@ mbomb007 nó không phải là một bản sao của một trong hai. Đây là các đầu vào số tùy ý và chỉ cho phép các phép toán cơ bản, chúng không được phép xuất ra các chương trình thực tế.
Patrick Roberts

Câu trả lời:



4

Oracle SQL 11.2, 322 304 270 byte

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 là danh sách các chữ số
: 2 là kết quả tìm kiếm

Chưa chơi gôn:

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 byte

Thật là một cơ hội tuyệt vời để viết mã xấu xí:

Chơi gôn

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)

Dùng thử trực tuyến

Có thể đọc: (chèn dấu thập phân (.) Và loại bỏ cùng một thứ là cần thiết để sql chấp nhận rằng 4/5 không phải là 0 - loại bỏ tốt là dành cho những người kiểm tra nó)

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)

Giải pháp này cũng có thể xử lý các loại đầu vào này:

Đầu vào: [1,2,3,4,5] 0 Đầu ra: 12-3-4-5


3

JavaScript (ES6), 165 147 byte

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`))

Lồng nhau eval... đáng yêu.

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 byte

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})

Tạo một trình tạo với tất cả các đơn đặt hàng có thể có của các nhà khai thác, kết hợp điều đó với các số, sau đó eval cho đến khi chúng tôi nhận được câu trả lời.

https://repl.it/C2F5


2
Bạn có thể lưu một vài ký tự bằng cách thay thế ['+','-','*','/']bằng '+-*/'; vì stringchúng có thể lặp lại, nó sẽ coi nó giống như arrayvới mỗi phần tử là mỗi ký tự trong string- vì vậy nó sẽ hoạt động giống như bạn cung cấp cho nó với mảng mà bạn hiện có.
cá mũi

2

Python, 195 186 byte

Đây là một cách làm tàn bạo.

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=""

Hàm xchấp nhận một đối số của a listvà a result- x([1,2,3,4,5], 15)ví dụ.

Chương trình bắt đầu một vòng lặp trong đó chúng ta bắt đầu chọn ngẫu nhiên nếu chúng ta nên nối "+", "-", "*", or "/"giữa mỗi số hoặc nếu chúng ta nên nối chúng lại với nhau. Đây dường như là một lựa chọn ngắn gọn hơn là thực sự trải qua các hoán vị và thử mọi kết hợp để tìm mọi kết quả, và mặc dù phải mất nhiều thời gian hơn để chạy và kém hiệu quả hơn nhiều . (May mắn thay, đó không phải là một mối quan tâm trong bối cảnh này!)

Nó cũng nối thêm "." đến từng số để tránh thực hiện các thao tác làm tròn số nguyên như thế nào 6/4 = 1. Sau đó, nó evallà biểu thức của chúng ta và xác định xem kết quả có bằng với những gì chúng ta đang mong đợi hay không, và nếu vậy, sẽ đưa ra biểu thức.

Chương trình này không bao giờ thoát - nó sẽ tiếp tục đưa ra kết quả cho đến khi bị giết.

EDIT 1 : Loại bỏ các dòng mới không cần thiết nơi ifcó thể sử dụng các câu lệnh một dòng .


thực hiện hài hước. nhưng dễ dàng để tiết kiệm thêm một số byte Hãy thử trực tuyến! (176 byte)
bobrobbob

2

Matlab, 234 238 258 byte

Tôi giả sử dựa trên những hạn chế của các câu trả lời khác rằng thứ tự số của mảng đầu vào được duy trì bởi fiat.

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

Mã này lấy một chuỗi các số x, nói x = '12345'và kết quả r, nói r = 15và trả về tất cả các chuỗi biểu thức bạn có thể đánh giá để có được rtừ xviệc sử dụng bốn toán tử.

Tôi đã sử dụng hai cách khác nhau để tránh sử dụng các biểu thức -type ones(length())hoặc repmat(length())-type: ~~p(1,:)trả về các giá trị không phải là không p(nghĩa là một danh sách các 1bước sóng là chiều thứ nhất của p) và 0|p(:,1)trả về 0 hoặc ở đó -a-value-in- p(nghĩa là danh sách 1s có cùng độ dài với thứ nguyên thứ hai của p).

Matlab không có phương thức nchoosek thay thế , vì vậy tôi đã nhân đôi số toán tử đúng số lần, tính toàn bộ không gian nchoosekcho lựa chọn toán tử lớn hơn đó và sau đó sử dụng uniquelệnh gọi để giảm kết quả xuống mức cần thiết (xóa các kết hợp tương đương như '*** +' và '*** +'). Tôi thêm một khoảng trắng để khớp với độ dài của vectơ đầu vào cho mục đích nối và sau đó kết hợp các chuỗi toán tử với các chuỗi đầu vào thành các cột của ma trận. Sau đó tôi đánh giá các biểu thức theo cột để có kết quả và tìm thứ tự các toán tử tương ứng với các cột có kết quả khớp với đầu vào của chúng tôi r.

Kiểm tra: x = '12345', r = 15:

1*2*3+4+5 
1+2+3+4+5 
1-2*3+4*5 

Nếu tôi phải lấy một mảng các giá trị chính xác gấp đôi, tôi cần x = num2str(x,'%d');để chuyển đổi các chữ số thành một chuỗi, thêm 21 (20 không có ;) vào điểm số của tôi. * Các byte bổ sung là dấu chấm phẩy mà tôi để lại hoàn toàn để bất kỳ ai chạy mã này sẽ không thấy dấu nhắc lệnh của họ bị nổ tung với các mảng dài. Vì bản chỉnh sửa của tôi tạo ra một đống cảnh báo khổng lồ về logic và toán tử dấu hai chấm, dù sao, tôi đã xóa dấu chấm phẩy trong phiên bản mới.

Chỉnh sửa 2: Quên thay thế 2*n+2bằng k.

Câu trả lời cũ:

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 byte

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

Ném trong một chút ngẫu nhiên để trộn. Dễ dàng hơn nhiều so với việc lặp lại một cách có hệ thống thông qua các kết hợp.

Phòng thử nghiệm

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 byte

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

lấy đầu vào từ các đối số dòng lệnh theo thứ tự ngược lại. Chạy với -r.

phá vỡ

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.