ゴルフマイシェークスピア引用文献


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)

あなたは、と仮定してよいx、5を超えることはありませんy9を超えない、決して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

テキストファイルは許可されていますか?
ダット

21
私は本当にSPLでの答えを望んでいます。
-L3viathan

5
テストケース:(Act 1, Scene 2, Lines 345-3499)
-dzaima

11
シェークスピアで誰が答えを求めていますか?
タイタス

1
@Grimy Fixed#1、#2は良いですか?
アディソンクランプ

回答:


12

シェークスピアプログラミング言語(非競合)

私は本当にこの質問を言っていて、そこにあったように、いくつかの 関心シェイクスピア言語の答えでは、ここでは1です。

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)ページ」へのすべての文字を変更します「」と「パック」、または「ビッグビッグビッグビッグビッグキャット」のすべてのフレーズは、楽しみを台無しにしているようです。代わりに、ローマ数字を扱う部分には、ローマ字などの文字を使用しました。文字と指示を再利用して、入力を節約しました。:-)

プログラムはほとんど単純であるはずですが、言及する価値がある1つのしわは、私がこれを書いたとき、整数の読み取りは次のように動作すると仮定したことですscanf:失敗した場合、変数は変更しないでください。(この2番目のプロパティを使用して、Act IIでテンプレート1と2を区別しました。「行」まで読み取り、整数を読み取ろうとしました。)残念ながら、整数を読み取る言語は、行の最後まですべてを消費し、失敗するとエラーをスローするため、より動作させるためのパッチlibspl.cが必要です。int_inputscanf

そして、それで動作します:

% 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

上記を最終コードに関連付けることは、演習として残しておきます。:-) ShakespearePLには算術とスタックとゴトーがありますが、ポインター(ラベルのみ)はないので、ローマ語への変換のような「サブルーチン」の実装は少し興味深いことに注意してください。


うわー、それは美しいです。ありがとうございました!:)
スティーブベネット

1
アップボットボタンを繰り返したたく
アディソンクランプ

9

LaTeXの、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}

(これを実際に使用するほどクレイジーな場合は、少なくともマクロ名を無視する必要があります。単一文字のマクロを上書きするのは悪い習慣です)

非ゴルフとコメント:

\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バージョンでは)まったく必要ありません:できます。TeXがコンマの削除を処理\def\t#1 #2, #3 #4, #5 #6します。(したがって~\t代わりにこのトリックを使用して、1バイトを節約できます。)
ShreevatsaR

@ShreevatsaRありがとう。コンマ拒否をインラインで取得する方法を理解しましたが、私が試したどの方法よりも簡単でした。アクティブなトリック~はちょっと厄介ですが、ここでは気に入っています。それは私が(他の3文字の一つをdocumentclassにを変更しなければならなかったもので.cls、私がインストールされていたファイル)
クリス・H

1
はい、私はPythonの答えだけでなく、ルビー、PHPやPerlの回答の一つではないだけを打つ182バイト、:-)カウント
ShreevatsaR

1
@ShreevatsaRより良いまだ:178など\@roman\@Roman引数の周りにカッコを必要としません。
クリスH

1
すべての主なxstringアイデアはあなたのものでした:-)これは一緒にゴルフをするのが楽しかったです!
シュリーバツァー

8

JavaScriptの(ES6)、210の 183 178 177 171バイト

残りのパラメーターを展開することで27バイトを節約しましたETHproductionsのおかげ)

開始かっこを一致させず、ローマ数字の生成を微調整することで5バイトを節約しました

最終的な3進表現を調整して1バイトを保存しました

2つの一致するグループを組み合わせて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*を置き換えても機能し.*ますか?
パトリックロバーツ

かもしれない; 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
それは、ゼリースクリプトの一種の記録になる
はずです-MickyT

@MickyTいや、もう長い間…
ジョナサンアラン

これは頭​​痛を引き起こします。0/10を読まないでください。:P
エリック・ザ・アウトゴルファー

ええええええ!
ジョナサンアラン

