Skip to content

Commit 763dc2a

Browse files
committed
better solutions
1 parent d3bf3cf commit 763dc2a

File tree

12 files changed

+93
-218
lines changed

12 files changed

+93
-218
lines changed

article/test.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
#!/usr/bin/env python3
22
"""tests for article.py"""
33

4-
import re
54
import os
65
from subprocess import getstatusoutput, getoutput
76

87
prg = './article.py'
98
consonant_words = [
10-
'bear', 'cow', 'deer', 'frog', 'giraffe', 'horse', 'jackyl', 'kestrel',
9+
'bear', 'cow', 'dragon', 'frog', 'giraffe', 'horse', 'jackyl', 'kestrel',
1110
'lion', 'marmot', 'nutria', 'porpoise', 'quark', 'rooster', 'sturgeon',
12-
'turtle', 'vermin', 'walrus', 'xray', 'yoosy', 'zebra'
11+
'turtle', 'vermin', 'walrus', 'xolo', 'yak', 'zebra'
1312
]
14-
vowel_words = ['appaloosa', 'elephant', 'ingot', 'octopus', 'unicorn']
13+
vowel_words = ['appaloosa', 'elephant', 'ingot', 'octopus', 'ungulate']
1514

1615

1716
# --------------------------------------------------
@@ -28,7 +27,7 @@ def test_usage():
2827
for flag in ['-h', '--help']:
2928
rv, out = getstatusoutput('{} {}'.format(prg, flag))
3029
assert rv == 0
31-
assert re.match("usage", out, re.IGNORECASE)
30+
assert out.lower().startswith('usage')
3231

3332

3433
# --------------------------------------------------

bin/new.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def main():
8181
email=args.email,
8282
purpose=args.purpose,
8383
date=str(date.today()))
84-
text = simple() if args.simple else body()
84+
text = simple() if args.simple else body(args.purpose)
8585

8686
out_fh = open(program, 'w')
8787
out_fh.write(header + text)
@@ -130,8 +130,8 @@ def main():
130130

131131

