Dividir un guión de Shakespeare

13

William Shakespeare escribió obras de teatro. Muchas jugadas. En este tarball que contiene cada una de sus obras, cada una de sus jugadas es un archivo largo.
Debe dividirse en escenas para una producción en el escenario. Debido a que los actores son impacientes, su código debe ser lo más breve posible.

Tarea:

Su tarea es escribir un programa o función para dividir las obras contenidas en este archivo en archivos separados, numerados secuencialmente desde 1donde cada uno contiene una escena. Debe conservar todos los espacios en blanco y títulos.

Entrada:

La entrada será una sola reproducción vía stdin, o el nombre de archivo como parámetro. Tu puedes elegir. La obra se verá algo así como:

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

Salida:

La salida debería verse así:

ACTO I



ESCENA I Roma. Ante el capitolio.


    [Aparece la tumba de ANDRONICI; los Tribunas
    y senadores en alto. Ingrese, abajo, desde un lado,
    SATURNINO y sus seguidores; y del otro
    BASSIANUS y sus seguidores; con tambor y colores]

SATURNINO Patricios nobles ...
ACTO I



ESCENA II Un bosque cerca de Roma. Se escuchan cuernos y gritos de sabuesos.


    [Ingrese TITUS ANDRONICUS, con Hunters, & c., MARCUS,
    LUCIUS, QUINTUS y MARTIUS]

TITUS ANDRONICUS La caza ha terminado, la mañana es brillante y gris,
    Los campos son ...
ACTO II



ESCENA I Roma. Antes del palacio.


    [Entra AARON]

AARON Ahora Climbeth Tamora ...

etc.

Salida ya sea en archivos numerados o en la stdoutsecuencia (volviendo para funciones) con un deliminador de su elección.

Bonificaciones:

  • 10% Si guarda el bit antes del Acto 1 en el archivo 0. Nota: No debe romperse si el bit anterior al Acto 1 está vacío.
  • 15% Si puede tomar ambas stdinentradas de parámetros y una ruta de archivo
  • 20% Si puede enviar tanto a archivos como a stdout/ return.
  • 200 reputación si puedes hacer el programa SPL más pequeño. Esta recompensa ha sido otorgada.

Tablas de clasificación

Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.

Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:

# Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:

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

Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:

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

También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:

# [><>](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
fuente
16
Daré una recompensa de +200 a la primera presentación válida del lenguaje de programación de Shakespeare.
gato
3
Vamos, todos saben que CodeGolfs no son rápidos. ¿Por qué no decir que "el tarball ya está bastante lleno, por lo que su código debe ser lo más corto posible"?
J_F_B_M
1
Productos @trichoplax. ¡Pensé que así fue como todos lo hicieron!
tacha
1
@cat ¡Aquí tienes! codegolf.stackexchange.com/a/69360/43394
wizzwizz4
2
@cat - Déjalo abierto; Estoy seguro de que hay soluciones de Shakespeare más pequeñas que la mía. El mío es tan gordo como la suma de un gran gato grande y un gato.
Robert Fraser

Respuestas:

38

Lenguaje de programación Shakespeare 1.2.1 , 930 895 887 - 10% = 798,3 bytes

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.

Desengañado y reescrito en lengua de tiburón:

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.

En el psuedocódigo tipo 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)

Requiere que el archivo de entrada contenga al menos 3 caracteres. Utiliza "@" como delimitador e informa los resultados a stdout. Estoy tomando el 10% de bonificación ya que la parte anterior a la primera escena será antes de la primera "@", al igual que la solución de Martin Büttner anterior.

La forma en que funciona es poner una "@" si ve tres caracteres "ACT" en una fila. Tenga en cuenta que esto significa que transformaría "ENACTED" en "EN @ ACTED". Esto se puede arreglar al costo de unos pocos cientos de bytes, pero afortunadamente parece que cada "ACT" en las jugadas dadas (al menos las pocas que verifiqué) fue el comienzo de una escena.

Probado con el 1.2.1 SPL vinculado anteriormente. No estoy seguro de si funcionará en el intérprete web. El script utilizado para las pruebas fue:

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

