Tách một tập lệnh Shakespeare


13

Ông William Shakespeare đã viết kịch. Rất nhiều vở kịch. Trong tarball này chứa mỗi một tác phẩm của anh ấy, mỗi một vở kịch của anh ấy là một tập tin dài.
Nó cần phải được chia thành Cảnh để sản xuất sân khấu. Bởi vì các diễn viên thiếu kiên nhẫn, mã của bạn cần phải càng ngắn càng tốt.

Bài tập:

Nhiệm vụ của bạn là viết một chương trình hoặc chức năng để phân chia các lần phát trong tệp này thành các tệp riêng biệt, được đánh số liên tục bắt đầu từ đó 1, trong đó mỗi lần chứa một cảnh. Bạn nên giữ lại tất cả các khoảng trắng và tiêu đề.

Đầu vào:

Đầu vào sẽ là một lần phát qua stdinhoặc tên tệp dưới dạng tham số. Bạn có thể chọn. Vở kịch sẽ trông giống như:

 TITUS ANDRONICUS


    DRAMATIS PERSONAE


SATURNINUS  son to the late Emperor of Rome, and afterwards
    declared Emperor.

BASSIANUS   brother to Saturninus; in love with Lavinia.

TITUS ANDRONICUS    a noble Roman, general against the Goths.

MARCUS ANDRONICUS   tribune of the people, and brother to Titus.


LUCIUS  |
    |
QUINTUS |
    |  sons to Titus Andronicus.
MARTIUS |
    |
MUTIUS  |


Young LUCIUS    a boy,
[...]
ACT I



SCENE I Rome. Before the Capitol.


    [The Tomb of the ANDRONICI appearing; the Tribunes
    and Senators aloft. Enter, below, from one side,
    SATURNINUS and his Followers; and, from the other
    side, BASSIANUS and his Followers; with drum and colours]

SATURNINUS  Noble patricians
[...]
ACT I



SCENE II    A forest near Rome. Horns and cry of hounds heard.


    [Enter TITUS ANDRONICUS, with Hunters, &c., MARCUS,
    LUCIUS, QUINTUS, and MARTIUS]

TITUS ANDRONICUS    The hunt is up, the morn is bright and grey,
    The fields are
[...]
ACT II



SCENE I Rome. Before the Palace.


    [Enter AARON]

AARON   Now climbeth Tamora
[...]

Đầu ra:

Đầu ra sẽ trông giống như thế này:

HÀNH ĐỘNG I



LENI TÔI Rome. Trước Tòa đại hội.


    [Ngôi mộ của ANDRONICI xuất hiện; các bộ lạc
    và Thượng nghị sĩ ở trên cao. Nhập, bên dưới, từ một phía,
    SATACKINUS và những người theo ông; và, từ người khác
    bên, BASSIANUS và những người theo ông; với trống và màu sắc]

SATACKINUS Những người yêu quý cao quý ...
HÀNH ĐỘNG I



SCENE II Một khu rừng gần Rome. Tiếng còi và tiếng chó săn nghe thấy.


    [Nhập TITUS ANDRONICUS, với Thợ săn, & c., MARCUS,
    LUCIUS, QUINTUS và MARTIUS]

TITUS ANDRONICUS Cuộc săn lùng đã kết thúc, buổi sáng rực rỡ và xám xịt,
    Các lĩnh vực là ...
ACT II



LENI TÔI Rome. Trước Cung điện.


    [Nhập AARON]

AARON Bây giờ leo lên Tamora ...

Vân vân.

Xuất ra các tệp được đánh số hoặc vào stdoutluồng (trả về các hàm) với dấu phân cách bạn chọn.

Tiền thưởng:

  • 10% Nếu bạn lưu bit trước Act 1 vào tệp 0. Lưu ý: Không được phá vỡ nếu bit trước Act 1 trống.
  • 15% Nếu bạn có thể lấy cả hai stdinvà một tham số đường dẫn tệp
  • 20% Nếu bạn có thể xuất cả hai thành tệp và to stdout/ return.
  • 200 danh tiếng nếu bạn có thể thực hiện chương trình SPL nhỏ nhất. Tiền thưởng này đã được trao tặng.

