Bir Film için Sahneler Seçin


12

Giriş

Sonunda film şirketi filminizi finanse ediyor. Size maksimum bir bütçe verdiler ve filminizin çalışma süresini de ayarladılar.

Artık üretim öncesi ile başlayabilirsiniz. Zaten planlanmış bir sürü sahneniz var, ancak hepsi bütçeye uymuyor ve film de çok uzun sürecek. Ancak her sahnenin önemini biliyorsunuz. Amacınız, filmin çok pahalı, çok uzun ve vasat olmayacağı sahneleri seçmektir.

Giriş

Sen almak running timeve budgetstüdyo onayladı:

[25, 10]

Sen dahil sahnelerin listesi var running time, costsve importancebunların her biri için:

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

Diziler sizin için çalışmıyorsa, size en uygun başka bir giriş biçimini seçin. Zamanlar dakikalar içinde. Bütçe ve maliyetler milyonlarca rastgele para birimindedir. Önemi bir aralıktır [1–9]. Tüm sayılar tamsayıdır.

Çıktı

Aşağıdaki gibi, filme dahil edilecek sahnelerin listesini çıktılayın:

  • Toplamı importanceen üst düzeye çıkarılır.
  • Maliyetler bütçeyi aşmıyor.
  • Uzunluk, onaylanan çalışma süresinin ± 5 dakika aralığındadır.

Sahnelerin sırası önemsizdir ve korunması gerekmez.

Bir sayı listesi veya dizi çıktısı alabilirsiniz. Çıktınız sıfır veya tek tabanlı bir dizine sahip olabilir:

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

Herhangi bir girdi için birden fazla çözümün uygulanması mümkün olabilir. Sadece birini bulman gerekiyor.

Kısıtlamalar

  • Sahneler kısaltılamaz ve daha ucuz olamazlar.
  • Her sahne yalnızca bir kez dahil edilebilir.

Gereksinimler

  • Programınız, filmin gerçek uzunluğunda bitmelidir.
  • Girdi STDIN, komut satırı bağımsız değişkenlerinden, işlev parametreleri olarak veya en yakın eşdeğerden kabul edilir.
  • Bir program veya işlev yazabilirsiniz. Anonim bir işlevse, lütfen onu nasıl çağıracağınıza ilişkin bir örnek ekleyin.
  • Bu bayt kazanır çok kısa cevaptır.
  • Standart boşluklara izin verilmez.

filmler

İlk filminiz Almanya'da Knapsack 1 adlı küçük bir kasaba hakkında bir belgesel . Bu şehir, 70'lerde çevresel kısıtlamalar nedeniyle yeniden yerleştirildi:

Movie: [25, 10]

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

Çalışma süresi 22, bütçe 10ve aşağıdakilerin önemi ile olası çözüm 20:

0, 1, 4

Bir sonraki projeniz Fargo'nun bir bölümü :

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],
]

Çalışma süresi 40, bütçe 24ve aşağıdakilerin önemi ile olası çözüm 31:

0, 1, 2, 3, 4

Sonunda bir filmin sahneleri: " M. McConaughey uzak bir galaksiye sadece Matt Damon'un oraya ilk geldiğini bulmak için gidiyor " .

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],
]

Çalışma süresi 169, bütçe 165ve aşağıdakilerin önemi ile olası çözüm 133:

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

1 Mücadelenin sorunu ve gerçek yerel ayarlar arasındaki benzerlik tamamen tesadüfidir.

Yanıtlar:


4

MATLAB, 100 bayt

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);

İkili Optimizasyon sorunu Matlab2013b'de bulunan bintprog fonksiyonu ile çözülür; bu işlev daha yeni Matlab sürümlerinde intlinprog ile değiştirildi .

Girdiler, film kısıtlamaları için bir vektör (m) ve sahneler için bir matris (ler) dir. Özellikle m, iki elemanlı bir satır vektörü [running_time bütçesi], s ise bir Nx3 matrisidir; burada N, sahne sayısıdır ve her bir satır [running_time maliyet öneminden] oluşur.


2

Python 3, 211 197 bayt

Bu çözüm, tüm sahnelerin kombinasyonlarından başlayarak tek bir sahnenin kombinasyonlarına kadar her sahnenin kombinasyonunu zorlar, ardından maksimum öneme sahip sahnelerin kombinasyonunu seçer. Kaba zorlama, zamanın maliyeti özellikle büyük olmadığı için kesinlikle üstel olmasına rağmen kullanıldı. Çıktı sıfır indekslidir.

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)

Yerleşik kullanmayan ve soruya biraz dikkat çeken ilk yaklaşımlardan biri olan - hatta iki tane - yaklaştığınız için teşekkürler.
insertusernameburada

@insertusernamehere Hoş geldiniz :)
Sherlock9

1

Haskell, 125 bayt

(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]

Kullanım örneği: (25,10) & [(5,2,4),(5,5,7),(7,1,3),(8,5,3),(12,3,9)]-> [0,1,4].

Nasıl çalışır:

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 cevabında bir süre önce sonraki hile bulundu . Bu daha kısa olduğunu subsequencegerektirir import Data.List.


1

Yakut, 172 166 165 bayt

Bu Python cevaplarını göndermeden önce Python cevaplarımın Ruby sürümlerinin daha golfçu olup olmadığını gerçekten kontrol etmeye başlamalıyım. Her halükarda, bu optimizasyona daha önce olduğu gibi kaba kuvvet yaklaşımıdır. Bazı gerçek optimizasyon tekniklerini içerenler de dahil olmak üzere golf ile ilgili her türlü ipucuna açıktır.

->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]}}

Ungolfed:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.