Zostałeś zatrudniony do napisania kodu do aplikacji do dyktowania, która pobiera głos ze źródła mówionego, analizuje go jako słowa i zapisuje na ekranie.
Kierownictwo tak naprawdę nie ufa ci tyle mocy w projekcie - niestety nie jesteś w stanie siedzieć i grać w golfa przez cały dzień zamiast wykonywać swoją pracę - więc po prostu dają ci naprawdę proste zadanie do wykonania: obrócić Zdanie z przerywaną interpunkcją w poprawnie sformatowanym zdaniu, gdzie „właściwie sformatowane” zostało zdefiniowane poniżej.
Zdanie to ciąg wejściowy. Słowo to grupa wyróżniających się znaków spacji. Interpunkcja to Słowo, którego pierwszą postacią jest
^
.Słowo jest pisane wielką literą, jeśli pierwsza litera tego słowa nie jest małą literą (słowa pisane wielką literą pasują do wyrażenia regularnego
/[^a-z].*/
).Pierwsze słowo zdania musi być pisane wielkimi literami.
A
^COMMA
jest przecinkiem,
i ma spację następującą, ale nie poprzedzającą.aaa ^COMMA bbb
staje sięaaa, bbb
.A
^COLON
to przecinek, który wygląda:
.A
^SEMICOLON
to przecinek, który wygląda;
.A
^PERIOD
to przecinek, który wygląda.
. Słowo po a^PERIOD
musi być pisane wielką literą.A
^BANG
to okres, który wygląda!
.A
^DASH
jest znakiem myślnika-
i ma spację zarówno poprzedzającą, jak i następującą.A
^HYPHEN
jest także znakiem myślnika,-
ale nie ma spacji po nim ani przed nią.Jest
^EMDASH
to łącznik (nie myślnik!), Który jest przeliterowany--
.An
^OPENQUOTE
jest znakiem cudzysłowu"
, którego spacja jest poprzednia, ale nie następująca. Słowo następujące po^OPENQUOTE
musi być pisane wielkimi literami. Jeśli^OPENQUOTE
poprzedzone jest słowem, które nie jest interpunkcją, dodaj^COMMA
pomiędzy tym słowem a^OPENQUOTE
. Jeśli^OPENQUOTE
poprzedzona jest interpunkcja, która powoduje, że następne słowo jest pisane wielką literą, powoduje to przejście^OPENQUOTE
do następnego słowa.A
^CLOSEQUOTE
to digraf,,"
który ma spację następującą, ale nie poprzedzającą. Jeśli^CLOSEQUOTE
jest poprzedzone^COMMA
,^PERIOD
lub^BANG
, że interpunkcja znika i^CLOSEQUOTE
jest napisane,"
,."
albo!"
odpowiednio. Jeśli znikająca interpunkcja określiła wielką literę, ta litera musi nadal występować przy następnym dostępnym słowie.Początkowe lub końcowe spacje w pełnym wyniku końcowym muszą zostać usunięte, a każdy ciąg dwóch lub więcej spacji z rzędu musi być zwinięty w pojedynczy znak spacji.
Wszelkie przypadki nieuwzględnione powyżej (np.
^COMMA ^COMMA
Lub^SEMICOLON ^CLOSEQUOTE
lub^UNDEFINEDPUNCTUATION
) nie wystąpią w przypadku dobrze sformułowanych danych wejściowych, a zatem zachowanie jest niezdefiniowane.
Zespół programistów informuje o następujących kwestiach:
Projekt jest napisany w języku [Twój język tutaj] i powinien być możliwie jak najkrótszy, aby zajmował jak najmniej miejsca, gdy jest to aplikacja na Androida / iPhone'a. Próbujesz wyjaśnić, że nie tak działa tworzenie aplikacji, ale oni nie słuchają. Ale hej, co za zbieg okoliczności! Jesteś niesamowitym golfistą w [swoim języku tutaj] !
Aplikacja nie będzie miała żadnych uprawnień dostępu do sieci i nie będzie żadnych bibliotek, które dokonałyby tego formatowania. Prawdopodobnie możesz przekonać kierownika zespołu, aby zezwolił ci na bibliotekę wyrażeń regularnych, jeśli istnieje ona dla twojego języka, ale jeśli uważasz, że potrzebujesz.
Obsługa zagnieżdżonych cytatów, które prawidłowo używają podwójnych / pojedynczych cudzysłowów, jest planowana w późniejszej wersji aplikacji, ale nie w wersji, nad którą pracujesz teraz, więc nie martw się o to.
Kierownictwo jest wielkim fanem rozwoju opartego na testach, dlatego zespół deweloperów zlecił już pewnej nieszczęsnej małpce klawiaturowej napisanie testów dla twojej części programu: (dodano nowe wiersze dla czytelności, traktuj je jako spacje)
Wejście:
hello ^COMMA world ^BANG
Wynik:
Hello, world!
Wejście:
once upon a time ^COMMA there was a horse ^PERIOD that horse cost me $50 ^PERIOD ^OPENQUOTE eat your stupid oats ^COMMA already ^BANG ^CLOSEQUOTE I told the horse ^PERIOD the horse neighed back ^OPENQUOTE no ^CLOSEQUOTE and died ^PERIOD THE END
Wynik:
Once upon a time, there was a horse. That horse cost me $50. "Eat your stupid oats, already!" I told the horse. The horse neighed back, "No," and died. THE END
Wejście:
begin a ^PERIOD b ^COMMA c ^COLON d ^SEMICOLON e ^BANG f ^HYPHEN g ^DASH h ^EMDASH i ^OPENQUOTE j ^PERIOD ^OPENQUOTE k ^SEMICOLON ^OPENQUOTE l ^CLOSEQUOTE m ^BANG ^CLOSEQUOTE n ^PERIOD 0x6C6F6C end
Wynik:
Begin a. B, c: d; e! F-g - h--i, "j. "K; "l," m!" N. 0x6C6F6C end
To jest golf golfowy: wygrywa najniższy wynik. Możesz napisać funkcję o jednym argumencie łańcuchowym lub program odczytujący ze STDIN i zapisujący do STDOUT.
źródło
prompt()
?Odpowiedzi:
JavaScript:
653 611 547 514487 bajtówO mój Boże. Brendan Eich Przykro mi z tego powodu.
PS: Dodałem białe znaki dla czytelności, ale usunięcie wszystkich dozwolonych białych znaków powoduje wyświetlenie liczby bajtów.
Teoretycznie mógłbym skrócić niektóre części
-e-
do czegoś podobnego-e
lub-e
, ale może to powodować problem, jeśli poprzednie słowo kończy się na, lub następne słowo zaczyna się na literę „e” (lub dowolne słowo, którego zdecyduję się użyć). Przypuszczam, że mógłbym użyć znaku ASCII. Zajrzę do tego.487 FF22 + Tylko
514 FF22 + Tylko
547 FF22 + Tylko
Tylko 611 FF 22+
653 przeglądarka internetowa
Jak to działa:
JSFiddle (dla 653-bajtowego rozwiązania dla różnych przeglądarek)
JSFiddle (dla 595 FF 22+ tylko roztwór)
JSFiddle (dla 547 FF 22+ tylko roztwór)
JSFiddle (dla 514 FF 22+ tylko roztwór)
JSFiddle ( tylko rozwiązanie 487 FF 22+ )
To pierwszy raz, kiedy muszę napisać JS, który używa więcej niż jednego wyrażenia regularnego, i zwykle mój wyrażenie regularne jest predefiniowane.
Będę nadal golić bajty, jak tylko mogę.
źródło
c.replace(/\^((COMMA)|(SEMICOLON)|(COLON)|(PERIOD)|(BANG))/g,(m,_,a,b,c,d,e)=>a?',':b?';':c?':':d?'.':'!'))
... i tak dalej. Strzałka sintax jest krótka, ale nawet „funkcja” powinna zapisywać te same znaki=>
s, aby go uruchomić, ale użycie strzałek pozwoliło mi zaoszczędzić 40 bajtów!PHP, 412 bajtów
(Ungolfed tutaj dla przejrzystości; zobacz ideone dla wersji golfowej .)
Funkcja preg_replace () PHP akceptuje argumenty tablicowe, co jest tu bardzo przydatne. Myślę, że poniższy kod robi wszystko, co jest wymagane. Przechodzi co najmniej wszystkie przypadki testowe.
źródło