Berolahraga ganti [ditutup]

10

Anda sedang menulis program untuk mesin kasir otomatis. Pengguna perlu ganti dengan jumlah koin paling sedikit yang digunakan. Tulis sebuah program yang mengambil jumlah (katakanlah $ 1,53) dan berikan perubahan dalam denominasi AS - dalam contoh ini: 1 x satu dolar, 1 x lima puluh sen dan 3 x satu sen. Program terpendek akan menjadi pemenang. Poin bonus untuk mendukung mata uang lain (mis. Denominasi Inggris) dan mata uang tidak biasa (1, 2, 3 sen?)

Anda memiliki denominasi AS: 1 sen, 5 sen, 10 sen, 25 sen, 50 sen, 1 dolar (uang kertas atau koin), 2 dolar, 5 dolar, 10 dolar.

Anda memiliki denominasi UK: 1 pence, 2 pence, 5 pence, 10 pence, 20 pence, 50 pence, £ 1, £ 2, £ 5 (uang kertas atau koin), £ 10.

Thomas O
sumber
3
Ini mungkin perlu sedikit klarifikasi. Pertama, Anda mungkin harus menentukan kami ingin jumlah koin paling sedikit (yang membuat pertanyaan bonus sedikit lebih menarik, misalnya {1c, 49c, 50c} dan 98c memecah algoritma naif). Kedua, format input / output berguna. Spesifik penanganan nilai yang tidak dapat diperoleh (untuk mata uang yang dibuat-buat) akan membantu. Terakhir - Anda mungkin ingin membuat daftar denominasi di sini sehingga orang tidak perlu mencarinya jika mereka tidak mengenalnya.
Nabb
Bagaimana cara kerja poin bonus? Hanya jika ada dasi untuk program terpendek?
gnibbler
@gnibber, mengutip Stephen Fry: "[poin] ditentukan secara tidak memihak oleh konsultasi fokus layanan pelanggan yang dipilih secara demografis, dikelompokkan berdasarkan usia dan jenis kelamin - yaitu saya."
Thomas O
Saya akan meminta 50c karena saya belum melihat koin 50 sen. Tapi aparently mereka ada: usmint.gov/kids/coinnews/circulating/50centCoin.cfm
Martin York

Jawaban:

2

Windows PowerShell, 108 111 117

Upaya pertama, ungolfed sejauh ini:

$i=+("$input"-replace'[^\d.]')
$args|%{0d+$_}|sort -des|%{$a=[math]::floor($i/$_)
if($a){$i-=$a*$_
"$a×$_"}}

Catatan implementasi:

  1. Menerima kuantitas untuk kembali melalui pipa
  2. Menerima daftar denominasi mata uang melalui baris perintah
  3. Kuantitas dapat diberikan dengan tanda mata uang; yang akan dilucuti (sebenarnya, apa pun yang non-numerik).
  4. Daftar denominasi tidak perlu disortir.
  5. Program ini akan menghasilkan perubahan terbesar yang lebih kecil dari jumlah yang diminta yang dapat dicapai dengan denominasi yang diberikan, yaitu 1,5 untuk 1,53 jika koin 1 sen hilang.

Jika 3 dan 4 tidak perlu dipenuhi (yaitu saya mengontrol format input ;-)), maka program berikut sudah cukup (71):

$i=+"$input"
$args|%{$a=[math]::floor($i/$_)
if($a){$i-=$a*$_
"$a×$_"}}
Joey
sumber
2

Mathematica: 110 karakter

Sort[IntegerPartitions[Rationalize@#,Infinity,{10,5,2,1,1/2,1/4,1/10,5/100,1/100}],
    Length@#1<Length@#2&][[1]]&  

Pemakaian

%[0.98]  
{1/100, 1/100, 1/100, 1/10, 1/10, 1/4, 1/2}  

Atau

Tally@Sort[IntegerPartitions[Rationalize@#,Infinity,
                             {10,5,2,1,1/2,1/4,1/10,5/100,1/100}],
     Length@#1<Length@#2&][[1]]&  

(6 karakter lagi) memberi

{{1/100, 3}, {1/10, 2}, {1/4, 1}, {1/2, 1}}

Untuk denominasi lain, cukup ubah tabel rasional {10, ...., 5 / 100,1 / 100}

Belisarius
sumber
2

D: 225 Karakter

import std.algorithm,std.conv,std.stdio;void main(string[]args){auto m=args[1].findSplit(".");void p(T,S)(T t,T u,S s){foreach(v;[u,10,5,1]){writefln("%s %s%s",t/v,v,s);t-=(t/v)*v;}}p(to!int(m[0]),20,"");p(to!int(m[2]),25,"/100");}

Lebih Jelas:

import std.algorithm,std.conv,std.stdio;

void main(string[] a)
{
    auto m = a[1].findSplit(".");

    void p(T, S)(T t, T u, S s)
    {
        foreach(v; [u, 10, 5, 1])
        {
            writefln("%s %s%s", t / v, v, s);
            t -= (t / v) * v;
        }
    }

    p(to!int(m[0]), 20, "");
    p(to!int(m[2]), 25, "/100");
}

Hanya menangani mata uang AS. Mengambil nilai sebagai nilai floating point pada baris perintah (harus memiliki 0 terdepan untuk nilai di bawah 1 dolar). Tidak menerima $ sebagai bagian dari nilai. Output jumlah masing-masing jenis tagihan / koin pada baris yang terpisah. Misalnya input 1,53 menghasilkan:

0 20
0 10
0 5
1 1
2 25/100
0 10/100
0 5/100
3 1/100

Jonathan M Davis
sumber
1

Mathematica, 51 byte

#~NumberDecompose~{10,5,2,1,.5,.25,.1,.05,.01}&

memasukkan

[1,53]

keluaran

{0, 0, 0, 1, 1, 0, 0, 0, 3.}


Mathematica, 82 byte --WITH BONUS--

(s=#~NumberDecompose~#2;Row@Flatten@Table[Table[#2[[i]]"+",s[[i]]],{i,Length@s}])&

Memasukkan

[37.6, {15, 7, 2.5, 1, 0.88, 0.2, 0.01}]

keluaran

15 +15 +7 +0.2 +0.2 +0.2 +

J42161217
sumber
Umm, pertanyaan ini menggunakan denominasi berbeda dari duplikat.
ericw31415
OP tidak menentukan format input / output.
J42161217
Pertanyaan ini tidak menggunakan tagihan 100 dolar dan tidak ada bonus.
ericw31415
ok. diperbaiki dan disimpan beberapa byte! Adapun bonusnya, saya meminta Anda untuk membaca pertanyaan itu lagi. Terutama bagian .. "Poin bonus untuk mendukung mata uang lainnya"
J42161217
Ups, saya kira saya tidak melihat itu!
ericw31415
1

Javascript, 84 83 byte

(n,v=[10,5,2,1,.5,.25,.1,.05,.01],l=[])=>{for(i in v)l[i]=n/v[i]|0,n%=v[i];return l}

(n,v=[10,5,2,1,.5,.25,.1,.05,.01],l=[])=>eval("for(i in v)l[i]=n/v[i]|0,n%=v[i];l")

Menggunakan algoritma serakah.

ericw31415
sumber
0

APL (Dyalog) , 19 byte

Anjurkan untuk jumlah yang diinginkan dan kemudian untuk denominasi yang dinyatakan dalam satuan terkecil (sen / sen).

CY'dfns'
 stamps

Cobalah online!

⎕CY'dfns'C o p y yang dfnskerja

⎕ stamps⎕ meminta masukan dan digunakan sebagai argumen untuk itu stampsfungsi

Adm
sumber