1文字あたりの文字数は?


15

http://shakespeare.mit.edu/では、シェークスピアの各劇の全文を1ページで見つけることができます(例:Hamlet)。

http://shakespeare.mit.edu/hamlet/full.htmlなど、stdinから芝居のURLを取り込むスクリプトを作成し、各芝居のキャラクターがstdoutに話しかけたテキストキャラクターの数を出力します。最も話しました。

演劇/シーン/演技のタイトルは、明らかに対話としてカウントされず、キャラクター名もカウントされません。斜体のテキストと[角かっこで囲まれたテキスト]は実際のダイアログではないため、カウントしないでください。対話内のスペースやその他の句読点はカウントする必要があります。

(演劇の形式は、すべてを確認したわけではありませんが、非常に一貫しているように見えます。見落としている場合は教えてください。あなたの脚本は詩のために機能する必要はありません。)

これは、Much Ado About Nothingのシミュレーションセクションで、出力に期待するものを示しています。

何もしないことについて

シーン0。

メッセンジャー

します。

美女

行う。

レオナト

あなたは決してしません。

美女

番号。

期待される出力:

LEONATO 15
Messenger 7
BEATRICE 6

得点

これはコードゴルフです。バイト単位の最小のプログラムが勝ちます。


8
誰かがシェークスピアでこのシェークスピアに挑戦したとしたらどうでしょう?それも可能だった場合、それは素晴らしいだろう...
fuandon

劇中のキャラクターのリストがあると仮定できますか?または、テキストから文字を推測する必要がありますか?後者は、一部のキャラクター(メッセンジャーなど)に大文字と小文字が混在しているため、非常に困難です。その他の名前には大文字のみの名前が付いています(LEONATOなど)。そしてそれらのいくつかは複合名です。
DavidC 14

はい、名前を推測する必要があります。それらはダイアログとは非常に異なってフォーマットされているので、HTMLを区別することはそれほど難しいことではないはずです。
カルビンの趣味14

1
「すべて」を別のキャラクターと見なすべきですか?
es1024 14

1
@ es1024はい。結果が正確に意味をなさない場合でも、一意のタイトルを持つプレイキャラクターは個別と見なされます。
カルビンの趣味14

回答:


4

PHP(240文字)

htmlを文字列に分割し(区切り文字として使用)、いくつかの正規表現を実行して、名前と話し言葉を抽出します。配列に話される単語の長さを保存します。ゴルフ:

<?@$p=preg_match_all;foreach(explode('/bl',implode(file(trim(fgets(STDIN)))))as$c)if($p('/=s.*?b>(.*?):?</',$c,$m)){$p('/=\d.*?>(.*?)</',$c,$o);foreach($m[1]as$n)@$q[$n]+=strlen(implode($o[1]));}arsort($q);foreach($q as$n=>$c)echo"$n $c\n";

ゴルフをしていない:

<?php
$html = implode(file(trim(fgets(STDIN))));
$arr = explode('/bl',$html);
foreach($arr as $chunk){
    if(preg_match_all('/=s.*?b>(.*?):?</',$chunk,$matches)){
        $name = $matches[1];
        preg_match_all('/=\d.*?>(.*?)</',$chunk,$matches);
        foreach($name as $n)
            @$names[$n] += strlen(implode($matches[1]));
    }
}
arsort($names);
foreach($names as $name=>$count)
    echo "$name $count\n";

注:これは、「すべて」を別個の文字と見なします。

例:

$php shakespeare.php <<< "http://shakespeare.mit.edu/hamlet/full.html"
HAMLET 60063
KING CLAUDIUS 21461
LORD POLONIUS 13877
HORATIO 10605
LAERTES 7519
OPHELIA 5916
QUEEN GERTRUDE 5554
First Clown 3701
ROSENCRANTZ 3635
Ghost 3619
MARCELLUS 2350
First Player 1980
OSRIC 1943
Player King 1849
GUILDENSTERN 1747
Player Queen 1220
BERNARDO 1153
Gentleman 978
PRINCE FORTINBRAS 971
VOLTIMAND 896
Second Clown 511
First Priest 499
Captain 400
Lord 338
REYNALDO 330
FRANCISCO 287
LUCIANUS 272
First Ambassador 230
First Sailor 187
Messenger 185
Prologue 94
All 94
Danes 75
Servant 49
CORNELIUS 45

1
出力の例をいくつか示してください。
DavidC 14

@DavidCarraherサンプルが追加されました。
es1024 14

3

REBOL - 556 527

t: complement charset"<"d: charset"0123456789."m: map[]parse to-string read to-url input[any[(s: 0 a: copy[])some["<A NAME=speech"some d"><b>"copy n some t</b></a>(append a trim/with n":")some newline]<blockquote>newline any["<A NAME="some d">"copy q some t</a><br>newline(while[f: find q"["][q: remove/part f next find f"]"]s: s + length? trim head q)|<p><i>some t</i></p>newline][</blockquote>|</body>](foreach n a[m/:n: either none? m/:n[s][s + m/:n]])| skip]]foreach[x y]sort/reverse/skip/compare to-block m 2 2[print[x y]]

