最適な引き戸幅を見つける


13

スライディングドアの価格は、ドアの幅に応じて異なります。異なる価格は次のとおりです。

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

クローゼットを購入するときは、明らかにコストを最小限に抑えたいので、クローゼットの総幅に基づいて総コストを最小化するドアの幅を見つけることがタスクです。

ルール:

  • 合計幅が入力として取得されます
  • すべてのドアは同じ幅になります
  • 2種類のドアのコストが同じ場合、最小のドアを選択してください
  • 幅はセンチメートルで、整数は小数ではありません
    • 小数を切り上げる
  • 価格は整数として返されます(通貨記号は不要です)
  • 入力および出力形式はオプションですが、出力の順序は次のとおりでなければなりません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が必要です。
アレックスA.

回答:


2

05AB1E、47バイト

コード:

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

最高の提出ではありませんが、少なくとも何か:)

オンラインでお試しください!


TIOに333を入力すると、3 * 111が完全に333に等しいため(afaik)出力が[3、111、660]になるはずであるときに[3、112、660]の出力が得られます
ヘレン

[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) 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"

  • ハッシュをインライン化して2つの配列に分割することで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

より短い(80=>150,100=>200,120=>220)IS (80,150,100,200,120,220)
msh210

これは非常に広いドア(価格が10_000以上)で機能しますか?
msh210

@ msh210ヒントをありがとう、それらを組み込みます!いいえ、それは唯一の問題で指定された範囲で動作します[120-1000)が、一つは、常に変更することができます1E41E9...
ケニー

ああ、質問が範囲を指定していることに気づきませんでした。
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疑似三項ステートメントを使用して現在のアイテムの価格を計算し、の$c上限を計算します$a/$_。現在の合計が表示されている最小の合計($j)よりも小さい場合、これらの変数$j(合計)、$k(必要なドアの数)、および$i(ドアの幅)をすべて保存し、ループを続けます。ループが終了したら、最適な値を出力するだけです。

編集-保存移動させることにより、2バイト$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 = input

                                                   m r2 17#range(2,17)をマップする
                                                    [d)#最初にドアカウントのリスト
                                                      .EcQd#および幅second
                                        f#Tでマップ結果をフィルターする
                                         } r60 121#範囲内(60,121)
                                          eT#ドア幅
          m#dでフィルター結果をマップ
           [d)#ドアの数と幅が最初のリストへ
             * hd#マルチドアカウント
                ?> 81ed150?<101ed220 200#1ドアあたりの価格、3値の単純な検索
 o#Nでマップ結果を順序付けます
  + eNcehNT#order key = price + width / 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.