sed, 367 (bajty kodu źródłowego) + 532 (ilość zapałek dla kodu źródłowego) = 899
s/[^0-9a-jln-suxyz]//Ig;/^$/{s/.*/0/;b};s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/;:1;s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I;/ ;/!b1;s/;.+//;s/^/,;/;:2;s/(;[^%]*)(%+)/\2\1/;:3;s/,%{10}/%,/;s/^%/,&/;/%{10}/b3;/;.*%/b2;:4;s/,[;,]/,0,/;/,[;,]/b4;s/%{9}/9/g;s/%{8}/8/g;s/%{7}/7/g;s/%{6}/6/g;s/%{5}/5/g;s/%%%%/4/g;s/%%%/3/g;s/%%/2/g;s/%/1/g;s/[^0-9]//g
Wypróbuj online
Wersja wieloliniowa:
s/[^0-9a-jln-suxyz]//Ig
/^$/{s/.*/0/;b}
s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/
:1
s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I
/ ;/!b1
s/;.+//
s/^/,;/
:2
s/(;[^%]*)(%+)/\2\1/
:3
s/,%{10}/%,/
s/^%/,&/
/%{10}/b3
/;.*%/b2
:4
s/,[;,]/,0,/
/,[;,]/b4
s/%{9}/9/g
s/%{8}/8/g
s/%{7}/7/g
s/%{6}/6/g
s/%{5}/5/g
s/%%%%/4/g
s/%%%/3/g
s/%%/2/g
s/%/1/g
s/[^0-9]//g
Wyjaśnienie:
Powyższy skrypt odczytuje standardowy wiersz po wierszu (do przestrzeni wzorów - zwykły „sposób sed”) i dla każdego wiersza wypisuje ilość zapałek potrzebnych do reprezentacji wszystkich znaków reprezentujących zapałki w tym wierszu. Obliczenia dla każdego wiersza danych wejściowych następują w następujący sposób:
s/[^0-9a-jln-suxyz]//Ig
Najpierw usuwamy każdą przestrzeń, dla której nie mamy odpowiadającej reprezentacji zapałek (jak podano w pytaniu) z obszaru wzorów. Oznacza to, że usuwamy każdy znak, który nie jest ani cyfrą od „0” do „9”, literą od „a” do „j”, „n” do „s”, „l”, „u”, „x”, „y” lub „z”. Wielkie i małe litery są traktowane tak samo.
/^$/{s/.*/0/;b}
Jeśli skończymy z pustą przestrzenią wzorów, wypisujemy 0 (automatycznie następuje nowa linia, jak zawsze sed, chyba że przekażesz specjalną flagę), pomiń wszystkie tylne linie skryptu i przejdź do następnego „cyklu sed” tj. przeczytaj następny wiersz danych wejściowych i powtórz przetwarzanie od początku od pierwszego polecenia, aż nie będzie już więcej wierszy danych wejściowych do przetworzenia).
s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/
W przeciwnym razie, jeśli przestrzeń wzorcowa nie jest pusta, dzielimy ją na dwie „podprzestrzenie” oddzielone średnikiem: najpierw pojawia się przestrzeń wejściowa , która początkowo jest utworzona przez wszystkie znaki, które nie zostały usunięte z przestrzeni wzorcowej po wykonanie linii 1; następnie jest średnik, a po nim przestrzeń na mapie .
Obszar mapy mówi nam, ile pasujących puzzli obok 1 jest potrzebnych do przedstawienia każdego odpowiedniego znaku alfanumerycznego. Jeśli chcemy wiedzieć, ile pasujących pasków jest wymaganych do reprezentacji dowolnego znaku alfanumerycznego w obszarze mapy, szukamy pierwszej sekwencji ciągłych% po lewej stronie tego znaku, a odpowiedzią będzie liczba% w ta sekwencja plus 1. Tak więc na przykład liczba zapałek potrzebnych do przedstawienia „b” wynosi 4 + 1 = 5; reprezentować „4”, 3 + 1 = 4, reprezentować „y”, 3 + 1 = 4; i tak dalej.
:1
s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I
/ ;/!b1
To jest pętla. Teraz zastąpimy każdy znak w przestrzeni wejściowej (pełną) sekwencją%, której liczba wskazuje niezbędną liczbę zapałek do reprezentowania tego znaku, i podążymy za tą sekwencją spacją (ponownie wielkie i małe litery są poddane temu samemu leczeniu). Kryterium ustalenia, czy pętla powinna się kończyć, jest sprawdzenie, czy w bezpośrednim lewym rogu średnika w przestrzeni wzorca znajduje się biały znak: jeśli ten warunek się utrzymuje, przerywamy pętlę i przechodzimy do następnej linii.
s/;.+//
s/^/,;/
Te dwie linie usuwają średnik i wszystko po nim z obszaru wzorców, a następnie wstawiają przecinek i średnik na początku obszaru wzorców. Mamy teraz przestrzeń wzorcową ponownie podzieloną na dwie nowe podprzestrzenie: analogową przestrzeń wynikową przed średnikiem i analogową przestrzeń wejściową po niej.
Analogowa przestrzeń wejściowa jest dokładnie tym, co wcześniej nazywaliśmy „przestrzenią wejściową”, ale w innej formie: teraz zawiera sekwencje% oddzielone białą spacją. Łączna liczba takich% w analogowej przestrzeni wejściowej to ta sama liczba zapałek potrzebnych do przedstawienia początkowego ciągu znaków wejściowych, tzn. Liczba ta jest wynikiem. Ale musimy wydrukować te wyniki w notacji dziesiętnej, a nie jako ciąg znaków procentu. Celem analogowej przestrzeni wyników jest przechowywanie analogowej reprezentacji każdej cyfry wyniku, podczas gdy my obliczamy ten wynik, sumując każdą ciągłą sekwencję% w analogicznej przestrzeni wejściowej jeden po drugim. Następna pętla wykonuje tę sumę:
:2
s/(;[^%]*)(%+)/\2\1/
:3
s/,%{10}/%,/
s/^%/,&/
/%{10}/b3
/;.*%/b2
Najpierw, po etykiecie 2 , przenosimy kolejną ciągłą sekwencję% za średnikiem z analogowej przestrzeni wejściowej do bezpośredniego lewego średnika, w analogicznej przestrzeni wyników;
Następnie wchodzimy w pętlę podrzędną (etykieta 3 ), która wykonuje następujące obliczenia:
Jeśli istnieje ciągła sekwencja dziesięciu% po przecinku w analogicznej przestrzeni wyników, usuwamy te% i umieszczamy pojedynczy% natychmiast po lewej stronie przecinka. Mówiąc prościej, oznacza to, że jedno z miejsc po przecinku w wyniku uzyskało więcej niż 9 jednostek, więc odejmujemy 10 jednostek od tego miejsca po przecinku i dodajemy 1 jednostkę do następnego większego miejsca po przecinku;
Jeśli „%” jest pierwszym znakiem w obszarze wzorów, wstawiamy nowy przecinek bezpośrednio przed nim. Wskazuje to, że suma osiągnęła wartość, której reprezentacja dziesiętna ma o jedno miejsce dziesiętne po lewej stronie niż poprzednia wartość;
Jeśli nadal istnieje ciągła sekwencja dziesięciu% w analogicznej przestrzeni wyników, wrócimy do etykiety 3 i powtórzymy ten proces. W przeciwnym razie wychodzimy z tej pod-pętli i przechodzimy do następnej linii.
Teraz, jeśli w analogicznym obszarze wejściowym jest jeszcze „%” (tj. Po średniku), oznacza to, że do sumy całkowitej należy dodać jeszcze pewną liczbę zapałek - wracamy do etykiety 2 .
Po zakończeniu sumowania wchodzimy do ostatniej pętli kodu:
:4
s/,[;,]/,0,/
/,[;,]/b4
Tutaj sprawdzamy każdą parę znaków utworzoną przez przecinek po lewej stronie oraz średnik lub przecinek po prawej stronie. Wszystkie takie pary znaków zastępujemy „0” w dwóch przecinkach.
s/%{9}/9/g
s/%{8}/8/g
s/%{7}/7/g
s/%{6}/6/g
s/%{5}/5/g
s/%%%%/4/g
s/%%%/3/g
s/%%/2/g
s/%/1/g
Powyższy fragment kodu jest dość prosty: zamieniamy każdą ciągłą sekwencję% w analogicznej przestrzeni wyników na znak dziesiętny, który odpowiada liczbie% w każdej określonej sekwencji.
s/[^0-9]//g
Na koniec usuwamy wszystkie znaki nieliczbowe z obszaru wzorców, a tym, co pozostaje, jest końcowy wynik znanego zapisu dziesiętnego. Ta wartość jest drukowana na standardowym wyjściu i rozpoczyna się następny cykl sed, jeśli jest więcej linii wejściowych do przetworzenia.
|_\n|_
(małe literyt
)