N Para ve Her Para Birimi Kullanarak Para Değişim Problem Sayımı


13

Sikke değişim problemi çok iyi belgelenmiştir. Mezheplerin sikke sonsuz kaynağı göz önüne alındığında x_1için x_msize kalmış eklemek kombinasyonların sayısını bulmak için gerekmez y. Örneğin, verilen x = {1,2,3}ve y = 4dört kombinasyonları vardır:

  1. {1,1,1,1}
  2. {1,1,2}
  3. {1,3}
  4. {2,2}

Giriş

Bozuk para değiştirme sorununun birkaç varyasyonu vardır. Bu varyasyonda iki ek kısıtlamamız var:

  1. Her mezhep en az bir kez kullanılmalıdır.
  2. Toplamda sabit sayıda bozuk para kullanılmalıdır.

Örneğin, verilen x = {1,2,3}, y = 36ve n = 15nerede nkullanılması gerekir sikke toplam sayısıdır, dört kombinasyonları alıyorum:

  1. {1,2,2,2,2,2,2,2,3,3,3,3,3,3,3} (1 olanlar, 7 ikişer, 7 üçlü)
  2. {1,1,2,2,2,2,2,3,3,3,3,3,3,3,3} (2 tane, 5 ikişer, 8 üçlü)
  3. {1,1,1,2,2,2,3,3,3,3,3,3,3,3,3} (3 kişi, 3 ikişer, 9 üçlü)
  4. {1,1,1,1,2,3,3,3,3,3,3,3,3,3,3} (4 adet, 1 ikişer, 10 üçlü)

Meydan okuma

Zorluk, enumerateseçtiğiniz dilde yukarıda verilen tüm kombinasyonları numaralandıran bir işlev yazmaktır :

  1. Mezheplerin listesi. Örneğin {1,5,10,25}. Listeleri veya dizileri kullanabilirsiniz.
  2. yHer kombinasyonun toplamını ifade eden negatif olmayan bir tam sayı .
  3. nToplam jeton sayısını gösteren negatif olmayan bir tam sayı .

Argümanların sırası önemli değil. Noktasız işlevlere izin verilir.

enumerateİşlevin çıktısı bir kombinasyon listesi olmalıdır. Her kombinasyon benzersiz olmalı ve ntoplanan tam sayıların bir listesi olmalıdır y. Her mezhep, her kombinasyonda en az bir kez görünmeli ve hiçbir kombinasyon eksik olmamalıdır. Tamsayıların ve kombinasyonların sıralaması önemli değildir. Çıktı için listeler veya diziler kullanabilirsiniz.

Aşağıdaki uç durumları unutmayın:

  1. Her ikisi de yve nsıfırsa ve mezheplerin listesi boşsa, çıktı bir kombinasyon, yani boş kombinasyon (yani {{}}) listesidir .
  2. Aksi takdirde, ysıfır ise n, sıfırsa veya mezheplerin listesi boşsa, çıktı sıfır kombinasyonlarının bir listesidir (yani {}).
  3. Daha genel olarak, ymezheplerin toplamından ndaha az veya mezhep sayısından daha azsa, çıktı sıfır kombinasyonlarının bir listesidir.

Puanlama, tüm programın bayt cinsinden büyüklüğüne dayalı olacaktır. Bunun enumerateişlevi, yardımcı işlevleri, içe aktarma ifadelerini, vb. İçerdiğini unutmayın. Test senaryolarını içermez.


Bu meydan okumayı bir yerde gördüğümden eminim ...
Leaky Nun

Umarım bu soru yinelenmez. Aynı soruyu Code Golf'te bulamadım. Bu yüzden ben de gönderdim.
Aadit M Shah

@PeterTaylor Eğer ymezheplerin toplamından daha az ise özyinelemeli çözümünüzün bir noktasında mezhepler listesinin boş olduğu temel duruma ulaşırsınız. Bu nedenle, cevap olacaktır {}(yani çözüm bulunamadı). Eğer ndaha az mezhepler sayısından daha olduğunu o zaman sonunda nerede baz davayı ulaşırsınız n = 0ama y != 0. Dolayısıyla, cevap yine olacak {}.
Aadit M Shah

@PeterTaylor Gerçekten. Uygulama ayrıntıları hakkında çok fazla şey varsaymış olabilirim. Bunu nasıl düzeltebileceğinizi biliyor musunuz?
Aadit M Shah

10
Çalışan bir yanıt alana kadar "Kabul Edildi" bayrağını kaldırmanızı öneririm. Genel olarak kabul etmeden önce birkaç gün beklemek mantıklıdır.
Peter Taylor

Yanıtlar:


2

05AB1E, 20 bayt

g-¹sã€{Ùvy¹«DO³Qiˆ}¯

