Thay đổi công việc [đóng cửa]


10

Bạn đang viết một chương trình cho một máy tính tiền tự động. Người dùng cần thay đổi với số lượng xu ít nhất được sử dụng. Viết chương trình cần một số tiền (giả sử là 1,53 đô la) và thay đổi mệnh giá của Hoa Kỳ - trong trường hợp này: 1 x một tờ đô la, 1 x năm mươi xu và 3 x một xu. Chương trình ngắn nhất sẽ là người chiến thắng. Điểm thưởng cho việc hỗ trợ các loại tiền tệ khác (ví dụ mệnh giá của Vương quốc Anh) và các loại tiền tệ bất thường (1, 2, 3 xu?)

Bạn có các mệnh giá Mỹ: 1 xu, 5 xu, 10 xu, 25 xu, 50 xu, 1 đô la (ghi chú hoặc tiền xu), 2 đô la, 5 đô la, 10 đô la.

Bạn có các mệnh giá của Vương quốc Anh: 1 pence, 2 pence, 5 pence, 10 pence, 20 pence, 50 pence, £ 1, £ 2, £ 5 (ghi chú hoặc tiền xu), £ 10.


3
Điều này có lẽ cần một chút làm rõ. Trước tiên, bạn có thể nên chỉ định chúng tôi muốn số lượng xu ít nhất (điều này làm cho câu hỏi về phần thưởng thú vị hơn một chút, ví dụ: {1c, 49c, 50c} và 98c phá vỡ thuật toán ngây thơ). Thứ hai, một định dạng đầu vào / đầu ra là hữu ích. Cụ thể về việc xử lý các giá trị không thể đạt được (đối với các loại tiền tệ được tạo ra) sẽ giúp ích. Cuối cùng - bạn có thể muốn liệt kê các mệnh giá ở đây để mọi người không cần phải tra cứu nếu họ không quen với nó.
Nabb

Làm thế nào để điểm thưởng làm việc? Chỉ cần có một cà vạt cho chương trình ngắn nhất?
gnibbler

@gnibber, trích dẫn Stephen Fry: "[điểm là] được xác định một cách vô tư bởi một tư vấn tập trung vào dịch vụ khách hàng được lựa chọn theo nhân khẩu học, được chia nhỏ theo độ tuổi và giới tính - tức là tôi."
Thomas O

Tôi sẽ yêu cầu 50c vì tôi chưa thấy đồng xu 50 xu nào. Nhưng chúng vẫn tồn tại: usmint.gov/kids/coinnews/circulation/50centCoin.cfm
Martin York

Câu trả lời:


2

Windows PowerShell, 108 111 117

Nỗ lực đầu tiên, vô căn cứ cho đến nay:

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

Ghi chú thực hiện:

  1. Chấp nhận số lượng để trả lại qua đường ống
  2. Chấp nhận danh sách mệnh giá tiền tệ thông qua dòng lệnh
  3. Số lượng có thể được đưa ra với một dấu hiệu tiền tệ; nó sẽ bị tước (trên thực tế, bất cứ thứ gì không phải là số).
  4. Danh sách các mệnh giá không cần phải sắp xếp.
  5. Chương trình sẽ tạo ra thay đổi lớn nhất nhỏ hơn số lượng yêu cầu có thể đạt được với các mệnh giá đã cho, tức là 1,5 cho 1,53 nếu thiếu 1 xu.

Nếu 3 và 4 không cần phải thỏa mãn (nghĩa là tôi kiểm soát định dạng đầu vào ;-)), thì chương trình sau đủ (71):

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

2

Toán học: 110 ký tự

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

Sử dụng

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

Hoặc là

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 ký tự nữa) cho

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

Đối với các mệnh giá khác, chỉ cần thay đổi bảng hợp lý {10, ...., 5 / 100,1 / 100}


2

D: 225 ký tự

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");}

Dễ đọc hơn:

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");
}

Chỉ xử lý tiền Mỹ. Lấy giá trị làm giá trị dấu phẩy động trên dòng lệnh (phải có 0 đứng đầu cho các giá trị dưới 1 đô la). Không chấp nhận $ là một phần của giá trị. Xuất số lượng của từng loại hóa đơn / đồng tiền trên một dòng riêng biệt. Ví dụ: đầu vào 1,53 kết quả trong:

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


1

Toán học, 51 byte

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

đầu vào

[1,53]

đầu ra

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


Mathicala, 82 byte - TIỀN THƯỞNG--

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

Đầu vào

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

đầu ra

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


Umm, câu hỏi này sử dụng các mệnh giá khác nhau từ bản sao.
ericw31415

OP không chỉ định định dạng đầu vào / đầu ra.
J42161217

Câu hỏi này không sử dụng hóa đơn 100 đô la và không có tiền thưởng.
ericw31415

ok.fixed và lưu một số byte! Về phần thưởng, tôi vui lòng yêu cầu bạn đọc lại câu hỏi. Đặc biệt là phần .. "Điểm thưởng cho việc hỗ trợ các loại tiền tệ khác"
J42161217

Rất tiếc, tôi đoán tôi đã không nhìn thấy điều đó sau đó!
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")

Sử dụng một thuật toán tham lam.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.