ตัวละครเพื่อนคนไหนเป็นเพื่อนที่ดีที่สุด?


30

นักแสดงหลักหกคนของซิทคอมเพื่อนชาวอเมริกันทุกคนเห็นพ้องต้องกันว่าพวกเขาจะได้รับเงินเดือนเดียวกันตลอดระยะเวลาของซีรีส์ (หลังจบฤดูกาลที่ 2 อย่างน้อย) แต่นั่นไม่ได้หมายความว่าพวกเขาทุกคนมีเวลาออกอากาศเท่ากันหรือพวกเขามีปฏิสัมพันธ์บนหน้าจอกันในปริมาณเท่ากัน

ในการท้าทายนี้คุณจะเขียนโปรแกรมที่สามารถช่วยตัดสินว่าเพื่อนของเพื่อนคนไหนดีที่สุด

ติดตั้ง

ลองพิจารณาดูตอนหรือฉากของเพื่อนและจดบันทึกว่าใครอยู่บนหน้าจอระหว่างที่กล้องถ่ายรูปแต่ละนัดและนานเท่าใด

เราจะย่อชื่อตัวละครแต่ละตัว:

จากนั้นสำหรับทุกช็อตของกล้อง (หรือทุกครั้งที่ตัวละครเข้า / ออกจากช็อต) เราจะแสดงว่ามีใครอยู่บนหน้าจอ ตัวอย่างเช่น:

504 CRS
200 J
345 MP
980
2000 CJMPRS

นี่เป็นการบอกว่า:

  • สำหรับ 504ms, Chandler, Rachel และ Ross อยู่บนหน้าจอ
  • จากนั้นเป็นระยะเวลา 200 มิลลิวินาทีโจอี้เป็น
  • จากนั้นสำหรับ 345ms, Monica และ Phoebe อยู่
  • จากนั้นสำหรับ 980ms ไม่มีตัวละครหลักทั้ง 6 ตัวบนหน้าจอ
  • จากนั้นเป็นเวลา 2 วินาทีพวกเขาทั้งหมดเป็น

(นี่ไม่ได้มาจากคลิปจริงฉันสร้างมันขึ้นมา)

โปรดทราบว่าสิ่งต่อไปนี้จะเทียบเท่า:

504 CRS
1 J
199 J
345 MP
980
2000 CJMPRS

ในการวิเคราะห์ว่าชุดของตัวละครใดที่มีเวลาบนหน้าจอมากที่สุดเราจะดูชุดย่อยที่เป็นไปได้ทั้งหมด 64 ตัวจาก 6 ตัวอักษรและรวมเวลาที่หน้าจอทั้งหมด หากทุกคนในชุดย่อยปรากฏขึ้นบนหน้าจอระหว่างการถ่ายภาพของกล้องแม้ว่าจะมีตัวละครมากกว่าตัวละครในชุดย่อยเวลาสำหรับการถ่ายภาพของกล้องนั้นจะถูกเพิ่มเข้ากับเวลาหน้าจอทั้งหมดของชุดย่อยนั้น

มีข้อยกเว้นสำหรับเซตย่อยที่ว่างเปล่า - จะนับเฉพาะฉากที่ไม่มีตัวละครหลัก 6 ตัวเท่านั้น

ดังนั้นการวิเคราะห์ตัวอย่างข้างต้นจะเป็น:

980
2504 C
2200 J
2345 M
2345 P
2504 R
2504 S
2000 CJ
2000 CM
2000 CP
2504 CR
2504 CS
2000 JM
2000 JP
2000 JR
2000 JS
2345 MP
2000 MR
2000 MS
2000 PR
2000 PS
2504 RS
2000 CJM
2000 CJP
2000 CJR
2000 CJS
2000 CMP
2000 CMR
2000 CMS
2000 CPR
2000 CPS
2504 CRS
2000 JMP
2000 JMR
2000 JMS
2000 JPR
2000 JPS
2000 JRS
2000 MPR
2000 MPS
2000 MRS
2000 PRS
2000 CJMP
2000 CJMR
2000 CJMS
2000 CJPR
2000 CJPS
2000 CJRS
2000 CMPR
2000 CMPS
2000 CMRS
2000 CPRS
2000 JMPR
2000 JMPS
2000 JMRS
2000 JPRS
2000 MPRS
2000 CJMPR
2000 CJMPS
2000 CJMRS
2000 CJPRS
2000 CMPRS
2000 JMPRS
2000 CJMPRS

เราจะเห็นได้ว่าJ(แค่โจอี้) มีเวลาหน้าจอ 2200 มิลลิวินาทีเพราะเขามี 200 ตัวและ 2000 กับทุกคน

ท้าทาย

เขียนโปรแกรมที่ใช้ในสตริงหรือไฟล์ข้อความเช่น

