เลือกฉากสำหรับภาพยนตร์


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อาร์กิวเมนต์บรรทัดคำสั่งเป็นพารามิเตอร์ฟังก์ชันหรือจากเทียบเท่าที่ใกล้เคียงที่สุด
  • คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่น หากเป็นฟังก์ชันที่ไม่ระบุตัวตนโปรดระบุตัวอย่างของวิธีการเรียกใช้
  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ
  • ช่องโหว่มาตรฐานไม่ได้รับอนุญาต

ภาพยนตร์

ภาพยนตร์เรื่องแรกของคุณเป็นสารคดีเกี่ยวกับเมืองเล็ก ๆ ในเยอรมนีที่เรียกว่าเป้ 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

โครงการต่อไปของคุณคือตอนของFargo :

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

ในที่สุดนี่คือฉากสำหรับภาพยนตร์ที่ " M. McConaughey เดินทางไปยังกาแลคซีไกลโพ้นเพื่อพบว่า Matt Damon ไปถึงที่นั่นก่อน "

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

ปัญหา Binary Optimization ได้รับการแก้ไขผ่านฟังก์ชั่นbintprog ที่มีอยู่ใน Matlab2013b; ฟังก์ชั่นนี้ถูกแทนที่ด้วยintlinprogใน Matlab เวอร์ชั่นที่ใหม่กว่า

อินพุตเป็นเวกเตอร์ (m), สำหรับข้อ จำกัด ภาพยนตร์และเมทริกซ์ (s) สำหรับฉาก โดยเฉพาะ m คือเวกเตอร์แถวสององค์ประกอบ [วิ่ง _ เวลางบประมาณ] ในขณะที่ s เป็นเมทริกซ์ Nx3 โดยที่ N คือจำนวนฉากและแต่ละแถวประกอบด้วย [Running_time ต้นทุนสำคัญ]


2

Python 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

@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 มันสั้นกว่าที่ต้องใช้subsequenceimport Data.List


1

Ruby, 172 166 165 ไบต์

ฉันควรเริ่มตรวจสอบว่าคำตอบ Python ของฉันในเวอร์ชัน Ruby เป็น Golfier หรือไม่ก่อนโพสต์คำตอบของ 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]}}

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.