Size bir numara listesi L = [17, 5, 9, 17, 59, 14]
, bir çanta operatörü O = {+:7, -:3, *:5, /:1}
ve bir numara verilir N = 569
.
Görev
L
Sol taraftaki tüm sayıları ve yalnızca N
sağ taraftaki sayıyı kullanan bir denklem çıkar . Bu mümkün değilse False çıktısını alın. Örnek çözüm:
59*(17-5)-9*17+14 = 569
Sınırlamalar ve Açıklama
- Sayıları birleştiremezsiniz (
[13,37]
olarak kullanılamaz1337
) - Yalnızca doğal sayılar ve sıfır görünür
L
. - Sıralama
L
önemli değil. - İçindeki tüm sayıları kullanmalısınız
L
. - Sadece operatörler
+
,-
,*
,/
görünürO
. O
gerekenden daha fazla operatöre sahip olabilir, ancak en azından|L|-1
operatörler- Her bir operatörü, içindeki değere kadar istediğiniz sayıda kullanabilirsiniz
O
. - Dört işlemin
O
tümü standart matematiksel işlemlerdir; özellikle/
kesin kesirlerle normal bölünmedir.
makas
- Daha az puan, daha iyi
- Kodunuzun her karakteri size bir puan verir
Okuması kolay golf olmayan bir versiyon sağlamanız gerekir.
Arka fon
Bir benzer soru Yığın taşması istendi. İlginç bir kod-golf meydan okuma olabileceğini düşündüm.
Hesaplama Karmaşıklığı
Peter Taylor'ın yorumlarda söylediği gibi, alt küme toplamını bununla çözebilirsiniz :
- Bir alt küme toplamı örneğiniz var (bu nedenle bir S tamsayı kümesi ve bir x sayısı)
- L: = S + [0, ..., 0] (| S | sıfır kez), N: = x, O: = {+: | S | -1, *: | S | - 100}
- Şimdi problemimin bu örneğini çöz
- Alt küme toplamı için çözüm, sıfır ile çarpılmayan S sayılarıdır.
O (2 ^ n) değerinden daha iyi bir Algoritma bulursanız, P = NP olduğunu kanıtlarsınız. As NP vs P bir olan Milenyum Ödülü Problemi ve dolayısıyla değer 1.000.000 ABD-Doları, Birileri bunun için bir çözüm bulur olasılığı son derece düşüktür. Bu yüzden sıralamanın bu kısmını kaldırdım.
Test senaryoları
Aşağıdakiler sadece geçerli cevaplar değildir, başka çözümler de vardır ve bunlara izin verilir:
- (
[17,5,9,17,59,14]
,{+:7, -:3, *:5, /:1}
,569
)
=>59 * (17-5)- 9 * 17 + 14 = 569
- (
[2,2]
,{'+':3, '-':3, '*':3, '/':3}
,1
)
=>2/2 = 1
- (
[2,3,5,7,10,0,0,0,0,0,0,0]
,{'+':20, '-':20, '*':20, '/':20}
,16
)
=>5+10-2*3+7+0+0+0+0+0+0+0 = 16
- (
[2,3,5,7,10,0,0,0,0,0,0,0]
,{'+':20, '-':20, '*':20, '/':20}
,15
)
=>5+10+0*(2+3+7)+0+0+0+0+0+0 = 15
/
≡ div
), sadece kayan nokta ve yuvarlama hataları için umut, ...?
5+10+2*3+7*0+0...
m = |L|
mi? Evetse, çalışma zamanının bu listenin boyutuna bağlı olmamasını nasıl bekleyebilirsiniz? Örneğin[2,2],[+,+,...,+,/],1
,. Aslında, n O (m) olduğu için, hepsini m cinsinden yazabilirsiniz.