อักขระแต่ละตัวมีอักขระกี่ตัว?


15

ที่http://shakespeare.mit.edu/คุณสามารถค้นหาเนื้อหาทั้งหมดของบทละครของ Shakespeare ในหน้าเดียว (เช่นHamlet )

เขียนสคริปต์ที่ใช้ใน URL ของการเล่นจาก stdin เช่นhttp://shakespeare.mit.edu/hamlet/full.htmlและแสดงจำนวนอักขระข้อความที่แต่ละตัวละครเล่นพูดกับ stdout เรียงตามผู้ พูดมากที่สุด

เห็นได้ชัดว่าชื่อเรื่องการเล่น / ฉาก / การกระทำไม่นับเป็นบทสนทนาและไม่ใช้ชื่อตัวละคร ข้อความที่มีตัวเอียงและ [ข้อความวงเล็บเหลี่ยม] ไม่ใช่บทสนทนาจริงไม่ควรนับรวม ควรนับพื้นที่ว่างและเครื่องหมายวรรคตอนอื่น ๆ ในบทสนทนา

(รูปแบบของบทละครดูสอดคล้องกันมากแม้ว่าฉันจะไม่ได้ดูพวกเขาทั้งหมดบอกฉันว่าฉันมองข้ามอะไรสคริปต์ของคุณไม่จำเป็นต้องทำงานกับบทกวี)

ตัวอย่าง

นี่คือส่วนจำลองจากMuch Ado เกี่ยวกับไม่มีอะไรที่จะแสดงสิ่งที่ฉันคาดหวังสำหรับผลลัพธ์:

ความกังวลใจเพิ่มเติมเกี่ยวกับอะไร

ฉาก 0

ผู้สื่อสาร

ฉันจะ.

BEATRICE

ทำ.

LEONATO

คุณจะไม่

BEATRICE

เลขที่

ผลลัพธ์ที่คาดหวัง:

LEONATO 15
Messenger 7
BEATRICE 6

เกณฑ์การให้คะแนน

นี่คือรหัสกอล์ฟ โปรแกรมที่เล็กที่สุดเป็นไบต์จะเป็นผู้ชนะ


8
จะเป็นอย่างไรถ้ามีคนทำเช็คสเปียร์นี้ที่เชคสเปียร์? มันจะเป็นที่น่าตื่นตาตื่นใจถ้าเป็นไปได้ ...
fuandon

เราสามารถสมมติว่าเรามีรายชื่อตัวละครในการเล่นได้หรือไม่? หรือเราต้องอนุมานตัวละครจากข้อความ? ส่วนหลังยากมากเนื่องจากอักขระบางตัว (เช่น Messenger) มีตัวอักษรพิมพ์ใหญ่และพิมพ์เล็กผสมกัน คนอื่นมีชื่อที่มีตัวอักษรพิมพ์ใหญ่เท่านั้น (เช่น LEONATO) และบางส่วนเป็นชื่อผสม
DavidC

ใช่คุณควรสรุปชื่อ พวกเขาถูกจัดรูปแบบแตกต่างจากบทสนทนาอย่างมากดังนั้นเนื่องจาก html ที่แตกต่างนั้นไม่ควรยุ่งยากเกินไป
งานอดิเรกของ Calvin

1
ควร 'All' เป็นอักขระแยกต่างหากหรือไม่
es1024

1
@ es1024 ใช่ อักขระการเล่นใด ๆ ที่มีชื่อเฉพาะจะถือว่าแยกจากกันแม้ว่าผลลัพธ์จะไม่สมเหตุสมผลก็ตาม
งานอดิเรกของ Calvin

คำตอบ:


4

PHP (240 ตัวอักษร)

แบ่ง html ออกเป็นสตริง (ใช้เป็น delimeter) จากนั้นเรียกใช้นิพจน์ทั่วไปสองถึงสามรายการเพื่อแยกชื่อและคำที่พูดออกมา บันทึกความยาวของคำที่พูดเป็นอาร์เรย์ แข็งแรงเล่นกอล์ฟ:

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

Ungolfed:

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

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

นี่อาจจะเป็นสนามกอล์ฟต่อไป แต่ก็ไม่น่าที่จะได้รับด้านล่างคำตอบที่ให้ไว้แล้ว :(

Ungolfed:

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

หมายเหตุ

  • ฉันลบข้อความที่อยู่ในวงเล็บเช่นเดียวกับการเกิด "กัน:" ที่ไม่ได้อยู่ในวงเล็บ (ฉันยังตัดแต่งอักขระช่องว่าง) นี่คือร่องรอยของการดำเนินการกับข้อความที่มีการจับคู่และยอดรวมของตัวละครแต่ละตัวสำหรับหมู่บ้าน

  • ในฐานะที่เป็นคำตอบอื่น ๆทั้งหมดจะถือว่าเป็นตัวละคร อาจเป็นการดึงดูดให้เพิ่มคุณค่าของตัวละครทั้งหมดลงในตัวละครอื่น ๆ ทั้งหมด แต่สิ่งนี้จะไม่ถูกต้องเนื่องจาก "ทั้งหมด" หมายถึงตัวละครที่ปรากฏบนเวทีจริงซึ่งต้องเก็บบริบทของผู้ที่อยู่ในปัจจุบัน (การติดตาม "ออก" "exeunt เครื่องหมาย "และ" Enter ") สิ่งนี้ยังไม่เสร็จ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.