找到最佳的移门宽度


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
滑行门?显然,每个门都需要一个@Doorknob。
Alex A.

Answers:


2

05AB1E,47个字节

码:

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

不是最好的提交,但至少有一些:)

在线尝试!


当(afaik)输出应为[3,111,660]时,将333放到TIO中将得到[3,112,660]输出,因为3 * 111等于333
Helen

201提供[2,101,400]而不是[2,101,440]的类似问题
Helen

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) 在31位整数中与Math.ceil(a / b)相同。


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)

  • 使用POSIX :: ceil节省18个字节,使用列表语法进行哈希节省3个字节(感谢@ msh210)


短于sub r{$a=$_[0];~~$a==$a?$a:1+~~$a}IS sub r{use POSIX;ceil pop}
msh210 '16

短于(80=>150,100=>200,120=>220)IS (80,150,100,200,120,220)
msh210 '16

这对非常宽的门(价格超过10_000的门)有效吗?
msh210 '16

@ msh210感谢您的提示,我将其纳入其中!不,它仅适用于问题中指定的范围[120-1000),但始终可以更改1E41E9...
肯尼

哦,我没有注意到问题已指定范围。
msh210 '16

3

PowerShell,137135字节

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,将成本设置$j9000000000(比我们需要的数量更多的成本)。接下来,我们就从循环60..120使用|%{...}。每次迭代时,我们$p使用伪三元语句计算当前商品的价格,然后计算的$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)#到先有门数和宽度的列表
             *高清#多门计数
                ?> 81ed150?<101ed220 200#每门价格,具有三元数的简单查找
 o#使用N排序映射结果
  + eNcehNT#订单代码=价格+宽度/ 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

R135104字节

"!"=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(总长度为1000)。测试了从16到1的所有门数,并(number of doors, door width, total price)返回了三元组。
  3. order功能用于定位最低价格;基于此提取正确的三元组。如果是平局,order 将返回最先进入的条目,并且由于我们从16循环到1 ,因此将返回最大数量的门(最小的门宽)。

使用stepfun的时间更长 -因为需要删除之外的宽度[60,120]
JayCe
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.