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 1
denen jede eine Szene enthält. Sie sollten alle Leerzeichen und Titel beibehalten.
Eingang:
Die Eingabe erfolgt über ein einzelnes Play stdin
oder 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 stdout
Stream (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
stdin
Parameter 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 N
ist 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>
Antworten:
Shakespeare Programming Language 1.2.1 ,
930895887 - 10% = 798,3 ByteUngolfed und in Sharkspearean Sprache umgeschrieben:
Im C-ähnlichen Pseudocode:
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:
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.
quelle
Netzhaut , 9 - 10% = 8,1 Bytes
Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.
Fügt ein
=
(als Begrenzer) vor jedem einACT
, dem ein Zeilenvorschub und ein Leerzeichen vorausgeht.Probieren Sie es online! (Aufgrund der Größe müssen Sie die Eingabe jedoch selbst kopieren.)
quelle
awk, 51 * .9 * .85 * .8 = 31,2
Teilt sich in mehrere Dateien. Ausgänge an
stdout
durch a getrennt=
.quelle
stdout
um sie durch ein bestimmtes Zeichen zu trennen. Fertig!JavaScript ES6, 28 - 10% = 25,2 Byte
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)
quelle
T
für ein Byte gesparten herausnehmen können.$&
nicht habePerl, 66 - 10% - 20% = 47,52 Bytes
Für die
-p
Option wurde eine hinzugefügt .quelle
Ruby, 30 - 10% - 15% =
23,715 -22,95 BytesTeilt die Eingabe auf
$
. 15% Bonus gelten, weil Ruby umleitet$<
, um auf die Datei zu verweisen, an dieARGV
standardmäßig weitergeleitet wird, ob sie geliefert wird oderSTDIN
nicht.-1 Byte durch Nutzung
gsub
ähnlich der @ Downgoat ES6-Lösung, aber ich nutze immer noch die Hoffnung, dieACT
nur auf den ACT-Labels und nicht in einem anderen Wort auftaucht, nur weilAuch meine 41.004 (ursprünglich 67) Byte Lösung, die auch die Dateiausgabe erledigt. Wahrscheinlich das einzige Mal, dass der
each
Befehl Bytesmap
in Ruby speichert , weileach
das Array im Gegensatz zu nach dem Ausführen seines Blocks unverfälscht übergeben wirdmap
.quelle