Teilen Sie ein Shakespeare-Skript

13

Herr William Shakespeare schrieb Theaterstücke. Viele Theaterstücke. In diesem Archiv, das jedes seiner Werke enthält, ist jedes seiner Stücke eine lange Datei.
Es muss für eine Bühnenproduktion in Szenen aufgeteilt werden. Da Schauspieler ungeduldig sind, muss Ihr Code so kurz wie möglich sein.

Aufgabe:

Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, um die in dieser Datei enthaltenen Stücke in separate Dateien aufzuteilen , die fortlaufend nummeriert sind und von 1denen jede eine Szene enthält. Sie sollten alle Leerzeichen und Titel beibehalten.

Eingang:

Die Eingabe erfolgt über ein einzelnes Play stdinoder den Dateinamen als Parameter. Du kannst wählen. Das Stück sieht ungefähr so ​​aus:

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

Ausgabe:

Die Ausgabe sollte ungefähr so ​​aussehen:

AKT I



SZENE I Rom. Vor dem Kapitol.


    [Das Grab der ANDRONICI erscheint; die Tribünen
    und Senatoren in der Luft. Geben Sie unten von einer Seite,
    SATURNINUS und seine Nachfolger; und vom anderen
    Seite, BASSIANUS und seine Anhänger; mit Trommel und Farben]

SATURNINUS Edle Patrizier ...
AKT I



SZENE II Ein Wald in der Nähe von Rom. Hörner und Schrei von Hunden gehört.


    [TITUS ANDRONICUS tritt mit Jägern usw. auf. MARCUS,
    LUCIUS, QUINTUS und MARTIUS]

TITUS ANDRONICUS Die Jagd ist eröffnet, der Morgen ist hell und grau,
    Die Felder sind ...
AKT II



SZENE I Rom. Vor dem Palast.


    [Enter AARON]

AARON Nun klettert Tamora ...

etc.

Ausgabe entweder in nummerierte Dateien oder in den stdoutStream (Rückkehr zu Funktionen) mit einem Trennzeichen Ihrer Wahl.

Boni:

  • 10% Wenn Sie das Bit vor Schritt 1 in eine Datei speichern 0. Hinweis: Es darf nicht unterbrochen werden, wenn das Bit vor Act 1 leer ist.
  • 15% Wenn Sie sowohl stdinParameter als auch einen Dateipfad eingeben können
  • 20% Wenn Sie sowohl in Dateien als auch in stdout/ return ausgeben können .
  • 200 Ruf, wenn Sie das kleinste SPL-Programm machen können. Diese Prämie wurde vergeben.

Bestenlisten

Hier ist ein Stack-Snippet , um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

# Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

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

Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

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

Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:

# [><>](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
quelle
16
Ich werde eine Prämie von +200 an die erste gültige Shakespeare Programming Language-Einreichung ausgeben.
Katze
3
Komm schon, jeder weiß, dass CodeGolfs nicht schnell sind. Warum nicht sagen, dass der Tarball bereits ziemlich voll ist, sodass Ihr Code so kurz wie möglich sein sollte?
J_F_B_M
1
@trichoplax Produkte. Ich dachte, so haben es alle gemacht! streicht im Notizbuch durch
wizzwizz4
1
@cat Jetzt geht's los! codegolf.stackexchange.com/a/69360/43394
wizzwizz4
2
@cat - Lass es offen; Ich bin sicher, es gibt kleinere Shakespeare-Lösungen als meine. Meins ist so fett wie die Summe aus einer großen großen Katze und einer Katze.
Robert Fraser

Antworten:

38

Shakespeare Programming Language 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 und in Sharkspearean Sprache umgeschrieben:

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.

Im C-ähnlichen Pseudocode:

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)

Erfordert, dass die Eingabedatei mindestens 3 Zeichen enthält. Verwendet "@" als Begrenzer und meldet die Ergebnisse an stdout. Ich nehme den 10% -Bonus, da der Teil vor der ersten Szene vor dem ersten "@" steht, ähnlich wie bei der obigen Lösung von Martin Büttner.

Die Art und Weise, wie es funktioniert, ist, ein "@" zu setzen, wenn es drei Zeichen "ACT" in einer Reihe sieht. Beachten Sie, dass dies bedeutet, dass "ENACTED" in "EN @ ACTED" umgewandelt wird. Dies kann auf Kosten einiger hundert Bytes behoben werden, aber zum Glück scheint jede "TAT" in den gegebenen Spielen (zumindest die wenigen, die ich überprüft habe) der Beginn einer Szene zu sein.

Getestet mit der oben verlinkten SPL 1.2.1. Ich bin nicht sicher, ob es mit dem Webinterpreter funktioniert. Das zum Testen verwendete Skript war:

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