Bảng xếp hạng

Dưới đây là một Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh chúng qua. Ví dụ:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Nếu ở đó bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ phiên dịch), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

# Perl, 43 + 2 (-p flag) = 45 bytes

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table><script>var QUESTION_ID=68997,OVERRIDE_USER=43394;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?([\d\.]+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;</script>


16
Tôi sẽ đưa ra hơn 200 tiền thưởng cho lần gửi Ngôn ngữ lập trình Shakespeare hợp lệ đầu tiên.
mèo

3
Thôi nào, mọi người đều biết rằng CodeGolf không nhanh. Tại sao không nói rằng "tarball đã khá đầy đủ, vì vậy mã của bạn phải càng ngắn càng tốt"?
J_F_B_M

1
@trichoplax Sản phẩm. Tôi nghĩ đó là cách mọi người đã làm nó!
gạch


2
@cat - Để nó mở; Tôi chắc chắn có những giải pháp Shakespeare nhỏ hơn của tôi. Của tôi béo như tổng của một con mèo lớn lớn và một con mèo.
Robert Fraser

Câu trả lời:


38

Ngôn ngữ lập trình Shakespeare 1.2.1 , 930 895 887 - 10% = 798.3 byte

G.Ajax,a.Puck,a.Page,a.Ford,a.Act I:a.Scene I:a.[Enter Ajax and Puck]Puck:Open thy mind.Ajax:Open thy mind.[Exit Puck][Enter Page]Ajax:Open thy mind.SCENE II:b.[Exeunt][Enter Puck and Ajax]Ajax:Am I as fat as the sum of the cube of a big big cat and a cat?Puck:If not,let us return to scene III.Am I as fat as the sum of you and a big cat?[Exit Puck][Enter Page]Page:If not,let us return to scene III.Am I as fat as the sum of the sum of the cube of a big big cat and a big big big big cat and a big big cat?[Exit Page][Enter Ford]Ajax:If not,let us return to scene III.You is a big big big big big big cat.Speak thy mind.Scene III:c.[Exeunt][Enter Ajax and Puck]Puck:Speak thy mind.You is as fat as I.[Exit Ajax][Enter Page]Page:You is as fat as I.Puck:Open thy mind.Is you as fat as a hog?[Exit Page][Enter Ajax]Puck:If not,let us return to Scene II.Speak thy mind.Ajax:Speak thy mind.

Ungolfed và viết lại bằng ngôn ngữ Sharkspearean:

Four Gentlemen of Verona.

Ajax, a master code-golfer with years of experience.
Puck, a young Java programmer and a strong believer in object-oriented design patterns.
Page, a rapscallion of ill repute.
Ford, a car manufacturer.

Act I: A one-act masterpiece.

Scene I: In which many minds are opened, possibly via the consumption of psychadelic drugs.
[Enter Ajax and Puck]
Puck: Open thy mind.
Ajax: Open thy mind.
[Exit Puck]
[Enter Page]
Ajax: Open thy mind.

SCENE II: In which things are compared.
[Exeunt]
[Enter Puck and Ajax]
Ajax: Am I as hairy as the sum of the cube of a furry purple chihuahua and a summer's day?
Puck: If not, let us proceed to scene III. Am I as half-witted as the sum of you and a cunning squirrel?
[Exit Puck]
[Enter Page]
Page: If not,let us proceed to scene III. Am I as delicious as the sum of the sum of the cube of a warm healthy hamster and a proud handsome charming noble nose and a big old aunt?
[Exit Page]
[Enter Ford]
Ajax: If not, let us proceed to scene III. You are the cube of a tiny small pony. Speak thy mind.

Scene III: In which minds are spoken.
[Exeunt]
[Enter Ajax and Puck]
Puck: Speak thy mind. You are as smelly as I.
[Exit Ajax]
[Enter Page]
Page: You are as oozing as I.
Puck: Open thy mind. Are you as disgusting as a Microsoft?
[Exit Page]
[Enter Ajax]
Puck: If not,let us return to Scene II. Speak thy mind.
Ajax:Speak thy mind.

Trong psuedocode giống như C:

Scene_I:
    Ajax = getchar()
    Puck = getchar()
    Page = getchar()
Scene_II:
    if(Ajax != 'A')
        goto Scene_III
    if(Puck != 'C')
        goto Scene_III
    if(Page != 'T')
        goto Scene_III
    Ford = '@'
    putchar(Ford)
Scene_III:
    putchar(Ajax)
    Ajax = Puck
    Puck = Page
    Page = getchar()
    if(Page != -1)
        goto Scene_II
    putchar(Ajax)
    putchar(Puck)

Yêu cầu tệp đầu vào chứa ít nhất 3 ký tự. Sử dụng "@" làm dấu phân cách và báo cáo kết quả cho thiết bị xuất chuẩn. Tôi đang nhận 10% tiền thưởng vì phần trước cảnh đầu tiên sẽ là trước "@" đầu tiên, giống như giải pháp của Martin Büttner ở trên.

Cách thức hoạt động của nó là đặt "@" nếu thấy ba ký tự "ACT" liên tiếp. Lưu ý điều này có nghĩa là nó sẽ chuyển đổi "ENACTED" thành "EN @ ACTED". Điều này có thể được sửa chữa với chi phí vài trăm byte, nhưng may mắn thay, dường như mọi "ACT" trong các vở kịch đã cho (ít nhất là vài lần tôi đã kiểm tra) là khởi đầu của một cảnh.

Đã thử nghiệm với 1.2.1 SPL được liên kết ở trên. Tôi không chắc liệu nó có hoạt động trên trình thông dịch web hay không. Kịch bản được sử dụng để thử nghiệm là:

#!/bin/bash
set -e
SCRIPT_DIR=`dirname "$0"`
cd "$SCRIPT_DIR"
spl/bin/spl2c <splits.spl >splits.c
gcc -O2 -Wall -Wno-unused -I./spl/include -L./spl/lib -lm -lspl -o splits splits.c
./splits <measureforemeasure >measure.split.txt

Các phần "bí truyền" của SPL khi bạn vượt qua cú pháp là xáo trộn các biến trên "giai đoạn" (nói chung, bạn chỉ muốn có hai ký tự trên sân khấu tại một thời điểm) và biểu diễn các số không đổi. Có 6 danh sách từ nhập khẩu đi kèm với phân phối: tính từ tích cực, tính từ trung tính, tính từ phủ định, danh từ tích cực, danh từ trung tính và danh từ phủ định. Một danh từ tích cực / trung tính (ví dụ như mận hoặc tường đá) là 1, và một danh từ phủ định (ví dụ flirt-gill hoặc Microsoft) là -1. Tính từ tích cực / trung tính (nghĩa là thêu hoặc không đáy) nhân số lượng với 2 và tính từ phủ định (nghĩa là thận béo hoặc không cha) nhân với -2. Các danh sách từ thật đáng buồn thay vì chỉ có 10-20 mục.

Trong cuộc họp tiếp theo, tôi sẽ đề nghị chúng tôi chuyển tất cả mã sản xuất của mình sang Shakespeare vì nó biểu cảm hơn nhiều so với Scala.


2
Golf này càng nhiều càng tốt. Xin vui lòng!
wizzwizz4

1
Mèo thần thánh, tôi đã không nghĩ rằng bất cứ ai thực sự sẽ! Tôi sẽ trao giải này trong 24 giờ, tức là sớm nhất có thể :)
con mèo

