Dividi uno script di Shakespeare


13

William Shakespeare ha scritto opere teatrali. Un sacco di giochi. In questo tarball contenente ciascuna delle sue opere, ognuna delle sue opere è un file lungo.
Deve essere suddiviso in Scene per una produzione scenica. Poiché gli attori sono impazienti, il tuo codice deve essere il più breve possibile.

Compito:

Il tuo compito è quello di scrivere un programma o una funzione per dividere le riproduzioni contenute in questo file in file separati, numerati sequenzialmente a partire da 1, dove ognuno contiene una scena. Dovresti conservare tutti gli spazi bianchi e i titoli.

Ingresso:

L'input sarà una singola riproduzione tramite stdino il nome file come parametro. Puoi scegliere. La commedia sarà simile a:

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

Produzione:

L'output dovrebbe assomigliare a questo:

ATTO I



SCENA I Roma. Prima del Campidoglio.


    [Appare la tomba degli ANDRONICI; i Tribunes
    e senatori in alto. Inserisci, sotto, da un lato,
    Saturno e i suoi seguaci; e, dall'altro
    lato, BASSIANO e i suoi seguaci; con tamburo e colori]

SATURNINO Nobili patrizi ...
ATTO I



SCENA II Una foresta vicino a Roma. Si udirono clacson e grida di cani.


    [Inserisci TITUS ANDRONICUS, con cacciatori, ecc., MARCUS,
    LUCIO, QUINTUS e MARZIO]

TITUS ANDRONICUS La caccia è finita, la mattina è luminosa e grigia,
    I campi sono ...
ATTO II



SCENA I Roma. Davanti al palazzo.


    [Entra in AARON]

AARON Ora sale Tamora ...

eccetera.

Output in file numerati o nello stdoutstream (ritorno per le funzioni) con un delimitatore a scelta.

bonus:

  • 10% Se si salva il bit prima dell'atto 1 in un file 0 . Nota: non deve interrompersi se il bit prima dell'atto 1 è vuoto.
  • 15% Se è possibile accettare stdininput di parametri sia per il percorso del file
  • 20% Se è possibile eseguire l'output sia in file che in stdout/ return.
  • 200 reputazione se riesci a creare il più piccolo programma SPL. Questa taglia è stata premiata.

Classifiche

Ecco uno snippet di stack per generare sia una classifica regolare che una panoramica dei vincitori per lingua.

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, usando il seguente modello Markdown:

# Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

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

Se si desidera includere più numeri nell'intestazione (ad es. Perché il punteggio è la somma di due file o si desidera elencare separatamente le penalità del flag dell'interprete), assicurarsi che il punteggio effettivo sia l' ultimo numero nell'intestazione:

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

Puoi anche rendere il nome della lingua un collegamento che verrà quindi visualizzato nello snippet della classifica:

# [><>](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
Darò una taglia +200 alla prima presentazione valida del linguaggio di programmazione Shakespeare.
gatto

3
Dai, tutti sanno che CodeGolfs non è veloce. Perché non dire che "Il tarball è già abbastanza pieno, quindi il tuo codice dovrebbe essere il più corto possibile"?
J_F_B_M

1
@trichoplax Products. Pensavo fosse così che lo facevano tutti! barrato nel quaderno
wizzwizz4 il


2
@cat - Lascialo aperto; Sono sicuro che ci sono soluzioni Shakespeare più piccole delle mie. Il mio è grasso come la somma di un grosso gatto grosso e di un gatto.
Robert Fraser,

Risposte:


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.

Ungolf e riscritto in lingua 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.

In psuedocode simile a 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)

Richiede che il file di input contenga almeno 3 caratteri. Utilizza "@" come delimitatore e riporta i risultati a stdout. Prendo il bonus del 10% poiché la parte prima della prima scena sarà prima del primo "@", proprio come la soluzione di Martin Büttner sopra.

Il modo in cui funziona consiste nel mettere un "@" se vede tre caratteri "ACT" in una riga. Nota che ciò significa che trasformerebbe "ENACTED" in "EN @ ACTED". Questo può essere risolto al costo di qualche centinaio di byte, ma per fortuna sembra che ogni "ACT" nelle commedie (almeno le poche che ho controllato) sia stato l'inizio di una scena.

Testato con 1.2.1 SPL collegato sopra. Non sono sicuro che funzionerà sull'interprete web. Lo script utilizzato per i test era:

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

