git-subtree-dir: users/wpcarro git-subtree-mainline:464bbcb15cgit-subtree-split:24f5a642afChange-Id: I6105b3762b79126b3488359c95978cadb3efa789
		
			
				
	
	
		
			74 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import unittest
 | 
						|
 | 
						|
 | 
						|
def reverse(xs, i, j):
 | 
						|
    """Reverse array of characters, xs, in-place."""
 | 
						|
    while i < j:
 | 
						|
        xs[i], xs[j] = xs[j], xs[i]
 | 
						|
        i += 1
 | 
						|
        j -= 1
 | 
						|
 | 
						|
 | 
						|
def reverse_words(xs):
 | 
						|
    punctuation = None
 | 
						|
    if len(xs) > 0 and xs[-1] in ".?!":
 | 
						|
        punctuation = xs.pop()
 | 
						|
    reverse(xs, 0, len(xs) - 1)
 | 
						|
    i = 0
 | 
						|
    j = i
 | 
						|
    while j < len(xs):
 | 
						|
        while j < len(xs) and xs[j] != ' ':
 | 
						|
            j += 1
 | 
						|
        reverse(xs, i, j - 1)
 | 
						|
        j += 1
 | 
						|
        i = j
 | 
						|
    if punctuation:
 | 
						|
        xs.append(punctuation)
 | 
						|
 | 
						|
 | 
						|
# Tests
 | 
						|
class Test(unittest.TestCase):
 | 
						|
    def test_one_word(self):
 | 
						|
        message = list('vault')
 | 
						|
        reverse_words(message)
 | 
						|
        expected = list('vault')
 | 
						|
        self.assertEqual(message, expected)
 | 
						|
 | 
						|
    def test_two_words(self):
 | 
						|
        message = list('thief cake')
 | 
						|
        reverse_words(message)
 | 
						|
        expected = list('cake thief')
 | 
						|
        self.assertEqual(message, expected)
 | 
						|
 | 
						|
    def test_three_words(self):
 | 
						|
        message = list('one another get')
 | 
						|
        reverse_words(message)
 | 
						|
        expected = list('get another one')
 | 
						|
        self.assertEqual(message, expected)
 | 
						|
 | 
						|
    def test_multiple_words_same_length(self):
 | 
						|
        message = list('rat the ate cat the')
 | 
						|
        reverse_words(message)
 | 
						|
        expected = list('the cat ate the rat')
 | 
						|
        self.assertEqual(message, expected)
 | 
						|
 | 
						|
    def test_multiple_words_different_lengths(self):
 | 
						|
        message = list('yummy is cake bundt chocolate')
 | 
						|
        reverse_words(message)
 | 
						|
        expected = list('chocolate bundt cake is yummy')
 | 
						|
        self.assertEqual(message, expected)
 | 
						|
 | 
						|
    def test_empty_string(self):
 | 
						|
        message = list('')
 | 
						|
        reverse_words(message)
 | 
						|
        expected = list('')
 | 
						|
        self.assertEqual(message, expected)
 | 
						|
 | 
						|
    def test_bonus_support_punctuation(self):
 | 
						|
        message = list('yummy is cake bundt chocolate this!')
 | 
						|
        reverse_words(message)
 | 
						|
        expected = list('this chocolate bundt cake is yummy!')
 | 
						|
        self.assertEqual(message, expected)
 | 
						|
 | 
						|
 | 
						|
unittest.main(verbosity=2)
 |