Split a Shakespeare Script

13

William Shakespeare menulis drama. Banyak permainan. Dalam tarball ini yang berisi setiap karya-karyanya, setiap permainannya adalah satu file yang panjang.
Itu perlu dibagi menjadi Adegan untuk produksi panggung. Karena aktor tidak sabar, kode Anda harus sesingkat mungkin.

Tugas:

Tugas Anda adalah menulis sebuah program atau fungsi untuk membagi permainan yang terkandung dalam file ini menjadi file-file terpisah, diberi nomor mulai dari 1mana, masing-masing berisi adegan. Anda harus mempertahankan semua spasi dan judul.

Memasukkan:

Input akan berupa pemutaran tunggal stdin, atau nama file sebagai parameter. Kamu bisa memilih. Drama akan terlihat seperti:

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

Keluaran:

Outputnya akan terlihat seperti ini:

ACT I



ADEGAN I Roma. Sebelum Capitol.


    [Makam ANDRONICI muncul; Tribunes
    dan Senator tinggi-tinggi. Masukkan, di bawah, dari satu sisi,
    SATURNINUS dan Pengikutnya; dan, dari yang lain
    sisi, BASSIANUS dan para Pengikutnya; dengan drum dan warna]

SATURNINUS Ahli ningrat yang mulia ...
ACT I



SCENE II Hutan di dekat Roma. Klakson dan teriakan anjing terdengar.


    [Masukkan TITUS ANDRONICUS, dengan Hunters, & c., MARCUS,
    LUCIUS, QUINTUS, dan MARTIUS]

TITUS ANDRONICUS Perburuan habis, pagi cerah dan abu-abu,
    Lapangan adalah ...
ACT II



ADEGAN I Roma. Sebelum Istana.


    [Masukkan AARON]

AARON Sekarang naik Tamora ...

dll.

Keluaran baik ke file bernomor, atau ke stdoutaliran (kembali untuk fungsi) dengan pembatas pilihan Anda.

Bonus:

  • 10% Jika Anda menyimpan bit sebelum Babak 1 ke dalam file 0. Catatan: Tidak boleh rusak jika bit sebelum Act 1 kosong.
  • 15% Jika Anda dapat mengambil keduanya stdindan input parameter path file
  • 20% Jika Anda dapat menampilkan file dan stdout/ kembali.
  • 200 reputasi jika Anda dapat membuat program SPL terkecil. Karunia ini telah diberikan.

Papan peringkat

Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:

# [><>](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>

wizzwizz4
sumber
16
Saya akan memberikan hadiah +200 untuk pengiriman Bahasa Pemrograman Shakespeare yang valid pertama.
kucing
3
Ayo, semua orang tahu bahwa CodeGolfs tidak cepat. Mengapa tidak mengatakan bahwa "Tarball sudah cukup penuh, jadi kode Anda harus sesingkat mungkin"?
J_F_B_M
1
@trichoplax Products. Saya pikir itu adalah bagaimana semua orang melakukannya! mencoret di notebook
wizzwizz4
1
@cat Ini dia! codegolf.stackexchange.com/a/69360/43394
wizzwizz4
2
@ kucing - Biarkan terbuka; Saya yakin ada solusi Shakespeare yang lebih kecil daripada milik saya. Milikku sama gemuknya dengan jumlah kucing besar dan kucing besar.
Robert Fraser

Jawaban:

38

Bahasa Pemrograman 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.

Tidak disatukan dan ditulis ulang dalam bahasa 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.

Dalam psuedocode mirip 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)

Membutuhkan file input minimal mengandung 3 karakter. Menggunakan "@" sebagai pembatas dan melaporkan hasil ke stdout. Saya mengambil bonus 10% karena bagian sebelum adegan pertama akan sebelum "@" pertama, seperti solusi Martin Büttner di atas.

Cara kerjanya adalah dengan meletakkan "@" jika ia melihat tiga karakter "ACT" berturut-turut. Perhatikan ini berarti akan mengubah "ENACTED" menjadi "EN @ ACTED". Ini dapat diperbaiki dengan biaya beberapa ratus byte, tetapi untungnya tampaknya setiap "ACT" dalam drama yang diberikan (setidaknya beberapa yang saya periksa) adalah awal dari sebuah adegan.

Diuji dengan 1.2.1 SPL yang ditautkan di atas. Saya tidak yakin apakah itu akan berfungsi pada juru bahasa web. Script yang digunakan untuk pengujian adalah:

#!/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

