Golf miei riferimenti alle citazioni di Shakespeare


45

Mentre scrivevo il mio saggio per Shakespeare, mi sono reso conto che dovevo accorciare i riferimenti delle mie citazioni a lunghezze più gestibili. In precedenza avevo scritto questo:

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

Ma ora mi è stato detto di scriverli in questo modo:

(I.ii.345-6)

Chiaramente, ho bisogno di un codice di golf per golfare i miei riferimenti alle citazioni di Shakespeare un po 'verso il basso.

L'obiettivo

Scrivi un programma o una funzione che, dato un input di stringa che segue il Template 1 o 2, stampa o restituisce una stringa che segue rispettivamente il Template 3 o 4. Devi solo supportare gli Atti da 1 a 5 e le Scene da 1 a 9.

Modelli

Modello 1

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

Puoi presumere che xnon superi mai 5, ynon superi mai 9 ae bsiano sempre numeri interi positivi che non superano il valore intero standard massimo positivo della tua lingua ed aè sempre esclusivamente inferiore a b.

Modello 2

(Act x, Scene y, Line a)

Stesse condizioni del modello 1, escluse le informazioni su b.

Modello 3

(x.y.a-b)

Dove xè un numero romano maiuscolo, yè un numero romano minuscolo, ae bsono numeri, ed bè ridotto solo alle cifre inferiori alla prima cifra diversa di uguale significato a.

Modello 4

(x.y.a)

Stesse condizioni del modello 3, escluse le informazioni su b.

Casi test

Sia f(s)la funzione definita nell'attività. ""indica un valore di stringa.

>>> 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)"

Ai fini di questa sfida, devono essere supportate le seguenti traduzioni da numeri arabi a numeri romani:

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

Sono ammessi file di testo?
Dat

21
Spero davvero una risposta in SPL.
L3viathan,

5
Caso di prova:(Act 1, Scene 2, Lines 345-3499)
dzaima,

11
Chi è pronto per una risposta in Shakespeare?
Tito,

1
@Grimy Fixed # 1, è buono # 2?
Addison Crump,

Risposte:


12

Il linguaggio di programmazione di Shakespeare (non competitivo)

Mi è davvero piaciuta questa domanda, e dato che c'era un certo interesse per una risposta in lingua Shakespeare, eccone una.

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!

(È lungo oltre 6000 byte.) Ci sono alcuni trucchi ma non ho provato a giocarci molto, perché: (1) ho già contribuito con la mia parte di golf su un'altra risposta e (2) cambiando tutti i caratteri in "Pagina "e" Puck ", o tutte le frasi di" big big big big big ", sembrano rovinare il divertimento. Invece per la parte relativa ai numeri romani ho usato personaggi romani, ecc. Ho riutilizzato i caratteri e le istruzioni per salvare alcuni caratteri. :-)

Il programma dovrebbe essere per lo più semplice, ma una ruga degna di nota è che quando ho scritto questo ho assunto che la lettura di un numero intero avrebbe funzionato come scanf: (1) consuma solo quanti caratteri dall'input corrisponde a un numero intero, e (2) nel caso di errore, lasciare invariata la variabile. (Ho usato questa seconda proprietà per distinguere tra Template 1 e 2 nell'Atto II, leggendo fino a "Line" e tentando di leggere un numero intero.) Sfortunatamente si scopre che c'è (quello che considero) un bug nell'implementazione originale di la lingua in cui la lettura di un numero intero consuma tutto fino alla fine della riga e genera un errore se fallisce, quindi ha bisogno di una patchlibspl.c per rendere il int_inputcomportamento più simile scanf.

E con ciò, funziona:

% 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)

Pseudocodice di livello leggermente superiore di cui ho lavorato, per aiutare chiunque cerchi di capire:

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

Il collegamento di quanto sopra al codice finale è lasciato come un esercizio. :-) Nota che ShakespearePL ha aritmetica e pile e goto ma nessun puntatore (solo etichette), quindi implementare "subroutine" come la conversione in romano è un po '... interessante.


Wow, è bellissimo. Grazie! :)
Steve Bennett il

1
schiaffeggia ripetutamente il pulsante di votazione
Addison Crump

9

Lattice, 513 364 259 226 215 178 159 Bytes

I buoni saggi dovrebbero sempre essere scritti in 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)}

Questo utilizza il pacchetto xstring in quanto non c'è esattamente molta gestione delle stringhe integrata. Sul lato positivo, il limite superiore per la \Romanformattazione integrata è più grande di quanto avremo mai bisogno (anche per i sonetti) su 2^31-1. Ho incluso \documentclass{ecv}nel conteggio, ma nessuno del codice di 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}

