Виберіть Сцени для фільму


12

Вступ

Нарешті кінокомпанія фінансує ваш фільм. Вони надали вам максимальний бюджет, а також встановили час роботи вашого фільму.

Тепер можна починати з попереднього виробництва. У вас є купа запланованих сцен, але не всі вони впишуться в бюджет, і фільм також вийде занадто довгим. Однак ви знаєте важливість кожної сцени. Ваша мета - вибрати сцени, щоб фільм не був надто дорогим, занадто довгим і посереднім.

Вхідні дані

Ви отримуєте running timeі budgetстудія схвалила:

[25, 10]

У вас є список сцен , включаючи running time, costsі importanceдля кожного з них:

[ [5, 2, 4], [7, 1, 3] ]

Якщо масиви не працюють для вас, виберіть інший формат введення, який найкраще підходить для вас. Часи в хвилинах. Бюджет і витрати у мільйонах випадкової валюти. Важливе значення має діапазон від [1–9]. Усі числа є цілими числами.

Вихідні дані

Виведіть список сцен, які слід включити до фільму, у тому, що:

  • Сума importanceмаксимізована.
  • Витрати не перевищують бюджет.
  • Тривалість знаходиться в межах ± 5 хв затвердженого часу роботи.

Порядок сцен є неважливим і не потребує збереження.

Ви можете вивести список чисел або масив. Ваш вихід може мати нульовий або одноосновний індекс:

[0,2,5] – 0, 2, 5 – 0 2 5
[1,3,6] – 1, 3, 6 – 1 3 6

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

Обмеження

  • Сцени не можна скоротити, а також не можна дешевшати.
  • Кожна сцена може бути включена лише один раз.

Вимоги

  • Ваша програма повинна закінчитися в момент фактичної тривалості фільму.
  • Введення приймається з STDINаргументів командного рядка, як параметрів функції або з найближчого еквівалента.
  • Можна написати програму або функцію. Якщо це анонімна функція, додайте приклад, як викликати її.
  • Це тому найкоротша відповідь у байтах виграє.
  • Стандартні лазівки заборонені.

Фільми

Ваш перший фільм - це документальний фільм про маленьке містечко в Німеччині під назвою Knapsack 1 . Це місто було переселено через екологічні обмеження у 70-х роках:

Movie: [25, 10]

Scenes: [
    [5,  2, 4],
    [5,  5, 7],
    [7,  1, 3],
    [8,  5, 3],
    [12, 3, 9],
]

Можливе рішення з часом роботи 22, бюджетом 10та важливістю 20:

0, 1, 4

Наступний ваш проект - епізод Фарго :

Movie: [45, 25]

Scenes: [
    [2,  1, 1],
    [8,  5, 9],
    [10, 6, 8],
    [10, 3, 6],
    [10, 9, 7],
    [11, 4, 3],
    [19, 5, 6],
]

Можливе рішення з часом роботи 40, бюджетом 24та важливістю 31:

0, 1, 2, 3, 4

Нарешті, ось сюжети для фільму, де " М. Макконахі їде в далеку галактику лише для того, щоб дізнатися, що Метт Деймон першим туди потрапив ":

Movie: [169, 165]

Scenes: [
    [5,  8,  2],
    [5,  20, 6],
    [6,  5,  8],
    [6,  10, 3],
    [7,  6,  5],
    [7,  9,  4],
    [7,  8,  9],
    [7,  9,  5],
    [8,  6,  8],    
    [8,  8,  8],
    [8,  5,  6],
    [9,  5,  6],
    [9,  8,  5],
    [9,  4,  6],
    [9,  6,  9],
    [9,  8,  6],
    [9,  7,  8],
    [10, 22, 4],
    [10, 12, 9],
    [11, 7,  9],
    [11, 9,  8],
    [12, 11, 5],
    [15, 21, 7],
]

Можливе рішення з часом роботи 169, бюджетом 165та важливістю 133:

1, 2, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22

1 Будь-яка схожість між проблемою виклику та фактичними локалями є цілком випадковою.

Відповіді:


4

MATLAB, 100 байт

