Temukan operasi yang diperlukan untuk mendapatkan hasil

10

Jadi tugasnya sederhana, mengingat array angka dan hasil, Anda perlu menemukan operasi apa yang perlu Anda gunakan pada angka dari array, untuk mendapatkan hasil yang diminta.

Mari kita membuatnya sederhana untuk memulai, dan hanya mengizinkan operasi dasar seperti: penambahan, pengurangan, perkalian, dan pembagian.

Contoh:

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

Untuk memberikan keuntungan pada bahasa seperti Java, permintaan adalah untuk mengimplementasikan fungsi, bukan seluruh program, dan hasilnya dapat dikembalikan melalui parameter atau dicetak ke konsol.

Kode dinilai berdasarkan jumlah byte, dan karena tantangan kode golf, skor terendah menang.

Persyaratan lain adalah Anda bisa mendapatkan tambahan -10 poin jika untuk array hanya berisi digid, mendukung solusi di mana Anda bisa membuat angka dari angka berikut. Yaitu

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

Perhatikan bahwa, asalkan output adalah output yang diusulkan, beberapa kasus mungkin memiliki lebih dari satu solusi. Terserah Anda apakah Anda akan memberikan satu atau lebih solusi untuk tugas yang diberikan.

EDIT: Hasil harus valid dari sudut pandang matematika, maka pembagian adalah pembagian rasional, bukan bilangan bulat, dan operasi diutamakan sama seperti dalam matematika klasik (perkalian dan pembagian pertama kemudian penjumlahan dan pengurangan).

pengguna902383
sumber
4
Apakah *dan /memiliki prioritas lebih dari +dan -? Dua contoh Anda saling bertentangan.
Leaky Nun
1
Tolong, di masa depan, pastikan Anda membuat hadiah berdasarkan persentase, untuk bahasa, seperti java, -10 bytes tidak sebagus untuk jelly
Bálint
7
Atau bahkan menghindari bonus sama sekali
Luis Mendo
4
Apakah nomor-nomor tersebut harus digunakan secara berurutan? Juga, untuk tantangan di masa depan, saya sungguh-sungguh merekomendasikan menggunakan Sandbox di mana masalah-masalah semacam ini dapat diselesaikan sebelum memposting ke Main.
AdmBorkBork
2
@ mbomb007 itu bukan duplikat dari keduanya. Ini adalah input numerik sewenang-wenang, dan hanya operasi matematika dasar yang diizinkan, mereka tidak seharusnya menghasilkan program yang sebenarnya.
Patrick Roberts

Jawaban:

3

Pyth, 23 byte

Karena alasan keamanan, *dan /tidak akan mengevaluasi secara online, tetapi secara teori mereka berfungsi.

fqeQvTms.ihQd^"+-*/"lth

Test suite hanya dengan +dan -.

Biarawati Bocor
sumber
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 adalah daftar digit
: 2 adalah hasil yang dicari

Tidak golf:

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
Jeto
sumber
4

TSQL (sqlserver 2016) 310 294 280 byte

Kesempatan yang luar biasa untuk menulis kode jelek:

Golf:

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)

Cobalah online

Dapat dibaca: (penyisipan titik desimal (.) Dan penghapusan yang sama diperlukan agar sql menerima bahwa 4/5 bukan 0 - penghapusan baik untuk orang yang mengujinya)

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)

Solusi ini juga dapat menangani jenis input ini:

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

