เล่นกอล์ฟอ้างอิงของฉันเช็คสเปียร์


45

ในขณะที่เขียนเรียงความของฉันสำหรับเช็คสเปียร์ฉันรู้ว่าฉันต้องย่อการอ้างอิงคำพูดของฉันให้สั้นลง ก่อนหน้านี้ฉันเคยเขียนสิ่งนี้:

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

แต่ตอนนี้ฉันถูกบอกให้เขียนแบบนี้:

(I.ii.345-6)

เห็นได้ชัดว่าฉันต้องการรหัส golfed เพื่อเล่นกอล์ฟอ้างอิงของ Shakespeare

งาน

เขียนโปรแกรมหรือฟังก์ชั่นที่กำหนดอินพุตสตริงตามเทมเพลต 1 หรือ 2 พิมพ์หรือส่งคืนสตริงตามเทมเพลต 3 หรือ 4 ตามลำดับ คุณจะต้องสนับสนุนกิจการ 1 ถึง 5 และฉาก 1 ถึง 9

แม่แบบ

เทมเพลต 1

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

คุณอาจคิดว่าxไม่เกิน 5, yไม่เกิน 9 aและbเป็นจำนวนเต็มบวกเสมอไม่เกินค่าจำนวนเต็มมาตรฐานสูงสุดของภาษาของคุณและaจะน้อยกว่าbเสมอ

แม่แบบ 2

(Act x, Scene y, Line a)

เงื่อนไขเดียวกับแม่แบบที่ 1 bไม่รวมข้อมูลเกี่ยวกับ

แม่แบบ 3

(x.y.a-b)

ที่ไหนxเป็นเลขโรมันทุนyเป็นตัวพิมพ์เล็กเลขโรมัน, aและbมีตัวเลขและจะสั้นลงเหลือเพียงตัวเลขน้อยกว่าหลักแรกที่แตกต่างกันอย่างมีนัยสำคัญเท่ากันจากba

แม่แบบ 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
L3viathan

5
กรณีทดสอบ:(Act 1, Scene 2, Lines 345-3499)
dzaima

11
มีใครตอบคำถามในเช็คสเปียร์บ้าง?
ติตัส

1
@Grimy แก้ไข # 1 เป็น # 2 ดีไหม
Addison Crump

คำตอบ:


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!

(ยาวกว่า 6,000 ไบต์) มีลูกเล่นบางอย่างในนั้น แต่ฉันไม่ได้พยายามตีกอล์ฟมากเพราะ: (1) ฉันมีส่วนร่วมในการเล่นกอล์ฟกับคำตอบอื่นแล้วและ (2) เปลี่ยนอักขระทั้งหมดเป็น "หน้า "และ" Puck "หรือวลีทั้งหมดเพื่อ" แมวโตตัวโตตัวโตตัวใหญ่ "ดูเหมือนจะทำให้เสียความสนุก สำหรับส่วนที่เกี่ยวข้องกับตัวเลขโรมันฉันได้ใช้ตัวละครที่เป็นชาวโรมัน ฯลฯ ฉันใช้ตัวอักษรและคำแนะนำเพื่อบันทึกการพิมพ์ :-)

โปรแกรมควรตรงไปตรงมาส่วนใหญ่ แต่หนึ่งรอยย่นที่ควรกล่าวถึงคือเมื่อฉันเขียนสิ่งนี้ฉันสันนิษฐานว่าการอ่านจำนวนเต็มจะทำงานเช่นscanf: (1) กินตัวอักษรจำนวนมากจากอินพุตที่สอดคล้องกับจำนวนเต็มและ (2) ในกรณี ของความล้มเหลวปล่อยให้ตัวแปรไม่เปลี่ยนแปลง (ฉันใช้คุณสมบัติที่สองนี้เพื่อแยกความแตกต่างระหว่างเทมเพลต 1 และ 2 ใน Act II โดยอ่านถึง "Line" และพยายามอ่านจำนวนเต็ม) โชคไม่ดีที่ปรากฎว่ามี (สิ่งที่ฉันพิจารณา) ข้อผิดพลาดในการใช้งานดั้งเดิมของ ภาษาที่อ่านทุกอย่างที่กินจำนวนเต็มถึงจุดสิ้นสุดของบรรทัดและโยนความผิดพลาดถ้ามันล้มเหลวดังนั้นจึงต้องการแพทช์เพื่อ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)