これはおそらくさらにゴルフすることができますが、すでに提供されている答えを下回る可能性は低いです:(

ゴルフをしていない:

t: complement charset "<"
d: charset "0123456789."
m: map []

parse to-string read to-url input [
    any [
        (s: 0 a: copy [])

        some [
            "<A NAME=speech" some d "><b>" copy n some t </b></a>
            (append a trim/with n ":")
            some newline
        ]

        <blockquote> newline
        any [
            "<A NAME=" some d ">" copy q some t </a><br> newline (
                while [f: find q "["] [
                    q: remove/part f next find f "]"
                ]
                s: s + length? trim head q
            )
            | <p><i> some t </i></p> newline
        ]
        [</blockquote> | </body>]
        (foreach n a [m/:n: either none? m/:n [s] [s + m/:n]])

        | skip
    ]
]

foreach [x y] sort/reverse/skip/compare to-block m 2 2 [print [x y]]

このプログラムは[角括弧で囲まれたテキスト]を削除し、ダイアログから周囲の空白も削除します。これがない場合、出力はes1024 answer と同じです。

例:

$ rebol -q shakespeare.reb <<< "http://shakespeare.mit.edu/hamlet/full.html"
HAMLET 59796
KING CLAUDIUS 21343
LORD POLONIUS 13685
HORATIO 10495
LAERTES 7402
OPHELIA 5856
QUEEN GERTRUDE 5464
First Clown 3687
ROSENCRANTZ 3585
Ghost 3556
MARCELLUS 2259
First Player 1980
OSRIC 1925
Player King 1843
GUILDENSTERN 1719
Player Queen 1211
BERNARDO 1135
Gentleman 978
PRINCE FORTINBRAS 953
VOLTIMAND 896
Second Clown 511
First Priest 499
Captain 400
Lord 338
REYNALDO 312
FRANCISCO 287
LUCIANUS 269
First Ambassador 230
First Sailor 187
Messenger 185
Prologue 89
All 76
Danes 51
Servant 49
CORNELIUS 45

0

Common Lisp-528

(use-package :plump)(lambda c(u &aux(h (make-hash-table))n r p)(traverse(parse(drakma:http-request u))(lambda(x &aux y)(case p(0(when(and n(not(ppcre:scan"speech"(attribute x"NAME"))))(setf r t y(#1=ppcre:regex-replace-all"aside: "(#1#"^(\\[[^]]*\\] |\\s*)"(text x)"")""))(dolist(w n)(incf(gethash w h 0)(length y)))))(1(if r(setf n()r()))(push(intern(text(aref(children x)0)))n)))):test(lambda(x)(and(element-p x)(setf p(position(tag-name x)'("A""b"):test #'string=)))))(format t"~{~a ~a~^~%~}"(alexandria:hash-table-plist h)))

説明

これは、印刷情報を追加する少し変更されたバージョンです(貼り付けを参照)。

(defun c (u &aux
                 (h (make-hash-table)) ;; hash-table
                 n ;; last seen character name
                 r p
                 )
      (traverse                 ;; traverse the DOM generated by ...
       (parse                   ;; ... parsing the text string
        (drakma:http-request u) ;; ... resulting from http-request to link U
        )

       ;; call the function held in variable f for each traversed element
       (lambda (x &aux y)
         (case p
           (0 ;a
            (when(and n(not(alexandria:starts-with-subseq"speech"(attribute x "NAME"))))
              (setf r t)
              (setf y(#1=ppcre:regex-replace-all"aside: "(#1#"^(\\[[^]]*\\] |\\s*)"(text x)"")""))
              (format t "~A ~S~%" n y) ;; debugging
              (dolist(w n)
                (incf
                    (gethash w h 0) ;; get values in hash, with default value 0
                    (length y)))) ;; length of text
            )
           (1 ;b
            (if r(setf n()r()))
            (push (intern (text (aref (children x)0)))n))))

       ;; but only for elements that satisfy the test predicate
       :test
       (lambda(x)
         (and (element-p x) ;; must be an element node
              (setf p(position(tag-name x)'("A""b"):test #'string=)) ;; either <a> or <b>; save result of "position" in p
              )))

        ;; finally, iterate over the elements of the hash table, as a
        ;; plist, i.e. a list of alternating key values (k1 v1 k2 v2 ...),
        ;; and print them as requested. ~{ ~} is an iteration control format.
  (format t "~&~%~%TOTAL:~%~%~{~a ~a~^~%~}" (alexandria:hash-table-plist h)))

ノート

  • 括弧内のテキストと、括弧内に存在しない「aside:」オカレンスを削除します(空白文字もトリミングします)。Hamletの場合、一致するテキストと各文字の合計を使用した実行のトレースを次に示します。

  • 他の答えとして、Allはキャラクターであると想定されます。allの値を他のすべてのキャラクターに追加するのは魅力的かもしれませんが、「All」はステージに実際に存在するキャラクターを指すため、これは正しくありません。 「および「入力」表示)。これは行われません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.