Có bao nhiêu ký tự cho mỗi ký tự?


15

Tại http://shakespeare.mit.edu/, bạn có thể tìm thấy toàn bộ nội dung của mỗi vở kịch của Shakespeare trên một trang (ví dụ: Hamlet ).

Viết một tập lệnh lấy url của một lần phát từ stdin, chẳng hạn như http://shakespeare.mit.edu/hamlet/full.html và xuất số lượng ký tự văn bản mà mỗi nhân vật chơi nói đến stdout, được sắp xếp theo ai nói nhiều nhất

Các tiêu đề vở kịch / cảnh / hành động rõ ràng không được tính là đối thoại, cũng như tên nhân vật. Văn bản in nghiêng và [văn bản ngoặc vuông] không phải là đối thoại thực tế, chúng không nên được tính. Không gian và dấu chấm câu khác trong cuộc đối thoại nên được tính.

(Định dạng cho các vở kịch trông rất nhất quán mặc dù tôi chưa xem hết tất cả. Hãy cho tôi biết nếu tôi đã bỏ qua bất cứ điều gì. Kịch bản của bạn không phải làm việc cho các bài thơ.)

Thí dụ

Đây là phần mô phỏng từ Nhiều Ado About nothing để hiển thị những gì tôi mong đợi cho đầu ra:

Thêm Ado về Không có gì

Cảnh 0.

tin nhắn

Tôi sẽ.

VÒI

Làm.

LEONATO

Bạn sẽ không bao giờ.

VÒI

Không.

Sản lượng dự kiến:

LEONATO 15
Messenger 7
BEATRICE 6

Chấm điểm

Đây là mã golf. Chương trình nhỏ nhất tính bằng byte sẽ giành chiến thắng.


8
Điều gì sẽ xảy ra nếu ai đó thực hiện thử thách Shakespeare này trong Shakespeare? Thật tuyệt vời nếu điều đó thậm chí có thể xảy ra ...
fuandon

Chúng ta có thể cho rằng chúng ta có một danh sách các nhân vật trong vở kịch không? Hay chúng ta phải suy ra các ký tự từ văn bản? Điều thứ hai là rất khó khăn khi một số ký tự (ví dụ: Messenger) có sự pha trộn của chữ in hoa và in thường. Những người khác có tên chỉ có chữ in hoa (ví dụ LEONATO); và một số trong đó là tên ghép.
DavidC

Có bạn nên suy ra tên. Chúng được định dạng rất khác so với đối thoại, do đó, việc phân biệt html không nên quá phức tạp.
Sở thích của Calvin

1
'Tất cả' có nên được coi là một nhân vật riêng biệt?
es1024

1
@ es1024 Có. Bất kỳ nhân vật chơi nào có tiêu đề duy nhất đều được coi là riêng biệt, ngay cả khi kết quả không chính xác.
Sở thích của Calvin

Câu trả lời:


4

PHP (240 ký tự)

Chia html thành các chuỗi (sử dụng như một dấu phân cách), sau đó chạy một vài biểu thức chính quy để trích xuất tên và từ được nói. Tiết kiệm độ dài của các từ được nói thành mảng. Chơi gôn

<?@$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";

Ung dung:

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

Lưu ý: Điều này coi 'Tất cả' là một ký tự riêng biệt.

Thí dụ:

$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
Vui lòng hiển thị một số ví dụ (s) đầu ra.
DavidC

@DavidCarraher Một ví dụ đã được thêm vào.
es1024

3

Nổi loạn - 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]]

Điều này có thể có thể được đánh gôn hơn nữa tuy nhiên không thể có được dưới câu trả lời đã được cung cấp :(

Ung dung:

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]]

Chương trình này loại bỏ [văn bản ngoặc vuông] và cũng cắt các khoảng trắng xung quanh khỏi đoạn hội thoại. Không có cái này thì đầu ra giống hệt câu trả lời es1024 .

Thí dụ:

$ 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

Lisp thường gặp - 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)))

Giải trình

Đây là một phiên bản sửa đổi một chút có thêm thông tin in ấn (xem dán).

(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)))

Ghi chú

  • Tôi xóa văn bản được đặt dấu ngoặc cũng như sự xuất hiện "sang một bên" không xuất hiện trong ngoặc (Tôi cũng cắt bớt các ký tự khoảng trắng). Dưới đây là dấu vết thực hiện với văn bản được khớp và tổng số cho mỗi ký tự, cho Hamlet .

  • Như những câu trả lời khác, Tất cả được coi là một nhân vật. Có thể rất hấp dẫn khi thêm giá trị của tất cả cho tất cả các nhân vật khác, nhưng điều này sẽ không chính xác vì "Tất cả" đề cập đến các nhân vật thực sự có mặt trên sân khấu, điều này đòi hỏi phải giữ bối cảnh của người hiện diện (theo dõi "thoát" " "và" nhập "chỉ dẫn). Điều này không được thực hiện.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.