Golf mes références de citation Shakespeare

45

En écrivant mon essai pour Shakespeare, je me suis rendu compte que je devais raccourcir mes références de citation à des longueurs plus gérables. J'avais déjà écrit ceci:

(Act 1, Scene 2, Lines 345-346)

Mais on m'a maintenant dit de les écrire comme ceci:

(I.ii.345-6)

Clairement, il me faut un peu de code golfé pour que mes références à la citation de Shakespeare soient un peu moins détaillées.

La tâche

Ecrivez un programme ou une fonction qui, en fonction d'une entrée de chaîne suivant le modèle 1 ou 2, imprime ou retourne une chaîne suivant le modèle 3 ou 4, respectivement. Vous devez uniquement prendre en charge les Actes 1 à 5 et les scènes 1 à 9.

Modèles

Modèle 1

(Act x, Scene y, Lines a-b)

Vous pouvez supposer que xjamais ne dépasse 5, yne dépasse jamais 9 aet bsont toujours des entiers positifs n'excédant pas la valeur entière standard positive maximale de votre langue et aest toujours exclusivement inférieur à b.

Modèle 2

(Act x, Scene y, Line a)

Mêmes conditions que le modèle 1, à l'exclusion des informations sur b.

Modèle 3

(x.y.a-b)

xest un chiffre roman de capital, yest un chiffre roman minuscule, aet bsont des nombres, et best réduit à seulement les chiffres de moins que le premier chiffre différent de l' égalité de signification a.

Modèle 4

(x.y.a)

Mêmes conditions que le modèle 3, à l'exclusion des informations sur b.

Cas de test

Soit f(s)la fonction définie dans la tâche. ""dénote une valeur de chaîne.

>>> f("(Act 1, Scene 2, Lines 345-346)")
"(I.ii.345-6)"

>>> f("(Act 3, Scene 4, Lines 34-349)")
"(III.iv.34-349)"

>>> f("(Act 5, Scene 9, Lines 123-234)")
"(V.ix.123-234)"

>>> f("(Act 3, Scene 4, Line 72)")
"(III.iv.72)"

>>> f("(Act 2, Scene 3, Lines 123-133)")
"(II.iii.123-33)"

>>> f("(Act 4, Scene 8, Lines 124-133)")
"(IV.viii.124-33)"

Pour les besoins de ce défi, les traductions suivantes en chiffres romains et arabes doivent être prises en charge:

1 i     I
2 ii    II
3 iii   III
4 iv    IV
5 v     V
6 vi    (you do not have to support past 5)
7 vii
8 viii
9 ix
Addison Crump
la source
Les fichiers texte sont-ils autorisés?
Dat
21
J'espère vraiment une réponse dans SPL.
L3viathan
5
Cas de test:(Act 1, Scene 2, Lines 345-3499)
dzaima
11
Qui veut une réponse à Shakespeare?
Titus
1
@Grimy Fixe # 1, le # 2 est-il bon?
Addison Crump

Réponses:

12

Le langage de programmation Shakespeare (non concurrent)

J'ai vraiment aimé cette question, et comme il y avait un certain intérêt pour une réponse en langue Shakespeare, en voici une.

A Tale of Two Cites (sic).

Julius Caesar, the first citizen of the Roman Republic.
Brutus, a traitor -- member of the Fifth Column.
Cicero, the greatest Roman orator.
Cleopatra, a proud queen, whom the Romans want to make one of their own.
Romeo, a man who's sometimes there.
Juliet, a maiden who can follow Romeo or stand on her own.


           Act I: Imperium Romanum.


           Scene I: Cleopatra puts men in their place.

[Enter Cleopatra and Julius Caesar]

Julius Caesar:
    Thou art as lovely as the sum of an amazing delicious gentle blossoming warm angel and a charming noble reddest rose.
    Speak your mind. Open your mind. Open your mind. Open your mind! Open your mind!

Cleopatra:
    You are as stuffed as the sum of a hard old green horse and the sum of a grandmother and
    a normal tiny bottomless furry small purple roman.

[Exit Julius Caesar]
[Enter Brutus]

Cleopatra:
    You are as sorry as the difference between a rich morning and a leech.
    You are as smelly as the difference between yourself and a sunny rural blue bold uncle.
    You are as vile as the difference between Julius Caesar and yourself.

[Exit Brutus]
[Enter Cicero]

Cleopatra:
    You are as half-witted as the difference between Brutus and the bluest death.


           Scene II: How do you solve a problem like Cleopatra?

[Exeunt]
[Enter Cleopatra and Julius Caesar]

Julius Caesar:
    Listen to your heart!

[Exit Cleopatra]
[Enter Brutus]

