Scinder un script Shakespeare

13

M. William Shakespeare a écrit des pièces de théâtre. Beaucoup de jeux. Dans ce tarball contenant chacune de ses œuvres, chacune de ses pièces est un long fichier.
Il doit être divisé en scènes pour une production scénique. Parce que les acteurs sont impatients, votre code doit être aussi court que possible.

Tâche:

Votre tâche consiste à écrire un programme ou une fonction pour diviser les jeux contenus dans ce fichier en fichiers séparés, numérotés séquentiellement à partir de 1, où chacun contient une scène. Vous devez conserver tous les espaces et titres.

Contribution:

L'entrée sera une lecture unique via stdinou le nom de fichier comme paramètre. Tu peux choisir. Le jeu ressemblera à quelque chose comme:

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

Production:

La sortie devrait ressembler à ceci:

ACTE I



SCÈNE I Rome. Devant le Capitole.


    [Le tombeau de l'ANDRONICI apparaissant; les Tribunes
    et les sénateurs en haut. Entrez, ci-dessous, d'un côté,
    SATURNINUS et ses disciples; et, de l'autre
    côté, BASSIANUS et ses partisans; avec tambour et couleurs]

SATURNINUS Nobles patriciens ...
ACTE I



SCÈNE II Une forêt près de Rome. Des cornes et des cris de chiens entendus.


    [Entrez TITUS ANDRONICUS, avec Hunters, & c., MARCUS,
    LUCIUS, QUINTUS et MARTIUS]

TITUS ANDRONICUS La chasse est terminée, le matin est vif et gris,
    Les champs sont ...
ACTE II



SCÈNE I Rome. Devant le palais.


    [Entrez AARON]

AARON Grimpe maintenant Tamora ...

etc.

Sortie soit dans des fichiers numérotés, soit dans le stdoutflux (retour pour les fonctions) avec un suppresseur de votre choix.

Bonus:

  • 10% Si vous enregistrez le bit avant l'Acte 1 dans un fichier 0. Remarque: Il ne doit pas se casser si le bit avant l'Acte 1 est vide.
  • 15% Si vous pouvez prendre les deux stdinet un paramètre de chemin d'accès au fichier
  • 20% Si vous pouvez sortir à la fois dans des fichiers et vers stdout/ retourner.
  • 200 points de réputation si vous pouvez créer le plus petit programme SPL. Cette prime a été décernée.

Classements

Voici un extrait de pile pour générer à la fois un classement régulier et un aperçu des gagnants par langue.

Pour vous assurer que votre réponse apparaît, veuillez commencer votre réponse avec un titre, en utilisant le modèle de démarque suivant:

# Language Name, N bytes

Nest la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre en les rayant. Par exemple:

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

Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou si vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:

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

Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:

# [><>](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
la source
16
Je donnerai une prime de +200 à la première soumission valide du langage de programmation Shakespeare.
chat
3
Allez, tout le monde sait que CodeGolfs n'est pas rapide. Pourquoi ne pas dire que "l'archive est déjà assez pleine, donc votre code devrait être aussi court que possible"?
J_F_B_M
1
@trichoplax Products. Je pensais que c'était comme ça que tout le monde le faisait!
barré
1
@cat C'est parti! codegolf.stackexchange.com/a/69360/43394
wizzwizz4
2
@cat - Laissez-le ouvert; Je suis sûr qu'il existe des solutions Shakespeare plus petites que les miennes. Le mien est aussi gros que la somme d'un gros gros gros chat et d'un chat.
Robert Fraser

Réponses:

38

Langage de programmation Shakespeare 1.2.1 , 930 895 887 - 10% = 798,3 octets

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.

Non golfé et réécrit en langue 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.

En pseudo-code de type 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)

Nécessite que le fichier d'entrée contienne au moins 3 caractères. Utilise "@" comme délimiteur et transmet les résultats à stdout. Je profite du bonus de 10% car la partie avant la première scène sera avant le premier "@", un peu comme la solution de Martin Büttner ci-dessus.

La façon dont cela fonctionne est de mettre un "@" s'il voit trois caractères "ACT" dans une rangée. Notez que cela signifie qu'il transformerait "ENACTED" en "EN @ ACTED". Cela peut être corrigé au prix de quelques centaines d'octets, mais heureusement, il semble que chaque "ACT" dans les pièces données (du moins les quelques que j'ai vérifiées) était le début d'une scène.

Testé avec le SPL 1.2.1 lié ci-dessus. Je ne sais pas si cela fonctionnera sur l'interpréteur Web. Le script utilisé pour les tests était:

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

