Tham khảo trích dẫn Golf my Shakespeare


45

Trong khi viết bài luận của mình cho Shakespeare, tôi nhận ra rằng tôi cần rút ngắn các tài liệu tham khảo trích dẫn của mình xuống độ dài dễ quản lý hơn. Trước đây tôi đã viết điều này:

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

Nhưng giờ tôi được yêu cầu viết chúng như thế này:

(I.ii.345-6)

Rõ ràng, tôi cần một số mã đánh golf để đánh golf các tài liệu tham khảo trích dẫn Shakespeare của tôi xuống một chút.

Nhiệm vụ

Viết chương trình hoặc hàm, được cung cấp đầu vào chuỗi theo Mẫu 1 hoặc 2, in hoặc trả lại chuỗi theo Mẫu 3 hoặc 4, tương ứng. Bạn chỉ phải hỗ trợ Công vụ 1 đến 5 và Cảnh 1 đến 9.

Mẫu

Mẫu 1

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

Bạn có thể cho rằng xkhông bao giờ vượt quá 5, ykhông bao giờ vượt quá 9 abluôn là số nguyên dương không vượt quá giá trị nguyên dương chuẩn tối đa của ngôn ngữ của bạn và aluôn luôn nhỏ hơn b.

Mẫu 2

(Act x, Scene y, Line a)

Điều kiện tương tự như Mẫu 1, không bao gồm thông tin về b.

Mẫu 3

(x.y.a-b)

Trong trường hợp xlà một chữ số la mã vốn, ylà một chữ thường roman số, ablà những con số, và bđược rút ngắn xuống còn chỉ các chữ số ít hơn các chữ số khác nhau đầu tiên có ý nghĩa tương đương từ a.

Mẫu 4

(x.y.a)

Điều kiện tương tự như Mẫu 3, không bao gồm thông tin về b.

Các trường hợp thử nghiệm

Hãy f(s)là hàm được định nghĩa trong Nhiệm vụ. ""biểu thị một giá trị chuỗi.

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

Đối với mục đích của thử thách này, các bản dịch từ tiếng Ả Rập sang tiếng La Mã sau đây phải được hỗ trợ:

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

Các tập tin văn bản được phép?
Đạt

21
Tôi thực sự hy vọng câu trả lời trong SPL.
L3viathan

5
Trường hợp thử nghiệm:(Act 1, Scene 2, Lines 345-3499)
dzaima

11
Ai là người đưa ra câu trả lời trong Shakespeare?
Tít

1
@Grimy Đã sửa # 1, # 2 có tốt không?
Addison Crump

Câu trả lời:


12

Ngôn ngữ lập trình Shakespeare (không cạnh tranh)

Tôi thực sự thích câu hỏi này, và vì có một chút hứng thú với câu trả lời bằng ngôn ngữ của Shakespeare, đây là một câu hỏi.

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!

(Nó dài hơn 6000 byte.) Có một số mánh khóe trong đó nhưng tôi chưa thử chơi golf nhiều vì: (1) Tôi đã đóng góp phần chơi golf của mình vào một câu trả lời khác và (2) thay đổi tất cả các ký tự thành "Trang "Và" Puck ", hoặc tất cả các cụm từ để" mèo lớn lớn lớn lớn ", dường như làm hỏng cuộc vui. Thay vào đó là phần liên quan đến chữ số La Mã, tôi đã sử dụng các ký tự là người La Mã, v.v. Tôi đã sử dụng lại các ký tự và hướng dẫn để lưu một số cách gõ. :-)

Chương trình nên chủ yếu đơn giản nhưng một điều đáng nói là khi tôi viết bài này, tôi giả sử rằng việc đọc một số nguyên sẽ hoạt động như scanfsau: (1) chỉ tiêu thụ càng nhiều ký tự từ đầu vào tương ứng với một số nguyên và trong trường hợp (2) của thất bại, để lại các biến không thay đổi. (Tôi đã sử dụng thuộc tính thứ hai này để phân biệt giữa Mẫu 1 và 2 trong Đạo luật II, bằng cách đọc đến "Dòng" và cố gắng đọc một số nguyên.) Thật không may là nó (tôi nghĩ) có một lỗi trong quá trình triển khai ban đầu của ngôn ngữ trong đó việc đọc một số nguyên sẽ tiêu thụ mọi thứ cho đến cuối dòng và đưa ra lỗi nếu nó không thành công, vì vậy nó cần một bản válibspl.c để thực hiện int_inputhành vi giống như vậy scanf.