Girdi sırada bulunuyor: list of values, nr of coins, sum to reach.

Kısaca açıklama

  1. Madeni para uzunluk listesinin tüm permütasyonlarını alın: final length - length of unique coin list
  2. Bu listelere benzersiz paraların listesini ekleyin.
  3. Toplam, aranan toplamın aynısıysa listeyi kaydedin
  4. Kayıtlı tüm listelerin çıktısını al

Çevrimiçi deneyin

Çevrimiçi derleyici çok sayıda parayı işleyemez.


4

MATL , 22 bayt

Z^!S!Xu!tsi=Z)"1G@m?@!

Girdi sırası: mezhep dizisi, alınan jeton sayısı ( n), istenen toplam ( y).

Her kombinasyon farklı bir satırda görüntülenir. Boş çıktı boş bir dize olarak görüntülenir (böylece hiçbir şey).

Çevrimiçi deneyin!

Zorluktaki örnek için çevrimiçi derleyicideki kodun belleği bitiyor, ancak standart, makul derecede modern bir bilgisayarla çevrimdışı çalışıyor:

>> matl
 > Z^!S!Xu!tsi=Z)"1G@m?@!
 > 
> [1 2 3]
> 15
> 36
1 1 1 1 2 3 3 3 3 3 3 3 3 3 3
1 1 1 2 2 2 3 3 3 3 3 3 3 3 3
1 1 2 2 2 2 2 3 3 3 3 3 3 3 3
1 2 2 2 2 2 2 2 3 3 3 3 3 3 3

açıklama

Z^      % Implicitly input array of denomminations and number of coins n. Compute 
        % Cartesian power. This gives 2D array with each "combination"
        % on a different row
!S!     % Sort each row
Xu      % Deduplicate rows
!       % Transpose: rows become columns. Call this array A
ts      % Push a copy, compute sum of each column
i       % Input y (desired sum)
=       % Logical array that contains true if the "combination" has the desired sum
Z)      % Keep only those columns in array A
"       % For each column
  1G    %   Push array of denominations again
  @     %   Push current column
  m     %   Is each denomination present in the column?
  ?     %   If so
    @!  %     Push current column again. Transpose into a row
        %   End if
        % End for
        % Implicitly display stack contents

3

Piton 3, 120 106 bayt

from itertools import*
lambda d,t,l:[i+d for i in combinations_with_replacement(d,l-len(d))if sum(i+d)==t]

Anonim bir işlev, formun bir grup mezhepini (x_1, x_2, x_3 ... , x_k), bir hedef değeri ve bir dizi jetonu bağımsız değişken aracılığıyla girer ve formun tuples listesini döndürür [(solution_1), (solution_2), (solution_3), ... (solution_k)].

Nasıl çalışır

Itertoolsbireyin combinations_with_replacementfonksiyon her oluşturmak için kullanılır l-len(d)mezheplerin, değiştirme ile, kombinasyonları. dBu kombinasyonların her birine eklenerek , her bir paranın en az bir kez görünmesi ve yeni kombinasyonun uzunluğu olduğu garanti edilir l. Bir kombinasyonun öğeleri toplamı varsa, kombinasyon tdönüş listesine bir demet olarak eklenir.

Ideone üzerinde deneyin


108 bayt için alternatif bir yöntem

from itertools import*
lambda d,t,l:set(tuple(sorted(i+d))for i in product(d,repeat=l-len(d))if sum(i+d)==t)

Anonim bir işlev, formun (x_1, x_2, x_3 ... , x_k)bir mezhep , bir hedef değeri ve bir dizi jetonun argüman yoluyla girilmesini sağlayan ve formun bir demetini döndüren anonim bir işlevdir {(solution_1), (solution_2), (solution_3), ... (solution_k)}.

Nasıl çalışır (diğer sürüm)

Bu, denemelerin tüm düzenlemelerini oluşturmak için ile arasındaki productişlevi kullanır . Bu kombinasyonların her birine eklenerek , her bir paranın en az bir kez görünmesi ve yeni kombinasyonun uzunluğu olduğu garanti edilir . Bir kombinasyonun öğeleri toplamı ise , kombinasyon sıralanır, listeden bir tup'e dönüştürülür ve dönüş tuples'ına eklenir. Son olarak, çağrı yinelenenleri kaldırır.itertoolsl-len(d)dltset

Ideone üzerinde deneyin (diğer sürüm)


0

JavaScript (ES6), 135 bayt

g=(a,n,y,r)=>n>0?y>0&&a.map((x,i)=>g(a.slice(i),n-1,y-x,[...r,x])):n|y||console.log(r)
(a,n,y)=>g(a,n-a.length,a.reduce((y,x)=>y-x,y),a)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.