-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstring2.py
124 lines (103 loc) · 3.64 KB
/
string2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#!/usr/bin/env python3
"""
Kenzie assignment: String2
"""
# Your name, plus anyone who helped you with this assignment.
# Give credit where credit is due.
__author__ = "Sarah Beverton"
# Copyright 2010 Google Inc.
# Licensed under the Apache License, Version 2.0
# http://www.apache.org/licenses/LICENSE-2.0
# Instructions:
# Complete each of these string exercises in the same way as the
# previous String1 excercises.
# D. verbing
# Given a string, if its length is at least 3, add 'ing' to its
# end unless it already ends in 'ing', in which case add 'ly'
# instead.
# If the string length is less than 3, leave it unchanged.
# Return the resulting string.
def verbing(s):
if len(s) >= 3:
if s[-3:] == "ing":
return s + "ly"
else:
return s + "ing"
else:
return s
# E. not_bad
# Given a string, find the first occurrence of the substrings
# 'not' and 'bad'. If the 'bad' follows the 'not', replace
# the whole 'not'...'bad' substring with 'good'.
# Return the resulting string.
# Example:
# 'This dinner is not that bad!' -> 'This dinner is good!'
def not_bad(s):
index_not = s.find("not")
index_bad = s.find("bad")
if index_bad > index_not:
return s.replace(s[index_not:index_bad+3], "good")
else:
return s
# F. front_back
# Consider dividing a string into two halves.
# If the length is even, the front and back halves are the same
# length. If the length is odd, we'll say that the extra
# character goes in the front half.
# e.g. 'abcde', the front half is 'abc', the back half 'de'.
# Given 2 strings, a and b, return a string of the form:
# a-front + b-front + a-back + b-back
def front_back(a, b):
if len(a) % 2 == 0:
a_front = a[:len(a)//2]
a_back = a[-(len(a)//2):]
if len(b) % 2 == 0:
b_front = b[:len(b)//2]
b_back = b[-(len(b)//2):]
else:
b_front = b[:(len(b)//2)+1]
b_back = b[-(len(b)//2):]
return a_front + b_front + a_back + b_back
else:
a_front = a[:(len(a)//2)+1]
a_back = a[-(len(a)//2):]
if len(b) % 2 == 0:
b_front = b[:len(b)//2]
b_back = b[-(len(b)//2):]
else:
b_front = b[:(len(b)//2)+1]
b_back = b[-(len(b)//2):]
return a_front + b_front + a_back + b_back
# Provided simple test() function used in main() to print
# what each function returns vs. what it's supposed to return.
def test(got, expected):
if got == expected:
prefix = ' OK '
else:
prefix = ' X '
print('{} got: {} expected: {}'.format(
prefix,
repr(got),
repr(expected)))
# The main() function calls the above functions with interesting
# inputs, using test() to check whether each result is correct or not.
def main():
# Each line calls one of the functions above and compares its
# result to the expected return value for that call.
print('verbing')
test(verbing('hail'), 'hailing')
test(verbing('swimming'), 'swimmingly')
test(verbing('do'), 'do')
print('\nnot_bad')
test(not_bad('This movie is not so bad'), 'This movie is good')
test(not_bad('This dinner is not that bad!'), 'This dinner is good!')
test(not_bad('This tea is not hot'), 'This tea is not hot')
test(not_bad("It's bad yet not"), "It's bad yet not")
print('\nfront_back')
test(front_back('abcd', 'xy'), 'abxcdy')
test(front_back('abcde', 'xyz'), 'abcxydez')
test(front_back('Kitten', 'Donut'), 'KitDontenut')
# Standard boilerplate (python idiom) to call the main() function.
# This is called an "import guard".
if __name__ == '__main__':
main()