どのフレンドのキャラクターが本当に親友でしたか?


30

アメリカのシットコムフレンズの6人の主なキャストメンバーは全員、シリーズの実行中(少なくともシーズン2以降)に同じ給料が支払われることに同意しました。しかし、だからといって、全員が同じ時間の放送時間を持っているわけでも、画面上ですべて同じ時間対話したというわけでもありません。

この課題では、どのフレンドの友達が本当に最高かを判断するのに役立つプログラムを作成します。

セットアップ

友人のエピソードやシーンを見て、各カメラショット中に誰がどのくらいの時間画面にいるかを正確に書き留めてください。

各キャラクターの名前を短縮します:

次に、カメラショットごとに(またはキャラクターがショットを入力/終了するたびに)、誰が画面にいたかをリストします。例えば:

504 CRS
200 J
345 MP
980
2000 CJMPRS

これは言っている:

  • 504msの間、チャンドラー、レイチェル、ロスがスクリーンに映りました。
  • その後、200msの間、ジョーイはそうでした。
  • それから345msの間、モニカとフィービーはそうでした。
  • その後、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彼は自分だけで200人、全員で2000人だったので、(ちょうどJoey)が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順番に並んでいる必要はありません。
  • 合計時間 0ミリ秒のサブセットをリストする必要があります。
  • 必要に応じて、空のサブセットの合計の後に後続スペースが存在する場合があります。
  • オプションで末尾の改行が存在する場合があります。

(もちろん、この問題はより多くのキャラクターに一般化できますが、6人のCJMPRS フレンドキャラクターに固執します。)

バイト単位の最短コードが優先されます。

私は実際に友人を楽しんでおり、一部のキャラクターが他のキャラクターより重要だとは思わないことに注意してください。しかし、統計は興味深いでしょう。;)


7
シリーズの分析を投稿すると賞金がもらえますか?;)
ベータ崩壊

5
私はよく、または...倍のすべてのエピソードの数十を見て、すべての10件の季節を所有していない可能性があります
アレックスA.

@AlexA。私はよく、またはあなたが...について話しているのか分からないかもしれない
bolov

空のセットは特別な場合です。「サブセット内の文字よりも多くの文字がある場合でも」ルールに従わないか、例で4029を獲得します(少なくとも1がいない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

それは私が私の解決策の1行を記述するときにしようとしてもほとんど価値があり、それはすでに長い全体Pyth回答:-Pよりもだ
ホッブズ

4
@hobbsそれは混合言語の競争のマイナス面です。しかし、怖がらないでください。他の言語のソリューションは、通常より多くの票を獲得します。Haskell-Solutionをご覧ください。
ジャクベ

3
36%短縮し、私は自分のコードにバグがありました実感しました...
デニス

マップ展開をcM使用するのはかなり残念です.*。おそらく、例外がためになされるべきであるc私は、誰かがマップにそのようにそれを使用したいとは想像できないよう
FryAmTheEggman

これは、例えば出力の代わりに、980でトップラインに0を与える
カルバンの趣味

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

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.