Preambuła
W wycenie stosu wymiany używamy ** do pogrubienia tekstu. Na przykład to przecena:
The **quick brown fox jumps over the lazy** dog.
Renderuje jako:
Szybki brązowy lis przeskoczył nad leniwym psem.
Oczywiście używamy ** również do zamykania odwagi. Więc mniej odpowiedzi będzie odważne. Na przykład:
The **quick** brown fox jumps over the **lazy** dog.
Renderuje jako:
Szybkie brązowy lis przeskoczył nad leniwym psem.
Jeśli jednak pogrubienie nie zostanie zamknięte, zostanie wyświetlone jako pogrubione :
The **quick brown fox jumps over the lazy dog.
Renderuje jako:
** Szybki brązowy lis przeskakuje nad leniwym psem.
Jeśli tekst ma pojedynczy odwrotny ukośnik \
, śmiałość nie działa:
The \**quick brown fox jumps over the lazy dog.**
Renderuje jako:
** szybki brązowy lis przeskakuje nad leniwym psem. **
Końcowa biała spacja powoduje, że tekst nie jest pogrubiony (uwaga, biała spacja po brązie to pojedyncza karta):
The** quick** brown fox jumps over the lazy dog.**
Renderuje jako:
** szybki ** brązowy lis przeskakuje nad leniwym psem. **
Możemy również użyć __ dla pogrubienia, ale pamiętaj, że tylko jeden może być aktywny na raz. Oto bardziej skomplikowany przykład:
The __quick**__ brown **fox__ jumps** over__ the__ lazy **dog.
Renderuje jako:
Szybkie ** brązowy fox__ skacze over__ the__ leniwe ** psa.
Pytanie:
Można napisać program lub funkcję, podany tekst ASCII albo jako String
argumentu lub standardowego wejścia, gdzie tylko znaki specjalne **
, __
, \
(dla ucieczki) i końcowe białe znaki, ustalić, ile znaków są pogrubione. Ta wartość powinna być wydrukowana do STDOUT lub zwrócona z twojej funkcji. Nie musisz obsługiwać bardzo długich łańcuchów; Długość łańcucha nie może być większa niż 30K
, co stanowi limit dla postu wymiany stosu.
Drobnym drukiem:
- Czy mogę zgłosić wyjątek / inny błąd dla jednej sprawy i wrócić normalnie dla drugiej?
- Nie. Musi to być wyraźna, jednoznaczna, nieskomplikowana wartość zwracana w obu przypadkach. Dane wyjściowe STDERR zostaną zignorowane.
- Czy spacje między słowami są uważane za pogrubione?
- Tak.
**quick brown**
ma w nim 11 pogrubionych znaków.
- Tak.
- Gdyby
\
w\**
razie pogrubienie, liczone?- Nie. Renderuje się jako **, więc jeśli powinien być pogrubiony, miałby tylko 2 znaki.
- Wyjaśnij całkowicie: co rozumiesz przez liczbę znaków?
- Wszystkie znaki, które byłyby pogrubione. Oznacza to, że nie
**
jest renderowany, jeśli przekształca tekst, ale jest renderowany, jeśli nie. - Pamiętaj, że
**
pogrubienie można wykonać na kilka sposobów, np.**\****
-> ** . - Nie bierz pod uwagę możliwości konwersji niektórych tekstów na kursywę. Tylko Przecena reguła do rozważenia jest ** = pogrubiony *.
- Wszystkie znaki, które byłyby pogrubione. Oznacza to, że nie
- Na stosie wymiany działa również pogrubienie HTML. tj. <b> </b>
- Tak, jestem tego świadomy. Nie bierz tego pod uwagę, to zwykły tekst.
- Co z kodami HTML? np.
<
-><
- Te również należy traktować jako zwykły tekst, nie ma konwersji encji HTML.
- Pomyślałem o przykładzie, którego nie opisałeś powyżej!
- Reguły działają dokładnie tak, jakby tekst został opublikowany na Stack Exchange, w odpowiedzi (nie w komentarzu), z tym wyjątkiem, że bloki kodu nie są uważane za znaki specjalne . Zarówno typ czterech spacji, jak i backtick. Jeśli nie masz pewności, jak tekst powinien być renderowany, po prostu wrzuć go gdzieś jako pole odpowiedzi, są to zasady, których należy przestrzegać.
Przykłady:
Wejście:
The **quick brown fox jumps over the lazy** dog.
Wynik:
35
Wejście:
The **quick brown fox jumps over the lazy dog.
Wynik:
0
Wejście:
The __quick**__ brown **fox__ jumps** over__ the__ lazy **dog.
Wynik:
18
Wejście:
The __quick\____ brown fox **jumps over\** the** lazy \**dog.
Wynik:
23
Wejście:
The****quick brown fox****jumps over **the****lazy** dog.
Wynik:
11
Standardowe luki są zakazane.
18
poprawny dla trzeciego przypadku testowego?**fox__ jumps**
kończy pogrubienie.\**
lub\__
są to trzyznakowe sekwencje specjalne, ale w StackExchange są tylko dwuznakowe sekwencje specjalne\*
lub\_
.\***a**
Tworzy więc gwiazdkę, a następnie pogrubieniea
. Istnieje również inny ucieczka,\\
. Czy powinniśmy sobie z tym poradzić?Odpowiedzi:
rs , 107 bajtów
Prezentacje na żywo i przypadki testowe.
To całkiem szalone ... coś.
Najnowszy przypadek testowy jeszcze nie działa. WIP ...
Wyjaśnienie
Zamień tabulatory na spacje. Mają tę samą liczbę znaków, a tabulatory są później używane jako znaki specjalne.
Zamień
N
pogrubiony tekst na znakiN
nowej linii, a następnie tekst oryginalny.Zastąp wszelkie wystąpienia ogranicznika bezpośrednio poprzedzone ukośnikiem tabulatorem. Ma to na celu upewnienie się, że wpisy takie jak liczba
**a\***
mają 2 zamiast 3.Usuń dowolny znak, który nie jest tabulatorem ani znakiem nowej linii.
Zastąp wszystkie nowe wiersze podkreśleniami.
Usuń wszystkie tabulatory (które reprezentują separatory), a także wszelkie podkreślenia, które mogą po nich nastąpić. Jest to związane z powyższym problemem liczenia znaków z ogranicznikami zakończonymi znakami ucieczki.
Zamień sekwencję podkreślenia na jej długość. To jest liczba znaków.
źródło
**a****b**
wyjścia 2, powinno być 6. Patrz: a **** bPython: 133 znaki
Powinno to działać identycznie zarówno w Pythonie 2, jak i 3. Funkcja
f
zwraca liczbę pogrubionych znaków, które będą w ciągu, który zostanie przekazany, po sformatowaniu przez system przeceny stosu przepełnienia.Myślę, że dobrze rozumiem większość przypadków narożnych (w tym wszystkie wspomniane do tej pory w komentarzach), ale wciąż nie jest ona do końca idealna. Nie rozumiem, dlaczego
x***x**
nie wyświetla się*x
pogrubioną czcionką (tak jak***x**
robi), więc mój kod otrzyma co najmniej kilka nieprawidłowych danych wejściowych.Kod składa się z czterech głównych kroków. Pierwszy polega na zamianie wyrażenia regularnego dowolnego ukośnika odwrotnego, po którym następuje dowolny znak ze znakiem „x”. Drugi krok zastępuje dowolną sekwencję czterech gwiazdek lub znaków podkreślenia czterema znakami „x”. Trzeci krok używa wyrażenia regularnego,
findall
aby znaleźć wszystkie bloki, które zostaną zapisane kursywą. Ostatnim krokiem jest wyrażenie generatora wewnątrzsum
wywołania, które sumuje długości tych bloków, odejmując 4 znaki od każdego, ponieważ nie chcemy uwzględniać ograniczników w naszych obliczeniach.Oto kilka wyników testu:
źródło
x***x**
nie działa w polu wprowadzania. DziwacznyJavaScript ES6, 91 bajtów
Rozpatruje wszystkie ucieczki przed ręką, a następnie używa wyrażenia regularnego. Duży potencjał golfowy.
Wyjaśnienie
źródło
**a*b*c**
tego zwraca 9, które moim zdaniem jest niepoprawne. Rzeczywista liczba wynosi 5 (lub 3, jeśli weźmiesz pod uwagę kursywę, czego według OP nie powinieneś).