Julius Caesar:
    Is Cleopatra more pretty than a fair charming noble angel?

Brutus:
    If so, we must proceed to Scene IV. Is Cleopatra not worse than the sweetest small aunt?

Julius Caesar:
    If so, let us proceed to Scene III.

Brutus:
    Speak your mind.

Julius Caesar:
    Is Cleopatra nicer than the moon?

Brutus:
    If so, speak your mind.

Julius Caesar:
    Is Cleopatra better than a golden King?

Brutus:
    If so, speak your mind.

Julius Caesar:
    We shall proceed to Scene V.


          Scene III: Brutus and his friends.
Julius Caesar:
    Is Cleopatra as fair as the blossoming smooth sky?

Brutus:
    If so, speak your mind!

Julius Caesar:
    Speak your mind!

Julius Caesar:
    Is Cleopatra jollier than the sum of a yellow sweet road and a summer's day?

Brutus:
    If so, speak your mind!

Julius Caesar:
    Is Cleopatra friendlier than the sum of a sweet large angel and a white cow?

Brutus:
    If so, speak your mind!

Julius Caesar:
    Is Cleopatra as furry as a rich handsome huge mistletoe?

Brutus:
    If so, speak your mind!

Julius Caesar:
    We shall proceed to Scene V.


          Scene IV: Cicero is asked to speak.
[Exit Brutus]
[Enter Cicero]

Julius Caesar:
    Is Cleopatra as beautiful as the sum of a small furry white angel and a summer's day?

Cicero:
    If so, speak your mind!

Julius Caesar:
    Speak YOUR mind!


          Scene V: A period piece -- Cleopatra's reprisal.
[Exeunt]
[Enter Cleopatra and Julius Caesar]

Julius Caesar:
    You are as beautiful as the sum of a embroidered sweetest sunny delicious trustworthy Lord
    and a reddest charming mighty honest King.
    You are as healthy as the difference between yourself and a embroidered Lord. Speak your mind!
    Open your mind! Open your mind! Open your mind! Open your mind! Open your mind! Open your mind!

Cleopatra:
    Are you jollier than the sum of a little rural white bottomless blue blue sky and a rural furry white green old morning?

Julius Caesar:
    If so, we must proceed to Act II. Open your mind! Open your mind!

Cleopatra:
    You are as damned as the difference between yourself and a half-witted dusty snotty rotten oozing death.

[Exit Julius Caesar]
[Enter Brutus]

Cleopatra:
    You are as rotten as the difference between yourself and a rural rotten bottomless evil miserable famine.

[Exit Brutus]
[Enter Cicero]

Cleopatra:
    You are as fatherless as the difference between Brutus and a normal pig. Let us return to Scene II.



          Act II: Lovers' arithmetick.

          Scene I: Our lovers discuss what they have in common.

[Exeunt]
[Enter Romeo and Juliet]

Romeo:
    Thou art as bold as a curse. Listen to your heart!

Juliet:
    Am I better than nothing? If so, let us proceed to Scene III.

Romeo:
    Open your mind. Open your mind.

Juliet:
    Listen to your heart! Open your heart!

Romeo:
    Thou art as amazing as the product of the difference between a handsome white proud white grandfather and an aunt
    and the sum of a loving niece and the Heaven. Speak your mind! Open your mind.
    Listen to your heart. Is the quotient between yourself and the sum of the sum of
    a noble noble mighty blossoming embroidered good father
    and a gentle large large normal old joy and an old happy squirrel as yellow as the quotient between
    myself and the sum of the sum of a pretty beautiful yellow green bold charming kingdom and
    a beautiful blue normal cute large nephew and a pretty big cousin?

Juliet:
    If not, we shall proceed to Scene II.

Romeo:
    You are as sweet as the remainder of the quotient between yourself and the sum of the sum of
    a blossoming bottomless golden peaceful noble healthy nose and
    a happy honest sunny green healthy hero and a hard blue fellow.

Juliet:
    YOU are as sweet as the remainder of the quotient between yourself and the sum of the sum of
    a blossoming bottomless golden peaceful noble healthy nose and
    a happy honest sunny green healthy hero and a hard blue fellow.


          Scene II: Tense times.
Juliet:
    Is the quotient between yourself and the sum of a good beautiful delicious grandmother
    and a noble wind as amazing as the quotient between myself and the sum of
    a smooth furry embroidered roman and a honest sister?

Romeo:
    If so, you are as amazing as the remainder of the quotient between
    yourself and the sum of a cute healthy smooth kingdom and a normal mother.


          Scene III: Parting is such sweet sorrow.
