어떤 친구 캐릭터가 정말 가장 친한 친구였습니까?


30

미국 시트콤 프렌즈 의 6 명의 주요 출연진 은 모두 시리즈 전 기간 동안 (최소한 시즌 2 이후) 동일한 급여를받는 것에 동의했다 . 그렇다고해서 모두 같은 시간의 대기 시간을 보냈거나 화면에서 서로 같은 양의 상호 작용을했다는 의미는 아닙니다.

이 도전에서, 당신은 어떤 친구의 친구가 정말로 가장 좋았 는지 결정하는 데 도움이되는 프로그램을 작성하게 됩니다.

설정

친구 의 에피소드 나 장면을보고 각 카메라를 촬영하는 동안 화면에 누가 표시되어 있는지 그리고 얼마나 오래 있는지 정확히 메모 해 두십시오.

각 캐릭터의 이름을 약칭하겠습니다.

그런 다음 모든 카메라 샷 (또는 캐릭터가 샷을 입력 / 종료 할 때마다)마다 화면에 누가 있었는지 나열합니다. 예를 들면 다음과 같습니다.

504 CRS
200 J
345 MP
980
2000 CJMPRS

이것은 말하고 있습니다 :

  • 504ms 동안 챈들러, 레이첼, 로스가 스크린에있었습니다.
  • 그리고 200ms 동안 Joey는있었습니다.
  • 345ms 동안 Monica와 Phoebe가있었습니다.
  • 그런 다음 980ms 동안 화면에 6 개의 주요 캐릭터가 없었습니다.
  • 그런 다음 2 초 동안 모든 것이있었습니다.

(이것은 실제 클립이 아니며 구성했습니다.)

다음은 동일합니다.

504 CRS
1 J
199 J
345 MP
980
2000 CJMPRS

스크린 타임이 가장 많은 문자 조합을 분석하기 위해 6 개의 문자 중 64 개의 가능한 서브 세트를 모두보고 해당 스크린 시간을 합산했습니다. 카메라 촬영 중에 서브 세트의 모든 사람이 화면에 나타나면 서브 세트에 있는 것보다 많은 문자가 있더라도 해당 카메라 샷의 시간이 해당 서브 세트의 총 화면 시간에 추가됩니다.

빈 서브셋에는 예외가 있습니다. 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(Joy 만) 2200ms의 스크린 타임을 가졌다는 것을 알 수 있습니다.

도전

다음과 같은 문자열 또는 텍스트 파일을받는 프로그램을 작성하십시오.

504 CRS
200 J
345 MP
980
2000 CJMPRS

여기서 각 줄은 형식 [time in ms] [characters on screen]을 가지며 6 자 중 64 개 하위 집합이 화면에서 소비 한 총 시간을 출력합니다. 여기서 각 줄은 [total time in ms for subset] [characters in subset]위와 같은 형식을 갖습니다 .

입력은 stdin, 명령 행 또는 함수에 대한 문자열로 사용되거나 데이터가 포함 된 텍스트 파일의 이름 일 수 있습니다.

  • 밀리 초 숫자는 항상 양의 정수입니다.
  • 문자는 항상 CJMPRS알파벳 순서로되어 있습니다 .
  • 장면에 문자가없는 경우 뒤에 공백이 있다고 가정 할 수 있습니다 (예 :) 980 .
  • 선택적으로 후행 줄 바꿈이 있다고 가정 할 수 있습니다.
  • 입력은 적어도 1 개의 라인을 가지며 임의로 많은 라인을 가질 수 있습니다.

출력은 64 줄 문자열로 다른 텍스트 파일에 인쇄되거나 반환되거나 기록되어야합니다.

  • 라인은 임의의 순서 일 수있다.
  • 문자는 CJMPRS순서대로 있을 필요는 없습니다 .
  • 총 시간 0ms 인 하위 집합을 나열해야합니다.
  • 빈 부분 집합 합계 뒤에 선택적으로 후행 공백이있을 수 있습니다.
  • 선택적으로 후행 줄 바꿈이있을 수 있습니다.

(이 문제는 물론 더 많은 캐릭터로 일반화 될 수 있지만 6 명의 CJMPRS 친구 캐릭터를 고수 할 것 입니다.)

바이트 단위의 가장 짧은 코드가 이깁니다.

나는 실제로 친구를 즐기고 일부 문자가 다른 문자보다 더 중요하다고 생각하지 않습니다. 통계는 흥미로울 것입니다. ;)


7
시리즈의 분석을 게시하면 현상금이 발생합니까? ;)
베타 부패

5
나는 모든 에피소드를 수십 번 보았을 수도 있고 아닐 수도 있고 10 시즌을 모두 소유 할 수도 있습니다 ...
Alex A.

@AlexA. 나는 당신이 무슨 말을하는지 모를 수도 있습니다.
bolov

빈 세트는 특별한 경우입니다. "집합에있는 것보다 많은 문자가 있더라도"규칙에 따르지 않습니다. 그렇지 않으면 예제에서 4029 점을 얻습니다 ( 최소한 그렇지 않은 총 시간). 하나가 되지 980) 화면에, 그리고
홉스

1
@BetaDecay 실제로는 가능할 것입니다!
Calvin 's Hobbies

답변:


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 이상이다
홉스

4
@hobbs 그것은 혼합 언어 경쟁의 단점입니다. 그러나 다른 언어로 된 솔루션은 일반적으로 더 많은 표를받습니다. Haskell-Solution을보십시오.
Jakube

3
36 % 단축 하고 ... 제가 내 코드에서 버그를했다 깨닫게
데니스

지도 확장 을 cM사용하는 것은 다소 불행합니다 .*. c내가지도에서 그것을 사용하고 싶어하는 누군가를 상상할 수 없기 때문에 아마도 예외가 있어야한다
FryAmTheEggman

이것은 예를 출력하는 대신 980에서 상위 라인에 0을 제공합니다
칼빈의 취미

13

하스켈, 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 - 프롤로그의 이전 버전이있는 경우.

String을 입력으로 사용할 필요가 없으면 100 바이트 이상을 줄일 수 있습니다.


7

하스켈 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) 는 안됩니다 . 숫자와 합계를 추출하십시오.


6

CJam, 67 58 바이트

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

CJam 통역사 에서 온라인으로 사용해보십시오 .


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

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

같은 문자열을 사용합니다 "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"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.