pseudocode ระดับสูงกว่าเล็กน้อยที่ฉันทำงานนอกคอกเพื่อช่วยให้ทุกคนพยายามเข้าใจ

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 มีเลขคณิตและสแต็กและ gotos แต่ไม่มีตัวชี้ (เฉพาะป้ายกำกับ) ดังนั้นการใช้ "รูทีนย่อย" เช่นการแปลงเป็นโรมันนั้นค่อนข้างน่าสนใจ


ว้าวนั่นเป็นสิ่งที่สวยงาม ขอขอบคุณ! :)
Steve Bennett

1
ตบปุ่ม upvote ซ้ำ ๆ
Addison Crump

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}

(ถ้าคุณคลั่งไคล้มากพอที่จะใช้สิ่งนี้จริง ๆ คุณต้องถอดชื่อมาโครอย่างน้อยการเขียนทับมาโครตัวเดียวคือการฝึกฝนที่ไม่ดี)

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

โปรดทราบว่าในรุ่นนี้จำเป็นต้องมีความคิดเห็นมิฉะนั้นบรรทัดใหม่จะถูกตีความว่าเป็นช่องว่างและขยายไปยังช่องว่าง


คุณสามารถประหยัดสามไบต์โดยใช้ชื่อแมโครของคุณแทน~ \sแต่ที่จริงแล้วคุณไม่ต้องการ\s( \stripcommaในเวอร์ชั่นที่ไม่ได้รับการปรุงแต่ง) เลย: คุณทำได้แค่นั้น\def\t#1 #2, #3 #4, #5 #6และ TeX จะจัดการกับการทำลายเครื่องหมายจุลภาค (เพื่อให้คุณสามารถใช้~เคล็ดลับ\tแทนการบันทึก 1 ไบต์)
ShreevatsaR

@ShreevatsaR ขอบคุณ คุณหาวิธีที่จะได้รับการปฏิเสธด้วยเครื่องหมายจุลภาคและมันง่ายกว่าสิ่งที่ฉันพยายาม เคล็ดลับกับแอคทีฟ~ค่อนข้างน่ารังเกียจ แต่ฉันชอบที่นี่ มันหมายความว่าผมต้องเปลี่ยน documentclass (ให้เป็นหนึ่งในอีก 3 ตัวอักษร.clsไฟล์ฉันได้ติดตั้ง)
คริส H

1
ใช่ฉันนับ 182 ไบต์ซึ่งไม่เพียง แต่คำตอบของ Python เท่านั้น แต่ยังรวมถึง Ruby, PHP และหนึ่งในคำตอบของ Perl :-)
ShreevatsaR

1
@ShreevatsaR ยังดีกว่า: 178 เป็น\@roman และ\@Romanไม่ต้องการวงเล็บปีกกาอาร์กิวเมนต์
Chris H

1
xstringแนวคิดหลักทั้งหมดเป็นของคุณ :-) สนุกกับการเล่นกอล์ฟด้วยกัน!
ShreevatsaR

8

JavaScript (ES6), 210 183 178 177 171 ไบต์

บันทึกแล้ว 27 ไบต์โดยการคลายพารามิเตอร์ที่เหลือ (ขอบคุณETHproductions )

บันทึก 5 ไบต์โดยไม่จับคู่ paren การเปิดและโดยการปรับการสร้างตัวเลขโรมัน

บันทึกแล้ว 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 ใช้การจับคู่โลภโดยค่าเริ่มต้น ฉันจะทดสอบในภายหลังวันนี้และแจ้งให้คุณทราบว่ามันใช้งานได้
วงกลม

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

@MickyT ไม่ฉันอยู่นานแล้ว ...
Jonathan Allan

สิ่งนี้ทำให้เกิดอาการปวดหัว อย่าอ่าน 0/10 : P
Erik the Outgolfer

@EriktheOutgolfer ขออภัย !!
Jonathan Allan

