fork download
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """
  4. If the non-ASCII chars contained in b also show up in a and no less
  5. than the times they appear in b, then we say b is similar with a.
  6.  
  7. http://stackoverflow.com/questions/7375398
  8. """
  9. import unicodedata
  10.  
  11. try: from collections import Counter
  12. except ImportError:
  13. from collections import defaultdict
  14.  
  15. def Counter(iterable):
  16. d = defaultdict(int)
  17. for i in iterable:
  18. d[i] += 1
  19. return d
  20.  
  21. try:
  22. import regex as re # new regex that supports \X
  23.  
  24. def characters_grapheme(s):
  25. """Broken up `s` Unicode string into user-perceived characters."""
  26. return re.findall(r'\X', unicodedata.normalize('NFC', s), re.UNICODE)
  27. except ImportError:
  28. characters_grapheme = None
  29.  
  30. def characters_codepoints(s):
  31. assert isinstance(s, unicode)
  32. return s
  33.  
  34. def characters_normalized(s):
  35. return unicodedata.normalize('NFC', s)
  36.  
  37. def characters_bytes(encoding):
  38. def f(s):
  39. assert isinstance(s, unicode)
  40. return s.encode(encoding)
  41. f.__name__ = 'characters_bytes(%r)' % encoding
  42. return f
  43.  
  44. def nonascii(c):
  45. """Whether given character `c` is non-ascii."""
  46. return len(c) > 1 or ord(c) > 127
  47.  
  48. def count_nonascii(s):
  49. """Count how many times each non-ascii character is present in `s`."""
  50. return Counter(c for c in s if nonascii(c))
  51.  
  52. def issimilar(a, b, characters):
  53. """Whether `b` is "similar" with `a`."""
  54. a_count, b_count = [count_nonascii(characters(s)) for s in (a, b)]
  55. return all(a_count[char] >= count for char, count in b_count.iteritems())
  56.  
  57. def issimilar_alcott(a, b, characters):
  58. """Alcott's algorithm."""
  59. a_count = count_nonascii(characters(a))
  60. for c in characters(b):
  61. if nonascii(c):
  62. if a_count[c] == 0:
  63. # c is not in a or b_count[c] > a_count[c]
  64. return False
  65. # non-ascii `c` is present in `a`
  66. assert a_count[c] > 0
  67. a_count[c] -= 1
  68. return True
  69.  
  70. def main():
  71. for a, b, expected in [
  72. (u"ab中ef日jkl中本", u"bej中中日", True),
  73. (u"bej中中日", u"ab中ef日jkl中本", False),
  74. (u'lk日日日', u"bej中中日", False),
  75. (u"bej中中日", u'lk日日日', False),
  76. ]:
  77. x = issimilar_alcott(a, b, characters_codepoints)
  78. a, b = [s.encode('utf-8') for s in [a, b]]
  79. print "'%s' is %ssimilar with '%s'" % (
  80. b, '' if x else 'not ', a)
  81. assert x == expected
  82.  
  83.  
  84. import unittest
  85.  
  86. class TestCodepoints(unittest.TestCase):
  87. functions = [issimilar, issimilar_alcott]
  88.  
  89. def setUp(self):
  90. self.characters = characters_codepoints
  91.  
  92. def check_functions(self, data):
  93. for a, b, expected in data:
  94. for f in self.functions:
  95. x = f(a, b, self.characters)
  96. self.assertEqual(x, expected,
  97. "%s(%r, %r, %s) = %r, expected %r" % (
  98. f.__name__, a, b, self.characters.__name__,
  99. x, expected))
  100.  
  101. def test_combining_characters(self):
  102. data = [
  103. (u'a', u'a', True), # 'a' ← 'a'
  104. (u'a', u'b', True), # 'a' ← 'b'
  105. (u'b', u'a', True), # 'b' ← 'a'
  106. (u'b', u'b', True), # 'b' ← 'b'
  107. (u'\xea', u'\xea', True), # 'ê' ← 'ê'
  108. (u'\xea', u'e\u0302', True), # 'ê' ← 'ê'
  109. (u'e\u0302', u'\xea', True), # 'ê' ← 'ê'
  110. (u'e\u0302', u'e\u0302', True), # 'ê' ← 'ê'
  111. (u'\u2126', u'\u2126', True), # 'Ω' ← 'Ω'
  112. (u'\u2126', u'\u03a9', True), # 'Ω' ← 'Ω'
  113. (u'\u03a9', u'\u2126', True), # 'Ω' ← 'Ω'
  114. (u'\u03a9', u'\u03a9', True), # 'Ω' ← 'Ω'
  115. (u'e\u0302', u'e\u0302', True), # 'ê' ← 'ê'
  116. (u'e\u0302', u'\u0302a', False), # 'ê' ↚ '̂a'
  117. (u'\u0302a', u'e\u0302', False), # '̂a' ↚ 'ê'
  118. (u'\u0302a', u'\u0302a', True), # '̂a' ← '̂a'
  119. (u'e\u0302', u'\u0302e', False), # 'ê' ↚ '̂e'
  120. (u'\u0302e', u'e\u0302', False), # '̂e' ↚ 'ê'
  121. (u'e\u0302', u'a\u0302', False), # 'ê' ↚ 'â'
  122. (u'a\u0302', u'e\u0302', False), # 'â' ↚ 'ê'
  123. ]
  124. self.check_functions(data)
  125.  
  126. def test_example_from_question(self):
  127. data = [
  128. (u'ab\u4e2def\u65e5jkl\u4e2d\u672c', u'bej\u4e2d\u4e2d\u65e5',
  129. True), # 'ab中ef日jkl中本' ← 'bej中中日'
  130. (u'bej\u4e2d\u4e2d\u65e5', u'ab\u4e2def\u65e5jkl\u4e2d\u672c',
  131. False), # 'bej中中日' ↚ 'ab中ef日jkl中本'
  132. (u'lk\u65e5\u65e5\u65e5', u'bej\u4e2d\u4e2d\u65e5',
  133. False), # 'lk日日日' ↚ 'bej中中日'
  134. (u'bej\u4e2d\u4e2d\u65e5', u'lk\u65e5\u65e5\u65e5',
  135. False), # 'bej中中日' ↚ 'lk日日日'
  136. ]
  137. self.check_functions(data)
  138.  
  139. def test_devanagari_kshi(self):
  140. data = [
  141. (u'\u0915\u094d\u0937\u093f', u'\u0915\u094d\u0937\u093f',
  142. True), # क्षि ← क्षि
  143. (u'\u0915\u094d\u0937\u093f', u'\u0915\u0937\u094d\u093f',
  144. False), # क्षि ↚ कष्ि
  145. (u'\u0915\u094d\u0937\u093f', u'\u0915\u093f\u0937\u094d',
  146. False), # क्षि ↚ किष्
  147. (u'\u0915\u094d\u0937\u093f', u'\u094d\u0937\u0915\u093f',
  148. False), # क्षि ↚ ्षकि
  149. (u'\u0915\u094d\u0937\u093f', u'\u094d\u093f\u0937\u0915',
  150. False), # क्षि ↚ ्िषक
  151. (u'\u0915\u094d\u0937\u093f', u'\u0937\u094d\u0915\u093f',
  152. False), # क्षि ↚ ष्कि
  153. (u'\u0915\u094d\u0937\u093f', u'\u0937\u093f\u0915\u094d',
  154. True), # क्षि ← षिक्
  155. (u'\u0915\u094d\u0937\u093f', u'\u093f\u0915\u094d\u0937',
  156. False), # क्षि ↚ िक्ष
  157. (u'\u0915\u094d\u0937\u093f', u'\u093f\u094d\u0937\u0915',
  158. False), # क्षि ↚ ि्षक
  159. (u'\u0915\u094d\u093f\u0937', u'\u0915\u094d\u0937\u093f',
  160. False), # क्िष ↚ क्षि
  161. (u'\u0915\u094d\u093f\u0937', u'\u0915\u094d\u093f\u0937',
  162. True), # क्िष ← क्िष
  163. (u'\u0915\u094d\u093f\u0937', u'\u0915\u093f\u094d\u0937',
  164. False), # क्िष ↚ कि्ष
  165. (u'\u0915\u094d\u093f\u0937', u'\u094d\u0915\u093f\u0937',
  166. False), # क्िष ↚ ्किष
  167. (u'\u0915\u094d\u093f\u0937', u'\u094d\u093f\u0915\u0937',
  168. False), # क्िष ↚ ्िकष
  169. (u'\u0915\u094d\u093f\u0937', u'\u0937\u0915\u094d\u093f',
  170. True), # क्िष ← षक्ि
  171. (u'\u0915\u094d\u093f\u0937', u'\u0937\u094d\u0915\u093f',
  172. False), # क्िष ↚ ष्कि
  173. (u'\u0915\u094d\u093f\u0937', u'\u0937\u093f\u094d\u0915',
  174. False), # क्िष ↚ षि्क
  175. (u'\u0915\u094d\u093f\u0937', u'\u093f\u094d\u0915\u0937',
  176. False), # क्िष ↚ ि्कष
  177. (u'\u0915\u094d\u093f\u0937', u'\u093f\u0937\u094d\u0915',
  178. False), # क्िष ↚ िष्क
  179. (u'\u0915\u0937\u094d\u093f', u'\u0915\u0937\u094d\u093f',
  180. True), # कष्ि ← कष्ि
  181. (u'\u0915\u0937\u094d\u093f', u'\u0915\u0937\u093f\u094d',
  182. False), # कष्ि ↚ कषि्
  183. (u'\u0915\u0937\u094d\u093f', u'\u094d\u0915\u0937\u093f',
  184. False), # कष्ि ↚ ्कषि
  185. (u'\u0915\u0937\u094d\u093f', u'\u094d\u0937\u093f\u0915',
  186. False), # कष्ि ↚ ्षिक
  187. (u'\u0915\u0937\u094d\u093f', u'\u0937\u0915\u094d\u093f',
  188. False), # कष्ि ↚ षक्ि
  189. (u'\u0915\u0937\u094d\u093f', u'\u0937\u094d\u093f\u0915',
  190. True), # कष्ि ← ष्िक
  191. (u'\u0915\u0937\u094d\u093f', u'\u0937\u093f\u0915\u094d',
  192. False), # कष्ि ↚ षिक्
  193. (u'\u0915\u0937\u094d\u093f', u'\u093f\u0915\u0937\u094d',
  194. False), # कष्ि ↚ िकष्
  195. (u'\u0915\u0937\u094d\u093f', u'\u093f\u0937\u0915\u094d',
  196. False), # कष्ि ↚ िषक्
  197. (u'\u0915\u0937\u093f\u094d', u'\u0915\u094d\u093f\u0937',
  198. False), # कषि् ↚ क्िष
  199. (u'\u0915\u0937\u093f\u094d', u'\u0915\u0937\u093f\u094d',
  200. True), # कषि् ← कषि्
  201. (u'\u0915\u0937\u093f\u094d', u'\u0915\u093f\u0937\u094d',
  202. False), # कषि् ↚ किष्
  203. (u'\u0915\u0937\u093f\u094d', u'\u094d\u0937\u0915\u093f',
  204. False), # कषि् ↚ ्षकि
  205. (u'\u0915\u0937\u093f\u094d', u'\u094d\u093f\u0937\u0915',
  206. False), # कषि् ↚ ्िषक
  207. (u'\u0915\u0937\u093f\u094d', u'\u0937\u094d\u0915\u093f',
  208. False), # कषि् ↚ ष्कि
  209. (u'\u0915\u0937\u093f\u094d', u'\u0937\u093f\u094d\u0915',
  210. True), # कषि् ← षि्क
  211. (u'\u0915\u0937\u093f\u094d', u'\u093f\u0915\u094d\u0937',
  212. False), # कषि् ↚ िक्ष
  213. (u'\u0915\u0937\u093f\u094d', u'\u093f\u094d\u0937\u0915',
  214. False), # कषि् ↚ ि्षक
  215. (u'\u0915\u093f\u094d\u0937', u'\u0915\u094d\u0937\u093f',
  216. False), # कि्ष ↚ क्षि
  217. (u'\u0915\u093f\u094d\u0937', u'\u0915\u0937\u093f\u094d',
  218. False), # कि्ष ↚ कषि्
  219. (u'\u0915\u093f\u094d\u0937', u'\u0915\u093f\u094d\u0937',
  220. True), # कि्ष ← कि्ष
  221. (u'\u0915\u093f\u094d\u0937', u'\u094d\u0915\u093f\u0937',
  222. False), # कि्ष ↚ ्किष
  223. (u'\u0915\u093f\u094d\u0937', u'\u094d\u093f\u0915\u0937',
  224. False), # कि्ष ↚ ्िकष
  225. (u'\u0915\u093f\u094d\u0937', u'\u0937\u0915\u093f\u094d',
  226. True), # कि्ष ← षकि्
  227. (u'\u0915\u093f\u094d\u0937', u'\u0937\u094d\u0915\u093f',
  228. False), # कि्ष ↚ ष्कि
  229. (u'\u0915\u093f\u094d\u0937', u'\u0937\u093f\u094d\u0915',
  230. False), # कि्ष ↚ षि्क
  231. (u'\u0915\u093f\u094d\u0937', u'\u093f\u094d\u0915\u0937',
  232. False), # कि्ष ↚ ि्कष
  233. (u'\u0915\u093f\u094d\u0937', u'\u093f\u0937\u094d\u0915',
  234. False), # कि्ष ↚ िष्क
  235. (u'\u0915\u093f\u0937\u094d', u'\u0915\u0937\u094d\u093f',
  236. False), # किष् ↚ कष्ि
  237. (u'\u0915\u093f\u0937\u094d', u'\u0915\u093f\u0937\u094d',
  238. True), # किष् ← किष्
  239. (u'\u0915\u093f\u0937\u094d', u'\u094d\u0915\u0937\u093f',
  240. False), # किष् ↚ ्कषि
  241. (u'\u0915\u093f\u0937\u094d', u'\u094d\u0937\u093f\u0915',
  242. False), # किष् ↚ ्षिक
  243. (u'\u0915\u093f\u0937\u094d', u'\u0937\u0915\u094d\u093f',
  244. False), # किष् ↚ षक्ि
  245. (u'\u0915\u093f\u0937\u094d', u'\u0937\u094d\u0915\u093f',
  246. True), # किष् ← ष्कि
  247. (u'\u0915\u093f\u0937\u094d', u'\u0937\u093f\u0915\u094d',
  248. False), # किष् ↚ षिक्
  249. (u'\u0915\u093f\u0937\u094d', u'\u093f\u0915\u0937\u094d',
  250. False), # किष् ↚ िकष्
  251. (u'\u0915\u093f\u0937\u094d', u'\u093f\u0937\u0915\u094d',
  252. False), # किष् ↚ िषक्
  253. (u'\u094d\u0915\u0937\u093f', u'\u0915\u094d\u093f\u0937',
  254. False), # ्कषि ↚ क्िष
  255. (u'\u094d\u0915\u0937\u093f', u'\u0915\u093f\u094d\u0937',
  256. False), # ्कषि ↚ कि्ष
  257. (u'\u094d\u0915\u0937\u093f', u'\u094d\u0915\u0937\u093f',
  258. True), # ्कषि ← ्कषि
  259. (u'\u094d\u0915\u0937\u093f', u'\u094d\u0937\u0915\u093f',
  260. False), # ्कषि ↚ ्षकि
  261. (u'\u094d\u0915\u0937\u093f', u'\u094d\u0937\u093f\u0915',
  262. True), # ्कषि ← ्षिक
  263. (u'\u094d\u0915\u0937\u093f', u'\u0937\u0915\u094d\u093f',
  264. False), # ्कषि ↚ षक्ि
  265. (u'\u094d\u0915\u0937\u093f', u'\u0937\u094d\u093f\u0915',
  266. False), # ्कषि ↚ ष्िक
  267. (u'\u094d\u0915\u0937\u093f', u'\u093f\u0915\u094d\u0937',
  268. False), # ्कषि ↚ िक्ष
  269. (u'\u094d\u0915\u0937\u093f', u'\u093f\u094d\u0937\u0915',
  270. False), # ्कषि ↚ ि्षक
  271. (u'\u094d\u0915\u093f\u0937', u'\u0915\u094d\u0937\u093f',
  272. False), # ्किष ↚ क्षि
  273. (u'\u094d\u0915\u093f\u0937', u'\u0915\u0937\u093f\u094d',
  274. False), # ्किष ↚ कषि्
  275. (u'\u094d\u0915\u093f\u0937', u'\u094d\u0915\u0937\u093f',
  276. False), # ्किष ↚ ्कषि
  277. (u'\u094d\u0915\u093f\u0937', u'\u094d\u0915\u093f\u0937',
  278. True), # ्किष ← ्किष
  279. (u'\u094d\u0915\u093f\u0937', u'\u094d\u0937\u0915\u093f',
  280. True), # ्किष ← ्षकि
  281. (u'\u094d\u0915\u093f\u0937', u'\u094d\u093f\u0937\u0915',
  282. False), # ्किष ↚ ्िषक
  283. (u'\u094d\u0915\u093f\u0937', u'\u0937\u094d\u0915\u093f',
  284. False), # ्किष ↚ ष्कि
  285. (u'\u094d\u0915\u093f\u0937', u'\u0937\u093f\u094d\u0915',
  286. False), # ्किष ↚ षि्क
  287. (u'\u094d\u0915\u093f\u0937', u'\u093f\u094d\u0915\u0937',
  288. False), # ्किष ↚ ि्कष
  289. (u'\u094d\u0915\u093f\u0937', u'\u093f\u0937\u094d\u0915',
  290. False), # ्किष ↚ िष्क
  291. (u'\u094d\u0937\u0915\u093f', u'\u0915\u0937\u094d\u093f',
  292. False), # ्षकि ↚ कष्ि
  293. (u'\u094d\u0937\u0915\u093f', u'\u0915\u093f\u0937\u094d',
  294. False), # ्षकि ↚ किष्
  295. (u'\u094d\u0937\u0915\u093f', u'\u094d\u0915\u093f\u0937',
  296. True), # ्षकि ← ्किष
  297. (u'\u094d\u0937\u0915\u093f', u'\u094d\u0937\u0915\u093f',
  298. True), # ्षकि ← ्षकि
  299. (u'\u094d\u0937\u0915\u093f', u'\u094d\u093f\u0915\u0937',
  300. False), # ्षकि ↚ ्िकष
  301. (u'\u094d\u0937\u0915\u093f', u'\u0937\u0915\u093f\u094d',
  302. False), # ्षकि ↚ षकि्
  303. (u'\u094d\u0937\u0915\u093f', u'\u0937\u093f\u0915\u094d',
  304. False), # ्षकि ↚ षिक्
  305. (u'\u094d\u0937\u0915\u093f', u'\u093f\u0915\u0937\u094d',
  306. False), # ्षकि ↚ िकष्
  307. (u'\u094d\u0937\u0915\u093f', u'\u093f\u0937\u0915\u094d',
  308. False), # ्षकि ↚ िषक्
  309. (u'\u094d\u0937\u093f\u0915', u'\u0915\u094d\u093f\u0937',
  310. False), # ्षिक ↚ क्िष
  311. (u'\u094d\u0937\u093f\u0915', u'\u0915\u093f\u094d\u0937',
  312. False), # ्षिक ↚ कि्ष
  313. (u'\u094d\u0937\u093f\u0915', u'\u094d\u0915\u0937\u093f',
  314. True), # ्षिक ← ्कषि
  315. (u'\u094d\u0937\u093f\u0915', u'\u094d\u0937\u0915\u093f',
  316. False), # ्षिक ↚ ्षकि
  317. (u'\u094d\u0937\u093f\u0915', u'\u094d\u0937\u093f\u0915',
  318. True), # ्षिक ← ्षिक
  319. (u'\u094d\u0937\u093f\u0915', u'\u0937\u0915\u094d\u093f',
  320. False), # ्षिक ↚ षक्ि
  321. (u'\u094d\u0937\u093f\u0915', u'\u0937\u094d\u093f\u0915',
  322. False), # ्षिक ↚ ष्िक
  323. (u'\u094d\u0937\u093f\u0915', u'\u093f\u0915\u094d\u0937',
  324. False), # ्षिक ↚ िक्ष
  325. (u'\u094d\u0937\u093f\u0915', u'\u093f\u094d\u0937\u0915',
  326. False), # ्षिक ↚ ि्षक
  327. (u'\u094d\u093f\u0915\u0937', u'\u0915\u094d\u0937\u093f',
  328. False), # ्िकष ↚ क्षि
  329. (u'\u094d\u093f\u0915\u0937', u'\u0915\u0937\u093f\u094d',
  330. False), # ्िकष ↚ कषि्
  331. (u'\u094d\u093f\u0915\u0937', u'\u094d\u0915\u0937\u093f',
  332. False), # ्िकष ↚ ्कषि
  333. (u'\u094d\u093f\u0915\u0937', u'\u094d\u0937\u093f\u0915',
  334. False), # ्िकष ↚ ्षिक
  335. (u'\u094d\u093f\u0915\u0937', u'\u094d\u093f\u0915\u0937',
  336. True), # ्िकष ← ्िकष
  337. (u'\u094d\u093f\u0915\u0937', u'\u094d\u093f\u0937\u0915',
  338. True), # ्िकष ← ्िषक
  339. (u'\u094d\u093f\u0915\u0937', u'\u0937\u094d\u0915\u093f',
  340. False), # ्िकष ↚ ष्कि
  341. (u'\u094d\u093f\u0915\u0937', u'\u0937\u093f\u094d\u0915',
  342. False), # ्िकष ↚ षि्क
  343. (u'\u094d\u093f\u0915\u0937', u'\u093f\u094d\u0915\u0937',
  344. False), # ्िकष ↚ ि्कष
  345. (u'\u094d\u093f\u0915\u0937', u'\u093f\u0937\u094d\u0915',
  346. False), # ्िकष ↚ िष्क
  347. (u'\u094d\u093f\u0937\u0915', u'\u0915\u0937\u094d\u093f',
  348. False), # ्िषक ↚ कष्ि
  349. (u'\u094d\u093f\u0937\u0915', u'\u0915\u093f\u0937\u094d',
  350. False), # ्िषक ↚ किष्
  351. (u'\u094d\u093f\u0937\u0915', u'\u094d\u0937\u0915\u093f',
  352. False), # ्िषक ↚ ्षकि
  353. (u'\u094d\u093f\u0937\u0915', u'\u094d\u093f\u0915\u0937',
  354. True), # ्िषक ← ्िकष
  355. (u'\u094d\u093f\u0937\u0915', u'\u094d\u093f\u0937\u0915',
  356. True), # ्िषक ← ्िषक
  357. (u'\u094d\u093f\u0937\u0915', u'\u0937\u0915\u093f\u094d',
  358. False), # ्िषक ↚ षकि्
  359. (u'\u094d\u093f\u0937\u0915', u'\u0937\u093f\u0915\u094d',
  360. False), # ्िषक ↚ षिक्
  361. (u'\u094d\u093f\u0937\u0915', u'\u093f\u0915\u0937\u094d',
  362. False), # ्िषक ↚ िकष्
  363. (u'\u094d\u093f\u0937\u0915', u'\u093f\u0937\u0915\u094d',
  364. False), # ्िषक ↚ िषक्
  365. (u'\u0937\u0915\u094d\u093f', u'\u0915\u094d\u093f\u0937',
  366. True), # षक्ि ← क्िष
  367. (u'\u0937\u0915\u094d\u093f', u'\u0915\u0937\u094d\u093f',
  368. False), # षक्ि ↚ कष्ि
  369. (u'\u0937\u0915\u094d\u093f', u'\u0915\u093f\u0937\u094d',
  370. False), # षक्ि ↚ किष्
  371. (u'\u0937\u0915\u094d\u093f', u'\u094d\u0937\u0915\u093f',
  372. False), # षक्ि ↚ ्षकि
  373. (u'\u0937\u0915\u094d\u093f', u'\u094d\u093f\u0937\u0915',
  374. False), # षक्ि ↚ ्िषक
  375. (u'\u0937\u0915\u094d\u093f', u'\u0937\u0915\u094d\u093f',
  376. True), # षक्ि ← षक्ि
  377. (u'\u0937\u0915\u094d\u093f', u'\u0937\u094d\u093f\u0915',
  378. False), # षक्ि ↚ ष्िक
  379. (u'\u0937\u0915\u094d\u093f', u'\u093f\u0915\u094d\u0937',
  380. False), # षक्ि ↚ िक्ष
  381. (u'\u0937\u0915\u094d\u093f', u'\u093f\u094d\u0937\u0915',
  382. False), # षक्ि ↚ ि्षक
  383. (u'\u0937\u0915\u093f\u094d', u'\u0915\u094d\u0937\u093f',
  384. False), # षकि् ↚ क्षि
  385. (u'\u0937\u0915\u093f\u094d', u'\u0915\u0937\u093f\u094d',
  386. False), # षकि् ↚ कषि्
  387. (u'\u0937\u0915\u093f\u094d', u'\u0915\u093f\u094d\u0937',
  388. True), # षकि् ← कि्ष
  389. (u'\u0937\u0915\u093f\u094d', u'\u094d\u0915\u093f\u0937',
  390. False), # षकि् ↚ ्किष
  391. (u'\u0937\u0915\u093f\u094d', u'\u094d\u093f\u0915\u0937',
  392. False), # षकि् ↚ ्िकष
  393. (u'\u0937\u0915\u093f\u094d', u'\u0937\u0915\u093f\u094d',
  394. True), # षकि् ← षकि्
  395. (u'\u0937\u0915\u093f\u094d', u'\u0937\u094d\u0915\u093f',
  396. False), # षकि् ↚ ष्कि
  397. (u'\u0937\u0915\u093f\u094d', u'\u0937\u093f\u094d\u0915',
  398. False), # षकि् ↚ षि्क
  399. (u'\u0937\u0915\u093f\u094d', u'\u093f\u094d\u0915\u0937',
  400. False), # षकि् ↚ ि्कष
  401. (u'\u0937\u0915\u093f\u094d', u'\u093f\u0937\u094d\u0915',
  402. False), # षकि् ↚ िष्क
  403. (u'\u0937\u094d\u0915\u093f', u'\u0915\u0937\u094d\u093f',
  404. False), # ष्कि ↚ कष्ि
  405. (u'\u0937\u094d\u0915\u093f', u'\u0915\u093f\u0937\u094d',
  406. True), # ष्कि ← किष्
  407. (u'\u0937\u094d\u0915\u093f', u'\u094d\u0915\u0937\u093f',
  408. False), # ष्कि ↚ ्कषि
  409. (u'\u0937\u094d\u0915\u093f', u'\u094d\u0937\u093f\u0915',
  410. False), # ष्कि ↚ ्षिक
  411. (u'\u0937\u094d\u0915\u093f', u'\u0937\u0915\u094d\u093f',
  412. False), # ष्कि ↚ षक्ि
  413. (u'\u0937\u094d\u0915\u093f', u'\u0937\u094d\u0915\u093f',
  414. True), # ष्कि ← ष्कि
  415. (u'\u0937\u094d\u0915\u093f', u'\u0937\u093f\u0915\u094d',
  416. False), # ष्कि ↚ षिक्
  417. (u'\u0937\u094d\u0915\u093f', u'\u093f\u0915\u0937\u094d',
  418. False), # ष्कि ↚ िकष्
  419. (u'\u0937\u094d\u0915\u093f', u'\u093f\u0937\u0915\u094d',
  420. False), # ष्कि ↚ िषक्
  421. (u'\u0937\u094d\u093f\u0915', u'\u0915\u094d\u0937\u093f',
  422. False), # ष्िक ↚ क्षि
  423. (u'\u0937\u094d\u093f\u0915', u'\u0915\u094d\u093f\u0937',
  424. False), # ष्िक ↚ क्िष
  425. (u'\u0937\u094d\u093f\u0915', u'\u0915\u0937\u094d\u093f',
  426. True), # ष्िक ← कष्ि
  427. (u'\u0937\u094d\u093f\u0915', u'\u0915\u0937\u093f\u094d',
  428. False), # ष्िक ↚ कषि्
  429. (u'\u0937\u094d\u093f\u0915', u'\u0915\u093f\u094d\u0937',
  430. False), # ष्िक ↚ कि्ष
  431. (u'\u0937\u094d\u093f\u0915', u'\u0915\u093f\u0937\u094d',
  432. False), # ष्िक ↚ किष्
  433. (u'\u0937\u094d\u093f\u0915', u'\u094d\u0915\u0937\u093f',
  434. False), # ष्िक ↚ ्कषि
  435. (u'\u0937\u094d\u093f\u0915', u'\u094d\u0915\u093f\u0937',
  436. False), # ष्िक ↚ ्किष
  437. (u'\u0937\u094d\u093f\u0915', u'\u094d\u0937\u0915\u093f',
  438. False), # ष्िक ↚ ्षकि
  439. (u'\u0937\u094d\u093f\u0915', u'\u094d\u0937\u093f\u0915',
  440. False), # ष्िक ↚ ्षिक
  441. (u'\u0937\u094d\u093f\u0915', u'\u094d\u093f\u0915\u0937',
  442. False), # ष्िक ↚ ्िकष
  443. (u'\u0937\u094d\u093f\u0915', u'\u094d\u093f\u0937\u0915',
  444. False), # ष्िक ↚ ्िषक
  445. (u'\u0937\u094d\u093f\u0915', u'\u0937\u0915\u094d\u093f',
  446. False), # ष्िक ↚ षक्ि
  447. (u'\u0937\u094d\u093f\u0915', u'\u0937\u0915\u093f\u094d',
  448. False), # ष्िक ↚ षकि्
  449. (u'\u0937\u094d\u093f\u0915', u'\u0937\u094d\u0915\u093f',
  450. False), # ष्िक ↚ ष्कि
  451. (u'\u0937\u094d\u093f\u0915', u'\u0937\u094d\u093f\u0915',
  452. True), # ष्िक ← ष्िक
  453. (u'\u0937\u094d\u093f\u0915', u'\u0937\u093f\u0915\u094d',
  454. False), # ष्िक ↚ षिक्
  455. (u'\u0937\u094d\u093f\u0915', u'\u0937\u093f\u094d\u0915',
  456. False), # ष्िक ↚ षि्क
  457. (u'\u0937\u094d\u093f\u0915', u'\u093f\u0915\u094d\u0937',
  458. False), # ष्िक ↚ िक्ष
  459. (u'\u0937\u094d\u093f\u0915', u'\u093f\u0915\u0937\u094d',
  460. False), # ष्िक ↚ िकष्
  461. (u'\u0937\u094d\u093f\u0915', u'\u093f\u094d\u0915\u0937',
  462. False), # ष्िक ↚ ि्कष
  463. (u'\u0937\u094d\u093f\u0915', u'\u093f\u094d\u0937\u0915',
  464. False), # ष्िक ↚ ि्षक
  465. (u'\u0937\u094d\u093f\u0915', u'\u093f\u0937\u0915\u094d',
  466. False), # ष्िक ↚ िषक्
  467. (u'\u0937\u094d\u093f\u0915', u'\u093f\u0937\u094d\u0915',
  468. False), # ष्िक ↚ िष्क
  469. (u'\u0937\u093f\u0915\u094d', u'\u0915\u094d\u0937\u093f',
  470. True), # षिक् ← क्षि
  471. (u'\u0937\u093f\u0915\u094d', u'\u0915\u094d\u093f\u0937',
  472. False), # षिक् ↚ क्िष
  473. (u'\u0937\u093f\u0915\u094d', u'\u0915\u0937\u094d\u093f',
  474. False), # षिक् ↚ कष्ि
  475. (u'\u0937\u093f\u0915\u094d', u'\u0915\u0937\u093f\u094d',
  476. False), # षिक् ↚ कषि्
  477. (u'\u0937\u093f\u0915\u094d', u'\u0915\u093f\u094d\u0937',
  478. False), # षिक् ↚ कि्ष
  479. (u'\u0937\u093f\u0915\u094d', u'\u0915\u093f\u0937\u094d',
  480. False), # षिक् ↚ किष्
  481. (u'\u0937\u093f\u0915\u094d', u'\u094d\u0915\u0937\u093f',
  482. False), # षिक् ↚ ्कषि
  483. (u'\u0937\u093f\u0915\u094d', u'\u094d\u0915\u093f\u0937',
  484. False), # षिक् ↚ ्किष
  485. (u'\u0937\u093f\u0915\u094d', u'\u094d\u0937\u0915\u093f',
  486. False), # षिक् ↚ ्षकि
  487. (u'\u0937\u093f\u0915\u094d', u'\u094d\u0937\u093f\u0915',
  488. False), # षिक् ↚ ्षिक
  489. (u'\u0937\u093f\u0915\u094d', u'\u094d\u093f\u0915\u0937',
  490. False), # षिक् ↚ ्िकष
  491. (u'\u0937\u093f\u0915\u094d', u'\u094d\u093f\u0937\u0915',
  492. False), # षिक् ↚ ्िषक
  493. (u'\u0937\u093f\u0915\u094d', u'\u0937\u0915\u094d\u093f',
  494. False), # षिक् ↚ षक्ि
  495. (u'\u0937\u093f\u0915\u094d', u'\u0937\u0915\u093f\u094d',
  496. False), # षिक् ↚ षकि्
  497. (u'\u0937\u093f\u0915\u094d', u'\u0937\u094d\u0915\u093f',
  498. False), # षिक् ↚ ष्कि
  499. (u'\u0937\u093f\u0915\u094d', u'\u0937\u094d\u093f\u0915',
  500. False), # षिक् ↚ ष्िक
  501. (u'\u0937\u093f\u0915\u094d', u'\u0937\u093f\u0915\u094d',
  502. True), # षिक् ← षिक्
  503. (u'\u0937\u093f\u0915\u094d', u'\u0937\u093f\u094d\u0915',
  504. False), # षिक् ↚ षि्क
  505. (u'\u0937\u093f\u0915\u094d', u'\u093f\u0915\u094d\u0937',
  506. False), # षिक् ↚ िक्ष
  507. (u'\u0937\u093f\u0915\u094d', u'\u093f\u0915\u0937\u094d',
  508. False), # षिक् ↚ िकष्
  509. (u'\u0937\u093f\u0915\u094d', u'\u093f\u094d\u0915\u0937',
  510. False), # षिक् ↚ ि्कष
  511. (u'\u0937\u093f\u0915\u094d', u'\u093f\u094d\u0937\u0915',
  512. False), # षिक् ↚ ि्षक
  513. (u'\u0937\u093f\u0915\u094d', u'\u093f\u0937\u0915\u094d',
  514. False), # षिक् ↚ िषक्
  515. (u'\u0937\u093f\u0915\u094d', u'\u093f\u0937\u094d\u0915',
  516. False), # षिक् ↚ िष्क
  517. (u'\u0937\u093f\u094d\u0915', u'\u0915\u094d\u0937\u093f',
  518. False), # षि्क ↚ क्षि
  519. (u'\u0937\u093f\u094d\u0915', u'\u0915\u094d\u093f\u0937',
  520. False), # षि्क ↚ क्िष
  521. (u'\u0937\u093f\u094d\u0915', u'\u0915\u0937\u094d\u093f',
  522. False), # षि्क ↚ कष्ि
  523. (u'\u0937\u093f\u094d\u0915', u'\u0915\u0937\u093f\u094d',
  524. True), # षि्क ← कषि्
  525. (u'\u0937\u093f\u094d\u0915', u'\u0915\u093f\u094d\u0937',
  526. False), # षि्क ↚ कि्ष
  527. (u'\u0937\u093f\u094d\u0915', u'\u0915\u093f\u0937\u094d',
  528. False), # षि्क ↚ किष्
  529. (u'\u0937\u093f\u094d\u0915', u'\u094d\u0915\u0937\u093f',
  530. False), # षि्क ↚ ्कषि
  531. (u'\u0937\u093f\u094d\u0915', u'\u094d\u0915\u093f\u0937',
  532. False), # षि्क ↚ ्किष
  533. (u'\u0937\u093f\u094d\u0915', u'\u094d\u0937\u0915\u093f',
  534. False), # षि्क ↚ ्षकि
  535. (u'\u0937\u093f\u094d\u0915', u'\u094d\u0937\u093f\u0915',
  536. False), # षि्क ↚ ्षिक
  537. (u'\u0937\u093f\u094d\u0915', u'\u094d\u093f\u0915\u0937',
  538. False), # षि्क ↚ ्िकष
  539. (u'\u0937\u093f\u094d\u0915', u'\u094d\u093f\u0937\u0915',
  540. False), # षि्क ↚ ्िषक
  541. (u'\u0937\u093f\u094d\u0915', u'\u0937\u0915\u094d\u093f',
  542. False), # षि्क ↚ षक्ि
  543. (u'\u0937\u093f\u094d\u0915', u'\u0937\u0915\u093f\u094d',
  544. False), # षि्क ↚ षकि्
  545. (u'\u0937\u093f\u094d\u0915', u'\u0937\u094d\u0915\u093f',
  546. False), # षि्क ↚ ष्कि
  547. (u'\u0937\u093f\u094d\u0915', u'\u0937\u094d\u093f\u0915',
  548. False), # षि्क ↚ ष्िक
  549. (u'\u0937\u093f\u094d\u0915', u'\u0937\u093f\u0915\u094d',
  550. False), # षि्क ↚ षिक्
  551. (u'\u0937\u093f\u094d\u0915', u'\u0937\u093f\u094d\u0915',
  552. True), # षि्क ← षि्क
  553. (u'\u0937\u093f\u094d\u0915', u'\u093f\u0915\u094d\u0937',
  554. False), # षि्क ↚ िक्ष
  555. (u'\u0937\u093f\u094d\u0915', u'\u093f\u0915\u0937\u094d',
  556. False), # षि्क ↚ िकष्
  557. (u'\u0937\u093f\u094d\u0915', u'\u093f\u094d\u0915\u0937',
  558. False), # षि्क ↚ ि्कष
  559. (u'\u0937\u093f\u094d\u0915', u'\u093f\u094d\u0937\u0915',
  560. False), # षि्क ↚ ि्षक
  561. (u'\u0937\u093f\u094d\u0915', u'\u093f\u0937\u0915\u094d',
  562. False), # षि्क ↚ िषक्
  563. (u'\u0937\u093f\u094d\u0915', u'\u093f\u0937\u094d\u0915',
  564. False), # षि्क ↚ िष्क
  565. (u'\u093f\u0915\u094d\u0937', u'\u0915\u094d\u0937\u093f',
  566. False), # िक्ष ↚ क्षि
  567. (u'\u093f\u0915\u094d\u0937', u'\u0915\u094d\u093f\u0937',
  568. False), # िक्ष ↚ क्िष
  569. (u'\u093f\u0915\u094d\u0937', u'\u0915\u0937\u094d\u093f',
  570. False), # िक्ष ↚ कष्ि
  571. (u'\u093f\u0915\u094d\u0937', u'\u0915\u0937\u093f\u094d',
  572. False), # िक्ष ↚ कषि्
  573. (u'\u093f\u0915\u094d\u0937', u'\u0915\u093f\u094d\u0937',
  574. False), # िक्ष ↚ कि्ष
  575. (u'\u093f\u0915\u094d\u0937', u'\u0915\u093f\u0937\u094d',
  576. False), # िक्ष ↚ किष्
  577. (u'\u093f\u0915\u094d\u0937', u'\u094d\u0915\u0937\u093f',
  578. False), # िक्ष ↚ ्कषि
  579. (u'\u093f\u0915\u094d\u0937', u'\u094d\u0915\u093f\u0937',
  580. False), # िक्ष ↚ ्किष
  581. (u'\u093f\u0915\u094d\u0937', u'\u094d\u0937\u0915\u093f',
  582. False), # िक्ष ↚ ्षकि
  583. (u'\u093f\u0915\u094d\u0937', u'\u094d\u0937\u093f\u0915',
  584. False), # िक्ष ↚ ्षिक
  585. (u'\u093f\u0915\u094d\u0937', u'\u094d\u093f\u0915\u0937',
  586. False), # िक्ष ↚ ्िकष
  587. (u'\u093f\u0915\u094d\u0937', u'\u094d\u093f\u0937\u0915',
  588. False), # िक्ष ↚ ्िषक
  589. (u'\u093f\u0915\u094d\u0937', u'\u0937\u0915\u094d\u093f',
  590. False), # िक्ष ↚ षक्ि
  591. (u'\u093f\u0915\u094d\u0937', u'\u0937\u0915\u093f\u094d',
  592. False), # िक्ष ↚ षकि्
  593. (u'\u093f\u0915\u094d\u0937', u'\u0937\u094d\u0915\u093f',
  594. False), # िक्ष ↚ ष्कि
  595. (u'\u093f\u0915\u094d\u0937', u'\u0937\u094d\u093f\u0915',
  596. False), # िक्ष ↚ ष्िक
  597. (u'\u093f\u0915\u094d\u0937', u'\u0937\u093f\u0915\u094d',
  598. False), # िक्ष ↚ षिक्
  599. (u'\u093f\u0915\u094d\u0937', u'\u0937\u093f\u094d\u0915',
  600. False), # िक्ष ↚ षि्क
  601. (u'\u093f\u0915\u094d\u0937', u'\u093f\u0915\u094d\u0937',
  602. True), # िक्ष ← िक्ष
  603. (u'\u093f\u0915\u094d\u0937', u'\u093f\u0915\u0937\u094d',
  604. False), # िक्ष ↚ िकष्
  605. (u'\u093f\u0915\u094d\u0937', u'\u093f\u094d\u0915\u0937',
  606. False), # िक्ष ↚ ि्कष
  607. (u'\u093f\u0915\u094d\u0937', u'\u093f\u094d\u0937\u0915',
  608. False), # िक्ष ↚ ि्षक
  609. (u'\u093f\u0915\u094d\u0937', u'\u093f\u0937\u0915\u094d',
  610. True), # िक्ष ← िषक्
  611. (u'\u093f\u0915\u094d\u0937', u'\u093f\u0937\u094d\u0915',
  612. False), # िक्ष ↚ िष्क
  613. (u'\u093f\u0915\u0937\u094d', u'\u0915\u094d\u0937\u093f',
  614. False), # िकष् ↚ क्षि
  615. (u'\u093f\u0915\u0937\u094d', u'\u0915\u094d\u093f\u0937',
  616. False), # िकष् ↚ क्िष
  617. (u'\u093f\u0915\u0937\u094d', u'\u0915\u0937\u094d\u093f',
  618. False), # िकष् ↚ कष्ि
  619. (u'\u093f\u0915\u0937\u094d', u'\u0915\u0937\u093f\u094d',
  620. False), # िकष् ↚ कषि्
  621. (u'\u093f\u0915\u0937\u094d', u'\u0915\u093f\u094d\u0937',
  622. False), # िकष् ↚ कि्ष
  623. (u'\u093f\u0915\u0937\u094d', u'\u0915\u093f\u0937\u094d',
  624. False), # िकष् ↚ किष्
  625. (u'\u093f\u0915\u0937\u094d', u'\u094d\u0915\u0937\u093f',
  626. False), # िकष् ↚ ्कषि
  627. (u'\u093f\u0915\u0937\u094d', u'\u094d\u0915\u093f\u0937',
  628. False), # िकष् ↚ ्किष
  629. (u'\u093f\u0915\u0937\u094d', u'\u094d\u0937\u0915\u093f',
  630. False), # िकष् ↚ ्षकि
  631. (u'\u093f\u0915\u0937\u094d', u'\u094d\u0937\u093f\u0915',
  632. False), # िकष् ↚ ्षिक
  633. (u'\u093f\u0915\u0937\u094d', u'\u094d\u093f\u0915\u0937',
  634. False), # िकष् ↚ ्िकष
  635. (u'\u093f\u0915\u0937\u094d', u'\u094d\u093f\u0937\u0915',
  636. False), # िकष् ↚ ्िषक
  637. (u'\u093f\u0915\u0937\u094d', u'\u0937\u0915\u094d\u093f',
  638. False), # िकष् ↚ षक्ि
  639. (u'\u093f\u0915\u0937\u094d', u'\u0937\u0915\u093f\u094d',
  640. False), # िकष् ↚ षकि्
  641. (u'\u093f\u0915\u0937\u094d', u'\u0937\u094d\u0915\u093f',
  642. False), # िकष् ↚ ष्कि
  643. (u'\u093f\u0915\u0937\u094d', u'\u0937\u094d\u093f\u0915',
  644. False), # िकष् ↚ ष्िक
  645. (u'\u093f\u0915\u0937\u094d', u'\u0937\u093f\u0915\u094d',
  646. False), # िकष् ↚ षिक्
  647. (u'\u093f\u0915\u0937\u094d', u'\u0937\u093f\u094d\u0915',
  648. False), # िकष् ↚ षि्क
  649. (u'\u093f\u0915\u0937\u094d', u'\u093f\u0915\u094d\u0937',
  650. False), # िकष् ↚ िक्ष
  651. (u'\u093f\u0915\u0937\u094d', u'\u093f\u0915\u0937\u094d',
  652. True), # िकष् ← िकष्
  653. (u'\u093f\u0915\u0937\u094d', u'\u093f\u094d\u0915\u0937',
  654. False), # िकष् ↚ ि्कष
  655. (u'\u093f\u0915\u0937\u094d', u'\u093f\u094d\u0937\u0915',
  656. False), # िकष् ↚ ि्षक
  657. (u'\u093f\u0915\u0937\u094d', u'\u093f\u0937\u0915\u094d',
  658. False), # िकष् ↚ िषक्
  659. (u'\u093f\u0915\u0937\u094d', u'\u093f\u0937\u094d\u0915',
  660. True), # िकष् ← िष्क
  661. (u'\u093f\u094d\u0915\u0937', u'\u0915\u094d\u0937\u093f',
  662. False), # ि्कष ↚ क्षि
  663. (u'\u093f\u094d\u0915\u0937', u'\u0915\u094d\u093f\u0937',
  664. False), # ि्कष ↚ क्िष
  665. (u'\u093f\u094d\u0915\u0937', u'\u0915\u0937\u094d\u093f',
  666. False), # ि्कष ↚ कष्ि
  667. (u'\u093f\u094d\u0915\u0937', u'\u0915\u0937\u093f\u094d',
  668. False), # ि्कष ↚ कषि्
  669. (u'\u093f\u094d\u0915\u0937', u'\u0915\u093f\u094d\u0937',
  670. False), # ि्कष ↚ कि्ष
  671. (u'\u093f\u094d\u0915\u0937', u'\u0915\u093f\u0937\u094d',
  672. False), # ि्कष ↚ किष्
  673. (u'\u093f\u094d\u0915\u0937', u'\u094d\u0915\u0937\u093f',
  674. False), # ि्कष ↚ ्कषि
  675. (u'\u093f\u094d\u0915\u0937', u'\u094d\u0915\u093f\u0937',
  676. False), # ि्कष ↚ ्किष
  677. (u'\u093f\u094d\u0915\u0937', u'\u094d\u0937\u0915\u093f',
  678. False), # ि्कष ↚ ्षकि
  679. (u'\u093f\u094d\u0915\u0937', u'\u094d\u0937\u093f\u0915',
  680. False), # ि्कष ↚ ्षिक
  681. (u'\u093f\u094d\u0915\u0937', u'\u094d\u093f\u0915\u0937',
  682. False), # ि्कष ↚ ्िकष
  683. (u'\u093f\u094d\u0915\u0937', u'\u094d\u093f\u0937\u0915',
  684. False), # ि्कष ↚ ्िषक
  685. (u'\u093f\u094d\u0915\u0937', u'\u0937\u0915\u094d\u093f',
  686. False), # ि्कष ↚ षक्ि
  687. (u'\u093f\u094d\u0915\u0937', u'\u0937\u0915\u093f\u094d',
  688. False), # ि्कष ↚ षकि्
  689. (u'\u093f\u094d\u0915\u0937', u'\u0937\u094d\u0915\u093f',
  690. False), # ि्कष ↚ ष्कि
  691. (u'\u093f\u094d\u0915\u0937', u'\u0937\u094d\u093f\u0915',
  692. False), # ि्कष ↚ ष्िक
  693. (u'\u093f\u094d\u0915\u0937', u'\u0937\u093f\u0915\u094d',
  694. False), # ि्कष ↚ षिक्
  695. (u'\u093f\u094d\u0915\u0937', u'\u0937\u093f\u094d\u0915',
  696. False), # ि्कष ↚ षि्क
  697. (u'\u093f\u094d\u0915\u0937', u'\u093f\u0915\u094d\u0937',
  698. False), # ि्कष ↚ िक्ष
  699. (u'\u093f\u094d\u0915\u0937', u'\u093f\u0915\u0937\u094d',
  700. False), # ि्कष ↚ िकष्
  701. (u'\u093f\u094d\u0915\u0937', u'\u093f\u094d\u0915\u0937',
  702. True), # ि्कष ← ि्कष
  703. (u'\u093f\u094d\u0915\u0937', u'\u093f\u094d\u0937\u0915',
  704. True), # ि्कष ← ि्षक
  705. (u'\u093f\u094d\u0915\u0937', u'\u093f\u0937\u0915\u094d',
  706. False), # ि्कष ↚ िषक्
  707. (u'\u093f\u094d\u0915\u0937', u'\u093f\u0937\u094d\u0915',
  708. False), # ि्कष ↚ िष्क
  709. (u'\u093f\u094d\u0937\u0915', u'\u0915\u094d\u0937\u093f',
  710. False), # ि्षक ↚ क्षि
  711. (u'\u093f\u094d\u0937\u0915', u'\u0915\u094d\u093f\u0937',
  712. False), # ि्षक ↚ क्िष
  713. (u'\u093f\u094d\u0937\u0915', u'\u0915\u0937\u094d\u093f',
  714. False), # ि्षक ↚ कष्ि
  715. (u'\u093f\u094d\u0937\u0915', u'\u0915\u0937\u093f\u094d',
  716. False), # ि्षक ↚ कषि्
  717. (u'\u093f\u094d\u0937\u0915', u'\u0915\u093f\u094d\u0937',
  718. False), # ि्षक ↚ कि्ष
  719. (u'\u093f\u094d\u0937\u0915', u'\u0915\u093f\u0937\u094d',
  720. False), # ि्षक ↚ किष्
  721. (u'\u093f\u094d\u0937\u0915', u'\u094d\u0915\u0937\u093f',
  722. False), # ि्षक ↚ ्कषि
  723. (u'\u093f\u094d\u0937\u0915', u'\u094d\u0915\u093f\u0937',
  724. False), # ि्षक ↚ ्किष
  725. (u'\u093f\u094d\u0937\u0915', u'\u094d\u0937\u0915\u093f',
  726. False), # ि्षक ↚ ्षकि
  727. (u'\u093f\u094d\u0937\u0915', u'\u094d\u0937\u093f\u0915',
  728. False), # ि्षक ↚ ्षिक
  729. (u'\u093f\u094d\u0937\u0915', u'\u094d\u093f\u0915\u0937',
  730. False), # ि्षक ↚ ्िकष
  731. (u'\u093f\u094d\u0937\u0915', u'\u094d\u093f\u0937\u0915',
  732. False), # ि्षक ↚ ्िषक
  733. (u'\u093f\u094d\u0937\u0915', u'\u0937\u0915\u094d\u093f',
  734. False), # ि्षक ↚ षक्ि
  735. (u'\u093f\u094d\u0937\u0915', u'\u0937\u0915\u093f\u094d',
  736. False), # ि्षक ↚ षकि्
  737. (u'\u093f\u094d\u0937\u0915', u'\u0937\u094d\u0915\u093f',
  738. False), # ि्षक ↚ ष्कि
  739. (u'\u093f\u094d\u0937\u0915', u'\u0937\u094d\u093f\u0915',
  740. False), # ि्षक ↚ ष्िक
  741. (u'\u093f\u094d\u0937\u0915', u'\u0937\u093f\u0915\u094d',
  742. False), # ि्षक ↚ षिक्
  743. (u'\u093f\u094d\u0937\u0915', u'\u0937\u093f\u094d\u0915',
  744. False), # ि्षक ↚ षि्क
  745. (u'\u093f\u094d\u0937\u0915', u'\u093f\u0915\u094d\u0937',
  746. False), # ि्षक ↚ िक्ष
  747. (u'\u093f\u094d\u0937\u0915', u'\u093f\u0915\u0937\u094d',
  748. False), # ि्षक ↚ िकष्
  749. (u'\u093f\u094d\u0937\u0915', u'\u093f\u094d\u0915\u0937',
  750. True), # ि्षक ← ि्कष
  751. (u'\u093f\u094d\u0937\u0915', u'\u093f\u094d\u0937\u0915',
  752. True), # ि्षक ← ि्षक
  753. (u'\u093f\u094d\u0937\u0915', u'\u093f\u0937\u0915\u094d',
  754. False), # ि्षक ↚ िषक्
  755. (u'\u093f\u094d\u0937\u0915', u'\u093f\u0937\u094d\u0915',
  756. False), # ि्षक ↚ िष्क
  757. (u'\u093f\u0937\u0915\u094d', u'\u0915\u094d\u0937\u093f',
  758. False), # िषक् ↚ क्षि
  759. (u'\u093f\u0937\u0915\u094d', u'\u0915\u094d\u093f\u0937',
  760. False), # िषक् ↚ क्िष
  761. (u'\u093f\u0937\u0915\u094d', u'\u0915\u0937\u094d\u093f',
  762. False), # िषक् ↚ कष्ि
  763. (u'\u093f\u0937\u0915\u094d', u'\u0915\u0937\u093f\u094d',
  764. False), # िषक् ↚ कषि्
  765. (u'\u093f\u0937\u0915\u094d', u'\u0915\u093f\u094d\u0937',
  766. False), # िषक् ↚ कि्ष
  767. (u'\u093f\u0937\u0915\u094d', u'\u0915\u093f\u0937\u094d',
  768. False), # िषक् ↚ किष्
  769. (u'\u093f\u0937\u0915\u094d', u'\u094d\u0915\u0937\u093f',
  770. False), # िषक् ↚ ्कषि
  771. (u'\u093f\u0937\u0915\u094d', u'\u094d\u0915\u093f\u0937',
  772. False), # िषक् ↚ ्किष
  773. (u'\u093f\u0937\u0915\u094d', u'\u094d\u0937\u0915\u093f',
  774. False), # िषक् ↚ ्षकि
  775. (u'\u093f\u0937\u0915\u094d', u'\u094d\u0937\u093f\u0915',
  776. False), # िषक् ↚ ्षिक
  777. (u'\u093f\u0937\u0915\u094d', u'\u094d\u093f\u0915\u0937',
  778. False), # िषक् ↚ ्िकष
  779. (u'\u093f\u0937\u0915\u094d', u'\u094d\u093f\u0937\u0915',
  780. False), # िषक् ↚ ्िषक
  781. (u'\u093f\u0937\u0915\u094d', u'\u0937\u0915\u094d\u093f',
  782. False), # िषक् ↚ षक्ि
  783. (u'\u093f\u0937\u0915\u094d', u'\u0937\u0915\u093f\u094d',
  784. False), # िषक् ↚ षकि्
  785. (u'\u093f\u0937\u0915\u094d', u'\u0937\u094d\u0915\u093f',
  786. False), # िषक् ↚ ष्कि
  787. (u'\u093f\u0937\u0915\u094d', u'\u0937\u094d\u093f\u0915',
  788. False), # िषक् ↚ ष्िक
  789. (u'\u093f\u0937\u0915\u094d', u'\u0937\u093f\u0915\u094d',
  790. False), # िषक् ↚ षिक्
  791. (u'\u093f\u0937\u0915\u094d', u'\u0937\u093f\u094d\u0915',
  792. False), # िषक् ↚ षि्क
  793. (u'\u093f\u0937\u0915\u094d', u'\u093f\u0915\u094d\u0937',
  794. True), # िषक् ← िक्ष
  795. (u'\u093f\u0937\u0915\u094d', u'\u093f\u0915\u0937\u094d',
  796. False), # िषक् ↚ िकष्
  797. (u'\u093f\u0937\u0915\u094d', u'\u093f\u094d\u0915\u0937',
  798. False), # िषक् ↚ ि्कष
  799. (u'\u093f\u0937\u0915\u094d', u'\u093f\u094d\u0937\u0915',
  800. False), # िषक् ↚ ि्षक
  801. (u'\u093f\u0937\u0915\u094d', u'\u093f\u0937\u0915\u094d',
  802. True), # िषक् ← िषक्
  803. (u'\u093f\u0937\u0915\u094d', u'\u093f\u0937\u094d\u0915',
  804. False), # िषक् ↚ िष्क
  805. (u'\u093f\u0937\u094d\u0915', u'\u0915\u094d\u0937\u093f',
  806. False), # िष्क ↚ क्षि
  807. (u'\u093f\u0937\u094d\u0915', u'\u0915\u094d\u093f\u0937',
  808. False), # िष्क ↚ क्िष
  809. (u'\u093f\u0937\u094d\u0915', u'\u0915\u0937\u094d\u093f',
  810. False), # िष्क ↚ कष्ि
  811. (u'\u093f\u0937\u094d\u0915', u'\u0915\u0937\u093f\u094d',
  812. False), # िष्क ↚ कषि्
  813. (u'\u093f\u0937\u094d\u0915', u'\u0915\u093f\u094d\u0937',
  814. False), # िष्क ↚ कि्ष
  815. (u'\u093f\u0937\u094d\u0915', u'\u0915\u093f\u0937\u094d',
  816. False), # िष्क ↚ किष्
  817. (u'\u093f\u0937\u094d\u0915', u'\u094d\u0915\u0937\u093f',
  818. False), # िष्क ↚ ्कषि
  819. (u'\u093f\u0937\u094d\u0915', u'\u094d\u0915\u093f\u0937',
  820. False), # िष्क ↚ ्किष
  821. (u'\u093f\u0937\u094d\u0915', u'\u094d\u0937\u0915\u093f',
  822. False), # िष्क ↚ ्षकि
  823. (u'\u093f\u0937\u094d\u0915', u'\u094d\u0937\u093f\u0915',
  824. False), # िष्क ↚ ्षिक
  825. (u'\u093f\u0937\u094d\u0915', u'\u094d\u093f\u0915\u0937',
  826. False), # िष्क ↚ ्िकष
  827. (u'\u093f\u0937\u094d\u0915', u'\u094d\u093f\u0937\u0915',
  828. False), # िष्क ↚ ्िषक
  829. (u'\u093f\u0937\u094d\u0915', u'\u0937\u0915\u094d\u093f',
  830. False), # िष्क ↚ षक्ि
  831. (u'\u093f\u0937\u094d\u0915', u'\u0937\u0915\u093f\u094d',
  832. False), # िष्क ↚ षकि्
  833. (u'\u093f\u0937\u094d\u0915', u'\u0937\u094d\u0915\u093f',
  834. False), # िष्क ↚ ष्कि
  835. (u'\u093f\u0937\u094d\u0915', u'\u0937\u094d\u093f\u0915',
  836. False), # िष्क ↚ ष्िक
  837. (u'\u093f\u0937\u094d\u0915', u'\u0937\u093f\u0915\u094d',
  838. False), # िष्क ↚ षिक्
  839. (u'\u093f\u0937\u094d\u0915', u'\u0937\u093f\u094d\u0915',
  840. False), # िष्क ↚ षि्क
  841. (u'\u093f\u0937\u094d\u0915', u'\u093f\u0915\u094d\u0937',
  842. False), # िष्क ↚ िक्ष
  843. (u'\u093f\u0937\u094d\u0915', u'\u093f\u0915\u0937\u094d',
  844. True), # िष्क ← िकष्
  845. (u'\u093f\u0937\u094d\u0915', u'\u093f\u094d\u0915\u0937',
  846. False), # िष्क ↚ ि्कष
  847. (u'\u093f\u0937\u094d\u0915', u'\u093f\u094d\u0937\u0915',
  848. False), # िष्क ↚ ि्षक
  849. (u'\u093f\u0937\u094d\u0915', u'\u093f\u0937\u0915\u094d',
  850. False), # िष्क ↚ िषक्
  851. (u'\u093f\u0937\u094d\u0915', u'\u093f\u0937\u094d\u0915',
  852. True), # िष्क ← िष्क
  853. ]
  854. self.check_functions(data)
  855.  
  856. class TestNormalized(TestCodepoints):
  857. def setUp(self):
  858. self.characters = characters_normalized
  859.  
  860. class TestUTF8Bytes(TestCodepoints):
  861. def setUp(self):
  862. self.characters = characters_bytes('utf-8')
  863.  
  864. class TestUTF16ytes(TestCodepoints):
  865. def setUp(self):
  866. self.characters = characters_bytes('utf-16')
  867.  
  868. if characters_grapheme is not None:
  869. class TestGrapheme(TestCodepoints):
  870. def setUp(self):
  871. self.characters = characters_grapheme
  872.  
  873. def generate_testdata(cluster=u'\u0915\u094d\u0937\u093f'):
  874. from itertools import permutations, product
  875. for a, b in product(permutations(cluster), repeat=2):
  876. a, b = map(u''.join, [a, b])
  877. x = issimilar(a, b)
  878. print "(%r, %r,\n%r), # %s %s %s" % (
  879. a, b, x, a.encode('utf-8'), '←' if x else '↚', b.encode('utf-8'))
  880.  
  881. if __name__=="__main__":
  882. main()
  883. unittest.main()
  884.  
Success #stdin #stdout 0.03s 8136KB
stdin
Standard input is empty
stdout
'bej中中日' is similar with 'ab中ef日jkl中本'
'ab中ef日jkl中本' is not similar with 'bej中中日'
'bej中中日' is not similar with 'lk日日日'
'lk日日日' is not similar with 'bej中中日'