Найти оптимальную ширину раздвижной двери


13

Раздвижные двери имеют разные цены в зависимости от ширины дверей. Различные цены следующие:

  • 60 - 80 см: 150
  • 81 - 100 см: 200
  • 101 - 120 см: 20220

При покупке шкафа вы, очевидно, захотите минимизировать стоимость, поэтому ваша задача - найти ширину дверей, которая минимизирует общую стоимость, основываясь на общей ширине шкафа.

Правила:

  • Общая ширина будет принята за
  • Все двери будут иметь одинаковую ширину
  • Выберите самые маленькие двери, если два типа дверей стоят одинаково
  • Ширина указана в сантиметрах, целые числа не десятичные
    • Округлить десятичные
  • Цена должна быть возвращена как целое число (без знака валюты)
  • Входные и выходные форматы не являются обязательными, но порядок выхода должен быть: 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) # список с количеством дверей первым
                                                      .EqQd # и ширина секунда
                                        f # Фильтр результата карты с T
                                         } r60 121 # в диапазоне (60 121)
                                          eT # ширина двери
          m # результат фильтра карты с d
           [d) # к списку с количеством дверей и шириной в первую очередь
             * HD # Мульт дверь с
                ?> 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.