Add solution to challenge reverse words

This commit is contained in:
eamanu 2017-04-27 21:00:56 -03:00
parent f771a8b173
commit 15f8ff88f0
4 changed files with 250 additions and 15 deletions

View File

@ -92,16 +92,6 @@
"## Unit Test" "## Unit Test"
] ]
}, },
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"**The following unit test is expected to fail until you solve the challenge.**"
]
},
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
@ -110,8 +100,7 @@
}, },
"outputs": [], "outputs": [],
"source": [ "source": [
"\n", "# %load test_reverse_words.py\n",
"# %load test_reverse_string.py\n",
"from nose.tools import assert_equal\n", "from nose.tools import assert_equal\n",
"\n", "\n",
"\n", "\n",
@ -140,9 +129,9 @@
"metadata": { "metadata": {
"celltoolbar": "Edit Metadata", "celltoolbar": "Edit Metadata",
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 2",
"language": "python", "language": "python",
"name": "python3" "name": "python2"
}, },
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
@ -154,7 +143,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython2", "pygments_lexer": "ipython2",
"version": "2.7.9" "version": "2.7.12"
} }
}, },
"nbformat": 4, "nbformat": 4,

View File

@ -0,0 +1,37 @@
class ReverseWords:
def reverse(self, string):
if string is None:
return None
if string == ['']:
return ['']
buff_w = [] # buffer for substrings
substring = [] # substring
new_string = [] # new string with reverses words
for i in range(len(string)):
if(string[i] == ' '):
for h in range(len(buff_w) - 1, -1, -1):
substring.append(buff_w[h])
for j in range(len(substring)):
new_string.append(substring[j])
substring = []
buff_w = []
else:
buff_w.append(string[i])
if(i == (len(string) - 1)):
new_string.append(' ')
for h in range(len(buff_w) - 1, -1, -1):
substring.append(buff_w[h])
for j in range(len(substring)):
new_string.append(substring[j])
return new_string
def main():
R = ReverseWords()
result = R.reverse('foo bar')
print(result)
if __name__ == "__main__":
main()

View File

@ -0,0 +1,187 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This notebook was prepared by [eamanu](http://github.com/eamanu). Source and license info is on [GitHub](https://github.com/donnemartin/interactive-coding-challenges)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Challenge Notebook"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Problem: Implement a function to reverse words within a string. \n",
"\n",
"* [Constraints](#Constraints)\n",
"* [Test Cases](#Test-Cases)\n",
"* [Algorithm](#Algorithm)\n",
"* [Code](#Code)\n",
"* [Unit Test](#Unit-Test)\n",
"* [Solution Notebook](#Solution-Notebook)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Constraints\n",
"\n",
"* Can we assume the string is ASCII?\n",
" * Yes\n",
" * Note: Unicode strings could require special handling depending on your language\n",
"* Since we need to do this in-place, it seems we cannot use the slice operator or the reversed function?\n",
" * Correct\n",
"* Since Python string are immutable, can we use a list of characters instead?\n",
" * Yes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Test Cases\n",
"\n",
"* None -> None\n",
"* [''] -> ['']\n",
"* ['f', 'o', 'o', ' ', 'b', 'a', 'r'] -> ['o', 'o', 'f', ' ', 'r', 'a', 'b']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Algorithm\n",
"\n",
"* First if String is None\n",
" * Return None\n",
"* If String is ['']\n",
" * Return ['']\n",
"* Go throught the string and we append in a buffer\n",
"* IF the actual char is ' ' we reverse the buffer and put into a new string (the solution)\n",
"* Repeat until the finished.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Code"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"class ReverseWords:\n",
"\n",
" def reverse(self, string):\n",
" if string is None:\n",
" return None\n",
" if string == ['']:\n",
" return ['']\n",
" buff_w = [] # buffer for substrings\n",
" substring = [] # substring\n",
" new_string = [] # new string with reverses words\n",
" for i in range(len(string)):\n",
" if(string[i] == ' '):\n",
" for h in range(len(buff_w) - 1, -1, -1):\n",
" substring.append(buff_w[h])\n",
" for j in range(len(substring)):\n",
" new_string.append(substring[j])\n",
" substring = []\n",
" buff_w = []\n",
" else:\n",
" buff_w.append(string[i])\n",
" if(i == (len(string) - 1)):\n",
" new_string.append(' ')\n",
" for h in range(len(buff_w) - 1, -1, -1):\n",
" substring.append(buff_w[h])\n",
" for j in range(len(substring)):\n",
" new_string.append(substring[j])\n",
" return new_string\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Unit Test"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Success: test_reverse\n"
]
}
],
"source": [
"# %load test_reverse_words.py\n",
"from nose.tools import assert_equal\n",
"\n",
"\n",
"class TestReverseWords(object):\n",
"\n",
" def test_reverse(self, func):\n",
" assert_equal(func(None), None)\n",
" assert_equal(func(['']), [''])\n",
" assert_equal(func(\n",
" ['f', 'o', 'o', ' ', 'b', 'a', 'r']),\n",
" ['o', 'o', 'f', ' ', 'r', 'a', 'b'])\n",
" print('Success: test_reverse')\n",
" \n",
" \n",
"def main():\n",
" test = TestReverseWords()\n",
" reverse_string = ReverseWords()\n",
" test.test_reverse(reverse_string.reverse)\n",
"\n",
" \n",
"if __name__ == '__main__':\n",
" main()"
]
}
],
"metadata": {
"celltoolbar": "Edit Metadata",
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

View File

@ -0,0 +1,22 @@
from nose.tools import assert_equal
class TestReverseWords(object):
def test_reverse(self, func):
assert_equal(func(None), None)
assert_equal(func(['']), [''])
assert_equal(func(
['f', 'o', 'o', ' ', 'b', 'a', 'r']),
['o', 'o', 'f', ' ', 'r', 'a', 'b'])
print('Success: test_reverse')
def main():
test = TestReverseWords()
reverse_string = ReverseWords()
test.test_reverse(reverse_string.reverse)
if __name__ == '__main__':
main()