Romeo:
    Open your heart! You are as noble as the sum of a honest charming smooth peaceful fine rose and the sum of
    a cute amazing trustworthy summer's day and an angel. Speak your mind!

(Cela fait plus de 6000 octets de long.) Il y a quelques astuces ici mais je n'ai pas essayé de jouer beaucoup au golf, car: (1) j'ai déjà contribué ma part de golf sur une autre réponse, et (2) changer tous les caractères en "Page "et" Puck ", ou toutes les phrases à" gros gros gros gros chat ", semblent gâcher le plaisir. Au lieu de cela, pour la partie qui traite des chiffres romains, j’ai utilisé des caractères qui sont romains, etc. J’ai réutilisé des caractères et des instructions pour enregistrer certains types de frappe. :-)

Le programme devrait être plutôt simple, mais il est intéressant de noter que, lorsque j’écrivais cela, j’imaginais que la lecture d’un nombre entier fonctionnerait comme suit scanf: (1) ne consommez autant de caractères de l’entrée que correspond à un entier, et d’échec, laissez la variable inchangée. (J'ai utilisé cette seconde propriété pour distinguer les modèles 1 et 2 de l'acte II, en lisant jusqu'à "Line" et en essayant de lire un entier.) Malheureusement, il s'avère qu'il y a (ce que je considère) un bogue dans la mise en oeuvre originale de la langue dans laquelle lire un entier consomme tout jusqu'à la fin de la ligne et génère une erreur en cas d'échec; un correctif estlibspl.c donc nécessaire pour que le int_inputcomportement se comporte davantage scanf.

Et avec ça, ça marche:

% spl2c < good.spl > good.c
% gcc -lspl -o good good.c                                    
% for f in in-*; do cat $f; echo "->"; ./good < $f; echo "\n"; done    
(Act 1, Scene 2, Lines 345-346)
->
(I.ii.345-6)

(Act 3, Scene 4, Lines 34-349)
->
(III.iv.34-349)

(Act 5, Scene 9, Lines 123-234)
->
(V.ix.123-234)

(Act 3, Scene 4, Line 72)
->
(III.iv.72)

(Act 2, Scene 3, Lines 123-133)
->
(II.iii.123-33)

(Act 4, Scene 8, Lines 124-133)
->
(IV.viii.124-33)

Pseudocode légèrement supérieur à celui sur lequel j'ai travaillé, pour aider ceux qui cherchent à comprendre:

Print `(`=40
Read 5 chars
Read Int A
Output A in Roman
Output `.`=46
Read 8 chars
Read Int S
Output S in roman
Output `.`=46
Read 6 chars
Set N to -1
Read Int N
If N ≠ -1 goto finish
Read 2 chars
Read Int M
Output Int M
Output `-`=45
Read 1 char
Read Int N
Reduce N wrt M
finish:
Output N
Print `)`=41

Relier ce qui précède au code final est laissé comme un exercice. :-) Notez que ShakespearePL a une arithmétique et des piles et des gotos mais pas de pointeurs (seulement des étiquettes), donc implémenter des "sous-routines" comme la conversion en Roman est un peu… intéressant.

ShreevatsaR
la source
Waouh, c'est beau. Je vous remercie! :)
Steve Bennett
1
claque le bouton upvote à plusieurs reprises
Addison Crump
9

LaTeX, 513 364 259 226 215 178 159 octets

Les bons essais doivent toujours être écrits en LaTeX.

\documentclass{tui}\makeatletter\input{xstring}\def~#1 #2, #3 #4, #5 #6){(\@Roman#2.\@roman#4.\StrCut{#6}-\A\B\A\if\B\else-\fi\StrCompare\A\B[\P]\StrMid\B\P9)}

Ceci utilise le paquetage xstring car il n’ya pas vraiment beaucoup de manipulation de chaîne intégrée. Du côté positif, la limite supérieure de la \Romanmise en forme intégrée est plus grande que ce dont nous aurons besoin (même pour les sonnets) 2^31-1. J'ai inclus \documentclass{ecv}dans le décompte, mais aucun des codes de test:

\begin{document}
\t(Act 1, Scene 2, Lines 345-346) 

\t(Act 3, Scene 4, Lines 34-349)

\t(Act 5, Scene 9, Lines 123-234)

\t(Act 3, Scene 4, Line 72)

\t(Act 2, Scene 3, Lines 123-133)

\t(Act 4, Scene 8, Lines 124-133)
\end{document}

