Знайдіть оптимальну ширину розсувних дверей


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.
Алекс А.

Відповіді:


2

05AB1E , 47 байт

Код:

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

Не найкраще подання, але принаймні щось :)

Спробуйте в Інтернеті!


Введення 333 в TIO дає вихід [3, 112, 660], коли (afaik) вихід повинен бути [3, 111, 660], оскільки 3 * 111 дорівнює 333 ідеально
Олена

Аналогічна проблема з 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

Це працює для дуже дуже широких дверей (де ціна більше 10_000)?
msh210

@ msh210 Дякую за поради, я їх включу! Ні, він працює лише для діапазону, визначеного у запитанні [120-1000), але завжди можна змінити 1E4на 1E9...
Кенні

О, я не помітив, що питання задало діапазон.
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(ширина дверей) та продовжуйте цикл. Після завершення циклу просто виведіть найкращі значення.

Редагувати - Збережено два байти шляхом переміщення $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 # multi door count
                ?> 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

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 (загальна довжина 1000). Перевіряється вся кількість дверей від 16 до 1, і триплет (number of doors, door width, total price)повертається.
  3. orderФункція використовується , щоб знайти мінімальну ціну; на основі цього витягується правильний триплет. У випадку зв’язків order повернеться запис, який приходить першим, і оскільки ми перекинулися від 16 до 1, найбільша кількість дверей (найменша ширина дверей) буде повернута.

Використання stepfunдовше - оскільки потрібно видалити ширину поза [60,120].
JayCe
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.