504 CRS
200 J
345 MP
980
2000 CJMPRS

โดยที่แต่ละบรรทัดมีรูปแบบ[time in ms] [characters on screen]และส่งออกจำนวนเวลาทั้งหมดที่แต่ละชุดย่อย 64 ตัวที่ใช้ไป 6 ตัวบนหน้าจอโดยที่แต่ละบรรทัดมีรูปแบบ[total time in ms for subset] [characters in subset](เหมือนด้านบน)

อินพุตสามารถถูกใช้เป็นสตริงไปยัง stdin, บรรทัดรับคำสั่งหรือฟังก์ชันหรือสามารถเป็นชื่อของไฟล์ข้อความที่มีข้อมูล

  • จำนวนมิลลิวินาทีจะเป็นจำนวนเต็มบวกเสมอ
  • ตัวอักษรของตัวละครจะอยู่ในลำดับCJMPRS(ตัวอักษร)
  • คุณสามารถเลือกที่จะสมมติว่ามีพื้นที่ต่อท้ายเมื่อไม่มีตัวละครในฉาก (เช่น980 )
  • คุณสามารถเลือกที่จะสมมติว่ามีการขึ้นบรรทัดใหม่
  • อินพุตจะมีอย่างน้อย 1 บรรทัดและอาจมีจำนวนมากตามอำเภอใจ

เอาต์พุตควรถูกพิมพ์หรือส่งคืนหรือเขียนไปยังไฟล์ข้อความอื่นเป็นสตริงบรรทัด 64

  • เส้นอาจอยู่ในลำดับใดก็ได้
  • ตัวอักษรของตัวละครไม่จำเป็นต้องCJMPRSเรียงตามลำดับ
  • เซ็ตย่อยที่มีเวลารวม 0ms จะต้องแสดงรายการ
  • อาจมีทางเลือกเป็นช่องว่างต่อท้ายหลังจากผลรวมย่อยที่ว่างเปล่า
  • อาจมีทางเลือกขึ้นบรรทัดใหม่

(ปัญหานี้สามารถของหลักสูตรได้รับการทั่วไปกับตัวละครมากขึ้น แต่เราจะติดกับ 6 CJMPRS เพื่อนตัวละคร.)

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

โปรดทราบว่าฉันสนุกกับเพื่อนจริง ๆ และไม่คิดว่าตัวละครบางตัวมีความสำคัญมากกว่าตัวละครอื่น ๆ สถิติจะน่าสนใจแม้ว่า ;)


7
เราจะได้รับเงินรางวัลหรือเปล่าถ้าเราโพสต์บทวิเคราะห์ของซีรีย์? ;)
สลายตัวของเบต้า

5
ฉันอาจจะหรืออาจไม่เห็นทุก ๆ ครั้งหลายสิบครั้งและเป็นเจ้าของทั้ง 10 ซีซัน ...
อเล็กซ์ A.

@AlexA ฉันอาจจะหรืออาจไม่ทราบว่าคุณกำลังพูดถึง ...
bolov

ชุดที่ว่างเปล่าเป็นกรณีพิเศษ - มันไม่เชื่อฟังกฎ "แม้ว่าจะมีตัวละครมากกว่ากฎในเซตย่อย" มิฉะนั้นจะมีคะแนน 4029 ในตัวอย่าง (ระยะเวลารวมที่อย่างน้อยไม่มี หนึ่งอยู่บนหน้าจอ) และไม่ได้ 980
ฮอบส์

1
@BetaDecay ค่อนข้างเป็นไปได้จริง!
งานอดิเรกของ Calvin

คำตอบ:


10

Pyth, 37 ไบต์

Vy"CJMPRS"++smvhdf?q@eTNNN!eTcR\ .zdN

ลองใช้งานออนไลน์: การสาธิต

คำอธิบาย:

  "CJMPRS"                             string with all friends
 y                                     create all subsets
V                                      for loop, N iterates over ^:
                                 .z      all input lines
                             cR\         split each line at spaces
                 f                       filter for lines T, which satisfy:
                  ?      N                 if N != "":
                   q@eTNN                    intersection(T[1],N) == N
                                           else:
                          !eT                T[1] == ""
             m                           map each of the remaining d to:
              vhd                          eval(d[0]) (extract times)
            s                            sum
           +                       d     + " "
          +                         N    + N
                                         implicitly print

มันแทบจะไม่คุ้มค่าที่จะลองเมื่อฉันเขียนหนึ่งบรรทัดในสารละลายของฉันและมันก็นานกว่าคำตอบของ Pyth ทั้งหมด :-P
hobbs

