Skip to content
This repository has been archived by the owner on Jun 23, 2024. It is now read-only.

Commit

Permalink
Add TilesConverter.one_line_string_to_136_array() and `TilesConvert…
Browse files Browse the repository at this point in the history
…er.one_line_string_to_34_array()` methods
  • Loading branch information
Nihisil committed Jul 29, 2019
1 parent 6d3005b commit 6639955
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 0 deletions.
17 changes: 17 additions & 0 deletions mahjong/tests/tests_tile.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,20 @@ def test_convert_string_with_aka_dora_to_136_array(self):
def test_convert_string_with_aka_dora_as_zero_to_136_array(self):
tiles = TilesConverter.string_to_136_array(man='22444', pin='333067', sou='444', has_aka_dora=True)
self.assertTrue(FIVE_RED_PIN in tiles)

def test_one_line_string_to_136_array(self):
initial_string = '789m456p555s11222z'
tiles = TilesConverter.one_line_string_to_136_array(initial_string)
self.assertEqual(len(tiles), 14)

new_string = TilesConverter.to_one_line_string(tiles)
self.assertEqual(initial_string, new_string)

def test_one_line_string_to_34_array(self):
initial_string = '789m456p555s11222z'
tiles = TilesConverter.one_line_string_to_34_array(initial_string)
self.assertEqual(len(tiles), 34)

tiles = TilesConverter.to_136_array(tiles)
new_string = TilesConverter.to_one_line_string(tiles)
self.assertEqual(initial_string, new_string)
47 changes: 47 additions & 0 deletions mahjong/tile.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,3 +150,50 @@ def find_34_tile_in_136_array(tile34, tiles):
break

return found_tile

@staticmethod
def one_line_string_to_136_array(string, has_aka_dora=False):
"""
Method to convert one line string tiles format to the 136 array, like
"123s456p789m11222z". 's' stands for sou, 'p' stands for pin,
'm' stands for man and 'z' or 'h' stands for honor.
You can pass r or 0 instead of 5 for it to become a red five from
that suit. To prevent old usage without red,
has_aka_dora has to be True for this to do that.
"""
sou = ''
pin = ''
man = ''
honors = ''

split_start = 0

for index, i in enumerate(string):
if i == 'm':
man += string[split_start: index]
split_start = index + 1
if i == 'p':
pin += string[split_start: index]
split_start = index + 1
if i == 's':
sou += string[split_start: index]
split_start = index + 1
if i == 'z' or i == 'h':
honors += string[split_start: index]
split_start = index + 1

return TilesConverter.string_to_136_array(sou, pin, man, honors, has_aka_dora)

@staticmethod
def one_line_string_to_34_array(string, has_aka_dora=False):
"""
Method to convert one line string tiles format to the 34 array, like
"123s456p789m11222z". 's' stands for sou, 'p' stands for pin,
'm' stands for man and 'z' or 'h' stands for honor.
You can pass r or 0 instead of 5 for it to become a red five from
that suit. To prevent old usage without red,
has_aka_dora has to be True for this to do that.
"""
results = TilesConverter.one_line_string_to_136_array(string, has_aka_dora)
results = TilesConverter.to_34_array(results)
return results

0 comments on commit 6639955

Please sign in to comment.