Tak, w zasadzie jesteś romanizerem, skarbie , ale trudniejszym . jak, sposób trudniej.
Nauka koreańskiego jest trudna. przynajmniej dla osoby spoza Azji. Ale przynajmniej mają szansę się uczyć, prawda?
Co musisz zrobić
Otrzymasz koreańskie oświadczenie. Na przykład 안녕하세요
. Musisz przekonwertować dane wejściowe na wymowę rzymską. W podanym przykładzie wynikiem może być annyeonghaseyo
.
Teraz robi się techniczny
Koreańska postać składa się z trzech części: początkowej spółgłoski, samogłoski i końcowej spółgłoski. Spółgłoska Ending może nie istnieć w postaci.
Na przykład 아
jest ㅇ
(Początkowa spółgłoska) i ㅏ
(Samogłoska), a 손
jest ㅅ
(Początkowa spółgłoska), ㅗ
(Samogłoska) i ㄴ
(Końcowa spółgłoska).
Evert spółgłoska i samogłoska ma swoją wymowę. Wymowa każdej spółgłoski jest następująca.
Korean ㄱ ㄲ ㄴ ㄷ ㄸ ㄹ ㅁ ㅂ ㅃ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ ㅌ ㅍ ㅎ
Romanization Starting g kk n d tt r m b pp s ss – j jj ch k t p h
Ending k k n t – l m p – t t ng t – t k t p h
(- oznacza brak wymowy lub nieużywanie. nie musisz sobie z nimi radzić.)
Wymowa dla każdej samogłosek jest następująca.
Hangul ㅏ ㅐ ㅑ ㅒ ㅓ ㅔ ㅕ ㅖ ㅗ ㅘ ㅙ ㅚ ㅛ ㅜ ㅝ ㅞ ㅟ ㅠ ㅡ ㅢ ㅣ
Romanization a ae ya yae eo e yeo ye o wa wae oe yo u wo we wi yu eu ui i
Teraz jest to naprawdę trudna część
Wymowa spółgłosek zmienia się wcześniej przez spółgłoskę Ending. Wymowa każdej spółgłoski początkowej / końcowej jest następująca. (Nie musisz robić łącznika między wymowy. Jest to niepotrzebne. Jeśli komórka ma dwie lub więcej wymowy, wybierz jedną. Jeśli nie ma końcowej spółgłoski, użyj oryginalnej wymowy.)
Przykłady
Korean => English
안녕하세요 => annyeonghaseyo
나랏말싸미 듕귁에달아 => naranmalssami dyunggwigedara //See how the ㅅ in 랏 changes from 't' to 'n'
Przykładowa sugestia mile widziana. Można uzyskać odpowiedzi na własnych wejść tutaj . (O to w „Ogólnym tekście”, poprawionym, o to proszę)
źródło
ㅎ
następnieㄱ, ㄷ, ㅈ
są też przypadki szczególne (aspirują doㅋ, ㅌ, ㅈ
(k, t, j)) również powinny je uwypuklić.Odpowiedzi:
Python 3.6,
400394 bajtówEdycja: Dzięki RootTwo za -6 bajtów.
To moje pierwsze zgłoszenie do CodeGolf, więc jestem prawie pewien, że istnieją lepsze sposoby na grę w golfa, ale pomyślałem, że nadal będę go publikować, ponieważ nikt jeszcze nie wspomniał o kluczowym pomyśle, a to wciąż znacznie krótsze niż w przypadku innych rozwiązań .
Jak to działa
Rozwiązanie próbuje wykorzystać fakt (którego dowiedziałem się z oryginalnego japońskiego wyzwania romanizacji), że romanizowane nazwy postaci są dostępne poprzez moduł Unicodeedata Pythona. W przypadku języka koreańskiego mają one postać
HANGUL SYLLABLE <NAME>
. Niestety przetwarzanie tych nazw w celu spełnienia podanej specyfikacji i uwzględnienia wszystkich scenariuszy kombinacji sylaby nadal wymaga sporo wysiłku (i bajtów).W uzyskanych nazwach znaków wszystkie spółgłoski w formie dźwięcznej w dowolnym miejscu w sylabie, np.
GGAGG
Dla깎
,R/L
są transkrybowane zgodnie z przeznaczeniem (początekR
, koniecL
) iCH
są podawane jakoC
(to faktycznie oszczędza nam trochę bólu głowy).Przede wszystkim usuwamy
HANGUL SYLLABLE
część (pierwsze 16 znaków), zaznaczamy granicami sylaby za pomocą-
, a następnie stosujemy serię RegEx'ów w celu wykonania konwersji.Pierwszy RegEx wygląda wyjątkowo paskudnie. Zasadniczo robi to konwersja początkowych spółgłosek na ich końcowe odpowiedniki (usuwając również dodatkową literę w przypadku podwójnych spółgłosek), gdy nie następuje po nich samogłoska, lub w przypadku niektórych liter - gdy są poprzedzone
h
.(?<!n)
Zapobiega lookbehind dopasowanieg
który jest częściąng
, i(?!\\1)
uprzedzona zapewnia, że nie konwertować npssa
dotsa
.Kolejne kilka RegEx'ów przekształca początkowe podwójne spółgłoski w ich bezdźwięczne odpowiedniki. Tutaj
-
przydają się również separatory, które pomagają w rozpoznawaniu zderzeń granicznych (g-g
) z podwójnymi spółgłosek (gg
). Teraz można je również usunąć.Następnie zajmujemy się pozostałymi
h+consonant
kombinacjami,l->r
przed samogłoskami i innymi specjalnymi przypadkami.Wreszcie możemy przywrócić
c
doch
, i rozwiązać kilka innych osobliwości naszych przychodzących nazw, takich jak charyi
zamiastui
iweo
zamiastwo
.Nie jestem ekspertem od koreańskiego i nie mogę komentować więcej, ale zdaje się, że pomyślnie przeszedł wszystkie testy opublikowane w zadaniu i na Githubie. Oczywiście kilka dodatkowych bajtów można by ogolić, jeśli dane wyjściowe są dopuszczalne dużymi literami, ponieważ to właśnie otrzymujemy z funkcji name.
źródło
m[0]
jest taki sam jakm.group(0)
; oszczędzając 6 bajtów.JavaScript (ES6), 480 bajtów (WIP)
Jest to wczesna próba, oparta na aktualnych specyfikacjach, aby uruchomić piłkę. Może to wymagać pewnych poprawek, gdy pytania w komentarzach zostaną rozwiązane.
Przypadki testowe
Pokaż fragment kodu
W jaki sposób?
Po zdekompresowaniu tablica V zawiera następujące dane:
Dzielimy każdą postać Hangul na początkową spółgłoskę, samogłoskę i końcową spółgłoskę. Do wyniku dołączamy:
V[80 + substitution] + V[vowel]
jeśli jest zamianaV[40 + previousEndingConsonant] + V[21 + startingConsonant] + V[vowel]
Inaczejźródło
'!'
nie być33
?c
nie jest bajtem. Jest to ciąg 1 znaków. To powiedziawszy , przy stosowaniu operacji arytmetycznej przestrzeń jest wymuszana,0
podczas gdy inne znaki niecyfrowe są wymuszaneNaN
. Co oznacza, żec<1
tak naprawdę powinno działać zgodnie z oczekiwaniami. (Ic<33
działałoby również w przypadku znaków niecyfrowych, chociaż jest to trochę przypadkowe.)c<1
byłoby również zgodne z prawdą"0"
(co prawdopodobnie jest poprawne, jeśli dane wejściowe nie zawierają cyfr arabskich).Tcl, 529 bajtów
Algorytm
Ten algorytm jest wykorzystywany do celów wyzwania; kompromis polega na tym, że zakłada się, że dane wejściowe nie zawierają żadnych alfabetów łacińskich ani nie używają znaków spoza bloku Hangul U + AC00, jak opisano w wyzwaniu. Gdyby to był prawdziwy kod, zachowałbym wszystkie transformacje w Jamo aż do ostatniego przejścia.
Podejrzewam, że mógłbym rzucić nieco więcej mocy na chrupanie tych samogłosek i niektórych powtórzeń w tabeli odnośników, ale jest to tak dobre, jak się dzisiaj wydaje.
Testowanie
Upewnij się, że możesz podać wejście UTF-8 do interpretera Tcl. Najłatwiej to zrobić za pomocą prostego pliku tekstowego UTF-8. Niestety, Tcl nadal domyślnie nie jest domyślnie ustawiony na UTF-8; kosztowało mnie to 33 bajty.
Oto mój (obecnie żałosny) plik testowy:
Notatki
Nic nie wiem o języku koreańskim (z wyjątkiem tego, czego niewiele się tutaj nauczyłem). Jest to pierwsza próba, oczekująca na potencjalną zmianę z powodu aktualizacji specyfikacji pytania.
Poza tym przydatne są dodatkowe informacje. W szczególności nie ma zgodności 1: 1 między spółgłoskami ołowiu i ogona, co wydaje się sugerowane w wyzwaniu. Następujące dwie strony bardzo pomogły w ustaleniu tego:
• Wikipedia: język koreański, Hangul
• Wikipedia: Hangul Jamo (blok Unicode)
źródło