Als ich meinen Aufsatz für Shakespeare schrieb, wurde mir klar, dass ich meine Zitatreferenzen auf überschaubarere Längen kürzen musste. Ich hatte vorher folgendes geschrieben:
(Act 1, Scene 2, Lines 345-346)
Aber mir wurde jetzt gesagt, dass ich sie so schreiben soll:
(I.ii.345-6)
Natürlich brauche ich Code, um meine Shakespeare-Zitatreferenzen ein wenig nach unten zu spielen.
Die Aufgabe
Schreiben Sie ein Programm oder eine Funktion, die bei einer Zeichenfolgeeingabe nach Vorlage 1 oder 2 eine Zeichenfolge nach Vorlage 3 oder 4 ausgibt oder zurückgibt. Sie müssen nur die Akte 1 bis 5 und die Szenen 1 bis 9 unterstützen.
Vorlagen
Vorlage 1
(Act x, Scene y, Lines a-b)
Sie können davon ausgehen, dass x
niemals mehr als 5, y
niemals mehr als 9 a
und b
immer positive Ganzzahlen sind, die den maximalen positiven Standard-Ganzzahlwert Ihrer Sprache nicht überschreiten und a
immer ausschließlich kleiner als sind b
.
Vorlage 2
(Act x, Scene y, Line a)
Gleiche Bedingungen wie Vorlage 1, ausgenommen Informationen zu b
.
Vorlage 3
(x.y.a-b)
Wobei x
eine römische Ziffer in y
Großbuchstaben , eine römische Ziffer in Kleinbuchstaben a
und b
Zahlen sind und b
auf nur die Ziffern gekürzt werden, die kleiner sind als die erste abweichende Ziffer von gleicher Bedeutung a
.
Vorlage 4
(x.y.a)
Gleiche Bedingungen wie Vorlage 3, mit Ausnahme von Informationen zu b
.
Testfälle
Sei f(s)
die in der Aufgabe definierte Funktion. ""
bezeichnet einen Zeichenkettenwert.
>>> 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)"
Für diese Herausforderung müssen die folgenden Übersetzungen von arabischen zu römischen Ziffern unterstützt werden:
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
(Act 1, Scene 2, Lines 345-3499)
Antworten:
Die Shakespeare-Programmiersprache (nicht konkurrierend)
Diese Frage hat mir sehr gut gefallen, und da ein gewisses Interesse an einer Shakespeare-Antwort bestand, hier eine.
(Es ist mehr als 6000 Byte.) Es gibt einige Tricks drin , aber ich habe nicht zu Golf versuchte es viel, weil: (1) Ich habe bereits dazu beigetragen , meinen Anteil an Golf auf eine andere Antwort, und (2) Ändern Sie alle Zeichen auf „Seite "und" Puck "oder alle Sätze zu" big big big big cat "scheinen den Spaß zu verderben. Stattdessen habe ich für den Teil, der sich mit römischen Ziffern befasst, Zeichen verwendet, die Römer usw. sind. :-)
Das Programm sollte größtenteils unkompliziert sein, aber ein erwähnenswerter Fehler ist, dass ich beim Schreiben davon ausgegangen bin, dass das Lesen einer Ganzzahl folgendermaßen funktionieren würde
scanf
: (1) Es werden nur so viele Zeichen aus der Eingabe verbraucht, wie einer Ganzzahl entsprechen, und (2) für den Fall Lassen Sie die Variable unverändert. (Ich habe diese zweite Eigenschaft verwendet, um zwischen Template 1 und 2 in Akt II zu unterscheiden, indem ich bis zu "Line" gelesen und versucht habe, eine Ganzzahl zu lesen.) Leider hat die ursprüngliche Implementierung von (was ich betrachte) einen Fehler Die Sprache, in der das Lesen einer Ganzzahl alles bis zum Ende der Zeile verbraucht und einen Fehler auslöst, falls dies fehlschlägt. Daher ist ein Patchlibspl.c
erforderlich , um dasint_input
Verhalten zu verbessernscanf
.Und damit funktioniert es:
Etwas höherer Pseudocode, an dem ich gearbeitet habe, um jedem zu helfen, der versucht zu verstehen:
Das oben Gesagte mit dem endgültigen Code in Verbindung zu bringen, bleibt als Übung. :-) Beachten Sie, dass ShakespearePL Arithmetik und Stapel und GOTOS hat, aber keine Zeiger (nur Labels), so dass die Implementierung von "Unterprogrammen" wie der Konvertierung nach Roman ein bisschen ... interessant ist.
quelle
LaTeX,
513364259226215178159 BytesGute Aufsätze sollten immer in LaTeX geschrieben werden.
Dies verwendet das xstring-Paket, da nicht gerade viel String-Handling eingebaut ist. Auf der positiven Seite ist die Obergrenze für die eingebaute
\Roman
Formatierung größer, als wir jemals brauchen werden (sogar für die Sonette)2^31-1
. Ich habe\documentclass{ecv}
in die Zählung aufgenommen, aber keinen der Testcodes:(Wenn Sie verrückt genug wären, dies tatsächlich zu verwenden, müssten Sie zumindest die Makronamen entgolfen. Das Überschreiben von Einzelzeichen-Makros ist eine schlechte Praxis.)
Ungolfed und kommentiert:
Beachten Sie, dass in dieser Version die Kommentare erforderlich sind , da sonst die neue Zeile als Leerzeichen interpretiert und zu einem Leerzeichen erweitert wird.
quelle
~
Sie anstelle von als Makroname verwenden\s
. Aber eigentlich brauchen Sie\s
(\stripcomma
in der ungolfed Version) überhaupt nicht: Sie können einfach\def\t#1 #2, #3 #4, #5 #6
und TeX wird sich darum kümmern, die Kommas zu entfernen . (Sie können also stattdessen den~
Trick\t
~
ist ein bisschen böse, aber ich mag es hier. Das bedeutete, dass ich die Dokumentenklasse ändern musste (in eine der anderen 3-Buchstaben-.cls
Dateien, die ich installiert hatte)\@roman
und\@Roman
brauchen keine geschweiften Klammern um das Argument.xstring
waren deine :-) Es hat Spaß gemacht, dies zusammen zu spielen!JavaScript (ES6),
210183178177171 BytesEinsparung von 27 Bytes durch das Abrollen von Restparametern (dank ETHproductions )
5 Bytes wurden eingespart, indem die Eröffnungsparen nicht übereinstimmten und die Generierung der römischen Zahl geändert wurde
1 Byte durch Anpassen des letzten ternären Ausdrucks gespeichert
6 Bytes gespart durch Kombination zweier übereinstimmender Gruppen
Testfälle:
quelle
Act
und jeweils\D*
mit.*
?Jelly ,
87 8685 BytesProbieren Sie es online! oder sehen Sie sich eine Testsuite an
Wie?
quelle
œr
,Ṗ,Ç
,Ṗ€V
,ṪÇ$
,W
als das letzte Glied auf einem Helfer Link, möglicherweise auch anderen, schöne Anstrengung! Dies ist nicht Ihre übliche 80-Jelly-Vorlage, dies verdient besondere Anerkennung unter den Jelly-Leuten.R ,
94126112166 BytesUnd jetzt ist es wortreicher als bisher :(, zurück zum Golf zu versuchen , es weiter. Regex zur Verringerung der Seite Referenz schamlos
gestohlenenvon @FryAmTheEggman entlehnt.Jetzt muss ich wirklich etwas arbeiten, um die Bytes zurückzubekommen, aber es funktioniert jetzt für den zweiten Fall.
Probieren Sie es online! - Beachten Sie, dass
el
dies bei TIO nicht funktioniert und durch ersetzt wurdeunlist
quelle
Netzhaut ,
8988 BytesProbieren Sie es online!
3 Bytes gespart dank Neil.
Entfernt die unnötigen Zeichen, bevor die ersten beiden Ziffern durch
i
Zeichenblöcke ersetzt werden. Dann werden Teile dieseri
s zu den entsprechenden römischen Ziffern zusammengefasst. Dann schreiben wir die erste römische Ziffer groß. Schließlich stimmen wir so viele Zahlen wie möglich vor und nach dem Bindestrich ab, sodass die Anzahl der Ziffern in der Zahl gleich ist. Wir entfernen dann dieses Präfix von der zweiten Zahl.quelle
iiiii
mitv
,iiii
mitiv
undviv
mitix
scheint ein paar Bytes zu sparen.345-356
- ich hatte damit gerechnet345-56
.\b
am Ende der letzten Ersetzung verwenden, um zu vermeiden, dass Sie die Ersetzung wiederholen müssen)
?\d
aber es scheint zu funktionieren, da es keine andere Wortgrenze gibt. Vielen Dank!PHP> = 7.1, 195 Bytes
Testfälle
Erweitert
quelle
preg_match_all("#\d+#",$argn,$m);[$a,$s,$b,$e]=$m[0];
spart zwei Bytes.if($e){for(;$b[$i]==$e[$i];$i++);echo"-",substr($e,$i);}echo")";
sollte 46(you do not have to support past 5)
speichern. spart 15 Bytes.".$r[$s].$b"
spart weitere 5 Bytes; und[[$a,$s,$b,$e]]=$m;
noch einer. Leider funktionieren Array-Zuweisungen (noch) nicht per Referenz.if($e&&$e-$b){for($x=str_pad($b,strlen($e),0,0);$x[$i]==$e[$i];$i++);echo"-",substr($e,$i);}
Spart 10 Bytes und funktioniert möglicherweise.&&$e-$b
ist für die Testfälle unnötig; so spart es 17 Bytes, nicht 10. Btw. du brauchst noch keine römischen 6 bis 9.;)for(;str_pad($b,strlen($e),0,0)[$i]==$e[$i];)$i++;
mitfor(;$e&&~$c=$e[-++$k];)$c>$b[-$k]&&$i=-$k;
.Perl 5, 185 + 1 = 186 Bytes
1-Byte-Strafe für das erforderliche
-n
Flag.Kann für einige Testfälle fehlschlagen, in denen die Szene mehr als 10 ^ 11 Zeilen hat, aber AFAIK keine Shakespeare-Szenen sind ziemlich lang;)
In lesbarer Form:
quelle
Ruby , 204 + 1 = 205 Bytes
Verwendet die
-p
Flagge.Probieren Sie es online!
quelle
Python 2.7 298 Bytes
quelle
Perl, 99 Bytes
Laufen Sie mit
perl -pe
. 98 Byte (Quelle) + 1 Byte (p
Flag) = 99.quelle
Python 2 ,
301259252221 BytesSatte -31 Bytes dank Chas Brown.
Also, ähm, das ist ... extrem lang ... Ich glaube, ich kann Golf spielen, aber ich habe mir eine Weile das Gehirn zerbrochen.
Probieren Sie es online!
Nervenzusammenbruch
quelle
b,c,d,e,f=s.groups()
anstelle vona,b,c,d,e,f=[s.group(n) for n in range(6)]
[0]+'i,ii,iii,iv,v,vi,vii,viii,ix'.split(',')
anstelle von[s,'i','ii','iii','iv','v','vi','vii','viii','ix']
.[0]+'i ii iii iv v vi vii viii ix'.split()
anstelle von[s,'i','ii','iii','iv','v','vi','vii','viii','ix']
.0
Innere der Anführungszeichen setzt. Eine letzte kleinere zwicken kann ich sehen: Sie verwenden:s,r=XXX,YYY;b,c,d,e,f=s.groups();
Sie weitere 4 Bytes statt speichern kann äquivalent zu sagen:b,c,d,e,f=XXX.groups();r=YYY;
. Sie haben also 81 Bytes weniger als ich! :)q / kdb +
200187 BytesLösung:
Beispiele:
Erklärung: (leicht ungolfed)
Anmerkungen:
Technisch kann es 2 Bytes kürzer sein (keine Notwendigkeit für die
f:
), aber es macht es einfacher, Beispiele auf diese Weise zu zeigen.Bearbeitungen:
string
durch$:
,count
mit#:
,til
mit(!)
undfirst
mit(*:)
, um die Indizes von R in Strings umzuwandeln, damit wir Act / Scene nicht in Ints umwandeln müssenquelle