Tìm chiều rộng cửa trượt tối ưu


13

Cửa trượt có giá khác nhau dựa trên chiều rộng của cửa. Giá khác nhau như sau:

  • 60 - 80 cm: ¤150
  • 81 - 100 cm: ¤200
  • 101 - 120 cm: ¤ 220

Khi mua tủ quần áo, rõ ràng bạn sẽ muốn giảm thiểu chi phí, vì vậy, nhiệm vụ của bạn là tìm chiều rộng của cửa để giảm thiểu tổng chi phí dựa trên tổng chiều rộng của tủ.

Quy tắc:

  • Tổng chiều rộng sẽ được lấy làm đầu vào
  • Tất cả các cửa sẽ có cùng chiều rộng
  • Chọn cửa nhỏ nhất nếu hai loại cửa có giá như nhau
  • Độ rộng tính bằng centimet, số nguyên không phải là số thập phân
    • Làm tròn số thập phân
  • Giá sẽ được trả lại dưới dạng một số nguyên (không cần ký hiệu tiền tệ)
  • Các định dạng đầu vào và đầu ra là tùy chọn, nhưng thứ tự của đầu ra phải là : Number of doors, Width, Price.
  • Đầu vào sẽ nằm trong phạm vi [120 1000).

Đây là mã golf. Mã ngắn nhất trong byte thắng.

Ví dụ:

Input: 156
Output: 2, 78, 300

Input: 331
Output: 3, 111, 660

Input: 420
Output: 4, 105, 880

Chiều rộng của 201là một trường hợp thử nghiệm thú vị ...
AdmBorkBork

8
Cửa trượt? Rõ ràng mỗi cánh cửa đều cần một @Doorknob.
Alex A.

Câu trả lời:


2

05AB1E , 47 byte

Mã số:

D120/ó>DU=/ó>=D101›iX220*=q}D80›iX200*=q}X150*=

Không phải là đệ trình tốt nhất, nhưng ít nhất là một cái gì đó :)

Hãy thử trực tuyến!


Đưa 333 vào TIO sẽ cho đầu ra [3, 112, 660] khi (afaik) đầu ra phải là [3, 111, 660] vì 3 * 111 hoàn toàn bằng 333
Helen

Vấn đề tương tự với 201 đưa ra [2, 101, 400] thay vì [2, 101, 440]
Helen

4

JavaScript (ES6), 101 byte

t=>[[80,150],[100,200],[120,220]].map(([w,p])=>[n=-~(~-t/w),-~(~-t/n),n*p]).sort((a,b)=>a[2]-b[2])[0]

-~(~-a/b) giống như Math.ceil (a / b) trong các số nguyên 31 bit.


4

Perl, 190 180 154 133 128 117 byte

bao gồm +1 cho -p

use POSIX;$m=1E4;for$q(80,100,120){($m,@z)=($p,$n,ceil$_/$n)if$m>($p=(150,200,220)[$x++]*($n=ceil$_/$q))}$_="@z $m"

Đã bình luận:

use POSIX;                                  # for ceil()
$m = 1E4;                                   # init min price to 10k
for $q (80,100,120) {                       # iterate widths
    ($m,@z) = ($p,$n, ceil $_/$n)           # update min, output
    if $m > (                               #
       $p = (150,200,220)[$x++]             # grab price
          * ( $n = ceil $_/$q )             # times nr of doors needed
    )
}
$_="@z $m"

  • Lưu 11 byte bằng cách nội tuyến và chia băm thành hai mảng

  • Lưu 5 byte bằng cách sử dụng -p(nhờ @ dev-null)

  • Lưu 18 byte bằng cách sử dụng POSIX :: ceil và 3 điểm nữa bằng cách sử dụng cú pháp danh sách cho hàm băm (nhờ @ msh210)


Ngắn hơn sub r{$a=$_[0];~~$a==$a?$a:1+~~$a}sub r{use POSIX;ceil pop}.
msh210

Ngắn hơn (80=>150,100=>200,120=>220)(80,150,100,200,120,220).
msh210

Điều này có hoạt động cho các cửa rất rộng (trong đó giá hơn 10_000) không?
msh210

@ msh210 Cảm ơn các mẹo, tôi sẽ kết hợp chúng! Không, nó chỉ hoạt động cho phạm vi được chỉ định trong câu hỏi [120-1000), nhưng người ta luôn có thể thay đổi 1E4thành 1E9...
Kenney

Ồ, tôi không nhận thấy rằng câu hỏi đã chỉ định một phạm vi.
msh210

3

PowerShell, 137 135 byte

