골프 내 셰익스피어 견적 참조


45

셰익스피어에 대한 에세이를 작성하는 동안, 나는 인용 할 수있는 인용문을 더 관리하기 쉬운 길이로 줄여야한다는 것을 깨달았습니다. 나는 이전에 이것을 쓰고 있었다 :

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

그러나 나는 이제 다음과 같이 작성하라는 지시를 받았습니다.

(I.ii.345-6)

분명히, 나는 셰익스피어 인용 부호를 약간 아래로 골프화하기 위해 골프 코드가 필요합니다.

작업

템플릿 1 또는 2 다음에 문자열 입력이 주어지면 각각 템플릿 3 또는 4 다음에 문자열을 인쇄하거나 반환하는 프로그램 또는 함수를 작성하십시오. 1 ~ 5 장과 1 ~ 9 장만 지원하면됩니다.

템플릿

템플릿 1

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

당신은 가정 수 x5를 초과하지, y결코 (9)을 초과하지, a그리고 b항상 언어의 최대 양의 표준 정수 값을 초과하지 않는 양의 정수이고, a독점적으로보다 항상 b.

템플릿 2

(Act x, Scene y, Line a)

에 대한 정보를 제외하고 템플릿 1과 동일한 조건 b.

템플릿 3

(x.y.a-b)

x대문자 로마 숫자는 어디에 있고, 로마 숫자 y는 소문자이며 a, b숫자이며, b같은 의미의 첫 번째 다른 숫자보다 작은 숫자로 줄어 듭니다 a.

템플릿 4

(x.y.a)

에 대한 정보를 제외하고 템플릿 3과 동일한 조건 b.

테스트 사례

f(s)작업에 정의 된 기능으로 보자 . ""문자열 값을 나타냅니다.

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

이 문제를 해결하려면 다음 아랍어-로마 숫자 변환이 지원되어야합니다.

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

텍스트 파일이 허용됩니까?
Dat

21
SPL에서 답변을 정말로 기대하고 있습니다.
L3via5

5
테스트 사례 :(Act 1, Scene 2, Lines 345-3499)
dzaima

11
셰익스피어의 답변은 누구입니까?
Titus

1
@ 그림 고정 # 1, # 2가 좋습니까?
애디슨 크럼

답변:


12

셰익스피어 프로그래밍 언어 (비경쟁)

난 정말이 질문을 좋아하고 거기로 약간의 관심 셰익스피어 언어의 대답이 여기 하나입니다.

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!

(6000 바이트가 넘습니다.) 거기에는 몇 가지 트릭이 있지만 골프를 많이 시도하지는 않았습니다. (1) 이미 다른 답변에서 골프에 대한 점유율을 기여 했으며 (2) 모든 문자를 "페이지로 변경" "와"퍽 "또는"큰 큰 큰 큰 큰 고양이 "에 대한 모든 문구는 재미를 망치는 것 같습니다. 대신 로마 숫자를 다루는 부분에서는 로마자 등의 문자를 사용했습니다. 문자와 지침을 재사용하여 일부 입력 내용을 저장했습니다. :-)

프로그램은 대부분 간단해야하지만 언급 할 가치가있는 주름은 이것을 쓸 때 정수를 읽는 것이 다음과 같이 작동한다고 가정했습니다 scanf. (1) 입력에서 정수에 해당하는만큼 많은 문자 만 소비하고 (2) 오류가 발생하면 변수를 변경하지 마십시오. (이 두 번째 속성을 사용하여 Act II에서 템플릿 1과 2를 구별하여 "Line"까지 읽고 정수를 읽으려고 시도했습니다.) 불행히도 원래 구현에 버그가있는 것으로 나타났습니다. 언어는 어디 줄의 끝으로 정수를 소모의 모든 것을 읽고이 실패 할 경우이 필요하므로, 에러가 발생 하는 패치를libspl.c 만들기 위해 int_input행동하라 더 좋아 scanf.

그리고 그것으로 작동합니다 :

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

내가 이해하려고 노력하는 사람을 돕기 위해 내가 일했던 약간 높은 수준의 의사 코드 :

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

위의 최종 코드와 관련이 연습으로 남아 있습니다. :-) 셰익스피어 PL에는 산술과 스택, 고 토스가 있지만 포인터 (레이블 만)는 없으므로 로마자로의 변환과 같은 "서브 루틴"을 구현하는 것은 약간 흥미 롭습니다.


와우, 예쁘다. 감사합니다! :)
Steve Bennett

1
반복 upvote에 버튼을 때려
애디슨 크럼프

9

유액, 513 364 259 226 215 178 159 바이트

좋은 에세이는 항상 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)}

내장 된 문자열 처리가 많지 않기 때문에 xstring 패키지를 사용합니다. 내장 \Roman형식상한 은 (소넷의 경우)에 필요한 것보다 큽니다 2^31-1. \documentclass{ecv}카운트에 포함 했지만 테스트 코드는 없습니다.

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

(실제로 이것을 사용하기에 충분히 미쳤다면, 적어도 매크로 이름을 풀어야합니다. 단일 문자 매크로를 덮어 쓰는 것은 나쁜 습관입니다)

