Advent Challenge 3: время, чтобы восстановить подарки!

9

<< Пред. След. >>

К сожалению, Санта не смог вовремя поймать эльфов! Теперь он должен вернуться к изготовлению подарков. Поскольку эльфы определенно не рабы Санты, он должен выяснить, сколько стоит им заплатить.

Вызов

Учитывая некоторую информацию о подарках, определите стоимость изготовления их всех.

Каждый подарок кладется в картонную коробку и оборачивается оберточной бумагой с лентой, обмотанной вокруг него в самом конце. Оберточная бумага волшебна и не требует наложения, поэтому количество используемой оберточной бумаги точно соответствует площади поверхности коробки. Все подарки представляют собой прямоугольные призмы, потому что таким образом Санта может хранить их более компактно. Лента вращается во всех трех направлениях (поэтому длина ленты, используемой для обертывания, равна сумме трех разных периметров).

К счастью, само настоящее имеет известную цену. Картон стоит 1 доллар за квадратный метр, а оберточная бумага - 2 доллара за квадратный метр. (Подсказка: вы можете просто умножить площадь поверхности на 3: P). Лента стоит 1 доллар за метр.

Спецификации формата

Входные данные будут представлены в виде списка подарков, где каждый подарок содержит стоимость самого предмета и три измерения данного бокса. Ваш результат должен быть общей требуемой стоимостью.

Чтобы быть точным, то формула для стоимости одного настоящее со стоимостью элемента cи размеров x, yи zэто c + 6 * (x * y + y * z + z * x) + 4 * (x + y + z).

Тестовые случаи

[[7, 8, 6, 7], [7, 7, 5, 5], [8, 9, 6, 7], [6, 5, 10, 10], [5, 9, 6, 7], [9, 9, 10, 6], [8, 10, 10, 6], [6, 5, 7, 9], [7, 10, 8, 8], [5, 9, 9, 10]] -> 11866
[[5, 10, 8, 9], [8, 8, 5, 8], [8, 7, 7, 6], [5, 9, 9, 10], [9, 7, 5, 8], [9, 8, 9, 5], [7, 5, 6, 7], [5, 7, 6, 10]] -> 8854
[[9, 8, 8, 8], [10, 9, 8, 5], [10, 7, 5, 5], [10, 10, 6, 6], [8, 5, 8, 7]] -> 4853
[[7, 7, 8, 10], [8, 10, 7, 8], [9, 7, 7, 8], [8, 5, 10, 5], [6, 6, 6, 8], [8, 9, 7, 5], [8, 5, 6, 5], [7, 9, 8, 5], [10, 10, 10, 8]] -> 9717
[[5, 8, 9, 7], [5, 8, 7, 10], [5, 7, 7, 6], [5, 5, 5, 6], [9, 9, 5, 7], [5, 6, 7, 8], [8, 5, 8, 7], [6, 9, 5, 5], [10, 10, 9, 10]] -> 9418
[[9, 9, 7, 10], [5, 8, 7, 9], [5, 5, 9, 8], [10, 5, 9, 10], [8, 5, 10, 7], [8, 9, 5, 5], [5, 10, 6, 10]] -> 8178
[[5, 9, 5, 8], [7, 8, 10, 6], [7, 10, 7, 10], [8, 9, 7, 5], [5, 7, 8, 6], [9, 9, 6, 10], [6, 5, 9, 9], [7, 9, 9, 9]] -> 9766
[[7, 10, 5, 10], [8, 10, 8, 9], [8, 6, 7, 8], [6, 9, 8, 5], [6, 7, 10, 9], [7, 6, 5, 8]] -> 7118
[[10, 6, 7, 5], [5, 9, 5, 9], [9, 7, 8, 5], [6, 6, 9, 9], [9, 9, 6, 9], [10, 5, 8, 9], [7, 5, 6, 10], [9, 10, 5, 5]] -> 8007
[[8, 10, 7, 8], [9, 10, 5, 8], [6, 7, 5, 6], [10, 10, 9, 8], [7, 5, 8, 9], [10, 10, 6, 7], [10, 8, 9, 10], [5, 10, 5, 5]] -> 9331

правила

  • Применяются стандартные лазейки
  • Ввод и вывод может быть дан и представлен в любом разумном формате
  • Вы должны принять входные данные в виде списка подарков, а не 4 списков атрибутов.
  • Это поэтому выигрывает самый короткий ответ в байтах
  • Ответы не принимаются

Надеюсь, этот вызов проще, чем предыдущие: P

