Những nhân vật Friends nào thực sự là những người bạn tốt nhất?


30

Sáu diễn viên chính của bộ phim sitcom Mỹ Những người bạn đều đồng ý rằng họ sẽ được trả cùng mức lương trong suốt quá trình thực hiện bộ phim (ít nhất là sau phần 2, ít nhất). Nhưng điều đó không có nghĩa là tất cả họ đều có cùng thời lượng không khí hoặc tất cả họ đều tương tác trên màn hình với nhau cùng một lượng.

Trong thử thách này, bạn sẽ viết một chương trình có thể giúp xác định bạn bè nào là bạn bè thực sự tốt nhất.

Thiết lập

Cân nhắc xem một tập phim hoặc cảnh Bạn bè và ghi chú chính xác người đang ở trên màn hình trong mỗi lần quay camera và trong bao lâu.

Chúng tôi sẽ viết tắt tên của mỗi nhân vật:

Sau đó, với mỗi lần quay camera (hoặc mỗi khi nhân vật vào / thoát cảnh quay), chúng tôi sẽ liệt kê những người đang ở trên màn hình. Ví dụ:

504 CRS
200 J
345 MP
980
2000 CJMPRS

Điều này nói rằng:

  • Trong 504ms, Chandler, Rachel và Ross đã xuất hiện trên màn hình.
  • Sau đó trong 200ms, Joey đã.
  • Sau đó trong 345ms, Monica và Phoebe được.
  • Sau đó, trong 980ms, không ai trong số 6 nhân vật chính xuất hiện trên màn hình.
  • Sau đó trong 2 giây, tất cả đều như vậy.

(Đây không phải là từ một clip thực tế, tôi đã tạo ra nó.)

Lưu ý rằng những điều sau đây sẽ tương đương:

504 CRS
1 J
199 J
345 MP
980
2000 CJMPRS

Để phân tích sự kết hợp của các nhân vật có thời gian trên màn hình nhiều nhất, chúng tôi xem xét tất cả 64 tập hợp con có thể có của 6 ký tự và tổng cộng thời gian màn hình họ có. Nếu tất cả mọi người trong tập hợp con xuất hiện trên màn hình trong khi quay camera, ngay cả khi có nhiều ký tự hơn chỉ các nhân trong tập hợp con , thời gian cho lần quay camera đó được thêm vào tổng thời gian màn hình của tập hợp con đó.

Có một ngoại lệ cho tập hợp con trống - chỉ có các cảnh không có 6 nhân vật chính được tính.

Vì vậy, phân tích của ví dụ trên sẽ là:

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

Chúng ta có thể thấy rằng J(chỉ Joey) có 2200ms thời gian trên màn hình vì anh ấy có 200 một mình và 2000 với mọi người.

Thử thách

Viết chương trình lấy trong một chuỗi hoặc tệp văn bản, chẳng hạn như

504 CRS
200 J
345 MP
980
2000 CJMPRS

trong đó mỗi dòng có biểu mẫu [time in ms] [characters on screen]và xuất ra tổng thời gian mà mỗi trong số 64 tập con của 6 ký tự được sử dụng trên màn hình, trong đó mỗi dòng có biểu mẫu [total time in ms for subset] [characters in subset](giống như trên).

Đầu vào có thể được lấy dưới dạng chuỗi thành stdin, dòng lệnh hoặc hàm hoặc nó có thể là tên của tệp văn bản chứa dữ liệu.

  • Các số mili giây sẽ luôn là số nguyên dương.
  • Các chữ cái ký tự sẽ luôn theo thứ tự CJMPRS(theo bảng chữ cái).
  • Bạn có thể tùy ý giả sử có một khoảng trắng ở cuối khi không có ký tự nào trong cảnh (ví dụ 980 ).
  • Bạn có thể tùy ý giả sử có một dòng mới.
  • Đầu vào sẽ có ít nhất 1 dòng và có thể có nhiều dòng tùy ý.