132132
# --------------------------------------------------
133-
def body():
134-
return """
133+
def body(purpose):
134+
text = """
135135
import argparse
136136
import os
137137
import sys
@@ -142,7 +142,7 @@ def get_args():
142142
\"\"\"Get command-line arguments\"\"\"
143143
144144
parser = argparse.ArgumentParser(
145-
description='Argparse Python script',
145+
description='{}',
146146
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
147147
148148
parser.add_argument('positional',
@@ -189,17 +189,18 @@ def main():
189189
flag_arg = args.on
190190
pos_arg = args.positional
191191
192-
print('str_arg = "{}"'.format(str_arg))
193-
print('int_arg = "{}"'.format(int_arg))
194-
print('file_arg = "{}"'.format(file_arg.name))
195-
print('flag_arg = "{}"'.format(flag_arg))
196-
print('positional = "{}"'.format(pos_arg))
192+
print('str_arg = "{{}}"'.format(str_arg))
193+
print('int_arg = "{{}}"'.format(int_arg))
194+
print('file_arg = "{{}}"'.format(file_arg.name))
195+
print('flag_arg = "{{}}"'.format(flag_arg))
196+
print('positional = "{{}}"'.format(pos_arg))
197197
198198
199199
# --------------------------------------------------
200200
if __name__ == '__main__':
201201
main()
202202
"""
203+
return text.format(purpose)
203204

204205
# --------------------------------------------------
205206
def get_defaults():

bottles_of_beer/Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,6 @@
22

33
test:
44
pytest -xv test.py
5+
6+
sums:
7+
./mk-sums.sh > sums.txt
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,12 @@ def verse(bottle):
3434
next_bottle = bottle - 1
3535
s1 = '' if bottle == 1 else 's'
3636
s2 = '' if next_bottle == 1 else 's'
37+
num_next = 'No more' if next_bottle == 0 else next_bottle
3738
return '\n'.join([
3839
f'{bottle} bottle{s1} of beer on the wall,',
3940
f'{bottle} bottle{s1} of beer,',
4041
f'Take one down, pass it around,',
41-
f'{next_bottle} bottle{s2} of beer on the wall!',
42+
f'{num_next} bottle{s2} of beer on the wall!',
4243
])
4344

4445

bottles_of_beer/mk-sums.sh

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#!/usr/bin/env bash
2+
3+
PRG='./bottles.py'
4+
5+
if [[ ! -f "$PRG" ]]; then
6+
echo "Missing \"$PRG\""
7+
exit 1
8+
fi
9+
10+
for i in $(seq 1 5); do
11+
printf "%s\t%s\n" $i $($PRG -n $i | md5)
12+
done

bottles_of_beer/sums.txt

Lines changed: 5 additions & 200 deletions
Original file line numberDiff line numberDiff line change
@@ -1,200 +1,5 @@
1-
1 400f5b20fa60254d205090b4ef91bdbe
2-
2 a496bb46c8a639fdcd85ef8ad0f7d174
3-
3 181f40d60c8f71302f476664bf62059c
4-
4 83b94afd1e24fc63da5bd81106e14b94
5-
5 0b15f0f6a149084362c749ebe7a83aed
6-
6 275cfd9d5ff8d8deb58e5ba685133155
7-
7 a3b9e8af4465f05eafd3bd4aa0e4952a
8-
8 c9950e8da07ec46904b15b7d63272abd
9-
9 19ecc219b04d069d0349189169eb549b
10-
10 a85e3303e7763292fa91d8662fbb87e1
11-
11 b3552e26c708ee0ff07e6c2149bb852a
12-
12 523726405a7f6b41df5aac964e5388a0
13-
13 17e207498fad9a48618f791f25ed2e81
14-
14 c7006207ce7bbb88dde5b3cb28c25fff
15-
15 06afbf1ed843bedb1008fb11e7895486
16-
16 1a5be45a2478aed9e24a3802ae739118
17-
17 b934d5caf18dbecdbfec2bebf6ec8afc
18-
18 aec6b78c63821f0829296528de474531
19-
19 0fe72517a212e2aa4dd64fc5a0baf492
20-
20 4d3dcaaa936515a1d0924151d5cf12b8
21-
21 1fb86a40173752980cd8635152ef75c2
22-
22 a8e41553b7c4141014579985c1bd2204
23-
23 c5fb8a3cffdb662da6c95d6d8b6b6d74
24-
24 6404f8aa2b61816ea1d9967a32523935
25-
25 672c0d4b1d0735ec8e81820d069c4ffc
26-
26 e29b2606d9e86313b27f44d62e890616
27-
27 6ffbacce9cf57249cb6f7a0a4d7977bc
28-
28 fcfaeb14deece8ac20e71210bebca236
29-
29 bfc4a87bb4bd77799a5a7db803df9705
30-
30 102e8b25951e01d4ad684b7bd08fe6bb
31-
31 221ef70535fc22d538d3fcbba28e158e
32-
32 47340fec781178242ea2c63003300695
33-
33 925aea5d952e39805f2b7f9542a1b942
34-
34 bfc6339869dbea9405de8f9c4241f059
35-
35 ddcec3890a162e10b52a0a698992cec5
36-
36 d907127bbaf843f998366e722b45ffdf
37-
37 a149936782ad03d7cf2ed6ec0c4616ac
38-
38 70a1d3a5d2e9c9e71bbed071bba0ae7f
39-
39 0dad5acf3712488b82182118f1e1e589
40-
40 1865da6fcf872858f532c282953d1fb6
41-
41 cb5e3e3d7d4a4943144334af0bf5c11a
42-
42 65af4dec8a4fd5d073b11a56c39a9997
43-
43 75c0c622187f313c62e7ec3137287efe
44-
44 a46925ac853d69cd830d7eb6c916dc0f
45-
45 c9b967008ba68b6bdc59993836383df0
46-
46 d2af6f343c3304c248f0aa7ba4416d2c
47-
47 979d7b07231867497b82b0777ce44827
48-
48 496ea9d2a0663c12a17b68a7bd222266
49-
49 d9b1da8df5e19f3a151524add1468967
50-
50 1745fa1cf703a21f935c94385e8b13f0
51-
51 fd6e698f58d262afaa0195d362de440e
52-
52 0cd7ac7f95c613ccd9ac6f142a9ac73c
53-
53 3a2c56f8c50ab68ee430a9242b0aca34
54-
54 58d08c54de4debd53f94094e5e89fa54
55-
55 79a50b522a453046ee725038a49cacc2
56-
56 84f83b87719521d4555a150d50570ab1
57-
57 9a6e51984389aff7242cbf1a1b0668e4
58-
58 a020de9ef97a44aebdf5dc6f25a71b10
59-
59 4c42e6bf5ccbde2b0a7bb2fcbc97f5a8
60-
60 d17d826e60f046cb699a99a91a603c1d
61-
61 e2c8bf97f03f5f4052dc8418b1159ae5
62-
62 c51464b5f8c808a68bb00538e42b4c2c
63-
63 03c4d36a389d66ae476240b39cefb360
64-
64 cd056e4fb2b97323631d1908fb6188b5
65-
65 91dd82a3b9ffa6399527cc0de73cc223
66-
66 8348fbfd0e48d51169de30e2dcca59ad
67-
67 1b53bbbb8dce939bf496cac5b641efdb
68-
68 84f55ce16ec32185f971b2a55f79c287
69-
69 2037eef9bca6000482c79be961fbb167
70-
70 e806faf07003a2f997127f9f7cc8d938
71-
71 37024d12dc4587fec5fff8d56ff72ce1
72-
72 782a39739e3b9ed062c204bbb3a96540
73-
73 77fd52187cdaffdaf026d5bfd40eeb9b
74-
74 3567993b0fa70533eea9cfec15c124b6
75-
75 31897d7a839a05cb2f1e9d4d64732a6b
76-
76 d471773ecd8a50e130fecabcf7f7ba10
77-
77 29584f9b3aee9f093b9370ddf0b23f28
78-
78 5e851e137f8c95f61445b4cea3b6dc4b
79-
79 150b3d638d01471e9bd5bf7c9ae31f37
80-
80 8ac684a5e8703a96c9d4268967f8b9e1
81-
81 a4c11825ab91b370a985b9c6a34f94ae
82-
82 779c256b1557c906b425169fe07fec30
83-
83 6d4cd5244f7d9eb75892028bca1bccb5
84-
84 59e0322b51a5e8d64e6f1dee29e33758
85-
85 02761b476f08d4731433b41c3368e6f7
86-
86 6a2fdf62e020c3e75d944d53038ef143
87-
87 1d0f69a66db56767ea3991572668d8dd
88-
88 634ae0dbfca2d3b176fff9894b538e27
89-
89 fa43406641baa5232d67bf873b4a5e52
90-
90 8c6e7856ff7b8a35d8a6288ce8745f34
91-
91 45ea45cad3515647f9dee42bbd954384
92-
92 c962b1ab666fe2d7ef84fec8110cc285
93-
93 fe582fd1d07ea727dfbbbdfb59324df4
94-
94 b64321181a28610e5f1c25e6ee328af5
95-
95 5a322ff931603b3eeb2ba73e011f98ca
96-
96 7189627d078d4e9ddd9dd42d7f6b3c8d
97-
97 4134f9af472cc6b10e3bb0d00ecebb21
98-
98 c6224ce94c7fd62df8e0e30c6f6de362
99-
99 cbfa27edb514dc1dd1434ab00a2e1313
100-
100 4136f3ca8694ccfa66edd79013e5cdff
101-
1 81b7404501ba0661955ef3d260c78fb3
102-
2 053b764707c66b8b8a2bead8f5ad0c34
103-
3 ff6ed91ea757c0cb0aac3dc0c7ef69b9
104-
4 eee654f77f7a8941fc19bdbc6daecd2d
105-
5 0f691d36b53efac374c8365c5c576503
106-
6 a6e192406819c075828e34ef781219db
107-
7 5fc94b0516a7943a534717b95ac8ce23
108-
8 ec2e3bbcf68b2c7afb2a14eca2fdf74a
109-
9 3a709e8dfb31fdca089379db362c9d7a
110-
10 c0a1430fed729832fcd87c1608a7b763
111-
11 ee7765f4ce4aad8bb851065d80c7ddd0
112-
12 86b5ea5dcc58c0b4e93b489fedfdc108
113-
13 3c6dc613c34c0d30f176702b1d4d8427
114-
14 5c66da50b3e6ae586529094c95efb175
115-
15 d17f301b48e95a30d8155827d993892a
116-
16 f875670f9af770d0a7c7836f94f0c9f2
117-
17 64727ddf8febba37763b0cdff04a1170
118-
18 d6d3c1be37d1c8e048d71322189522d0
119-
19 e3f1102829655fd3e3b3df366e3832bd
120-
20 dd41a7e0a0a5ab435735791e96f528d0
121-
21 1c75c9ebec65f54b8f3ab76071b50608
122-
22 c1d3b57e443369f732918c00a8a0210b
123-
23 a8cb88124c5856d373ee7c9590677451
124-
24 ac40901f656247b1c7ef4f613a578120
125-
25 3f9a45dde88d4ffcbfd14024c5ff1a6e
126-
26 f40eb955dd0f0ff10eb32fa197c42759
127-
27 c73ae9a1d087d31ee06777f0e22e4cf2
128-
28 bbfd10f4725a1b989752d6223becd7eb
129-
29 5c4c119721bba3244220ab98d89c42fc
130-
30 ae8c35bf9686243e43d3ddfbf22b2230
131-
31 2ea3604cb604700b4c32558cf7b51dc6
132-
32 9088d1b98ef5ff2544e638b3043b1fc5
133-
33 1a8b8f485a25d4aeeacbe1aadad1df17
134-
34 35709a7c26372f2324706d81c86d3519
135-
35 0d4110575e6e717f961235342096dfb6
136-
36 32eb910cfab69820fd08e76cee9b15b5
137-
37 31b6f80baa624aadc588ac365f77fe68
138-
38 24d9eaa0b190d69b543289f8cbe4d2e4
139-
39 12d5960f2442def8c2daa3fa91c96675
140-
40 071dffac6eebfe528baa1aec17b905be
141-
41 56ce26c3ee3237fa27cd0ef5ed4d0bdc
142-
42 0fa6187e511274db8817fa30049a978d
143-
43 7f011a83332e706d7851adc614457ad9
144-
44 0546d326400f70a729b1f35bdd032f05
145-
45 dc466cef3e9b5e6410d2eadcdd0778a8
146-
46 addfe04c97ef72484da2ee16fb485543
147-
47 7fe33cb9daa82e3e5355b9957f52b371
148-
48 e2434fa971f98c660d0e85a589565528
149-
49 fc0782a4bbee8a144dd5b5204c354c1a
150-
50 23f1330f5214f68c036bff0deaacd31c
151-
51 c3f36d26a4a5588cc01620b4ed5e4b35
152-
52 e731f7dc30bd0c2dcd869dd2164f159f
153-
53 4f077105d9ab9a803aaf1ed0c6d93dda
154-
54 aa9cb0734dded8d3c7f8007cf570a974
155-
55 06dce0a215e6cb11911a87b0c8dcc663
156-
56 a6c2c4e99643c95597a30107e19493d0
157-
57 31278a0787d5f07283e4d7bbb8b7d99e
158-
58 65763f8a0429fed69635d627f5a5d091
159-
59 550446a44f8361d30bb30dcc18ec4a00
160-
60 9240420090549805e98f32518decf4da
161-
61 1f162a9429a620d55c0edea7bafa81f1
162-
62 1129eb8c6599f588fefd8e4341277ba5
163-
63 540256a45dacad58b7341119ca25952e
164-
64 21ce1f1a4ac0b49cec6f6f94a0e22f56
165-
65 852e65143d6d43055df0853e044242dd
166-
66 fad03b6d01cb354df96ba451691472f6
167-
67 1860af56c4c08f5c6b8d2f17aecf70e7
168-
68 99408988ebf151cbf3873d5ec6c6d929
169-
69 b1c47c0c4d3485967beecad5d6f4e61d
170-
70 35b73f9c3c9b555531d24652adaf21a5
171-
71 033e8693c3ee7461b577fcd3bb5cbf17
172-
72 3c5ffc34699ebe85ddb039e3491f10f6
173-
73 834b8e2942d48548f99c069136946131
174-
74 8f76862ce982835d2fc3e2899d0697fd
175-
75 8c94ada9645c1d7ff3912f8a77e8d296
176-
76 dab92a7596cba501b5ecfaeb312c0c47
177-
77 6d6809a2ef36ae80b6a8d8a027da9865
178-
78 8f5a0d3e55fb99f2048a0f5e498eb6f5
179-
79 c407229777d335355d8502a2e9d2282f
180-
80 45cbe9b3c7e48b86839cb3fb32e6302a
181-
81 d08b1e4951beb085c678c314287954a0
182-
82 cec67c4f7da778693428de4dcd8f56b2
183-
83 b7beeb7156c42bb86216afdff7221595
184-
84 6dd20cecf4ff7c48914608c757a52e84
185-
85 64436fbef9e670ef3e1f06a9f9e5d53e
186-
86 1f262f68657d04c5c1de39fab376fee9
187-
87 77788b55281d6c9bf7a682fd3ea0afd0
188-
88 0fda7ff059a184076834345d942bed55
189-
89 6d5a9e055de3561756a8a0e4349afec1
190-
90 150d8f1c61ae7eb9ff547671753ed7ed
191-
91 f96a7e3753c04d7f604458635499d5e1
192-
92 beaa7cbd0d7f4b96d921e7b1f80f3174
193-
93 e3d2381cd0aa2a61aa63740b8735662f
194-
94 17c57d7d373d348fb7f4d544614299f5
195-
95 3a4241f751fce81b42321e3e481a4e26
196-
96 a9974051f884d80b47293f36a827f973
197-
97 8ce2ea52277da6d2b2eec61818f0bf05
198-
98 8e914eb03ea11c9f309341de0abf67ac
199-
99 1d26c07c3212c502d131c38cead7d020
200-
100 71fd6277e569c6c9e1f4e56d6b10ee08
1+
1 e5a9180dbf116634031d3e6ba3054c38
2+
2 01b5e85d0b044b3498a2922751631e02
3+
3 c4b6bc58616c6e0e6d33b817a528539b
4+
4 ec0681aacccd41959573e0746194f204
5+
5 65af93070aac7346b814e1e2c9b050e6

bottles_of_beer/test.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def test_one():
6161
expected = ('1 bottle of beer on the wall,\n'
6262
'1 bottle of beer,\n'
6363
'Take one down, pass it around,\n'
64-
'0 bottles of beer on the wall!')
64+
'No more bottles of beer on the wall!')
6565

6666
rv, out = getstatusoutput('{} --num 1'.format(prg))
6767
assert rv == 0
@@ -79,7 +79,7 @@ def test_two():
7979
'1 bottle of beer on the wall,\n'
8080
'1 bottle of beer,\n'
8181
'Take one down, pass it around,\n'
82-
'0 bottles of beer on the wall!')
82+
'No more bottles of beer on the wall!')
8383

8484
rv, out = getstatusoutput('{} -n 2'.format(prg))
8585
assert rv == 0

circle/circle_area.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#!/usr/bin/env python3
2+
"""Calculate area of a circle"""
3+
4+
import argparse
5+
import os
6+
import sys
7+
from math import pi
8+
9+
10+
# --------------------------------------------------
11+
def get_args():
12+
"""Get command-line arguments"""
13+
14+
parser = argparse.ArgumentParser(
15+
description='Argparse Python script',
16+
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
17+
18+
parser.add_argument('-r',
19+
'--radius',
20+
help='Circle radius',
21+
metavar='float',
22+
type=float,
23+
default=0.)
24+
25+
parser.add_argument('-d',
26+
'--diameter',
27+
help='Circle diameter',
28+
metavar='float',
29+
type=float,
30+
default=0.)
31+
32+
args = parser.parse_args()
33+
34+
if all(map(lambda v: not v, [args.radius, args.diameter])) or all(
35+
[args.radius, args.diameter]):
36+
parser.error('Must choose one of --radius or --diameter')
37+
38+
return args
39+
40+
41+
# --------------------------------------------------
42+
def main():
43+
"""Make a jazz noise here"""
44+
45+
args = get_args()
46+
radius = args.radius or args.diameter / 2
47+
print(f'Area = {2 * pi * radius}')
48+
49+
50+
# --------------------------------------------------
51+
if __name__ == '__main__':
52+
main()

family_tree/joanie.txt.gv.pdf

10.2 KB
Binary file not shown.

0 commit comments

Comments
 (0)