(Si vous êtes assez fou pour l'utiliser, vous devrez au moins ungolfer les noms de macro. Remplacer des macros à un caractère est une mauvaise pratique.)

Ungolfed et commenté:

\documentclass{ecv}%We have to have a documentclass
\makeatletter %treat the @ sign as a normal character (it's used in "internal" macro names)
\input{xstring} %use the xstring package
\def\shortref#1 #2, #3 #4, #5 #6){ %macro with 6 positional arguments searated by spaces and commas 
    (%print the open bracket
    \@Roman#2 %arg 2 is the Act,  print uppercase Roman
    .%print the full stop
    \roman#4 %arg 4 is the Scene, lowercase roman
    .%print the full stop
    \StrCut{#6}{-}{\A}{\B}%split arg 6 (Lines) at the hyphen, into macros \A and \B
    \A %print the bit before the hyphen
    \ifx\B\empty%if \B has nothing in it do nothing
    \else %otherwise
        - %we need to print a hyphen
    \fi%endif
    \StrCompare{\A}{\B}[\P] %returns (in macro \P) the position at which \A and \B first differ
    \StrMid{\B}{\P}{9}%print \B starting from position \P (9 > the number of remaining characters)
)}%print the closing bracket

Notez que dans cette version, les commentaires sont obligatoires, sinon la nouvelle ligne est interprétée comme un espace et se développe en un espace.

Chris H
la source
Vous pouvez économiser trois octets en utilisant ~comme nom de macro au lieu de \s. Mais en réalité, vous n’avez pas du tout besoin \s( \stripcommadans la version non-golfée): vous pouvez juste \def\t#1 #2, #3 #4, #5 #6et TeX se chargera d’effacer les virgules. (Vous pouvez donc utiliser l' ~astuce à la \tplace, en économisant 1 octet.)
ShreevatsaR
@ ShreevatsaR merci. Vous avez compris comment intégrer le rejet des virgules en ligne et c'était plus simple que tout ce que j'ai essayé. Le truc avec l'actif ~est un peu méchant mais j'aime bien ici. Cela signifiait que je devais changer la classe de documents (en l'un des autres .clsfichiers de 3 lettres que j'avais installés)
Chris H
1
Oui, je compte 182 octets, ce qui bat non seulement la réponse Python, mais également Ruby, PHP et l'une des réponses Perl :-)
ShreevatsaR
1
@ShreevatsaR, mieux encore: 178 comme \@roman et \@Romann'ont pas besoin d'accolades autour de l'argument.
Chris H
1
Toutes les xstringidées principales étaient les vôtres :-) C'était amusant de jouer au golf ensemble!
ShreevatsaR
8

JavaScript (ES6), 210 183 178 177 171 octets

27 octets sauvegardés en déroulant les paramètres de repos (grâce à ETHproductions )

5 octets sauvegardés en ne faisant pas correspondre le paren d'ouverture et en modifiant la génération en chiffres romains

Sauvegardé 1 octet en ajustant l'expression ternaire finale

Sauvegardé 6 octets en combinant deux groupes correspondants

s=>s.replace(/Act (\d)\D*(\d)\D*(\d*)(\d*-?)\3(\d*)/,(_,a,b,c,d,e)=>'IIIV'.slice(a>3&&a-2,a)+'.'+'iiiviiix'.slice('233336'[b-4],b-(b>4))+'.'+c+d+(d.length>e.length?e:c+e))

Cas de test:

let f = s=>s.replace(/Act (\d)\D*(\d)\D*(\d*)(\d*-?)\3(\d*)/,(_,a,b,c,d,e)=>'IIIV'.slice(a>3&&a-2,a)+'.'+'iiiviiix'.slice('233336'[b-4],b-(b>4))+'.'+c+d+(d.length>e.length?e:c+e))

;[
  ["(Act 1, Scene 2, Lines 345-346)", "(I.ii.345-6)"],
  ["(Act 3, Scene 4, Lines 34-349)", "(III.iv.34-349)"],
  ["(Act 5, Scene 9, Lines 123-234)", "(V.ix.123-234)"],
  ["(Act 3, Scene 4, Line 72)", "(III.iv.72)"],
  ["(Act 2, Scene 3, Line 123-133)", "(II.iii.123-33)"],
  ["(Act 4, Scene 8, Line 124-133)", "(IV.viii.124-33)"],
  ["(Act 1, Scene 2, Lines 345-3499)", "(I.ii.345-3499)"]
].map(([a,b]) => console.log(`${a} => ${f(a)} (${f(a) == b ? 'Pass' : 'Fail'})`))
.as-console-wrapper { min-height: 100% }

gyre
la source
Je ne peux pas tester pour le moment, mais cela fonctionne-t-il quand même si vous remplacez Act chacun \D*d'eux .*?
Patrick Roberts
Ça pourrait; J’ai hésité à essayer car JavaScript utilise par défaut la correspondance gourmande. Je vais le tester plus tard aujourd'hui et vous faire savoir si cela fonctionne.
gyre
8

Gelée ,  87 86  85 octets

DµU=/œr1LCṫ@Ṫ
Ṗ,Çj”-µ⁸L’$?W
⁾-,yḲḊm2Ṗ€Vµ“¬Q:’ṃ⁾IV;”X“¤|ʂ’BṚ¤œṗị@µ1,2¦Œl2¦µ;ṪÇ$“(..)”ż

Essayez-le en ligne! ou voir une suite de tests

Comment?

DµU=/œr1LCṫ@Ṫ - Link 1, toPageShort: list of numbers [fromPage, toPage]  e.g.  [345,365]
D             - cast to decimal lists                                 [[3,4,5],[3,6,5]]
 µ            - monadic chain separation (call that d)
  U           - reverse each                                          [[5,4,3],[5,6,3]]
   =/         - reduce by equality                                              [1,0,1]
     œr1      - strip any 1s from the right                                       [1,0]
        L     - length                                                                2
         C    - complement (1-z)                                                     -1
            Ṫ - tail d                                                          [3,6,5]
          ṫ@  - tail from index (swap @rguments)                                  [6,5]

Ṗ,Çj”-µ⁸L’$?W - Link 2, format page number(s): number or list of two numbers
           ?  - if:
          $   -   last two links as a monad:
        L     -     length
         ’    -     decremented (0 for a number, 1 for a list of two numbers)
      µ       - then:
Ṗ             -   pop (list without the last item, i.e. just the from page)
  Ç           -   call the last link (1) as a monad with the list as its argument
 ,            -   pair
    ”-        -   literal '-'
   j          -   join
              - else:
       ⁸      -   link's left argument (the single page number)
            W - wrap the result in a list (for ease of post-formatting in Main)

⁾-,yḲḊm2Ṗ€Vµ ... µ1,2¦Œl2¦µ;ṪÇ$“(..)”ż - Main link: string s
⁾-,                                    - literal ['-',',']
   y                                   - map (change '-' to ',')
    Ḳ                                  - split at spaces
     Ḋ                                 - dequeue (get all but 1st)
      m2                               - mod-index-2 (1st,3rd,5th)
        Ṗ€                             - pop €ach (ditch last char)
          V                            - evaluate - list of numbers
                                       -   either [act,scene,page] or
                                       -   [act,scene,[from,to]]
           µ     µ   ¦                 - apply to indexes:
                  1,2                  - [1,2]
             ...                       -   see monadic chain " ... ", below
                        2¦             - apply to index 2:
                      Œl               -   lowercase
                          µ            - monadic chain separation
                              $        - last 2 links as a monad:
                            Ṫ          -   tail (page(s))
                             Ç         -   call last link (2) as a monad
                           ;           - concatenate
                               “(..)”  - literal ['(','.','.',')']
                                     ż - zip together
                                       - implicit print

“¬Q:’ṃ⁾IV;”X“¤|ʂ’BṚ¤œṗị@ - monadic chain " ... " from Main
                         -   Get Roman numeral: number n (n>0, n<10) (act or scene)
“¬Q:’                    - base 250 literal 520559
      ⁾IV                - literal ['I','V']
     ṃ                   - base decompression -> "IIIIIIIVVVIVIIVIIII"
          ”X             - literal 'X'
         ;               - concatenate -> "IIIIIIIVVVIVIIVIIIIX"
                   ¤     - nilad followed by link(s) as a nilad:
            “¤|ʂ’        -   base 250 literal 281418
                 B       -   convert to a binary list
                  Ṛ      -   reverse
                    œṗ   -   split at truthy indexes i.e: I II III IV V VI VII VIII IX
                      ị@ -   index into (swap @arguments) using n
Jonathan Allan
la source
1
Ça doit être une sorte de disque pour un scénario de Jelly
MickyT
@MickyT Nope j'ai plus longtemps là-bas ...
Jonathan Allan
Cela induit des maux de tête. Ne le lisez pas 0/10. : P
Erik the Outgolfer
@EriktheOutgolfer Désolé !!
Jonathan Allan
2
Blague à part, je peux voir des choses vraiment uniques dans ce code, comme œr, Ṗ,Ç, Ṗ€V, ṪÇ$, Wcomme le dernier lien sur un lien d'aide, peut - être d' autres aussi, bien l' effort! Ce n’est pas votre soumission Jelly habituelle d’environ 80 ans, cela mérite une reconnaissance particulière de la part des membres de Jelly.
Erik the Outgolfer
6

R , 94 126 112 166 octets

Et maintenant il est verbeux qu'auparavant :(, de retour à essayer de golf davantage. Regex pour réduire la référence de la page sans vergogne Stolen empruntée à @FryAmTheEggman.

Maintenant, j'ai vraiment besoin de travailler pour récupérer les octets, mais cela fonctionne maintenant pour le second cas.

R=as.roman;i=sub(',','',scan(,''));sprintf('(%s.%s.%s',R(i[2]),tolower(R(i[4])),`if`(!diff(c(nchar(el(strsplit(i[6],'-'))),0))-1,sub('((.+).*-)\\2','\\1',i[6]),i[6]))

Essayez-le en ligne! - Notez que elcela ne fonctionne pas sur TIO et a été remplacé parunlist

R=as.roman;                              # Used to convert to roman numeral class
i=sub(',','',scan(,''));                 # Get input, splits on spaces, remove ,'s
sprintf('(%s.%s.%s',                     # Use sprintf to format the output.
    R(i[2]),                             # Convert to roman numeral
    tolower(R(i[4])),                    # Convert to roman numeral and lowercase
    `if`(                                #
       !diff(                            # Test if the lengths of the last string
       c(nchar(el(strsplit(i[6],'-'))),0)# split on the hyphen are different (extra 0 to appease diff)
       )-1,                              # taking into account the trailing )
       sub('((.+).*-)\\2','\\1',i[6]),   # on true use regex to reduce range
       i[6]                              # else output as is
    )
)
MickyT
la source
4

La rétine ,89 88 octets

T`, lL`._
2`(\d+)
$*i
i{5}
v
i{4}
iv
viv
ix
1T`l`L`\w+
(\b(.+)(.)*-)\2((?<-3>.)*)\b
$1$4

Essayez-le en ligne!

3 octets sauvés grâce à Neil.

Élimine les caractères inutiles avant de remplacer les deux premiers chiffres par des blocs de icaractères. Ensuite, il sélectionne des morceaux de ces ilettres pour former les chiffres romains appropriés. Ensuite, nous capitalisons le premier chiffre romain. Enfin, nous apparions autant de nombres que possible avant le trait d'union et après le trait d'union, de sorte que le nombre de chiffres du nombre soit le même. Nous supprimons ensuite ce préfixe du deuxième numéro.

FryAmTheEggman
la source
Remplacer iiiiipar v, iiiiavec ivet vivavec ixsemble sauver quelques octets.
Neil
Cependant, le raccourcissement de votre numéro de ligne semble avoir mal tourné 345-356- je m'y attendais 345-56.
Neil
Neil Whoops @, oublié l'expansion de Kleene. Quoi qu'il en soit, merci pour le conseil!
FryAmTheEggman
Pouvez-vous utiliser \bà la fin du dernier remplacement pour éviter de devoir répéter le )dans la substitution?
Neil
@Neil Je ne pensais pas que cela fonctionnerait car je pensais que je devrais utiliser, \dmais cela semble fonctionner, car il n'y a pas d'autre limite de mots. Merci!
FryAmTheEggman
4