4
@ ฮอบส์นั่นคือข้อเสียของการแข่งขันภาษาผสม แต่อย่ากลัวการแก้ปัญหาในภาษาอื่นมักจะได้รับคะแนนเสียงมากกว่า แค่มองไปที่ Haskell-Solution
Jakube

3
36% ที่สั้นลงและทำให้ฉันรู้ฉันมีข้อผิดพลาดในรหัสของฉัน ...
เดนนิส

มันค่อนข้างโชคร้ายที่cMใช้การ.*ขยายแผนที่ อาจจะมีข้อยกเว้นcเนื่องจากฉันไม่สามารถจินตนาการได้ว่ามีคนต้องการใช้มันในแผนที่
FryAmTheEggman

นี่จะให้ 0 เป็นบรรทัดบนสุดในผลลัพธ์ตัวอย่างแทน 980
งานอดิเรกของ Calvin

13

Haskell, 187 ไบต์

f=g.(>>=(q.words)).lines
g t=p"CJMPRS">>=(\k->show(sum.map snd$filter((==k).fst)t)++' ':k++"\n")
q[n]=[("",read n)]
q[n,s]=[(k,read n)|k<-tail$p s]
p s=map concat$sequence[[[],[c]]|c<-s]

fเป็นฟังก์ชั่นที่รับอินพุตเป็นสตริงแบบหลายบรรทัดเดียวและส่งคืนเอาต์พุตแบบหลายบรรทัดเป็นสตริงเดียว น่าจะมีเหลืออีกมากมายให้เล่นกอล์ฟที่นี่

λ: putStr test1
504 CRS
1 J
199 J
345 MP
980
2000 CJMPRS

λ: putStr $ f test1
980 
2504 S
2504 R
2504 RS
2345 P
2000 PS
2000 PR
2000 PRS
2345 M
2000 MS
2000 MR
2000 MRS
2345 MP
2000 MPS
2000 MPR
2000 MPRS
2200 J
2000 JS
2000 JR
2000 JRS
2000 JP
2000 JPS
2000 JPR
2000 JPRS
2000 JM
2000 JMS
2000 JMR
2000 JMRS
2000 JMP
2000 JMPS
2000 JMPR
2000 JMPRS
2504 C
2504 CS
2504 CR
2504 CRS
2000 CP
2000 CPS
2000 CPR
2000 CPRS
2000 CM
2000 CMS
2000 CMR
2000 CMRS
2000 CMP
2000 CMPS
2000 CMPR
2000 CMPRS
2000 CJ
2000 CJS
2000 CJR
2000 CJRS
2000 CJP
2000 CJPS
2000 CJPR
2000 CJPRS
2000 CJM
2000 CJMS
2000 CJMR
2000 CJMRS
2000 CJMP
2000 CJMPS
2000 CJMPR
2000 CJMPRS

7

SWI-Prolog ขนาด 381 ไบต์

s([E|T],[F|N]):-E=F,(N=[];s(T,N));s(T,[F|N]).
a(A):-split_string(A," \n","",B),w(B,[],C),setof(L,s(`CJMPRS`,L),M),x(C,[` `|M]).
w([A,B|T],R,Z):-number_string(N,A),(B="",C=` `;string_codes(B,C)),X=[[N,C]|R],(T=[],Z=X;w(T,X,Z)).
x(A,[M|T]):-y(M,A,0,R),atom_codes(S,M),writef("%t %w\n",[R,S]),(T=[];x(A,T)).
y(_,[],R,R).
y(M,[[A,B]|T],R,Z):-subset(M,B),S is R+A,y(M,T,S,Z);y(M,T,R,Z).

สิ่งนี้คาดว่าจะทำงานเป็น:

