Golf moje referencje z cytatem Szekspira

45

Pisząc mój esej dla Szekspira, zdałem sobie sprawę, że muszę skrócić odniesienia do cytatów, aby uzyskać łatwiejsze do opanowania długości. Wcześniej pisałem to:

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

Ale teraz powiedziano mi, aby napisać je w ten sposób:

(I.ii.345-6)

Najwyraźniej potrzebuję trochę kodu do gry w golfa, aby trochę odwołać moje cytaty z Szekspira.

Zadanie

Napisz program lub funkcję, która po wprowadzeniu ciągu znaków zgodnego z szablonem 1 lub 2 wydrukuje lub zwróci ciąg znaków odpowiednio według szablonu 3 lub 4. Musisz tylko wspierać akty od 1 do 5 i sceny od 1 do 9.

Szablony

Szablon 1

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

Możesz założyć, że xnigdy nie przekracza 5, ynigdy nie przekracza 9 ai bzawsze są dodatnimi liczbami całkowitymi nieprzekraczającymi maksymalnej dodatniej standardowej wartości całkowitej twojego języka i azawsze są wyłącznie mniejsze niż b.

Szablon 2

(Act x, Scene y, Line a)

Takie same warunki jak w szablonie 1, z wyjątkiem informacji o b.

Szablon 3

(x.y.a-b)

Gdzie xjest wielką cyfrą rzymską, yjest małą cyfrą rzymską, ai bsą liczbami, i bjest skrócony tylko do cyfr mniejszych niż pierwsza różniąca się cyfra o równym znaczeniu a.

Szablon 4

(x.y.a)

Takie same warunki jak w szablonie 3, z wyjątkiem informacji o b.

Przypadki testowe

Niech f(s)będzie funkcją zdefiniowaną w Zadaniu. ""oznacza wartość ciągu.

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

Na potrzeby tego wyzwania muszą być obsługiwane następujące tłumaczenia cyfr arabskich na rzymskie:

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
źródło
Czy pliki tekstowe są dozwolone?
Dat
21
Naprawdę liczę na odpowiedź w SPL.
L3viathan
5
Przypadek testowy:(Act 1, Scene 2, Lines 345-3499)
dzaima
11
Kto czeka na odpowiedź w Shakespeare?
Tytus
1
@Grimy Naprawiono nr 1, czy nr 2 jest dobry?
Addison Crump

Odpowiedzi:

12

Język programowania Szekspira (niekonkurencyjny)

Naprawdę podobało mi się to pytanie, a ponieważ zainteresowanie Szekspirem było pewne , oto jedno.

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!

(Jest to ponad 6000 bajtów). Istnieje kilka sztuczek w tam, ale nie próbowałem do golfa to dużo, ponieważ: (1) I już przyczyniły się mój udział w golfa na innej odpowiedzi, oraz (2) zmienia wszystkie znaki na „Strona i „Krążek” lub wszystkie frazy „duży, duży, duży kot” wydają się zepsuć zabawę. Zamiast tego w części dotyczącej cyfr rzymskich użyłem znaków, które są Rzymianami itp. Użyłem znaków i instrukcji, aby zapisać trochę pisania. :-)

Program powinien być w większości prosty, ale jedną zmarszczką, o której warto wspomnieć, jest to, że kiedy to napisałem, założyłem, że odczyt liczby całkowitej będzie działał w następujący sposób scanf: (1) zużyje tylko tyle znaków z wejścia, ile odpowiada liczbie całkowitej, i (2) w przypadku niepowodzenia, pozostaw zmienną niezmienioną. (Użyłem tej drugiej właściwości do rozróżnienia między szablonem 1 i 2 w Akcie II, czytając do „Linii” i próbując odczytać liczbę całkowitą.) Niestety okazuje się, że (oryginalna implementacja) zawiera błąd język, w którym czytanie liczby całkowitej zużywa wszystko do końca linii i generuje błąd, jeśli się nie powiedzie, więc potrzebuje łatki,libspl.c aby int_inputbardziej się zachowywać scanf.