PHP> = 7.1, 195 octets

preg_match_all("#\d+#",$argn,$t);[[$a,$s,$b,$e]]=$t;for(;$e&&~$c=$e[$k-=1];$p="-".substr($e,$i))$c>$b[$k]&&$i=$k;echo"(",strtoupper(($r=[_,i,ii,iii,iv,v,vi,vii,viii,ix])[$a]),".$r[$s].$b",$p,")";

Testcases

Étendu

preg_match_all("#\d+#",$argn,$t); # match for all groups of digits
[[$a,$s,$b,$e]]=$t; # shorter variables names for these groups
for(;$e&&~$c=$e[$k-=1];$p="-".substr($e,$i)) # prepare the seceond line if exists
  $c>$b[$k]&&$i=$k; 
echo"(" # print the char (
,strtoupper(($r=[_,i,ii,iii,iv,v,vi,vii,viii,ix])[$a]) # print the upper roman digit for Act
,".$r[$s].$b" # print the lower roman digit for Scene and the first line with trailing "."
,$p # print shorted second Line
,")"; #Print the closing )
Jörg Hülsermann
la source
1
preg_match_all("#\d+#",$argn,$m);[$a,$s,$b,$e]=$m[0];enregistre deux octets. if($e){for(;$b[$i]==$e[$i];$i++);echo"-",substr($e,$i);}echo")";devrait enregistrer 46. (you do not have to support past 5)enregistre 15 octets.
Titus
1
".$r[$s].$b"enregistre 5 autres octets; et [[$a,$s,$b,$e]]=$m;un autre. Malheureusement, les assignations de tableaux ne fonctionnent pas (encore) par référence.
Titus
if($e&&$e-$b){for($x=str_pad($b,strlen($e),0,0);$x[$i]==$e[$i];$i++);echo"-",substr($e,$i);}enregistre 10 octets et pourrait fonctionner.
Titus
Ca me va bien . Et &&$e-$best inutile pour les cas de test; donc il enregistre 17 octets, pas 10. Btw. vous n'avez toujours pas besoin de chiffres romains 6 à 9.;)
Titus
1
Vous pouvez remplacer for(;str_pad($b,strlen($e),0,0)[$i]==$e[$i];)$i++;par for(;$e&&~$c=$e[-++$k];)$c>$b[-$k]&&$i=-$k;.
Christoph
3