Ungolfed 및 댓글 :

\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

이 버전에서는 주석이 필요합니다. 그렇지 않으면 개행 문자가 공백으로 해석되어 공백으로 확장됩니다.


~대신 매크로 이름으로 3 바이트를 절약 할 수 \s있습니다. 그러나 실제로 \s( \stripcomma골프가없는 버전에서는) 전혀 필요하지 않습니다 . \def\t#1 #2, #3 #4, #5 #6TeX는 쉼표를 제거 할 것입니다. (따라서 대신 1 바이트를 절약 하면서 ~트릭을 사용할 수 있습니다 \t.)
ShreevatsaR

@ShreevatsaR 감사합니다. 쉼표 거부 인라인을 얻는 방법을 알아 냈으며 내가 시도한 것보다 간단했습니다. 활동적인 속임수 ~는 약간 불쾌하지만 여기가 마음에 듭니다. 그것은 문서 클래스를 변경해야한다는 것을 의미했습니다 ( .cls설치 한 다른 3 글자 파일 중 하나로 )
Chris H

1
예, 182 바이트를 계산하는데, 파이썬 응답뿐만 아니라 Ruby, PHP 및 Perl 응답 중 하나를 능가합니다 :-)
ShreevatsaR

1
@ShreevatsaR 더 나은 여전히 ​​: 178 as \@roman\@Roman논쟁 주위에 중괄호가 필요하지 않습니다.
Chris H

1
모든 주요 xstring아이디어는 당신이었습니다 :-) 함께 골프를 치는 것은 재미있었습니다!
ShreevatsaR

8

자바 스크립트 (ES6) 210 183 178 177 171 바이트

나머지 매개 변수를 언 롤링하여 27 바이트 절약 ( ETHproductions 덕분에 )

오프닝 패런과 일치하지 않고 로마 숫자 생성을 조정하여 5 바이트를 절약했습니다.

최종 삼항식을 조정하여 1 바이트 절약

일치하는 두 그룹을 결합하여 6 바이트 절약

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

테스트 사례 :

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


지금 테스트 할 수는 없지만 교체 Act 하고 각각 \D*으로 바꾸면 여전히 작동 .*합니까?
Patrick Roberts

그것은 수도; JavaScript는 기본적으로 욕심 매칭을 사용하기 때문에 주저했습니다. 오늘 나중에 테스트하고 작동하는지 알려 드리겠습니다.
gyre

8

젤리 ,  87 86  85 바이트

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

온라인으로 사용해보십시오! 또는 테스트 스위트를 참조하십시오

어떻게?

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
그것은 Jelly 스크립트에 대한 일종의 기록
이어야합니다

@MickyT 아니, 나는 더 이상 거기에서 ...
Jonathan Allan

이것은 두통을 유발합니다. 0/10을 읽지 마십시오. : P
Outgolfer Erik에 30:17

@EriktheOutgolfer 죄송합니다 !!
Jonathan Allan

2
농담은 제쳐 놓고, 그 코드에서 정말 독특한 물건을 볼 수 있습니다, 같은 œr, Ṗ,Ç, Ṗ€V, ṪÇ$, W도우미 링크의 마지막 링크도 가능하게 다른 사람, 좋은 노력으로! 이것은 당신의 평범한 80- 젤리 제출물이 아니며, 이것은 젤리 사람들 사이에서 특별한 인정을받을 가치가 있습니다.
Outgolfer Erik

6

R , 94 126 112 166 바이트

그리고 지금 :( 이전보다 그것의 wordier, 뻔뻔 페이지 참조 감소 골프에 더. 정규식을 시도하고 다시 도난당한 @FryAmTheEggman에서 차용합니다.

이제 바이트를 다시 얻으려면 약간의 작업이 필요하지만 두 번째 경우에는 작동합니다.

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

온라인으로 사용해보십시오! - 참고 elTIO 작업을하지 않는 및 대체되었습니다unlist

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

망막 ,89 88 바이트

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

온라인으로 사용해보십시오!

Neil 덕분에 3 바이트를 절약했습니다.

처음 두 숫자를 i문자 블록으로 바꾸기 전에 불필요한 문자를 제거하십시오 . 그런 다음이 is 덩어리를 일치 시켜 적절한 로마 숫자를 형성합니다. 그런 다음 첫 로마 숫자를 대문자로 바꿉니다. 마지막으로 하이픈 앞과 하이픈 뒤에 가능한 한 많은 숫자를 일치시켜 숫자의 자릿수가 동일하게합니다. 그런 다음 두 번째 숫자에서 해당 접두사를 제거합니다.


교체 iiiiiv, iiiiivviv함께하는 ix바이트의 몇 가지를 저장하는 것 같다.
Neil

그러나 귀하의 줄 번호 단축은 잘못에 대해지고있는 것 같다 345-356내가 기다리고 있었다 - 345-56.
Neil

@Neil Whoops, kleene 확장을 잊었다. 어쨌든 팁 주셔서 감사합니다!
FryAmTheEggman

\b대체에서 반복을 피하기 위해 마지막 교체가 끝날 때 사용할 수 있습니까 )?
Neil