Die "esoterischen" Teile der SPL, sobald Sie die Syntax überschritten haben, sind das Mischen von Variablen auf "stage" (im Allgemeinen möchten Sie nur zwei Zeichen gleichzeitig auf der Bühne haben) und die Darstellung konstanter Zahlen. Die Distribution enthält 6 Wortlisten mit wichtigen Begriffen: positive Adjektive, neutrale Adjektive, negative Adjektive, positive Substantive, neutrale Substantive und negative Substantive. Ein positives / neutrales Substantiv (dh Pflaume oder Steinmauer) ist 1 und ein negatives Substantiv (dh Flirt-Gill oder Microsoft) ist -1. Positive / neutrale Adjektive (dh gestickt oder bodenlos) multiplizieren die Zahl mit 2 und negative Adjektive (dh fettniert oder vaterlos) multiplizieren mit -2. Die Wortlisten sind mit jeweils nur 10-20 Einträgen leider eher begrenzt.

Bei meinem nächsten Treffen schlage ich vor, dass wir unseren gesamten Produktionscode nach Shakespeare verlagern, weil er weitaus aussagekräftiger ist als Scala.

Robert Fraser
quelle
2
Golf dies so viel wie du kannst. Bitte!
wizzwizz4
1
Heilige Katzen, ich hätte nicht gedacht, dass es jemand tun würde! Ich werde dies in 24 Stunden vergeben, sobald ich kann :)
Katze
2
@ wizzwizz4 - auf jeden Fall; Ich werde es versuchen, wenn ich keine wirkliche Arbeit zu erledigen habe :-). es wird so prägnant sein, als ob es vom Barden selbst geschrieben worden wäre
Robert Fraser
2
Wen kann ich jetzt anheuern, um das auf der Bühne zu spielen?
Katze
3
@cat - Holen Sie sich drei Personen, die sich in Bezug auf ihr Gewicht unsicher sind, und zeigen Sie ihnen ein Bild von einer Katze.
Robert Fraser
12

Netzhaut , 9 - 10% = 8,1 Bytes

Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.

¶ACT 
=$0

Fügt ein =(als Begrenzer) vor jedem ein ACT, dem ein Zeilenvorschub und ein Leerzeichen vorausgeht.

Probieren Sie es online! (Aufgrund der Größe müssen Sie die Eingabe jedoch selbst kopieren.)

Martin Ender
quelle
Herzlichen Glückwunsch zur Beantwortung von 69000 (laut Share-Link).
J_F_B_M
@J_F_B_M Beitrag 69000. Das sind Fragen und Antworten.
wizzwizz4
4

awk, 51 * .9 * .85 * .8 = 31,2

Teilt sich in mehrere Dateien. Ausgänge an stdoutdurch a getrennt =.

/^ACT/{f++;$0="="$0}{system("echo \""$0"\">>"f*1)}1
Rainer P.
quelle
+1 Jetzt müssen Sie nur noch alle Dateien ausgeben, stdoutum sie durch ein bestimmtes Zeichen zu trennen. Fertig!
wizzwizz4
Erledigt. Mit dem Bonus ist es fast die gleiche Länge.
Rainer P.
+2 ... +2 ........ +2 ............ Nein. Das System erlaubt es nicht :-( Ich würde jedoch empfehlen, sie durch ein Zeichen zu trennen das kommt noch seltener vor, wie ¬ oder ¦
wizzwizz4
3

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

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

Nicht einmal die JS-Shell verfügt über Datei-E / A, daher kann sich dies nicht für den -20% -Bonus qualifizieren

Probieren Sie es hier online aus (Sie müssen die Eingabe in sich selbst einfügen)

Downgoat
quelle
Ich denke, dass Sie die Tfür ein Byte gesparten herausnehmen können.
Mama Fun Roll
Ersetzt nicht entfernen Sie die ACT-Linie?
wizzwizz4
@ wizzwizz4 weil ich das $&nicht habe
Downgoat
@ Doᴡɴɢᴏᴀᴛ Du lernst jeden Tag etwas Neues!
wizzwizz4
3

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

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

Für die -pOption wurde eine hinzugefügt .

Neil
quelle
1

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

Teilt die Eingabe auf $. 15% Bonus gelten, weil Ruby umleitet $<, um auf die Datei zu verweisen, an die ARGVstandardmäßig weitergeleitet wird, ob sie geliefert wird oder STDINnicht.

-1 Byte durch Nutzung gsubähnlich der @ Downgoat ES6-Lösung, aber ich nutze immer noch die Hoffnung, die ACTnur auf den ACT-Labels und nicht in einem anderen Wort auftaucht, nur weil

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

Auch meine 41.004 (ursprünglich 67) Byte Lösung, die auch die Dateiausgabe erledigt. Wahrscheinlich das einzige Mal, dass der eachBefehl Bytes mapin Ruby speichert , weileach das Array im Gegensatz zu nach dem Ausführen seines Blocks unverfälscht übergeben wird map.

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