I dzięki temu działa:

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

Nieco wyższy pseudokod, nad którym pracowałem, aby pomóc każdemu, kto próbuje zrozumieć:

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

Powiązanie powyższego z końcowym kodem pozostawia się jako ćwiczenie. :-) Zauważ, że ShakespearePL ma arytmetykę i stosy i goto, ale nie ma wskaźników (tylko etykiety), więc implementacja „podprogramów” takich jak konwersja na Roman jest nieco… interesująca.

ShreevatsaR
źródło
Wow, to jest piękne. Dziękuję Ci! :)
Steve Bennett
1
klapsa przycisk upvote wielokrotnie
Addison Crump
9

LaTeX, 513 364 259 226 215 178 159 bajtów

Dobre eseje należy zawsze pisać w 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)}

Używa to pakietu xstring, ponieważ nie ma wbudowanej zbyt dużej liczby operacji na łańcuchach. Po stronie dodatniej górny limit dla wbudowanego \Romanformatowania jest większy niż kiedykolwiek będziemy potrzebować (nawet dla sonetów) 2^31-1. Uwzględniłem \documentclass{ecv}w liczeniu, ale żaden kod testowy:

\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}

(Jeśli byłeś na tyle szalony, żeby z niego skorzystać, musiałbyś przynajmniej odhaczyć nazwy makr. Nadpisywanie makr jednoznakowych to zła praktyka)

Nie golfił i skomentował:

\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

Zauważ, że w tej wersji komentarze są wymagane, w przeciwnym razie nowa linia jest interpretowana jako biała spacja i rozwija się do spacji.

Chris H.
źródło
Możesz zapisać trzy bajty, używając ~nazwy makra zamiast \s. Ale tak naprawdę wcale nie potrzebujesz \s( \stripcommaw wersji bez golfa): możesz po prostu, \def\t#1 #2, #3 #4, #5 #6a TeX zajmie się usuwaniem przecinków. (Więc zamiast tego możesz użyć ~lewy \t, oszczędzając 1 bajt.)
ShreevatsaR
@ShreevatsaR dziękuję. Zastanawiałeś się, jak wstawić odrzucenie przecinka, i było to prostsze niż cokolwiek, czego próbowałem. Sztuczka z aktywnymi ~jest trochę paskudna, ale podoba mi się tutaj. Oznaczało to, że musiałem zmienić klasę dokumentów (na jeden z trzech 3-literowych .clsplików, które zainstalowałem)
Chris H
1
Tak, liczę 182 bajty, co bije nie tylko odpowiedź w Pythonie, ale także Ruby, PHP i jedną z odpowiedzi w Perlu :-)
ShreevatsaR
1
@ShreevatsaR wciąż lepiej: 178 jako \@roman i \@Romannie potrzebują nawiasów klamrowych wokół argumentu.
Chris H
1
Wszystkie główne xstringpomysły były twoje :-) Gra w golfa była świetna!
ShreevatsaR
8

JavaScript (ES6), 210 183 178 177 171 bajtów

Zaoszczędzono 27 bajtów, rozwijając parametry odpoczynku (dzięki produktom ETH )

Zaoszczędzono 5 bajtów, nie dopasowując paren otwierających i modyfikując generację cyfr rzymskich

Zapisano 1 bajt, dostosowując końcowe wyrażenie trójskładnikowe

Zaoszczędzono 6 bajtów, łącząc dwie pasujące grupy

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

Przypadki testowe:

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

żyr
źródło
Nie mogę teraz przetestować, ale czy nadal działa, jeśli wymienisz Act każdy \D*z nich na .*?
Patrick Roberts
Może; Wahałem się, ponieważ JavaScript domyślnie stosuje chciwe dopasowanie. Przetestuję to później dzisiaj i dam znać, czy to działa.
gyre
8