2
ジョークはさておき、私はそのコードにいくつかの本当にユニークなものを見ることができる、などのœrṖ,ÇṖ€VṪÇ$Wヘルパーリンク上の最後のリンク、あまりにもおそらく他の人、素敵な努力として!これは通常の80枚のゼリーの提出ではありません。これは、ゼリーの人々の間で特別な評価を受けるに値します。
エリックアウトゴルファー

6

R94の 126 112 166バイト

そして今、それは以前よりも冗長です:(さらにゴルフをしようとすることに戻る。@ FryAmTheEggmanから借りた恥ずかしく盗まれたページ参照を減らすための正規表現。

今、私は本当にバイトを取り戻すためにいくつかの作業を行う必要がありますが、今では2番目のケースで動作します。

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

オンラインでお試しください!el-TIOでは機能せず、次のように置き換えられていることに注意してください。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バイト節約されました。

最初の2つの数字をi文字のブロックに置き換える前に、不要な文字を取り除きます。次に、これらiののチャンクを照合して適切なローマ数字を形成します。次に、最初のローマ数字を大文字にします。最後に、数字の桁数が同じになるように、ハイフンの前とハイフンの後にできる限り多くの数字を一致させます。次に、2番目の番号からそのプレフィックスを削除します。


、with 、withで置き換えるiiiiiv、数バイト節約されるようです。iiiiivvivix
ニール

しかし、あなたの行番号の短縮が間違っているようです345-356-私は期待していました345-56
ニール

@Neil Whoops、kleene拡張を忘れました。とにかくヒントをありがとう!
FryAmTheEggman

\b最後の置換の最後に使用して)、置換で繰り返す必要がなくなりますか?
ニール

@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")";46を(you do not have to support past 5)保存する必要があります。15バイトを保存します。
タイタス

1
".$r[$s].$b"さらに5バイト節約します。そして[[$a,$s,$b,$e]]=$m;もう一つ。残念ながら、配列の割り当ては参照によって(まだ)動作しません。
タイタス

if($e&&$e-$b){for($x=str_pad($b,strlen($e),0,0);$x[$i]==$e[$i];$i++);echo"-",substr($e,$i);}10バイトを節約し、動作する可能性があります。
タイタス

私には大丈夫に見えます。また&&$e-$b、テストケースには不要です。10バイトではなく17バイトを節約します。あなたはまだローマ6から9を必要としません;)
タイタス

1
あなたは置き換えることができfor(;str_pad($b,strlen($e),0,0)[$i]==$e[$i];)$i++;for(;$e&&~$c=$e[-++$k];)$c>$b[-$k]&&$i=-$k;
クリストフ

3

Perl 5、185 + 1 = 186バイト

必要な-nフラグの1バイトのペナルティ。

シーンに10 ^ 11を超える行がある一部のテストケースでは失敗する可能性がありますが、シェイクスピアのシーンは非常に長いです;)

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

Python 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

Perl、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

パイソン2301の 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)]
チャスブラウン

そして5の[0]+'i,ii,iii,iv,v,vi,vii,viii,ix'.split(',')代わりにを使用して[s,'i','ii','iii','iv','v','vi','vii','viii','ix']
チャスブラウン

修正-そして、別の8の[0]+'i ii iii iv v vi vii viii ix'.split()代わりにを使用[s,'i','ii','iii','iv','v','vi','vii','viii','ix']
チャスブラウン

ああ、ハァッ、それができるとは知らなかった。ありがとう!
完全に人間の

0引用符の中に素敵な微調整。私が見ることができる最後のマイナーな微調整:あなたが使用している:s,r=XXX,YYY;b,c,d,e,f=s.groups();代わりに同等に言うことにより、あなたはさらに4バイトを保存することができますb,c,d,e,f=XXX.groups();r=YYY;。だから、あなたは私の提出よりも81バイト少ないことになります!:)
チャスブラウン

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バイト。交換しstring$:count#:til(!)firstして(*:)、我々はint型にキャスト行為/シーンに持っていけないので、文字列にRの指標をキャスト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.