tło
Programiści LISP przejęli świat! Nawiasy zostały zadeklarowane jako święte postacie i odtąd można ich używać tylko w programach LISP. Zdecydowano, że nawiasy w utworach literackich zostaną zastąpione przypisami, a Twoim zadaniem jest zautomatyzowanie tego w celu uproszczenia tekstu Markdown.
Wkład
Dane wejściowe to pojedynczy ciąg znaków zawierający alfabetyczne znaki ASCII, spacje i znaki specjalne ,.!?()
. Nie będzie zawierał znaków nowej linii ani cyfr. Nawiasy zostaną poprawnie dopasowane.
Wydajność
Przekształcisz każdą dopasowaną parę nawiasów w ciągu wejściowym w przypis. Dzieje się to w następujący sposób:
- Zastąp pierwszą pasującą parę nawiasów i podłańcuch między nimi bieżącą liczbą, która zaczyna się od
1
, zawiniętą między znaczniki Markdown<sup>
i</sup>
. - Dołącz na końcu ciągu
- dwie nowe linie,
- tag Markdown
<sub>
, - numer z kroku 1,
- przestrzeń,
- podciąg między nawiasami i
- tag zamykający
</sub>
, w tej kolejności.
- Jeśli w łańcuchu pozostały nawiasy, przejdź do kroku 1.
Twój wynik jest ciągiem wynikowym, być może z końcowym znakiem nowej linii. Nie musisz implementować tego dokładnego algorytmu, o ile wyniki są prawidłowe. Zauważ, że mogą być zagnieżdżone nawiasy; w takim przypadku będziemy mieli przypisy zawierające odniesienia do innych przypisów. Podciąg między nawiasami może być również pusty. Zobacz przykłady przypadków poniżej.
Zasady i punktacja
Możesz napisać pełny program lub funkcję. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.
Jeśli język nie natywnie wsparcie liczby dziesiętne ( kaszel Retina kaszel ), można podać numery przypisów w innej bazie, w tym binarny lub jednoskładnikowa; jednak użycie liczb jednostkowych nakłada karę + 20% .
Przypadki testowe
Wkład:
This input contains no parentheses.
Wydajność:
This input contains no parentheses.
Wkład:
This has (some) parentheses (but not so many).
Wydajność:
This has <sup>1</sup> parentheses <sup>2</sup>.
<sub>1 some</sub>
<sub>2 but not so many</sub>
Wkład:
This has (nested (deeply (or highly?) nested)) parentheses (and several groups).
Wydajność:
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>
Wkład:
Hmm()(()(,)) a()((trt)(v( (((((wut)))))(X)(Y)(Z) )!?!?!?!))oooooooo(oooo)oooo
Wydajność:
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>
Zwróć uwagę na puste linie między przypisami.
źródło
foo (bar)\nfoot (note)
?Odpowiedzi:
Perl,
817572 bajtów71 bajtów kodu + 1 bajtowy argument wiersza poleceń.
Wymaga Perla 5.10 lub nowszego (do obsługi wyrażeń regularnych)
Stosowanie:
Wyjaśnienie
-p
parametr wypisze wynik zastosowania podanych poleceń do danych wejściowych, unikając konieczności jawnego drukowania.Wyrażenie regularne
(\(((?1)|.)*?)\))
szuka najbardziej zewnętrznego zestawu nawiasów od początku łańcucha. Kiedy to zostanie znalezione, przeprowadzamy podstawienie, upewniając się, że dodajemy tylko na samym końcu danych wejściowych (przechwytując wszystko do końca danych wejściowych za pomocą(.*)
).Następnie powtarzamy podstawienie wyrażenia regularnego na teraz podstawionym łańcuchu
redo
, co spowoduje ciągłe stosowanie podstawienia wyrażenia regularnego, dopóki nie będzie już zgodne. Ws
modyfikujące zapewnia, że.
w regex będzie pasował do nowych linii, co jest konieczne, ponieważ ponownie zastosować regex mecz od wyniku poprzedniego substytucji regex.źródło
[^)]
lub nawet.
zamiast[^()]
gwarancji, że dane wejściowe zostaną odpowiednio zbalansowane..
mecz. @xebtl, wyzwanie mówi „Nie będzie zawierało nowych linii ani cyfr”Emacs Lisp, 335 bajtów
Przedmowa. Ta odpowiedź i Schematy są obecnie jedynymi odpowiedziami oficjalnie usankcjonowanymi zarówno przez Mighty Popular Republic of LISP, jak i Church of Emacs. Inne odpowiedzi, krótsze lub nie, są uważane za zagrożenie dla pokoju. W szczególności, z głęboką pogardą dla zniesławiających zarzutów o McCarthyism, które są sporadycznie słyszane od wrogich przeciwników państwa, zalecamy każdemu, kto ma informacje o prawdziwej tożsamości anonimowych autorów piszących odpowiedzi Nonlisp, aby skontaktowali się z lokalnym biurem. Przypomina się, że każdy powinien poświęcić czas na przemyślenie i głosowanie zgodnie z tym, co głęboko wierzy, że nie zagrozi jego przyszłym kontaktom z oficjalnymi przedstawicielami władzy. Kod to dane. Dane to kod.
Bardziej elegancko:
źródło
Siatkówka ,
968683 bajtów * 120% = 99,6Kod źródłowy tego rozwiązania składa się z dwóch plików:
Wyjaśnienie
Jest to bardzo bezpośrednia implementacja algorytmu opisanego w wyzwaniu. Kod składa się z pojedynczego podstawienia wyrażenia regularnego, które zamienia pierwszy zestaw nawiasów w przypis. Podstawienie to powtarza się
+
aż do momentu, gdy ciąg przestanie się zmieniać, co oznacza, że wyrażenie regularne już nie pasuje (ponieważ nie może znaleźć więcej nawiasów).Przypisy są wyliczane jako jednoargumentowe, dzięki czemu mogę po prostu wyszukać numer ostatniego przypisu i dołączyć a,
1
aby utworzyć następny.Wyrażenie regularne znajdowania pierwszego zestawu nawiasów opiera się na standardowej technice dopasowywania nawiasów do grup równoważących (hrhr, „dopasowywanie nawiasów”). Został on nieco skrócony poprzez użycie nienazwanej grupy i założenie, że nawiasy są odpowiednio zbalansowane (co oznacza, że możemy pominąć
(
negowaną klasę postaci i dopasować finał)
za pomocą prostej.
i nie musimy również upewniać się, że stos przechwytywania jest pusty).Po dopasowaniu nawiasów i przechwyceniu ich zawartości do grupy
1
, przechwytujemy pozostałą część ciągu za pomocą(.*)
do grupy,4
a następnie przeszukujemy ciąg w poszukiwaniu pierwszego zestawu znaków1
z negatywnym wyglądem. Jeśli znajdziemy taki podciąg, przechowujemy go w grupie5
. Jeśli tego nie zrobimy, wyglądamy, jakby się nie udawało, ale jest to w porządku, ponieważ jest opcjonalne - oznacza to tylko, że$5
da pusty ciąg znaków, który jest jednoznaczną reprezentacją0
i który jest również poprawny.Łańcuch podstawienia po prostu składa wszystko razem na podstawie grup przechwytywania. Numer przypisu zwiększa się, dodając
1
do ostatniego numeru za pomocą1$5
.źródło
Święty JavaScript , 1510 bajtów
Koledzy buntownicy, nie poddawajcie się ich tyrańskiemu niszczeniu nawiasu! Musisz wytrwać! Od samego początku programowanie było przedsięwzięciem darmowym. Teraz stał się przenikliwym pokazem pobożności. Musimy okazywać tylko absolutny strach. Dlatego walczyłem!
Brak zasad zakazujących używania świętych postaci w języku innym niż Lisp. Nie, wcale nie. (W nieco mniej kompaktowy sposób :)
To kompiluje się do rozszerzonego JavaScript w mojej innej odpowiedzi . To jest żart.
źródło
Lua,
222216204201 bajtówGra w golfa:
Nie golfowany:
źródło
repeat a,b=l(s,g) ... untill a<1
pętla nie byłaby krótsza niż twoja chwila?Schemat, 92 bajty
Sfrustrowani wdrożeniem pierwszego wyszukiwania w Real Lisp 1 mocarstwa decydują się na bardziej pragmatyczne podejście. W końcu nawiasy są święte, ale nawiasy nie są. 2)
1. nie słuchajcie heretyków z tak zwanego „kościoła” Emacsa!
2. Nie są programistami rakiet, prawda?
źródło
Haskell, 210 bajtów
Przykład użycia:
Jak to działa:
źródło
Schemat, 533 bajtów
Z wcięciem:
Tak, jest to 533 bajtów po usunięciu wszystkich opcjonalnych białych znaków. Rozkoszuj się funkcjonalną chwałą.
Zaimplementowałem mniej więcej algorytm w opisie:
x
grupuje dane wejściowe w nawiasach if
zastępuje pierwszy poziom grup przypisami, powtarzając, aż nie pozostanie więcej grup. Jestem pewien, że można go skrócić, ale nie widzę, jak można go skrócić znacznie bez przełączania na inny algorytm.Jak napisano, jest to kompletny program. Możesz to wypróbować tutaj , ale ponieważ repl.it najwyraźniej nie może sobie z tym poradzić
(read-line)
, musisz umieścić łańcuch wejściowy na swoim miejscu. Wersja całkowicie nie golfowa jest tutaj .EDYCJA: Jak wskazano w komentarzach, zmieniłem nawiasy
()
na nawiasy[]
w wersjach repl.it. Było to wyłącznie dla wygody podczas programowania i debugowania. Opublikowana wersja działa teraz z()
.źródło
#\[
„#]” w odpowiednim nawiasie (i zaktualizuję testy), będzie to działać bez problemu. Czy istnieje powód, dla którego opuściłeś te kwadratowe? czy ma to związek z twoją poprzednią odpowiedzią?JavaScript ES6, 244 bajty
Poważna odpowiedź (według mojej wiedzy działa tylko w FireFox)
Rozszerzony:
źródło
Sód , 315 bajtów
Obecnie nie jest to konkurencyjne, ponieważ nie radzi sobie również z zagnieżdżeniem.
Rozszerzony:
}
źródło