Le parti "esoteriche" dell'SPL una volta superata la sintassi sono la mescolanza delle variabili sullo "stage" (in genere, si desidera avere solo due caratteri sullo stage alla volta) e la rappresentazione di numeri costanti. Esistono 6 elenchi di parole di importazione forniti con la distribuzione: aggettivi positivi, aggettivi neutri, aggettivi negativi, sostantivi positivi, sostantivi neutri e sostantivi negativi. Un sostantivo positivo / neutro (cioè prugna o muro di pietra) è 1, e un sostantivo negativo (cioè flirt-gill o Microsoft) è -1. Gli aggettivi positivi / neutri (cioè ricamati o senza fondo) moltiplicano il numero per 2 e gli aggettivi negativi (cioè reni grassi o senza padre) si moltiplicano per -2. Gli elenchi di parole sono purtroppo piuttosto limitati, con solo 10-20 voci ciascuno.

Al mio prossimo incontro, suggerirò di spostare tutto il nostro codice di produzione su Shakespeare perché è molto più espressivo di Scala.


2
Golf questo il più possibile. Per favore!
wizzwizz4,

1
Gatti santi, non pensavo che qualcuno lo facesse davvero! Lo assegnerò tra 24 ore, che è appena possibile :)
cat

2
@ wizzwizz4 - sicuramente; ci proverò quando non ho un vero lavoro da fare :-). sarà succinto come se fosse stato scritto dallo stesso bardo
Robert Fraser

2
Ora, chi posso assumere per esibirmi sul palco?
gatto

3
@cat - Prendi tre persone insicure riguardo al loro peso e mostra loro la foto di un gatto.
Robert Fraser,

12

Retina , 9-10 % = 8,1 byte

Il conteggio dei byte presuppone la codifica ISO 8859-1.

¶ACT 
=$0

Inserisce un =(come delimitatore) davanti a tutto ACTciò che è preceduto da un avanzamento riga e seguito da uno spazio.

Provalo online! (Ma dovrai copiare tu stesso l'input a causa delle sue dimensioni.)


Congratulazioni per rispondere a 69000 (secondo il link di condivisione).
J_F_B_M l'

@J_F_B_M Posta 69000. Sono domande e risposte.
wizzwizz4,

4

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

Si divide in più file. Le uscite sono stdoutseparate da a =.

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

+1 Tutto quello che devi fare ora è produrre tutti i file stdoutseparati da un carattere specifico e il gioco è fatto!
wizzwizz4,

Fatto. Con il bonus è quasi della stessa lunghezza.
Rainer P.

+2 ... +2 ........ +2 ............ No. Il sistema non lo consente :-( Consiglio comunque di separarli con un carattere questo è ancora meno comune, come ¬ o ¦.
wizzwizz4,

3

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

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

Nemmeno la shell JS ha I / O di file, quindi questo non può beneficiare del bonus del -20%

Provalo online qui (dovrai incollare l'input in te stesso)


Penso che puoi estrarre il Tper un byte salvato.
Mama Fun Roll

La sostituzione non rimuove la riga ACT?
wizzwizz4,

@ wizzwizz4 perché non ce l' $&ho
Downgoat

@ Doᴡɴɢᴏᴀᴛ Impari qualcosa di nuovo ogni giorno!
wizzwizz4,

3

Perl, 66-10% - 20% = 47.52 byte

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

Aggiunto uno per l' -popzione.


1

Rubino, 30-10 % - 15% = 23.715 22,95 byte

Divide l'input su $. Il bonus del 15% si applica perché Ruby reindirizza$< in modo che punti al file trasmesso ARGVper impostazione predefinita se viene fornito o STDINmeno.

-1 byte sfruttando gsubsimile alla soluzione ESD @Downgoat ma sto ancora sfruttando la speranza cheACT appare sempre e solo sulle etichette ACT e non all'interno di qualsiasi altra parola, solo perché

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

Inoltre, la mia soluzione di byte 41.004 (originariamente 67) che esegue anche l'output di file. Protagonista probabilmente l'unica volta in cui il eachcomando salva i byte mapin Ruby, perché eachrestituisce l'array passato inalterato dopo aver eseguito il suo blocco, a differenza map.

i=-1;$><<$<.read.split(/(?=ACT)/).each{|s|open("#{i+=1}",?w)<<s}*?$
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.