(Se fossi abbastanza pazzo da usarlo davvero, dovresti almeno annullare la definizione dei nomi delle macro. Sovrascrivere le macro di singoli caratteri è una cattiva pratica)

Ungolf e commentato:

\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

Si noti che in questa versione sono richiesti i commenti, altrimenti la nuova riga viene interpretata come uno spazio bianco e si espande in uno spazio.


È possibile salvare tre byte utilizzando ~come nome della macro anziché \s. Ma in realtà non è necessario \s( \stripcommanella versione non rigata): puoi semplicemente \def\t#1 #2, #3 #4, #5 #6e TeX si occuperà di eliminare le virgole. (Quindi potresti usare il ~trucco \tinvece, salvando 1 byte.)
ShreevatsaR

@ShreevatsaR grazie. Hai capito come ottenere il rifiuto della virgola in linea ed è stato più semplice di qualsiasi cosa io abbia provato. Il trucco con l'attivo ~è un po 'brutto ma mi piace qui. Significava che dovevo cambiare la classe di documenti (in uno degli altri .clsfile di 3 lettere che avevo installato)
Chris H

1
Sì, conto 182 byte, che batte non solo la risposta Python ma anche Ruby, PHP e una delle risposte Perl :-)
ShreevatsaR

1
@ShreevatsaR meglio ancora: 178 come \@roman e \@Romannon hanno bisogno di parentesi graffe attorno all'argomento.
Chris H,

1
Tutte le xstringidee principali erano tue :-) È stato divertente giocare a golf insieme!
ShreevatsaR,

8

JavaScript (ES6), 210 183 178 177 171 byte

Salvato 27 byte srotolando i parametri di riposo (grazie a ETHproductions )

Salvato 5 byte non abbinando la parentesi aperta e modificando la generazione numerica romana

Salvato 1 byte regolando l'espressione ternaria finale

6 byte salvati combinando due gruppi corrispondenti

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))

Casi 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% }


Al momento non posso eseguire il test, ma funziona comunque se lo sostituisci Act e ciascuno \D*con .*?
Patrick Roberts,

Potrebbe; Ero titubante nel provare perché JavaScript utilizza una corrispondenza avida per impostazione predefinita. Lo proverò più tardi oggi e ti farò sapere se funziona.
gyre,

8

Gelatina ,  87 86  85 byte

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

Provalo online! o vedere una suite di test

Come?

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


@MickyT No, ho più tempo là fuori ...
Jonathan Allan,

Questo induce mal di testa. Non leggerlo 0/10. : P
Erik the Outgolfer,

@EriktheOutgolfer Siamo spiacenti !!
Jonathan Allan,

2
Scherzi a parte, posso vedere alcune cose davvero unico in quanto il codice, come œr, Ṗ,Ç, Ṗ€V, ṪÇ$, Wcome ultimo anello su un link aiutante, forse anche altri, bello sforzo! Questa non è la solita presentazione di Jelly da 80 anni, merita un riconoscimento speciale tra le persone di Jelly.
Erik the Outgolfer,

6

R , 94 126 112 166 byte

E ora è più complicato di prima :(, tornando a cercare di giocarci ancora. Regex per ridurre il riferimento alla pagina rubato senza vergogna preso in prestito da @FryAmTheEggman.

Ora ho davvero bisogno di fare un po 'di lavoro per recuperare i byte, ma ora funziona per il secondo caso.

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]))

Provalo online! - Nota che elnon funziona su TIO ed è stato sostituito conunlist

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
    )
)

4

Retina ,89 88 byte

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

Provalo online!

Salvato 3 byte grazie a Neil.

Elimina i caratteri non necessari prima di sostituire i primi due numeri con blocchi di icaratteri. Quindi abbina pezzi di questi is per formare i numeri romani appropriati. Quindi capitalizziamo il primo numero romano. Infine abbiniamo quanti più numeri possibile prima del trattino e dopo il trattino in modo tale che il numero di cifre nel numero sia lo stesso. Quindi rimuoviamo quel prefisso dal secondo numero.


Sostituire iiiiicon v, iiiicon ive vivcon ixsembra salvare un paio di byte.
Neil,

Tuttavia, il tuo accorciamento del numero di riga sembra essere sbagliato per 345-356- mi aspettavo 345-56.
Neil,

@Neil Whoops, ho dimenticato l'espansione kleene. Comunque grazie per il suggerimento!
FryAmTheEggman,

Puoi usarlo \balla fine dell'ultima sostituzione per evitare di ripetere )la sostituzione?
Neil,