Galaretka ,  87 86  85 bajtów

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

Wypróbuj online! lub zobacz zestaw testowy

W jaki sposób?

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
źródło
1
To musi być jakaś płyta dla scenariusza Jelly
MickyT
@MickyT Nie, już tam jestem ...
Jonathan Allan
To powoduje ból głowy. Nie czytaj 0/10. : P
Erik the Outgolfer
@EriktheOutgolfer Przepraszamy !!
Jonathan Allan
2
Żarty na bok, widzę pewne rzeczy naprawdę unikalne w tym kodzie, jak œr, Ṗ,Ç, Ṗ€V, ṪÇ$, Wjako ostatnie ogniwo w link pomocnik, ewentualnie innych też, ładny wysiłku! To nie jest zwykłe przesłanie 80-osobowej galaretki, zasługuje na szczególne uznanie wśród ludzi galaretek.
Erik the Outgolfer
6

R , 94 126 112 166 bajtów

A teraz jest bardziej sformułowany niż wcześniej :(, wróć do dalszej gry w golfa. Regex za zmniejszenie bezwstydnie skradzionego odnośnika do strony pożyczonego od @FryAmTheEggman.

Teraz naprawdę muszę trochę popracować, aby odzyskać bajty, ale teraz działa to w drugim przypadku.

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

Wypróbuj online! - Pamiętaj, że elnie działa w TIO i został zastąpiony przezunlist

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
źródło
4

Siatkówka ,89 88 bajtów

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

Wypróbuj online!

Zaoszczędzono 3 bajty dzięki Neilowi.

Usuwa niepotrzebne znaki przed zamianą dwóch pierwszych cyfr na bloki iznaków. Następnie dopasowuje fragmenty tych iliter, tworząc odpowiednie cyfry rzymskie. Następnie używamy pierwszej cyfry rzymskiej. Na koniec dopasowujemy jak najwięcej liczb przed myślnikiem i po łączniku, tak aby liczba cyfr w liczbie była taka sama. Następnie usuwamy ten prefiks z drugiego numeru.

FryAmTheEggman
źródło
Wymiana iiiiiz v, iiiize ivi vivze ixwydaje się zaoszczędzić kilka bajtów.
Neil
Wydaje się jednak, że skrócenie numeru linii jest błędne 345-356- spodziewałem się 345-56.
Neil
@Neil Whoops, zapomniałem o rozszerzeniu kleene. W każdym razie dzięki za wskazówkę!
FryAmTheEggman
Czy możesz użyć \bpod koniec ostatniej zamiany, aby uniknąć konieczności powtórzenia )zamiany?
Neil
@ Neil Nie sądziłem, że to zadziała, ponieważ myślałem, że będę musiał użyć, \dale wydaje się, że działa, ponieważ nie ma innej granicy słów. Dzięki!
FryAmTheEggman
4

PHP> = 7,1, 195 bajtów

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

Przypadki testowe

Rozszerzony

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
źródło
1
preg_match_all("#\d+#",$argn,$m);[$a,$s,$b,$e]=$m[0];oszczędza dwa bajty. if($e){for(;$b[$i]==$e[$i];$i++);echo"-",substr($e,$i);}echo")";powinien oszczędzić 46. (you do not have to support past 5)oszczędza 15 bajtów.
Tytus
1
".$r[$s].$b"zapisuje kolejne 5 bajtów; i [[$a,$s,$b,$e]]=$m;jeszcze jeden. Niestety przypisania tablic nie działają (jeszcze).
Tytus
if($e&&$e-$b){for($x=str_pad($b,strlen($e),0,0);$x[$i]==$e[$i];$i++);echo"-",substr($e,$i);}zapisuje 10 bajtów i może działać.
Tytus
Dla mnie wygląda dobrze . I nie &&$e-$bjest konieczne w przypadkach testowych; więc oszczędza 17 bajtów, a nie 10. Btw. wciąż nie potrzebujesz rzymskiego od 6 do 9.;)
Tytus
1
Można wymienić for(;str_pad($b,strlen($e),0,0)[$i]==$e[$i];)$i++;z for(;$e&&~$c=$e[-++$k];)$c>$b[-$k]&&$i=-$k;.
Christoph
3