2
เรื่องตลกกันฉันสามารถมองเห็นสิ่งที่ไม่ซ้ำกันจริงๆบางในรหัสว่าเหมือนœr, Ṗ,Ç, Ṗ€V, ṪÇ$, Wเป็นลิงค์สุดท้ายในการเชื่อมโยงผู้ช่วยเหลืออาจจะเป็นคนอื่นมากเกินไปความพยายามที่ดี! นี่ไม่ใช่การส่งเยลลี่ 80 สิ่งปกติของคุณนี่สมควรได้รับการยอมรับเป็นพิเศษในหมู่ผู้คนในเยลลี่
Erik the Outgolfer

6

R , 94 126 112 166 ไบต์

และตอนนี้มันน่ากลัวกว่าเดิม :( กลับไปลองเล่นกอล์ฟต่อไป Regex สำหรับการลดการอ้างอิงหน้าเว็บที่ขโมยมาจาก @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]))

ลองออนไลน์! - โปรดทราบว่า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

ลองออนไลน์!

บันทึก 3 ไบต์ขอบคุณ Neil

แยกอักขระที่ไม่จำเป็นออกก่อนที่จะแทนที่ตัวเลขสองตัวแรกด้วยบล็อกiอักขระ จากนั้นมันจะจับคู่ชิ้นของis เหล่านี้เพื่อสร้างตัวเลขโรมันที่เหมาะสม จากนั้นเราใช้อักษรโรมันตัวแรกเป็นตัวพิมพ์ใหญ่ ในที่สุดเราก็จับคู่ตัวเลขให้มากที่สุดเท่าที่จะทำได้ก่อนเครื่องหมายยัติภังค์และหลังเครื่องหมายขีดคั่นดังนั้นจำนวนหลักในตัวเลขจะเท่ากัน จากนั้นเราจะลบคำนำหน้านั้นออกจากหมายเลขที่สอง


แทนที่iiiiiด้วยv, iiiiด้วยivและvivด้วยixดูเหมือนว่าจะบันทึกไม่กี่ไบต์
Neil

อย่างไรก็ตามการตัดทอนหมายเลขบรรทัดของคุณน่าจะได้รับมันผิด345-356- 345-56ผมคาดหวังว่า
Neil

@ Whoil ลืมการขยาย 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,")";

Testcases

ขยาย

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];บันทึกสองไบต์ 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ไม่จำเป็นสำหรับกรณีทดสอบ ดังนั้นจะช่วยประหยัด 17 ไบต์ไม่ใช่ 10 Btw คุณยังไม่ต้องการโรมัน 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;
Christoph

3

Perl 5, 185 + 1 = 186 ไบต์

บทลงโทษ 1 ไบต์สำหรับ-nธงที่ต้องการ

อาจล้มเหลวสำหรับบางกรณีทดสอบที่ฉากมีมากกว่า 10 ^ 11 บรรทัด แต่ AFAIK ที่ไม่มีฉากของ Shakespeare นั้นค่อนข้างยาว;)

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 ไบต์และใช้ความคิดที่แตกต่างกันมากดังนั้นฉันรู้สึกว่าการตอบแยกต่างหากนั้นเหมาะสม
Grimmy

ดูเหมือนจะสิ้นเปลืองเนื่องจากมีการกำหนดตัวเลขโรมันที่เกิน 5
Hagen von Eitzen

2
@ HagenvonEitzen ความท้าทายระบุว่าคุณต้องสนับสนุนตัวเลขโรมันถึง 9 กรณีทดสอบ 3 มี“ ฉาก 9” และกรณีทดสอบ 6 มี“ ฉาก 8”; ทั้งคู่จะล้มเหลวถ้าฉันสนับสนุนเฉพาะตัวเลขโรมันถึง 5
Grimmy

2

Python 2 , 301 259 252 221 ไบต์

มหันต์ -31 ไบต์ขอบคุณ Chas Brown

ดังนั้นเอ่อนี่คือ ... นานมาก ... ฉันคิดว่าฉันสามารถเล่นกอล์ฟนี้ แต่ฉันได้พินาศสมองของฉันในขณะที่

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

และอีก 5 โดยใช้แทน[0]+'i,ii,iii,iv,v,vi,vii,viii,ix'.split(',') [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)"

คำอธิบาย: (ungolfed เล็กน้อย)

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ด้วย(*:), หล่อดัชนีของ R เป็นสายอักขระดังนั้นเราไม่จำเป็นต้องสร้างฉาก / ฉากให้เป็น ints
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.