Perl 5, 185 + 1 = 186 octets

Pénalité de 1 octet pour le -ndrapeau requis .

Peut échouer pour certains cas de test où la scène a plus de 10 ^ 11 lignes, mais d'après ce que je sais, aucune scène de Shakespeare n'est aussi longue;)

y/A-z //d;while($x++<9){s/,(\d+)(\d{$x})-\g1(\d{$x}\))/,$1$2-$3/};@F=split/,/;for($F[0],$F[1]){$_.='i'while(y/2-91/1-8/d);s/i{5}/v/g;s/i{4}/iv/;s/v(i)?v/$1x/;s/$/,/};$F[0]=uc$F[0];say@F

Sous forme lisible:

y/A-z //d; #Delete all characters besides numbers, parenthesis, and comma
while($x++<9){s/,(\d+)(\d{$x})-\g1(\d{$x}\))/,$1$2-$3/}; #Shortens the line numbers. Super ugly, but my simpler code broke on test case 2- that fix added 26 bytes :( I'll revisit this later, perhaps...
@F=split/,/; #Splits the input into an array so we can mess with the act and scene without messing with the lines
for($F[0],$F[1]){ #For loop over the act and scene
    $_.='i'while(y/2-91/1-8/d); #Recursively turn numbers into naive Roman numerals (i.e. 9 would be iiiiiiiii)
    s/i{5}/v/g;s/i{4}/iv/;s/v(i)?v/$1x/;s/$/,/ #Substitution rules to convert naive Roman numerals into real Roman numerals and add a comma to the end
}
$F[0]=uc$F[0]; #Convert act to uppercase
say@F #Output
Chris
la source
2

