From 5d194c6cc3306d0688f814ec0b57743842ed9856 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Sat, 7 Mar 2020 08:33:02 -0700 Subject: [PATCH 01/98] shuffling --- 21_tictactoe/solution1.py | 28 +++--- 21_tictactoe/solution2.py | 28 +++--- 21_tictactoe/test.py | 85 +++++++++++-------- 21_tictactoe/unit.py | 28 +++--- {21_tictactoe => 22_itictactoe}/typehints.py | 0 {21_tictactoe => 22_itictactoe}/typehints2.py | 0 6 files changed, 90 insertions(+), 79 deletions(-) rename {21_tictactoe => 22_itictactoe}/typehints.py (100%) rename {21_tictactoe => 22_itictactoe}/typehints2.py (100%) diff --git a/21_tictactoe/solution1.py b/21_tictactoe/solution1.py index e174f01f6..61865350a 100755 --- a/21_tictactoe/solution1.py +++ b/21_tictactoe/solution1.py @@ -13,9 +13,9 @@ def get_args(): description='Tic-Tac-Toe', formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument('-s', - '--state', - help='Board state', + parser.add_argument('-b', + '--board', + help='The state of the board', metavar='str', type=str, default='.' * 9) @@ -41,10 +41,10 @@ def get_args(): if any([args.player, args.cell]) and not all([args.player, args.cell]): parser.error('Must provide both --player and --cell') - if not re.search('^[.XO]{9}$', args.state): - parser.error(f'--state "{args.state}" must be 9 characters of ., X, O') + if not re.search('^[.XO]{9}$', args.board): + parser.error(f'--board "{args.board}" must be 9 characters of ., X, O') - if args.player and args.cell and args.state[args.cell - 1] in 'XO': + if args.player and args.cell and args.board[args.cell - 1] in 'XO': parser.error(f'--cell "{args.cell}" already taken') return args @@ -55,23 +55,23 @@ def main(): """Make a jazz noise here""" args = get_args() - state = list(args.state) + board = list(args.board) player = args.player cell = args.cell if player and cell: - state[cell - 1] = player + board[cell - 1] = player - print(format_board(state)) - winner = find_winner(state) + print(format_board(board)) + winner = find_winner(board) print(f'{winner} has won!' if winner else 'No winner.') # -------------------------------------------------- -def format_board(state): +def format_board(board): """Format the board""" - cells = [str(i) if c == '.' else c for i, c in enumerate(state, 1)] + cells = [str(i) if c == '.' else c for i, c in enumerate(board, start=1)] bar = '-------------' cells_tmpl = '| {} | {} | {} |' return '\n'.join([ @@ -83,7 +83,7 @@ def format_board(state): # -------------------------------------------------- -def find_winner(state): +def find_winner(board): """Return the winner""" winning = [[0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], @@ -91,7 +91,7 @@ def find_winner(state): for player in ['X', 'O']: for i, j, k in winning: - combo = [state[i], state[j], state[k]] + combo = [board[i], board[j], board[k]] if combo == [player, player, player]: return player diff --git a/21_tictactoe/solution2.py b/21_tictactoe/solution2.py index db8cd3e21..b9c913f89 100755 --- a/21_tictactoe/solution2.py +++ b/21_tictactoe/solution2.py @@ -13,9 +13,9 @@ def get_args(): description='Tic-Tac-Toe', formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument('-s', - '--state', - help='Board state', + parser.add_argument('-b', + '--board', + help='The state of the board', metavar='str', type=str, default='.' * 9) @@ -41,10 +41,10 @@ def get_args(): if any([args.player, args.cell]) and not all([args.player, args.cell]): parser.error('Must provide both --player and --cell') - if not re.search('^[.XO]{9}$', args.state): - parser.error(f'--state "{args.state}" must be 9 characters of ., X, O') + if not re.search('^[.XO]{9}$', args.board): + parser.error(f'--board "{args.board}" must be 9 characters of ., X, O') - if args.player and args.cell and args.state[args.cell - 1] in 'XO': + if args.player and args.cell and args.board[args.cell - 1] in 'XO': parser.error(f'--cell "{args.cell}" already taken') return args @@ -55,24 +55,24 @@ def main(): """Make a jazz noise here""" args = get_args() - state = list(args.state) + board = list(args.board) player = args.player cell = args.cell if player and cell: - state[cell - 1] = player + board[cell - 1] = player - print(format_board(state)) - winner = find_winner(state) + print(format_board(board)) + winner = find_winner(board) print(f'{winner} has won!' if winner else 'No winner.') # -------------------------------------------------- -def format_board(state): +def format_board(board): """Format the board""" cells = [] - for i, char in enumerate(state, start=1): + for i, char in enumerate(board, start=1): cells.append(str(i) if char == '.' else char) bar = '-------------' @@ -86,14 +86,14 @@ def format_board(state): # -------------------------------------------------- -def find_winner(state): +def find_winner(board): """Return the winner""" winning = [[0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6]] for combo in winning: - group = list(map(lambda i: state[i], combo)) + group = list(map(lambda i: board[i], combo)) for player in ['X', 'O']: if all(x == player for x in group): return player diff --git a/21_tictactoe/test.py b/21_tictactoe/test.py index 2afccb5e0..b86ddae7d 100755 --- a/21_tictactoe/test.py +++ b/21_tictactoe/test.py @@ -48,13 +48,13 @@ def test_no_input(): # -------------------------------------------------- -def test_bad_state(): - """dies on bad state""" +def test_bad_board(): + """dies on bad board""" - expected = '--state "{}" must be 9 characters of ., X, O' + expected = '--board "{}" must be 9 characters of ., X, O' for bad in ['ABC', '...XXX', 'XXXOOOXX']: - rv, out = getstatusoutput(f'{prg} --state {bad}') + rv, out = getstatusoutput(f'{prg} --board {bad}') print(out) assert rv != 0 assert re.search(expected.format(bad), out) @@ -104,10 +104,10 @@ def test_both_player_and_cell(): # -------------------------------------------------- -def test_good_state(): +def test_good_board_01(): """makes board on good input""" - board1 = """ + board = """ ------------- | 1 | 2 | 3 | ------------- @@ -118,11 +118,17 @@ def test_good_state(): No winner. """.strip() - rv1, out1 = getstatusoutput(f'{prg} -s .........') - assert rv1 == 0 - assert out1.strip() == board1 + rv, out = getstatusoutput(f'{prg} -b .........') + print(f'rv = "{rv}"') + assert rv == 0 + assert out.strip() == board + + +# -------------------------------------------------- +def test_good_board_02(): + """makes board on good input""" - board2 = """ + board = """ ------------- | 1 | 2 | 3 | ------------- @@ -133,15 +139,15 @@ def test_good_state(): No winner. """.strip() - rv2, out2 = getstatusoutput(f'{prg} -s ...OXX...') - assert out2.strip() == board2 + rv, out = getstatusoutput(f'{prg} --board ...OXX...') + assert out.strip() == board # -------------------------------------------------- -def test_mutate_state(): +def test_mutate_board_01(): """mutates board on good input""" - board1 = """ + board = """ ------------- | X | 2 | 3 | ------------- @@ -152,11 +158,16 @@ def test_mutate_state(): No winner. """.strip() - rv1, out1 = getstatusoutput(f'{prg} -s ......... --player X -c 1') - assert rv1 == 0 - assert out1.strip() == board1 + rv, out = getstatusoutput(f'{prg} -b ......... --player X -c 1') + assert rv == 0 + assert out.strip() == board + - board2 = """ +# -------------------------------------------------- +def test_mutate_board_02(): + """mutates board on good input""" + + board = """ ------------- | X | X | O | ------------- @@ -167,27 +178,27 @@ def test_mutate_state(): O has won! """.strip() - rv2, out2 = getstatusoutput(f'{prg} --state XXO...OOX --p O -c 5') - assert rv2 == 0 - assert out2.strip() == board2 + rv, out = getstatusoutput(f'{prg} --board XXO...OOX --p O -c 5') + assert rv == 0 + assert out.strip() == board # -------------------------------------------------- -def test_mutate_state_taken(): +def test_mutate_cell_taken(): """test for a cell already taken""" - rv1, out1 = getstatusoutput(f'{prg} -s XXO...OOX --player X --cell 9') + rv1, out1 = getstatusoutput(f'{prg} -b XXO...OOX --player X --cell 9') assert rv1 != 0 assert re.search('--cell "9" already taken', out1) - rv2, out2 = getstatusoutput(f'{prg} --state XXO...OOX --p O -c 1') + rv2, out2 = getstatusoutput(f'{prg} --board XXO...OOX --p O -c 1') assert rv2 != 0 assert re.search('--cell "1" already taken', out2) # -------------------------------------------------- def test_winning(): - """test winning states""" + """test winning boards""" wins = [('PPP......'), ('...PPP...'), ('......PPP'), ('P..P..P..'), ('.P..P..P.'), ('..P..P..P'), ('P...P...P'), ('..P.P.P..')] @@ -195,25 +206,25 @@ def test_winning(): for player in 'XO': other_player = 'O' if player == 'X' else 'X' - for state in wins: - state = state.replace('P', player) - dots = [i for i in range(len(state)) if state[i] == '.'] + for board in wins: + board = board.replace('P', player) + dots = [i for i in range(len(board)) if board[i] == '.'] mut = random.sample(dots, k=2) - test_state = ''.join([ - other_player if i in mut else state[i] - for i in range(len(state)) + test_board = ''.join([ + other_player if i in mut else board[i] + for i in range(len(board)) ]) - out = getoutput(f'{prg} -s {test_state}').splitlines() + out = getoutput(f'{prg} -b {test_board}').splitlines() assert out[-1].strip() == f'{player} has won!' # -------------------------------------------------- def test_losing(): - """test losing states""" + """test losing boards""" - losing_state = list('XXOO.....') + losing_board = list('XXOO.....') for i in range(10): - random.shuffle(losing_state) - print(f'{prg} {" ".join(losing_state)}') - out = getoutput(f'{prg} -s {"".join(losing_state)}').splitlines() + random.shuffle(losing_board) + print(f'{prg} {" ".join(losing_board)}') + out = getoutput(f'{prg} -b {"".join(losing_board)}').splitlines() assert out[-1].strip() == 'No winner.' diff --git a/21_tictactoe/unit.py b/21_tictactoe/unit.py index efec6e5d2..58bc16d60 100755 --- a/21_tictactoe/unit.py +++ b/21_tictactoe/unit.py @@ -3,7 +3,7 @@ # -------------------------------------------------- -def test_board_no_state(): +def test_board_no_board(): """makes default board""" board = """ @@ -20,7 +20,7 @@ def test_board_no_state(): # -------------------------------------------------- -def test_board_with_state(): +def test_board_with_board(): """makes board""" board = """ @@ -38,7 +38,7 @@ def test_board_with_state(): # -------------------------------------------------- def test_winning(): - """test winning states""" + """test winning boards""" wins = [('PPP......'), ('...PPP...'), ('......PPP'), ('P..P..P..'), ('.P..P..P.'), ('..P..P..P'), ('P...P...P'), ('..P.P.P..')] @@ -46,23 +46,23 @@ def test_winning(): for player in 'XO': other_player = 'O' if player == 'X' else 'X' - for state in wins: - state = state.replace('P', player) - dots = [i for i in range(len(state)) if state[i] == '.'] + for board in wins: + board = board.replace('P', player) + dots = [i for i in range(len(board)) if board[i] == '.'] mut = random.sample(dots, k=2) - test_state = ''.join([ - other_player if i in mut else state[i] - for i in range(len(state)) + test_board = ''.join([ + other_player if i in mut else board[i] + for i in range(len(board)) ]) - assert find_winner(test_state) == player + assert find_winner(test_board) == player # -------------------------------------------------- def test_losing(): - """test losing states""" + """test losing boards""" - losing_state = list('XXOO.....') + losing_board = list('XXOO.....') for i in range(10): - random.shuffle(losing_state) - assert find_winner(''.join(losing_state)) == None + random.shuffle(losing_board) + assert find_winner(''.join(losing_board)) == None diff --git a/21_tictactoe/typehints.py b/22_itictactoe/typehints.py similarity index 100% rename from 21_tictactoe/typehints.py rename to 22_itictactoe/typehints.py diff --git a/21_tictactoe/typehints2.py b/22_itictactoe/typehints2.py similarity index 100% rename from 21_tictactoe/typehints2.py rename to 22_itictactoe/typehints2.py From 547c168502c9d1ab18b256b6cb68925cc29b4c68 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Wed, 18 Mar 2020 09:07:22 -0700 Subject: [PATCH 02/98] new extra --- .gitignore | 1 + extra/08_rna/Makefile | 10 +++ extra/08_rna/README.adoc | 136 +++++++++++++++++++++++++++++++++ extra/08_rna/README.pdf | Bin 0 -> 72636 bytes extra/08_rna/inputs/input1.txt | 1 + extra/08_rna/inputs/input2.txt | 2 + extra/08_rna/test.py | 130 +++++++++++++++++++++++++++++++ 7 files changed, 280 insertions(+) create mode 100644 extra/08_rna/Makefile create mode 100644 extra/08_rna/README.adoc create mode 100644 extra/08_rna/README.pdf create mode 100644 extra/08_rna/inputs/input1.txt create mode 100644 extra/08_rna/inputs/input2.txt create mode 100755 extra/08_rna/test.py diff --git a/.gitignore b/.gitignore index 1fd639385..35db47f33 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ tex2pdf* .log .coverage .idea +.vscode diff --git a/extra/08_rna/Makefile b/extra/08_rna/Makefile new file mode 100644 index 000000000..9b869126b --- /dev/null +++ b/extra/08_rna/Makefile @@ -0,0 +1,10 @@ +.PHONY: test pdf clean + +pdf: + asciidoctor-pdf README.adoc + +test: + pytest -xv test.py + +clean: + rm -rf __pycache__ diff --git a/extra/08_rna/README.adoc b/extra/08_rna/README.adoc new file mode 100644 index 000000000..73ebe590d --- /dev/null +++ b/extra/08_rna/README.adoc @@ -0,0 +1,136 @@ +# Transcribing DNA into RNA + +For this exercise, we'll be applying what we learned about modifying strings to a variation on this Rosalind exercise that transcribes DNA into RNA: + +http://rosalind.info/problems/rna/ + +You will write a Python program called `transcribe.py` that will accept: + +* One or more positional arguments which must be readable files +* An optional `-o` or `--outdir` argument that names an output directory (default `'out'`) + +You can use the `os.path.isdir` to check if the output directory exists. +It works just like the `os.path.isfile` function we've used that will return `True` or `False` if a given string names an existing file, only this checks for a directory. +Here assuming that "blargh" does not exist on your system: + +---- +>>> import os +>>> os.path.isdir('blargh') +False +---- + +If the directory does not exist, you should use the `os.makedirs` function to create it. +Here is a bit of code you can put into your program: + +---- +if not os.path.isdir(out_dir): + os.makedirs(out_dir) +---- + +Your program will read each of the input files which will contain a single DNA sequence on each line. +The sequences will need to replace the `T` bases with `U`. +For instance, the `input1.txt` file contains a single sequence `'GATGGAACTTGACTACGTAAATT'` which will become `'GAUGGAACUUGACUACGUAAAUU'`. + +The new sequences from each input file will be written to a new output file in the `--outdir`. +The name of the file will be the "basename" of the input file which you can get by using the `os.path.basename` function. +For instance, the "basename" of `'./inputs/input1.txt'` is `'input1.txt'`: + +---- +>>> base = os.path.basename('./inputs/input1.txt') +>>> base +'input1.txt' +---- + +If the output directory is `'out'`, you can create a new path for the output file by using the `os.path.join` function with the basename of the input file's basename: + +---- +>>> out_dir = 'out' +>>> os.path.join(out_dir, base) +'out/input1.txt' +---- + +If you declare your `args.file` parameter using `type=argparse.FileType('r')`, then you'll be iterating over a list of _open file handles_. +You can use the `fh.name` to get the name of the file: + +---- +for fh in args.file: + out_file = os.path.join(out_dir, os.path.basename(fh.name)) + out_fh = open(out_file, 'wt') +---- + +You will have two levels of iteration: + +* Each `file` argument +* Each line in each file + +You will need to `open` the output file for writing text, iterate over each line in the input file, and print the transcribed sequences to the output file. + +Your program should print a brief usage when given no arguments: + +---- +$ ./transcribe.py +usage: transcribe.py [-h] [-o DIR] FILE [FILE ...] +transcribe.py: error: the following arguments are required: FILE +---- + +And a longer usage for `-h` and `--help`: + +---- +$ ./transcribe.py -h +usage: transcribe.py [-h] [-o DIR] FILE [FILE ...] + +Transcribing DNA into RNA + +positional arguments: + FILE Input file(s) + +optional arguments: + -h, --help show this help message and exit + -o DIR, --outdir DIR Output directory (default: out) +---- + +The output from the program should summarize how many sequences and files were processed. +For example, the `input1.txt` file contains a single line/sequence, so the result should be this: + +---- +$ ./transcribe.py inputs/input1.txt +Done, wrote 1 sequence in 1 file to directory "out". +---- + +While the `input2.txt` file contains two lines/sequences: + +---- +$ ./transcribe.py inputs/input2.txt +Done, wrote 2 sequences in 1 file to directory "out". +---- + +When you process both together, it should summarize for all the inputs: + +---- +$ ./transcribe.py inputs/* +Done, wrote 3 sequences in 2 files to directory "out". +---- + +Note that you must use the correct singular/plural for both "sequence(s)" and "file(s)." + +Many elements of this program are almost identical to the `wc.py` program, so I would recommend you revisit that. + +A passing test suite looks like this: + +---- +$ make test +pytest -xv test.py +============================= test session starts ============================== +... +collected 7 items + +test.py::test_exists PASSED [ 14%] +test.py::test_usage PASSED [ 28%] +test.py::test_no_args PASSED [ 42%] +test.py::test_bad_file PASSED [ 57%] +test.py::test_good_input1 PASSED [ 71%] +test.py::test_good_input2 PASSED [ 85%] +test.py::test_good_multiple_inputs PASSED [100%] + +============================== 7 passed in 0.36s =============================== +---- diff --git a/extra/08_rna/README.pdf b/extra/08_rna/README.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f71653e1cf415433aaff32f3f7a9ca30cf060463 GIT binary patch literal 72636 zcmeFa2Rzm7`#7GKqOH=RBPAo_>~l)WNRgG1M9MfME2~JQG^{AAq9F|lQ6VbYk&=oe z4I&av(xC9a?)Q10;~eRUp89;hzyIg^^zv}O=XGEAbzl3s-qQ>;H06m36rpJy@ShNo zphR%BUL~ZgOi(m-@N{Akq>bIJTs&;t9jqN(>#19z*nE(DSS{DZp<++A(G zY*@d0yRNIPhLtBks4VunR>#Vk zg4RaE!DF?Pm5+w24SSV5-Mv^sFpbWcAV9e*iOmF?0IZp-my0KX zETp*5!PbNGQX&m|H<5{cE#r9%h37FkEEjvvl>`zx?coVa?=0jdgfNE>a2!&3ZZYP* z8DRh>0B=UG5K`1-**aLMxq1`K5zeSgssf48Ics%y*VR8gspiCD+5YsbvAcuwPfx14 zd;avCx~q#P0O&zLa|Q?vSst!l?i`E*vDz51JPGECh`tq#S>B!mMJ;DoRW6< zq-HEcBq}K=k(C$(I-RbdM5PdnZG{vyNeW5?5}jadCuFWnrO-(#K%ojsL?)G>Oe4}* zbTW-hC()QR^uwajNlFw7g+(Efl+c(?q1lm?s3demWf{R(TWFrK5WF1L3;#hc=lqR+ zBTzYDqu*V}7_dqTbR`CjV7wNCo5D~aQ3&uV1&R_JL_ibaNiZ8K8*B}V9Ylg4vDnGV=wKMldbMimVZN2g)W zVWOwQc{>^lo`C(I19c}VG28(jcv1LUD24UM@kmxu0LZ(;BNa`E3=^}#z(y16iaa)A z*=YGkVxgir|BO_~R-H5K!OW-(2GA3gLIu&IKxYEG#Hr@T6C7H{=c+_fU{Jc5t1^uN zt3#nHk*!E}B%qis6K7!vpaF5)0bRgZz!+M8TbLEPng#1V!XUAp-vb#(_u<<7bG4 z0Bs>|NvFfE0qO!#fpI~^RhfW52AsDA?g?BH{$f7`{ttIj;0N1naGZt_I9%29>HZd? zNmK=Dce3R#Bl@SWrN9n==_BUDhteLS0eJjx>`x+zt^k_?D32F1zWqspMehX^{5lG+ z;OFoJBAE`<-u0bbb|NA)U{5{WZNE8tDn)?|Eb1R;kLHhrJ`(qcpZ-CfL}b#sd4E?- zblFtATndRLwAs)`gTL4m1h4`XvDFj|X4qt~=@3Rilqvy#0jU8SjR+gn25rV(%;|S% z45YXMNvZ34^V1lejbjqM7qI-A(kP(z!rQy7FF$_&pp+piP{<6>Pqq&H31?VE#3nH|izGU*+fFgvbM>&-OT`a9kplKOaBZ-{cxJ%2YOrQxB&jjAmO%m) z3ZUlSB|QiC7put+90^PT3ZpAcy28A8pKS*!F_VqvQ6-*n3 zSz)3K)`bEB5AH|QN}^d~yUvO$(vS{q&8u%AIf*Uce`NVUGo#TNU8s*iRA6${;a{&E zE_}Ir@Qvfr3YuXhgr^uXW-e#huCK|bswvl}MZsnh)>Op{5>Zb0dZYkpDNb5Q;* zo-o^hPUI&9K0HxCN`Z_5Uicf!_zRBGWzpz}-E{?~E2c2^fh>9&7-EPP5rtvwf$J>k zMkFJX8e<~BAi$yW=cmH8CPAzN7wA^na5QV=4M9dC@_gX?2VjF^TsDb~z!F9Z7&g}* zln5091ME@|b_8V-;)-l{3*x9mKn58z0C3+?=LRK_FeM+;W@ro^{|yPf2hjbXu? zk%hp;8vM=nl>jF|yBfnd8=qil^v1K`2DHtjfj^A@7xFDoVfkUlQk4|QRD!b*l>&6g z9Xr7oT#*#;HsM#m2FA{V*MUk!hdEneQewjO`12?X z3c3P+A3lQnF>vr9+>U%*a2tMr?dza0@P~1R*t=|SuMZWxX8?*5cgTShe-vjTyz{mZ zS}9})I6??w|FAtzbSh!(|6z!|vMYs*gcbpge!*RkQ4hQqNC+$}Dhaeg_S}_$JRMe-Sx?UT+Ih*cyZ#HhCTb?K!Bw*e&4X z zj%Xv%6zKF$QAiVDGDh{RIvMgWb$mQ98^-a;`a}- z2(eFi0v39Mt-$PsKb|8J(C===0#_D6P*Fh%obg?SrHvKJC}7LzADJS!)w%%3=|4)f9LZs28UwCM06iK3k5?VY=F!l6kh8L7$O^wjy#f>*^kb!m3|H!zvDvrrO+XQ zE3^w%!8c9jI868?4uFfmhR_rQ+i+xb1sYjSJd;OpV=T%B2mnVE_#+^Q1kXW;MLeJ5 z-0QvU`5nufXRaXl6d?S~Adq>d%P0A%6fXJxF_8!=7B3KViUMf7U4Y=jIS>H}nUrkH z5MdVK>_6ty;Q^LRCM%G^@AOX?`#U}gJ|K_{*A)m}jDgn^DLX%AM_}6)1pz?2z^D)D zr5yU>rg8LqrT--XQXnM(60=DEfKCizEQ~=Wf|Hp-hxq;9CP@l|q(J)tEM5d-u1Nq5 z<6ZpR?QiJCTqTkWE>m#s{1`@nlpR<}K9<^*EAi}?UrVB1FD!saB!k0~3Fajqlzi+2 zj9WT|NTr|@3P1rT^1JjOLrm+iA1EQ zLzwNaV-nU8R1Z**eu+uYy1AI7Qqc%ul8R#z{f2*V0^ASWUGwYJ|AoXvDv}Z?P_RP$ z5b|S^_2=G*3_&`HUq*x42hNP{_5w#PBRLJZFKA!zDHUwbCdgq}O^_{}Do!^_4cyID zi$Dq?d5x#s0N-T$ecARVvLx~Mu{FT1>JgmBlpij?{SV0dE_kCeAv*wqLwu;?-=MZX ziF5Z{Cj5eU_(7rqL;De=E_B4vw7B&2$AAF}Qer?3ByXse1Qw}McR3+osN->VSW0jf z04d<2lj~Ifky!96Ft0bJ!f>B~+}-?7`5F0jvZF5U0nnb=@qOO>F3g{gyh=zk0?+5|5ObTvx9ZHSHQZl%@C;yV* zzF63N|J!szB2?;7I6hUrh53O`Sb<^;yWo#*J0cM*4+?<~3f>jzP8Gz|d4y<=7LCx# z_C#{@RmA1^Oabohg){hK*n&3xhUAEs3(%3J_c1yamSE3 zP3{!+puU6TN4I17Di9Ti8cLoR9hHI3bFyQw0Y}WUPjyOp_LwczInTjIxO#z0e5gJH z5I7>f6GB|Xb0&a^czn?jXM z{k4_z3r@tDQi3AN-xVr}!hl*mf!BKG(Y(j3SC6k?_ zMC>sqUIa-|KUV#s;$=>i>;IEgzgPwIzpDCG)PxFRtUMblyoIznR7T9MXNC2_2AEJ} z7Z^i@u;LPZ>s2fp_D%S5lGp{(a28#l>f+++31!-lI0z5mt;|M`=SMhty^x|B6x(Bf zC=!)yS++DeJy%axBbK{^oxGZ>6CxWgYfr2!+Zc+*(NY17aHj?fRr#+*75w1UVMFWS z?%}Dv(#joNz(R^TR``HKr3xvUI@o%ygz|QLmd36oE)F)Rz8&g~(aoLp�yx0m`Xw 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

c7lXmGSqmvI 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 BD9r!> literal 0 HcmV?d00001 diff --git a/extra/08_rna/inputs/input1.txt b/extra/08_rna/inputs/input1.txt new file mode 100644 index 000000000..fa12fe70e --- /dev/null +++ b/extra/08_rna/inputs/input1.txt @@ -0,0 +1 @@ +GATGGAACTTGACTACGTAAATT diff --git a/extra/08_rna/inputs/input2.txt b/extra/08_rna/inputs/input2.txt new file mode 100644 index 000000000..682aec1c8 --- /dev/null +++ b/extra/08_rna/inputs/input2.txt @@ -0,0 +1,2 @@ +CTTAGGTCAGTGGTCTCTAAACTTTCGGTTCTGTCGTCTTCATAGGCAAATTTTTGAACCGGCAGACAAGCTAATCCCTGTGCGGTTAGCTCAAGCAACAGAATGTCCGATCTTTGAACTTCCTAACGAACCGAACCTACTATAATTACATACGAATAATGTATGGGCTAGCGTTGGCTCATCATCAAGTCTGCGGTGAAATGGGAACATATTCGCATTGCATATAGGGCGTATCTGACGATCGATTCGAGTTGGCTAGTCGTACCAAATGATTATGGGCTGGAGGGCCAATGTATACGTCAGCCAGGCTAAACCACTGGACCGCTTGCAATCCATAGGAAGTAAAATTACCCTTTTTAAACTCTCTAAGATGTGGCGTCTCGTTCTTAAGGAGTAATGAGACTGTGACAACATTGGCAAGCACAGCCTCAGTATAGCTACAGCACCGGTGCTAATAGTAAATGCAAACACCGTTTCAAGAGCCGAGCCTTTTTTTAATGCAAGGTGACTTCAGAGGGAGTAAATCGTGGCCGGGGACTGTCCAGAGCAATGCATTCCCGAGTGCGGGTACCCGTGGTGTGAGAGGAATCGATTTCGCGTGTGATACCATTAATGGTCCTGTACTACTGTCAGTCAGCTTGATTTGAAGTCGGCCGACAAGGTTGGTACATAATGGGCTTACTGGGAGCTTAGGTTAGCCTCTGGAAAACTTTAGAATTTATATGGGTGTTTCTGTGTTCGTACAGGCCCCAGTCGGGCCATCGTTGTTGAGCATAGACCGGTGTAACCTTAATTATTCACAGGCCAATCCCCGTATACGCATCTGAAAGGCACACCGCCTATTACCAATTTGCGCTTCCTTACATAGGAGGACCTGTTATCGTCTTCTCAATCGCTGAGTTACCTTAAAACTAGGATC +ACCGAGTAAAAGGCGACGGTTCGTTTCCGAACCTATTTGCTCTTATTTCTACGGGCTGCTAGTGTTGTAGGCTGCAAAACCTACGTAGTCCCATCTATCATGCTCGACCCTACGAGGCTAATGTCTTGTCAGAGGCCCGTCATGTGCCACGTACATACACCAATGTATACCGCTCTAGCGGTTTGGTGTAGTAGGACTTGTGTATGCACGCTACAGCGAACAACGTTGATCCCTAACTGAAGTCGGGCTCCGCAGGCCTACTCACGCCGTTTCTATAGGTTGAGCCGCATCAAACATTGGGTTGAGTCTCGAGTATAGAGGAAGGCTCTGGTGGCAGGCGCGACGTTGATCGGGAGGAGTATGGATGGTGATCAATCCCCGTGCCAATCGCGAGTACTACAGGAGGAGGGGGCGGCTCTGTTCAATCATCACCCGTTCCATCACACGGGCAGCACAGTTGACCTCCCGAGCCGTCTCACGGACCTAGTGGCAACAGGTGTATTGAAGCGCCGGGAATAGTCATACCCGTGGGCTTGATTGAGAGACCGAAATTCCGACCGCCAAAACTGCTGATATCGTACGCCTTACTACAAAACAAATGACGTCACTACCGGCCAGGGACAAGCTTATTAATTAAGTAGGAACCCTATACCTTGCACATCCTAAATCTAGCAGCGGGTCCAGGATTGGTTCCAGTCCAACGCGCGATGCGCGTCAAGCTAGGCGAATGACCACGGTCGAAACACCACTTATGTGACCCACCTTGGCCAACTCTCCCGATTCTCCTCGCTACTATCTTGAAGGTCACTGAGAATATCCCTTATGGGTCGCATACGGAGACAGCCGCAGGAGCCTTAACGGAGAATACGCCAATACTATGTTCTGGGTCGGTGGGTGTAATGCGATGCAATCCGATCGTGCGAACGTTCCCTTTGATGACTATAGGGTCTAGTGATCGTACATGTGC diff --git a/extra/08_rna/test.py b/extra/08_rna/test.py new file mode 100755 index 000000000..e68ce8721 --- /dev/null +++ b/extra/08_rna/test.py @@ -0,0 +1,130 @@ +#!/usr/bin/env python3 +"""tests for transcribe.py""" + +from subprocess import getstatusoutput +import os.path +import re +import string +import random +from shutil import rmtree + +prg = './transcribe.py' +input1 = './inputs/input1.txt' +input2 = './inputs/input2.txt' + + +# -------------------------------------------------- +def random_filename(): + """generate a random filename""" + + return ''.join(random.choices(string.ascii_uppercase + string.digits, k=5)) + + +# -------------------------------------------------- +def test_exists(): + """usage""" + + assert os.path.isfile(prg) + + +# -------------------------------------------------- +def test_usage(): + """usage""" + + for flag in ['-h', '--help']: + rv, out = getstatusoutput('{} {}'.format(prg, flag)) + assert rv == 0 + assert re.match("usage", out, re.IGNORECASE) + + +# -------------------------------------------------- +def test_no_args(): + """die on no args""" + + rv, out = getstatusoutput(prg) + assert rv != 0 + assert re.match("usage", out, re.IGNORECASE) + + +# -------------------------------------------------- +def test_bad_file(): + """die on missing input""" + + bad = random_filename() + rv, out = getstatusoutput(f'{prg} {bad}') + assert rv != 0 + assert re.match('usage:', out, re.I) + assert re.search(f"No such file or directory: '{bad}'", out) + + +# -------------------------------------------------- +def test_good_input1(): + """runs on good input""" + + out_dir = 'out' + try: + if os.path.isdir(out_dir): + rmtree(out_dir) + + rv, out = getstatusoutput(f'{prg} {input1}') + assert rv == 0 + assert out == 'Done, wrote 1 sequence in 1 file to directory "out".' + assert os.path.isdir(out_dir) + out_file = os.path.join(out_dir, 'input1.txt') + assert os.path.isfile(out_file) + assert open(out_file).read().rstrip() == 'GAUGGAACUUGACUACGUAAAUU' + + finally: + if os.path.isdir(out_dir): + rmtree(out_dir) + +# -------------------------------------------------- +def test_good_input2(): + """runs on good input""" + + out_dir = random_filename() + try: + if os.path.isdir(out_dir): + rmtree(out_dir) + + rv, out = getstatusoutput(f'{prg} -o {out_dir} {input2}') + assert rv == 0 + assert out == f'Done, wrote 2 sequences in 1 file to directory "{out_dir}".' + assert os.path.isdir(out_dir) + out_file = os.path.join(out_dir, 'input2.txt') + assert os.path.isfile(out_file) + assert open(out_file).read().rstrip() == output2().rstrip() + + finally: + if os.path.isdir(out_dir): + rmtree(out_dir) + +# -------------------------------------------------- +def test_good_multiple_inputs(): + """runs on good input""" + + out_dir = random_filename() + try: + if os.path.isdir(out_dir): + rmtree(out_dir) + + rv, out = getstatusoutput(f'{prg} --outdir {out_dir} {input1} {input2}') + assert rv == 0 + assert out == f'Done, wrote 3 sequences in 2 files to directory "{out_dir}".' + assert os.path.isdir(out_dir) + out_file1 = os.path.join(out_dir, 'input1.txt') + out_file2 = os.path.join(out_dir, 'input2.txt') + assert os.path.isfile(out_file1) + assert os.path.isfile(out_file2) + assert open(out_file1).read().rstrip() == 'GAUGGAACUUGACUACGUAAAUU' + assert open(out_file2).read().rstrip() == output2().rstrip() + + finally: + if os.path.isdir(out_dir): + rmtree(out_dir) + +# -------------------------------------------------- +def output2(): + return """CUUAGGUCAGUGGUCUCUAAACUUUCGGUUCUGUCGUCUUCAUAGGCAAAUUUUUGAACCGGCAGACAAGCUAAUCCCUGUGCGGUUAGCUCAAGCAACAGAAUGUCCGAUCUUUGAACUUCCUAACGAACCGAACCUACUAUAAUUACAUACGAAUAAUGUAUGGGCUAGCGUUGGCUCAUCAUCAAGUCUGCGGUGAAAUGGGAACAUAUUCGCAUUGCAUAUAGGGCGUAUCUGACGAUCGAUUCGAGUUGGCUAGUCGUACCAAAUGAUUAUGGGCUGGAGGGCCAAUGUAUACGUCAGCCAGGCUAAACCACUGGACCGCUUGCAAUCCAUAGGAAGUAAAAUUACCCUUUUUAAACUCUCUAAGAUGUGGCGUCUCGUUCUUAAGGAGUAAUGAGACUGUGACAACAUUGGCAAGCACAGCCUCAGUAUAGCUACAGCACCGGUGCUAAUAGUAAAUGCAAACACCGUUUCAAGAGCCGAGCCUUUUUUUAAUGCAAGGUGACUUCAGAGGGAGUAAAUCGUGGCCGGGGACUGUCCAGAGCAAUGCAUUCCCGAGUGCGGGUACCCGUGGUGUGAGAGGAAUCGAUUUCGCGUGUGAUACCAUUAAUGGUCCUGUACUACUGUCAGUCAGCUUGAUUUGAAGUCGGCCGACAAGGUUGGUACAUAAUGGGCUUACUGGGAGCUUAGGUUAGCCUCUGGAAAACUUUAGAAUUUAUAUGGGUGUUUCUGUGUUCGUACAGGCCCCAGUCGGGCCAUCGUUGUUGAGCAUAGACCGGUGUAACCUUAAUUAUUCACAGGCCAAUCCCCGUAUACGCAUCUGAAAGGCACACCGCCUAUUACCAAUUUGCGCUUCCUUACAUAGGAGGACCUGUUAUCGUCUUCUCAAUCGCUGAGUUACCUUAAAACUAGGAUC +ACCGAGUAAAAGGCGACGGUUCGUUUCCGAACCUAUUUGCUCUUAUUUCUACGGGCUGCUAGUGUUGUAGGCUGCAAAACCUACGUAGUCCCAUCUAUCAUGCUCGACCCUACGAGGCUAAUGUCUUGUCAGAGGCCCGUCAUGUGCCACGUACAUACACCAAUGUAUACCGCUCUAGCGGUUUGGUGUAGUAGGACUUGUGUAUGCACGCUACAGCGAACAACGUUGAUCCCUAACUGAAGUCGGGCUCCGCAGGCCUACUCACGCCGUUUCUAUAGGUUGAGCCGCAUCAAACAUUGGGUUGAGUCUCGAGUAUAGAGGAAGGCUCUGGUGGCAGGCGCGACGUUGAUCGGGAGGAGUAUGGAUGGUGAUCAAUCCCCGUGCCAAUCGCGAGUACUACAGGAGGAGGGGGCGGCUCUGUUCAAUCAUCACCCGUUCCAUCACACGGGCAGCACAGUUGACCUCCCGAGCCGUCUCACGGACCUAGUGGCAACAGGUGUAUUGAAGCGCCGGGAAUAGUCAUACCCGUGGGCUUGAUUGAGAGACCGAAAUUCCGACCGCCAAAACUGCUGAUAUCGUACGCCUUACUACAAAACAAAUGACGUCACUACCGGCCAGGGACAAGCUUAUUAAUUAAGUAGGAACCCUAUACCUUGCACAUCCUAAAUCUAGCAGCGGGUCCAGGAUUGGUUCCAGUCCAACGCGCGAUGCGCGUCAAGCUAGGCGAAUGACCACGGUCGAAACACCACUUAUGUGACCCACCUUGGCCAACUCUCCCGAUUCUCCUCGCUACUAUCUUGAAGGUCACUGAGAAUAUCCCUUAUGGGUCGCAUACGGAGACAGCCGCAGGAGCCUUAACGGAGAAUACGCCAAUACUAUGUUCUGGGUCGGUGGGUGUAAUGCGAUGCAAUCCGAUCGUGCGAACGUUCCCUUUGAUGACUAUAGGGUCUAGUGAUCGUACAUGUGC + """ From c2eebabbe40885a972300f1627c49dd5e9000b60 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Mon, 23 Mar 2020 16:00:25 -0700 Subject: [PATCH 03/98] chars->bytes --- 06_wc/solution.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/06_wc/solution.py b/06_wc/solution.py index 4fbe1e0f6..60034d563 100755 --- a/06_wc/solution.py +++ b/06_wc/solution.py @@ -29,22 +29,22 @@ def main(): args = get_args() - total_lines, total_chars, total_words = 0, 0, 0 + total_lines, total_bytes, total_words = 0, 0, 0 for fh in args.file: - lines, words, chars = 0, 0, 0 + num_lines, num_words, num_bytes = 0, 0, 0 for line in fh: - lines += 1 - chars += len(line) - words += len(line.split()) + num_lines += 1 + num_bytes += len(line) + num_words += len(line.split()) - total_lines += lines - total_chars += chars - total_words += words + total_lines += num_lines + total_bytes += num_bytes + total_words += num_words - print(f'{lines:8}{words:8}{chars:8} {fh.name}') + print(f'{num_lines:8}{num_words:8}{num_bytes:8} {fh.name}') if len(args.file) > 1: - print(f'{total_lines:8}{total_words:8}{total_chars:8} total') + print(f'{total_lines:8}{total_words:8}{total_bytes:8} total') # -------------------------------------------------- From f6a04c4e698d4f04870fdf091f4555170d1a5fe1 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Mon, 23 Mar 2020 16:00:59 -0700 Subject: [PATCH 04/98] deleted file --- 05_howler/error.txt | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 05_howler/error.txt diff --git a/05_howler/error.txt b/05_howler/error.txt deleted file mode 100644 index c4d5487ec..000000000 --- a/05_howler/error.txt +++ /dev/null @@ -1,3 +0,0 @@ -This is an also error! -This is an error! -This is an also error! From 0e0bf4d26e6b0999374119baeab730403300395e Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Mon, 23 Mar 2020 16:01:26 -0700 Subject: [PATCH 05/98] typo --- 02_crowsnest/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/02_crowsnest/README.md b/02_crowsnest/README.md index f6a1e1c23..5f1afef9f 100644 --- a/02_crowsnest/README.md +++ b/02_crowsnest/README.md @@ -4,8 +4,8 @@ Write a program that will announce the appearance of something "off the larboard Note that you need to "a" before a word starting with a consonant: ``` -$ ./crowsnest.py narwhall -Ahoy, Captain, a narwhall off the larboard bow! +$ ./crowsnest.py narwhal +Ahoy, Captain, a narwhal off the larboard bow! ``` Or "an" before a word starting with a vowel: From 3bb69871a29b20f8c467eb2b65528d8f7c880f84 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Mon, 23 Mar 2020 16:04:50 -0700 Subject: [PATCH 06/98] clean --- Makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Makefile b/Makefile index 40addc60a..8b1d51fce 100644 --- a/Makefile +++ b/Makefile @@ -1,2 +1,6 @@ install: python3 -m pip install -r requirements.txt + +clean: + find . -name .pytest_cache -o -name __pycache__ -o -name .idea -o -name .mypy_cache -exec rm -rf {} \; + From 17b7d7a15b4a0cd2d7659136e5c2b7cbb35928a8 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Mon, 23 Mar 2020 16:10:00 -0700 Subject: [PATCH 07/98] clean --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 8b1d51fce..e2f599fe8 100644 --- a/Makefile +++ b/Makefile @@ -2,5 +2,5 @@ install: python3 -m pip install -r requirements.txt clean: - find . -name .pytest_cache -o -name __pycache__ -o -name .idea -o -name .mypy_cache -exec rm -rf {} \; + for name in .pytest_cache __pycache__ .vsidea .idea .mypy_cache; do find . -name $$name -exec rm -rf {} \;; done From e29f565fad4dbc12f9036bdb1fa9bf30d6942f65 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Tue, 24 Mar 2020 14:54:44 -0700 Subject: [PATCH 08/98] new solution --- 08_apples_and_bananas/solution0.py | 57 ++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100755 08_apples_and_bananas/solution0.py diff --git a/08_apples_and_bananas/solution0.py b/08_apples_and_bananas/solution0.py new file mode 100755 index 000000000..0413868ec --- /dev/null +++ b/08_apples_and_bananas/solution0.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python3 +""" +Author : Ken Youens-Clark +Date : 2020-03-24 +Purpose: Rock the Casbah +""" + +import argparse +import os +import sys + + +# -------------------------------------------------- +def get_args(): + """Get command-line arguments""" + + parser = argparse.ArgumentParser( + description='Rock the Casbah', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('text', + metavar='str', + help='Input text') + + parser.add_argument('-v', + '--vowel', + help='The vowel', + metavar='str', + type=str, + choices=list('aeiou'), + default='a') + + args = parser.parse_args() + + if os.path.isfile(args.text): + args.text = open(args.text).read().rstrip() + + return args + + +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + text = args.text + vowel = args.vowel + + for v in 'aeiou': + text = text.replace(v, vowel) + text = text.replace(v.upper(), vowel.upper()) + + print(text) + +# -------------------------------------------------- +if __name__ == '__main__': + main() From 71408fa174dbbcf8514e77ca2821d2fb343415aa Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Wed, 25 Mar 2020 15:25:43 -0700 Subject: [PATCH 09/98] moog exercise --- extra/09_synthetic_dna/Makefile | 10 ++ extra/09_synthetic_dna/README.adoc | 230 +++++++++++++++++++++++++++++ extra/09_synthetic_dna/README.pdf | Bin 0 -> 122569 bytes extra/09_synthetic_dna/test.py | 147 ++++++++++++++++++ 4 files changed, 387 insertions(+) create mode 100644 extra/09_synthetic_dna/Makefile create mode 100644 extra/09_synthetic_dna/README.adoc create mode 100644 extra/09_synthetic_dna/README.pdf create mode 100755 extra/09_synthetic_dna/test.py diff --git a/extra/09_synthetic_dna/Makefile b/extra/09_synthetic_dna/Makefile new file mode 100644 index 000000000..571de4c81 --- /dev/null +++ b/extra/09_synthetic_dna/Makefile @@ -0,0 +1,10 @@ +.PHONY: test pdf clean + +pdf: + asciidoctor-pdf README.adoc + +test: + pytest -xv --disable-pytest-warnings test.py + +clean: + rm -rf __pycache__ .pytest diff --git a/extra/09_synthetic_dna/README.adoc b/extra/09_synthetic_dna/README.adoc new file mode 100644 index 000000000..3fd2434a7 --- /dev/null +++ b/extra/09_synthetic_dna/README.adoc @@ -0,0 +1,230 @@ += Creating synthetic DNA/RNA sequences + +In this exercise, you will write a Python program called `moog.py` footnote:[Why "moog"?] that will generate a FASTA-formatted footnote:[https://en.wikipedia.org/wiki/FASTA_format] file of synthetic DNA or RNA. +The program will accept the following optional arguments: + +* `-o`|`--outfile`: The output file to write the sequences (default "out.fa") +* `-t`|`--seqtype`: The sequence type, either `dna` or `rna` (`str`, default "dna") +* `-n`|`--numseqs`: The number of sequences to generate (`int`, default 10) +* `-m`|`--minlen`: The minimum length for any sequence (`int`, default 50) +* `-x`|`--maxlen`: The maximum length for any sequence (`int`, default 75) +* `-p`|`--pctgc`: The average percentage of GC content for a sequence (`float`, default 0.5 or 50%) +* `-s`|`--seed`: An integer value to use for the random seed (`int`, default `None`) so that the random choices of the program can be repeated under testing conditions. + +Here is the usage the program should generate: + +---- +$ ./moog.py -h +usage: moog.py [-h] [-o str] [-t str] [-n int] [-m int] [-x int] [-p float] + [-s int] + +Create synthetic sequences + +optional arguments: + -h, --help show this help message and exit + -o str, --outfile str + Output filename (default: out.fa) + -t str, --seqtype str + DNA or RNA (default: dna) + -n int, --numseqs int + Number of sequences to create (default: 10) + -m int, --minlen int Minimum length (default: 50) + -x int, --maxlen int Maximum length (default: 75) + -p float, --pctgc float + Percent GC (default: 0.5) + -s int, --seed int Random seed (default: None) +---- + +For instance, I can run it to create 3 sequences with the default values, and the program will tell me how many of what kind of sequences were placed into which output file: + +---- +$ ./moog.py -n 3 -s 1 +Done, wrote 3 DNA sequences to "out.fa". +---- + +The output file should be in FASTA format: + +* Each sequence record takes up two lines +* The first line for each sequence record starts with a literal `>` (greater than sign) and is followed by a unique identifier. For this exercise, the ID is not important so numbering the sequences in order is sufficient. +* The second line of a record is the sequence itself. Note that some FASTA formats will limit the length of this line and so may break up the sequence over several lines. This is not necessary. The sequence can be one very long line. If you really want to break the sequence after something like 80 characters, that is fine, too. + +Here is what the output for the above should (might) look like: + +---- +$ cat out.fa +>1 +ATTTGCATAGGAGCAGGACAAAGGGCTCGACTCTTCCGCGCCATGTTGTATCAGAACA +>2 +CCCTTGATCGGCCCGGGGGTACGCATACCGTACAAGCTGGTTAATTACTAAAAATTACTGAAACGGAATGC +>3 +TTCTGTGGGAGTCAGAGACCTATGAAGATTCTAATAGCAGACGCCAAGATCCGCAGCACAT +---- + +== Writing `moog.py` + +The first challenge is to define all your arguments correctly. +Onerous as this is, perhaps 30% of the program is in accepting the arguments correctly! + +Some tips: + +* Be sure to use `choices` for the `seqtype` argument +* Consider using `type=argparse.FileType('wt')` for the `--outfile`. You don't have to do this, but, if you do, then `args.outfile` will be an open, writable file handle! +* You should also manually verify that `pctgc` is between 0 and 1 which can be done with a compound comparison like so: + +---- +args = parser.parse_args() + +if not 0 < args.pctgc < 1: + parser.error(f'--pctgc "{args.pctgc}" must be between 0 and 1') +---- + +You should be sure to set the random seed immediately after accepting the arguments, _before_ you do anything using the `random` module. +Then your program will need to get a "pool" of bases for creating the sequences: + +---- +def main(): + args = get_args() + random.seed(args.seed) + pool = create_pool(args.pctgc, args.maxlen, args.seqtype) +---- + +You can use the following `create_pool` function. +The function accepts three positional arguments: + +. `pctgc`: The average percentage of GC content for each sequence +. `max_len`: The maximum length for any sequence +. `seq_type`: The sequence type, either "rna" or "dna" + +---- +def create_pool(pctgc, max_len, seq_type): + """ Create the pool of bases """ + + t_or_u = 'T' if seq_type == 'dna' else 'U' <1> + num_gc = int((pctgc / 2) * max_len) <2> + num_at = int(((1 - pctgc) / 2) * max_len) <3> + pool = 'A' * num_at + 'C' * num_gc + 'G' * num_gc + t_or_u * num_at <4> + + for _ in range(max_len - len(pool)): <5> + pool += random.choice(pool) + + return ''.join(sorted(pool)) <6> +---- + +<1> Choose either "T" if `seq_type` is "dna" or choose "U" for "rna" +<2> The number of G or C bases is the `pctgc` divided by 2 times the number of bases. +<3> The number of A or T/U bases is the `1 - pctgc` divided by 2 times the number of bases. +<4> The `pool` of bases will be each base in "ACG[TU]" repeated the correct number of times. +<5> Because of rounding issues, we may not actually have enough bases, so pad the pool with random choices from the existing pool (in the hopes this essentially keeps the GC content the same). +<6> Return a sorted string of the bases. + +Here is the test for the function. +Notice how the test also gives us a very clear understanding of how we'll pass in and receive values: + +---- +def test_create_pool(): + """ Test create_pool """ + + state = random.getstate() <1> + random.seed(1) <2> + assert create_pool(.5, 10, 'dna') == 'AAACCCGGTT' + assert create_pool(.6, 11, 'rna') == 'AACCCCGGGUU' + assert create_pool(.7, 12, 'dna') == 'ACCCCCGGGGGT' + assert create_pool(.7, 20, 'rna') == 'AAACCCCCCCGGGGGGGUUU' + assert create_pool(.4, 15, 'dna') == 'AAAACCCGGGTTTTT' + random.setstate(state) <3> +---- + +<1> The state of the `random` module is _global_ to the program. Any change we make here could affect unknown parts of the program, so we save our current state. +<2> Set the random seed to a known value. This is a _global change_ to our program. Any other calls to `random` after this line are affected, even if they are in another function or module! +<3> Reset the global state to the original value. + +With the above functions, your program is essentially left to fill in this: + +---- +def main(): + args = get_args() + random.seed(args.seed) + pool = create_pool(args.pctgc, args.maxlen, args.seqtype) + + for ...: <1> + seq_len = ... <2> + seq = ... <3> + args.outfile.write(...)) <4> + + print(...) <5> +---- + +<1> You need to do this `args.numseqs` times +<2> Use `random.choice` to select a number between `args.minlen` and `arg.maxlen` +<3> Use `random.sample` to select `seq_len` number of bases from the `pool` and make a new `str` for your sequence. +<4> Write the new `seq` to the output file in the FASTA format. +<5> Print the output message. + +== Using the `random` functions + +As noted in the `abuse` chapter, we can use `random.seed` to control the pseudo-random generator in Python. +This allows us to test that our random functions are _reproducible_! +You should set this value before calling any functions in the `random` module. +The default value for your `--seed` parameter should be `None`. +If you set the seed to `None`, it is the same as not setting it at all. +The seed can be a `str` or an `int`, but stick with using an `int` for this exercise. + +For each sequence, you will use `random.randint` to select a length for the sequence between the min/max values: + +---- +>>> import random +>>> min_len = 5 +>>> max_len = 15 +>>> seq_len = random.randint(min_len, max_len) +>>> seq_len +12 +---- + +You will then use this value to select the bases for your new sequence: + +---- +>>> random.sample(pool, seq_len) +['A', 'T', 'A', 'T', 'C', 'C', 'G', 'C', 'G', 'A', 'G', 'T'] +---- + +The output should be written to the output file like so (assuming this is the first sequence): + +---- +>1 +ATATCCGCGAGT +---- + +== Testing + +You may need to install BioPython and numpy in order to run the tests: + +---- +$ python3 -m pip install biopython numpy +---- + +I would recommend you study the `test.py` as it uses the BioPython module to parse the output file your program creates so as to check: + +* that the output file is parsable as FASTA format +* that the output file has the correct number of sequences +* that the sequences lie in the range of min/max lengths +* that the bases are correct for the given sequence type +* that the average GC content of the sequences is close to the value indicated + +Note that BioPython will emit a deprecation warning under `pytest`, so I have added an additional flag `--disable-pytest-warnings` to the `make test` target that you should use: + +---- +$ make test +pytest -xv --disable-pytest-warnings test.py +============================= test session starts ============================== +... +collected 6 items + +test.py::test_exists PASSED [ 16%] +test.py::test_usage PASSED [ 33%] +test.py::test_bad_seqtype PASSED [ 50%] +test.py::test_bad_pctgc PASSED [ 66%] +test.py::test_defaults PASSED [ 83%] +test.py::test_options PASSED [100%] + +========================= 6 passed, 1 warning in 0.87s ========================= +---- diff --git a/extra/09_synthetic_dna/README.pdf b/extra/09_synthetic_dna/README.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a85250e071afd20e65447ef01273b92b23192d00 GIT binary patch literal 122569 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 literal 0 HcmV?d00001 diff --git a/extra/09_synthetic_dna/test.py b/extra/09_synthetic_dna/test.py new file mode 100755 index 000000000..3c762de77 --- /dev/null +++ b/extra/09_synthetic_dna/test.py @@ -0,0 +1,147 @@ +#!/usr/bin/env python3 +"""tests for moog.py""" + +import os +import random +import re +import string +from subprocess import getstatusoutput +from Bio import SeqIO +from Bio.SeqUtils import GC +from numpy import mean +from itertools import chain + +prg = './moog.py' + + +# -------------------------------------------------- +def random_string(): + """generate a random string""" + + return ''.join(random.choices(string.ascii_uppercase + string.digits, k=5)) + + +# -------------------------------------------------- +def test_exists(): + """usage""" + + assert os.path.isfile(prg) + + +# -------------------------------------------------- +def test_usage(): + """usage""" + + for flag in ['-h', '--help']: + rv, out = getstatusoutput('{} {}'.format(prg, flag)) + assert rv == 0 + assert re.match("usage", out, re.IGNORECASE) + + +# -------------------------------------------------- +def test_bad_seqtype(): + """die on bad seqtype""" + + bad = random_string() + rv, out = getstatusoutput(f'{prg} -t {bad}') + assert rv != 0 + assert re.match('usage:', out, re.I) + assert re.search( + f"-t/--seqtype: invalid choice: '{bad}' \(choose from 'dna', 'rna'\)", + out) + + +# -------------------------------------------------- +def test_bad_pctgc(): + """die on bad pctgc""" + + bad = random.randint(1, 10) + rv, out = getstatusoutput(f'{prg} -p {bad}') + assert rv != 0 + assert re.match('usage:', out, re.I) + assert re.search(f'--pctgc "{float(bad)}" must be between 0 and 1', out) + + +# -------------------------------------------------- +def test_defaults(): + """runs on good input""" + + out_file = 'out.fa' + try: + if os.path.isfile(out_file): + os.remove(out_file) + + rv, out = getstatusoutput(prg) + assert rv == 0 + assert out == f'Done, wrote 10 DNA sequences to "{out_file}".' + assert os.path.isfile(out_file) + + # correct number of seqs + seqs = list(SeqIO.parse(out_file, 'fasta')) + assert len(seqs) == 10 + + # the lengths are in the correct range + seq_lens = list(map(lambda seq: len(seq.seq), seqs)) + assert max(seq_lens) <= 75 + assert min(seq_lens) >= 50 + + # bases are correct + bases = ''.join( + sorted( + set(chain(map(lambda seq: ''.join(sorted(set(seq.seq))), + seqs))))) + assert bases == 'ACGT' + + # the pct GC is about right + gc = list(map(lambda seq: GC(seq.seq) / 100, seqs)) + assert .47 <= mean(gc) <= .53 + + finally: + if os.path.isfile(out_file): + os.remove(out_file) + + +# -------------------------------------------------- +def test_options(): + """runs on good input""" + + out_file = random_string() + '.fasta' + try: + if os.path.isfile(out_file): + os.remove(out_file) + + min_len = random.randint(50, 99) + max_len = random.randint(100, 150) + num_seqs = random.randint(100, 150) + pct_gc = random.random() + cmd = (f'{prg} -m {min_len} -x {max_len} -o {out_file} ' + f'-n {num_seqs} -t rna -p {pct_gc:.02f} -s 1') + rv, out = getstatusoutput(cmd) + + assert rv == 0 + assert out == f'Done, wrote {num_seqs} RNA sequences to "{out_file}".' + assert os.path.isfile(out_file) + + # correct number of seqs + seqs = list(SeqIO.parse(out_file, 'fasta')) + assert len(seqs) == num_seqs + + # the lengths are in the correct range + seq_lens = list(map(lambda seq: len(seq.seq), seqs)) + assert max(seq_lens) <= max_len + assert min(seq_lens) >= min_len + + # bases are correct + bases = ''.join( + sorted( + set(chain(map(lambda seq: ''.join(sorted(set(seq.seq))), + seqs))))) + assert bases == 'ACGU' + + # the pct GC is about right + gc = list(map(lambda seq: GC(seq.seq) / 100, seqs)) + assert pct_gc - .3 <= mean(gc) <= pct_gc + .3 + + finally: + if os.path.isfile(out_file): + os.remove(out_file) From b4c51e2e79cc1260fbf5d5f8a2b006f109398699 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Sun, 29 Mar 2020 14:23:57 -0700 Subject: [PATCH 10/98] typo --- 20_password/README.md | 2 +- 20_password/solution1.py | 2 +- 20_password/solution2.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/20_password/README.md b/20_password/README.md index d8255bab3..5bc8dac1d 100644 --- a/20_password/README.md +++ b/20_password/README.md @@ -105,7 +105,7 @@ optional arguments: -m int, --min_word_len int Minimum word length (default: 4) -s int, --seed int Random seed (default: None) - -l, --l33t Obsfuscate letters (default: False) + -l, --l33t Obfuscate letters (default: False) ``` Run the test suite to ensure your program is correct: diff --git a/20_password/solution1.py b/20_password/solution1.py index f07838c59..d882852d3 100755 --- a/20_password/solution1.py +++ b/20_password/solution1.py @@ -52,7 +52,7 @@ def get_args(): parser.add_argument('-l', '--l33t', action='store_true', - help='Obsfuscate letters') + help='Obfuscate letters') return parser.parse_args() diff --git a/20_password/solution2.py b/20_password/solution2.py index c9636aa57..881ab5a7c 100755 --- a/20_password/solution2.py +++ b/20_password/solution2.py @@ -52,7 +52,7 @@ def get_args(): parser.add_argument('-l', '--l33t', action='store_true', - help='Obsfuscate letters') + help='Obfuscate letters') return parser.parse_args() From 0001c8a4723f136f3e386dbd4e24f34ef0f05e11 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Mon, 30 Mar 2020 09:25:41 -0700 Subject: [PATCH 11/98] cleanup on new.py/template.py, other stuff --- 05_howler/.gitignore | 1 + 22_itictactoe/Makefile | 3 -- 22_itictactoe/unit.py | 2 +- bin/new.py | 80 ++++++++++++++---------------------------- template/template.py | 12 +++---- 5 files changed, 33 insertions(+), 65 deletions(-) create mode 100644 05_howler/.gitignore diff --git a/05_howler/.gitignore b/05_howler/.gitignore new file mode 100644 index 000000000..9cd654693 --- /dev/null +++ b/05_howler/.gitignore @@ -0,0 +1 @@ +out.txt diff --git a/22_itictactoe/Makefile b/22_itictactoe/Makefile index 8327ef3ea..63b6ce214 100644 --- a/22_itictactoe/Makefile +++ b/22_itictactoe/Makefile @@ -1,7 +1,4 @@ .PHONY: test -test: - pytest -xv test.py - unit: pytest -xv unit.py diff --git a/22_itictactoe/unit.py b/22_itictactoe/unit.py index efec6e5d2..5544492e2 100755 --- a/22_itictactoe/unit.py +++ b/22_itictactoe/unit.py @@ -1,4 +1,4 @@ -from tictactoe import format_board, find_winner +from itictactoe import format_board, find_winner import random diff --git a/bin/new.py b/bin/new.py index 439d98dff..6a487b13c 100755 --- a/bin/new.py +++ b/bin/new.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 """ Author : Ken Youens-Clark -Date : 24 October 2018 Purpose: Python program to write a Python program """ @@ -19,18 +18,13 @@ def get_args(): """Get arguments""" parser = argparse.ArgumentParser( - description='Create Python argparse/simple program', + description='Create Python argparse program', formatter_class=argparse.ArgumentDefaultsHelpFormatter) defaults = get_defaults() parser.add_argument('program', help='Program name', type=str) - parser.add_argument('-s', - '--simple', - help='Use simple format', - action='store_true') - parser.add_argument('-n', '--name', type=str, @@ -59,7 +53,10 @@ def get_args(): args.program = args.program.strip().replace('-', '_') if not args.program: - parser.error('Not a usable filename "{}"'.format(args.program)) + parser.error(f'Not a usable filename "{args.program}"') + + if args.email: + args.email = f'<{args.email}>' return args @@ -72,22 +69,19 @@ def main(): program = args.program if os.path.isfile(program) and not args.force: - answer = input('"{}" exists. Overwrite? [yN] '.format(program)) + answer = input(f'"{program}" exists. Overwrite? [yN] ') if not answer.lower().startswith('y'): print('Will not overwrite. Bye!') sys.exit() - header = preamble(name=args.name, - email=args.email, - purpose=args.purpose, - date=str(date.today())) - text = simple() if args.simple else body(args.purpose) + text = body(name=args.name, + email=args.email, + purpose=args.purpose, + date=str(date.today())) - out_fh = open(program, 'w') - out_fh.write(header + text) - out_fh.close() + print(text, file=open(program, 'wt'), end='') subprocess.run(['chmod', '+x', program]) - print('Done, see new script "{}."'.format(program)) + print(f'Done, see new script "{program}."') # -------------------------------------------------- @@ -102,39 +96,17 @@ def preamble(**args): # -------------------------------------------------- -def simple(): - return """ -import os -import sys - - -# -------------------------------------------------- -def main(): - \"\"\"Make a jazz noise here\"\"\" - - args = sys.argv[1:] - - if len(args) != 1: - print('Usage: {} ARG'.format(os.path.basename(sys.argv[0]))) - sys.exit(1) - - arg = args[0] - - print('Arg is "{}"'.format(arg)) - - -# -------------------------------------------------- -if __name__ == '__main__': - main() -""" +def body(**args): + """ The program template """ + return f"""#!/usr/bin/env python3 +\"\"\" +Author : {args['name']}{args['email']} +Date : {args['date']} +Purpose: {args['purpose']} +\"\"\" -# -------------------------------------------------- -def body(purpose): - text = """ import argparse -import os -import sys # -------------------------------------------------- @@ -142,7 +114,7 @@ def get_args(): \"\"\"Get command-line arguments\"\"\" parser = argparse.ArgumentParser( - description='{}', + description='{args["purpose"]}', formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('positional', @@ -189,18 +161,18 @@ def main(): flag_arg = args.on pos_arg = args.positional - print('str_arg = "{{}}"'.format(str_arg)) - print('int_arg = "{{}}"'.format(int_arg)) + print(f'str_arg = "{{str_arg}}"') + print(f'int_arg = "{{int_arg}}"') print('file_arg = "{{}}"'.format(file_arg.name if file_arg else '')) - print('flag_arg = "{{}}"'.format(flag_arg)) - print('positional = "{{}}"'.format(pos_arg)) + print(f'flag_arg = "{{flag_arg}}"') + print(f'positional = "{{pos_arg}}"') # -------------------------------------------------- if __name__ == '__main__': main() """ - return text.format(purpose) + # -------------------------------------------------- def get_defaults(): diff --git a/template/template.py b/template/template.py index 7b24fc8c8..225dea9c4 100755 --- a/template/template.py +++ b/template/template.py @@ -6,8 +6,6 @@ """ import argparse -import os -import sys # -------------------------------------------------- @@ -62,11 +60,11 @@ def main(): flag_arg = args.on pos_arg = args.positional - print('str_arg = "{}"'.format(str_arg)) - print('int_arg = "{}"'.format(int_arg)) - print('file_arg = "{}"'.format(file_arg.name)) - print('flag_arg = "{}"'.format(flag_arg)) - print('positional = "{}"'.format(pos_arg)) + print(f'str_arg = "{str_arg}"') + print(f'int_arg = "{int_arg}"') + print('file_arg = "{}"'.format(file_arg.name if file_arg else '')) + print(f'flag_arg = "{flag_arg}"') + print(f'positional = "{pos_arg}"') # -------------------------------------------------- From dcfaeea617123d93ed42b443dd56a0fcf13e1c05 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Mon, 30 Mar 2020 12:00:55 -0700 Subject: [PATCH 12/98] transpose table, more flexible --- 18_gematria/asciitbl.py | 62 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 56 insertions(+), 6 deletions(-) diff --git a/18_gematria/asciitbl.py b/18_gematria/asciitbl.py index aa9122ba7..c6044645e 100755 --- a/18_gematria/asciitbl.py +++ b/18_gematria/asciitbl.py @@ -1,20 +1,70 @@ #!/usr/bin/env python3 -"""Print ASCII table""" +""" Make ASCII table """ import argparse -import os -import sys -import string from itertools import zip_longest from tabulate import tabulate +import pandas as pd +from pprint import pprint + + +# -------------------------------------------------- +def get_args(): + """Get command-line arguments""" + + parser = argparse.ArgumentParser( + description='Make ASCII table', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('-c', + '--cols', + help='Number of columns', + metavar='int', + type=int, + default=8) + + parser.add_argument('-l', + '--lower', + help='Lower chr value', + metavar='int', + type=int, + default=0) + + parser.add_argument('-u', + '--upper', + help='Upper chr value', + metavar='int', + type=int, + default=128) + + args = parser.parse_args() + + if args.lower < 0: + parser.error(f'--lower "{args.lower}" must be >= 0') + + if args.upper > 128: + parser.error(f'--upper "{args.upper}" must be <= 128') + + if args.lower > args.upper: + args.lower, args.upper = args.upper, args.lower + + return args # -------------------------------------------------- def main(): """Make a jazz noise here""" - for chunk in chunker(range(128), 8): - print(' '.join(map(cell, chunk))) + args = get_args() + lower = args.lower + upper = args.upper + num_cells = args.upper - args.lower + num_rows = round(num_cells / args.cols) + cells = list(chunker(list(map(cell, range(lower, upper))), num_rows)) + df = pd.DataFrame(cells) + + for i, row in df.T.iterrows(): + print(' '.join(map(lambda v: v or ' ' * 5, row))) # -------------------------------------------------- From ba3cde07ce7f5de68977e0bd95096bb16acfc133 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Mon, 30 Mar 2020 12:22:52 -0700 Subject: [PATCH 13/98] cleanup from mat --- 11_bottles_of_beer/unit.py | 19 ------------------- 12_ransom/test.py | 12 ++++++++++++ 2 files changed, 12 insertions(+), 19 deletions(-) delete mode 100644 11_bottles_of_beer/unit.py diff --git a/11_bottles_of_beer/unit.py b/11_bottles_of_beer/unit.py deleted file mode 100644 index ec528484a..000000000 --- a/11_bottles_of_beer/unit.py +++ /dev/null @@ -1,19 +0,0 @@ -from bottles import verse - - -# -------------------------------------------------- -def test_verse() -> None: - """Test verse""" - - one = verse(1) - assert one == '\n'.join([ - '1 bottle of beer on the wall,', '1 bottle of beer,', - 'Take one down, pass it around,', - 'No more bottles of beer on the wall!' - ]) - - two = verse(2) - assert two == '\n'.join([ - '2 bottles of beer on the wall,', '2 bottles of beer,', - 'Take one down, pass it around,', '1 bottle of beer on the wall!' - ]) diff --git a/12_ransom/test.py b/12_ransom/test.py index eb659e754..d1c06de4f 100755 --- a/12_ransom/test.py +++ b/12_ransom/test.py @@ -35,17 +35,22 @@ def test_usage(): # -------------------------------------------------- def test_text1(): + """Test""" + in_text = 'The quick brown fox jumps over the lazy dog.' tests = [('1', 'thE QUICk BrOWn Fox jumpS OveR tHe LAzY dOg.'), ('3', 'thE quICk BROwn Fox jUmPS OVEr the lAZY DOG.')] for seed, expected in tests: rv, out = getstatusoutput(f'{prg} {seed_flag()} {seed} "{in_text}"') + assert rv == 0 assert out.strip() == expected # -------------------------------------------------- def test_text2(): + """Test""" + in_text = 'Now is the time for all good men to come to the aid of the party.' tests = [ ('2', @@ -56,21 +61,27 @@ def test_text2(): for seed, expected in tests: rv, out = getstatusoutput(f'{prg} {seed_flag()} {seed} "{in_text}"') + assert rv == 0 assert out.strip() == expected # -------------------------------------------------- def test_file1(): + """Test""" + tests = [('1', 'thE QUICk BrOWn Fox jumpS OveR tHe LAzY dOg.'), ('3', 'thE quICk BROwn Fox jUmPS OVEr the lAZY DOG.')] for seed, expected in tests: rv, out = getstatusoutput(f'{prg} {seed_flag()} {seed} {fox}') + assert rv == 0 assert out.strip() == expected # -------------------------------------------------- def test_file2(): + """Test""" + tests = [ ('2', 'now iS the TIME fOR ALl good meN TO COMe To THE AID oF THE PArTY.'), @@ -80,4 +91,5 @@ def test_file2(): for seed, expected in tests: rv, out = getstatusoutput(f'{prg} {seed_flag()} {seed} {now}') + assert rv == 0 assert out.strip() == expected From 3c85bdf72a2af3d3a41f3a224be8d93c63cc7943 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Mon, 30 Mar 2020 13:07:20 -0700 Subject: [PATCH 14/98] cleaner versions --- 13_twelve_days/solution.py | 15 +++++++-------- 13_twelve_days/solution_emoji.py | 16 +++++++--------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/13_twelve_days/solution.py b/13_twelve_days/solution.py index 9c4ed3032..5b82227fe 100755 --- a/13_twelve_days/solution.py +++ b/13_twelve_days/solution.py @@ -16,16 +16,16 @@ def get_args(): parser.add_argument('-n', '--num', help='Number of days to sing', - metavar='int', + metavar='days', type=int, default=12) parser.add_argument('-o', '--outfile', - help='Outfile (STDOUT)', - metavar='str', - type=str, - default='') + help='Outfile', + metavar='FILE', + type=argparse.FileType('wt'), + default=sys.stdout) args = parser.parse_args() @@ -40,9 +40,8 @@ def main(): """Make a jazz noise here""" args = get_args() - out_fh = open(args.outfile, 'wt') if args.outfile else sys.stdout - out_fh.write('\n\n'.join(map(verse, range(1, args.num + 1))) + '\n') - out_fh.close() + verses = map(verse, range(1, args.num + 1)) + print('\n\n'.join(verses), file=args.outfile) # -------------------------------------------------- diff --git a/13_twelve_days/solution_emoji.py b/13_twelve_days/solution_emoji.py index b58f28577..3c7ea0a16 100755 --- a/13_twelve_days/solution_emoji.py +++ b/13_twelve_days/solution_emoji.py @@ -17,16 +17,16 @@ def get_args(): parser.add_argument('-n', '--num', help='Number of days to sing', - metavar='int', + metavar='days', type=int, default=12) parser.add_argument('-o', '--outfile', - help='Outfile (STDOUT)', - metavar='str', - type=str, - default='') + help='Outfile', + metavar='FILE', + type=argparse.FileType('wt'), + default=sys.stdout) args = parser.parse_args() @@ -41,10 +41,8 @@ def main(): """Make a jazz noise here""" args = get_args() - out_fh = open(args.outfile, 'wt') if args.outfile else sys.stdout - print(emoji.emojize('\n\n'.join(map(verse, range(1, args.num + 1)))), - file=out_fh) - out_fh.close() + verses = map(verse, range(1, args.num + 1)) + print(emoji.emojize('\n\n'.join(verses)), file=args.outfile) # -------------------------------------------------- From bf371d16c99ecf29977bda503815088d260f3ea1 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Mon, 30 Mar 2020 14:52:22 -0700 Subject: [PATCH 15/98] fixed solutions --- 07_gashlycrumb/gashlycrumb_interactive.py | 8 ++-- 07_gashlycrumb/solution1.py | 9 ++-- 07_gashlycrumb/solution2_dict_comp.py | 47 +++++++++++++++++++ .../{solution2.py => solution3_dict_get.py} | 4 +- 4 files changed, 58 insertions(+), 10 deletions(-) create mode 100755 07_gashlycrumb/solution2_dict_comp.py rename 07_gashlycrumb/{solution2.py => solution3_dict_get.py} (92%) diff --git a/07_gashlycrumb/gashlycrumb_interactive.py b/07_gashlycrumb/gashlycrumb_interactive.py index 0c88baeb5..6ed82c5ef 100755 --- a/07_gashlycrumb/gashlycrumb_interactive.py +++ b/07_gashlycrumb/gashlycrumb_interactive.py @@ -9,7 +9,7 @@ def get_args(): """get command-line arguments""" parser = argparse.ArgumentParser( - description='Gashlycrumb', + description='Interactive Gashlycrumb', formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('-f', @@ -35,10 +35,8 @@ def main(): if letter == '!': print('Bye') break - elif letter.upper() in lookup: - print(lookup[letter.upper()]) - else: - print('I do not know "{}".'.format(letter)) + + print(lookup.get(letter.upper(), f'I do not know "{letter}".')) # -------------------------------------------------- diff --git a/07_gashlycrumb/solution1.py b/07_gashlycrumb/solution1.py index 65545d293..91c87fca5 100755 --- a/07_gashlycrumb/solution1.py +++ b/07_gashlycrumb/solution1.py @@ -14,14 +14,14 @@ def get_args(): parser.add_argument('letter', help='Letter(s)', - metavar='str', + metavar='letter', nargs='+', type=str) parser.add_argument('-f', '--file', help='Input file', - metavar='str', + metavar='FILE', type=argparse.FileType('r'), default='gashlycrumb.txt') @@ -33,7 +33,10 @@ def main(): """Make a jazz noise here""" args = get_args() - lookup = {line[0].upper(): line.rstrip() for line in args.file} + + lookup = {} + for line in args.file: + lookup[line[0].upper()] = line.rstrip() for letter in args.letter: if letter.upper() in lookup: diff --git a/07_gashlycrumb/solution2_dict_comp.py b/07_gashlycrumb/solution2_dict_comp.py new file mode 100755 index 000000000..39ea519a7 --- /dev/null +++ b/07_gashlycrumb/solution2_dict_comp.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python3 +"""Lookup tables""" + +import argparse + + +# -------------------------------------------------- +def get_args(): + """get command-line arguments""" + + parser = argparse.ArgumentParser( + description='Gashlycrumb', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('letter', + help='Letter(s)', + metavar='letter', + nargs='+', + type=str) + + parser.add_argument('-f', + '--file', + help='Input file', + metavar='FILE', + type=argparse.FileType('r'), + default='gashlycrumb.txt') + + return parser.parse_args() + + +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + lookup = {line[0].upper(): line.rstrip() for line in args.file} + + for letter in args.letter: + if letter.upper() in lookup: + print(lookup[letter.upper()]) + else: + print(f'I do not know "{letter}".') + + +# -------------------------------------------------- +if __name__ == '__main__': + main() diff --git a/07_gashlycrumb/solution2.py b/07_gashlycrumb/solution3_dict_get.py similarity index 92% rename from 07_gashlycrumb/solution2.py rename to 07_gashlycrumb/solution3_dict_get.py index 235c983f1..6bea7d2c0 100755 --- a/07_gashlycrumb/solution2.py +++ b/07_gashlycrumb/solution3_dict_get.py @@ -14,14 +14,14 @@ def get_args(): parser.add_argument('letter', help='Letter(s)', - metavar='str', + metavar='letter', nargs='+', type=str) parser.add_argument('-f', '--file', help='Input file', - metavar='str', + metavar='FILE', type=argparse.FileType('r'), default='gashlycrumb.txt') From bcee3f5c8282bbc89871410878605b86c1a7cc87 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Mon, 30 Mar 2020 15:13:38 -0700 Subject: [PATCH 16/98] cleanup --- 06_wc/{ => inputs}/empty.txt | 0 06_wc/{foo => inputs/foo.txt} | 0 06_wc/{ => inputs}/one.txt | 0 06_wc/{ => inputs}/two.txt | 0 06_wc/test.py | 15 +++++++++------ 5 files changed, 9 insertions(+), 6 deletions(-) rename 06_wc/{ => inputs}/empty.txt (100%) rename 06_wc/{foo => inputs/foo.txt} (100%) rename 06_wc/{ => inputs}/one.txt (100%) rename 06_wc/{ => inputs}/two.txt (100%) diff --git a/06_wc/empty.txt b/06_wc/inputs/empty.txt similarity index 100% rename from 06_wc/empty.txt rename to 06_wc/inputs/empty.txt diff --git a/06_wc/foo b/06_wc/inputs/foo.txt similarity index 100% rename from 06_wc/foo rename to 06_wc/inputs/foo.txt diff --git a/06_wc/one.txt b/06_wc/inputs/one.txt similarity index 100% rename from 06_wc/one.txt rename to 06_wc/inputs/one.txt diff --git a/06_wc/two.txt b/06_wc/inputs/two.txt similarity index 100% rename from 06_wc/two.txt rename to 06_wc/inputs/two.txt diff --git a/06_wc/test.py b/06_wc/test.py index e3191915d..f9ebc9dea 100755 --- a/06_wc/test.py +++ b/06_wc/test.py @@ -8,6 +8,9 @@ from subprocess import getstatusoutput prg = './wc.py' +empty = './inputs/empty.txt' +one_line = './inputs/one.txt' +two_lines = './inputs/two.txt' fox = '../inputs/fox.txt' sonnet = '../inputs/sonnet-29.txt' @@ -51,27 +54,27 @@ def test_bad_file(): def test_empty(): """Test on empty""" - rv, out = getstatusoutput(f'{prg} ./empty.txt') + rv, out = getstatusoutput(f'{prg} {empty}') assert rv == 0 - assert out.rstrip() == ' 0 0 0 ./empty.txt' + assert out.rstrip() == ' 0 0 0 ./inputs/empty.txt' # -------------------------------------------------- def test_one(): """Test on one""" - rv, out = getstatusoutput(f'{prg} ./one.txt') + rv, out = getstatusoutput(f'{prg} {one_line}') assert rv == 0 - assert out.rstrip() == ' 1 1 2 ./one.txt' + assert out.rstrip() == ' 1 1 2 ./inputs/one.txt' # -------------------------------------------------- def test_two(): """Test on two""" - rv, out = getstatusoutput(f'{prg} ./two.txt') + rv, out = getstatusoutput(f'{prg} {two_lines}') assert rv == 0 - assert out.rstrip() == ' 2 2 4 ./two.txt' + assert out.rstrip() == ' 2 2 4 ./inputs/two.txt' # -------------------------------------------------- From 98eedf417c9b908f5fb4b44a49e0017a1ccd4f69 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Tue, 31 Mar 2020 09:17:21 -0700 Subject: [PATCH 17/98] version that verifies words --- 14_rhymer/solution3_dict_words.py | 101 ++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100755 14_rhymer/solution3_dict_words.py diff --git a/14_rhymer/solution3_dict_words.py b/14_rhymer/solution3_dict_words.py new file mode 100755 index 000000000..f194baa8b --- /dev/null +++ b/14_rhymer/solution3_dict_words.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 +"""Make rhyming words""" + +import argparse +import io +import re +import string +from pydash import flatten + + +# -------------------------------------------------- +def get_args(): + """get command-line arguments""" + + parser = argparse.ArgumentParser( + description='Make rhyming "words"', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('word', metavar='str', help='A word to rhyme') + + parser.add_argument('-w', + '--wordlist', + metavar='FILE', + type=argparse.FileType('r'), + default='/usr/share/dict/words', + help='Wordlist to verify authenticity') + + return parser.parse_args() + + +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + prefixes = list('bcdfghjklmnpqrstvwxyz') + ( + 'bl br ch cl cr dr fl fr gl gr pl pr sc ' + 'sh sk sl sm sn sp st sw th tr tw thw wh wr ' + 'sch scr shr sph spl spr squ str thr').split() + + dict_words = read_wordlist(args.wordlist) + + def is_dict_word(word): + return word.lower() in dict_words if dict_words else True + + start, rest = stemmer(args.word) + if rest: + print('\n'.join( + sorted( + filter(is_dict_word, + [p + rest for p in prefixes if p != start])))) + else: + print(f'Cannot rhyme "{args.word}"') + + +# -------------------------------------------------- +def stemmer(word): + """Return leading consonants (if any), and 'stem' of word""" + + word = word.lower() + pos = list( + filter(lambda v: v >= 0, + map(lambda c: word.index(c) if c in word else -1, 'aeiou'))) + if pos: + first = min(pos) + return (word[:first], word[first:]) + else: + return (word, '') + + +# -------------------------------------------------- +def test_stemmer(): + """test the stemmer""" + + assert stemmer('') == ('', '') + assert stemmer('cake') == ('c', 'ake') + assert stemmer('chair') == ('ch', 'air') + assert stemmer('APPLE') == ('', 'apple') + assert stemmer('RDNZL') == ('rdnzl', '') + + +# -------------------------------------------------- +def read_wordlist(fh): + """Read the wordlist file""" + + return set( + flatten([line.lower().strip().split() for line in fh] if fh else [])) + + +# -------------------------------------------------- +def test_read_wordlist(): + """test""" + + assert read_wordlist(io.StringIO('foo\nbar\nfoo')) == set(['foo', 'bar']) + assert read_wordlist(io.StringIO('foo bar\nbar foo\nfoo')) == set( + ['foo', 'bar']) + + +# -------------------------------------------------- +if __name__ == '__main__': + main() From beea3c90a9c8750c22a244908f8151e901221ce1 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Thu, 2 Apr 2020 11:31:29 -0700 Subject: [PATCH 18/98] whitmans --- extra/09_synthetic_dna/Makefile | 10 -- extra/09_synthetic_dna/README.adoc | 230 ----------------------------- extra/09_synthetic_dna/README.pdf | Bin 122569 -> 0 bytes extra/09_synthetic_dna/test.py | 147 ------------------ extra/10_whitmans/.gitignore | 1 + extra/10_whitmans/Makefile | 29 ++++ extra/10_whitmans/README.adoc | 140 ++++++++++++++++++ extra/10_whitmans/README.pdf | Bin 0 -> 72901 bytes extra/10_whitmans/requirements.txt | 1 + extra/10_whitmans/sampler.py | 87 +++++++++++ extra/10_whitmans/test.py | 134 +++++++++++++++++ 11 files changed, 392 insertions(+), 387 deletions(-) delete mode 100644 extra/09_synthetic_dna/Makefile delete mode 100644 extra/09_synthetic_dna/README.adoc delete mode 100644 extra/09_synthetic_dna/README.pdf delete mode 100755 extra/09_synthetic_dna/test.py create mode 100644 extra/10_whitmans/.gitignore create mode 100644 extra/10_whitmans/Makefile create mode 100644 extra/10_whitmans/README.adoc create mode 100644 extra/10_whitmans/README.pdf create mode 100644 extra/10_whitmans/requirements.txt create mode 100755 extra/10_whitmans/sampler.py create mode 100755 extra/10_whitmans/test.py diff --git a/extra/09_synthetic_dna/Makefile b/extra/09_synthetic_dna/Makefile deleted file mode 100644 index 571de4c81..000000000 --- a/extra/09_synthetic_dna/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -.PHONY: test pdf clean - -pdf: - asciidoctor-pdf README.adoc - -test: - pytest -xv --disable-pytest-warnings test.py - -clean: - rm -rf __pycache__ .pytest diff --git a/extra/09_synthetic_dna/README.adoc b/extra/09_synthetic_dna/README.adoc deleted file mode 100644 index 3fd2434a7..000000000 --- a/extra/09_synthetic_dna/README.adoc +++ /dev/null @@ -1,230 +0,0 @@ -= Creating synthetic DNA/RNA sequences - -In this exercise, you will write a Python program called `moog.py` footnote:[Why "moog"?] that will generate a FASTA-formatted footnote:[https://en.wikipedia.org/wiki/FASTA_format] file of synthetic DNA or RNA. -The program will accept the following optional arguments: - -* `-o`|`--outfile`: The output file to write the sequences (default "out.fa") -* `-t`|`--seqtype`: The sequence type, either `dna` or `rna` (`str`, default "dna") -* `-n`|`--numseqs`: The number of sequences to generate (`int`, default 10) -* `-m`|`--minlen`: The minimum length for any sequence (`int`, default 50) -* `-x`|`--maxlen`: The maximum length for any sequence (`int`, default 75) -* `-p`|`--pctgc`: The average percentage of GC content for a sequence (`float`, default 0.5 or 50%) -* `-s`|`--seed`: An integer value to use for the random seed (`int`, default `None`) so that the random choices of the program can be repeated under testing conditions. - -Here is the usage the program should generate: - ----- -$ ./moog.py -h -usage: moog.py [-h] [-o str] [-t str] [-n int] [-m int] [-x int] [-p float] - [-s int] - -Create synthetic sequences - -optional arguments: - -h, --help show this help message and exit - -o str, --outfile str - Output filename (default: out.fa) - -t str, --seqtype str - DNA or RNA (default: dna) - -n int, --numseqs int - Number of sequences to create (default: 10) - -m int, --minlen int Minimum length (default: 50) - -x int, --maxlen int Maximum length (default: 75) - -p float, --pctgc float - Percent GC (default: 0.5) - -s int, --seed int Random seed (default: None) ----- - -For instance, I can run it to create 3 sequences with the default values, and the program will tell me how many of what kind of sequences were placed into which output file: - ----- -$ ./moog.py -n 3 -s 1 -Done, wrote 3 DNA sequences to "out.fa". ----- - -The output file should be in FASTA format: - -* Each sequence record takes up two lines -* The first line for each sequence record starts with a literal `>` (greater than sign) and is followed by a unique identifier. For this exercise, the ID is not important so numbering the sequences in order is sufficient. -* The second line of a record is the sequence itself. Note that some FASTA formats will limit the length of this line and so may break up the sequence over several lines. This is not necessary. The sequence can be one very long line. If you really want to break the sequence after something like 80 characters, that is fine, too. - -Here is what the output for the above should (might) look like: - ----- -$ cat out.fa ->1 -ATTTGCATAGGAGCAGGACAAAGGGCTCGACTCTTCCGCGCCATGTTGTATCAGAACA ->2 -CCCTTGATCGGCCCGGGGGTACGCATACCGTACAAGCTGGTTAATTACTAAAAATTACTGAAACGGAATGC ->3 -TTCTGTGGGAGTCAGAGACCTATGAAGATTCTAATAGCAGACGCCAAGATCCGCAGCACAT ----- - -== Writing `moog.py` - -The first challenge is to define all your arguments correctly. -Onerous as this is, perhaps 30% of the program is in accepting the arguments correctly! - -Some tips: - -* Be sure to use `choices` for the `seqtype` argument -* Consider using `type=argparse.FileType('wt')` for the `--outfile`. You don't have to do this, but, if you do, then `args.outfile` will be an open, writable file handle! -* You should also manually verify that `pctgc` is between 0 and 1 which can be done with a compound comparison like so: - ----- -args = parser.parse_args() - -if not 0 < args.pctgc < 1: - parser.error(f'--pctgc "{args.pctgc}" must be between 0 and 1') ----- - -You should be sure to set the random seed immediately after accepting the arguments, _before_ you do anything using the `random` module. -Then your program will need to get a "pool" of bases for creating the sequences: - ----- -def main(): - args = get_args() - random.seed(args.seed) - pool = create_pool(args.pctgc, args.maxlen, args.seqtype) ----- - -You can use the following `create_pool` function. -The function accepts three positional arguments: - -. `pctgc`: The average percentage of GC content for each sequence -. `max_len`: The maximum length for any sequence -. `seq_type`: The sequence type, either "rna" or "dna" - ----- -def create_pool(pctgc, max_len, seq_type): - """ Create the pool of bases """ - - t_or_u = 'T' if seq_type == 'dna' else 'U' <1> - num_gc = int((pctgc / 2) * max_len) <2> - num_at = int(((1 - pctgc) / 2) * max_len) <3> - pool = 'A' * num_at + 'C' * num_gc + 'G' * num_gc + t_or_u * num_at <4> - - for _ in range(max_len - len(pool)): <5> - pool += random.choice(pool) - - return ''.join(sorted(pool)) <6> ----- - -<1> Choose either "T" if `seq_type` is "dna" or choose "U" for "rna" -<2> The number of G or C bases is the `pctgc` divided by 2 times the number of bases. -<3> The number of A or T/U bases is the `1 - pctgc` divided by 2 times the number of bases. -<4> The `pool` of bases will be each base in "ACG[TU]" repeated the correct number of times. -<5> Because of rounding issues, we may not actually have enough bases, so pad the pool with random choices from the existing pool (in the hopes this essentially keeps the GC content the same). -<6> Return a sorted string of the bases. - -Here is the test for the function. -Notice how the test also gives us a very clear understanding of how we'll pass in and receive values: - ----- -def test_create_pool(): - """ Test create_pool """ - - state = random.getstate() <1> - random.seed(1) <2> - assert create_pool(.5, 10, 'dna') == 'AAACCCGGTT' - assert create_pool(.6, 11, 'rna') == 'AACCCCGGGUU' - assert create_pool(.7, 12, 'dna') == 'ACCCCCGGGGGT' - assert create_pool(.7, 20, 'rna') == 'AAACCCCCCCGGGGGGGUUU' - assert create_pool(.4, 15, 'dna') == 'AAAACCCGGGTTTTT' - random.setstate(state) <3> ----- - -<1> The state of the `random` module is _global_ to the program. Any change we make here could affect unknown parts of the program, so we save our current state. -<2> Set the random seed to a known value. This is a _global change_ to our program. Any other calls to `random` after this line are affected, even if they are in another function or module! -<3> Reset the global state to the original value. - -With the above functions, your program is essentially left to fill in this: - ----- -def main(): - args = get_args() - random.seed(args.seed) - pool = create_pool(args.pctgc, args.maxlen, args.seqtype) - - for ...: <1> - seq_len = ... <2> - seq = ... <3> - args.outfile.write(...)) <4> - - print(...) <5> ----- - -<1> You need to do this `args.numseqs` times -<2> Use `random.choice` to select a number between `args.minlen` and `arg.maxlen` -<3> Use `random.sample` to select `seq_len` number of bases from the `pool` and make a new `str` for your sequence. -<4> Write the new `seq` to the output file in the FASTA format. -<5> Print the output message. - -== Using the `random` functions - -As noted in the `abuse` chapter, we can use `random.seed` to control the pseudo-random generator in Python. -This allows us to test that our random functions are _reproducible_! -You should set this value before calling any functions in the `random` module. -The default value for your `--seed` parameter should be `None`. -If you set the seed to `None`, it is the same as not setting it at all. -The seed can be a `str` or an `int`, but stick with using an `int` for this exercise. - -For each sequence, you will use `random.randint` to select a length for the sequence between the min/max values: - ----- ->>> import random ->>> min_len = 5 ->>> max_len = 15 ->>> seq_len = random.randint(min_len, max_len) ->>> seq_len -12 ----- - -You will then use this value to select the bases for your new sequence: - ----- ->>> random.sample(pool, seq_len) -['A', 'T', 'A', 'T', 'C', 'C', 'G', 'C', 'G', 'A', 'G', 'T'] ----- - -The output should be written to the output file like so (assuming this is the first sequence): - ----- ->1 -ATATCCGCGAGT ----- - -== Testing - -You may need to install BioPython and numpy in order to run the tests: - ----- -$ python3 -m pip install biopython numpy ----- - -I would recommend you study the `test.py` as it uses the BioPython module to parse the output file your program creates so as to check: - -* that the output file is parsable as FASTA format -* that the output file has the correct number of sequences -* that the sequences lie in the range of min/max lengths -* that the bases are correct for the given sequence type -* that the average GC content of the sequences is close to the value indicated - -Note that BioPython will emit a deprecation warning under `pytest`, so I have added an additional flag `--disable-pytest-warnings` to the `make test` target that you should use: - ----- -$ make test -pytest -xv --disable-pytest-warnings test.py -============================= test session starts ============================== -... -collected 6 items - -test.py::test_exists PASSED [ 16%] -test.py::test_usage PASSED [ 33%] -test.py::test_bad_seqtype PASSED [ 50%] -test.py::test_bad_pctgc PASSED [ 66%] -test.py::test_defaults PASSED [ 83%] -test.py::test_options PASSED [100%] - -========================= 6 passed, 1 warning in 0.87s ========================= ----- diff --git a/extra/09_synthetic_dna/README.pdf b/extra/09_synthetic_dna/README.pdf deleted file mode 100644 index a85250e071afd20e65447ef01273b92b23192d00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122569 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 diff --git a/extra/09_synthetic_dna/test.py b/extra/09_synthetic_dna/test.py deleted file mode 100755 index 3c762de77..000000000 --- a/extra/09_synthetic_dna/test.py +++ /dev/null @@ -1,147 +0,0 @@ -#!/usr/bin/env python3 -"""tests for moog.py""" - -import os -import random -import re -import string -from subprocess import getstatusoutput -from Bio import SeqIO -from Bio.SeqUtils import GC -from numpy import mean -from itertools import chain - -prg = './moog.py' - - -# -------------------------------------------------- -def random_string(): - """generate a random string""" - - return ''.join(random.choices(string.ascii_uppercase + string.digits, k=5)) - - -# -------------------------------------------------- -def test_exists(): - """usage""" - - assert os.path.isfile(prg) - - -# -------------------------------------------------- -def test_usage(): - """usage""" - - for flag in ['-h', '--help']: - rv, out = getstatusoutput('{} {}'.format(prg, flag)) - assert rv == 0 - assert re.match("usage", out, re.IGNORECASE) - - -# -------------------------------------------------- -def test_bad_seqtype(): - """die on bad seqtype""" - - bad = random_string() - rv, out = getstatusoutput(f'{prg} -t {bad}') - assert rv != 0 - assert re.match('usage:', out, re.I) - assert re.search( - f"-t/--seqtype: invalid choice: '{bad}' \(choose from 'dna', 'rna'\)", - out) - - -# -------------------------------------------------- -def test_bad_pctgc(): - """die on bad pctgc""" - - bad = random.randint(1, 10) - rv, out = getstatusoutput(f'{prg} -p {bad}') - assert rv != 0 - assert re.match('usage:', out, re.I) - assert re.search(f'--pctgc "{float(bad)}" must be between 0 and 1', out) - - -# -------------------------------------------------- -def test_defaults(): - """runs on good input""" - - out_file = 'out.fa' - try: - if os.path.isfile(out_file): - os.remove(out_file) - - rv, out = getstatusoutput(prg) - assert rv == 0 - assert out == f'Done, wrote 10 DNA sequences to "{out_file}".' - assert os.path.isfile(out_file) - - # correct number of seqs - seqs = list(SeqIO.parse(out_file, 'fasta')) - assert len(seqs) == 10 - - # the lengths are in the correct range - seq_lens = list(map(lambda seq: len(seq.seq), seqs)) - assert max(seq_lens) <= 75 - assert min(seq_lens) >= 50 - - # bases are correct - bases = ''.join( - sorted( - set(chain(map(lambda seq: ''.join(sorted(set(seq.seq))), - seqs))))) - assert bases == 'ACGT' - - # the pct GC is about right - gc = list(map(lambda seq: GC(seq.seq) / 100, seqs)) - assert .47 <= mean(gc) <= .53 - - finally: - if os.path.isfile(out_file): - os.remove(out_file) - - -# -------------------------------------------------- -def test_options(): - """runs on good input""" - - out_file = random_string() + '.fasta' - try: - if os.path.isfile(out_file): - os.remove(out_file) - - min_len = random.randint(50, 99) - max_len = random.randint(100, 150) - num_seqs = random.randint(100, 150) - pct_gc = random.random() - cmd = (f'{prg} -m {min_len} -x {max_len} -o {out_file} ' - f'-n {num_seqs} -t rna -p {pct_gc:.02f} -s 1') - rv, out = getstatusoutput(cmd) - - assert rv == 0 - assert out == f'Done, wrote {num_seqs} RNA sequences to "{out_file}".' - assert os.path.isfile(out_file) - - # correct number of seqs - seqs = list(SeqIO.parse(out_file, 'fasta')) - assert len(seqs) == num_seqs - - # the lengths are in the correct range - seq_lens = list(map(lambda seq: len(seq.seq), seqs)) - assert max(seq_lens) <= max_len - assert min(seq_lens) >= min_len - - # bases are correct - bases = ''.join( - sorted( - set(chain(map(lambda seq: ''.join(sorted(set(seq.seq))), - seqs))))) - assert bases == 'ACGU' - - # the pct GC is about right - gc = list(map(lambda seq: GC(seq.seq) / 100, seqs)) - assert pct_gc - .3 <= mean(gc) <= pct_gc + .3 - - finally: - if os.path.isfile(out_file): - os.remove(out_file) diff --git a/extra/10_whitmans/.gitignore b/extra/10_whitmans/.gitignore new file mode 100644 index 000000000..98c064568 --- /dev/null +++ b/extra/10_whitmans/.gitignore @@ -0,0 +1 @@ +*.fa diff --git a/extra/10_whitmans/Makefile b/extra/10_whitmans/Makefile new file mode 100644 index 000000000..0ee3866cf --- /dev/null +++ b/extra/10_whitmans/Makefile @@ -0,0 +1,29 @@ +.PHONY = fa clean run pdf + +MOOG = "../08_synthetic_dna/moog.py" + +run: fasta + ./sampler.py *.fa + +test: fasta + pytest --disable-pytest-warnings -xv test.py + +fasta: n1k.fa n10k.fa n100k.fa n1m.fa + +clean: + rm -rf *.fa out __pycache__ + +n1k.fa: + time $(MOOG) -n 1000 -o n1k.fa -t dna -m 75 -x 200 + +n10k.fa: + time $(MOOG) -n 10000 -o n10k.fa -t dna -m 75 -x 200 + +n100k.fa: + time $(MOOG) -n 100000 -o n100k.fa -t dna -m 75 -x 200 + +n1m.fa: + time $(MOOG) -n 1000000 -o n1m.fa -t dna -m 75 -x 200 + +pdf: + asciidoctor-pdf README.adoc diff --git a/extra/10_whitmans/README.adoc b/extra/10_whitmans/README.adoc new file mode 100644 index 000000000..c4070d7d1 --- /dev/null +++ b/extra/10_whitmans/README.adoc @@ -0,0 +1,140 @@ += Randomly Subset a FASTA file + +Write a Python program called `sampler.py` that will probabilistically sample one or more input FASTA files into an output directory. + +The inputs for this program will be generated by your `moog.py` program. +You can run `make fasta` to create files of 1K, 10K, 100K, and 1M reads in this directory. +You can then use these files for testing your program. + +The parameters for your program are: + +* One or more positional FILE arguments +* `-p`|`--pct`: a `float` value between 0 and 1 which is the percentage of reads to take (default `0.1` or 10%) +* `-s`|`--seed`: an `int` value to use for the random seed (default `None`) +* `-o`|`--outdir`: an `str` value to use for the output directory (default `'out'`). You will need to create this directory if it does not exist. Consult your `transcribe.py` program to see how to do that. + +Here is the usage your program should create for `-h` or `--help`: + +---- +$ ./sampler.py -h +usage: sampler.py [-h] [-p reads] [-s seed] [-o DIR] FILE [FILE ...] + +Probabalistically subset FASTA files + +positional arguments: + FILE Input FASTA file(s) + +optional arguments: + -h, --help show this help message and exit + -p reads, --pct reads + Percent of reads (default: 0.1) + -s seed, --seed seed Random seed value (default: None) + -o DIR, --outdir DIR Output directory (default: out) +---- + +When run with the `n1k.fa`, it should print this: + +---- +$ ./sampler.py n1k.fa -s 1 + 1: n1k.fa +Wrote 95 sequences from 1 file to directory "out" +---- + +Here is an example of the output for multiple files: + +---- +$ ./sampler.py -p .25 -s 4 n1k.fa n10k.fa n100k.fa -o sampled + 1: n1k.fa + 2: n10k.fa + 3: n100k.fa +Wrote 27,688 sequences from 3 files to directory "sampled" +---- + +To parse the FASTA files, you will need to add this import statement: + +---- +from Bio import SeqIO +---- + +If you have not already install BioPython, you will need to do so: + +---- +$ python3 -m pip install biopython +---- + +Or run: + +---- +$ python3 -m pip install -r requirements.txt +---- + +Here is the basic structure for your program: + +---- +def main(): + args = get_args() + random.seed(args.seed) # <1> + + for fh in ...: # <2> + basename = os.path.basename(fh.name) # <3> + out_file = os.path.join(args.outdir, basename) # <4> + print(...) # <5> + + out_fh = ... # <6> + for rec in SeqIO.parse(fh, 'fasta'): # <7> + if ...: # <8> + SeqIO.write(rec, out_fh, 'fasta') # <9> + + out_fh.close() # <10> + + print(...) # <11> +---- + +<1> Set your random seed right away. +<2> Iterate over the input file handles. Consider using the `enumerate()` function to get both the index and the value for the file handles. +<3> You'll need the `os.path.basename()` to construct the output path. +<4> The output file is the `basename` plus the output directory. +<5> Update the user on the progress. +<6> You'll need a file handle for writing the output. +<7> Use the `SeqIO.parse()` function to parse the file handle's contents in FASTA format. Each `rec` is an object representing a sequence in the file. +<8> Use `random.random()` in conjunction with `args.pct` to decide whether to take this sequence. +<9> Write the sequence to the output file handle in FASTA format. +<10> Close the output file handle. +<11> Print a summary of how many sequences in how many files were written to what directory. + +The `enumerate` function will give you both the index and value of elements in a sequence: + +---- +>>> list(enumerate('abc')) +[(0, 'a'), (1, 'b'), (2, 'c')] +---- + +You can start counting at a number other than 0! + +---- +>>> for i, letter in enumerate('abc', start=1): +... print(f'{i:3}: {letter}') +... + 1: a + 2: b + 3: c +---- + +All tests should pass: + +---- +$ make test +pytest --disable-pytest-warnings -xv test.py +============================= test session starts ============================== +... +collected 6 items + +test.py::test_exists PASSED [ 16%] +test.py::test_usage PASSED [ 33%] +test.py::test_bad_file PASSED [ 50%] +test.py::test_bad_pct PASSED [ 66%] +test.py::test_defaults PASSED [ 83%] +test.py::test_options PASSED [100%] + +========================= 6 passed, 1 warning in 2.23s ========================= +---- diff --git a/extra/10_whitmans/README.pdf b/extra/10_whitmans/README.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b02afa4df02f9d9a72faba656148385456da47e8 GIT binary patch literal 72901 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 Date: Thu, 2 Apr 2020 11:32:08 -0700 Subject: [PATCH 19/98] moog --- extra/09_moog/Makefile | 10 ++ extra/09_moog/README.adoc | 230 ++++++++++++++++++++++++++++++++++++++ extra/09_moog/README.pdf | Bin 0 -> 122569 bytes extra/09_moog/test.py | 147 ++++++++++++++++++++++++ 4 files changed, 387 insertions(+) create mode 100644 extra/09_moog/Makefile create mode 100644 extra/09_moog/README.adoc create mode 100644 extra/09_moog/README.pdf create mode 100755 extra/09_moog/test.py diff --git a/extra/09_moog/Makefile b/extra/09_moog/Makefile new file mode 100644 index 000000000..571de4c81 --- /dev/null +++ b/extra/09_moog/Makefile @@ -0,0 +1,10 @@ +.PHONY: test pdf clean + +pdf: + asciidoctor-pdf README.adoc + +test: + pytest -xv --disable-pytest-warnings test.py + +clean: + rm -rf __pycache__ .pytest diff --git a/extra/09_moog/README.adoc b/extra/09_moog/README.adoc new file mode 100644 index 000000000..3fd2434a7 --- /dev/null +++ b/extra/09_moog/README.adoc @@ -0,0 +1,230 @@ += Creating synthetic DNA/RNA sequences + +In this exercise, you will write a Python program called `moog.py` footnote:[Why "moog"?] that will generate a FASTA-formatted footnote:[https://en.wikipedia.org/wiki/FASTA_format] file of synthetic DNA or RNA. +The program will accept the following optional arguments: + +* `-o`|`--outfile`: The output file to write the sequences (default "out.fa") +* `-t`|`--seqtype`: The sequence type, either `dna` or `rna` (`str`, default "dna") +* `-n`|`--numseqs`: The number of sequences to generate (`int`, default 10) +* `-m`|`--minlen`: The minimum length for any sequence (`int`, default 50) +* `-x`|`--maxlen`: The maximum length for any sequence (`int`, default 75) +* `-p`|`--pctgc`: The average percentage of GC content for a sequence (`float`, default 0.5 or 50%) +* `-s`|`--seed`: An integer value to use for the random seed (`int`, default `None`) so that the random choices of the program can be repeated under testing conditions. + +Here is the usage the program should generate: + +---- +$ ./moog.py -h +usage: moog.py [-h] [-o str] [-t str] [-n int] [-m int] [-x int] [-p float] + [-s int] + +Create synthetic sequences + +optional arguments: + -h, --help show this help message and exit + -o str, --outfile str + Output filename (default: out.fa) + -t str, --seqtype str + DNA or RNA (default: dna) + -n int, --numseqs int + Number of sequences to create (default: 10) + -m int, --minlen int Minimum length (default: 50) + -x int, --maxlen int Maximum length (default: 75) + -p float, --pctgc float + Percent GC (default: 0.5) + -s int, --seed int Random seed (default: None) +---- + +For instance, I can run it to create 3 sequences with the default values, and the program will tell me how many of what kind of sequences were placed into which output file: + +---- +$ ./moog.py -n 3 -s 1 +Done, wrote 3 DNA sequences to "out.fa". +---- + +The output file should be in FASTA format: + +* Each sequence record takes up two lines +* The first line for each sequence record starts with a literal `>` (greater than sign) and is followed by a unique identifier. For this exercise, the ID is not important so numbering the sequences in order is sufficient. +* The second line of a record is the sequence itself. Note that some FASTA formats will limit the length of this line and so may break up the sequence over several lines. This is not necessary. The sequence can be one very long line. If you really want to break the sequence after something like 80 characters, that is fine, too. + +Here is what the output for the above should (might) look like: + +---- +$ cat out.fa +>1 +ATTTGCATAGGAGCAGGACAAAGGGCTCGACTCTTCCGCGCCATGTTGTATCAGAACA +>2 +CCCTTGATCGGCCCGGGGGTACGCATACCGTACAAGCTGGTTAATTACTAAAAATTACTGAAACGGAATGC +>3 +TTCTGTGGGAGTCAGAGACCTATGAAGATTCTAATAGCAGACGCCAAGATCCGCAGCACAT +---- + +== Writing `moog.py` + +The first challenge is to define all your arguments correctly. +Onerous as this is, perhaps 30% of the program is in accepting the arguments correctly! + +Some tips: + +* Be sure to use `choices` for the `seqtype` argument +* Consider using `type=argparse.FileType('wt')` for the `--outfile`. You don't have to do this, but, if you do, then `args.outfile` will be an open, writable file handle! +* You should also manually verify that `pctgc` is between 0 and 1 which can be done with a compound comparison like so: + +---- +args = parser.parse_args() + +if not 0 < args.pctgc < 1: + parser.error(f'--pctgc "{args.pctgc}" must be between 0 and 1') +---- + +You should be sure to set the random seed immediately after accepting the arguments, _before_ you do anything using the `random` module. +Then your program will need to get a "pool" of bases for creating the sequences: + +---- +def main(): + args = get_args() + random.seed(args.seed) + pool = create_pool(args.pctgc, args.maxlen, args.seqtype) +---- + +You can use the following `create_pool` function. +The function accepts three positional arguments: + +. `pctgc`: The average percentage of GC content for each sequence +. `max_len`: The maximum length for any sequence +. `seq_type`: The sequence type, either "rna" or "dna" + +---- +def create_pool(pctgc, max_len, seq_type): + """ Create the pool of bases """ + + t_or_u = 'T' if seq_type == 'dna' else 'U' <1> + num_gc = int((pctgc / 2) * max_len) <2> + num_at = int(((1 - pctgc) / 2) * max_len) <3> + pool = 'A' * num_at + 'C' * num_gc + 'G' * num_gc + t_or_u * num_at <4> + + for _ in range(max_len - len(pool)): <5> + pool += random.choice(pool) + + return ''.join(sorted(pool)) <6> +---- + +<1> Choose either "T" if `seq_type` is "dna" or choose "U" for "rna" +<2> The number of G or C bases is the `pctgc` divided by 2 times the number of bases. +<3> The number of A or T/U bases is the `1 - pctgc` divided by 2 times the number of bases. +<4> The `pool` of bases will be each base in "ACG[TU]" repeated the correct number of times. +<5> Because of rounding issues, we may not actually have enough bases, so pad the pool with random choices from the existing pool (in the hopes this essentially keeps the GC content the same). +<6> Return a sorted string of the bases. + +Here is the test for the function. +Notice how the test also gives us a very clear understanding of how we'll pass in and receive values: + +---- +def test_create_pool(): + """ Test create_pool """ + + state = random.getstate() <1> + random.seed(1) <2> + assert create_pool(.5, 10, 'dna') == 'AAACCCGGTT' + assert create_pool(.6, 11, 'rna') == 'AACCCCGGGUU' + assert create_pool(.7, 12, 'dna') == 'ACCCCCGGGGGT' + assert create_pool(.7, 20, 'rna') == 'AAACCCCCCCGGGGGGGUUU' + assert create_pool(.4, 15, 'dna') == 'AAAACCCGGGTTTTT' + random.setstate(state) <3> +---- + +<1> The state of the `random` module is _global_ to the program. Any change we make here could affect unknown parts of the program, so we save our current state. +<2> Set the random seed to a known value. This is a _global change_ to our program. Any other calls to `random` after this line are affected, even if they are in another function or module! +<3> Reset the global state to the original value. + +With the above functions, your program is essentially left to fill in this: + +---- +def main(): + args = get_args() + random.seed(args.seed) + pool = create_pool(args.pctgc, args.maxlen, args.seqtype) + + for ...: <1> + seq_len = ... <2> + seq = ... <3> + args.outfile.write(...)) <4> + + print(...) <5> +---- + +<1> You need to do this `args.numseqs` times +<2> Use `random.choice` to select a number between `args.minlen` and `arg.maxlen` +<3> Use `random.sample` to select `seq_len` number of bases from the `pool` and make a new `str` for your sequence. +<4> Write the new `seq` to the output file in the FASTA format. +<5> Print the output message. + +== Using the `random` functions + +As noted in the `abuse` chapter, we can use `random.seed` to control the pseudo-random generator in Python. +This allows us to test that our random functions are _reproducible_! +You should set this value before calling any functions in the `random` module. +The default value for your `--seed` parameter should be `None`. +If you set the seed to `None`, it is the same as not setting it at all. +The seed can be a `str` or an `int`, but stick with using an `int` for this exercise. + +For each sequence, you will use `random.randint` to select a length for the sequence between the min/max values: + +---- +>>> import random +>>> min_len = 5 +>>> max_len = 15 +>>> seq_len = random.randint(min_len, max_len) +>>> seq_len +12 +---- + +You will then use this value to select the bases for your new sequence: + +---- +>>> random.sample(pool, seq_len) +['A', 'T', 'A', 'T', 'C', 'C', 'G', 'C', 'G', 'A', 'G', 'T'] +---- + +The output should be written to the output file like so (assuming this is the first sequence): + +---- +>1 +ATATCCGCGAGT +---- + +== Testing + +You may need to install BioPython and numpy in order to run the tests: + +---- +$ python3 -m pip install biopython numpy +---- + +I would recommend you study the `test.py` as it uses the BioPython module to parse the output file your program creates so as to check: + +* that the output file is parsable as FASTA format +* that the output file has the correct number of sequences +* that the sequences lie in the range of min/max lengths +* that the bases are correct for the given sequence type +* that the average GC content of the sequences is close to the value indicated + +Note that BioPython will emit a deprecation warning under `pytest`, so I have added an additional flag `--disable-pytest-warnings` to the `make test` target that you should use: + +---- +$ make test +pytest -xv --disable-pytest-warnings test.py +============================= test session starts ============================== +... +collected 6 items + +test.py::test_exists PASSED [ 16%] +test.py::test_usage PASSED [ 33%] +test.py::test_bad_seqtype PASSED [ 50%] +test.py::test_bad_pctgc PASSED [ 66%] +test.py::test_defaults PASSED [ 83%] +test.py::test_options PASSED [100%] + +========================= 6 passed, 1 warning in 0.87s ========================= +---- diff --git a/extra/09_moog/README.pdf b/extra/09_moog/README.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a85250e071afd20e65447ef01273b92b23192d00 GIT binary patch literal 122569 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 literal 0 HcmV?d00001 diff --git a/extra/09_moog/test.py b/extra/09_moog/test.py new file mode 100755 index 000000000..3c762de77 --- /dev/null +++ b/extra/09_moog/test.py @@ -0,0 +1,147 @@ +#!/usr/bin/env python3 +"""tests for moog.py""" + +import os +import random +import re +import string +from subprocess import getstatusoutput +from Bio import SeqIO +from Bio.SeqUtils import GC +from numpy import mean +from itertools import chain + +prg = './moog.py' + + +# -------------------------------------------------- +def random_string(): + """generate a random string""" + + return ''.join(random.choices(string.ascii_uppercase + string.digits, k=5)) + + +# -------------------------------------------------- +def test_exists(): + """usage""" + + assert os.path.isfile(prg) + + +# -------------------------------------------------- +def test_usage(): + """usage""" + + for flag in ['-h', '--help']: + rv, out = getstatusoutput('{} {}'.format(prg, flag)) + assert rv == 0 + assert re.match("usage", out, re.IGNORECASE) + + +# -------------------------------------------------- +def test_bad_seqtype(): + """die on bad seqtype""" + + bad = random_string() + rv, out = getstatusoutput(f'{prg} -t {bad}') + assert rv != 0 + assert re.match('usage:', out, re.I) + assert re.search( + f"-t/--seqtype: invalid choice: '{bad}' \(choose from 'dna', 'rna'\)", + out) + + +# -------------------------------------------------- +def test_bad_pctgc(): + """die on bad pctgc""" + + bad = random.randint(1, 10) + rv, out = getstatusoutput(f'{prg} -p {bad}') + assert rv != 0 + assert re.match('usage:', out, re.I) + assert re.search(f'--pctgc "{float(bad)}" must be between 0 and 1', out) + + +# -------------------------------------------------- +def test_defaults(): + """runs on good input""" + + out_file = 'out.fa' + try: + if os.path.isfile(out_file): + os.remove(out_file) + + rv, out = getstatusoutput(prg) + assert rv == 0 + assert out == f'Done, wrote 10 DNA sequences to "{out_file}".' + assert os.path.isfile(out_file) + + # correct number of seqs + seqs = list(SeqIO.parse(out_file, 'fasta')) + assert len(seqs) == 10 + + # the lengths are in the correct range + seq_lens = list(map(lambda seq: len(seq.seq), seqs)) + assert max(seq_lens) <= 75 + assert min(seq_lens) >= 50 + + # bases are correct + bases = ''.join( + sorted( + set(chain(map(lambda seq: ''.join(sorted(set(seq.seq))), + seqs))))) + assert bases == 'ACGT' + + # the pct GC is about right + gc = list(map(lambda seq: GC(seq.seq) / 100, seqs)) + assert .47 <= mean(gc) <= .53 + + finally: + if os.path.isfile(out_file): + os.remove(out_file) + + +# -------------------------------------------------- +def test_options(): + """runs on good input""" + + out_file = random_string() + '.fasta' + try: + if os.path.isfile(out_file): + os.remove(out_file) + + min_len = random.randint(50, 99) + max_len = random.randint(100, 150) + num_seqs = random.randint(100, 150) + pct_gc = random.random() + cmd = (f'{prg} -m {min_len} -x {max_len} -o {out_file} ' + f'-n {num_seqs} -t rna -p {pct_gc:.02f} -s 1') + rv, out = getstatusoutput(cmd) + + assert rv == 0 + assert out == f'Done, wrote {num_seqs} RNA sequences to "{out_file}".' + assert os.path.isfile(out_file) + + # correct number of seqs + seqs = list(SeqIO.parse(out_file, 'fasta')) + assert len(seqs) == num_seqs + + # the lengths are in the correct range + seq_lens = list(map(lambda seq: len(seq.seq), seqs)) + assert max(seq_lens) <= max_len + assert min(seq_lens) >= min_len + + # bases are correct + bases = ''.join( + sorted( + set(chain(map(lambda seq: ''.join(sorted(set(seq.seq))), + seqs))))) + assert bases == 'ACGU' + + # the pct GC is about right + gc = list(map(lambda seq: GC(seq.seq) / 100, seqs)) + assert pct_gc - .3 <= mean(gc) <= pct_gc + .3 + + finally: + if os.path.isfile(out_file): + os.remove(out_file) From 3505355a1eda659a802f45ab99344f4b3d6c11a6 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Sat, 4 Apr 2020 12:34:29 -0700 Subject: [PATCH 20/98] renaming --- 08_apples_and_bananas/solution0.py | 57 ------------------- ...olution1.py => solution1_iterate_chars.py} | 0 ...{solution2.py => solution2_str_replace.py} | 0 ...olution3.py => solution3_str_translate.py} | 0 ...on4.py => solution4_list_comprehension.py} | 0 ...on5.py => solution5_list_comp_function.py} | 0 .../{solution6.py => solution6_map_lambda.py} | 0 ...solution7.py => solution7_map_function.py} | 0 .../{solution8.py => solution8_regex.py} | 0 9 files changed, 57 deletions(-) delete mode 100755 08_apples_and_bananas/solution0.py rename 08_apples_and_bananas/{solution1.py => solution1_iterate_chars.py} (100%) rename 08_apples_and_bananas/{solution2.py => solution2_str_replace.py} (100%) rename 08_apples_and_bananas/{solution3.py => solution3_str_translate.py} (100%) rename 08_apples_and_bananas/{solution4.py => solution4_list_comprehension.py} (100%) rename 08_apples_and_bananas/{solution5.py => solution5_list_comp_function.py} (100%) rename 08_apples_and_bananas/{solution6.py => solution6_map_lambda.py} (100%) rename 08_apples_and_bananas/{solution7.py => solution7_map_function.py} (100%) rename 08_apples_and_bananas/{solution8.py => solution8_regex.py} (100%) diff --git a/08_apples_and_bananas/solution0.py b/08_apples_and_bananas/solution0.py deleted file mode 100755 index 0413868ec..000000000 --- a/08_apples_and_bananas/solution0.py +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env python3 -""" -Author : Ken Youens-Clark -Date : 2020-03-24 -Purpose: Rock the Casbah -""" - -import argparse -import os -import sys - - -# -------------------------------------------------- -def get_args(): - """Get command-line arguments""" - - parser = argparse.ArgumentParser( - description='Rock the Casbah', - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - - parser.add_argument('text', - metavar='str', - help='Input text') - - parser.add_argument('-v', - '--vowel', - help='The vowel', - metavar='str', - type=str, - choices=list('aeiou'), - default='a') - - args = parser.parse_args() - - if os.path.isfile(args.text): - args.text = open(args.text).read().rstrip() - - return args - - -# -------------------------------------------------- -def main(): - """Make a jazz noise here""" - - args = get_args() - text = args.text - vowel = args.vowel - - for v in 'aeiou': - text = text.replace(v, vowel) - text = text.replace(v.upper(), vowel.upper()) - - print(text) - -# -------------------------------------------------- -if __name__ == '__main__': - main() diff --git a/08_apples_and_bananas/solution1.py b/08_apples_and_bananas/solution1_iterate_chars.py similarity index 100% rename from 08_apples_and_bananas/solution1.py rename to 08_apples_and_bananas/solution1_iterate_chars.py diff --git a/08_apples_and_bananas/solution2.py b/08_apples_and_bananas/solution2_str_replace.py similarity index 100% rename from 08_apples_and_bananas/solution2.py rename to 08_apples_and_bananas/solution2_str_replace.py diff --git a/08_apples_and_bananas/solution3.py b/08_apples_and_bananas/solution3_str_translate.py similarity index 100% rename from 08_apples_and_bananas/solution3.py rename to 08_apples_and_bananas/solution3_str_translate.py diff --git a/08_apples_and_bananas/solution4.py b/08_apples_and_bananas/solution4_list_comprehension.py similarity index 100% rename from 08_apples_and_bananas/solution4.py rename to 08_apples_and_bananas/solution4_list_comprehension.py diff --git a/08_apples_and_bananas/solution5.py b/08_apples_and_bananas/solution5_list_comp_function.py similarity index 100% rename from 08_apples_and_bananas/solution5.py rename to 08_apples_and_bananas/solution5_list_comp_function.py diff --git a/08_apples_and_bananas/solution6.py b/08_apples_and_bananas/solution6_map_lambda.py similarity index 100% rename from 08_apples_and_bananas/solution6.py rename to 08_apples_and_bananas/solution6_map_lambda.py diff --git a/08_apples_and_bananas/solution7.py b/08_apples_and_bananas/solution7_map_function.py similarity index 100% rename from 08_apples_and_bananas/solution7.py rename to 08_apples_and_bananas/solution7_map_function.py diff --git a/08_apples_and_bananas/solution8.py b/08_apples_and_bananas/solution8_regex.py similarity index 100% rename from 08_apples_and_bananas/solution8.py rename to 08_apples_and_bananas/solution8_regex.py From e128d5119be1269aef17ab9ca3528decdc4302ad Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Sat, 4 Apr 2020 16:09:47 -0700 Subject: [PATCH 21/98] renamed --- 14_rhymer/{solution1.py => solution1_regex.py} | 0 14_rhymer/{solution2.py => solution2_no_regex.py} | 8 +++----- 14_rhymer/solution3_dict_words.py | 2 -- 3 files changed, 3 insertions(+), 7 deletions(-) rename 14_rhymer/{solution1.py => solution1_regex.py} (100%) rename 14_rhymer/{solution2.py => solution2_no_regex.py} (91%) diff --git a/14_rhymer/solution1.py b/14_rhymer/solution1_regex.py similarity index 100% rename from 14_rhymer/solution1.py rename to 14_rhymer/solution1_regex.py diff --git a/14_rhymer/solution2.py b/14_rhymer/solution2_no_regex.py similarity index 91% rename from 14_rhymer/solution2.py rename to 14_rhymer/solution2_no_regex.py index 464474a12..f8983f1eb 100755 --- a/14_rhymer/solution2.py +++ b/14_rhymer/solution2_no_regex.py @@ -2,8 +2,6 @@ """Make rhyming words""" import argparse -import re -import string # -------------------------------------------------- @@ -41,9 +39,9 @@ def stemmer(word): """Return leading consonants (if any), and 'stem' of word""" word = word.lower() - pos = list( - filter(lambda v: v >= 0, - map(lambda c: word.index(c) if c in word else -1, 'aeiou'))) + vowel_map = map(lambda c: word.index(c) if c in word else -1, 'aeiou') + pos = list(filter(lambda v: v >= 0, vowel_map)) + if pos: first = min(pos) return (word[:first], word[first:]) diff --git a/14_rhymer/solution3_dict_words.py b/14_rhymer/solution3_dict_words.py index f194baa8b..7b5c2429d 100755 --- a/14_rhymer/solution3_dict_words.py +++ b/14_rhymer/solution3_dict_words.py @@ -3,8 +3,6 @@ import argparse import io -import re -import string from pydash import flatten From 9fe59fad7deff6a2eebdf58d7653150ce99a3efb Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Mon, 6 Apr 2020 07:51:34 -0700 Subject: [PATCH 22/98] rename --- 15_kentucky_friar/{solution1.py => solution1_regex.py} | 2 +- 15_kentucky_friar/{solution2.py => solution2_no_regex.py} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename 15_kentucky_friar/{solution1.py => solution1_regex.py} (95%) rename 15_kentucky_friar/{solution2.py => solution2_no_regex.py} (95%) diff --git a/15_kentucky_friar/solution1.py b/15_kentucky_friar/solution1_regex.py similarity index 95% rename from 15_kentucky_friar/solution1.py rename to 15_kentucky_friar/solution1_regex.py index 0ad7592e3..51fdb769e 100755 --- a/15_kentucky_friar/solution1.py +++ b/15_kentucky_friar/solution1_regex.py @@ -14,7 +14,7 @@ def get_args(): description='Southern fry text', formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument('text', metavar='str', help='Input text or file') + parser.add_argument('text', metavar='text', help='Input text or file') args = parser.parse_args() diff --git a/15_kentucky_friar/solution2.py b/15_kentucky_friar/solution2_no_regex.py similarity index 95% rename from 15_kentucky_friar/solution2.py rename to 15_kentucky_friar/solution2_no_regex.py index c3b55ae38..cfd308616 100755 --- a/15_kentucky_friar/solution2.py +++ b/15_kentucky_friar/solution2_no_regex.py @@ -14,7 +14,7 @@ def get_args(): description='Southern fry text', formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument('text', metavar='str', help='Input text or file') + parser.add_argument('text', metavar='text', help='Input text or file') args = parser.parse_args() From c2cc42c00b2325161cc3a9192075b1615a365e76 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Mon, 6 Apr 2020 10:15:27 -0700 Subject: [PATCH 23/98] better metavar --- 11_bottles_of_beer/solution.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/11_bottles_of_beer/solution.py b/11_bottles_of_beer/solution.py index 8dd2c90bc..9031872cd 100755 --- a/11_bottles_of_beer/solution.py +++ b/11_bottles_of_beer/solution.py @@ -14,7 +14,7 @@ def get_args(): parser.add_argument('-n', '--num', - metavar='int', + metavar='number', type=int, default=10, help='How many bottles') From 1c21ca6b0be4a6643bc6c67abdbde01aa907363d Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Mon, 6 Apr 2020 10:16:31 -0700 Subject: [PATCH 24/98] fixes per mat --- 17_mad_libs/{solution1.py => solution1_regex.py} | 2 +- 17_mad_libs/{solution2.py => solution2_no_regex.py} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename 17_mad_libs/{solution1.py => solution1_regex.py} (97%) rename 17_mad_libs/{solution2.py => solution2_no_regex.py} (100%) diff --git a/17_mad_libs/solution1.py b/17_mad_libs/solution1_regex.py similarity index 97% rename from 17_mad_libs/solution1.py rename to 17_mad_libs/solution1_regex.py index c41b8df61..d59bab18a 100755 --- a/17_mad_libs/solution1.py +++ b/17_mad_libs/solution1_regex.py @@ -22,7 +22,7 @@ def get_args(): parser.add_argument('-i', '--inputs', help='Inputs (for testing)', - metavar='str', + metavar='input', type=str, nargs='*') diff --git a/17_mad_libs/solution2.py b/17_mad_libs/solution2_no_regex.py similarity index 100% rename from 17_mad_libs/solution2.py rename to 17_mad_libs/solution2_no_regex.py From 21bb83321cb7ee9408e067ff76ce0831e4a76a35 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Mon, 6 Apr 2020 10:17:48 -0700 Subject: [PATCH 25/98] better metavar, consistent regex syntax --- 18_gematria/solution.py | 4 ++-- 18_gematria/words.txt | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 18_gematria/words.txt diff --git a/18_gematria/solution.py b/18_gematria/solution.py index e5ca88ea5..4e16bff83 100755 --- a/18_gematria/solution.py +++ b/18_gematria/solution.py @@ -14,7 +14,7 @@ def get_args(): description='Gematria', formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument('text', metavar='str', help='Input text or file') + parser.add_argument('text', metavar='text', help='Input text or file') args = parser.parse_args() @@ -38,7 +38,7 @@ def main(): def word2num(word): """Sum the ordinal values of all the characters""" - return str(sum(map(ord, re.sub('[^a-zA-Z0-9]', '', word)))) + return str(sum(map(ord, re.sub('[^A-Za-z0-9]', '', word)))) # -------------------------------------------------- diff --git a/18_gematria/words.txt b/18_gematria/words.txt new file mode 100644 index 000000000..963d7efcc --- /dev/null +++ b/18_gematria/words.txt @@ -0,0 +1,6 @@ +banana +Apple +Cherry +anchovies +cabbage +Beets From 29fb393790396c0db53b9f13afd7ceaa7fd58c5d Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Mon, 6 Apr 2020 10:52:59 -0700 Subject: [PATCH 26/98] better error --- 11_bottles_of_beer/test.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/11_bottles_of_beer/test.py b/11_bottles_of_beer/test.py index 5336fb807..54103c808 100755 --- a/11_bottles_of_beer/test.py +++ b/11_bottles_of_beer/test.py @@ -31,9 +31,10 @@ def test_usage(): def test_bad_int(): """Bad integer value""" - rv, out = getstatusoutput(f'{prg} -n -1') + bad = random.randint(-10, -1) + rv, out = getstatusoutput(f'{prg} -n {bad}') assert rv != 0 - assert re.search(r'--num \(-1\) must > 0', out) + assert re.search(f'--num "{bad}" must be greater than 0', out) # -------------------------------------------------- From 5de6e67d76099003120dd55d659ff59fa8e202b1 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Mon, 6 Apr 2020 11:54:27 -0700 Subject: [PATCH 27/98] renamed solutions, reorg code --- 12_ransom/solution1_for_loop.py | 70 +++++++++++++++++++++++ 12_ransom/solution2_for_append_list.py | 70 +++++++++++++++++++++++ 12_ransom/solution3_for_append_string.py | 70 +++++++++++++++++++++++ 12_ransom/solution4_list_comprehension.py | 67 ++++++++++++++++++++++ 12_ransom/solution5_shorter_list_comp.py | 66 +++++++++++++++++++++ 12_ransom/solution6_map.py | 67 ++++++++++++++++++++++ 12_ransom/solution7_shorter_map.py | 66 +++++++++++++++++++++ 7 files changed, 476 insertions(+) create mode 100755 12_ransom/solution1_for_loop.py create mode 100755 12_ransom/solution2_for_append_list.py create mode 100755 12_ransom/solution3_for_append_string.py create mode 100755 12_ransom/solution4_list_comprehension.py create mode 100755 12_ransom/solution5_shorter_list_comp.py create mode 100755 12_ransom/solution6_map.py create mode 100755 12_ransom/solution7_shorter_map.py diff --git a/12_ransom/solution1_for_loop.py b/12_ransom/solution1_for_loop.py new file mode 100755 index 000000000..99d77b7f0 --- /dev/null +++ b/12_ransom/solution1_for_loop.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 +"""Ransom note""" + +import argparse +import os +import random + + +# -------------------------------------------------- +def get_args(): + """Get command-line arguments""" + + parser = argparse.ArgumentParser( + description='Ransom Note', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('text', metavar='text', help='Input text or file') + + parser.add_argument('-s', + '--seed', + help='Random seed', + metavar='int', + type=int, + default=None) + + args = parser.parse_args() + + if os.path.isfile(args.text): + args.text = open(args.text).read().rstrip() + + return args + + +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + random.seed(args.seed) + + # Method 1: Iterate each character, add to list + ransom = [] + for char in args.text: + ransom.append(choose(char)) + + print(''.join(ransom)) + + +# -------------------------------------------------- +def choose(char): + """Randomly choose an upper or lowercase letter to return""" + + return char.upper() if random.choice([0, 1]) else char.lower() + + +# -------------------------------------------------- +def test_choose(): + """Test choose""" + + random.seed(1) + assert choose('a') == 'a' + assert choose('b') == 'b' + assert choose('c') == 'C' + assert choose('d') == 'd' + random.seed(None) + + +# -------------------------------------------------- +if __name__ == '__main__': + main() diff --git a/12_ransom/solution2_for_append_list.py b/12_ransom/solution2_for_append_list.py new file mode 100755 index 000000000..a4d7aaae7 --- /dev/null +++ b/12_ransom/solution2_for_append_list.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 +"""Ransom note""" + +import argparse +import os +import random + + +# -------------------------------------------------- +def get_args(): + """Get command-line arguments""" + + parser = argparse.ArgumentParser( + description='Ransom Note', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('text', metavar='text', help='Input text or file') + + parser.add_argument('-s', + '--seed', + help='Random seed', + metavar='int', + type=int, + default=None) + + args = parser.parse_args() + + if os.path.isfile(args.text): + args.text = open(args.text).read().rstrip() + + return args + + +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + random.seed(args.seed) + + # Method 2: Iterate each character, add to a list + ransom = [] + for char in args.text: + ransom += choose(char) + + print(''.join(ransom)) + + +# -------------------------------------------------- +def choose(char): + """Randomly choose an upper or lowercase letter to return""" + + return char.upper() if random.choice([0, 1]) else char.lower() + + +# -------------------------------------------------- +def test_choose(): + """Test choose""" + + random.seed(1) + assert choose('a') == 'a' + assert choose('b') == 'b' + assert choose('c') == 'C' + assert choose('d') == 'd' + random.seed(None) + + +# -------------------------------------------------- +if __name__ == '__main__': + main() diff --git a/12_ransom/solution3_for_append_string.py b/12_ransom/solution3_for_append_string.py new file mode 100755 index 000000000..e7696822b --- /dev/null +++ b/12_ransom/solution3_for_append_string.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 +"""Ransom note""" + +import argparse +import os +import random + + +# -------------------------------------------------- +def get_args(): + """Get command-line arguments""" + + parser = argparse.ArgumentParser( + description='Ransom Note', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('text', metavar='text', help='Input text or file') + + parser.add_argument('-s', + '--seed', + help='Random seed', + metavar='int', + type=int, + default=None) + + args = parser.parse_args() + + if os.path.isfile(args.text): + args.text = open(args.text).read().rstrip() + + return args + + +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + random.seed(args.seed) + + # Method 3: Iterate each character, add to a str + ransom = '' + for char in args.text: + ransom += choose(char) + + print(''.join(ransom)) + + +# -------------------------------------------------- +def choose(char): + """Randomly choose an upper or lowercase letter to return""" + + return char.upper() if random.choice([0, 1]) else char.lower() + + +# -------------------------------------------------- +def test_choose(): + """Test choose""" + + random.seed(1) + assert choose('a') == 'a' + assert choose('b') == 'b' + assert choose('c') == 'C' + assert choose('d') == 'd' + random.seed(None) + + +# -------------------------------------------------- +if __name__ == '__main__': + main() diff --git a/12_ransom/solution4_list_comprehension.py b/12_ransom/solution4_list_comprehension.py new file mode 100755 index 000000000..104f9b5ef --- /dev/null +++ b/12_ransom/solution4_list_comprehension.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +"""Ransom note""" + +import argparse +import os +import random + + +# -------------------------------------------------- +def get_args(): + """Get command-line arguments""" + + parser = argparse.ArgumentParser( + description='Ransom Note', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('text', metavar='text', help='Input text or file') + + parser.add_argument('-s', + '--seed', + help='Random seed', + metavar='int', + type=int, + default=None) + + args = parser.parse_args() + + if os.path.isfile(args.text): + args.text = open(args.text).read().rstrip() + + return args + + +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + random.seed(args.seed) + + # Method 4: List comprehension + ransom = [choose(char) for char in args.text] + print(''.join(ransom)) + + +# -------------------------------------------------- +def choose(char): + """Randomly choose an upper or lowercase letter to return""" + + return char.upper() if random.choice([0, 1]) else char.lower() + + +# -------------------------------------------------- +def test_choose(): + """Test choose""" + + random.seed(1) + assert choose('a') == 'a' + assert choose('b') == 'b' + assert choose('c') == 'C' + assert choose('d') == 'd' + random.seed(None) + + +# -------------------------------------------------- +if __name__ == '__main__': + main() diff --git a/12_ransom/solution5_shorter_list_comp.py b/12_ransom/solution5_shorter_list_comp.py new file mode 100755 index 000000000..fada15a0f --- /dev/null +++ b/12_ransom/solution5_shorter_list_comp.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 +"""Ransom note""" + +import argparse +import os +import random + + +# -------------------------------------------------- +def get_args(): + """Get command-line arguments""" + + parser = argparse.ArgumentParser( + description='Ransom Note', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('text', metavar='text', help='Input text or file') + + parser.add_argument('-s', + '--seed', + help='Random seed', + metavar='int', + type=int, + default=None) + + args = parser.parse_args() + + if os.path.isfile(args.text): + args.text = open(args.text).read().rstrip() + + return args + + +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + random.seed(args.seed) + + # Method 5: List comprehension + print(''.join([choose(char) for char in args.text])) + + +# -------------------------------------------------- +def choose(char): + """Randomly choose an upper or lowercase letter to return""" + + return char.upper() if random.choice([0, 1]) else char.lower() + + +# -------------------------------------------------- +def test_choose(): + """Test choose""" + + random.seed(1) + assert choose('a') == 'a' + assert choose('b') == 'b' + assert choose('c') == 'C' + assert choose('d') == 'd' + random.seed(None) + + +# -------------------------------------------------- +if __name__ == '__main__': + main() diff --git a/12_ransom/solution6_map.py b/12_ransom/solution6_map.py new file mode 100755 index 000000000..1e6c55fa3 --- /dev/null +++ b/12_ransom/solution6_map.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +"""Ransom note""" + +import argparse +import os +import random + + +# -------------------------------------------------- +def get_args(): + """Get command-line arguments""" + + parser = argparse.ArgumentParser( + description='Ransom Note', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('text', metavar='text', help='Input text or file') + + parser.add_argument('-s', + '--seed', + help='Random seed', + metavar='int', + type=int, + default=None) + + args = parser.parse_args() + + if os.path.isfile(args.text): + args.text = open(args.text).read().rstrip() + + return args + + +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + random.seed(args.seed) + + # Method 6: map + ransom = map(choose, args.text) + print(''.join(ransom)) + + +# -------------------------------------------------- +def choose(char): + """Randomly choose an upper or lowercase letter to return""" + + return char.upper() if random.choice([0, 1]) else char.lower() + + +# -------------------------------------------------- +def test_choose(): + """Test choose""" + + random.seed(1) + assert choose('a') == 'a' + assert choose('b') == 'b' + assert choose('c') == 'C' + assert choose('d') == 'd' + random.seed(None) + + +# -------------------------------------------------- +if __name__ == '__main__': + main() diff --git a/12_ransom/solution7_shorter_map.py b/12_ransom/solution7_shorter_map.py new file mode 100755 index 000000000..5ddec27b0 --- /dev/null +++ b/12_ransom/solution7_shorter_map.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 +"""Ransom note""" + +import argparse +import os +import random + + +# -------------------------------------------------- +def get_args(): + """Get command-line arguments""" + + parser = argparse.ArgumentParser( + description='Ransom Note', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('text', metavar='text', help='Input text or file') + + parser.add_argument('-s', + '--seed', + help='Random seed', + metavar='int', + type=int, + default=None) + + args = parser.parse_args() + + if os.path.isfile(args.text): + args.text = open(args.text).read().rstrip() + + return args + + +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + random.seed(args.seed) + + # Method 7: map + print(''.join(map(choose, args.text))) + + +# -------------------------------------------------- +def choose(char): + """Randomly choose an upper or lowercase letter to return""" + + return char.upper() if random.choice([0, 1]) else char.lower() + + +# -------------------------------------------------- +def test_choose(): + """Test choose""" + + random.seed(1) + assert choose('a') == 'a' + assert choose('b') == 'b' + assert choose('c') == 'C' + assert choose('d') == 'd' + random.seed(None) + + +# -------------------------------------------------- +if __name__ == '__main__': + main() From ee39c3fc7b74cd4ae9864a7f92dfc8ff8296a5d2 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Mon, 6 Apr 2020 12:52:29 -0700 Subject: [PATCH 28/98] better names, fixed function order, record random.state --- 12_ransom/{solution7.py => ransom.py} | 47 +++++++++------ 12_ransom/solution1.py | 70 ----------------------- 12_ransom/solution1_for_loop.py | 3 +- 12_ransom/solution2.py | 70 ----------------------- 12_ransom/solution2_for_append_list.py | 3 +- 12_ransom/solution3.py | 70 ----------------------- 12_ransom/solution3_for_append_string.py | 3 +- 12_ransom/solution4.py | 67 ---------------------- 12_ransom/solution4_list_comprehension.py | 3 +- 12_ransom/solution5.py | 66 --------------------- 12_ransom/solution5_shorter_list_comp.py | 3 +- 12_ransom/solution6.py | 67 ---------------------- 12_ransom/solution6_map.py | 3 +- 12_ransom/solution7_shorter_map.py | 3 +- 14 files changed, 43 insertions(+), 435 deletions(-) rename 12_ransom/{solution7.py => ransom.py} (71%) delete mode 100755 12_ransom/solution1.py delete mode 100755 12_ransom/solution2.py delete mode 100755 12_ransom/solution3.py delete mode 100755 12_ransom/solution4.py delete mode 100755 12_ransom/solution5.py delete mode 100755 12_ransom/solution6.py diff --git a/12_ransom/solution7.py b/12_ransom/ransom.py similarity index 71% rename from 12_ransom/solution7.py rename to 12_ransom/ransom.py index e3b81e488..aef37a7c3 100755 --- a/12_ransom/solution7.py +++ b/12_ransom/ransom.py @@ -1,9 +1,14 @@ #!/usr/bin/env python3 -"""Ransom note""" +""" +Author : Ken Youens-Clark +Date : 2020-04-06 +Purpose: Create a ransom note +""" import argparse import os import random +import sys # -------------------------------------------------- @@ -11,15 +16,15 @@ def get_args(): """Get command-line arguments""" parser = argparse.ArgumentParser( - description='Ransom Note', + description='Create a ransom note', formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('text', metavar='str', help='Input text or file') parser.add_argument('-s', '--seed', - help='Random seed', - metavar='int', + help='Random seed value', + metavar='seed', type=int, default=None) @@ -31,34 +36,40 @@ def get_args(): return args +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + random.seed(args.seed) + + # new_text = '' + # for char in args.text: + # new_text += choose(char) + + # print(''.join([choose(char) for char in args.text])) + + print(''.join(map(choose, args.text))) + + # -------------------------------------------------- def choose(char): - """Randomly choose an upper or lowercase letter to return""" + """Return an upper or lowercase char""" return char.upper() if random.choice([0, 1]) else char.lower() # -------------------------------------------------- def test_choose(): - """Test choose""" + """Test choose()""" + state = random.getstate() random.seed(1) assert choose('a') == 'a' assert choose('b') == 'b' assert choose('c') == 'C' assert choose('d') == 'd' - random.seed(None) - - -# -------------------------------------------------- -def main(): - """Make a jazz noise here""" - - args = get_args() - random.seed(args.seed) - - # Method 6: map - print(''.join(map(choose, args.text))) + random.setstate(state) # -------------------------------------------------- diff --git a/12_ransom/solution1.py b/12_ransom/solution1.py deleted file mode 100755 index 35e876dec..000000000 --- a/12_ransom/solution1.py +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env python3 -"""Ransom note""" - -import argparse -import os -import random - - -# -------------------------------------------------- -def get_args(): - """Get command-line arguments""" - - parser = argparse.ArgumentParser( - description='Ransom Note', - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - - parser.add_argument('text', metavar='str', help='Input text or file') - - parser.add_argument('-s', - '--seed', - help='Random seed', - metavar='int', - type=int, - default=None) - - args = parser.parse_args() - - if os.path.isfile(args.text): - args.text = open(args.text).read().rstrip() - - return args - - -# -------------------------------------------------- -def choose(char): - """Randomly choose an upper or lowercase letter to return""" - - return char.upper() if random.choice([0, 1]) else char.lower() - - -# -------------------------------------------------- -def test_choose(): - """Test choose""" - - random.seed(1) - assert choose('a') == 'a' - assert choose('b') == 'b' - assert choose('c') == 'C' - assert choose('d') == 'd' - random.seed(None) - - -# -------------------------------------------------- -def main(): - """Make a jazz noise here""" - - args = get_args() - random.seed(args.seed) - - # Method 1: Iterate each character, add to list - ransom = [] - for char in args.text: - ransom.append(choose(char)) - - print(''.join(ransom)) - - -# -------------------------------------------------- -if __name__ == '__main__': - main() diff --git a/12_ransom/solution1_for_loop.py b/12_ransom/solution1_for_loop.py index 99d77b7f0..87155b26a 100755 --- a/12_ransom/solution1_for_loop.py +++ b/12_ransom/solution1_for_loop.py @@ -57,12 +57,13 @@ def choose(char): def test_choose(): """Test choose""" + state = random.getstate() random.seed(1) assert choose('a') == 'a' assert choose('b') == 'b' assert choose('c') == 'C' assert choose('d') == 'd' - random.seed(None) + random.setstate(state) # -------------------------------------------------- diff --git a/12_ransom/solution2.py b/12_ransom/solution2.py deleted file mode 100755 index e6e5d499d..000000000 --- a/12_ransom/solution2.py +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env python3 -"""Ransom note""" - -import argparse -import os -import random - - -# -------------------------------------------------- -def get_args(): - """Get command-line arguments""" - - parser = argparse.ArgumentParser( - description='Ransom Note', - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - - parser.add_argument('text', metavar='str', help='Input text or file') - - parser.add_argument('-s', - '--seed', - help='Random seed', - metavar='int', - type=int, - default=None) - - args = parser.parse_args() - - if os.path.isfile(args.text): - args.text = open(args.text).read().rstrip() - - return args - - -# -------------------------------------------------- -def choose(char): - """Randomly choose an upper or lowercase letter to return""" - - return char.upper() if random.choice([0, 1]) else char.lower() - - -# -------------------------------------------------- -def test_choose(): - """Test choose""" - - random.seed(1) - assert choose('a') == 'a' - assert choose('b') == 'b' - assert choose('c') == 'C' - assert choose('d') == 'd' - random.seed(None) - - -# -------------------------------------------------- -def main(): - """Make a jazz noise here""" - - args = get_args() - random.seed(args.seed) - - # Method 2: Iterate each character, add to a list - ransom = [] - for char in args.text: - ransom += choose(char) - - print(''.join(ransom)) - - -# -------------------------------------------------- -if __name__ == '__main__': - main() diff --git a/12_ransom/solution2_for_append_list.py b/12_ransom/solution2_for_append_list.py index a4d7aaae7..c1b27e1c3 100755 --- a/12_ransom/solution2_for_append_list.py +++ b/12_ransom/solution2_for_append_list.py @@ -57,12 +57,13 @@ def choose(char): def test_choose(): """Test choose""" + state = random.getstate() random.seed(1) assert choose('a') == 'a' assert choose('b') == 'b' assert choose('c') == 'C' assert choose('d') == 'd' - random.seed(None) + random.setstate(state) # -------------------------------------------------- diff --git a/12_ransom/solution3.py b/12_ransom/solution3.py deleted file mode 100755 index 40ec6d78a..000000000 --- a/12_ransom/solution3.py +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env python3 -"""Ransom note""" - -import argparse -import os -import random - - -# -------------------------------------------------- -def get_args(): - """Get command-line arguments""" - - parser = argparse.ArgumentParser( - description='Ransom Note', - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - - parser.add_argument('text', metavar='str', help='Input text or file') - - parser.add_argument('-s', - '--seed', - help='Random seed', - metavar='int', - type=int, - default=None) - - args = parser.parse_args() - - if os.path.isfile(args.text): - args.text = open(args.text).read().rstrip() - - return args - - -# -------------------------------------------------- -def choose(char): - """Randomly choose an upper or lowercase letter to return""" - - return char.upper() if random.choice([0, 1]) else char.lower() - - -# -------------------------------------------------- -def test_choose(): - """Test choose""" - - random.seed(1) - assert choose('a') == 'a' - assert choose('b') == 'b' - assert choose('c') == 'C' - assert choose('d') == 'd' - random.seed(None) - - -# -------------------------------------------------- -def main(): - """Make a jazz noise here""" - - args = get_args() - random.seed(args.seed) - - # Method 3: Iterate each character, add to a str - ransom = '' - for char in args.text: - ransom += choose(char) - - print(''.join(ransom)) - - -# -------------------------------------------------- -if __name__ == '__main__': - main() diff --git a/12_ransom/solution3_for_append_string.py b/12_ransom/solution3_for_append_string.py index e7696822b..e76ebf4b2 100755 --- a/12_ransom/solution3_for_append_string.py +++ b/12_ransom/solution3_for_append_string.py @@ -57,12 +57,13 @@ def choose(char): def test_choose(): """Test choose""" + state = random.getstate() random.seed(1) assert choose('a') == 'a' assert choose('b') == 'b' assert choose('c') == 'C' assert choose('d') == 'd' - random.seed(None) + random.setstate(state) # -------------------------------------------------- diff --git a/12_ransom/solution4.py b/12_ransom/solution4.py deleted file mode 100755 index d285423dc..000000000 --- a/12_ransom/solution4.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python3 -"""Ransom note""" - -import argparse -import os -import random - - -# -------------------------------------------------- -def get_args(): - """Get command-line arguments""" - - parser = argparse.ArgumentParser( - description='Ransom Note', - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - - parser.add_argument('text', metavar='str', help='Input text or file') - - parser.add_argument('-s', - '--seed', - help='Random seed', - metavar='int', - type=int, - default=None) - - args = parser.parse_args() - - if os.path.isfile(args.text): - args.text = open(args.text).read().rstrip() - - return args - - -# -------------------------------------------------- -def choose(char): - """Randomly choose an upper or lowercase letter to return""" - - return char.upper() if random.choice([0, 1]) else char.lower() - - -# -------------------------------------------------- -def test_choose(): - """Test choose""" - - random.seed(1) - assert choose('a') == 'a' - assert choose('b') == 'b' - assert choose('c') == 'C' - assert choose('d') == 'd' - random.seed(None) - - -# -------------------------------------------------- -def main(): - """Make a jazz noise here""" - - args = get_args() - random.seed(args.seed) - - # Method 4: List comprehension - ransom = [choose(char) for char in args.text] - print(''.join(ransom)) - - -# -------------------------------------------------- -if __name__ == '__main__': - main() diff --git a/12_ransom/solution4_list_comprehension.py b/12_ransom/solution4_list_comprehension.py index 104f9b5ef..cd3ca03a5 100755 --- a/12_ransom/solution4_list_comprehension.py +++ b/12_ransom/solution4_list_comprehension.py @@ -54,12 +54,13 @@ def choose(char): def test_choose(): """Test choose""" + state = random.getstate() random.seed(1) assert choose('a') == 'a' assert choose('b') == 'b' assert choose('c') == 'C' assert choose('d') == 'd' - random.seed(None) + random.setstate(state) # -------------------------------------------------- diff --git a/12_ransom/solution5.py b/12_ransom/solution5.py deleted file mode 100755 index 1e3ec8a35..000000000 --- a/12_ransom/solution5.py +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env python3 -"""Ransom note""" - -import argparse -import os -import random - - -# -------------------------------------------------- -def get_args(): - """Get command-line arguments""" - - parser = argparse.ArgumentParser( - description='Ransom Note', - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - - parser.add_argument('text', metavar='str', help='Input text or file') - - parser.add_argument('-s', - '--seed', - help='Random seed', - metavar='int', - type=int, - default=None) - - args = parser.parse_args() - - if os.path.isfile(args.text): - args.text = open(args.text).read().rstrip() - - return args - - -# -------------------------------------------------- -def choose(char): - """Randomly choose an upper or lowercase letter to return""" - - return char.upper() if random.choice([0, 1]) else char.lower() - - -# -------------------------------------------------- -def test_choose(): - """Test choose""" - - random.seed(1) - assert choose('a') == 'a' - assert choose('b') == 'b' - assert choose('c') == 'C' - assert choose('d') == 'd' - random.seed(None) - - -# -------------------------------------------------- -def main(): - """Make a jazz noise here""" - - args = get_args() - random.seed(args.seed) - - # Method 4: List comprehension - print(''.join([choose(char) for char in args.text])) - - -# -------------------------------------------------- -if __name__ == '__main__': - main() diff --git a/12_ransom/solution5_shorter_list_comp.py b/12_ransom/solution5_shorter_list_comp.py index fada15a0f..d88b755fb 100755 --- a/12_ransom/solution5_shorter_list_comp.py +++ b/12_ransom/solution5_shorter_list_comp.py @@ -53,12 +53,13 @@ def choose(char): def test_choose(): """Test choose""" + state = random.getstate() random.seed(1) assert choose('a') == 'a' assert choose('b') == 'b' assert choose('c') == 'C' assert choose('d') == 'd' - random.seed(None) + random.setstate(state) # -------------------------------------------------- diff --git a/12_ransom/solution6.py b/12_ransom/solution6.py deleted file mode 100755 index 4b85a3985..000000000 --- a/12_ransom/solution6.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python3 -"""Ransom note""" - -import argparse -import os -import random - - -# -------------------------------------------------- -def get_args(): - """Get command-line arguments""" - - parser = argparse.ArgumentParser( - description='Ransom Note', - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - - parser.add_argument('text', metavar='str', help='Input text or file') - - parser.add_argument('-s', - '--seed', - help='Random seed', - metavar='int', - type=int, - default=None) - - args = parser.parse_args() - - if os.path.isfile(args.text): - args.text = open(args.text).read().rstrip() - - return args - - -# -------------------------------------------------- -def choose(char): - """Randomly choose an upper or lowercase letter to return""" - - return char.upper() if random.choice([0, 1]) else char.lower() - - -# -------------------------------------------------- -def test_choose(): - """Test choose""" - - random.seed(1) - assert choose('a') == 'a' - assert choose('b') == 'b' - assert choose('c') == 'C' - assert choose('d') == 'd' - random.seed(None) - - -# -------------------------------------------------- -def main(): - """Make a jazz noise here""" - - args = get_args() - random.seed(args.seed) - - # Method 6: map - ransom = map(choose, args.text) - print(''.join(ransom)) - - -# -------------------------------------------------- -if __name__ == '__main__': - main() diff --git a/12_ransom/solution6_map.py b/12_ransom/solution6_map.py index 1e6c55fa3..9398bd6fd 100755 --- a/12_ransom/solution6_map.py +++ b/12_ransom/solution6_map.py @@ -54,12 +54,13 @@ def choose(char): def test_choose(): """Test choose""" + state = random.getstate() random.seed(1) assert choose('a') == 'a' assert choose('b') == 'b' assert choose('c') == 'C' assert choose('d') == 'd' - random.seed(None) + random.setstate(state) # -------------------------------------------------- diff --git a/12_ransom/solution7_shorter_map.py b/12_ransom/solution7_shorter_map.py index 5ddec27b0..969ca825e 100755 --- a/12_ransom/solution7_shorter_map.py +++ b/12_ransom/solution7_shorter_map.py @@ -53,12 +53,13 @@ def choose(char): def test_choose(): """Test choose""" + state = random.getstate() random.seed(1) assert choose('a') == 'a' assert choose('b') == 'b' assert choose('c') == 'C' assert choose('d') == 'd' - random.seed(None) + random.setstate(state) # -------------------------------------------------- From 55d3c4ba84e385068bb394978742a4ce3b2cb09a Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Mon, 6 Apr 2020 15:46:39 -0700 Subject: [PATCH 29/98] cleanup --- 19_wod/foo.py | 113 ------------------ 19_wod/{ => inputs}/bad-delimiter.tab | 0 19_wod/{ => inputs}/bad-empty.csv | 0 19_wod/{ => inputs}/bad-headers-only.csv | 0 19_wod/{ => inputs}/bad-headers.csv | 0 19_wod/{ => inputs}/bad-reps.csv | 0 19_wod/{ => inputs}/exercises.csv | 0 19_wod/{ => inputs}/silly-exercises.csv | 0 19_wod/manual1.py | 2 +- ...nual2.py => manual2_list_comprehension.py} | 2 +- 19_wod/{manual3.py => manual3_map.py} | 2 +- 19_wod/manual4_map2.py | 9 ++ 19_wod/requirements.txt | 3 + 19_wod/solution1.py | 11 +- 19_wod/solution2.py | 42 ++++--- 19_wod/test.py | 7 +- 19_wod/using_csv1.py | 2 +- 19_wod/using_csv2.py | 2 +- 19_wod/using_csv3.py | 2 +- 19_wod/using_pandas.py | 6 + 20 files changed, 62 insertions(+), 141 deletions(-) delete mode 100755 19_wod/foo.py rename 19_wod/{ => inputs}/bad-delimiter.tab (100%) rename 19_wod/{ => inputs}/bad-empty.csv (100%) rename 19_wod/{ => inputs}/bad-headers-only.csv (100%) rename 19_wod/{ => inputs}/bad-headers.csv (100%) rename 19_wod/{ => inputs}/bad-reps.csv (100%) rename 19_wod/{ => inputs}/exercises.csv (100%) rename 19_wod/{ => inputs}/silly-exercises.csv (100%) rename 19_wod/{manual2.py => manual2_list_comprehension.py} (82%) rename 19_wod/{manual3.py => manual3_map.py} (85%) create mode 100755 19_wod/manual4_map2.py create mode 100644 19_wod/requirements.txt create mode 100755 19_wod/using_pandas.py diff --git a/19_wod/foo.py b/19_wod/foo.py deleted file mode 100755 index 08ad2d9a8..000000000 --- a/19_wod/foo.py +++ /dev/null @@ -1,113 +0,0 @@ -#!/usr/bin/env python3 -"""Create Workout Of (the) Day (WOD)""" - -import argparse -import csv -import io -import os -import random -from itertools import starmap -from tabulate import tabulate - - -# -------------------------------------------------- -def get_args(): - """Get command-line arguments""" - - parser = argparse.ArgumentParser( - description='Create Workout Of (the) Day (WOD)', - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - - parser.add_argument('-f', - '--file', - help='CSV input file of exercises', - metavar='str', - type=argparse.FileType('r'), - default='exercises.csv') - - parser.add_argument('-s', - '--seed', - help='Random seed', - metavar='int', - type=int, - default=None) - - parser.add_argument('-n', - '--num_exercises', - help='Number of exercises', - metavar='int', - type=int, - default=4) - - parser.add_argument('-e', - '--easy', - help='Make it easy', - action='store_true') - - return parser.parse_args() - - -# -------------------------------------------------- -def main(): - """Make a jazz noise here""" - - args = get_args() - random.seed(args.seed) - wod = [] - - for name, low, high in read_csv(args.file): - reps = random.randint(low, high) - if args.easy: - reps = int(reps / 2) - wod.append((name, reps)) - - wod = random.sample(wod, k=args.num_exercises) - print(tabulate(wod, headers=('Exercise', 'Reps'))) - - -# -------------------------------------------------- -def read_csv(fh): - """Read the CSV input""" - - exercises = [] - for row in csv.DictReader(fh, delimiter=','): - low, high = row['reps'].split('-') - if low.isdigit() and high.isdigit(): - exercises.append((row['exercise'], int(low), int(high))) - - return exercises - - -# -------------------------------------------------- -def test_read_csv(): - """Test read_csv""" - - text = io.StringIO('exercise,reps\nfoo,10-20\nbar,30-40') - assert read_csv(text) == [('foo', 10, 20), ('bar', 30, 40)] - - -# -------------------------------------------------- -def make_exercise(name, low, high, easy): - """Make an exercise""" - - if easy: - low, high = int(low / 2), int(high / 2) - - return (name, random.randint(low, high)) - - -# -------------------------------------------------- -def test_make_exercise(): - """Test make_exercise""" - - random.seed(1) - assert make_exercise('foo', 10, 20, False) == ('foo', 12) - assert make_exercise('bar', 5, 30, True) == ('bar', 11) - assert make_exercise('baz', 0, 50, False) == ('baz', 48) - assert make_exercise('quux', 0, 50, True) == ('quux', 2) - random.seed(None) - - -# -------------------------------------------------- -if __name__ == '__main__': - main() diff --git a/19_wod/bad-delimiter.tab b/19_wod/inputs/bad-delimiter.tab similarity index 100% rename from 19_wod/bad-delimiter.tab rename to 19_wod/inputs/bad-delimiter.tab diff --git a/19_wod/bad-empty.csv b/19_wod/inputs/bad-empty.csv similarity index 100% rename from 19_wod/bad-empty.csv rename to 19_wod/inputs/bad-empty.csv diff --git a/19_wod/bad-headers-only.csv b/19_wod/inputs/bad-headers-only.csv similarity index 100% rename from 19_wod/bad-headers-only.csv rename to 19_wod/inputs/bad-headers-only.csv diff --git a/19_wod/bad-headers.csv b/19_wod/inputs/bad-headers.csv similarity index 100% rename from 19_wod/bad-headers.csv rename to 19_wod/inputs/bad-headers.csv diff --git a/19_wod/bad-reps.csv b/19_wod/inputs/bad-reps.csv similarity index 100% rename from 19_wod/bad-reps.csv rename to 19_wod/inputs/bad-reps.csv diff --git a/19_wod/exercises.csv b/19_wod/inputs/exercises.csv similarity index 100% rename from 19_wod/exercises.csv rename to 19_wod/inputs/exercises.csv diff --git a/19_wod/silly-exercises.csv b/19_wod/inputs/silly-exercises.csv similarity index 100% rename from 19_wod/silly-exercises.csv rename to 19_wod/inputs/silly-exercises.csv diff --git a/19_wod/manual1.py b/19_wod/manual1.py index aca807394..87c3819b7 100755 --- a/19_wod/manual1.py +++ b/19_wod/manual1.py @@ -2,7 +2,7 @@ from pprint import pprint -with open('exercises.csv') as fh: +with open('inputs/exercises.csv') as fh: headers = fh.readline().rstrip().split(',') records = [] for line in fh: diff --git a/19_wod/manual2.py b/19_wod/manual2_list_comprehension.py similarity index 82% rename from 19_wod/manual2.py rename to 19_wod/manual2_list_comprehension.py index be92e4069..bcfee726c 100755 --- a/19_wod/manual2.py +++ b/19_wod/manual2_list_comprehension.py @@ -2,7 +2,7 @@ from pprint import pprint -with open('exercises.csv') as fh: +with open('inputs/exercises.csv') as fh: headers = fh.readline().rstrip().split(',') records = [dict(zip(headers, line.rstrip().split(','))) for line in fh] pprint(records) diff --git a/19_wod/manual3.py b/19_wod/manual3_map.py similarity index 85% rename from 19_wod/manual3.py rename to 19_wod/manual3_map.py index ea39e0876..026dea384 100755 --- a/19_wod/manual3.py +++ b/19_wod/manual3_map.py @@ -2,7 +2,7 @@ from pprint import pprint -with open('exercises.csv') as fh: +with open('inputs/exercises.csv') as fh: headers = fh.readline().rstrip().split(',') records = list( map(lambda line: dict(zip(headers, diff --git a/19_wod/manual4_map2.py b/19_wod/manual4_map2.py new file mode 100755 index 000000000..b101a0941 --- /dev/null +++ b/19_wod/manual4_map2.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python3 + +from pprint import pprint + +with open('inputs/exercises.csv') as fh: + headers = fh.readline().rstrip().split(',') + mk_rec = lambda line: dict(zip(headers, line.rstrip().split(','))) + records = map(mk_rec, fh) + pprint(list(records)) diff --git a/19_wod/requirements.txt b/19_wod/requirements.txt new file mode 100644 index 000000000..7e34272cb --- /dev/null +++ b/19_wod/requirements.txt @@ -0,0 +1,3 @@ +csv +csvkit +tabulate diff --git a/19_wod/solution1.py b/19_wod/solution1.py index b891d84ce..c99f0f322 100755 --- a/19_wod/solution1.py +++ b/19_wod/solution1.py @@ -19,21 +19,21 @@ def get_args(): parser.add_argument('-f', '--file', help='CSV input file of exercises', - metavar='str', + metavar='FILE', type=argparse.FileType('r'), - default='exercises.csv') + default='inputs/exercises.csv') parser.add_argument('-s', '--seed', help='Random seed', - metavar='int', + metavar='seed', type=int, default=None) parser.add_argument('-n', '--num', help='Number of exercises', - metavar='int', + metavar='exercises', type=int, default=4) @@ -57,8 +57,9 @@ def main(): args = get_args() random.seed(args.seed) wod = [] + exercises = read_csv(args.file) - for name, low, high in random.sample(read_csv(args.file), k=args.num): + for name, low, high in random.sample(exercises, k=args.num): reps = random.randint(low, high) if args.easy: reps = int(reps / 2) diff --git a/19_wod/solution2.py b/19_wod/solution2.py index 64e28b5a1..3f28ccdb8 100755 --- a/19_wod/solution2.py +++ b/19_wod/solution2.py @@ -6,6 +6,7 @@ import io import re import random +import sys from tabulate import tabulate @@ -20,21 +21,21 @@ def get_args(): parser.add_argument('-f', '--file', help='CSV input file of exercises', - metavar='str', + metavar='FILE', type=argparse.FileType('r'), - default='exercises.csv') + default='inputs/exercises.csv') parser.add_argument('-s', '--seed', help='Random seed', - metavar='int', + metavar='seed', type=int, default=None) parser.add_argument('-n', '--num', help='Number of exercises', - metavar='int', + metavar='exercises', type=int, default=4) @@ -46,7 +47,7 @@ def get_args(): args = parser.parse_args() if args.num < 1: - parser.error('--num "{args.num}" must be greater than 0') + parser.error(f'--num "{args.num}" must be greater than 0') return args @@ -59,16 +60,29 @@ def main(): random.seed(args.seed) exercises = read_csv(args.file) - if exercises: - for name, low, high in random.sample(exercises, k=args.num): - reps = random.randint(low, high) - if args.easy: - reps = int(reps / 2) - wod.append((name, reps)) + if not exercises: + die(f'No usable data in --file "{args.file.name}"') - print(tabulate(wod, headers=('Exercise', 'Reps'))) - else: - print(f'No usable data in --file "{args.file.name}"') + num_exercises = len(exercises) + if args.num > num_exercises: + die(f'--num "{args.num}" greater than exercises "{num_exercises}"') + + wod = [] + for name, low, high in random.sample(exercises, k=args.num): + reps = random.randint(low, high) + if args.easy: + reps = int(reps / 2) + wod.append((name, reps)) + + print(tabulate(wod, headers=('Exercise', 'Reps'))) + + +# -------------------------------------------------- +def die(msg): + """Print message to STDERR and exit with an error""" + + print(msg, file=sys.stderr) + sys.exit(1) # -------------------------------------------------- diff --git a/19_wod/test.py b/19_wod/test.py index 2fc70f8ef..8aff68721 100755 --- a/19_wod/test.py +++ b/19_wod/test.py @@ -8,8 +8,8 @@ from subprocess import getstatusoutput prg = './wod.py' -input1 = 'exercises.csv' -input2 = 'silly-exercises.csv' +input1 = 'inputs/exercises.csv' +input2 = 'inputs/silly-exercises.csv' # -------------------------------------------------- @@ -107,7 +107,8 @@ def test_seed2_num8(): seed_flag = '-s' if random.choice([0, 1]) else '--seed' num_flag = '-n' if random.choice([0, 1]) else '--num' - rv, out = getstatusoutput(f'{prg} {num_flag} 8 {seed_flag} 2 -f {input1}') + cmd = f'{prg} {num_flag} 8 {seed_flag} 2 -f {input1}' + rv, out = getstatusoutput(cmd) assert rv == 0 assert out.strip() == expected.strip() diff --git a/19_wod/using_csv1.py b/19_wod/using_csv1.py index a1cddcca6..bb90a21c0 100755 --- a/19_wod/using_csv1.py +++ b/19_wod/using_csv1.py @@ -3,7 +3,7 @@ import csv from pprint import pprint -with open('exercises.csv') as fh: +with open('inputs/exercises.csv') as fh: reader = csv.DictReader(fh, delimiter=',') records = [] for rec in reader: diff --git a/19_wod/using_csv2.py b/19_wod/using_csv2.py index 13f95d488..55e7f329b 100755 --- a/19_wod/using_csv2.py +++ b/19_wod/using_csv2.py @@ -3,7 +3,7 @@ import csv from pprint import pprint -with open('exercises.csv') as fh: +with open('inputs/exercises.csv') as fh: reader = csv.DictReader(fh, delimiter=',') records = list(reader) pprint(records) diff --git a/19_wod/using_csv3.py b/19_wod/using_csv3.py index 997d8133d..af03e1896 100755 --- a/19_wod/using_csv3.py +++ b/19_wod/using_csv3.py @@ -3,7 +3,7 @@ import csv from pprint import pprint -with open('exercises.csv') as fh: +with open('inputs/exercises.csv') as fh: reader = csv.DictReader(fh, delimiter=',') exercises = [] for rec in reader: diff --git a/19_wod/using_pandas.py b/19_wod/using_pandas.py new file mode 100755 index 000000000..8fae740dc --- /dev/null +++ b/19_wod/using_pandas.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python3 + +import pandas as pd + +df = pd.read_csv('inputs/exercises.csv') +print(df) From f33e3d7b6d022244851e943325ead4b0f1b5f365 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Mon, 6 Apr 2020 16:18:27 -0700 Subject: [PATCH 30/98] rename, better metavars --- 10_telephone/solution1.py | 6 +++--- 10_telephone/{solution2.py => solution2_list.py} | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) rename 10_telephone/{solution2.py => solution2_list.py} (90%) diff --git a/10_telephone/solution1.py b/10_telephone/solution1.py index 812c2600f..d9a0b9fe4 100755 --- a/10_telephone/solution1.py +++ b/10_telephone/solution1.py @@ -15,19 +15,19 @@ def get_args(): description='Telephone', formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument('text', metavar='str', help='Input text or file') + parser.add_argument('text', metavar='text', help='Input text or file') parser.add_argument('-s', '--seed', help='Random seed', - metavar='int', + metavar='seed', type=int, default=None) parser.add_argument('-m', '--mutations', help='Percent mutations', - metavar='float', + metavar='mutations', type=float, default=0.1) diff --git a/10_telephone/solution2.py b/10_telephone/solution2_list.py similarity index 90% rename from 10_telephone/solution2.py rename to 10_telephone/solution2_list.py index 3c3a69a28..de763dcf4 100755 --- a/10_telephone/solution2.py +++ b/10_telephone/solution2_list.py @@ -15,19 +15,19 @@ def get_args(): description='Telephone', formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument('text', metavar='str', help='Input text or file') + parser.add_argument('text', metavar='text', help='Input text or file') parser.add_argument('-s', '--seed', help='Random seed', - metavar='int', + metavar='seed', type=int, default=None) parser.add_argument('-m', '--mutations', help='Percent mutations', - metavar='float', + metavar='mutations', type=float, default=0.1) From 7c26ca1c3375aa826f5ba5d52631d4e7a75dd806 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Tue, 7 Apr 2020 09:23:36 -0700 Subject: [PATCH 31/98] adding READMEs, cleanup --- 19_wod/manual3_map.py | 7 +- 19_wod/manual4_map2.py | 9 -- 21_tictactoe/README.md | 137 ++++++++++++++++++ 21_tictactoe/solution1.py | 6 +- 21_tictactoe/solution2.py | 6 +- 21_tictactoe/test.py | 1 + 22_itictactoe/README.md | 65 +++++++++ 22_itictactoe/{itictactoe.py => solution1.py} | 0 ...tactoe_dict.py => solution2_typed_dict.py} | 0 9 files changed, 212 insertions(+), 19 deletions(-) delete mode 100755 19_wod/manual4_map2.py create mode 100644 21_tictactoe/README.md create mode 100644 22_itictactoe/README.md rename 22_itictactoe/{itictactoe.py => solution1.py} (100%) rename 22_itictactoe/{itictactoe_dict.py => solution2_typed_dict.py} (100%) diff --git a/19_wod/manual3_map.py b/19_wod/manual3_map.py index 026dea384..b101a0941 100755 --- a/19_wod/manual3_map.py +++ b/19_wod/manual3_map.py @@ -4,7 +4,6 @@ with open('inputs/exercises.csv') as fh: headers = fh.readline().rstrip().split(',') - records = list( - map(lambda line: dict(zip(headers, - line.rstrip().split(','))), fh)) - pprint(records) + mk_rec = lambda line: dict(zip(headers, line.rstrip().split(','))) + records = map(mk_rec, fh) + pprint(list(records)) diff --git a/19_wod/manual4_map2.py b/19_wod/manual4_map2.py deleted file mode 100755 index b101a0941..000000000 --- a/19_wod/manual4_map2.py +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env python3 - -from pprint import pprint - -with open('inputs/exercises.csv') as fh: - headers = fh.readline().rstrip().split(',') - mk_rec = lambda line: dict(zip(headers, line.rstrip().split(','))) - records = map(mk_rec, fh) - pprint(list(records)) diff --git a/21_tictactoe/README.md b/21_tictactoe/README.md new file mode 100644 index 000000000..e508765ae --- /dev/null +++ b/21_tictactoe/README.md @@ -0,0 +1,137 @@ +# Tic-Tac-Toe + +Create a Python program called `tictactoe.py` that will play a single round of the game Tic-Tac-Toe. +The program should accept the following parameters: + +* `-b`|`--board`: The optional state of the board for the play. This will be a string of 9 characters representing the 9 cells of the 3x3 board. The string should be composed only of `X` and `O` to denote a player occupying that cell or `.` to show that the cell is open. The default is 9 '.' as all cells are open. +* `-p`|`--player`: An optional player which must be either `X` or `O`. +* `-c`|`--cell`: An optional cell which must be in the range 1-9 (inclusive). + +Here is the usage the program should print for `-h` or `--help`: + +``` +$ ./tictactoe.py -h +usage: tictactoe.py [-h] [-b str] [-p str] [-c int] + +Tic-Tac-Toe + +optional arguments: + -h, --help show this help message and exit + -b str, --board str The state of the board (default: .........) + -p str, --player str Player (default: None) + -c int, --cell int Cell 1-9 (default: None) +``` + +The program will print the state of the board plus any modifications to the state made by `--player` and `--cell` along with the final outcome of the game which can either be "No winner" or "{player} has won." + +When run with no arguments, it should print a blank Tic-Tac-Toe board and "No winner": + +``` +$ ./tictactoe.py +------------- +| 1 | 2 | 3 | +------------- +| 4 | 5 | 6 | +------------- +| 7 | 8 | 9 | +------------- +No winner. +``` + +Given a valid `--player` trying to take an unoccupied `--cell`, the program should modify the state before printing the board and deciding the outcome: + +``` +$ ./tictactoe.py -p X -c 1 +------------- +| X | 2 | 3 | +------------- +| 4 | 5 | 6 | +------------- +| 7 | 8 | 9 | +------------- +No winner. +``` + +The program should error out for a bad `--board`: + +``` +$ ./tictactoe.py -b ABC...... +usage: tictactoe.py [-h] [-b str] [-p str] [-c int] +tictactoe.py: error: --board "ABC......" must be 9 characters of ., X, O +``` + +Or a bad `--cell`: + +``` +$ ./tictactoe.py -p X -c 10 +usage: tictactoe.py [-h] [-b str] [-p str] [-c int] +tictactoe.py: error: argument -c/--cell: invalid choice: 10 \ +(choose from 1, 2, 3, 4, 5, 6, 7, 8, 9) +``` + +Or a bad `--player`: + +``` +$ ./tictactoe.py -p A -c 1 +usage: tictactoe.py [-h] [-b str] [-p str] [-c int] +tictactoe.py: error: argument -p/--player: invalid choice: 'A' \ +(choose from 'X', 'O') +``` + +Or in the event a `--player` is trying to take an occupied `--cell`: + +``` +$ ./tictactoe.py -b X........ -p O -c 1 +usage: tictactoe.py [-h] [-b str] [-p str] [-c int] +tictactoe.py: error: --cell "1" already taken +``` + +Or if only `--player` or `--cell` is provided: + +``` +$ ./tictactoe.py --player X +usage: tictactoe.py [-h] [-b board] [-p player] [-c cell] +tictactoe.py: error: Must provide both --player and --cell +``` + +The program should detect a winning state: + +``` +$ ./tictactoe.py -b .XX....OO -p X -c 1 +------------- +| X | X | X | +------------- +| 4 | 5 | 6 | +------------- +| 7 | O | O | +------------- +X has won! +``` + +The program should pass all tests: + +``` +$ make test +pytest -xv test.py +============================= test session starts ============================== +... +collected 15 items + +test.py::test_exists PASSED [ 6%] +test.py::test_usage PASSED [ 13%] +test.py::test_no_input PASSED [ 20%] +test.py::test_bad_board PASSED [ 26%] +test.py::test_bad_player PASSED [ 33%] +test.py::test_bad_cell_int PASSED [ 40%] +test.py::test_bad_cell_str PASSED [ 46%] +test.py::test_both_player_and_cell PASSED [ 53%] +test.py::test_good_board_01 PASSED [ 60%] +test.py::test_good_board_02 PASSED [ 66%] +test.py::test_mutate_board_01 PASSED [ 73%] +test.py::test_mutate_board_02 PASSED [ 80%] +test.py::test_mutate_cell_taken PASSED [ 86%] +test.py::test_winning PASSED [ 93%] +test.py::test_losing PASSED [100%] + +============================== 15 passed in 2.12s ============================== +``` diff --git a/21_tictactoe/solution1.py b/21_tictactoe/solution1.py index 61865350a..31089f3b7 100755 --- a/21_tictactoe/solution1.py +++ b/21_tictactoe/solution1.py @@ -16,7 +16,7 @@ def get_args(): parser.add_argument('-b', '--board', help='The state of the board', - metavar='str', + metavar='board', type=str, default='.' * 9) @@ -24,14 +24,14 @@ def get_args(): '--player', help='Player', choices='XO', - metavar='str', + metavar='player', type=str, default=None) parser.add_argument('-c', '--cell', help='Cell 1-9', - metavar='int', + metavar='cell', type=int, choices=range(1, 10), default=None) diff --git a/21_tictactoe/solution2.py b/21_tictactoe/solution2.py index b9c913f89..48d1324bb 100755 --- a/21_tictactoe/solution2.py +++ b/21_tictactoe/solution2.py @@ -16,7 +16,7 @@ def get_args(): parser.add_argument('-b', '--board', help='The state of the board', - metavar='str', + metavar='board', type=str, default='.' * 9) @@ -24,14 +24,14 @@ def get_args(): '--player', help='Player', choices='XO', - metavar='str', + metavar='player', type=str, default=None) parser.add_argument('-c', '--cell', help='Cell 1-9', - metavar='int', + metavar='cell', type=int, choices=range(1, 10), default=None) diff --git a/21_tictactoe/test.py b/21_tictactoe/test.py index b86ddae7d..7a0d43be5 100755 --- a/21_tictactoe/test.py +++ b/21_tictactoe/test.py @@ -140,6 +140,7 @@ def test_good_board_02(): """.strip() rv, out = getstatusoutput(f'{prg} --board ...OXX...') + assert rv == 0 assert out.strip() == board diff --git a/22_itictactoe/README.md b/22_itictactoe/README.md new file mode 100644 index 000000000..36b38dc0d --- /dev/null +++ b/22_itictactoe/README.md @@ -0,0 +1,65 @@ +# Interactive Tic-Tac-Toe + +Write a Python program called `itictactoe.py` that will play an interactive game of Tic-Tac-Toe starting from a blank board and iterating between players `X` and `O` until the game is finished due to a draw or a win. +When the game starts, a blank board with cells 1-9 should be shown along with a prompt for the current player (always starting with `X`) to select a cell: + +``` +------------- +| 1 | 2 | 3 | +------------- +| 4 | 5 | 6 | +------------- +| 7 | 8 | 9 | +------------- +Player X, what is your move? [q to quit]: 1 +``` + +If a player tries to select an occupied cell, the move is disallowed and the same player goes until a valid choice is made: + +``` +------------- +| X | 2 | 3 | +------------- +| 4 | 5 | 6 | +------------- +| 7 | 8 | 9 | +------------- +Player O, what is your move? [q to quit]: 1 +------------- +| X | 2 | 3 | +------------- +| 4 | 5 | 6 | +------------- +| 7 | 8 | 9 | +------------- +Cell "1" already taken +Player O, what is your move? [q to quit]: +``` + +Play should stop when a player has won: + +``` +------------- +| X | O | 3 | +------------- +| X | O | 6 | +------------- +| 7 | 8 | 9 | +------------- +Player X, what is your move? [q to quit]: 7 +X has won! +``` + +Or when the game is a draw: + +``` +------------- +| X | O | O | +------------- +| O | X | X | +------------- +| X | 8 | O | +------------- +Player X, what is your move? [q to quit]: 8 +All right, we'll call it a draw. +``` diff --git a/22_itictactoe/itictactoe.py b/22_itictactoe/solution1.py similarity index 100% rename from 22_itictactoe/itictactoe.py rename to 22_itictactoe/solution1.py diff --git a/22_itictactoe/itictactoe_dict.py b/22_itictactoe/solution2_typed_dict.py similarity index 100% rename from 22_itictactoe/itictactoe_dict.py rename to 22_itictactoe/solution2_typed_dict.py From 776b666439dea37122e1155bf002ddec3eab2446 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Tue, 7 Apr 2020 09:31:10 -0700 Subject: [PATCH 32/98] fixed --- 22_itictactoe/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/22_itictactoe/Makefile b/22_itictactoe/Makefile index 63b6ce214..b61078fed 100644 --- a/22_itictactoe/Makefile +++ b/22_itictactoe/Makefile @@ -1,4 +1,4 @@ .PHONY: test -unit: +test: pytest -xv unit.py From 2cbc145c9ae9b002e1cffdcc17fe57400baca1d4 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Tue, 7 Apr 2020 11:09:14 -0700 Subject: [PATCH 33/98] fixed --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 42181e575..035f87291 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ You should run the test suite after every change to your program to ensure you a First use the GitHub interface to "fork" this repository into your own account. Then do `git clone` of *your* repository to get a local copy. Inside that checkout, do: ```` -git remote add upstream https://github.com/kyclark/playful_python.git +git remote add upstream https://github.com/kyclark/tiny_python_projects.git ```` This will allow you to `git pull upstream master` in order to get updates. When you create new files, `git add/commit/push` them to *your* repository. (Please do not create pull requests on *my* repository -- unless, of course, you have suggestions for improving my repo!). From 44bf867822190fb65523e574c3df0f2e1b7882ad Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Wed, 8 Apr 2020 11:04:58 -0700 Subject: [PATCH 34/98] fixing --- 20_password/Makefile | 2 +- 20_password/test.py | 2 -- 20_password/unit.py | 4 ++-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/20_password/Makefile b/20_password/Makefile index 1cbd24b42..57657cf93 100644 --- a/20_password/Makefile +++ b/20_password/Makefile @@ -1,4 +1,4 @@ .PHONY: test test: - pytest -xv test.py + pytest -xv test.py unit.py diff --git a/20_password/test.py b/20_password/test.py index 52d3f998d..00aaca940 100755 --- a/20_password/test.py +++ b/20_password/test.py @@ -8,8 +8,6 @@ from subprocess import getstatusoutput prg = './password.py' -input1 = 'exercises.csv' -input2 = 'silly-exercises.csv' # -------------------------------------------------- diff --git a/20_password/unit.py b/20_password/unit.py index 9de6c75e7..70b19a8ba 100644 --- a/20_password/unit.py +++ b/20_password/unit.py @@ -26,6 +26,6 @@ def test_l33t(): """Test l33t""" random.seed(1) - assert (l33t('Money') == 'm0N3Y{') - assert (l33t('Dollars') == 'D0ll4r5`') + assert l33t('Money') == 'moNeY{' + assert l33t('Dollars') == 'D0ll4r5`' random.seed(None) From bb88c48738d76ed84caa8f1f34e01dd75c0cad68 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Wed, 8 Apr 2020 12:10:01 -0700 Subject: [PATCH 35/98] ignore unzipped words --- inputs/.gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 inputs/.gitignore diff --git a/inputs/.gitignore b/inputs/.gitignore new file mode 100644 index 000000000..71af1a951 --- /dev/null +++ b/inputs/.gitignore @@ -0,0 +1 @@ +words From 216cc7e11af4c78ce444fdad48427794152f67be Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Fri, 10 Apr 2020 21:15:29 -0700 Subject: [PATCH 36/98] vids --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 035f87291..0fbe4c22e 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,12 @@ The tests should define what it means for a program to be correct, and then we w In this project, I've written all the tests for you, but I also encourage you to write your own functions and tests. You should run the test suite after every change to your program to ensure you are making progress! +# Videos + +I've been making videos for each chapter on my YouTube channel: + +https://www.youtube.com/user/kyclark + # Forking GitHub repo First use the GitHub interface to "fork" this repository into your own account. Then do `git clone` of *your* repository to get a local copy. Inside that checkout, do: From b0172cbeb45f9346ff7a00fc971b13e9e6b99d05 Mon Sep 17 00:00:00 2001 From: Ken Youens-Clark Date: Sat, 11 Apr 2020 13:48:42 -0700 Subject: [PATCH 37/98] renaming --- inputs/words.txt.zip | Bin 0 -> 754696 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 inputs/words.txt.zip diff --git a/inputs/words.txt.zip b/inputs/words.txt.zip new file mode 100644 index 0000000000000000000000000000000000000000..ca2b0d3a58d91548f7e4ce1548dffe9d36fd14cd GIT binary patch literal 754696 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

seA)pc@B;z1UT_v>s5o?o`haOp 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

n7kMfLb)5;gcWA4#44&GiIS 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�h3^J$wOX%H9 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
S2Zbj2`DqlTle}$7j16 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