Chơi golf cho tôi một ít tiền từ ATM


26

Nhiệm vụ rất đơn giản. Nhận cho tôi một số 1000, 500100ghi chú.

Làm sao ? bạn có thể hỏi Đừng lo lắng, không cần phải cướp ngân hàng vì có ATM gần đó chấp nhận thẻ tín dụng của bạn. Nhưng hạn mức tín dụng của bạn chỉ đủ cho nhiệm vụ nên bạn phải cẩn thận với việc rút tiền.

Thử thách

Căn cứ vào số lượng 1000, 500100ghi chú cần thiết, tính toán rút tiền cụ thể cần thiết để có được ít nhất là những ghi chú rất nhiều. Trong mỗi lần rút tiền, ATM có thể phun ra từng lưu ý dựa trên các quy tắc sau:

  • Số tiền đã rút ( A) ít hơn5000
    • Nếu A%1000 == 0, sau đó ATM nhổ 1 500nốt, 5 100nốt và 1000ghi chú nghỉ
    • Khác A%500 == 0, nếu ATM nhổ 5 100nốt, 1000ghi chú nghỉ
    • Khác nếu A%1000 < 500, ATM nhổ các floor(A/1000) 1000ghi chú và 100ghi chú nghỉ ngơi
    • Khác nếu A%1000 > 500, ATM nhổ các floor(A/1000) 1000ghi chú, 1 500100ghi chú nghỉ ngơi
  • Số tiền đã rút lớn hơn bằng 5000
    • Nếu A%1000 == 0, sau đó ATM nhổ 2 500ghi chú và 1000ghi chú nghỉ ngơi
    • Khác, nếu, A%500 == 0ATM nhổ 1 500nốt và 1000ghi chú nghỉ
    • Khác nếu A%1000 < 500, ATM nhổ các floor(A/1000) 1000ghi chú và 100ghi chú nghỉ ngơi
    • Khác nếu A%1000 > 500, ATM nhổ các floor(A/1000) 1000ghi chú, 1 500100ghi chú nghỉ ngơi

Để làm rõ, đây là một bảng ghi chú hoàn chỉnh được rút cho tất cả số tiền có thể lên tới 7000(bạn có thể rút thêm, nhưng mẫu không thay đổi sau đó). Thứ tự là <1000> <500> <100>:

 100 => 0 0 1                  2500 => 2 0 5                   4800 => 4 1 3
 200 => 0 0 2                  2600 => 2 1 1                   4900 => 4 1 4
 300 => 0 0 3                  2700 => 2 1 2                   5000 => 4 2 0
 400 => 0 0 4                  2800 => 2 1 3                   5100 => 5 0 1
 500 => 0 0 5                  2900 => 2 1 4                   5200 => 5 0 2
 600 => 0 1 1                  3000 => 2 1 5                   5300 => 5 0 3
 700 => 0 1 2                  3100 => 3 0 1                   5400 => 5 0 4
 800 => 0 1 3                  3200 => 3 0 2                   5500 => 5 1 0
 900 => 0 1 4                  3300 => 3 0 3                   5600 => 5 1 1
1000 => 0 1 5                  3400 => 3 0 4                   5700 => 5 1 2
1100 => 1 0 1                  3500 => 3 0 5                   5800 => 5 1 3
1200 => 1 0 2                  3600 => 3 1 1                   5900 => 5 1 4
1300 => 1 0 3                  3700 => 3 1 2                   6000 => 5 2 0
1400 => 1 0 4                  3800 => 3 1 3                   6100 => 6 0 1
1500 => 1 0 5                  3900 => 3 1 4                   6200 => 6 0 2
1600 => 1 1 1                  4000 => 3 1 5                   6300 => 6 0 3
1700 => 1 1 2                  4100 => 4 0 1                   6400 => 6 0 4
1800 => 1 1 3                  4200 => 4 0 2                   6500 => 6 1 0
1900 => 1 1 4                  4300 => 4 0 3                   6600 => 6 1 1
2000 => 1 1 5                  4400 => 4 0 4                   6700 => 6 1 2
2100 => 2 0 1                  4500 => 4 0 5                   6800 => 6 1 3
2200 => 2 0 2                  4600 => 4 1 1                   6900 => 6 1 4
2300 => 2 0 3                  4700 => 4 1 2                   7000 => 6 2 0
2400 => 2 0 4

Danh sách được cung cấp bởi Martin

Cuộc đuổi bắt

Vì giới hạn tín dụng trong thẻ tín dụng của bạn là vừa đủ, bạn cần đảm bảo rằng tổng số tiền được rút trong các lần rút là mức tối thiểu có thể cho đầu vào / yêu cầu ghi chú đã cho.

Đầu vào

Đầu vào có thể ở bất kỳ định dạng thuận lợi cho ba số tương ứng với số lượng ghi chú cần thiết có giá trị 1000, 500100. Không nhất thiết phải theo thứ tự đó.

Đầu ra

Đầu ra là số tiền được rút trong mỗi giao dịch được phân tách bằng một dòng mới.

Ví dụ

Đầu vào (định dạng <1000> <500> <100>):

3 4 1

Đầu ra:

600
600
600
3600

một ít nữa:

7 2 5
5000
3500

