Wprowadzenie
W przeciwieństwie do angielskiego, niemiecki jest uważany za dość foniczny system pisania . Oznacza to, że zgodność pisowni z wymową jest bliska. Biorąc pod uwagę każde słowo, którego nie znasz, nadal będziesz wiedział, jak wymówić je ze względu na system pisowni. Oznacza to, że komputer powinien być w stanie zrobić to zbyt dobrze?
Wyzwanie
Napisz program lub funkcję, która pobiera jako ciąg znaków słowo niemieckie i wypisuje lub zwraca swoją wymowę w międzynarodowym alfabecie fonetycznym (IPA) .
Oczywiście nie zamierzam zmuszać cię do nauki niemieckiego ani pełnego IPA . Ta jedna sekcja w Wikipedii zawiera prawie wszystkie reguły niemieckie do IPA, których potrzebujesz, a ja kodowałem implementację referencji C # bez golfisty .
W tym linku znajduje się również lista 400 popularnych niemieckich słów i ich wymowa IPA (wymagana do weryfikacji). Biorąc przykład z tej listy, jeśli dane wejściowe są solltest
, poprawne dane wyjściowe to ˈzɔltəst
.
Implementacja referencyjna dodaje dwie pomocne reguły niewymienione w sekcji Wikipedii: Zakłada, że stres słowa występuje na pierwszej sylabie (najprawdopodobniej w języku niemieckim) i wykorzystuje lepszą heurystykę do określania, kiedy litera „e” reprezentuje dźwięk schwa / ə /. Implementuje również specjalne przetwarzanie prefiksów, ale nie poprawiło to wyników tak bardzo, jak myślałem.
Detale
Aby zostać uznanym za prawidłowy wpis, Twój program musi spełniać następujące wymagania:
- Dane wyjściowe IPA muszą być dokładnie dopasowane dla co najmniej 300 z 400 słów na liście słów referencyjnych (implementacja referencyjna otrzymuje poprawną 333)
- Twój program musi odgadnąć każde wiarygodne niemieckie słowo. Mamy więc wymaganie techniczne, co oznacza, że dla każdego wejścia, które pasuje do wyrażenia regularnego
[a-zA-ZäÄöÖüÜ][a-zäöüß]*
i ma co najmniej jedną samogłoskę (aeiouyäöü), musisz wygenerować wyjście nie zawierające wyłącznie białych znaków i nie popełnić błędu. - Program musi być deterministyczny (zawsze produkować to samo wyjście przy tych samych danych wejściowych)
- W przeciwnym razie standardowe luki są zabronione (zwłaszcza ta dotycząca pobierania zasobów poza witryną)
Różne rzeczy, które możesz robić:
- W razie potrzeby umieść początkowe i końcowe białe spacje na wydruku
- Użyj dowolnego wcześniej istniejącego kodowania znaków w danych wyjściowych (nie wyobrażam sobie, że nic innego niż Unicode działa dobrze, ale jeśli możesz, gratulacje)
- Załóżmy, że dane wejściowe są w jakiejś znormalizowanej formie, takiej jak formularze normalizacyjne Unicode NFD, NFC itp. Na przykład: ä jest zapisany jako pojedynczy znak lub znak podstawowy + znak łączący?
- Użyj standardowych metod wejścia i wyjścia
Punktacja i postacie IPA
Punktacja jest w bajtach. Ostrzegamy, że znaki niemieckie i znaki IPA mają 2 bajty w UTF-8. Ponadto, znak IPA U + 0327 ŁĄCZENIE ODWRÓCONEJ KRWI PONIŻEJ (̯) jest znakiem łączącym Unicode i jest 2-bajtowym znakiem UTF-8 samodzielnie. Oznacza to, że coś takiego jak ɐ̯ liczy się jako 4 bajty w UTF-8. Dla ciekawskich ten symbol oznacza, że samogłoska nie tworzy jądra sylaby (poprzednia zamiast tego).
Uważaj również na te znaki IPA, które w niektórych czcionkach wyglądają jak inne znaki ASCII: ɡ, ɪ, ʏ, ː (oznacza długą samogłoskę), ˈ (znaki, które sylaba ma akcent w słowie wielowarstwowym).
Jak utworzono listę słów referencyjnych
Ta sekcja zawiera dodatkowe informacje, które nie są potrzebne do wyzwania.
Lista słów została pobrana z tej Wikisłownikowej listy częstotliwości , usuwając powtórzenia z powodu różnicy wielkości liter i dwóch słów, które nie miały niemieckich wpisów w Wikisłowniku Angielskim (oh i hej). IPA patrzyło zarówno na angielski, jak i na niemiecki Wikisłownik. Tam, gdzie oferowano wiele wymowy, wybrałem bardziej formalną i standardową. Jeśli nie było to jasne, wybrałem ten, który najlepiej pasuje do ogólnych zasad.
Musiałem również ustandaryzować sposób wymawiania litery „r”. W dużym stopniu zależy to od regionu, w jaki sposób wymawiana jest ta litera, a Wikisłownik wcale nie był konsekwentny w tym, który wybrał. Czułem, że zmierza w kierunku: „r” jest wymawiane / ɐ̯ / po którym następuje długa samogłoska, a samogłoska nie następuje, w przeciwnym razie jest to ʁ. Zmieniłem więc wszystkie, aby stosować tę regułę, z wyjątkiem prefiksów ver i er, które były dość konsekwentne / (f) ɛɐ̯ /. Podobnie ustandaryzowałem „eu” jako / ɔʏ̯ /.
źródło
#~WordData~"PhoneticForm"&
), ale działa tylko dla angielskich słów.Odpowiedzi:
PHP,
331129882916284527592671266725092484 bajtów, przekazując 301/400Definiuje
pronounce(string $word)
.Stosowanie:
Jedna uwaga: 3 prefiksy i 33 słowa są zakodowane na stałe, a część kodu jest nieco zoptymalizowana w kierunku listy testów.
Kod testowy jest tutaj , choć to zależy od tego pliku .
Testować:
Napędzany łzami potrójnych oświadczeń.
EDYCJA 7 : Wyciśnięto ~ 170 bajtów, pisząc preprocesor w programie. W rezultacie, rzeczywisty program (wszystko po nim
__halt_compiler();
) jest trochę trudny do odczytania. Jeśli chcesz nieprzetworzony program, przełącz sięeval
zaprint
pomocą trzeciej instrukcji.źródło