Đầu ra phải được in hoặc trả lại hoặc ghi vào tệp văn bản khác dưới dạng chuỗi 64 dòng.

  • Các dòng có thể theo thứ tự bất kỳ.
  • Các ký tự không cần phải CJMPRStheo thứ tự.
  • Tập con với 0ms tổng thời gian làm cần phải được liệt kê.
  • Có thể tùy chọn có một khoảng trắng sau tổng số tập hợp con trống.
  • Có thể tùy chọn có một dòng mới.

(Tất nhiên vấn đề này có thể được khái quát thành nhiều nhân vật hơn, nhưng chúng tôi sẽ gắn bó với 6 nhân vật CJMPRS Bạn bè .)

Mã ngắn nhất tính bằng byte thắng.

Lưu ý rằng tôi thực sự thích Bạn bè và đừng nghĩ rằng một số nhân vật quan trọng hơn những nhân vật khác. Các số liệu thống kê sẽ thú vị mặc dù. ;)


7
Chúng tôi có nhận được tiền thưởng nếu chúng tôi đăng một phân tích của bộ truyện không? ;)
Beta Decay

5
Tôi có thể hoặc không thể xem mọi tập phim hàng chục lần và sở hữu cả 10 mùa ...
Alex A.

@AlexA. Tôi có thể hoặc không thể biết bạn đang nói về điều gì ...
bolov 7/07/2015

Tập hợp trống là trường hợp đặc biệt - nó không tuân theo quy tắc "ngay cả khi có nhiều ký tự hơn chỉ có các ký tự trong tập hợp con", nếu không, nó sẽ ghi được 4029 trong ví dụ (tổng thời gian ít nhất là không có một là trên màn hình), và không phải 980.
hobbs 7/07/2015

1
@BetaDecay Khá có thể, thực sự!
Sở thích của Calvin

Câu trả lời:


10

Bình thường, 37 byte

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

Dùng thử trực tuyến: Trình diễn

Giải trình:

  "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

Thậm chí không đáng để thử khi tôi viết một dòng giải pháp của mình và nó đã dài hơn toàn bộ câu trả lời của Pyth :-P
hobbs 7/07/2015

4
@hobbs Đó là nhược điểm của các cuộc thi ngôn ngữ hỗn hợp. Nhưng đừng sợ hãi, các giải pháp trong các ngôn ngữ khác thường nhận được nhiều phiếu bầu hơn. Chỉ cần nhìn vào Haskell-Solution.
Jakube

3
Ngắn hơn 36% khiến tôi nhận ra mình có một lỗi trong mã của mình ...
Dennis

Thật đáng tiếc khi cMsử dụng .*mở rộng bản đồ. Có lẽ nên tạo một ngoại lệ cvì tôi không thể tưởng tượng ai đó muốn sử dụng nó như thế trong bản đồ
FryAmTheEggman

Điều này cho 0 trên dòng trên cùng trong đầu ra ví dụ thay vì 980.
Sở thích của Calvin

13

Haskell, 187 byte

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]

flà một hàm lấy đầu vào, dưới dạng một chuỗi nhiều dòng và trả về đầu ra đa dòng dưới dạng một chuỗi. Có lẽ còn nhiều để chơi golf ở đây.

λ: 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 byte

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

Điều này dự kiến ​​sẽ được chạy như:

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

Lưu ý rằng bạn có thể cần phải thay thế mỗi `đến "và mỗi "để 'nếu bạn có một phiên bản cũ của SWI-Prolog.

Tôi có thể tắt hơn 100 byte nếu tôi không phải sử dụng Chuỗi làm đầu vào.


7

Haskell, 150 136 byte

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"

Ví dụ sử dụng:

*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

Cách tiếp cận khác với câu trả lời của @ MtnViewMark : Đối với tất cả các kết hợp ccác ký tự, hãy tìm các dòng của chuỗi đầu vào trong đó sự khác biệt cvà danh sách từ các dòng ytrống (hãy quan tâm đến trường hợp đặc biệt không có ký tự nào trên màn hình (ví dụ 980) -> ckhông được để trống hoặc c == y). Trích xuất số và tổng.



2

Perl 5 (5.10+), 128 byte

2 byte cho mỗi dòng đầu ra. use feature "say"không bao gồm trong số byte.

@_=<>;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}

Chưa chơi gôn:

# 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"}

Có một chuỗi như "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"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.