1 2 3
600
1700

21 14 2
600
600
600
1600
5000
5000
5000
5000
5000

Giả định

  • Bạn có thể cho rằng ATM có số lượng ghi chú vô hạn của từng số tiền.
  • Bạn cũng có thể cho rằng bạn có thể thực hiện bất kỳ số lượng giao dịch nào.
  • Hơn nữa, giải pháp cho một số giá trị đầu vào có thể không phải là duy nhất, vì vậy bạn có thể xuất bất kỳ 1 trong số các giải pháp đáp ứng số lượng tối thiểu có thể và các điều kiện tối thiểu cần thiết.

Như thường lệ, bạn có thể viết một chương trình đọc đầu vào đầy đủ thông qua STDIN / ARGV và in đầu ra sang STDOUT hoặc một hàm lấy đầu vào thông qua các đối số và trả về một danh sách các số nguyên tương ứng với số lượng hoặc một chuỗi với số lượng được phân tách bằng một dòng mới.

Đây là mã golf để mã ngắn nhất tính theo byte thắng.


@nutki thật đấy. Đã chỉnh sửa.
Tối ưu hóa

Có bất kỳ hạn chế tốc độ? Trường hợp thử nghiệm cuối cùng nên 21 14 2kết thúc trong một thời gian hợp lý?
Jakube 7/1/2015

1
@Jakube Trong thời gian hợp lý - có (nói dưới 5-6 giờ). Nhưng như vậy, không có giới hạn vì đây là môn đánh gôn.
Tối ưu hóa

Vì vậy, nếu tôi rút 0, nó sẽ cho tôi năm 100 ghi chú?
AJMansfield

@AJMansfield tất nhiên là không. Bạn không thể rút 0 số tiền
Trình tối ưu hóa

Câu trả lời:


7

JavaScript, 184 148

function g(a,b,c){x=[];while(a>0||b>0||c>0){i=b<3||a<4?a:4;a-=i;if(i>3&&b>1){b-=2;i++}else{i+=(c--<b&&i>4?0:.1)+(b-->0?.5:0)}x.push(i*1e3)}return x}

http://jsfiddle.net/vuyv4r0p/2/

trả về danh sách các số nguyên tương ứng với số tiền rút


Hãy thử g(5,1,1). Một giải pháp tốt hơn : 5600.
jimmy23013

nên được sửa ngay bây giờ
hoffmale

g(5,1,0), giải pháp : 5500.
jimmy23013

điều đó bây giờ cũng nên được sửa chữa ^^ cảm ơn vì đã chỉ ra rằng, tôi phải quá buồn ngủ
hoffmale

g(5,2,0), giải pháp : 6000.
jimmy23013

1

Perl 5: 223

Chỉnh sửa

Giải pháp này đã được thực hiện với một giả định sai lầm rằng 7K là giới hạn ATM. Điều này thực sự làm cho nhiệm vụ trở nên thú vị hơn vì nó yêu cầu lập trình động (mô hình di chuyển khá thường xuyên, nhưng mã hóa cứng sẽ có thể lâu hơn so với tính toán trực tiếp như tôi đã làm). Với bất kỳ số tiền nào có thể, mô hình di chuyển đều đặn đến mức không thể mã hóa nó. Tôi không biết liệu giải pháp của @hoffmale có đúng không, nhưng nó sẽ nằm trong số những dòng này. Thật đáng buồn, đó sẽ là một nhiệm vụ khác, nơi đầu tiên ai đó đi kèm với một giải pháp và sau đó nó được chuyển sang ngôn ngữ chơi gôn để giành chiến thắng.

Chậm hơn một chút so với giải pháp ban đầu (nhưng vẫn là giây phụ cho các tham số dưới 100).

#!perl -pa
$c{0,0}=$f=($a,$b,$c)=@F;for$i(0..$b){for$j(0..$a){
/.(?=.$)/>($n=$c{$i-$`,$j-$'})||${$r=\$c{$i,$j}}<($x=$n+$&)&&$$r
or$f=$$r="$x $n".($'.$&+5*$`)."00
"for 204..206,105,106,11..15,110..114}}$_=$f."100
"x($c-$f+3);s/.*\b3//

Giải pháp nhanh hơn 259.

#!perl -pa
$c{0,0}=($a,$b,$c)=@F;for$i(0..$b){for$j(0..$a){
/\B./<($%=$c{$i-$&,$j-$'}+$`)&&(!${$r=\$c{$i,$j}}||$$r>$%)and$d{$i,$j}=$_,$$r=$%for
qw/024 025 026 015 016/,101..105,110..114}}
$d{$b,$a}=~/\B./,$c-=$`,$b-=$&,$a-=$',print$'.$`+5*$&,"00
"while$a+$b;$_="100
"x$c

Sử dụng STDIN:

$perl atm.pl <<<"21 14 2"
5000
5000
5000
5000
5000
600
600
600
1600

Hãy thử 10 0 0. Giải pháp tốt hơn : 10100.
jimmy23013

@ user23013 oops, tôi hiểu nhầm câu hỏi. Tôi giả sử 7k là số tiền tối đa :( Tôi hy vọng tôi sẽ có thể sửa nó.
nutki
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.