Les parties "ésotériques" de la SPL une fois que vous avez dépassé la syntaxe sont le brassage des variables sur "scène" (généralement, vous ne voulez avoir que deux caractères sur scène à la fois) et la représentation des nombres constants. Il y a 6 listes de mots d'importation fournies avec la distribution: adjectifs positifs, adjectifs neutres, adjectifs négatifs, noms positifs, noms neutres et noms négatifs. Un nom positif / neutre (c'est-à-dire un mur de prune ou de pierre) est 1, et un nom négatif (c'est-à-dire flirt-gill ou Microsoft) est -1. Les adjectifs positifs / neutres (c.-à-d. Brodés ou sans fond) multiplient le nombre par 2, et les adjectifs négatifs (c.-à-d. Le rein graisseux ou sans père) se multiplient par -2. Les listes de mots sont malheureusement assez limitées, avec seulement 10-20 entrées chacune.

Lors de ma prochaine réunion, je proposerai de déplacer tout notre code de production vers Shakespeare car il est beaucoup plus expressif que Scala.

Robert Fraser
la source
2
Jouez au golf autant que vous le pouvez. S'il vous plaît!
wizzwizz4
1
Saints chats, je ne pensais pas que quiconque le ferait vraiment! J'attribuerai ceci dans 24 heures, c'est-à-dire dès que je le pourrai :)
cat
2
@ wizzwizz4 - certainement; je vais essayer quand je n'ai pas vraiment de travail à faire :-). ce sera aussi succinct que s'il avait été écrit par le barde lui
Robert Fraser
2
Maintenant, qui puis-je embaucher pour jouer sur scène?
chat
3
@cat - Obtenez simplement trois personnes qui ne sont pas sûres de leur poids et montrez-leur une photo d'un chat.
Robert Fraser
12

Rétine , 9 à 10% = 8,1 octets

Le nombre d'octets suppose un codage ISO 8859-1.

¶ACT 
=$0

Insère un =(comme délimiteur) devant tout ce ACTqui est précédé d'un saut de ligne et suivi d'un espace.

Essayez-le en ligne! (Mais vous devrez copier vous-même l'entrée en raison de sa taille.)

Martin Ender
la source
Félicitations pour répondre 69000 (selon le lien de partage).
J_F_B_M
@J_F_B_M Post 69000. Ce sont des questions et réponses.
wizzwizz4
4

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

Se divise en plusieurs fichiers. Sorties sur stdoutséparées par un =.

/^ACT/{f++;$0="="$0}{system("echo \""$0"\">>"f*1)}1
Rainer P.
la source
+1 Tout ce que vous devez faire maintenant est de sortir tous les fichiers stdoutséparés par un caractère spécifique, et vous avez terminé!
wizzwizz4
Terminé. Avec le bonus, c'est presque la même longueur.
Rainer P.
+2 ... +2 ........ +2 ............ Non. Le système ne le permet pas :-( Je recommanderais cependant de les séparer par un caractère c'est encore moins courant, comme ¬ ou ¦.
wizzwizz4
3

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

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

Même le shell JS n'a pas d'E / S sur les fichiers, donc cela ne peut pas bénéficier du bonus de -20%

Essayez-le en ligne ici (vous devrez coller l'entrée en vous-même)

Downgoat
la source
Je pense que vous pouvez retirer le Tpour un octet enregistré.
Mama Fun Roll
Ne remplace pas supprimer la ligne ACT?
wizzwizz4
@ wizzwizz4 parce que je n'en ai $&pas
Downgoat
@ Doᴡɴɢᴏᴀᴛ Vous apprenez quelque chose de nouveau chaque jour!
wizzwizz4
3

Perl, 66 - 10% - 20% = 47,52 octets

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

Ajout d'un pour l' -poption.

Neil
la source
1

Rubis, 30 - 10% - 15% = 23 715 22,95 octets

Répartit l'entrée sur $. Un bonus de 15% s'applique car Ruby redirige$< vers le fichier transmis ARGVpar défaut s'il est fourni ou STDINnon.

-1 octet en tirant parti gsubde la solution @Downgoat ES6, mais je profite toujours de l'espoir qui ACTn'apparaît que sur les étiquettes ACT et pas dans un autre mot, simplement parce que

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

En outre, ma solution de 41,004 (à l'origine 67) octets qui fait également la sortie de fichier. En vedette probablement la seule fois où la eachcommande enregistre des octets mapdans Ruby, car eachretourne le tableau passé sans altération après avoir exécuté son bloc, contrairement à map.

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