@ Neil 사용해야한다고 생각한 \d후에는 효과가 없다고 생각 했지만 다른 단어 경계가 없기 때문에 작동하는 것 같습니다. 감사!
FryAmTheEggman

4

PHP> = 7.1, 195 바이트

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

테스트 케이스

넓히는

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];2 바이트를 절약합니다. if($e){for(;$b[$i]==$e[$i];$i++);echo"-",substr($e,$i);}echo")";저장해야 (you do not have to support past 5)합니다. 15 바이트를 저장합니다.
Titus

1
".$r[$s].$b"다른 5 바이트를 절약합니다. 그리고 [[$a,$s,$b,$e]]=$m;다른 하나. 불행히도, 배열 할당은 참조로 작동하지 않습니다 (아직).
Titus

if($e&&$e-$b){for($x=str_pad($b,strlen($e),0,0);$x[$i]==$e[$i];$i++);echo"-",substr($e,$i);}10 바이트를 절약하고 작동 할 수 있습니다.
Titus

나에게 괜찮아 보인다 . 그리고 &&$e-$b테스트 케이스에 대한 필요가; 따라서 10이 아닌 17 바이트를 절약합니다. Btw. 로마서 6 ~ 9 장까지는 여전히 필요하지 않습니다.;)
Titus

1
으로 교체 할 수 for(;str_pad($b,strlen($e),0,0)[$i]==$e[$i];)$i++;있습니다 for(;$e&&~$c=$e[-++$k];)$c>$b[-$k]&&$i=-$k;.
Christoph

3

펄 5, 185 + 1 = 186 바이트

필요한 -n플래그에 대해 1 바이트 페널티 .

장면에 10 ^ 11 라인 이상이있는 일부 테스트 케이스에서는 실패 할 수 있지만 AFAIK 셰익스피어 장면이 너무 길지 않습니다.)

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

읽을 수있는 형태로 :

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

루비 , 204 + 1 = 205 바이트

-p플래그를 사용합니다 .

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

온라인으로 사용해보십시오!


2

파이썬 2.7 298 바이트

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

펄, 99 바이트

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

로 실행하십시오 perl -pe. 98 바이트 (소스) + 1 바이트 ( p플래그) = 99


이 게시물을 게시 할 때 다른 Perl 답변 ( codegolf.stackexchange.com/a/123400/6484 )이 있지만 길이는 186 바이트이며 매우 다른 아이디어를 사용하므로 별도의 답변을 만드는 것이 적절하다고 느꼈습니다.
그리미

이것은 5 이상으로 로마 숫자에 대한 조항을 필요로 낭비 될 것으로 보인다
하겐 폰 Eitzen

2
@HagenvonEitzen 과제는 로마 숫자를 최대 9까지 지원해야 함을 지정합니다. 테스트 사례 3에는 "Scene 9"가 있고 테스트 사례 6에는 "Scene 8"이 있습니다. 로마 숫자를 최대 5까지만 지원하면 둘 다 실패합니다.
Grimmy

2

파이썬 2 , 301 259 252 221 바이트

Chas Brown 덕분에 무려 -31 바이트입니다.

그래서, 이건 ... 매우 길다 ... 골프를 할 수있을 것 같지만 한동안 내 두뇌를 망치고 있었다.

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

온라인으로 사용해보십시오!

고장

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,c,d,e,f=s.groups()a,b,c,d,e,f=[s.group(n) for n in range(6)]
Chas Brown

그리고 [0]+'i,ii,iii,iv,v,vi,vii,viii,ix'.split(',')대신 5을 사용하여 또 하나 [s,'i','ii','iii','iv','v','vi','vii','viii','ix'].
Chas Brown

수정-그리고 대신에 다른 8 개 를 사용 [0]+'i ii iii iv v vi vii viii ix'.split()합니다 [s,'i','ii','iii','iv','v','vi','vii','viii','ix'].
Chas Brown

오, 네가 그렇게 할 줄 몰랐어 감사!
완전히 인간적인

0따옴표 안에 넣는 것이 좋습니다. 내가 볼 수있는 마지막 사소한 조정 : 사용 중 : s,r=XXX,YYY;b,c,d,e,f=s.groups();대신 다음과 같이 말하여 다른 4 바이트를 절약 할 수 있습니다 b,c,d,e,f=XXX.groups();r=YYY;. 그래서 당신은 내 제출보다 81 바이트가 적습니다! :)
Chas Brown

2

Q / KDB +, 200 187 바이트

해결책:

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

예 :

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

설명 : (약간 언 골프)

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

노트:

기술적으로 2 바이트 더 짧을 수 있지만 (필요하지 않음 f:)이 방법으로 예제를 쉽게 표시 할 수 있습니다.

편집 :

  • -13 바이트; , with , with 및 with 로 대체 string되어 R의 인덱스를 문자열로 캐스팅하므로 행위 / 장면을 int로 캐스팅 할 필요가 없습니다.$:count#:til(!)first(*:)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.