Podziel skrypt Szekspira

13

William Shakespeare napisał sztuki. Dużo sztuk. W tym archiwum zawierającym każdy jego utwór, każda jego sztuka jest jednym długim plikiem.
Musi być podzielony na Sceny do produkcji scenicznej. Ponieważ aktorzy są niecierpliwi, Twój kod musi być jak najkrótszy.

Zadanie:

Twoim zadaniem jest napisanie programu lub funkcji do podzielenia odtworzeń zawartych w tym pliku na osobne pliki, ponumerowane kolejno począwszy od 1, z których każda zawiera scenę. Powinieneś zachować wszystkie białe znaki i tytuły.

Wejście:

Wejście będzie pojedynczym odtwarzaniem za pomocą stdinlub nazwą pliku jako parametrem. Możesz wybrać. Sztuka będzie wyglądać mniej więcej tak:

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

Wynik:

Dane wyjściowe powinny wyglądać mniej więcej tak:

AKT I



SCENA I Rzym. Przed Kapitolem.


    [Pojawia się grób ANDRONICI; Trybuny
    i senatorzy w górze. Wpisz poniżej z jednej strony,
    SATURNINUS i jego wyznawcy; i z drugiej
    po stronie, BASSIANUS i jego wyznawcy; z bębnem i kolorami]

SATURNINUS Szlachetni patrycjusze ...
AKT I



SCENA II Las pod Rzymem. Usłyszeli rogi i płacz psów.


    [Wpisz TITUS ANDRONICUS, z Hunters, i c., MARCUS,
    LUCIUS, QUINTUS i MARTIUS]

TITUS ANDRONICUS Polowanie się skończyło, poranek jest jasny i szary,
    Pola są ...
AKT II



SCENA I Rzym. Przed pałacem.


    [Wpisz AARON]

AARON Teraz wspina się na Tamorę ...

itp.

Wyjście albo do plików ponumerowanych, albo do stdoutstrumienia (powrót do funkcji) z wybranym przez siebie ogranicznikiem.

Bonusy:

  • 10% Jeśli zapiszesz bit przed Aktem 1 do pliku 0. Uwaga: nie może się złamać, jeśli bit przed Aktem 1 jest pusty.
  • 15% Jeśli możesz wziąć oba stdinparametry wejściowe i parametr ścieżki pliku
  • 20% Jeśli możesz wyprowadzać zarówno do plików, jak i do stdout/ return.
  • 200 reputacji, jeśli możesz zrobić najmniejszy program SPL. Ta nagroda została przyznana.

Liderów

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:

# [><>](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
źródło
16
Przyznam nagrodę w wysokości +200 za pierwsze ważne zgłoszenie Szekspira w języku programowania.
kot
3
Chodź, wszyscy wiedzą, że CodeGolfs nie są szybcy. Dlaczego nie powiesz, że „Paczka jest już dość pełna, więc kod powinien być możliwie jak najkrótszy”?
J_F_B_M
1
Produkty @trichoplax. Myślałem, że tak wszyscy to zrobili! przekreśla w zeszycie
wizzwizz4
1
@cat Proszę bardzo! codegolf.stackexchange.com/a/69360/43394
wizzwizz4
2
@cat - Pozostaw otwarte; Jestem pewien, że istnieją mniejsze rozwiązania Szekspira niż moje. Mój jest tak gruby jak suma dużego dużego kota i kota.
Robert Fraser

Odpowiedzi:

38

Język programowania Szekspira 1.2.1 , 930 895 887 - 10% = 798,3 bajtów

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.

Niepolecane i przepisane w języku 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.

W psuedocode podobnym do 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)

Wymaga, aby plik wejściowy zawierał co najmniej 3 znaki. Używa „@” jako separatora i zgłasza wyniki na standardowe wyjście. Biorę bonus 10%, ponieważ część przed pierwszą sceną będzie przed pierwszym „@”, podobnie jak powyższe rozwiązanie Martina Büttnera.

Działa to tak, aby wstawić „@”, jeśli widzi trzy znaki „ACT” z rzędu. Uwaga: oznacza to, że przekształciłby „ENACTED” w „EN @ ACTED”. Można to naprawić kosztem kilkuset bajtów, ale na szczęście wydaje się, że każda „AKCJA” w danej grze (przynajmniej kilka, które sprawdziłem) była początkiem sceny.

Testowane z SPL 1.2.1 połączonym powyżej. Nie jestem pewien, czy to zadziała w tłumaczu internetowym. Skrypt użyty do testowania to:

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

