Shakespeare alıntı referanslarım için Golf


45

Shakespeare için makalemi yazarken, alıntı referanslarımı daha yönetilebilir uzunluklarda kısaltmam gerektiğini anladım. Bunu daha önce yazıyordum:

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

Ama şimdi onlara bu şekilde yazmam söylendi:

(I.ii.345-6)

Açıkçası, biraz Shakespeare alıntı referanslarımı atmak için golf koduna ihtiyacım var.

Görev

Şablon 1 veya 2'yi izleyerek bir dize girişi verildiğinde, sırasıyla Şablon 3 veya 4'ten sonra bir dize yazdıran veya döndüren bir program veya işlev yazın. Yalnızca 1'den 5'e kadar olan Eylemleri ve 1'den 9'a kadar olan Sahneleri desteklemeniz gerekir.

Şablonlar

Şablon 1

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

Sen varsayabiliriz x5 aştığı asla yasla 9 aştığı ave bher zaman dilinizin maksimum pozitif standart tamsayı değeri aşmayan pozitif tam sayılardır ve amünhasıran az daima b.

Şablon 2

(Act x, Scene y, Line a)

Hakkında bilgi hariç olmak üzere, Şablon 1 ile aynı koşullar b.

Şablon 3

(x.y.a-b)

Nerede xbir sermaye Roma rakamı olduğunu ybir küçük Roma rakamı olduğunu ave bsayılardır ve bdaha az eşit öneme ilk farklı rakam daha sadece basamak kısaltılır a.

Şablon 4

(x.y.a)

Hakkında bilgi hariç olmak üzere, Şablon 3 ile aynı koşullar b.

Test Kılıfları

Görevde f(s)tanımlanan fonksiyon olsun . ""bir dize değerini gösterir.

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

Bu zorluğun amaçları için, aşağıdaki arapça-romen rakamlı çeviriler desteklenmelidir:

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

Metin dosyalarına izin veriliyor mu?
Dat,

21
Gerçekten SPL'de bir cevap bekliyorum.
L3viathan

5
Test durumu:(Act 1, Scene 2, Lines 345-3499)
dzaima

11
Shakespeare’de bir cevaba kim var?
Titus,

1
@Grimy Fixed # 1, # 2 iyi mi?
Addison Crump,

Yanıtlar:


12

Shakespeare Programlama Dili (rekabet etmeyen)

Gerçekten bu soruyu sevdim ve orada olarak bazı ilgi bir Shakespeare dil yanıtında, burada bir tanesidir.

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!

(Bu 6000'in üzerinde bayt uzunluğunda.) Orada bazı hileler vardır ama ben çünkü çok, golf denemedim: Zaten (1) katkıda başka Yanıta golf payımız, ve (2) Sayfa" ile tüm karakterleri değişiyor "ve" Puck "ya da" büyük büyük büyük büyük büyük kedinin "tüm ifadeleri, eğlenceyi mahvedebilir. Romen rakamlarıyla ilgilenen kısım yerine, Romalılar vb. Karakterleri kullandım. Bazı yazımları kaydetmek için karakterleri ve talimatları yeniden kullandım. :-)

Program çoğunlukla basit olmalı, ama bahsetmeye değer bir kırışıklık, bunu yazdığımda bir tamsayı okurken şöyle çalışacağını varsaydım scanf: (1) sadece girdiden bir tamsayıya karşılık gelen kadar karakter tüketir ve (2) bu durumda kullanılır. başarısızlık durumunda değişkeni değişmeden bırakın. (Bu ikinci özelliği, II. Yasada 1. ve 2. Şablonlar arasında, "Çizgi" ye kadar okuyarak ve bir tamsayı okumaya çalışarak ayırt etmek için kullandım.) Ne yazık ki, ilk uygulamasında bir hata olduğunu (ne düşündüğüm) ortaya çıktı Bir tamsayı okumanın satırın sonuna kadar her şeyi tükettiği ve başarısız olması durumunda hata attığı dil, bu yüzden daha fazla davranması için bir yamayalibspl.c ihtiyaç duyar .int_inputscanf

Ve bununla, işe yarıyor:

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

Kimsenin anlamaya çalışmasına yardım etmek için üzerinde çalıştığım, biraz daha üst düzey sahte kod:

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

Yukarıdakilerin final koduyla ilişkilendirilmesi bir egzersiz olarak bırakılmıştır. :-) ShakespearePL'in aritmetik ve yığma ve gotos olduğunu, ancak işaretçilerin olmadığını (yalnızca etiketler) olduğunu unutmayın; bu nedenle, Roma'ya dönüştürme gibi "alt yordamları" uygulamak biraz ilginçtir.


Vay, bu çok güzel. Teşekkür ederim! :)
Steve Bennett

1
Upvote düğmesine arka arkaya tokatlar
Addison Crump

9

LaTeX, 513 364 259 226 215 178 159 Bayt

İyi yazılar her zaman LaTeX'te yazılmalıdır.

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

