ค้นหาความกว้างของประตูบานเลื่อนที่เหมาะสม


13

ประตูบานเลื่อนมีราคาแตกต่างกันไปตามความกว้างของประตู ราคาแตกต่างกันดังนี้:

  • 60 - 80 ซม.: ¤150
  • 81 - 100 ซม.: ¤200
  • 101 - 120 ซม.: ¤220

เมื่อซื้อตู้เสื้อผ้าคุณจะต้องการลดค่าใช้จ่ายอย่างเห็นได้ชัดดังนั้นงานของคุณคือค้นหาความกว้างของประตูที่ลดค่าใช้จ่ายทั้งหมดตามความกว้างรวมของตู้เสื้อผ้า

กฎ:

  • ความกว้างทั้งหมดจะถูกนำมาเป็นอินพุต
  • ประตูทุกบานจะมีความกว้างเท่ากัน
  • เลือกประตูที่เล็กที่สุดหากประตูสองประเภทมีค่าใช้จ่ายเท่ากัน
  • ความกว้างอยู่ในหน่วยเซนติเมตรจำนวนเต็มไม่ใช่ทศนิยม
    • ปัดเศษทศนิยม
  • ราคาจะถูกส่งคืนเป็นจำนวนเต็ม (ไม่จำเป็นต้องมีสัญลักษณ์สกุลเงิน)
  • อินพุตและเอาต์พุตรูปแบบที่เป็นตัวเลือก Number of doors, Width, Priceแต่คำสั่งของการส่งออกจะต้อง:
  • [120 1000)การป้อนข้อมูลจะอยู่ในช่วง

นี่คือรหัสกอล์ฟ รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

ตัวอย่าง:

Input: 156
Output: 2, 78, 300

Input: 331
Output: 3, 111, 660

Input: 420
Output: 4, 105, 880

ความกว้างของ201เป็นกรณีทดสอบที่น่าสนใจ ...
AdmBorkBork

8
ประตูเลื่อน? เห็นได้ชัดว่าทุกประตูต้องการ @Dorkork
Alex A.

คำตอบ:


2

05AB1E , 47 ไบต์

รหัส:

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

ไม่ใช่สิ่งที่ดีที่สุด แต่อย่างน้อย :)

ลองออนไลน์!


การใส่ 333 ใน TIO ให้ผลลัพธ์เป็น [3, 112, 660] เมื่อ (afaik) ผลลัพธ์ควรเป็น [3, 111, 660] ตั้งแต่ 3 * 111 เท่ากับ 333 อย่างสมบูรณ์
Helen

ปัญหาที่คล้ายกันกับ 201 ให้ [2, 101, 400] แทน [2, 101, 440]
เฮเลน

4

JavaScript (ES6), 101 ไบต์

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) เหมือนกับ Math.ceil (a / b) ในจำนวนเต็ม 31 บิต


4

Perl, 190 180 154 133 128 117 ไบต์

รวม +1 สำหรับ -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"

แสดงความคิดเห็น:

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"

  • บันทึก 11 ไบต์ด้วยการอินไลน์และแบ่งการแฮชเป็นสองอาร์เรย์

  • บันทึก 5 ไบต์โดยใช้-p(ขอบคุณ @ dev-null)

  • บันทึก 18 ไบต์โดยใช้ POSIX :: ceil และอีก 3 รายการโดยใช้ไวยากรณ์รายการสำหรับแฮช (ขอบคุณ @ msh210)


สั้นกว่าคือsub r{$a=$_[0];~~$a==$a?$a:1+~~$a} sub r{use POSIX;ceil pop}
msh210

สั้นกว่าคือ(80=>150,100=>200,120=>220) (80,150,100,200,120,220)
msh210

ใช้งานได้กับประตูที่กว้างมาก ๆ หรือไม่
msh210

@ msh210 ขอบคุณสำหรับเคล็ดลับฉันจะรวมไว้ด้วย! ไม่มันใช้งานได้กับช่วงที่ระบุในคำถาม[120-1000)เท่านั้น แต่สามารถเปลี่ยน1E4เป็น1E9...
Kenney

โอ้ฉันไม่ได้สังเกตว่าคำถามได้ระบุช่วง
msh210

3

PowerShell, 137 135 ไบต์

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

เอาต์พุตถูกคั่นด้วยบรรทัดใหม่