Và với điều đó, nó hoạt động:

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

Mã giả cấp độ cao hơn một chút mà tôi đã làm việc để giúp bất cứ ai cố gắng hiểu:

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

Liên quan ở trên với mã cuối cùng được để lại như một bài tập. :-) Lưu ý rằng ShakespearePL có số học và ngăn xếp và gotos nhưng không có con trỏ (chỉ nhãn), do đó, việc thực hiện "chương trình con" như chuyển đổi sang Roman là một chút thú vị.


Ồ thật đẹp. Cảm ơn bạn! :)
Steve Bennett

1
liên tục tát nút upvote
Addison Crump

9

LaTeX, 513 364 259 226 215 178 159 byte

Những bài luận hay phải luôn được viết bằng 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)}

Điều này sử dụng gói x chuỗi vì không có nhiều xử lý chuỗi được tích hợp. Về mặt tích cực, giới hạn trên cho \Romanđịnh dạng tích hợp lớn hơn mức chúng tôi cần (ngay cả đối với các sonnet) tại 2^31-1. Tôi đã bao gồm \documentclass{ecv}trong số đếm, nhưng không có mã kiểm tra nào:

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

(Nếu bạn đủ điên rồ để thực sự sử dụng điều này, thì ít nhất bạn cũng phải xóa tên macro. Ghi đè các macro ký tự đơn là một thực tiễn tồi)

Ungolfed và bình luận:

\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

Lưu ý rằng trong phiên bản này, các bình luận được yêu cầu nếu không thì dòng mới được hiểu là khoảng trắng và mở rộng ra một khoảng trắng.


Bạn có thể lưu ba byte bằng cách sử dụng ~làm tên macro thay vì \s. Nhưng thực ra bạn không cần \s( \stripcommatrong phiên bản không có bản quyền): bạn chỉ có thể \def\t#1 #2, #3 #4, #5 #6và TeX sẽ lo việc tước dấu phẩy. (Vì vậy, bạn có thể sử dụng ~thủ thuật \tthay vào đó, tiết kiệm 1 byte.)
ShreevatsaR

@ShreevatsaR cảm ơn bạn. Bạn đã tìm ra cách để có được nội tuyến từ chối dấu phẩy và nó đơn giản hơn bất cứ điều gì tôi đã thử. Thủ thuật với chủ động ~là một chút khó chịu nhưng tôi thích nó ở đây. Điều đó có nghĩa là tôi phải thay đổi lớp tài liệu (thành một trong các .clstệp 3 chữ cái khác mà tôi đã cài đặt)
Chris H

1
Có, tôi đếm 182 byte, không chỉ trả lời câu trả lời của Python mà còn cả Ruby, PHP và một trong những câu trả lời của Perl :-)
ShreevatsaR

1
@ShreevatsaR vẫn tốt hơn: 178 vì \@roman\@Romankhông cần niềng răng xung quanh đối số.
Chris H

1
Tất cả các xstringý tưởng chính là của bạn :-) Thật vui khi chơi golf cùng nhau!
ShreevatsaR

8

JavaScript (ES6), 210 183 178 177 171 byte

Đã lưu 27 byte bằng cách hủy đăng ký tham số phần còn lại (nhờ vào ETHproductions )

Đã lưu 5 byte bằng cách không khớp với paren mở và bằng cách điều chỉnh thế hệ số La Mã

Đã lưu 1 byte bằng cách điều chỉnh biểu thức ternary cuối cùng

Đã lưu 6 byte bằng cách kết hợp hai nhóm khớp

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

Các trường hợp thử nghiệm:

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


Tôi không thể kiểm tra ngay bây giờ, nhưng nó vẫn làm việc nếu bạn thay thế Act và từng \D*.*?
Patrick Roberts

