Hangi Arkadaş karakterleri gerçekten en iyi arkadaşlardı?


30

Altı ana kadrosundan Amerikan sitcom ait Arkadaşlar hepsi aynı maaş ödenecek konusunda anlaştılar (en azından, sezon 2 sonra) serisinin çalıştırmak boyunca. Ancak bu, hepsinin aynı miktarda hava süresine sahip olduğu veya hepsinin ekranda aynı miktarda etkileşime girdiği anlamına gelmez.

Bu mücadelede, hangi Arkadaş arkadaşlarının gerçekten en iyi olduğunu belirlemeye yardımcı olacak bir program yazacaksın .

Kurmak

Arkadaşların bir bölümünü veya sahnesini izlemeyi ve her kamera çekimi sırasında ekranda kimlerin olduğunu ve ne kadar süre boyunca tam olarak kim olduklarını not almayı düşünün .

Her karakterin adını kısaltacağız:

Sonra her kamera çekimi için (veya bir karakter çekime her girdiğinde / çıktığında), ekranda kimin olduğunu listeleyeceğiz. Örneğin:

504 CRS
200 J
345 MP
980
2000 CJMPRS

Bu diyor ki:

  • 504ms boyunca Chandler, Rachel ve Ross ekrandaydı.
  • Sonra 200ms için Joey öyleydi.
  • Sonra 345ms için Monica ve Phoebe vardı.
  • Sonra 980ms için, 6 ana karakterden hiçbiri ekranda değildi.
  • Sonra 2 saniye boyunca hepsi vardı.

(Bu gerçek bir klipten değil, uydurdum.)

Aşağıdakilerin eşdeğer olacağını unutmayın:

504 CRS
1 J
199 J
345 MP
980
2000 CJMPRS

Hangi karakter kombinasyonlarının en fazla ekran süresine sahip olduğunu analiz etmek için 6 karakterin 64 olası altkümesine bakarız ve ekran sürelerini toplar. Bir kamera çekimi sırasında alt gruptaki herkes ekranda görünürse, alt gruptaki karakterlerden daha fazla karakter olsa bile , o kamera çekiminin süresi o altkümenin toplam ekran saatine eklenir.

Boş alt küme için bir istisna var - yalnızca 6 ana karakterden hiçbiri olmayan sahneler sayılır.

Yani yukarıdaki örneğin analizi şöyle olacaktır:

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

Görebiliyoruz ki J(sadece Joey) 2200ms ekran zamanı vardı çünkü 200'ü tek başına ve 2000 kişiyle birlikte.

Meydan okuma

Bir dize veya metin dosyası gibi bir program yazın

504 CRS
200 J
345 MP
980
2000 CJMPRS

her satırın forma sahip olduğu [time in ms] [characters on screen]ve ekranda harcanan 6 karakterin 64 altkümesinin her birinin, her satırın forma sahip olduğu toplam süreyi ( [total time in ms for subset] [characters in subset]yukarıdaki gibi) gösterir.

Giriş, stdin, komut satırı veya işlev için bir dize olarak alınabilir veya verileri içeren bir metin dosyasının adı olabilir.

  • Milisaniye sayılar her zaman pozitif tam sayılar olur.
  • Karakter harfleri her zaman sırayla CJMPRS(alfabetik) olacaktır.
  • İsteğe bağlı olarak, sahnede hiçbir karakter olmadığında (örneğin 980 ) izli bir boşluk olduğunu varsayabilirsiniz .
  • İsteğe bağlı olarak takip eden bir yeni satır olduğunu varsayabilirsiniz.
  • Giriş en az 1 satıra sahip olacak ve keyfi olarak birçok olabilir.

Çıktı, 64 satırlık bir dize olarak basılmalı veya iade edilmeli veya başka bir metin dosyasına yazılmalıdır.

  • Çizgiler herhangi bir sırada olabilir.
  • Karakter harflerinin CJMPRSsıralı olması gerekmez .
  • 0ms toplam süre ile alt kümeleri do listelenmiş gerekmektedir.
  • İsteğe bağlı olarak, boş alt kümenin toplamından sonra bir boşluk olabilir.
  • İsteğe bağlı olarak takip eden bir yeni satır olabilir.

(Bu sorun elbette daha fazla karaktere genelleştirilebilir, ancak 6 CJMPRS Arkadaş karakterine bağlı kalacağız .)

Bayt cinsinden en kısa kod kazanır.

Aslında Arkadaşlardan zevk aldığımı ve bazı karakterlerin diğerlerinden daha önemli olduğunu düşünmediğimi unutmayın. İstatistikler olsa ilginç olurdu. ;)


7
Serinin bir analizini yayınlarsak ödül alır mıyız? ;)
Beta Decay

5
Her bölümü onlarca kez görmüş veya görmemiş olabilirim ve 10 mevsimin hepsine sahibim ...
Alex A.

@AlexA. Ne hakkında konuştuğunuzu bilmiyorum veya bilmiyorum ...
bolov

Boş küme özel bir durumdur - "alt kümedeki karakterlerden daha fazla karakter olsa bile" kuralına uymaz veya başka bir örnekte 4029 puan alır ( en azından hiçbir zamanın toplamı biri ekranda), 980 değil.
Ocaklar

1
@ BetaDecay Oldukça büyük olasılıkla, aslında!
Calvin'in Hobileri

Yanıtlar:


10

Pyth, 37 bayt

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

Çevrimiçi deneyin: Gösteri

Açıklama:

  "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

Çözümümün bir satırını yazarken denemeye bile değmez ve zaten tüm Pyth cevabından daha uzundur :-P
hobbs

4
@hobbs Karışık dil yarışmalarının dezavantajı budur. Ancak korkutmayın, diğer dillerdeki çözümler genellikle daha fazla oy alır. Sadece Haskell Çözümü'ne bakın.
Jakube

3
% 36 daha kısa ve
Dennis

Harita genişletmesini cMkullanan talihsiz bir durum .*. Belki de bir charitada onu kullanmak isteyen birini hayal bile edemediğim için bir istisna yapılmalı
FryAmTheEggman

Bu, 980 yerine örnek çıktının en üstünde 0 verir.
Calvin'in Hobileri

13

Haskell, 187 bayt

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]

fgirdiyi tek bir çok satırlı dize olarak alan ve çok satırlı çıktısını tek bir dize olarak döndüren bir işlevdir. Muhtemelen bol miktarda golf oynamak burada kaldı.

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

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

Bunun çalıştırılmasını bekliyor:

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

Her değiştirmek gerekebilir o Not `için "ve her "için 'size SWI-Prolog eski bir sürümünü varsa.

Bir String'i girdi olarak kullanmak zorunda kalmazsam, 100'den fazla baytı tıraş edebilirim.


7

Haskell, 150 136 bayt

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"

Kullanım örneği:

*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

Daha farklı bir yaklaşım MtnViewMark cevabı @ : Tüm kombinasyonlar için cfarkı nerede karakter giriş dizesi satırları bulmak chatlarından ve liste yhiçbir karakter ekranda olduğu özel durumda (örn ait (take bakımı boş 980) -> cboş olmamalı veya c == y). Sayıyı ve toplamı çıkarın.



2

Perl 5 (5.10+), 128 bayt

Her çıktı satırı için 2 bayt. use feature "say"bayt sayısına dahil edilmez.

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

Un-golfed:

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

Gibi bir dize alır "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"
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.