본문 바로가기
Kotlin/Exercise

영어에서 돼지 라틴어로 번역하기

by 봄석 2019. 2. 24.

영어에서 돼지 라틴어로 번역하기


돼지라틴어란?

돼지 라틴어 (Pig Latin)는 혼란스럽게 만들려는 아동용 언어입니다. 몇 가지 간단한 규칙 (아래)을 준수하지만 신속하게 말하면 비 아동 (및 모국어가 아닌 사람들)이 이해하기가 정말 어렵습니다.


  • 규칙 1 : 단어가 모음 소리로 시작하는 경우 "ay"소리를 단어 끝에 추가하십시오. 단어의 시작 부분에있는 "xr"과 "yt"는 모음 소리를 만듭니다 (예 : "xray"-> "xrayay", "yttria"-> "yttriaay").
  • 규칙 2 : 단어가 자음으로 시작하는 경우 단어의 끝으로 이동 한 다음 단어 끝에 "ay"소리를 추가하십시오. 자음은 여러 개의 자음으로 구성 될 수 있습니다 (예 : "chair"-> "airchay").
  • 규칙 3 : 단어가 자음 소리와 함께 "qu"다음에 단어의 끝으로 이동 한 다음 "ay"소리를 단어 끝안드로이드 스트링 단어 자르기에 추가하십시오 (예 : "square"-> "aresquay" ).
  • 규칙 4 : 한 단어에 자음 클러스터 뒤에 "y"가 포함되거나 두 글자 단어의 두 번째 글자로 모음이 소리를냅니다 (예 : "rythem"-> "ythmrhay", "my"-> "ymay") .

ex)
돼지 라틴어 는 영어 로 단어 가 변경 되는 대칭 게임 입니다. 대개 인공 접미사 를 추가 하거나 단어 의 시작 또는 자음 또는 자음 집합 을 단어 끝에 옮기고 그 와 같은 접미사를 만들기 위해 음성 음절 을 추가합니다. 예를 들어, Wikipedia는 Ikipediaway가 될 것입니다 (접미사를 만들기 위해 'W'와 'ay'를 사용합니다). 목적은 규칙에 익숙하지 않은 다른 사람들 의 말 을 은폐하는 것입니다 .

돼지라틴어 위키피디아-https://en.wikipedia.org/wiki/Pig_Latin 



영어 모음 -> (a ,e , i ,o , u) 

영어 자음 -> (b,c,d,f,g,h,j,k,l,m,n,p,q,r,s,t,v,w,x,y,z)



testCode

@RunWith(Parameterized::class)
class PigLatinTest(val input: String, val expectedOutput: String) {
 
    companion object {
        @JvmStatic
        @Parameterized.Parameters(name = "{index}: translate({0})={1}")
        fun data() = arrayOf(
            // Ay is added to words that start with vowels
            arrayOf("apple""appleay"),
            arrayOf("ear""earay"),
            arrayOf("igloo""iglooay"),
            arrayOf("object""objectay"),
            arrayOf("under""underay"),
 
            // Ay is added to words that start with vowels followed by qu
            arrayOf("equal""equalay"),
 
            // First letter and ay are moved to the end of words that start with consonants
            arrayOf("pig""igpay"),
            arrayOf("koala""oalakay"),
            arrayOf("xenon""enonxay"),
            arrayOf("qat""atqay"),
 
            // Ch is treated like a single consonant
            arrayOf("chair""airchay"),
 
            // Qu is treated like a single consonant
            arrayOf("queen""eenquay"),
 
            // Qu and a single preceding consonant are treated like a single consonant
            arrayOf("square""aresquay"),
 
            // Th is treated like a single consonant
            arrayOf("therapy""erapythay"),
 
            // Thr is treated like a single consonant
            arrayOf("thrush""ushthray"),
 
            // Sch is treated like a single consonant
            arrayOf("school""oolschay"),
 
            // Yt is treated like a single vowel
            arrayOf("yttria""yttriaay"),
 
            // Xr is treated like a single vowel
            arrayOf("xray""xrayay"),
 
            // Y is treated like a consonant at the beginning of a word
            arrayOf("yellow""ellowyay"),
 
            // Y is treated like a vowel at the end of a consonant cluster
            arrayOf("rhythm""ythmrhay"),
 
            // Y as second letter in two letter word
            arrayOf("my""ymay"),
 
            // Phrases are translated
            arrayOf("quick fast run""ickquay astfay unray")
        )
    }
 
    @Test
    fun test() {
        assertEquals(expectedOutput, PigLatin.translate(input))
    }
 
   
}