เราป้อนข้อมูล$aตั้งค่าของเรา$jเป็น9000000000(จำนวนมากซึ่งเป็นวิธีที่มากกว่าที่เราต้องการ) ต่อไปเราห่วงจากที่มี60..120 |%{...}ย้ำเราคำนวณแต่ละ$pราคาของรายการปัจจุบันมีคำสั่งหลอก ternaryแล้วคำนวณเพดาน$c $a/$_หากผลรวมปัจจุบันน้อยกว่าผลรวมที่เล็กที่สุดที่เราเคยเห็น ( $j) ให้บันทึกตัวแปรเหล่านี้ทั้งหมด: $j(ผลรวม), $k(จำนวนประตูที่ต้องการ) และ$i(ความกว้างของประตู) และดำเนินการวนรอบต่อไป เมื่อลูปเสร็จสิ้นให้ส่งออกค่าที่ดีที่สุด

แก้ไข - บันทึกสองไบต์ด้วยการย้าย$cและการ$pกำหนดลงในifเงื่อนไข


2

Pyth, 65 ไบต์

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

ลองที่นี่!

คำอธิบาย

ก่อนอื่นจะสร้างรายการชุดค่าความกว้างประตู / ความกว้างของประตูที่เป็นไปได้ทั้งหมดและคำนวณราคาสำหรับชุดค่าผสมเหล่านั้นทุกชุด จากนั้นเราจะต้องสั่งซื้อตามราคาและความกว้างของประตูและใช้องค์ประกอบแรกของรายการผลลัพธ์

คำอธิบายรหัสติดตามหลังจากที่ฉันเล่นกอล์ฟนี้ลงโปรดช่วยฉันกอล์ฟสิ่งนี้ยาวเกินไป

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

                                                   m r2 17 # ช่วงแผนที่ (2,17) ถึง
                                                    [d) # รายการที่มีจำนวนประตูก่อน
                                                      .EcQd # และความกว้างที่สอง
                                        f # กรองผลลัพธ์แผนที่ด้วย T
                                         } r60 121 # อยู่ในช่วง (60,121)
                                          eT # ความกว้างของประตู
          m # ผลการกรองแผนที่ด้วย d
           [d) # ไปยังรายการที่มีจำนวนประตูและความกว้างก่อน
             * hd # mult จำนวนประตูด้วย
                ?> 81ed150? <101ed220 200 # ราคาต่อประตูค้นหาง่ายด้วย ternaries
 o # order ผลลัพธ์แผนที่ด้วย N
  + eNcehNT # order key = ราคา + ความกว้าง / 10
h # องค์ประกอบแรกที่ดีที่สุด

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]

ตามที่บันทึกไว้โดย @Neil =-~(~-n/d)เทียบเท่ากับการหารด้วยการปัดเศษขึ้นเป็นจำนวนเต็ม 32 บิตหรือน้อยกว่า


1

R , 135 104 ไบต์

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

ลองออนไลน์!

บันทึกแล้ว 31 ไบต์โดย

  • การคลายการบีบอัดตัวเลข
  • การใช้ utf8ToInt
  • ใช้ "!" เพื่อย่นการเรียกใช้ฟังก์ชัน
  • ใช้ฟังก์ชั่นเวกเตอร์
  • ไม่ได้กำหนดความยาวทั้งหมด
  • ใช้cbindโดยตรงแทนที่จะกำหนดตัวแปร

มันทำงานอย่างไร:

  1. approxส่งคืนราคาของประตูเดียวตามความยาว มันกลับนอกช่วงNA[60,120]
  2. ขึ้นอยู่กับข้อมูลจำเพาะจำนวนประตูทั้งหมดต้องไม่เกิน 16 (ความยาวรวม 1,000) จำนวนประตูทั้งหมดจาก 16 เป็น 1 จะถูกทดสอบและ triplet (number of doors, door width, total price)จะถูกส่งกลับ
  3. orderฟังก์ชั่นที่ใช้ในการค้นหาราคาต่ำสุด; triplet ที่ถูกต้องจะถูกสกัดตามที่ ในกรณีของความสัมพันธ์order จะส่งคืนรายการที่มาก่อนและเนื่องจากเราวนลูปจาก 16 ถึง 1 จะมีการส่งคืนจำนวนประตูมากที่สุด (ความกว้างของประตูที่เล็กที่สุด)

ใช้stepfunมีความยาว - [60,120]เป็นหนึ่งในความต้องการที่จะลบความกว้างของนอก
JayCe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.