Bu, xstring paketini, içinde çok sayıda dize işleminin tam olarak bulunmadığı için kullanır. Artı tarafta , yerleşik \Romanbiçimlendirme için üst sınır , ihtiyacımız olan her şeyden (sonnets için bile) daha büyüktür 2^31-1. Sayıma dahil oldum \documentclass{ecv}, ancak test kodunun hiçbiri:

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

(Bunu gerçekten kullanacak kadar deliyseniz, en azından makro adlarını çözmeniz gerekir. Tek karakterli makroların üzerine yazılması kötü bir uygulamadır)

Ungolfed ve yorumladı:

\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

Bu sürümde yorumların gerekli olduğunu unutmayın; aksi takdirde newline, boşluk olarak yorumlanır ve bir alana genişler.


~Makro adınız olarak kullanarak üç bayttan tasarruf edebilirsiniz \s. Ama aslında \s( \stripcommaunungolfed versiyonunda) hiç ihtiyacınız yok : sadece \def\t#1 #2, #3 #4, #5 #6ve TeX virgülleri çıkarmaya özen gösterecek. (Böylece ~numarayı kullanabilirsiniz, \t1 bayt tasarruf edin.)
ShreevatsaR

@ShreevatsaR teşekkür ederim. Virgül reddinin satır içi nasıl yapıldığını öğrendin ve denediğim her şeyden daha kolaydı. Aktif olan hile ~biraz berbat ama burada hoşuma gidiyor. Belge sınıfını değiştirmek zorunda kalmam anlamına geliyordu ( .clsyüklediğim diğer 3 harfli dosyalardan birine )
Chris H

1
Evet, sadece Python cevabını değil, Ruby, PHP ve Perl cevaplarından birini de yenen 182 bayt sayıyorum :-)
ShreevatsaR

1
@ShreevatsaR hala daha iyi: 178 gibi \@roman ve \@Romanargüman etrafında parantez gerekmez.
Chris H,

1
Tüm ana xstringfikirler senindi… Bu beraber golf oynamak eğlenceliydi!
ShreevatsaR

8

JavaScript (ES6), 210 183 178 177 171 bayt

Dinlenme parametrelerini kaldırarak 27 bayt kurtarıldı ( ETHproductions sayesinde )

Açılan par ile eşleşmeyerek ve romen rakamı nesnesini ayarlayarak 5 bayt kurtarıldı

Son üçlü ifadeyi ayarlayarak 1 bayt kaydedildi

İki eşleşen grubu birleştirerek 6 bayt kurtarıldı

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

Test Durumları:

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


Şu anda test edemez, ancak yerine eğer hala çalışır Act her ve \D*birlikte .*?
Patrick Roberts

Olabilir; Denemek için tereddüt ettim çünkü JavaScript varsayılan olarak açgözlü eşleşmeyi kullanıyor. Bugün sonra test edeceğim ve işe yarayıp yaramadığını size bildireceğim.
gyre

8

Jelly ,  87 86  85 bayt

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

Çevrimiçi deneyin! veya bir test odasına bakın

Nasıl?

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 senaryosu için bir çeşit kayıt
olmalı

@MickyT Hayır. Orada daha uzun süre kaldı ...
Jonathan Allan

Bu, baş ağrısına neden olur. 0/10 okuma. : P
Outgolfer Erik,

@EriktheOutgolfer Üzgünüz !!
Jonathan Allan

2
Şakalar bir yana, o kodda Gerçekten eşsiz şeyler görebilirsiniz gibi œr, Ṗ,Ç, Ṗ€V, ṪÇ$, Wbir yardımcı bağlantıyı son halkası da muhtemelen başkaları, güzel çaba olarak! Bu her zamanki 80 şeyden oluşan bir Jelly gönderimi değil, Jelly insanları arasında özel olarak tanınmayı hak ediyor.
Outgolfer Erik,

6

R , 94 126 112 166 bayt

Ve şimdi daha önce olduğundan daha kötü :(, daha fazla golf oynamaya geri dönmek için. Regex @FryAmTheEggman'dan ödünç olarak çalınan sayfa referansını azaltmak için Regex .

Şimdi gerçekten baytları geri almak için bazı işler yapmam gerekiyor, ama şimdi ikinci vaka için çalışıyor.

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

Çevrimiçi deneyin! - elTIO'da çalışmadığını ve değiştirildiğini unutmayın.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

retina ,89 88 bayt

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

Çevrimiçi deneyin!

Neil sayesinde 3 bayt kurtardı.

İlk iki sayıyı ikarakter bloklarıyla değiştirmeden önce gereksiz karakterleri soyun . Sonra iuygun romen rakamlarını oluşturmak için bu parçaların parçalarını eşleştirir . Sonra ilk romen rakamını büyük harf yaparız. Son olarak, tireden önce ve tireden sonra rakamların rakamları aynı olacak şekilde rakamları eşleştirelim. Daha sonra bu numarayı ikinci numaradan kaldırırız.


Değiştirme iiiiiile v, iiiibirlikte ivve vivbirlikte ixbayt bir çift kaydetmek gibi görünüyor.
Neil,

Ancak, satır numarası kısalmanız yanlış anlaşılıyor gibi görünüyor 345-356- bekliyordum 345-56.
Neil,

@Neil Çavuş, kleene genişlemesini unuttu. Neyse bahşiş için teşekkürler!
FryAmTheEggman

İkameyi \btekrar etmekten kaçınmak için son değiştirme işleminin sonunda kullanabilir misiniz )?
Neil,

