Разделить сценарий Шекспира

13

Мистер Уильям Шекспир написал пьесы. Много пьес. В этом архиве, содержащем все его работы, каждая его пьеса представляет собой один длинный файл.
Это должно быть разделено на Сцены для сценического производства. Поскольку актеры нетерпеливы, ваш код должен быть максимально коротким.

Задача:

Ваша задача - написать программу или функцию для разделения пьес, содержащихся в этом файле, на отдельные файлы, пронумерованные последовательно, начиная с 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
[...]

Выход:

Вывод должен выглядеть примерно так:

ACT I



СЦЕНА I Рим. До Капитолия.


    [Могила АНДРОНИКИ появляется; трибуны
    и сенаторы наверху. Введите ниже, с одной стороны,
    САТУРНИН и его последователи; а с другой
    сторона, BASSIANUS и его последователи; с барабаном и цветами]

Сатурнин Благородные патриции ...
ACT I



СЦЕНА II Лес под Римом. Рожки и крик гончих слышны.


    [Введите TITUS ANDRONICUS, с Охотниками и т. Д., Маркус,
    ЛЮЦИЙ, КВИНТ и МАРТИЙ]

TITUS ANDRONICUS Охота закончена, утро яркое и серое,
    Поля ...
ACT II



СЦЕНА I Рим. Перед дворцом.


    [Введите AARON]

Аарон Теперь поднимается на Тамору ...

и т.п.

Выведите либо в пронумерованные файлы, либо в stdoutпоток (возвращая для функций) с разделителем по вашему выбору.

Бонусы:

  • 10% Если вы сохраните бит перед Актом 1 в файл 0. Примечание: оно не должно прерываться, если бит перед действием 1 пуст.
  • 15% Если вы можете принять оба параметра stdinи путь к файлу ввода параметров
  • 20% Если вы можете выводить как в файлы, так и в stdout/ возврат.
  • 200 репутации, если вы можете сделать самую маленькую программу SPL. Эта награда была присуждена.

Leaderboards

Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

# Language Name, N bytes

где Nразмер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:

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

Если вы хотите включить в свой заголовок несколько чисел (например, потому что ваш счет равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:

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

wizzwizz4
источник
16
Я выдам +200 наград за первую действительную заявку на язык программирования Шекспира.
кот
3
Да ладно, все знают, что CodeGolfs не быстрые. Почему бы не сказать, что «тарбол уже заполнен, поэтому ваш код должен быть как можно короче»?
J_F_B_M
1
@trichoplax Продукты. Я думал, что так все и сделали! вычеркивает в тетради
вычеркивает
1
@cat Вот, пожалуйста! codegolf.stackexchange.com/a/69360/43394
wizzwizz4
2
@cat - оставь его открытым; Я уверен, что у Шекспира меньше решений, чем у меня. Мой толстый, как сумма большого большого большого кота и кошки.
Роберт Фрейзер

Ответы:

38

Язык программирования Шекспира 1.2.1 , 930 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.

Разоблаченный и переписанный на 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.

В C-подобном psuedocode:

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 символов. Использует "@" в качестве разделителя и сообщает о результатах на стандартный вывод. Я беру 10% бонуса, так как часть до первой сцены будет перед первым «@», очень похоже на решение Мартина Бюттнера, описанное выше.

Как это работает, это поставить «@», если он видит три символа «ACT» подряд. Обратите внимание, что это означает, что он преобразует «ENACTED» в «EN @ ACTED». Это можно исправить стоимостью в несколько сотен байт, но, к счастью, каждый «ACT» в данных пьесах (по крайней мере, те немногие, которые я проверил) был началом сцены.

Протестировано с 1.2.1 SPL, указанным выше. Я не уверен, будет ли это работать на веб-переводчике. Скрипт, использованный для тестирования, был:

#!/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 после прохождения синтаксиса - это перетасовка переменных на «сцене» (как правило, вы хотите иметь только два символа на сцене за раз) и представление постоянных чисел. Имеется 6 списков слов, которые идут вместе с распределением: положительные прилагательные, нейтральные прилагательные, отрицательные прилагательные, положительные существительные, нейтральные существительные и отрицательные существительные. Положительное / нейтральное существительное (например, сливовая или каменная стена) равно 1, а отрицательное существительное (например, flirt-gill или Microsoft) равно -1. Положительные / нейтральные прилагательные (т. Е. Вышитые или бездонные) умножают число на 2, а отрицательные прилагательные (т. Е. Толстые или без отца) умножают на -2. Списки слов, к сожалению, довольно ограничены, всего 10-20 записей в каждом.

На моей следующей встрече я предлагаю перенести весь наш производственный код в Шекспир, потому что он гораздо более выразителен, чем Scala.

Роберт Фрейзер
источник
2
Гольф это столько, сколько вы можете. Пожалуйста!
wizzwizz4 13.01.16
1
Святые коты, я не думал, что кто-то на самом деле Я награжу это через 24 часа, а это как только смогу :)
кошка
2
@ wizzwizz4 - определенно; Я сделаю это, когда у меня не будет реальной работы :-). это будет так кратко, как если бы оно было написано самим бардом
Роберт Фрейзер
2
Теперь, кого я могу нанять, чтобы выполнить это на сцене?
кот
3
@cat - Просто найдите трех человек, которые не уверены в своем весе, и покажите им фотографию кота.
Роберт Фрейзер
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
Выполнено. С бонусом это почти одинаковая длина.
Райнер П.
+2 ... +2 ........ +2 ............ Нет. Система не позволяет этого :-( Однако я бы рекомендовал разделять их символом это еще реже , например, ¬ или ¦.
wizzwizz4
3

JavaScript ES6, 28 - 10% = 25,2 байта

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

Даже в оболочке JS нет файлового ввода-вывода, так что это не может претендовать на бонус -20%

Попробуйте онлайн здесь (вам придется вставить данные в себя)

Downgoat
источник
Я думаю, что вы можете вынести Tза один сохраненный байт.
Mama Fun Roll
Не заменить удалить строку 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если нет.

-1 байт, используя gsubаналогично решению @Downgoat ES6, но я все еще использую надежду, которая 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}*?$
Значение чернил
источник