2
@ wizzwizz4 - chắc chắn; Tôi sẽ thử ngay khi tôi không có việc phải làm :-). nó sẽ ngắn gọn như thể nó được viết bởi chính người đặt cược
Robert Fraser

2
Bây giờ, tôi có thể thuê ai để thực hiện điều này trên sân khấu?
mèo

3
@cat - Chỉ cần có ba người không an toàn về cân nặng của họ và cho họ xem hình ảnh của một con mèo.
Robert Fraser

12

Võng mạc , 9 - 10% = 8.1 byte

Số lượng byte giả định mã hóa ISO 8859-1.

¶ACT 
=$0

Chèn một =(như một dấu phân cách) ở phía trước mỗi ACTcái được đặt trước bởi một nguồn cấp dữ liệu và theo sau là khoảng trắng.

Hãy thử trực tuyến! (Nhưng bạn sẽ phải tự sao chép trong đầu vào do kích thước của nó.)


Xin chúc mừng đã trả lời 69000 (theo liên kết chia sẻ).
J_F_B_M

@J_F_B_M Bài 69000. Đó là câu hỏi câu trả lời.
wizzwizz4

4

ôi, 51 * .9 * .85 * .8 = 31.2

Chia thành nhiều tập tin. Đầu ra trên stdoutcách nhau bởi a =.