@Neil Kullanmam gerektiğini düşündüğümden beri işe yarayacağını düşünmedim \d, ancak başka bir kelime sınırı olmadığından işe yaramış gibi görünüyor. Teşekkürler!
FryAmTheEggman

4

PHP> = 7.1, 195 Bayt

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

Expanded

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];iki bayt kaydeder. if($e){for(;$b[$i]==$e[$i];$i++);echo"-",substr($e,$i);}echo")";46 kaydetmelisiniz. (you do not have to support past 5)15 bayt kaydeder.
Titus,

1
".$r[$s].$b"başka 5 byte kaydeder; ve [[$a,$s,$b,$e]]=$m;bir tane daha. Ne yazık ki, dizi atamaları referans olarak çalışmaz (henüz).
Titus,

if($e&&$e-$b){for($x=str_pad($b,strlen($e),0,0);$x[$i]==$e[$i];$i++);echo"-",substr($e,$i);}10 bayt kaydeder ve çalışabilir.
Titus,

Bana Tamam görünüyor . Ve &&$e-$btest durumları için gereksizdir; bu yüzden 17 bayt, 10 değil kaydeder. Btw. hala 6 ila 9. romanlara ihtiyacınız yok;)
Titus

1
Sen yerini alabilir for(;str_pad($b,strlen($e),0,0)[$i]==$e[$i];)$i++;ile for(;$e&&~$c=$e[-++$k];)$c>$b[-$k]&&$i=-$k;.
Christoph

3

Perl 5, 185 + 1 = 186 bayt

İstenilen -nbayrak için 1 byte ceza .

Sahnenin 10 ^ 11 çizgiden fazla olduğu bazı test durumlarında başarısız olabilir, ancak AFAIK hiçbir Shakespeare sahnesi oldukça uzun değildir;)

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

Okunabilir biçimde:

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 bayt

-pBayrağı kullanır .

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

Çevrimiçi deneyin!


2

Python 2.7 298 bayt

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 bayt

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

İle koş perl -pe. 98 bayt (kaynak) + 1 bayt ( pbayrak) = 99.


Bu gönderi sırasında başka bir Perl cevabı daha var ( codegolf.stackexchange.com/a/123400/6484 ), ancak 186 byte uzunluğunda ve çok farklı fikirler kullanıyor, bu yüzden ayrı bir cevap vermenin uygun olduğunu hissettim.
Grimmy

Bu, 5'in üzerindeki Romen rakamları için hükümler aldığı için israf gibi görünüyor
Hagen von Eitzen 22

2
@HagenvonEitzen mücadelesi, 9'a kadar romen rakamları desteklemeniz gerektiğini belirtir. Test senaryosu 3 "Sahne 9" a ve test durumu 6 "Sahne 8" e sahiptir; Her ikisi de sadece 5'e kadar romen rakamları desteklesem başarısız olur.
Grimmy

2

Python 2 , 301 259 252 221 bayt

Chas Brown sayesinde bir kuyruklu -31 bayt.

Yani, bu ... çok uzun ... Sanırım golf oynayabilirim ama bir süredir beynimi sardım.

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

Çevrimiçi deneyin!

Yıkmak

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
                         )

Sen kullanarak biraz kaydedebilirsiniz b,c,d,e,f=s.groups()yerinea,b,c,d,e,f=[s.group(n) for n in range(6)]
Chas Brown

Ve [0]+'i,ii,iii,iv,v,vi,vii,viii,ix'.split(',')yerine 5 kullanarak başka [s,'i','ii','iii','iv','v','vi','vii','viii','ix'].
Chas Brown,

Değiştirildi - Ve yerine 8 kullanarak başka . [0]+'i ii iii iv v vi vii viii ix'.split()[s,'i','ii','iii','iv','v','vi','vii','viii','ix']
Chas Brown,

Oh, ha, bunu yapabileceğini bilmiyordum. Teşekkürler!
Tamamen insan

Güzel tweak 0tırnak içine koyarak . Son bir minör çimdik Görebildiğim: Kullandığınız: s,r=XXX,YYY;b,c,d,e,f=s.groups();yerine eşdeğer diyerek başka 4 bayt kaydedebilirsiniz: b,c,d,e,f=XXX.groups();r=YYY;. Demek benim gönderimden 81 bayt daha az! :)
Chas Brown

2

q / kdb +, 200 187 bayt

Çözüm:

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

Örnekler:

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

Açıklama: (biraz 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)),")"
  }

Notlar:

Teknik olarak 2 bayt daha kısa olabilir (buna gerek yoktur f:) ancak örneklerin bu şekilde gösterilmesini kolaylaştırır.

Düzenlemeler:

  • -13 bayt; değiştirilir stringile $:, countbirlikte #:, tilile (!)ve firstile (*:)biz ints içine dökme eylemi / sahnesine zorunda kalmamak, dizelere R endekslerini dökme
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.