Какие персонажи друзей были действительно лучшими друзьями?


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](как выше).

Входные данные могут быть приняты в виде строки для стандартного ввода, командной строки или функции, или это может быть имя текстового файла, который содержит данные.

  • Числа в миллисекундах всегда будут положительными целыми числами.
  • Буквы символов всегда будут в порядке CJMPRS(в алфавитном порядке).
  • При желании вы можете предположить, что в конце сцены нет символов (например 980 ).
  • При желании вы можете предположить, что есть перевод строки.
  • Ввод будет иметь по крайней мере 1 строку и может иметь произвольно много.

Вывод должен быть напечатан или возвращен или записан в другой текстовый файл в виде строки из 64 строк.

  • Строки могут быть в любом порядке.
  • Буквы символов не обязательно должны быть в CJMPRSпорядке.
  • Подгруппы с 0ms общее время действительно должны быть перечислены.
  • При желании может быть завершающий пробел после пустой суммы подмножества.
  • При желании может быть завершающий перевод строки.

(Эта проблема, конечно, может быть обобщена на большее количество символов, но мы будем придерживаться 6 символов CJMPRS друзей .)

Самый короткий код в байтах побеждает.

Обратите внимание, что мне действительно нравятся Друзья, и я не думаю, что некоторые персонажи важнее других. Статистика была бы интересной, хотя. ;)


7
Получим ли мы награду, если опубликуем анализ серии? ;)
Бета-распад

5
Я мог или не мог видеть каждый эпизод десятки раз и владею всеми 10 сезонами ...
Алекс А.

@AlexA. Я могу или не могу знать, о чем ты говоришь ...
Болов

Пустой набор является особым случаем - он не подчиняется правилу «даже если есть больше символов, чем просто в подмножестве», иначе он набрал бы 4029 в примере (общее количество времени, по крайней мере, не один на экране), а не 980.
Хоббс

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

Вряд ли стоит даже пытаться написать одну строчку своего решения, и она уже длиннее, чем весь ответ
Пита

4
@hobbs Это обратная сторона смешанных языковых соревнований. Но не пугайтесь, решения на других языках обычно получают больше голосов. Просто посмотрите на Haskell-Solution.
Якуб

3
На 36% короче и заставил меня понять, что в моем коде есть ошибка ...
Деннис

Весьма прискорбно, что cMиспользуется .*расширение карты. Возможно, следует сделать исключение, потому cчто я не могу представить, что кто-то хочет использовать это на карте
FryAmTheEggman

Это дает 0 в верхней строке в примере выходных данных вместо 980.
Увлечения Calvin's

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-Пролог, 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}

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

К, 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.