Які герої Друзів були справді найкращими друзями?


30

Шість головних учасників американського ситкому Друзі всі погодились, що їм буде виплачено однакову зарплату протягом усього циклу (принаймні після 2 сезону). Але це не означає, що всі вони мали однакову кількість ефірного часу або що всі вони взаємоділи на екрані між собою однаковою кількістю.

У цьому виклику ви напишете програму, яка допоможе визначити, хто з друзів- друзів справді найкращий.

Налаштування

Подумайте про перегляд епізоду чи сцени Друзів та зауважте, хто саме є на екрані під час кожного зйомки камери та протягом якого часу.

Ми скоротимо ім’я кожного персонажа:

Потім для кожного зніманого камери (або кожного разу, коли персонаж входить / виходить з фотографії), ми перерахуємо, хто був на екрані. Наприклад:

504 CRS
200 J
345 MP
980
2000 CJMPRS

Це говорить про те, що:

  • Протягом 504 мс на екрані були Чандлер, Рейчел та Росс.
  • Тоді за 200 мс Джої був.
  • Тоді за 345 мс були Моніка і Фібі.
  • Тоді протягом 980 мс на екрані не було жодного з 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 сезонами ...
Алекс А.

@AlexA. Я можу або не знаю, про що ви говорите ...
bolov

Порожній набір - це особливий випадок - він не підкоряється правилу "навіть якщо в підмножині" є більше символів, ніж лише ті, або в цьому прикладі він набрав би 4029 (загальна кількість часу, що принаймні немає один - на екрані), а не 980.
hobbs

1
@BetaDecay Цілком можливо, насправді!
Захоплення Кальвіна

Відповіді:


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
@hobbs Це мінус змагань із змішаних мов. Але не лякайтеся, рішення іншими мовами зазвичай отримують більше голосів. Подивіться лише на Haskell-Solution.
Jakube

3
На 36% коротше і змусило мене зрозуміти, що в моєму коді помилка ...
Денніс

Досить прикро, що cMвикористовує .*розширення карти. Можливо, слід зробити виняток, cоскільки я не можу уявити, що хтось хоче його використовувати на карті
FryAmTheEggman

Це дає 0 у верхньому рядку у прикладі виводу замість 980.
Хобі Кальвіна

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

Я міг би поголити 100 байтів, якби мені не довелося використовувати рядок як вхід.


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

К, 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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.