@Neil Non pensavo che avrebbe funzionato da quando pensavo che avrei dovuto usarlo, \dma sembra funzionare dal momento che non c'è un altro limite di parole. Grazie!
FryAmTheEggman,

4

PHP> = 7,1, 195 byte

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,")";

Casi test

allargato

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 )

1
preg_match_all("#\d+#",$argn,$m);[$a,$s,$b,$e]=$m[0];salva due byte. if($e){for(;$b[$i]==$e[$i];$i++);echo"-",substr($e,$i);}echo")";dovrebbe salvare 46. (you do not have to support past 5)salva 15 byte.
Tito,

1
".$r[$s].$b"salva altri 5 byte; e [[$a,$s,$b,$e]]=$m;un altro. Sfortunatamente, le assegnazioni di array non funzionano per riferimento (ancora).
Tito,

if($e&&$e-$b){for($x=str_pad($b,strlen($e),0,0);$x[$i]==$e[$i];$i++);echo"-",substr($e,$i);}salva 10 byte e potrebbe funzionare.
Tito,

Mi sembra a posto . Ed &&$e-$bè inutile per i casi di test; quindi salva 17 byte, non 10. Btw. non hai ancora bisogno di romani 6 a 9.;)
Tito

1
È possibile sostituire for(;str_pad($b,strlen($e),0,0)[$i]==$e[$i];)$i++;con for(;$e&&~$c=$e[-++$k];)$c>$b[-$k]&&$i=-$k;.
Christoph,

3

Perl 5, 185 + 1 = 186 byte

Penalità di 1 byte per il -nflag richiesto .

Potrebbe non riuscire in alcuni casi di test in cui la scena ha più di 10 ^ 11 righe, ma le scene di AFAIK no Shakespeare sono piuttosto lunghe;)

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

In forma leggibile:

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

2

Rubino , 204 + 1 = 205 byte

Usa la -pbandiera.

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", ",?.

Provalo online!


2

Python 2.7 298 byte

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())

2

Perl, 99 byte

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

Corri con perl -pe. 98 byte (sorgente) + 1 byte ( pflag) = 99.


Al momento di questo post, c'è un'altra risposta Perl ( codegolf.stackexchange.com/a/123400/6484 ), ma è lunga 186 byte e utilizza idee molto diverse, quindi ho ritenuto opportuno fare una risposta separata.
Grimmy,

Questo sembra essere dispendioso in quanto prende disposizioni per i numeri romani oltre il 5
Hagen von Eitzen,

2
@HagenvonEitzen la sfida specifica che devi supportare numeri romani fino a 9. Il caso di test 3 ha "Scene 9" e il caso di test 6 ha "Scene 8"; entrambi fallirebbero se supportassi solo numeri romani fino a 5.
Grimmy

2

Pitone 2 , 301 259 252 221 byte

Un enorme -31 byte grazie a Chas Brown.

Quindi, questo è ... estremamente lungo ... Penso di poter giocare a golf, ma mi sto rovinando il cervello da un po '.

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))

Provalo online!

Abbattersi

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
                         )

Puoi risparmiare un po 'usando b,c,d,e,f=s.groups()invece dia,b,c,d,e,f=[s.group(n) for n in range(6)]
Chas Brown

E altri 5 usando [0]+'i,ii,iii,iv,v,vi,vii,viii,ix'.split(',')invece di [s,'i','ii','iii','iv','v','vi','vii','viii','ix'].
Chas Brown,

Modificato - E altri 8 usando [0]+'i ii iii iv v vi vii viii ix'.split()invece di [s,'i','ii','iii','iv','v','vi','vii','viii','ix'].
Chas Brown,

Oh, eh, non sapevo che potevi farlo. Grazie!
totalmente umano

Bel tweak mettendo 0dentro le virgolette. Un ultimo ritocco minore posso vedere: si sta utilizzando: s,r=XXX,YYY;b,c,d,e,f=s.groups();è possibile salvare un altro 4 byte da invece equivalentemente dire: b,c,d,e,f=XXX.groups();r=YYY;. Quindi finisci con 81 byte in meno rispetto alla mia richiesta! :)
Chas Brown,

2

q / kdb +, 200 187 byte

Soluzione:

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])),")"}

Esempi:

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)"

Spiegazione: (leggermente non golfizzato)

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)),")"
  }

Appunti:

Tecnicamente può essere più corto di 2 byte (non è necessario per f:) ma rende più semplice mostrare esempi in questo modo.

modifiche:

  • -13 byte; sostituito stringcon $:, countcon #:, tilcon (!)e firstcon (*:), castare gli indici di R in stringhe in modo da non dover gettare act / scene in ints
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.