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.


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×$_"}}

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}


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


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 +


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.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.