Perl 5, 185 + 1 = 186 bajtów

Kara 1 bajt za wymaganą -nflagę.

Może się nie powieść w niektórych przypadkach testowych, w których scena ma więcej niż 10 ^ 11 linii, ale sceny AFAIK bez Szekspira są dość długie;)

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

W czytelnej formie:

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
źródło
2

Rubinowy , 204 + 1 = 205 bajtów

Używa -pflagi.

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

Wypróbuj online!

Wartość tuszu
źródło
2

Python 2.7 298 bajtów

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
źródło
2

Perl, 99 bajtów

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

Uruchom z perl -pe. 98 bajtów (źródło) + 1 bajt ( pflaga) = 99.

Ponury
źródło
W momencie tego postu istnieje jeszcze jedna odpowiedź Perla ( codegolf.stackexchange.com/a/123400/6484 ), ale ma 186 bajtów długości i używa bardzo różnych pomysłów, więc czułem, że osobna odpowiedź była odpowiednia.
Grimmy,
Wydaje się to marnotrawstwem, ponieważ wymaga przepisów dla cyfr rzymskich powyżej 5
Hagen von Eitzen
2
@HagenvonEitzen wyzwanie określa, że ​​musisz obsługiwać cyfry rzymskie do 9. Przypadek testowy 3 ma „Scenę 9”, a przypadek testowy 6 ma „Scenę 8”; oba zawiodłyby, gdybym wspierał tylko cyfry rzymskie do 5.
Grimmy
2

Python 2 , 301 259 252 221 bajtów

Ogromne -31 bajtów dzięki Chasowi Brownowi.

Więc to jest ... wyjątkowo długie ... Myślę, że mogę to pograć w golfa, ale od jakiegoś czasu dręczyłem sobie mózg.

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

Wypróbuj online!

Awaria

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
                         )
całkowicie ludzki
źródło
Możesz trochę zaoszczędzić, używając b,c,d,e,f=s.groups()zamiasta,b,c,d,e,f=[s.group(n) for n in range(6)]
Chas Brown
I kolejne 5 za pomocą [0]+'i,ii,iii,iv,v,vi,vii,viii,ix'.split(',')zamiast [s,'i','ii','iii','iv','v','vi','vii','viii','ix'].
Chas Brown
Poprawione - I kolejne 8 za pomocą [0]+'i ii iii iv v vi vii viii ix'.split()zamiast [s,'i','ii','iii','iv','v','vi','vii','viii','ix'].
Chas Brown
Och, nie wiedziałem, że możesz to zrobić. Dzięki!
całkowicieludzki
Fajne poprawki wprowadzające 0cytaty. Jedno ostatnie drobne Tweak widzę: używasz: s,r=XXX,YYY;b,c,d,e,f=s.groups();można zaoszczędzić kolejne 4 bajty zamiast przez równoważnie mówiąc: b,c,d,e,f=XXX.groups();r=YYY;. W rezultacie masz 81 bajtów mniej niż moje zgłoszenie! :)
Chas Brown
2

q / kdb +, 200 187 bajtów

Rozwiązanie:

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

Przykłady:

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

Objaśnienie: (lekko nie 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)),")"
  }

Uwagi:

Technicznie może być o 2 bajty krótszy (nie ma takiej potrzeby f:), ale ułatwia pokazanie przykładów w ten sposób.

Edycje:

  • -13 bajtów; otrzymuje stringz $:, countz #:, tilz (!)i firstz (*:), obsada indeksy R do strun, więc nie musimy działać szarego / sceny w int
streetster
źródło