Temukan lebar pintu geser yang optimal


13

Pintu geser memiliki harga yang bervariasi berdasarkan lebar pintu. Perbedaan harga adalah sebagai berikut:

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

Saat membeli lemari, Anda tentu ingin meminimalkan biaya, jadi tugas Anda adalah menemukan lebar pintu yang meminimalkan biaya total berdasarkan total lebar lemari.

Aturan:

  • Lebar total akan diambil sebagai input
  • Semua pintu akan memiliki lebar yang sama
  • Pilih pintu terkecil jika dua jenis pintu harganya sama
  • Lebar dalam sentimeter, bilangan bulat bukan desimal
    • Kumpulkan desimal
  • Harga akan dikembalikan sebagai bilangan bulat (tidak perlu tanda mata uang)
  • Input dan output format adalah opsional, tetapi urutan output harus: Number of doors, Width, Price.
  • Input akan berada dalam kisaran [120 1000).

Ini golf kode. Kode terpendek dalam byte menang.

Contoh:

Input: 156
Output: 2, 78, 300

Input: 331
Output: 3, 111, 660

Input: 420
Output: 4, 105, 880

Lebar 201adalah kasus uji yang menarik ...
AdmBorkBork

8
Pintu geser? Jelas setiap pintu membutuhkan @ Doorknob.
Alex A.

Jawaban:


2

05AB1E , 47 byte

Kode:

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

Bukan pengiriman terbaik, tapi setidaknya sesuatu :)

Cobalah online!


Menempatkan 333 ke dalam TIO memberikan output [3, 112, 660] ketika (afaik) output harus [3, 111, 660] karena 3 * 111 sama dengan 333 dengan sempurna
Helen

Masalah serupa dengan pemberian 201 [2, 101, 400] alih-alih [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) sama dengan Math.ceil (a / b) dalam bilangan bulat 31-bit.


4

Perl, 190 180 154 133 128 117 byte

termasuk +1 untuk -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"

Berkomentar:

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"

  • Simpan 11 byte dengan inlining dan membagi hash ke dua array

  • Hemat 5 byte dengan menggunakan -p(terima kasih kepada @ dev-null)

  • Simpan 18 byte dengan menggunakan POSIX :: ceil dan 3 lainnya dengan menggunakan sintaksis daftar untuk hash (terima kasih kepada @ msh210)


Lebih pendek dari sub r{$a=$_[0];~~$a==$a?$a:1+~~$a}itu sub r{use POSIX;ceil pop}.
msh210

Lebih pendek dari (80=>150,100=>200,120=>220)itu (80,150,100,200,120,220).
msh210

Apakah ini bekerja untuk pintu yang sangat sangat lebar (di mana harganya lebih dari 10_000)?
msh210

@ msh210 Terima kasih atas tipsnya, saya akan menggabungkannya! Tidak, ini hanya berfungsi untuk rentang yang ditentukan dalam pertanyaan [120-1000), tetapi seseorang dapat selalu berubah 1E4menjadi 1E9...
Kenney

Oh, saya tidak menyadari bahwa pertanyaannya telah menentukan kisaran.
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

Output dipisahkan oleh baris baru.

Kami mengambil input $a, mengatur biaya kami $jke 9000000000(sejumlah besar itu jauh lebih banyak daripada yang kita butuhkan). Selanjutnya, kita mengulang dari 60..120dengan |%{...}. Setiap iterasi, kami menghitung $pharga item saat ini dengan pernyataan pseudo-ternary , lalu menghitung $cpagu $a/$_. Jika total saat ini lebih kecil dari total terkecil yang kita lihat ( $j), simpan semua variabel ini: $j(total), $k(jumlah pintu yang diperlukan), dan $i(lebar pintu), dan lanjutkan loop. Setelah loop selesai, output saja nilai-nilai terbaik.

Sunting - Menyimpan dua byte dengan memindahkan $cdan $ppenugasan ke ifkondisi


2

Pyth, 65 byte

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

Coba di sini!

Penjelasan

Pertama, ini menghasilkan daftar semua kemungkinan kombinasi jumlah pintu / lebar pintu dan menghitung harga untuk setiap kombinasi tersebut. Maka kita hanya perlu memesannya dengan harga dan lebar pintu dan mengambil elemen pertama dari daftar yang dihasilkan.

Penjelasan kode berikut setelah saya menurunkan ini. Tolong bantu saya bermain golf, ini terlalu lama.

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

                                                   m r2 17 # rentang peta (2,17) hingga
                                                    [d) daftar # dengan jumlah pintu terlebih dahulu
                                                      .EcQd # dan lebar kedua
                                        f # Saring hasil peta dengan T
                                         } r60 121 # dalam kisaran (60.121)
                                          eT # lebar pintu
          m # hasil filter peta dengan d
           [d) # ke daftar dengan jumlah pintu dan lebar terlebih dahulu
             * Jumlah pintu hd # mult dengan
                ?> 81ed150? <101ed220 200 # harga per pintu, pencarian sederhana dengan ternaries
 o # pesan hasil peta dengan N
  + eNcehNT # kunci pesanan = harga + lebar / 10
h # elemen pertama adalah yang terbaik

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]

Seperti dicatat oleh @Neil, =-~(~-n/d)setara dengan divisi dengan pembulatan untuk bilangan bulat 32 bit atau kurang.


1

R , 135 104 byte

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

Cobalah online!

Disimpan 31 byte oleh

  • angka dekompresi
  • menggunakan utf8ToInt
  • menggunakan "!" untuk mempersingkat panggilan fungsi
  • menggunakan fungsi vektor
  • tidak mendefinisikan panjang total
  • menggunakan cbindlangsung daripada setelah mendefinisikan variabel

Bagaimana itu bekerja:

  1. approxmengembalikan harga satu pintu berdasarkan panjangnya. Ia kembali di NAluar kisaran [60,120].
  2. Berdasarkan spesifikasi, jumlah total pintu tidak boleh lebih dari 16 (total panjang 1000). Semua jumlah pintu dari 16 hingga 1 diuji, dan triplet (number of doors, door width, total price)dikembalikan.
  3. The orderFungsi digunakan untuk menemukan harga minimum; triplet yang benar diekstraksi berdasarkan itu. Dalam hal pengikatan, order akan mengembalikan entri yang datang terlebih dahulu, dan karena kita dilingkari dari 16 ke 1, jumlah pintu terbesar (lebar pintu terkecil) akan dikembalikan.

Menggunakan stepfunlebih lama - karena seseorang harus menghapus lebar di luar [60,120].
JayCe
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.