1. 정규식으로 비교

 object PigLatin {
        val vowel = Regex("(\\s*)(a|e|i|o|u|yt|xr)(\\w+)")
        val consonant = Regex("(\\s*)(ch|qu|thr|th|sch|yt|rh|\\wqu|\\w)(\\w+)")
 
        fun translate(input: String): String {
            if (vowel.matches(input))
                return vowel.replace(input, "\$1\$2\$3ay")
            else
                return consonant.replace(input, "\$1\$3\$2ay")
        }
    }
}


정규식 패턴의 의미

표현식

 설명 

 ^

 문자열의 시작

 문자열의 종료

 .

 임의의 한 문자 (문자의 종류 가리지 않음)

 단, \ 는 넣을 수 없음

 *

 앞 문자가 없을 수도 무한정 많을 수도 있음

 앞 문자가 하나 이상

 앞 문자가 없거나 하나있음

 []

 문자의 집합이나 범위를 나타내며 두 문자 사이는 - 기호로 범위를 나타낸다. []내에서 ^가 선행하여 존재하면 not 을 나타낸다.

 {}

 횟수 또는 범위를 나타낸다.

 ()

 소괄호 안의 문자를 하나의 문자로 인식 

 |

 패턴 안에서 or 연산을 수행할 때 사용

 \s

 공백 문자

 \S

 공백 문자가 아닌 나머지 문자

 \w

 알파벳이나 숫자

\W 

 알파벳이나 숫자를 제외한 문자

\d 

 숫자 [0-9]와 동일

\D 

 숫자를 제외한 모든 문자

 정규표현식 역슬래시(\)는 확장 문자
 역슬래시 다음에 일반 문자가 오면 특수문자로 취급하고 역슬래시 다음에 특수문자가 오면 그 문자 자체를 의미

(?i) 

 앞 부분에 (?i) 라는 옵션을 넣어주면 대소문자를 구분하지 않음

출처: https://highcode.tistory.com/6 [HighCode]



모음 패턴 분석

"(\\s*)(a|e|i|o|u|yt|xr)(\\w+)"

1) \ : \가 왔기 때문에 다음에 올 문자는 특수문자로 취급하고, \다음 특수문자로 오면 그자체로 취급

2) \s : 공백문자

3) * : 앞문자가 없을 수도 무한정 많을 수도 있음

4) (a | e | i | o | u | yt | xr) : a, e ,i , o, u ,yt, xr 만 허용    | 를 이용한 or 연산

5) \ : \가 왔기 때문에 다음에 올 문자는 특스문자로 취급하고, \다음 특수문자로 오면 그자체로 취급

6) \w  : 알파벳이나 숫자
7) + : 앞 문자가 하나 이상

-> 공백인 문자 올수도 있고 없을수도 무한정 많을수도 있음, 그리고 a e i o u yt xr 만 허용하고 알파벳이나 숫자이며 하나이상이여야 함 


자음 패턴 분석

"(\\s*)(ch|qu|thr|th|sch|yt|rh|\\wqu|\\w)(\\w+)"

1) \ : \가 왔기 때문에 다음에 올 문자는 특수문자로 취급하고, \다음 특수문자로 오면 그자체로 취급

2) \s : 공백문자

3) * : 앞문자가 없을 수도 무한정 많을 수도 있음

4) (ch | qu | thr | th | sch | yt | rh | \\wqu | \\w) : 

 ch qu thr th sch yt rh 와 \\wqu, \\w만 허용  |를 이용한 or 연산

5)\\wqu는 \가 왔기 때문에 다음에올문자는 특수문자로취급 ,\w는 알파벳이나 숫자 를 의미

 즉 qu는 특수문자로 취급하며 알파벳이나 숫자만 올수있음

6) \\w 특수문자인 알파벳이나 숫자


7) \ : \가 왔기 때문에 다음에 올 문자는 특스문자로 취급하고, \다음 특수문자로 오면 그자체로 취급

8) \w  : 알파벳이나 숫자
9) + : 앞 문자가 하나 이상

-> 공백인 문자 올수도 있고 없을수도 무한정 많을수도 있음, 그리고 ch qu thr th sch yt rh qu 알파벳이나 숫자만 허용하고,  알파벳이나 숫자이며 하나이상이여야 함 

패턴 match 후 치환(replace)

  if (vowel.matches(input))
                return vowel.replace(input, "\$1\$2\$3ay")
            else
                return consonant.replace(input, "\$1\$3\$2ay")



$1 ,$2 , $3은 위 패턴분석의 괄호친 부분을 의미하며

replace 메소드로 순서를 바꿔줄수 있다.

'Kotlin > Exercise' 카테고리의 다른 글

윤년 찾기  (4) 2019.03.03
Hamming -DNA 차이  (2) 2019.03.03
Isogram인지아닌지 판단하기  (2) 2019.02.24
Raindrop - 숫자를 문자열로 변환하기  (2) 2019.02.23
Pangram인지 판단하기  (4) 2019.02.23

댓글