Ruby , 204 + 1 = 205 octets

Utilise le -pdrapeau.

d=[r=%w"i ii iii iv v vi vii viii ix",r.map(&:upcase)]
i=-1
gsub(/\w+ ([\d-]+)/){(a=d.pop)?a[$1.hex]:(a,b=$1.split ?-;b ?(a="%0#{b.size}d"%a;b[0]=""while b[0]==a[i+=1];a.sub(/^0*/){}+?-+b):a)}
gsub", ",?.

Essayez-le en ligne!

Valeur d'encre
la source
2

Python 2.7 298 octets

import re
r=lambda n:'iiiviiix'[2*(n>3)+(n>4)+3*(n>8):n-(n>4)]
o=lambda x,y,n=0:n*(len(x)==len(y))if not x or x[0]!=y[0]else o(x[1:],y[1:],n+1)
q=lambda a,s,g,h:(r(int(a)).upper(),r(int(s)),g+'-'+h[o(g,h):]if h else g)
f=lambda p:'(%s.%s.%s)'%q(*re.match('\D*(\d)\D*(\d)\D*(\d+).(\d*)',p).groups())
Chas Brown
la source
2

Perl, 99 octets

/(.+)(-\1|.(?2).)\b/;@r=(s/-$1/-/,I,II,III,IV,V,VI,VII,VIII,IX);s/Act(.+)(.,).+ /$r[$1].\L$r[$2]./

Courez avec perl -pe. 98 octets (source) + 1 octet ( pindicateur) = 99.

Grimmy
la source
Au moment de cette publication, il y avait une autre réponse Perl ( codegolf.stackexchange.com/a/123400/6484 ), mais elle compte 186 octets et utilise des idées très différentes. J'ai donc pensé qu'une réponse distincte était appropriée.
Grimmy
Cela semble être un gaspillage car il faut des dispositions pour les chiffres romains au-delà de 5
Hagen von Eitzen
2
@HagenvonEitzen le défi spécifie que vous devez prendre en charge les chiffres romains jusqu'à 9. Le scénario de test 3 contient «Scène 9» et le scénario de test 6, «Scène 8». les deux échoueraient si je ne prenais en charge que les chiffres romains jusqu'à 5.
Grimmy,
2

Python 2 , 301 259 252 221 octets

Un énorme -31 octets grâce à Chas Brown.