a("504 CRS
200 J
345 MP
980 
2000 CJMPRS").

โปรดทราบว่าคุณอาจจำเป็นต้องเปลี่ยนทุก`การ"และทุกคน"ไป'ถ้าคุณมีรุ่นเก่า SWI-เปิดฉาก

ฉันสามารถโกน 100+ ไบต์ถ้าฉันไม่ต้องใช้ String เป็นอินพุต


7

Haskell, 150 136 ไบต์

import Data.List
f=(subsequences"CJMPRS">>=).g
g l c=show(sum[read x|(x,y)<-map(span(/=' '))$lines l,c\\y==[],c/=[]||c==y])++' ':c++"\n"

ตัวอย่างการใช้งาน:

*Main> putStr $ f "504 CRS\n1 J\n199 J\n345 MP\n980\n2000 CJMPRS"
980 
2504 C
2200 J
2000 CJ
2345 M
2000 CM
2000 JM
2000 CJM
2345 P
2000 CP
2000 JP
2000 CJP
2345 MP
2000 CMP
2000 JMP
2000 CJMP
2504 R
2504 CR
2000 JR
2000 CJR
2000 MR
2000 CMR
2000 JMR
2000 CJMR
2000 PR
2000 CPR
2000 JPR
2000 CJPR
2000 MPR
2000 CMPR
2000 JMPR
2000 CJMPR
2504 S
2504 CS
2000 JS
2000 CJS
2000 MS
2000 CMS
2000 JMS
2000 CJMS
2000 PS
2000 CPS
2000 JPS
2000 CJPS
2000 MPS
2000 CMPS
2000 JMPS
2000 CJMPS
2504 RS
2504 CRS
2000 JRS
2000 CJRS
2000 MRS
2000 CMRS
2000 JMRS
2000 CJMRS
2000 PRS
2000 CPRS
2000 JPRS
2000 CJPRS
2000 MPRS
2000 CMPRS
2000 JMPRS
2000 CJMPRS

วิธีการที่แตกต่างจากคำตอบของ @ MtnViewMark : สำหรับการรวมกันcของตัวละครทั้งหมดจะค้นหาบรรทัดของสตริงอินพุตที่ความแตกต่างของcและรายการจากบรรทัดyว่างเปล่า (ดูแลกรณีพิเศษที่ไม่มีอักขระอยู่บนหน้าจอ (เช่น980) -> cต้องไม่ว่างเปล่าหรือc == y) แยกจำนวนและผลรวม



2

Perl 5 (5.10+), 128 ไบต์

2 ไบต์ต่อบรรทัดของเอาต์พุต use feature "say"ไม่รวมอยู่ในจำนวนไบต์

@_=<>;for$i(0..63){@c=qw(C J M P R S)[grep$i&(1<<$_),0..5];
$r=@c?join".*","",@c:'$';$t=0;for(@_){$t+=$1 if/(.*) $r/}say"$t ",@c}

ยกเลิกแข็งแรงเล่นกอล์ฟ:

# Read the input into an array of lines.
my @lines = <>;
# For every 6-bit number:
for my $i (0 .. 63) {
    # Select the elements of the list that correspond to 1-bits in $i
    my @indices = grep { $i & (1 << $_) } 0 .. 5;
    my @characters = ('C', 'J', 'M', 'P', 'R', 'S')[@indices];

    # Build a regex that matches a string that contains all of @characters
    # in order... unless @characters is empty, then build a regex that matches
    # end-of-line.
    my $regex = @characters
      ? join ".*", ("", @c)
      : '$';

    my $time = 0;
    # For each line in the input...
    for my $line (@lines) {
        # If it contains the requisite characters...
        if ($line =~ /(.*) $regex/) {
            # Add to the time total
            $time += $1;
        }
    }

    # And print the subset and the total time.
    say "$time ", @characters;
}

2

K, 95

{(+/'{x[1]@&min'y in/:*x}[|"I \n"0:x]'b)!b:" ",?,/{x{,/y{x,/:y@&y>max x}\:x}[d]/d:"CJMPRS"}

ใช้สตริงเหมือนกัน "504 CRS\n200 J\n345 MP\n980 \n2000 CJMPRS"

k){(+/'{x[1]@&min'y in/:*x}[|"I \n"0:x]'b)!b:" ",?,/{x{,/y{x,/:y@&y>max x}\:x}[d]/d:"CJMPRS"}["504 CRS\n200 J\n345 MP\n980  \n2000 CJMPRS"]
980 | " "
2504| "C"
2200| "J"
2345| "M"
2345| "P"
2504| "R"
2504| "S"
2000| "CJ"
2000| "CM"
2000| "CP"
2504| "CR"
2504| "CS"
2000| "JM"
2000| "JP"
2000| "JR"
2000| "JS"
2345| "MP"
2000| "MR"
2000| "MS"
2000| "PR"
2000| "PS"
2504| "RS"
2000| "CJM"
2000| "CJP"
2000| "CJR"
2000| "CJS"
2000| "CMP"
2000| "CMR"
2000| "CMS"
2000| "CPR"
2000| "CPS"
2504| "CRS"
2000| "JMP"
2000| "JMR"
2000| "JMS"
2000| "JPR"
2000| "JPS"
2000| "JRS"
2000| "MPR"
2000| "MPS"
2000| "MRS"
2000| "PRS"
2000| "CJMP"
2000| "CJMR"
2000| "CJMS"
2000| "CJPR"
2000| "CJPS"
2000| "CJRS"
2000| "CMPR"
2000| "CMPS"
2000| "CMRS"
2000| "CPRS"
2000| "JMPR"
2000| "JMPS"
2000| "JMRS"
2000| "JPRS"
2000| "MPRS"
2000| "CJMPR"
2000| "CJMPS"
2000| "CJMRS"
2000| "CJPRS"
2000| "CMPRS"
2000| "JMPRS"
2000| "CJMPRS"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.