Nó có thể; Tôi đã do dự để thử vì JavaScript sử dụng kết hợp tham lam theo mặc định. Tôi sẽ kiểm tra nó sau hôm nay và cho bạn biết nếu nó hoạt động.
gyre

8

Thạch ,  87 86  85 byte

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

Hãy thử trực tuyến! hoặc xem một bộ thử nghiệm

Làm sao?

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

1
Đó phải là một bản thu âm cho kịch bản Jelly
MickyT

@MickyT Không, tôi đã ở ngoài đó lâu hơn ...
Jonathan Allan

Điều này gây ra đau đầu. Đừng đọc nó 0/10. : P
Erik the Outgolfer

@EriktheOutgolfer Xin lỗi !!
Jonathan Allan

2
Truyện cười sang một bên, tôi có thể thấy một số công cụ thực sự độc đáo trong mã rằng, giống như œr, Ṗ,Ç, Ṗ€V, ṪÇ$, Wnhư liên kết cuối cùng trên một liên kết helper, có thể những người khác quá, đẹp nỗ lực! Đây không phải là bài nộp Jelly 80 thông thường của bạn, điều này xứng đáng được công nhận đặc biệt trong số những người Jelly.
Erik the Outgolfer

6

R , 94 126 112 166 byte

Và bây giờ nó còn hay hơn trước :(, quay lại cố gắng chơi gôn hơn nữa. Regex cho việc giảm tham chiếu trang bị đánh cắp một cách đáng xấu hổ mượn từ @FryAmTheEggman.

Bây giờ tôi thực sự cần phải thực hiện một số công việc để lấy lại các byte, nhưng bây giờ nó hoạt động cho trường hợp thứ hai.

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

Hãy thử trực tuyến! - Lưu ý rằng elkhông hoạt động trên TIO và đã được thay thế bằngunlist

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

Võng mạc ,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

Hãy thử trực tuyến!

Đã lưu 3 byte nhờ Neil.

Loại bỏ các ký tự không cần thiết trước khi thay thế hai số đầu tiên bằng các khối iký tự. Sau đó, nó khớp với các khối của các is này để tạo thành các chữ số La Mã thích hợp. Sau đó, chúng tôi viết hoa chữ số La Mã đầu tiên. Cuối cùng, chúng ta ghép càng nhiều số càng tốt trước dấu gạch nối và sau dấu gạch nối sao cho số chữ số trong số đó giống nhau. Sau đó chúng tôi xóa tiền tố đó khỏi số thứ hai.


Thay thế iiiiivới v, iiiivới ivvivvới ixdường như tiết kiệm một vài byte.
Neil

Tuy nhiên, việc rút ngắn số dòng của bạn dường như đang bị nhầm lẫn 345-356- tôi đã mong đợi 345-56.
Neil

@Neil Rất tiếc, quên mở rộng kleene. Dù sao cũng cảm ơn vì tiền boa!
FryAmTheEggman

Bạn có thể sử dụng \bvào cuối của sự thay thế cuối cùng để tránh phải lặp lại )thay thế?
Neil

@Neil Tôi không nghĩ rằng nó sẽ hoạt động vì tôi nghĩ tôi cần sử dụng \dnhưng nó dường như hoạt động vì không có ranh giới từ nào khác. Cảm ơn!
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,")";

Tủ thử

Mở rộng

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];tiết kiệm hai byte. if($e){for(;$b[$i]==$e[$i];$i++);echo"-",substr($e,$i);}echo")";nên lưu 46. (you do not have to support past 5)tiết kiệm 15 byte.
Tít

1
".$r[$s].$b"tiết kiệm thêm 5 byte; và [[$a,$s,$b,$e]]=$m;một số khác. Thật không may, các bài tập mảng donett hoạt động bằng cách tham chiếu (chưa).
Tít

if($e&&$e-$b){for($x=str_pad($b,strlen($e),0,0);$x[$i]==$e[$i];$i++);echo"-",substr($e,$i);}tiết kiệm 10 byte và có thể hoạt động.
Tít

