2014-06-20 3 views
7

회문 해결사에 대한 일련의 테스트를 작성하고 있습니다. 나는 히브리어로 흥미로운 회문 건너 온 :히브리어로 회문문을 어떻게 발견 할 수 있습니까?

טעם לפת תפל מעט 회문이 있지만, 문자의 Mem 정규 형태를 모두 가지고

(מ)과 "최종 형태"(ם), 어떻게 단어의 마지막 글자로 나타납니다. 그러나 내 프로그램에서 "0x5de => 0x5dd"를 하드 코딩하는 것이 부족하기 때문에 프로그래밍 방식으로 유니 코드, 파이썬 또는이 두 가지를 동일하게 취급하는 라이브러리에 의존하는 방법을 알 수 없었습니다. 시도한 것 :

s = 'טעם לפת תפל מעט' 
s.casefold() # Python 3.4 
s.lower() 
s.upper() 
import unicodedata 
unicodedata.normalize(...) # In case this functioned like a German Eszett 

모두 동일한 문자열을 산출했습니다. 이 문제를 일으킬 수있는 다른 히브리 문자 (Kaf, Nun, Peh 및 Tsadeh가 나중에 검색 할 경우). 아니오, 저는 히브리어 원어민이 아닙니다.

+0

그 중 5 글자만으로도이 문제가 발생합니까? – Dannnno

+0

왜 이러는거야? 난 단지 궁금해서. –

+0

나는 프로그래밍 강사이고, 간단한 해결책 (단어는 회문인가?), 중간 해결책 (영어 문장은 회문인가?)과 도전적인 해결책을 가지고있다. 이 임의의 "글자"집합이 회문 이냐?). – heptadecagram

답변

1

여기에 현재의 문제에 대한 작동 못생긴 솔루션입니다 :

import unicodedata 

def make_map(ss): 
    return [unicodedata.name(s).split(' ')[-1] for s in ss] 

def is_palindrome(ss): 
    return make_map(ss) == make_map(reversed(ss)) 

이 있지만, 파이썬의 조회 테이블 히브리어 문자 이름의 형식에 의존하므로 완벽하게 일반화하지 않을 수 있습니다.

특히, 당신은 :

In [29]: unicodedata.name(s[2]) 
Out[29]: 'HEBREW LETTER FINAL MEM' 
... 
In [31]: unicodedata.name(s[-3]) 
Out[31]: 'HEBREW LETTER MEM' 

그래서 마지막 단어 만 모두 밖으로 제거하는 것은 당신에게 제공합니다 : 역에서 같은과

In [35]: [unicodedata.name(s_).split(" ")[-1] for s_ in s] 
Out[35]: ['TET', 'AYIN', 'MEM', 'SPACE', 'LAMED', 'PE', 'TAV', 'SPACE', 'TAV', 'PE', 'LAMED', 'SPACE', 'MEM', 'AYIN', 'TET'] 

. 그렇지만 유니 코드는 큰 세계입니다. 따라서 이것을 능가하는 예제를 만들 수 없는지 확실하지 않습니다.

+0

이것은 흥미로운 접근 방법이지만 액센트가있는 문자는 모두 "동등한 대문자", "라틴 대문자와 그라비드"로 간주됩니다. – heptadecagram

+0

이 경우 문자 이름의 유일한 차이점 인 "FINAL"을 무시할 수 있습니다 ... –

+0

@heptadecagram 특정 접근 방식을 깨뜨리는 이상한 이름의 유니 코드 문자를 항상 찾을 수 있다고 생각합니다. [유니 코드 문자가 많이 있습니다] (http://www.unicode.org/Public/6.3.0/ucd/NamesList.txt), "CEDILLA"에서 "RIGHT-POINTING DOUBLE ANGLE"까지 모든 것을 처리해야한다면 견적 마크 "를"악의 세력 분지 "로"오그 넥과 매크로가있는 라틴 소문자 "에서"정보 데스크 직원 "에게 .... 등등. 나는 당신이 SOL이라고 생각합니다. –

2

좀 더 많은 작업을 통해 약간 더 "엄격한"답변 (위양성 및 거짓 음영을 줄 가능성이 적은 답변)을 만들 수 있습니다. Patrick Collin의 답변은 관련없는 많은 문자를 유니 코드 데이터 이름으로 마지막 단어를 공유하기 때문에 일치하지 않아 실패 할 수 있습니다.

import unicodedata 

# Note the added accents 
phrase = 'טעם̀ לפת תפל מ̀עט' 

def convert_final_characters(phrase): 
    for character in phrase: 
     try: 
      name = unicodedata.name(character) 
     except ValueError: 
      yield character 
      continue 

     if "HEBREW" in name and " FINAL" in name: 
      try: 
       yield unicodedata.lookup(name.replace(" FINAL", "")) 
      except KeyError: 
       # Fails for HEBREW LETTER WIDE FINAL MEM "ﬦ", 
       # which has no non-final counterpart 
       # 
       # No failure if you first normalize to 
       # HEBREW LETTER FINAL MEM "ם" 
       yield character 
     else: 
      yield character 

phrase = "".join(convert_final_characters(phrase)) 
phrase 
#>>> 'טעמ̀ לפת תפל מ̀עט' 

이 그냥 "FINAL"제거 할 수 있습니다 히브리어 문자를 검색하고, 그 작업을 수행합니다 당신이 할 수있는

한 가지 변환 마지막 편지에서 엄격한 접근 방식입니다.


the "new" regex module on PyPI을 사용하여 graphemes로 변환 할 수도 있습니다.

import regex 

# "\X" matches graphemes 
graphemes = regex.findall("\X", phrase) 
graphemes 
#>>> ['ט', 'ע', 'מ̀', ' ', 'ל', 'פ', 'ת', ' ', 'ת', 'פ', 'ל', ' ', 'מ̀', 'ע', 'ט'] 

graphemes == graphemes[::-1] 
#>>> True 

악센트 및 기타 결합 문자를 다룹니다.