param($a)$j=9e9;60..120|%{if((($c=[math]::ceiling($a/$_))*($p=(220,(200,150)[$_-le80])[$_-le100]))-lt$j){$j=($k=$c)*$p;$i=$_}}
$k;$i;$j

Đầu ra được phân tách dòng mới.

Chúng tôi lấy đầu vào $a, đặt chi phí của chúng tôi $jthành 9000000000(một số lượng lớn hơn nhiều so với mức chúng tôi cần). Tiếp theo, chúng ta lặp từ 60..120với |%{...}. Mỗi lần lặp, chúng tôi tính toán$p giá của mặt hàng hiện tại bằng một tuyên bố giả ba chiều , sau đó tính $ctrần của $a/$_. Nếu tổng số hiện tại nhỏ hơn tổng nhỏ nhất chúng ta đã thấy ( $j), hãy lưu tất cả các biến sau: $j(tổng số), $k(số lượng cửa cần thiết) và $i(chiều rộng cửa) và tiếp tục vòng lặp. Khi vòng lặp kết thúc, chỉ cần xuất các giá trị tốt nhất.

Chỉnh sửa - Đã lưu hai byte bằng cách di chuyển $c$pgán vào ifđiều kiện


2

Bình thường, 65 byte

ho+eNcehNTm[d*hd?>81ed150?<101ed220 200)f}eTr60 121m[d.EcQd)r2 17

Hãy thử nó ở đây!

Giải trình

Đầu tiên, điều này tạo ra một danh sách tất cả các kết hợp cửa / chiều rộng cửa có thể và tính giá cho mỗi kết hợp đó. Sau đó, chúng tôi chỉ phải đặt hàng theo giá và chiều rộng cửa và lấy yếu tố đầu tiên của danh sách kết quả.

Giải thích mã sau khi tôi đánh golf xuống Xin hãy giúp tôi chơi golf, đây là quá lâu.

ho + eNcehNTm [d * hd?> 81ed150? <101ed220 200) f} eTr60 121m [d.EcQd) r2 17 # Q = đầu vào

                                                   m r2 17 # phạm vi bản đồ (2,17) đến
                                                    [d) # danh sách với số lượng cửa đầu tiên
                                                      .EcQd # và chiều rộng thứ hai
                                        f # Lọc kết quả bản đồ với T
                                         } r60 121 # trong phạm vi (60.121)
                                          chiều rộng cửa eT #
          m # kết quả lọc bản đồ với d
           [d) # vào danh sách có số lượng cửa và chiều rộng trước
             * hd # nhiều cửa đếm với
                ?> 81ed150? <101ed220 200 # giá mỗi cửa, tra cứu đơn giản với chim nhạn
 o # thứ tự kết quả bản đồ với N
  + eNcehNT # khóa đặt hàng = giá + chiều rộng / 10
yếu tố đầu tiên h # là tốt nhất

1

JavaScript (ES6) 96

n=>[80,100,120].map((d,i)=>[d=-~(~-n/d),-~(~-n/d),d*[150,200,220][i]]).sort((a,b)=>a[2]-b[2])[0]

Theo ghi nhận của @Neil, =-~(~-n/d)tương đương với phép chia với số nguyên từ 32 bit trở xuống.


1

R , 135 104 byte

"!"=utf8ToInt;cbind(n<-16:1,w<-ceiling(scan()/n),p<-n*approx(!"<Qex",!"–ÈÜÜ",w,"c")$y)[order(p)[1],]

Hãy thử trực tuyến!

Đã lưu 31 byte bởi

  • giải nén số
  • sử dụng utf8ToInt
  • sử dụng "!" để rút ngắn chức năng gọi
  • sử dụng các hàm vectơ
  • không xác định tổng chiều dài
  • sử dụng cbindtrực tiếp thay vì sau khi xác định biến

Làm thế nào nó hoạt động:

  1. approxtrả về giá của một cánh cửa duy nhất dựa trên chiều dài của nó. Nó trả về NAbên ngoài phạm vi [60,120].
  2. Dựa trên thông số kỹ thuật, tổng số cửa không thể nhiều hơn 16 (tổng chiều dài 1000). Tất cả số lượng cửa từ 16 đến 1 được kiểm tra và bộ ba (number of doors, door width, total price)được trả lại.
  3. Các orderchức năng được sử dụng để xác định giá tối thiểu; bộ ba chính xác được trích xuất dựa trên đó. Trong trường hợp quan hệ, order sẽ trả lại mục nhập trước, và vì chúng tôi đã lặp từ 16 đến 1, số lượng cửa lớn nhất (chiều rộng cửa nhỏ nhất) sẽ được trả lại.

Sử dụng stepfunlà lâu hơn - vì người ta cần phải loại bỏ chiều rộng bên ngoài [60,120].
JayCe
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.