문자 당 몇 자입니까?


15

에서 http://shakespeare.mit.edu/ 당신은 한 페이지 (예에 셰익스피어의 희곡 각각의 전체 텍스트를 찾을 수 있습니다 햄릿 ).

http://shakespeare.mit.edu/hamlet/full.html 과 같이 stdin에서 재생 URL을 가져 와서 각 재생 캐릭터가 stdout에 말한 텍스트 문자 수를 누가에 따라 정렬했는지 출력 하는 스크립트를 작성 하십시오 . 가장 많이 말했다.

연극 / 장면 / 연극 타이틀은 대화로 간주되지 않으며 캐릭터 이름도 아닙니다. 기울임 꼴 텍스트 와 [대괄호 텍스트]는 실제 대화가 아니며 계산하지 않아야합니다. 대화 내 공백과 기타 문장 부호를 계산해야합니다.

(내가 한 번도 보지 않았지만 연극 형식은 매우 일관된 것으로 보입니다. 내가 간과 한 것이 있으면 말해주세요. 대본은시를 위해 작동하지 않아도됩니다.)

다음은 출력에 필요한 것을 보여주기 위해 Ado Athing About Nothing 의 시뮬레이션 섹션입니다 .

아무것도에 대한 더 많은 열망

장면 0.

전령

나는 할 것이다.

미용

하다.

레오 나토

너는 절대 할수 없을 것이다.

미용

아니.

예상 출력 :

LEONATO 15
Messenger 7
BEATRICE 6

채점

이것은 코드 골프입니다. 바이트 단위의 가장 작은 프로그램이 승리합니다.


8
이 셰익스피어가 셰익스피어에서 도전 한 사람이 있다면 어떨까요? 가능하다면 놀라 울 것입니다 ...
fuandon

극중 캐릭터 목록이 있다고 가정 할 수 있습니까? 아니면 문자에서 문자를 추론해야합니까? 후자는 일부 문자 (예 : 메신저)에 대문자와 소문자가 혼합되어있어 매우 어렵습니다. 다른 사람들은 대문자 만 사용하는 이름을 가지고 있습니다 (예 : LEONATO); 그중 일부는 복합 이름입니다.
DavidC

예, 이름을 추론해야합니다. 그것들은 대화와 매우 다른 형식을 취하므로 HTML을 차별화하는 것이 너무 까다로워서는 안됩니다.
Calvin 's Hobbies

1
'모두'가 별도의 캐릭터로 간주되어야합니까?
es1024

1
@ es1024 예. 결과가 정확하게 이해되지 않더라도 고유 한 타이틀을 가진 모든 플레이 캐릭터는 별도의 것으로 간주됩니다.
Calvin 's Hobbies

답변:


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

참고 : 'All'은 별도의 문자로 간주됩니다.

예:

$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

@DavidCarraher 예제가 추가되었습니다.
es1024

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 응답 과 동일합니다 .

예:

$ 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

커먼 리스프-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"은 실제로 무대에있는 문자를 나타내므로 누가 존재하는지에 대한 컨텍스트를 유지해야합니다 ( "exit" "exeunt 추적 "및"입력 "표시). 완료되지 않았습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.