InterviewCake asks "How would you handle punctuation?". Without precise specs about what that entails, I'm supporting sentences ending with punctuation.
		
			
				
	
	
		
			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)
 |