Hintergrund
LISP-Programmierer haben die Welt erobert! Klammern wurden als heilige Zeichen deklariert und können von nun an nur noch in LISP-Programmen verwendet werden. Es wurde entschieden, dass Klammern in literarischen Werken durch Fußnoten ersetzt werden sollen, und es ist Ihre Aufgabe, dies für vereinfachte Markdown-Texte zu automatisieren.
Eingang
Ihre Eingabe ist eine einzelne Zeichenfolge, die alphabetische ASCII-Zeichen, Leerzeichen und Sonderzeichen enthält ,.!?()
. Es enthält keine Zeilenumbrüche oder Ziffern. Die Klammern werden korrekt zugeordnet.
Ausgabe
Sie müssen jedes übereinstimmende Klammerpaar in der Eingabezeichenfolge in eine Fußnote konvertieren. Das passiert wie folgt:
- Ersetzen Sie das erste übereinstimmende Klammernpaar und die Teilzeichenfolge zwischen ihnen durch eine laufende Nummer, die von
1
den Markdown-Tags<sup>
und umbrochen beginnt</sup>
. - An das Ende der Zeichenfolge anhängen
- zwei newlines,
- das Markdown-Tag
<sub>
, - die Nummer aus Schritt 1,
- ein Leerzeichen,
- die Teilzeichenfolge zwischen den Klammern und
- das schließende Tag
</sub>
in dieser Reihenfolge.
- Wenn die Zeichenfolge noch Klammern enthält, fahren Sie mit Schritt 1 fort.
Ihre Ausgabe ist die resultierende Zeichenfolge, möglicherweise mit einer nachgestellten Newline. Sie müssen diesen genauen Algorithmus nicht implementieren, solange Ihre Ausgabe korrekt ist. Beachten Sie, dass möglicherweise geschachtelte Klammern vorhanden sind. In diesem Fall haben wir Fußnoten, die Verweise auf andere Fußnoten enthalten. Die Teilzeichenfolge zwischen Klammern kann auch leer sein. Beispiele finden Sie in den folgenden Testfällen.
Regeln und Wertung
Sie können entweder ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig.
Wenn Ihre Sprache von Haus aus keine Dezimalzahlen unterstützt ( Husten Retina Husten ), können Sie die Fußnotenzahlen auf einer anderen Basis angeben, einschließlich binär oder unär; Die Verwendung von unären Zahlen führt jedoch zu einer Strafe von + 20% .
Testfälle
Eingang:
This input contains no parentheses.
Ausgabe:
This input contains no parentheses.
Eingang:
This has (some) parentheses (but not so many).
Ausgabe:
This has <sup>1</sup> parentheses <sup>2</sup>.
<sub>1 some</sub>
<sub>2 but not so many</sub>
Eingang:
This has (nested (deeply (or highly?) nested)) parentheses (and several groups).
Ausgabe:
This has <sup>1</sup> parentheses <sup>2</sup>.
<sub>1 nested <sup>3</sup></sub>
<sub>2 and several groups</sub>
<sub>3 deeply <sup>4</sup> nested</sub>
<sub>4 or highly?</sub>
Eingang:
Hmm()(()(,)) a()((trt)(v( (((((wut)))))(X)(Y)(Z) )!?!?!?!))oooooooo(oooo)oooo
Ausgabe:
Hmm<sup>1</sup><sup>2</sup> a<sup>3</sup><sup>4</sup>oooooooo<sup>5</sup>oooo
<sub>1 </sub>
<sub>2 <sup>6</sup><sup>7</sup></sub>
<sub>3 </sub>
<sub>4 <sup>8</sup><sup>9</sup></sub>
<sub>5 oooo</sub>
<sub>6 </sub>
<sub>7 ,</sub>
<sub>8 trt</sub>
<sub>9 v<sup>10</sup>!?!?!?!</sub>
<sub>10 <sup>11</sup><sup>12</sup><sup>13</sup><sup>14</sup> </sub>
<sub>11 <sup>15</sup></sub>
<sub>12 X</sub>
<sub>13 Y</sub>
<sub>14 Z</sub>
<sub>15 <sup>16</sup></sub>
<sub>16 <sup>17</sup></sub>
<sub>17 <sup>18</sup></sub>
<sub>18 wut</sub>
Beachten Sie die leeren Zeilen zwischen den Fußnoten.
quelle
foo (bar)\nfoot (note)
?Antworten:
Perl,
817572 Bytes71 Byte Code + 1 Byte Befehlszeilenargument.
Benötigt Perl 5.10 oder neuer (für rekursive Regex-Unterstützung)
Verwendung:
Erläuterung
-p
Der Parameter gibt das Ergebnis der Anwendung der angegebenen Befehle auf die Eingabe aus, ohne dass ein expliziter Ausdruck erforderlich ist.Der Regex
(\(((?1)|.)*?)\))
sucht nach dem äußersten Satz von Klammern vom Anfang der Zeichenfolge. Wenn dies gefunden wird, führen wir die Ersetzung durch und stellen sicher, dass wir nur das Ende der Eingabe hinzufügen (indem wir alles bis zum Ende der Eingabe mit erfassen(.*)
).Anschließend wiederholen wir die Regex-Ersetzung für die jetzt ersetzte Zeichenfolge mit
redo
. Dabei wird die Regex-Ersetzung fortlaufend angewendet, bis sie nicht mehr übereinstimmt. Ders
Modifikator stellt sicher, dass der.
reguläre Ausdruck mit neuen Zeilen übereinstimmt. Dies ist erforderlich, da der reguläre Ausdruck erneut auf das Ergebnis der vorherigen regulären Ersetzung angewendet wird.quelle
[^)]
oder sogar.
anstelle[^()]
der Garantie davonzukommen, dass die Eingabe korrekt ausgeglichen wird..
indem wir das Match faul machen. @ Xebtl, die Herausforderung besagt "Es wird keine Zeilenumbrüche oder Ziffern enthalten"Emacs Lisp, 335 Bytes
Vorwort. Diese und die Scheme-Antworten sind derzeit die einzigen Antworten, die sowohl von der Mighty Popular Republic of LISP als auch von der Church of Emacs offiziell genehmigt wurden. Andere kürzere oder nicht kürzere Antworten gelten als Bedrohung für den Frieden. Insbesondere und mit einer tiefgreifenden Verachtung jeglicher verleumderischen Behauptung des McCarthyismus, die sporadisch von feindlichen Gegnern des Staates gehört wird, verbieten wir jedem, der Informationen über die wahre Identität der anonymen Autoren hat, Nonlisp-Antworten, sich an Ihr lokales Büro zu wenden. Es wird daran erinnert, dass sich jeder Zeit nehmen sollte, um zu reflektieren und entsprechend dem, was er zutiefst glaubt, seine oder ihre zukünftigen Interaktionen mit offiziellen Vertretern der vorhandenen Macht nicht zu gefährden. Code ist Daten. Daten sind Code.
Eleganter:
quelle
Retina ,
968683 Bytes * 120% = 99,6Der Quellcode dieser Lösung besteht aus zwei Dateien:
Erläuterung
Dies ist eine sehr direkte Implementierung des in der Challenge beschriebenen Algorithmus. Der Code besteht aus einer einzelnen Regex-Ersetzung, die den ersten Satz von Klammern in eine Fußnote verwandelt. Diese Ersetzung wird
+
solange wiederholt, bis sich der String nicht mehr ändert. Dies bedeutet, dass der reguläre Ausdruck nicht mehr übereinstimmt (da er keine weiteren Klammern findet).Die Fußnoten sind unär nummeriert, sodass ich einfach nach der Nummer der letzten Fußnote suchen und ein anhängen kann
1
, um die nächste zu erstellen.Der reguläre Ausdruck zum Finden des ersten Satzes von Klammern basiert auf der Standardtechnik zum Zuordnen von Klammern zu Bilanzgruppen (hrhr, "Zuordnungsklammern"). Es wurde ein wenig gekürzt, indem eine unbenannte Gruppe verwendet wurde und angenommen wurde, dass die Klammern korrekt ausgeglichen sind (was bedeutet, dass wir
(
die negierte Zeichenklasse weglassen und das Finale)
mit einer einfachen abgleichen können.
und wir auch nicht sicherstellen müssen, dass die Capture Stack ist leer).Nachdem
1
wir die Klammern abgeglichen und ihren Inhalt in Gruppen zusammengefasst haben , erfassen wir den Rest der Zeichenfolge mit(.*)
in Gruppe4
und durchsuchen die Zeichenfolge erneut nach der ersten Gruppe von1
s mit negativem Lookbehind. Wenn wir einen solchen Teilstring finden, speichern wir ihn in Gruppen5
. Wenn wir das nicht tun, sehen wir nicht so aus, aber das ist in Ordnung, weil es optional ist - es bedeutet nur, dass$5
eine leere Zeichenfolge ausgegeben wird, die die unäre Darstellung ist0
und die auch korrekt ist.Die Ersetzungszeichenfolge setzt dann einfach alles zusammen, basierend auf den Erfassungsgruppen. Die Fußnotennummer wird inkrementiert, indem vor
1
der letzten Nummer ein vorangestellt wird1$5
.quelle
Heiliges JavaScript , 1510 Bytes
Rebellenkollegen, lassen Sie sich nicht vom tyrannischen Abriss der Klammern abbringen! Du musst durchhalten! Die Programmierung war von Anfang an ein freies Unternehmen. Jetzt ist es eine durchdringende Show der Frömmigkeit geworden. Wir müssen nichts weniger als absolute Angst zeigen. Deshalb habe ich mich gewehrt!
Keine Regeln gegen die Verwendung der heiligen Zeichen in einer Nicht-Lisp-Sprache. Nein, überhaupt nicht. (Ein bisschen weniger kompakt :)
Dies kompiliert das erweiterte JavaScript in meiner anderen Antwort . Dies ist ein Scherzbeitrag.
quelle
Lua,
222216204201 BytesGolf gespielt:
Ungolfed:
quelle
repeat a,b=l(s,g) ... untill a<1
Schleife nicht kürzer als deine?Schema, 92 Bytes
Frustriert von der Umsetzung der breit angelegten Suche in Real Lisp 1, entscheiden sich die Machthaber für einen pragmatischeren Ansatz. Schließlich sind Klammern heilig, Klammern jedoch nicht. 2
1. Hören Sie nicht auf diese Ketzer aus der sogenannten "Kirche" von Emacs!
2. Sie sind keine Racket-Programmierer, oder?
quelle
Haskell, 210 Bytes
Anwendungsbeispiel:
Wie es funktioniert:
quelle
Schema, 533 Bytes
Mit Einrückung:
Ja, dies sind 533 Byte, wenn alle optionalen Leerzeichen entfernt wurden. Genießen Sie den funktionalen Ruhm.
Ich habe mehr oder weniger den Algorithmus in der Beschreibung implementiert:
x
Gruppiert die Eingabe in Klammern undf
ersetzt die erste Ebene der Gruppen durch Fußnoten. Dies wird wiederholt, bis keine Gruppen mehr übrig sind. Ich bin sicher, dass es kürzer gemacht werden kann, aber ich sehe nicht, wie es viel kürzer gemacht werden könnte, ohne zu einem anderen Algorithmus zu wechseln.Wie geschrieben, ist es ein vollständiges Programm. Sie können es hier ausprobieren , aber da repl.it anscheinend nicht damit umgehen
(read-line)
kann, müssen Sie den Eingabe-String an seine Stelle setzen. Eine völlig ungolfed Version ist hier .EDIT: Wie in den Kommentaren erwähnt, habe ich die
()
Klammern[]
in den repl.it-Versionen in Klammern geändert. Dies diente lediglich der Bequemlichkeit beim Programmieren und Debuggen. Die veröffentlichte Version funktioniert jetzt mit()
.quelle
#\[
'#]' durch die jeweilige Klammer ändere (und Tests aktualisiere), funktioniert dies problemlos. Gibt es einen Grund, warum du die quadratischen verlassen hast? hängt es mit Ihrer vorherigen Antwort zusammen?JavaScript ES6, 244 Byte
Ernsthafte Antwort (funktioniert meines Wissens nur mit FireFox)
Erweitert:
quelle
Hassium , 315 Bytes
Gegenwärtig ist dies nicht konkurrierend, da dies auch die verschachtelten nicht genau behandelt.
Erweitert:
}
quelle