Quali personaggi di Friends erano davvero i migliori amici?


30

I sei membri principali del cast della sitcom americana Friends concordarono tutti sul fatto che sarebbero stati pagati lo stesso stipendio per tutta la durata della serie (almeno dopo la seconda stagione). Ciò non significa che tutti abbiano avuto la stessa quantità di tempo di trasmissione o che tutti abbiano interagito sullo schermo tra loro la stessa quantità.

In questa sfida, scriverai un programma che potrebbe aiutare a determinare quali amici di Friends erano davvero i migliori.

Impostare

Prendi in considerazione la possibilità di guardare un episodio o una scena di Amici e di annotare esattamente chi è sullo schermo durante ogni ripresa della telecamera e per quanto tempo.

Abbreviamo il nome di ogni personaggio:

Quindi per ogni ripresa della telecamera (o ogni volta che un personaggio entra / esce dallo scatto), elencheremo chi era sullo schermo. Per esempio:

504 CRS
200 J
345 MP
980
2000 CJMPRS

Questo sta dicendo che:

  • Per 504ms, Chandler, Rachel e Ross erano sullo schermo.
  • Quindi per 200ms, Joey è stato.
  • Quindi per 345ms, Monica e Phoebe erano.
  • Quindi per 980 ms, nessuno dei 6 personaggi principali erano sullo schermo.
  • Quindi, per 2 secondi, lo erano tutti.

(Questo non proviene da una clip reale, l'ho inventato.)

Si noti che quanto segue sarebbe equivalente:

504 CRS
1 J
199 J
345 MP
980
2000 CJMPRS

Per analizzare quali combinazioni di personaggi hanno avuto più tempo sullo schermo, esaminiamo tutti i 64 possibili sottoinsiemi dei 6 caratteri e sommiamo il tempo dello schermo che avevano. Se tutti gli utenti di un sottoinsieme appaiono sullo schermo durante uno scatto della telecamera, anche se ci sono più personaggi di quelli del sottoinsieme , il tempo per lo scatto della telecamera viene aggiunto al tempo totale dello schermo di quel sottoinsieme.

C'è un'eccezione per il sottoinsieme vuoto: vengono contate solo le scene senza nessuno dei 6 personaggi principali.

Quindi l'analisi dell'esempio sopra sarebbe:

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

Possiamo vedere che J(solo Joey) aveva 2200 ms di tempo sullo schermo perché ne aveva 200 da solo e 2000 con tutti.

Sfida

Scrivi un programma che contiene una stringa o un file di testo come

504 CRS
200 J
345 MP
980
2000 CJMPRS

dove ogni riga ha il modulo [time in ms] [characters on screen]e genera la quantità totale di tempo che ciascuno dei 64 sottoinsiemi dei 6 caratteri ha trascorso sullo schermo, dove ogni riga ha il modulo [total time in ms for subset] [characters in subset](proprio come sopra).

L'input può essere preso come una stringa per stdin, la riga di comando o una funzione, oppure può essere il nome di un file di testo che contiene i dati.

  • I numeri in millisecondi saranno sempre numeri interi positivi.
  • Le lettere dei caratteri saranno sempre nell'ordine CJMPRS(alfabetico).
  • Puoi facoltativamente supporre che ci sia uno spazio finale quando non ci sono personaggi nella scena (ad es 980 .).
  • Puoi facoltativamente supporre che ci sia una nuova riga finale.
  • L'ingresso avrà almeno 1 riga e potrebbe averne arbitrariamente molte.

L'output deve essere stampato o restituito o scritto in un altro file di testo come una stringa di 64 righe.

  • Le linee possono essere in qualsiasi ordine.
  • Non è necessario che le lettere dei caratteri siano CJMPRSnell'ordine.
  • Sottoinsiemi con 0ms tempo totale non devono essere elencati.
  • Opzionalmente può esserci uno spazio finale dopo il totale del sottoinsieme vuoto.
  • Opzionalmente potrebbe esserci una nuova riga finale.

(Questo problema può ovviamente essere generalizzato a più personaggi, ma rimarremo con i personaggi di 6 CJMPRS amici .)

Vince il codice più breve in byte.

Nota che in realtà mi piacciono gli amici e non penso che alcuni personaggi siano più importanti degli altri. Le statistiche sarebbero comunque interessanti. ;)


7
Riceviamo una taglia se pubblichiamo un'analisi della serie? ;)
Beta Decay

5
Potrei aver visto o meno ogni episodio dozzine di volte e possedere tutte e 10 le stagioni ...
Alex A.

@AlexA. Potrei o meno sapere di cosa stai parlando ...
Bolov,

Il set vuoto è un caso speciale: non obbedisce alla regola "anche se ci sono più personaggi di quelli nel sottoinsieme", altrimenti otterrebbe 4029 nell'esempio (la quantità totale di tempo che almeno no uno è sullo schermo), e non 980.
Hobbs

1
@BetaDecay Molto probabilmente, in realtà!
Calvin's Hobbies,

Risposte:


10

Pyth, 37 byte

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

Provalo online: dimostrazione

Spiegazione:

  "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

Non vale nemmeno la pena provare quando scrivo una riga della mia soluzione ed è già più lunga dell'intera risposta di
Pyth

4
@hobbs Questo è il rovescio della medaglia delle competizioni di lingua mista. Ma non lasciarti intimidire, le soluzioni in altre lingue di solito ricevono più voti. Guarda la soluzione Haskell.
Jakube

3
Il 36% in meno e mi ha fatto capire che avevo un bug nel mio codice ...
Dennis

È piuttosto sfortunato che cMutilizza l' .*espansione della mappa. Forse dovrebbe essere fatta un'eccezione cperché non riesco a immaginare qualcuno che voglia usarlo così in una mappa
FryAmTheEggman

Questo dà 0 nella riga superiore nell'output di esempio anziché 980.
Calvin's Hobbies

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]

fè una funzione che accetta l'input, come singola stringa multilinea, e restituisce l'output multilinea come singola stringa. Probabilmente molto lasciato al golf qui.

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

Questo si aspetta che venga eseguito come:

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

Si noti che potrebbe essere necessario sostituire ogni `a "ed ogni "a 'se si dispone di una vecchia versione di SWI-Prolog.

Potrei radere oltre 100 byte se non dovessi usare una stringa come input.


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"

Esempio di utilizzo:

*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

Approccio diverso rispetto alla risposta di @ MtnViewMark : per tutte le combinazioni cdi caratteri, trovare le righe della stringa di input in cui la differenza di ce l'elenco dalle righe ysono vuoti (occuparsi del caso speciale in cui non è presente alcun carattere sullo schermo (ad es. 980) -> cnon deve essere vuoto o c == y). Estrai il numero e la somma.


6

CJam, 67 58 byte

"CJMPRS"6m*_.&:$_&qN/_{_el=},:~1bpf{{1$\-!},Sf/0f=:i1bS\N}

Provalo online nell'interprete CJam .


2

Perl 5 (5.10+), 128 byte

2 byte per linea di output. use feature "say"non incluso nel conteggio dei 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}

Un-giocato a golf:

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

Prende una stringa come "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"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.