t-clausen.dk
sumber
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`))

Bersarang eval... indah.

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

Patrick Roberts
sumber
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})

Buat generator dengan semua perintah yang mungkin dari operator, gabungkan itu dengan angka, lalu evaluasi sampai kita mendapatkan jawabannya.

https://repl.it/C2F5

ahli atlasologi
sumber
2
Anda dapat menyimpan beberapa karakter dengan mengganti ['+','-','*','/']dengan '+-*/'; karena strings dapat diubah, ia akan memperlakukannya seperti halnya arraydengan setiap elemen menjadi masing-masing karakter di string- jadi itu akan bertindak seperti Anda memberikannya dengan array yang Anda miliki saat ini.
nasonfish
2

Python, 195 186 byte

Inilah cara yang mengerikan untuk melakukannya.

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

Fungsi xmenerima argumen dari a listdan a result- x([1,2,3,4,5], 15)misalnya.

Program memulai loop di mana kita mulai memilih secara acak apakah kita harus menambahkan di "+", "-", "*", or "/"antara setiap angka, atau jika kita harus menyatukannya bersama-sama. Ini sepertinya pilihan yang lebih ringkas daripada benar-benar melalui permutasi dan mencoba setiap kombinasi untuk menemukan setiap hasil, dan meskipun itu membutuhkan waktu lebih lama untuk berjalan dan jauh lebih efisien. (Untungnya itu bukan masalah dalam konteks ini!)

Ini juga menambahkan "." ke setiap nomor untuk menghindari melakukan operasi bilangan bulat seperti 6/4 = 1. Itu kemudian evalekspresi kita dan menentukan apakah hasilnya sama dengan apa yang kita harapkan, dan jika demikian, output ekspresi.

Program ini tidak pernah keluar - ia akan terus mengeluarkan hasil sampai mati.

EDIT 1 : Hapus baris baru yang tidak perlu di mana ifpernyataan satu baris dapat digunakan.

nasonfish
sumber
implementasi yang sangat lucu. tetapi mudah untuk menyimpan lebih banyak byte Cobalah secara online! (176 byte)
bobrobbob
2

Matlab, 234 238 258 byte

Saya berasumsi berdasarkan keterbatasan jawaban lain bahwa urutan nomor array input dikelola oleh 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,[])'

Kode ini mengambil string dari angka x, mengatakan x = '12345'dan hasilnya r, mengatakan r = 15dan kembali semua string ekspresi Anda dapat mengevaluasi untuk mendapatkan rdari xmenggunakan empat operator.

Saya telah menggunakan dua cara panjang-ekuivalen yang berbeda untuk menghindari penggunaan ones(length())-jenis atau repmat(length())-jenis ekspresi: ~~p(1,:)yang mengembalikan nilai tidak-tidak dalam p(yaitu, daftar 1s panjang gelombang yang sama sebagai dimensi pertama p) dan 0|p(:,1)yang mengembalikan 0 atau ada-ada -a-value-in- p(yaitu, daftar 1s panjang yang sama dengan dimensi kedua p).

Matlab tidak memiliki metode nchoosek penggantian , jadi saya telah menduplikasi operator dengan jumlah kali yang benar, menghitung seluruh ruang nchoosekuntuk pilihan operator yang lebih besar, dan kemudian menggunakan uniquepanggilan untuk membagi hasilnya ke apa yang seharusnya. (menghapus kombinasi setara seperti '*** +' dan '*** +'). Saya menambahkan spasi tambahan untuk mencocokkan panjang vektor input untuk tujuan penggabungan dan kemudian menyusun string operator dengan string input ke dalam kolom matriks. Saya kemudian mengevaluasi ekspresi kolomwise untuk mendapatkan hasil dan menemukan urutan operator yang sesuai dengan kolom tersebut dengan hasil yang sesuai dengan input kami r.

Tes: x = '12345', r = 15:

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

Jika saya harus mengambil array nilai presisi ganda, saya perlu x = num2str(x,'%d');untuk mengubah angka menjadi string, menambahkan 21 (20 tanpa ;) ke skor saya. * Bytes tambahan adalah titik koma yang saya tinggalkan murni sehingga siapa pun yang menjalankan kode ini tidak akan melihat command prompt mereka meledak dengan array yang panjang. Karena edit saya menghasilkan setumpuk peringatan tentang logika dan operan usus besar sekarang, saya telah menghapus titik koma di versi baru.

Sunting 2: Lupa untuk mengganti 2*n+2dengan k.

Jawaban lama:

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

JavaScript (ES6), 88 byte

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

Melemparkan sedikit keacakan campuran. Jauh lebih mudah daripada iterasi sistematis melalui kombinasi.

Test Suite

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

Patrick Roberts
sumber
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];

mengambil input dari argumen baris perintah dalam urutan terbalik. Jalankan dengan -r.

kerusakan

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
Titus
sumber
1

Perl 5 dengan -pa, 46 byte

$"="{,\\*,/,+,-}";$x=<>;($_)=grep$x==eval,<@F>

Cobalah online!

Dom Hastings
sumber