Có vẻ ổn với tôi . Và &&$e-$blà không cần thiết cho các trường hợp thử nghiệm; vì vậy nó tiết kiệm 17 byte, không phải 10. Btw. bạn vẫn không thể sử dụng roman 6 đến 9 .;)
Tít

1
Bạn có thể thay thế for(;str_pad($b,strlen($e),0,0)[$i]==$e[$i];)$i++;bằng for(;$e&&~$c=$e[-++$k];)$c>$b[-$k]&&$i=-$k;.
Christoph

3

Perl 5, 185 + 1 = 186 byte

Hình phạt 1 byte cho -ncờ yêu cầu .

Có thể thất bại đối với một số trường hợp thử nghiệm khi cảnh có hơn 10 ^ 11 dòng, nhưng cảnh AFAIK no Shakespeare khá dài;)

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

Ở dạng có thể đọc được:

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

Ruby , 204 + 1 = 205 byte

Sử dụng -pcờ.

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

Hãy thử trực tuyến!


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

Chạy với perl -pe. 98 byte (nguồn) + 1 byte ( pcờ) = 99.


Tại thời điểm đăng bài này, có một câu trả lời Perl khác ( codegolf.stackexchange.com/a/123400/6484 ), nhưng nó dài 186 byte và sử dụng các ý tưởng rất khác nhau, vì vậy tôi cảm thấy việc đưa ra một câu trả lời riêng là phù hợp.
Grimmy

Điều này có vẻ lãng phí vì phải mất các quy định cho các chữ số La Mã vượt quá 5
Hagen von Eitzen

2
@HagenvonEitzen thử thách xác định rằng bạn phải hỗ trợ các chữ số La Mã lên đến 9. Trường hợp thử nghiệm 3 có Cảnh Cảnh 9, và trường hợp thử nghiệm 6 có Cảnh 8 8; cả hai sẽ thất bại nếu tôi chỉ hỗ trợ các chữ số La Mã lên đến 5.
Grimmy

2

Python 2 , 301 259 252 221 byte

Một con số khổng lồ -31 byte nhờ Chas Brown.

Vì vậy, uh, điều này ... rất dài ... Tôi nghĩ rằng tôi có thể chơi golf này nhưng tôi đã bị suy yếu trong một thời gian.

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

Hãy thử trực tuyến!

Phá vỡ

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
                         )

Bạn có thể tiết kiệm một chút bằng cách sử dụng b,c,d,e,f=s.groups()thay vìa,b,c,d,e,f=[s.group(n) for n in range(6)]
Chas Brown

Và 5 khác bằng cách sử dụng [0]+'i,ii,iii,iv,v,vi,vii,viii,ix'.split(',')thay vì [s,'i','ii','iii','iv','v','vi','vii','viii','ix'].
Chas Brown

Sửa đổi - Và 8 khác bằng cách sử dụng [0]+'i ii iii iv v vi vii viii ix'.split()thay vì [s,'i','ii','iii','iv','v','vi','vii','viii','ix'].
Chas Brown

Oh, huh, không biết bạn có thể làm điều đó. Cảm ơn!
hoàn toàn là

Đẹp chỉnh đặt 0bên trong dấu ngoặc kép. Một điều chỉnh nhỏ cuối cùng tôi có thể thấy: bạn đang sử dụng: s,r=XXX,YYY;b,c,d,e,f=s.groups();bạn có thể lưu thêm 4 byte bằng cách nói tương đương : b,c,d,e,f=XXX.groups();r=YYY;. Vì vậy, bạn kết thúc với 81 byte ít hơn trình của tôi! :)
Chas Brown

2

q / kdb +, 200 187 byte

Giải pháp:

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

Ví dụ:

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

Giải thích: (hơi vô dụng)

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

Ghi chú:

Về mặt kỹ thuật, nó có thể ngắn hơn 2 byte (không cần f:) nhưng giúp hiển thị các ví dụ theo cách này dễ dàng hơn.

Chỉnh sửa:

  • -13 byte; được thay thế stringbằng $:, countvới #:, tilbằng (!)firstvới (*:), chuyển các chỉ số của R thành chuỗi để chúng ta không phải truyền diễn / cảnh thành ints
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.