Donc, euh, c'est ... extrêmement long ... Je pense que je peux jouer au golf, mais cela me fouette la tête depuis un moment.

import re
def f(s):s,r=re.match(r'.*?(\d),.*?(\d), .*? (\d*)(\d*-?)\3(\d*)',s),'0 i ii iii iv v vi vii viii ix'.split();b,c,d,e,f=s.groups();print'(%s.%s.%s)'%(r[int(b)].upper(),r[int(c)],d+e+(f if len(e)>len(f)else d+f))

Essayez-le en ligne!

Panne

import re                     # re module for regex stuff

def f(s):                     # function that accepts one argument

    s, r = (re.match(r'.*?(\d),.*?(\d), .*? (\d*)(\d*-?)\3(\d*)', s),
           # match the string and capture the important parts using regex

           '0 i ii iii iv v vi vii viii ix'.split()
           # array that stores roman numerals

    b, c, d, e, f = s.groups()
                    # all the numbers from the match to variables

    print '(%s.%s.%s)' % (
                              r[int(b)].upper(),
                              # get the respective roman numeral and make it uppercase

                              r[int(c)],
                              # get the respective roman numeral

                              d + e + (f if len(e) > len(f) else d + f)
                              # shorten the second number if it's shorter than the first number
                         )
totalement humain
la source
Vous pouvez économiser un peu en utilisant à la b,c,d,e,f=s.groups()place dea,b,c,d,e,f=[s.group(n) for n in range(6)]
Chas Brown
Et encore 5 en utilisant [0]+'i,ii,iii,iv,v,vi,vii,viii,ix'.split(',')au lieu de [s,'i','ii','iii','iv','v','vi','vii','viii','ix'].
Chas Brown
Amendé - Et un autre 8 en utilisant à la [0]+'i ii iii iv v vi vii viii ix'.split()place de [s,'i','ii','iii','iv','v','vi','vii','viii','ix'].
Chas Brown
Oh, hein, je ne savais pas que tu pouvais faire ça. Merci!
totalement humain
Nice tweak mettant l' 0intérieur des guillemets. Un dernier tweak mineur , je peux voir que vous utilisez: s,r=XXX,YYY;b,c,d,e,f=s.groups();vous pouvez enregistrer un autre 4 octets par lieu de dire de façon équivalente: b,c,d,e,f=XXX.groups();r=YYY;. Donc, vous vous retrouvez avec 81 octets de moins que ma soumission! :)
Chas Brown
2

q / kdb +, 200 187 octets

Solution:

f:{R:(($:)N:(!)11)!($:)``i`ii`iii`iv`v`vi`vii`viii`ix`x;S:","vs x inter .Q.n,",-";L:"-"vs P:S 2;"(",("."sv(upper R S 0;R S 1;$[{x[y]=x z}[#:;F:L 0;T:L 1];F,"-",((*:)N(&:)F<>T)_T;P])),")"}

Exemples:

q)f "(Act 1, Scene 2, Lines 345-346)"
"(I.ii.345-6)"
q)f "(Act 3, Scene 4, Lines 34-349)"
"(III.iv.34-349)"
q)f "(Act 5, Scene 9, Lines 123-234)"
"(V.ix.123-234)"
q)f "(Act 3, Scene 4, Line 72)"
"(III.iv.72)"
q)f "(Act 2, Scene 3, Lines 123-133)"
"(II.iii.123-33)"
q)f "(Act 4, Scene 8, Lines 124-133)"
"(IV.viii.124-33)"

Explication: (légèrement non golfé)

f:{
  // create map of 0->10 to roman numerals, e.g. "5" -> "v"
  R:(($:)N:(!)11)!($:)``i`ii`iii`iv`v`vi`vii`viii`ix`x;
  // remove everything from the input string except -, then split on ,
  S:","vs x inter .Q.n,",-";
  // split the final field on '-', also save final field in variable P
  L:"-"vs P:S 2;
  // if the length of from/to lines are the same then find the first character
  // where they differ, and cut this many characters from the 'to' string
  M:$[{x[y]=x z}[#:;F:L 0;T:L 1];F,"-",((*:)N(&:)F<>T)_T;P];
  // join everything together, use act/scene to index into 
  // the roman numeral map, uppercase the act
  "(",("."sv(upper R S 0;R S 1;M)),")"
  }

Remarques:

Techniquement, il peut être plus court de 2 octets (inutile f:), mais il est plus facile de montrer des exemples de cette façon.

Modifications:

  • -13 octets; remplacé stringpar $:, countavec #:, tilavec (!)et firstavec (*:), transforme les indices de R en chaînes afin que nous n'ayons pas à convertir act / scene en ints
streetster
la source