/^ACT/{f++;$0="="$0}{system("echo \""$0"\">>"f*1)}1

+1 Tất cả những gì bạn cần làm bây giờ là xuất tất cả các tệp để stdoutphân tách bằng một ký tự cụ thể và bạn đã hoàn tất!
wizzwizz4

Làm xong. Với phần thưởng, nó có chiều dài gần như nhau.
Rainer P.

+2 ... +2 ........ +2 ............ Không. Hệ thống không cho phép :-( Tuy nhiên tôi sẽ khuyên bạn nên tách chúng bằng một ký tự đó là thậm chí còn ít phổ biến, chẳng hạn như ¬ hay |.
wizzwizz4

3

JavaScript ES6, 28 - 10% = 25,2 byte

s=>s.replace(/\nACT/g,"=$&")

Ngay cả trình bao JS cũng không có tệp I / O nên điều này không thể đủ điều kiện nhận phần thưởng -20%

Dùng thử trực tuyến tại đây (bạn sẽ phải tự dán đầu vào)


Tôi nghĩ rằng bạn có thể lấy ra Tmột byte được lưu.
Mama Fun Roll

Không thay thế loại bỏ dòng ACT?
wizzwizz4

@ wizzwizz4 vì tôi không có $&
Downgoat

@ Doᴡɴɢᴏᴀᴛ Bạn học được điều gì mới mỗi ngày!
wizzwizz4

3

Perl, 66 - 10% - 20% = 47,52 byte

BEGIN{open(S,">0");}++$?,open(S,">$?"),print"=\n"if/^ACT/;print S

Đã thêm một cho -ptùy chọn.


1

Ruby, 30 - 10% - 15% = 23,715 22,95 byte

Chia nhỏ đầu vào $. Phần thưởng 15% được áp dụng vì Ruby chuyển hướng $<trỏ đến tệp được truyền ARGVtheo mặc định nếu được cung cấp hoặc STDINnếu không.

-1 byte bằng cách tận dụng gsubtương tự như giải pháp ES6 @Downgoat nhưng tôi vẫn tận dụng hy vọng ACTchỉ xuất hiện ở nhãn ACT chứ không phải bên trong bất kỳ từ nào khác, chỉ vì

$><<$<.read.gsub("ACT","$ACT")

Ngoài ra, giải pháp byte 41.004 (ban đầu là 67) của tôi cũng xuất ra tệp. Bắt đầu có lẽ là lần duy nhất eachlệnh lưu byte maptrong Ruby, vì eachtrả về mảng được truyền không bị biến đổi sau khi chạy khối của nó, không giống như map.

i=-1;$><<$<.read.split(/(?=ACT)/).each{|s|open("#{i+=1}",?w)<<s}*?$
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.