Bagian "esoterik" dari SPL setelah Anda melewati sintaks adalah pengocokan variabel pada "panggung" (umumnya, Anda hanya ingin memiliki dua karakter di atas panggung pada suatu waktu) dan representasi angka konstan. Ada 6 daftar kata impor yang disertakan dengan distribusi: kata sifat positif, kata sifat netral, kata sifat negatif, kata benda positif, kata benda netral, dan kata benda negatif. Kata benda positif / netral (yaitu prem atau dinding batu) adalah 1, dan kata benda negatif (yaitu flirt-gill atau Microsoft) adalah -1. Kata sifat positif / netral (yaitu sulaman atau jurang) mengalikan angka dengan 2, dan kata sifat negatif (yaitu lemak-ginjal atau tanpa ayah) dikalikan dengan -2. Sedih kata daftar agak terbatas, dengan hanya 10-20 entri masing-masing.

Pada pertemuan saya berikutnya, saya akan menyarankan agar kami memindahkan semua kode produksi kami ke Shakespeare karena jauh lebih ekspresif daripada Scala.

Robert Fraser
sumber
2
Golf ini sebanyak yang Anda bisa. Silahkan!
wizzwizz4
1
Kucing suci, saya tidak berpikir ada orang yang akan melakukannya! Saya akan memberikan ini dalam 24 jam, yang secepat saya bisa :)
cat
2
@ wizzwizz4 - pasti; Saya akan mencobanya ketika saya tidak memiliki pekerjaan nyata untuk dilakukan :-). itu akan menjadi seakurat seolah-olah itu ditulis oleh sang Bard sendiri
Robert Fraser
2
Sekarang, siapa yang bisa saya pekerjakan untuk melakukan ini di atas panggung?
kucing
3
@ kucing - Hanya mendapatkan tiga orang yang tidak aman tentang berat badan mereka dan menunjukkan kepada mereka gambar kucing.
Robert Fraser
12

Retina , 9 - 10% = 8,1 byte

Hitungan byte mengasumsikan penyandian ISO 8859-1.

¶ACT 
=$0

Menyisipkan a =(sebagai pembatas) di depan setiap ACTyang didahului oleh linefeed dan diikuti oleh spasi.

Cobalah online! (Tetapi Anda harus menyalin sendiri input karena ukurannya.)

Martin Ender
sumber
Selamat menjawab 69000 (sesuai dengan tautan berbagi).
J_F_B_M
@J_F_B_M Posting 69000. Itu pertanyaan dan jawaban.
wizzwizz4
4

awk, 51 * .9 * .85 * .8 = 31.2

Membagi menjadi beberapa file. Output pada stdoutdipisahkan oleh a =.

/^ACT/{f++;$0="="$0}{system("echo \""$0"\">>"f*1)}1
Rainer P.
sumber
+1 Yang perlu Anda lakukan sekarang adalah meng-output semua file untuk stdoutdipisahkan oleh karakter tertentu, dan Anda selesai!
wizzwizz4
Selesai Dengan bonus itu hampir sama panjangnya.
Rainer P.
+2 ... +2 ........ +2 ............ Tidak. Sistem tidak mengizinkannya :-( Namun saya akan merekomendasikan memisahkan mereka dengan karakter itu bahkan lebih jarang, seperti ¬ atau ¦.
wizzwizz4
3

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

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

Bahkan shell JS tidak memiliki file I / O sehingga ini tidak memenuhi syarat untuk bonus -20%

Coba online di sini (Anda harus menempelkan input ke diri Anda sendiri)

Downgoat
sumber
Saya pikir Anda dapat mengambil Tuntuk satu byte yang disimpan.
Mama Fun Roll
Tidak mengganti hapus garis ACT?
wizzwizz4
@ wizzwizz4 karena saya memilikinya $&tidak akan
Downgoat
@ Doᴡɴɢᴏᴀᴛ Anda mempelajari sesuatu yang baru setiap hari!
wizzwizz4
3

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

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

Menambahkan satu untuk -popsi.

Neil
sumber
1

Ruby, 30 - 10% - 15% = 23.715 22,95 byte

Membagi input aktif $. Bonus 15% berlaku karena Ruby mengalihkan$< ke file yang diteruskan ARGVsecara default jika disediakan, atau STDINjika tidak.

-1 byte dengan memanfaatkan gsubmirip dengan solusi @Downgoat ES6 tapi saya masih memanfaatkan harapan yang ACThanya pernah muncul di label ACT dan tidak di dalam kata lain, hanya karena

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

Juga, solusi byte 41,004 saya (awalnya 67) yang juga melakukan output file. Dibintangi mungkin satu-satunya saat eachperintah menyimpan byte di mapdalam Ruby, karena eachmengembalikan array yang dilewatkan secara tidak murni setelah menjalankan bloknya, tidak seperti map.

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