Las partes "esotéricas" del SPL una vez que pasa la sintaxis son la combinación aleatoria de variables en el "escenario" (generalmente, solo desea tener dos caracteres en el escenario a la vez) y la representación de números constantes. Hay 6 listas de palabras de importación que vienen con la distribución: adjetivos positivos, adjetivos neutros, adjetivos negativos, sustantivos positivos, sustantivos neutros y sustantivos negativos. Un sustantivo positivo / neutro (es decir, ciruela o muro de piedra) es 1, y un sustantivo negativo (es decir, flirt-gill o Microsoft) es -1. Los adjetivos positivos / neutrales (es decir, bordados o sin fondo) multiplican el número por 2, y los adjetivos negativos (es decir, sin grasa o sin padre) se multiplican por -2. Las listas de palabras son lamentablemente bastante limitadas, con solo 10-20 entradas cada una.

En mi próxima reunión, sugeriré que traslademos todo nuestro código de producción a Shakespeare porque es mucho más expresivo que Scala.

Robert Fraser
fuente
2
Golf esto tanto como puedas. ¡Por favor!
wizzwizz4
1
¡Dios mío, no pensé que alguien realmente lo haría! Lo otorgaré en 24 horas, que es tan pronto como pueda :)
gato
2
@ wizzwizz4 - definitivamente; Lo intentaré cuando no tenga trabajo real que hacer :-). será tan sucinto como si hubiera sido escrito por el propio bardo
Robert Fraser el
2
Ahora, ¿a quién puedo contratar para realizar esto en el escenario?
gato
3
@cat: solo consigue tres personas inseguras sobre su peso y muéstrales una foto de un gato.
Robert Fraser
12

Retina , % = 8.1 bytes

El recuento de bytes asume la codificación ISO 8859-1.

¶ACT 
=$0

Inserta un =(como delimitador) delante de cadaACT precedido por un salto de línea y seguido por un espacio.

Pruébalo en línea! (Pero tendrá que copiar la entrada usted mismo debido a su tamaño).

Martin Ender
fuente
Felicitaciones por responder 69000 (según el enlace compartido).
J_F_B_M
@J_F_B_M Publicar 69000. Esas son preguntas y respuestas.
wizzwizz4
4

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

Se divide en múltiples archivos. Salidas en stdoutseparadas por a =.

/^ACT/{f++;$0="="$0}{system("echo \""$0"\">>"f*1)}1
Rainer P.
fuente
+1 ¡Todo lo que necesita hacer ahora es generar todos los archivos stdoutseparados por un carácter específico, y listo!
wizzwizz4
Hecho. Con la bonificación es casi de la misma longitud.
Rainer P.
+2 ... +2 ........ +2 ............ No. El sistema no lo permite :-( Sin embargo, recomendaría separarlos con un carácter eso es aún menos común, como ¬ o ¦.
wizzwizz4
3

JavaScript ES6, 28-10% = 25.2 bytes

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

Ni siquiera el shell JS tiene E / S de archivo, por lo que esto no puede calificar para el bono de -20%

Pruébelo en línea aquí (tendrá que pegar la entrada en usted mismo)

Downgoat
fuente
Creo que puede sacar el Tbyte guardado por un byte.
Mama Fun Roll
No reemplaza eliminar la línea ACT?
wizzwizz4
@ wizzwizz4 porque tengo el $&no lo hará
Downgoat
@ Doᴡɴɢᴏᴀᴛ ¡Aprendes algo nuevo todos los días!
wizzwizz4
3

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

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

Se agregó uno para la -popción.

Neil
fuente
1

Rubí, 30 - 10% - 15% = 23.715 22.95 bytes

Divide la entrada en $. Se aplica un 15% de bonificación porque Ruby redirige$< para apuntar al archivo pasado ARGVpor defecto si se proporciona, o STDINsi no.

-1 byte aprovechando gsubuna solución similar a @Downgoat ES6 pero todavía estoy aprovechando la esperanza de queACT solo aparezca en las etiquetas de ACT y no dentro de ninguna otra palabra, solo porque

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

Además, mi solución de 41.004 (originalmente 67) bytes que también genera salida de archivos. Probablemente, la única vez que el eachcomando guarda bytes mapen Ruby es la función de estrella, porque eachdevuelve la matriz pasada sin adulterar después de ejecutar su bloque, a diferencia map.

i=-1;$><<$<.read.split(/(?=ACT)/).each{|s|open("#{i+=1}",?w)<<s}*?$
Tinta de valor
fuente