function X=o(m,s) 
X=find(bintprog(-1*s(:,3),[s(:,2)';s(:,1)';-1*s(:,1)'],[m(2);m(1)+5;5-m(1)])==1);

Проблема бінарної оптимізації вирішується через функцію bintprog , доступну в Matlab2013b; цю функцію замінили intlinprog у новіших версіях Matlab.

Вхідні дані - вектор (m) для обмежень у фільмі та матриця (и) для сцен. Зокрема, m - двоелементний рядковий вектор [run_time budget], тоді як s - матриця Nx3, де N - кількість сцен, а кожен рядок складається з [важливості витрат часу].


2

Пітон 3, 211 197 байт

Це рішення жорстоко змушує кожну комбінацію сцен починаючи від комбінації всіх сцен аж до комбінації лише однієї сцени, а потім вибирає комбінацію сцен, яка має максимальне значення. Брут-форсинг використовувався, оскільки вартість в часі була не особливо великою, хоча, безумовно, експоненціальною. Вихід є нульовим показником.

from itertools import*
def m(t,b,s):l=len(s);r=range(l);f=lambda y,k:sum(s[q][k]for q in y);return max([j for i in r for j in combinations(r,l-i)if t-6<f(j,0)<t+6and f(j,1)<=b],key=lambda n:f(n,2))

Ungolfing:

import itertools
def movie_scenes(time, budget, scenes):
    length = len(s)
    r = range(length)
    f = lambda film_list, index: sum(scenes[q][index]for q in film_list)
    importance = 0
    possible_films = []
    for num_scenes in r:
        for film in itertools.combinations(r, num_scenes):
            run_time = f(film, 0)
            cost = f(film, 1)
            if time-6 < run_time < time+6 and cost <= budget:
                possible_films.append(film)
    return max(possible_films, key = lambda film: f(film, 2)

Дякуємо за те, що першим придумали один - насправді навіть два - підходи, що не використовують вбудовані модулі та за те, що привернули увагу до цього питання.
вставтекористувач тут

@insertusernamehere ласкаво просимо :)
Sherlock9

1

Haskell, 125 байт

(m,n)&s=snd$maximum[(sum i,q)|q<-filter(>=0)<$>mapM(:[-1])[0..length s-1],(t,b,i)<-[unzip3$map(s!!)q],sum b<=n,abs(sum t-m)<6]

Приклад використання: (25,10) & [(5,2,4),(5,5,7),(7,1,3),(8,5,3),(12,3,9)]-> [0,1,4].

Як це працює:

let m be the running time
    n    the budget
    s    the list of scenes


    q<-filter ... s-1]                         -- loop q through the list of
                                               -- subsequences of the indices of s
                                               -- (0 based) -- details see below
                          map(s!!)q            -- extract the elements for the
                                               -- given indices                   
                    unzip3                     -- turn the list of triples
                                               -- into a triple of lists
          (t,b,i)<-[               ]           -- bind t, b and i to the lists
                                    sum b<=n   -- keep q if the sum of budgets <= n
                              abs(sum t-m)<6   -- and the time is within range
  (sum i,q)                                    -- for all leftover q make a pair
                                               -- (overall importance, q)
sum$maximum                                    -- find the maximum and drop
                                               -- overall importance


subsequence building:

                   [0..length s-1]         -- for all indices i of s
            (:[-1])                        -- make a list [i,-1]
        mapM                               -- and make the cartesian product
                                           -- e.g. [0,1] -> [[0,-1],[1,-1]] ->
                                           -- [[0,1],[0,-1],[-1,1],[-1,-1]]
filter(>=0)<$>                             -- drop all -1
                                           -- -> [[0,1],[0],[1],[]]

Нещодавно тому у відповіді @xnor знайшов трюк щодо подальших дій. Це коротше, ніж subsequenceвимагає import Data.List.


1

Рубі, 172 166 165 байт

Я дійсно повинен почати перевіряти, чи є версії Ruby моїх відповідей Python гравцями, перш ніж публікувати ці відповіді Python. У будь-якому випадку, це той самий грубий підхід до оптимізації, як і раніше. Будь-які поради щодо гольфу вітаються, включаючи ті, які передбачають деякі фактичні методи оптимізації.

->t,b,s{l=s.size;r=[*0...l];f=->y,k{y.reduce(0){|z,q|z+s[q][k]}};v=[];r.map{|i|r.combination(l-i).map{|j|v<<j if(t-5..t+5)===f[j,0]&&f[j,1]<=b}};v.max_by{|n|f[n,2]}}

Безголівки:

def movie(time, budget, scenes)
  len = scenes.size
  range = [*0...len]
  f = -> y,k {y.reduce(0) {|z,q| z + s[q][k]}}
  potential_films = []
  range.map do |i|
    range.combination(len-i).map do |j|
    # len - i because range being combined must be 0..(len-1) as these are indices
    # but the number of elements in the combinations must be 1..len 
      if (time-5..time+5).include?(f[j,0]) && f[j,1] <= budget
        potential_films << j
      end
    end
  end
  return potential_films.max_by{|n|f[n,2]}
end
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.