Примечание: я черпал вдохновение для этой серии испытаний из Advent Of Code . У меня нет связи с этим сайтом

Вы можете увидеть список всех испытаний в серии, посмотрев раздел «Связанные» первой задачи здесь .

HyperNeutrino
источник
c + 6 * (x * y + y * z + z * x) + 4 * (x + y + z)
Грэм
@ Грэм Да, оказывается, я забыл добавить это. Удаление из спецификаций.
HyperNeutrino
@cairdcoinheringaahing Извините за путаницу. Я решил придерживаться оригинальной идеи и отредактировал свои тестовые примеры, чтобы отразить это также. Спасибо!
HyperNeutrino
6
Я наслаждался этой серией испытаний, но (по общему признанию, после большого количества пива!) Этот только кажется, что язык может выполнить закрытую формулу в наименьшем количестве байтов без какой-либо возможности для творческого игры в гольф, поэтому, в данном случае, нет + 1 от меня.
Лохматый
1
Что еще я должен прояснить для дополнительного близкого избирателя после того, как я уточнил существующие комментарии?
HyperNeutrino

Ответы:

5

JavaScript (ES6), 58 байт

a=>a.reduce((p,[c,x,y,z])=>p+c+6*(y*z+x*(y+=z))+4*(x+y),0)

Контрольные примеры

Как?

Единственный прием, используемый здесь, это разложить на множители (xy + xz) как x (y + z) и повторно использовать сумму (y + z) в последней части формулы.

a => a.reduce(                    // for each present in a:
  (s, [c, x, y, z]) =>            //   s = sum, [c, x, y, z] = present parameters
    s +                           //   add to s:
    c +                           //     c
    6 * (y * z + x * (y += z)) +  //     6(yz + x(y + z))
    4 * (x + y),                  //     4(x + (y + z))
  0                               //   initial sum = 0
)                                 // end of reduce()
Arnauld
источник
2

Python 3 , 56 байт

lambda*a:sum(c+(6*x+4)*(y+z)+6*y*z+4*x for(c,x,y,z)in a)

Попробуйте онлайн!

  • -2 байта благодаря мистеру Xcoder!
  • -15 байт благодаря нотьягану!
  • -1 байт благодаря Аликс Айзенхардт!
Caird Coneheringaahing
источник
2

C (gcc) , 104 100 99 93 байта

  • Сохранено четыре пять одиннадцать байтов благодаря PrincePolka .
t,x,y,z;f(A,a)int*A;{for(t=0;a--;)t+=*A+++6*((x=*A++)*(y=*A++)+(z=*A++)*(x+=y))+4*(x+z);t=t;}

Попробуйте онлайн!

Принимает список присутствующих атрибутов (длина списка делится на четыре) и целое число, указывающее количество подарков. Возвращает стоимость изготовления всех подарков.

Джонатан Фрех
источник
100 байт, если не требуется работать более одного, вы можете сбрить j = t = 0,
PrincePolka
@PrincePolka Спасибо. По общему мнению, функция должна работать несколько раз, поэтому j=t=0должна оставаться. Я не мог понять, как изменить порядок вычисления, чтобы сохранить байт; было бы полезно, если бы вы связались с полной версией кода с вашим реализованным гольфом.
Джонатан Фрех
99 байтов
PrincePolka
@PrincePolka Большое спасибо.
Джонатан Фрех
1

05AB1E , 17 байт

vyćsO4*y¦æ2ùPO6*O

Попробуйте онлайн!

объяснение

v                  # for each present y
 yć                # extract the head (cost)
   s               # swap the dimensions to the top
    O4*            # sum and multiply by 4
       y¦          # push y with the head (cost) removed
         æ         # compute the powerset
          2ù       # keep only elements of length 2
            PO     # product and sum
              6*   # multiply by 6
                O  # sum everything
Emigna
источник
0

Pyth , 39 байт

u+G++hH*6++*@H1@H2*@H1@H3*@H2@H3*4stHQ0

Попробуйте онлайн!

Принимает ввод как строковое представление вложенного списка и суммирует по формуле стоимости.

KSmarts
источник
0

Excel, 60 байт

Ввод взят из столбцов Aв D, новая строка в подарок. Формула в любом другом столбце.

=SUMPRODUCT(A:A+6*(B:B*C:C+C:C*D:D+B:B*D:D)+4*(B:B+C:C+D:D))
Wernisch
источник
Вы можете сбросить 2 байта, перенеся это в Google Sheets и сбросив терминал))
Тейлор Скотт