Które postacie znajomych były naprawdę najlepszymi przyjaciółmi?

30

Sześciu głównych obsad amerykańskiego serialu Friends wszyscy zgodzili się, że otrzymają taką samą pensję przez cały czas trwania serii (przynajmniej po sezonie 2). Ale to nie znaczy, że wszyscy mieli taką samą ilość czasu antenowego lub że wszyscy współdziałali na ekranie w tej samej ilości.

W tym wyzwaniu napiszesz program, który pomoże ustalić, którzy znajomi byli naprawdę najlepsi.

Ustawiać

Rozważ obejrzenie odcinka lub sceny Znajomych i zanotowanie, kto dokładnie jest na ekranie podczas każdego ujęcia z kamery i na jak długo.

Skrócimy imię każdej postaci:

Następnie dla każdego ujęcia z kamery (lub za każdym razem, gdy postać wchodzi / wychodzi z ujęcia), wymienimy, kto był na ekranie. Na przykład:

504 CRS
200 J
345 MP
980
2000 CJMPRS

To znaczy, że:

  • Przez 504 ms Chandler, Rachel i Ross byli na ekranie.
  • Potem przez 200 ms był Joey.
  • Potem przez 345ms Monica i Phoebe były.
  • Następnie przez 980 ms żaden z 6 głównych bohaterów nie był na ekranie.
  • Potem przez 2 sekundy wszyscy byli.

(To nie jest z prawdziwego klipu, wymyśliłem.)

Pamiętaj, że następujące będą równoważne:

504 CRS
1 J
199 J
345 MP
980
2000 CJMPRS

Aby przeanalizować, które kombinacje znaków miały najwięcej czasu na ekranie, sprawdzamy wszystkie 64 możliwe podzbiory 6 znaków i łączny czas ekranu, jaki mieli. Jeśli wszyscy w podzbiorze pojawiają się na ekranie podczas ujęcia z kamery, nawet jeśli jest więcej znaków niż tylko te w tym podzbiorze , czas dla tego ujęcia z kamery jest dodawany do całkowitego czasu ekranu tego podzestawu.

Istnieje wyjątek dla pustego podzbioru - liczone są tylko sceny bez żadnej z 6 głównych postaci.

Zatem analiza powyższego przykładu byłaby następująca:

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

Widzimy, że J(tylko Joey) miał 2200 ms czasu na ekranie, ponieważ miał 200 dla siebie i 2000 dla wszystkich.

Wyzwanie

Napisz program, który pobiera ciąg lub plik tekstowy, taki jak

504 CRS
200 J
345 MP
980
2000 CJMPRS

gdzie każda linia ma formę [time in ms] [characters on screen]i wyświetla całkowity czas, który każdy z 64 podzbiorów 6 znaków spędził na ekranie, gdzie każda linia ma formę [total time in ms for subset] [characters in subset](tak jak powyżej).

Dane wejściowe można traktować jako ciąg do standardowego wejścia, wiersza poleceń lub funkcji, albo może to być nazwa pliku tekstowego zawierającego dane.

  • Liczby w milisekundach zawsze będą dodatnimi liczbami całkowitymi.
  • Litery znaków będą zawsze w kolejności CJMPRS(alfabetycznie).
  • Możesz opcjonalnie założyć, że istnieje spacja końcowa, gdy w scenie nie ma żadnych znaków (np 980 .).
  • Możesz opcjonalnie założyć, że istnieje nowa linia końcowa.
  • Dane wejściowe będą miały co najmniej 1 linię i mogą mieć dowolnie wiele.

Dane wyjściowe powinny zostać wydrukowane, zwrócone lub zapisane w innym pliku tekstowym jako ciąg 64 wierszy.

  • Linie mogą być w dowolnej kolejności.
  • Litery znaków nie muszą być w CJMPRSkolejności.
  • Podzbiory z 0ms łącznym czasie nie muszą być wymienione.
  • Opcjonalnie może występować spacja po pustej sumie podzbioru.
  • Opcjonalnie może występować końcowy znak nowej linii.

(Ten problem można oczywiście uogólnić na więcej postaci, ale pozostaniemy przy 6 postaciach CJMPRS Przyjaciół ).

Najkrótszy kod w bajtach wygrywa.

Zauważ, że tak naprawdę lubię Przyjaciół i nie sądzę, że niektóre postacie są ważniejsze od innych. Statystyki byłyby jednak interesujące. ;)

Hobby Calvina
źródło
7
Czy dostaniemy nagrodę, jeśli opublikujemy analizę serii? ;)
Beta Decay
5
Być może widziałem każdy odcinek kilkadziesiąt razy i posiadam wszystkie 10 sezonów ...
Alex A.,
@AlexA. Mogę, ale nie wiem, o czym mówisz ...
bolov
Pusty zestaw jest szczególnym przypadkiem - nie przestrzega zasady „nawet jeśli jest więcej znaków niż tylko te z podzestawu”, w przeciwnym razie uzyskałby 4029 w przykładzie (łączny czas, który przynajmniej nie ma jeden jest na ekranie), a nie 980.
hobbs
1
@BetaDecay Całkiem możliwe, właściwie!
Calvin's Hobbies,

Odpowiedzi:

10

Pyth, 37 bajtów

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

Wypróbuj online: demonstracja

Wyjaśnienie:

  "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
Jakube
źródło
Nie warto nawet próbować, gdy piszę jedną linijkę mojego rozwiązania i jest już dłuższa niż cała odpowiedź Pyth :-P
hobbs
4
@hobbs To wada konkursów mieszanych języków. Ale nie zastraszaj się, rozwiązania w innych językach zwykle otrzymują więcej głosów. Wystarczy spojrzeć na rozwiązanie Haskell.
Jakube,
3
36% krótszy i uświadomiłem sobie, że mam błąd w kodzie ...
Dennis
To raczej niefortunne, że cMkorzysta z .*rozszerzenia mapy. Być może należy zrobić wyjątek, cponieważ nie wyobrażam sobie, żeby ktoś chciał użyć go w ten sposób na mapie
FryAmTheEggman
Daje to 0 w górnym wierszu przykładowego wyniku zamiast 980.
Hobby Calvina
13

Haskell, 187 bajtów

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]

fto funkcja, która pobiera dane wejściowe jako pojedynczy ciąg wielu linii i zwraca dane wyjściowe wielu linii jako pojedynczy ciąg znaków. Prawdopodobnie zostało tu wiele do gry w golfa.

λ: 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
MtnViewMark
źródło
7

SWI-Prolog, 381 bajtów

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

Oczekuje się, że zostanie uruchomiony jako:

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

Należy pamiętać, że może trzeba zastąpić każdy `się "i każdy "się 'jeśli masz starą wersję SWI-Prologu.

Mógłbym ogolić ponad 100 bajtów, gdybym nie musiał używać ciągu jako danych wejściowych.

Fatalizować
źródło
7

Haskell, 150 136 bajtów

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"

Przykład użycia:

*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

Inne podejście niż odpowiedź @ MtnViewMark : Dla wszystkich kombinacji cznaków znajdź wiersze ciągu wejściowego, w których różnica ci lista z wierszy yjest pusta (zwróć uwagę na szczególny przypadek, w którym na ekranie nie ma żadnego znaku (np. 980) -> cnie może być pusty lub c == y). Wyodrębnij liczbę i sumę.

nimi
źródło
2

Perl 5 (5.10+), 128 bajtów

2 bajty na linię wyjściową. use feature "say"nie uwzględnione w liczbie bajtów.

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

Bez golfa:

# 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;
}
Hobbs
źródło
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"}

Ma ciąg jak "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"
tartin
źródło