Jąkanie jest problemem, którego wielu z nas mogło doświadczyć lub przynajmniej go zobaczyć. Chociaż większość znanych programów do rozpoznawania mowy ma poważne problemy z jąkaniem się, wyobraźmy sobie oprogramowanie, które rozumie jąkanie, ale nie może ich naprawić i zapisuje je tylko w obecnej postaci.
Przykładowy tekst napisany przez takie oprogramowanie może wyglądać tak: „bądź ostrożny” . W tym przykładzie „ostrożne” to oryginalne słowo, a „ca ca” to jąkane słowa.
Wyzwanie
Napisz program lub funkcję, która naprawia jąkane słowa, usuwając je z wejścia, zachowując oryginalne słowa. Na przykład poprawiona wersja „proszę uważać” to „proszę uważać” .
To jest golf golfowy , wygrywa najkrótsza odpowiedź w każdym języku!
Jakie są jąkane słowa?
Jąkanie ma wiele różnych odmian. Ale dla uproszczenia tego wyzwania ograniczymy go do następujących zasad:
- Jąkane słowa mogą być niekompletną częścią lub całością oryginalnego słowa. Przez „część nieukończoną” rozumiem, że oryginalne słowo powinno zaczynać się dokładnie od słowa jąkanego. Na przykład „ope” i „open” oba mogą być jąkanym słowem „open” , ale „pen” nie może być jednym, ponieważ „open” nie zaczyna się od „pen” .
- Jąkane słowa muszą zawierać co najmniej jedną z samogłosek „aeiou” . Na przykład „gwiazda” może być jąkanym słowem dla „start”, ponieważ zawiera „a” , ale „st” nie może być jąkanym słowem, ponieważ nie zawiera żadnej z wymienionych samogłosek.
- Jąkane słowa mogą pojawić się tylko przed oryginalnym słowem i powinny być powtórzone co najmniej dwa razy, aby były poprawne (oryginalne słowo nie liczy się w powtórzeniach). Na przykład „oo open” ma jąkane słowa, ale „o open o” nie, ponieważ „o” po oryginalnym słowie się nie liczy, a „o” przed oryginalnym słowem nie jest powtarzane co najmniej dwa razy. „go go go go go go go” ma pięć powtórzeń jąkanych słów przed oryginalnym słowem i jest ważne.
- Pojedynczy zestaw powtarzanych jąkanych słów nie może zawierać mieszanych form, a słowa powinny być dokładnie takie same. Na przykład „op o op open” nie liczy się jako jąkane słowa. Z drugiej strony „o op op open” ma jąkane słowa, ponieważ pierwsze „o” jest tutaj postrzegane jako zupełnie inne słowo, a dwa „op” są liczone jako jąkane słowa „open” .
- W przypadku wielu prawidłowych zestawów powtarzających się jąkanych słów bezpośrednio po sobie, pozostaje tylko ostatnie oryginalne słowo. Na przykład w „ooo op op op open” część „oo o” jest postrzegana jako jąkane słowa pierwszego „op” , więc należy je usunąć, a następnie „op op op” jest postrzegana jako jąkane słowo „otwarte ” i należy je również usunąć, aby po usunięciu jąkanych słów pozostało tylko „ otwarte ” . Możesz założyć, że wiele prawidłowych zestawów powtarzających się jąkanych słów występuje tylko od lewej do prawej, więc ustalenie „op op ooo open” spowoduje „op op open” (aka
Wejście
- Dane wejściowe to pojedynczy wiersz zawierający tylko angielskie litery ASCII (az), cyfry (0-9) i znaki spacji. Obudowa na litery nie jest ważna i możesz zdecydować o przyjęciu małych lub wielkich liter lub obu, ale obudowa powinna pozostać taka sama i nie możesz jej zmienić w wydruku.
- Możesz użyć listy liter (jak
["l","i","s","t"," ","o","f"," ","l","e","t","t","e","r","s"]
) zamiast ciągu, ale nie możesz użyć listy słów. Jeśli twój język ma inną strukturę wprowadzania, użyj go. Chodzi o to, że dane wejściowe nie powinny być oddzielane słowami, więc koszt oddzielenia słów w niektórych językach może faktycznie wywołać inne kreatywne rozwiązania. - Dane wejściowe mogą nie zawierać żadnego, jednego lub wielu jąkanych słów.
- Słowa i / lub liczby są oddzielone pojedynczą spacją, a dane wejściowe nie będą zawierać podwójnych spacji obok siebie.
Wynik
- Ciąg znaków lub lista liter lub odpowiednia struktura w Twoim języku z usuniętymi wszystkimi wprowadzonymi słowami.
- Wyrazy wyjściowe powinny być oddzielone dokładnie jedną spacją (to samo co wejście).
- Dozwolone są pojedyncze wiodące i końcowe znaki nowej linii lub spacja.
Standardowe luki są zabronione.
Przypadki testowe
Brak jąkanych słów:
"hello world" => "hello world"
Pojedynczy przykład powtarzających się jąkanych słów:
"ope ope ope ope open the window" => "open the window"
Wiele wystąpień powtarzanych jąkanych słów:
"there is is is is something un un under the the the table" => "there is something under the table"
Brak słów jąkanych, niewystarczająco powtarzanych:
"give me the the book" => "give me the the book"
Bez zacinających się słów, nie ma żadnej z wymienionych samogłosek:
"h h help m m m me" => "h h help m m m me"
Liczby nie są jąkanymi słowami, nie mają żadnej z wymienionych samogłosek:
"my nu nu number is 9 9 9 9876" => "my number is 9 9 9 9876"
Ale słowo zawierające zarówno samogłoski, jak i liczby może mieć jąkane słowa:
"my wi wi windows10 is slow" => "my windows10 is slow"
Różne formy jąkanych słów w tej samej grupie powtórzeń nie są liczone:
"this is an ant antarctica does not have" => "this is an ant antarctica does not have"
W przypadku wielu ciągłych zestawów jąkanych słów bezpośrednio po sobie zachowaj tylko ostatnie oryginalne słowo:
"what a be be be beauti beauti beautiful flower" => "what a beautiful flower"
To nie jest przypadek wielu ciągłych zestawów jąkanych słów zaraz po sobie:
"drink wat wat wa wa water" => "drink wat wat water"
Puste wejście:
"" => ""
Więcej przypadków z komentarzy:
"a ab abc" => "a ab abc"
"a ab ab abc" => "a abc"
"ab ab abc abcd" => "abc abcd"
"a a ab a able" => "ab a able"
"i have ave ave average" => "i have average"
"my wi wi windows 10 is cra cra crap" => "my windows 10 is crap"
Łatwa do skopiowania lista powyższych przypadków testowych:
"hello world",
"ope ope ope ope open the window",
"there is is is is something un un under the the the table",
"give me the the book",
"h h help m m m me",
"my nu nu number is 9 9 9 9876",
"my wi wi windows10 is slow",
"this is an ant antarctica does not have",
"what a be be be beauti beauti beautiful flower",
"drink wat wat wa wa water",
"",
"a ab abc",
"a ab ab abc",
"ab ab abc abcd",
"a a ab a able",
"i have ave ave average",
"my wi wi windows 10 is cra cra crap"
"drink wat wat wa wa water" => "drink wat wat water"
wydaje się, że reguła powinna mieć zastosowanie rekurencyjnie, aby stała się „pić wodę”Odpowiedzi:
C (gcc),
183180178 bajtówWypróbuj online!
C z pewnością nie może konkurować ze zwięzłością wyrażenia regularnego ...
Ten jest szczególnie trudny do odczytania, ponieważ ostatecznie zrzuciłem całą funkcję w jedną zagnieżdżoną parę
for
pętli (bez ciała!). To sprawia, że kolejność oceny jest nieprecyzyjna - kod na początku jest faktycznie wykonywany jako ostatni.Moja ulubiona sztuczka to
strpbrk(u,"aeiou")-1<s
. Służy to do sprawdzenia, czy powtarzane słowo zawiera samogłoski.u
wskazuje początek powtarzanego słowa is
wskazuje na drugie powtórzenie tego słowa; na przykład:strpbrk
następnie znajduje pierwszy znak,"aeiou"
który pojawia się pou
. (W tym przypadku jest to'u'
zaraz po.) Następnie możemy sprawdzić, czy to nastąpi wcześniej,s
aby sprawdzić, czy słowo zawiera samogłoskę. Ale jest niewielki problem -strpbrk
zwracaNULL
(tj.0
), Jeśli nie ma samogłoski w całym ciągu. Aby to naprawić, po prostu odejmuję 1, który zmienia się0
w0xffffffffffffffff
(na moim komputerze) z powodu przepełnienia. Jest to maksymalna wartość wskaźnika, która jest zdecydowanie większa niżs
, co powoduje niepowodzenie sprawdzania.Oto nieco starsza wersja (przed transformacją, która zmąciła kontrolę) z komentarzami:
Dzięki @ user1475369 za 3 bajty i @ceilingcat za 2 bajty.
źródło
T>1&&strpbrk
zT>1&strpbrk
,r&&!strncmp
zr&!strncmp
, a&&t[-1]
z&t[-1]
.bcmp()
zamiastmemcmp()
Perl 5 (-p), 34 bajty
Na podstawie usuniętej odpowiedzi Arnaulda.
Wypróbuj online!
źródło
05AB1E ,
302928 bajtów-1 bajt dzięki Kevin Cruijssen
Wypróbuj online!
05AB1E, bez wyrażeń regularnych, zdecydowanie nie wygląda na najlepsze narzędzie do tego zadania. Mimo to jakoś udało się ledwo pokonać Retinę.
źródło
g
przedĀ
. Prawda w stylu Pythona spowoduje już powstanie0
pustych ciągów i1
niepustych ciągów.Perl 6 , 45 bajtów
Wypróbuj online!
Prosta odpowiedź wyrażenia regularnego, która zastępuje wszystkie dopasowania jąkania pustym łańcuchem.
źródło
Stax , 26 bajtów
Uruchom i debuguj
Bezpośredni port z odpowiedzi perla @ Grimy'ego. Stax jest w stanie zmniejszyć dosłowny wzór wyrażenia regularnego i ma stałą samogłosek, która może się zmniejszyć
[aeiou]
.źródło
Czysty , 184 bajty
Wypróbuj online!
Definiuje
$ :: [Char] -> [Char]
, który dzieli ciąg wejściowy na spacje i grupuje identyczne elementy, które są następnie składane przez pomocnikaf :: [[[Char]]] -> [[Char]]
, łącząc się przed powrotem.źródło