シェークスピアスクリプトを分割する


13

ウィリアム・シェークスピア氏が脚本を書きました。たくさんの演劇。彼のすべての作品を含むこのtarballでは、彼の演劇はそれぞれ1つの長いファイルです。
ステージ制作のためにシーンに分割する必要があります。アクターは短気なので、コードはできるだけ短くする必要があります。

仕事:

あなたの仕事は、このファイルに含まれる演劇をから始まる番号が付けられた別々のファイルに分割するプログラムまたは関数を書くこと1です。すべての空白とタイトルを保持する必要があります。

入力:

入力は、を介したシングルプレイstdin、またはパラメーターとしてのファイル名になります。選んでいいですよ。プレイは次のようになります。

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

出力:

出力は次のようになります。

第1幕



シーンIローマ。国会議事堂の前。


    [登場するアンドロニッチの墓; トライバンズ
    上院議員 片側から下に入力します
    SATURNINUSと彼のフォロワー。そして、他から
    側、BASSIANUSと彼のフォロワー。ドラムと色付き]

SATURNINUS貴族の貴族...
第1幕



シーンIIローマの近くの森。角と猟犬の鳴き声が聞こえた。


    [TITUS ANDRONICUSに入り、ハンター、&c。、MARCUS、
    LUCIUS、QUINTUS、およびMARTIUS]

TITUS ANDRONICUS狩りは終わり、朝は明るく灰色になり、
    フィールドは...
第2幕



シーンIローマ。宮殿の前。


    [アーロンを入力]

アーロンはタモラを登る...

stdout選択したデリミネーターを使用して、番号付きファイルまたはストリーム(関数に戻る)に出力します。

ボーナス:

  • 10%Act 1の前のビットをfileに保存した場合0。注:Act 1の前のビットが空の場合は、ブレークしてはなりません。
  • 15%両方stdinとファイルパスパラメーターの入力を使用できる場合
  • 20%ファイルと出力の両方に出力できる場合stdout/戻ります。
  • 最小のSPLプログラムを作成できる場合、200の評判この賞金は授与されました。

リーダーボード

これは、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

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

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

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

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

# [><>](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
最初の有効なシェークスピアプログラミング言語の提出に対して+200の賞金を差し上げます。

3
さあ、誰もがCodeGolfsが高速でないことを知っています。「tarballはすでにかなりいっぱいになっているので、コードはできるだけ短くすべきだ」と言ってはどうですか?
J_F_B_M

1
@trichoplax製品。それがみんなのやり方だと思いました!ノートブックで
消す-wizzwizz4

1
@catここに行きます!codegolf.stackexchange.com/a/69360/43394
wizzwizz4

2
@cat-開いたままにします。私よりも小さなシェイクスピアのソリューションがあると確信しています。私のものは、大きな大きな大きな猫と猫の合計と同じくらい太っています。
ロバートフレイザー

回答:


38

シェークスピアプログラミング言語1.2.1930 895 887から10パーセント= 798.3バイト

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.

シャークスペリア語で書き直され、書き直されていない:

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.

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)

入力ファイルには少なくとも3文字が必要です。「@」を区切り文字として使用し、結果を標準出力に報告します。上記のMartinBüttnerのソリューションのように、最初のシーンの前の部分が最初の「@」の前になるため、10%のボーナスを受け取ります。

動作する方法は、3つの文字「ACT」が連続している場合に「@」を入力することです。これは、「ENACTED」を「EN @ ACTED」に変換することに注意してください。これは数百バイトのコストで修正できますが、幸いなことに、特定の演劇(少なくとも私がチェックしたいくつか)のすべての「ACT」がシーンの始まりであるようです。

上記リンクの1.2.1 SPLでテスト済み。Webインタプリタで動作するかどうかはわかりません。テストに使用したスクリプトは次のとおりです。

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

構文を通過した後のSPLの「難解な」部分は、「ステージ」での変数のシャッフル(一般に、一度にステージに2つの文字のみを配置したい)と定数の表現です。分布には、正の形容詞、中立形容詞、負の形容詞、正名詞、中立名詞、負名詞の6つの単語リストがあります。正/中立の名詞(プラムまたは石垣)は1、負の名詞(浮気ギルまたはマイクロソフト)は-1です。正/中立的な形容詞(つまり刺繍または底なし)は数値を2倍し、負の形容詞(つまり太った腎臓または父親なし)は-2倍します。単語リストは残念ながらかなり制限されており、それぞれ10〜20エントリしかありません。

次回の会議では、Scalaよりもはるかに表現力が高いため、すべての製品コードをシェークスピアに移動することを提案します。


2
これをできるだけ多くゴルフしてください。お願いします!
wizzwizz4

1
神聖な猫、私は誰も実際にそうなるとは思いませんでした!これは24時間以内に授与されますが、できるだけ早く:)
cat

2
@ wizzwizz4-間違いなく; 実際に仕事をする必要がないときは試してみます:-)。それはまるで吟遊詩人自身によって書かれたかのように簡潔になります
ロバートフレイザー

2
さて、これを舞台で誰に雇うことができますか?

3
@cat-体重が不安な3人を集めて、猫の写真を見せてください。
ロバートフレイザー

12

網膜、9-10%= 8.1バイト

バイトカウントはISO 8859-1エンコードを前提としています。

¶ACT 
=$0

ラインフィードが先行し、スペースが続く=すべての前に(区切り文字として)を挿入しACTます。

オンラインでお試しください!(しかし、そのサイズのために入力を自分でコピーする必要があります。)


おめでとうございます69000(共有リンクによる)に答えてください。
J_F_B_M

@J_F_B_M 69000以降。質問回答です。
wizzwizz4

4

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

複数のファイルに分割します。でstdout区切って出力し=ます。

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

+1ここで必要なのは、すべてのファイルをstdout特定の文字で区切って出力することです。これで完了です。
wizzwizz4

できた ボーナスでは、ほぼ同じ長さです。
レイナーP.

+2 ... +2 ........ +2 ............いいえ。システムでは許可されていません:-(ただし、文字で区切ることをお勧めします¬やasなど、さらに一般的ではありません
。– wizzwizz4

3

JavaScript ES6、28-10%= 25.2バイト

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

JSシェルにもファイルI / Oがないため、これは-20%のボーナスの対象になりません

ここでオンラインで試してください(自分で入力を貼り付ける必要があります)


T節約された1バイト分を取り出すことができると思います。
ママファンロール

交換してACT行を削除しませんか?
wizzwizz4

@ wizzwizz4私が持って$&いないので
Downgoat

@Doᴡɴɢᴏᴀᴛあなたは毎日新しいことを学びます!
wizzwizz4

3

Perl、66-10%-20%= 47.52バイト

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

-pオプション用に追加されました。


1

ルビー、30-10%-15%= 23.715 22.95バイト

入力を分割します$。15%のボーナスが適用されるのは、Rubyがリダイレクト$<されるのはARGV、デフォルトで渡されたファイルが指定されている場合、または指定されていない場合にリダイレクトするためですSTDIN

gsub@Downgoat ES6ソリューションと同様に活用することで-1バイトですがACT、ACTラベルにのみ表示され、他の単語には表示されないという希望を活用しています。

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

また、私の ファイル出力も行う 41.004(元は67)バイトのソリューション。おそらく、eachコマンドmapがRubyでバイトを節約するのはeach、ブロックとは異なり、ブロックを実行した後にそのまま渡された配列を返すためmapです。

i=-1;$><<$<.read.split(/(?=ACT)/).each{|s|open("#{i+=1}",?w)<<s}*?$
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.