„Ezoteryczne” części SPL po przekroczeniu składni to tasowanie zmiennych na „scenie” (na ogół chcesz mieć na scenie tylko dwa znaki na raz) i reprezentacja liczb stałych. Istnieje 6 list słów importowych, które pochodzą z dystrybucji: przymiotniki pozytywne, przymiotniki neutralne, przymiotniki przeczące, rzeczowniki dodatnie, rzeczowniki neutralne i rzeczowniki przeczące. Rzeczownik dodatni / neutralny (tj. Śliwka lub kamienna ściana) wynosi 1, a rzeczownik negatywny (tj. Flirt-blaszka lub Microsoft) wynosi -1. Pozytywne / neutralne przymiotniki (tj. Haftowane lub bez dna) mnożą liczbę przez 2, a przymiotniki przeczące (tj. Nerki tłuszczowe lub bez ojca) mnożą przez -2. Listy słów są niestety dość ograniczone, każda zawiera tylko 10-20 wpisów.

Na następnym spotkaniu zasugeruję przeniesienie całego naszego kodu produkcyjnego do Szekspira, ponieważ jest on o wiele bardziej wyrazisty niż Scala.

Robert Fraser
źródło
2
Zagraj w golfa jak najwięcej. Proszę!
wizzwizz4
1
Święte koty, nie sądziłem, że ktokolwiek by to zrobił! Przyznam to w ciągu 24 godzin, czyli tak szybko, jak to możliwe :)
kot
2
@ wizzwizz4 - zdecydowanie; dam mu szansę, gdy nie mam prawdziwej pracy :-). będzie tak zwięzły, jakby napisał go sam bard
Robert Fraser
2
Kogo mogę teraz zatrudnić do wykonania tego na scenie?
kot
3
@cat - Zdobądź trzy osoby, które nie są pewne swojej wagi i pokaż im zdjęcie kota.
Robert Fraser,
12

Siatkówka , 9–10% = 8,1 bajtów

Liczba bajtów zakłada kodowanie ISO 8859-1.

¶ACT 
=$0

Wstawia =(jako ogranicznik) przed każdym, ACTktóry jest poprzedzony linią, a po nim spacją.

Wypróbuj online! (Ale musisz sam skopiować dane wejściowe ze względu na ich rozmiar).

Martin Ender
źródło
Gratulujemy odpowiedzi 69000 (zgodnie z linkiem udostępniania).
J_F_B_M
@J_F_B_M Post 69000. To pytania i odpowiedzi.
wizzwizz4
4

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

Dzieli się na wiele plików. Wyjścia są stdoutoddzielone znakiem a =.

/^ACT/{f++;$0="="$0}{system("echo \""$0"\">>"f*1)}1
Rainer P.
źródło
+1 Wszystko, co musisz teraz zrobić, to wypisać wszystkie pliki do stdoutosobnych znaków i gotowe!
wizzwizz4
Gotowy. Z premią ma prawie taką samą długość.
Rainer P.
+2 ... +2 ........ +2 ............ Nie. System nie pozwala na to :-( Zalecałbym jednak oddzielenie ich znakiem jest to jeszcze mniej powszechne, takie jak ¬ lub ¦.
wizzwizz4
3

JavaScript ES6, 28–10% = 25,2 bajtów

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

Nawet powłoka JS nie ma plików I / O, więc nie może się kwalifikować do premii -20%

Wypróbuj online tutaj (musisz wkleić dane wejściowe w sobie)

Downgoat
źródło
Myślę, że możesz wyjąć Tzapisany jeden bajt.
Mama Fun Roll
Nie zastępuje usuń linii ACT?
wizzwizz4,
@ wizzwizz4, bo mam, że $&nie będzie
Downgoat
@ Doᴡɴɢᴏᴀᴛ Każdego dnia uczysz się czegoś nowego!
wizzwizz4
3

Perl, 66 - 10% - 20% = 47,52 bajtów

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

Dodano jeden dla -popcji.

Neil
źródło
1

Rubinowy, 30–10 % - 15% = 23,715 22,95 bajtów

Dzieli wejście $. Bonus 15% obowiązuje, ponieważ Ruby przekierowuje w $<celu wskazania pliku przekazanego ARGVdomyślnie, jeśli jest dostarczony, lub STDINjeśli nie.

-1 bajt, wykorzystując gsubpodobne do rozwiązania @Downgoat ES6, ale wciąż mam nadzieję, że ACTkiedykolwiek pojawia się tylko na etykietach ACT, a nie w żadnym innym słowie, tylko dlatego, że

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

Ponadto moje 41.004 (pierwotnie 67) bajtowe rozwiązanie, które również generuje dane wyjściowe pliku. Występuje prawdopodobnie tylko raz, gdy eachkomenda oszczędza bajty mapw Rubim, ponieważ eachzwraca tablicę przekazaną w niezmienionej postaci po uruchomieniu bloku, w przeciwieństwie do tego map.

i=-1;$><<$<.read.split(/(?=ACT)/).each{|s|open("#{i+=1}",?w)<<s}*?$
Wartość tuszu
źródło