From 7d819f3f338e98946f1efe159e2c3df48ec1708c Mon Sep 17 00:00:00 2001 From: joy Date: Fri, 1 Oct 2021 10:49:14 +0900 Subject: [PATCH 01/15] #1 joy.y --- .gitignore | 22 +------------- 01_hello/hello.py | 29 +++++++++++++++++++ 01_hello/hello2.py | 72 ++++++++++++++++++++++++++++++++++++++++++++++ 01_hello/hello3.py | 72 ++++++++++++++++++++++++++++++++++++++++++++++ 01_hello/hello4.py | 72 ++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 246 insertions(+), 21 deletions(-) create mode 100755 01_hello/hello.py create mode 100755 01_hello/hello2.py create mode 100755 01_hello/hello3.py create mode 100755 01_hello/hello4.py diff --git a/.gitignore b/.gitignore index 68ca39690..af90102a9 100644 --- a/.gitignore +++ b/.gitignore @@ -10,24 +10,4 @@ tex2pdf* .log .coverage .idea -.vscode -02_crowsnest/crowsnest.py -03_picnic/picnic.py -04_jump_the_five/jump.py -05_howler/howler.py -06_wc/wc.py -07_gashlycrumb/gashlycrumb.py -08_apples_and_bananas/apples.py -09_abuse/abuse.py -10_telephone/telephone.py -11_bottles_of_beer/bottles.py -12_ransom/ransom.py -13_twelve_days/twelve_days.py -14_rhymer/rhymer.py -15_kentucky_friar/friar.py -16_scrambler/scrambler.py -17_mad_libs/mad.py -18_gematria/gematria.py -19_wod/wod.py -20_password/password.py -21_tictactoe/tictactoe.py +.vscode \ No newline at end of file diff --git a/01_hello/hello.py b/01_hello/hello.py new file mode 100755 index 000000000..58495dd88 --- /dev/null +++ b/01_hello/hello.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 +""" +Author: NowHappy +Purpose: Say Hello +""" + +import argparse + + +# --------------------------------------------------- +def get_args(): + """Get the command-line arguments""" + parser = argparse.ArgumentParser(description='Say Hello') + parser.add_argument('-n', '--name', metavar='name', + default='World', help='Name to greet') + + return parser.parse_args() + + +# --------------------------------------------------- +def main(): + """happy now""" + args = get_args() + print('Hello, ' + args.name + '!') + + +# --------------------------------------------------- +if __name__ == '__main__': + main() diff --git a/01_hello/hello2.py b/01_hello/hello2.py new file mode 100755 index 000000000..2ab2930d7 --- /dev/null +++ b/01_hello/hello2.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python3 +""" +Author : kakao +Date : 2021-09-28 +Purpose: Rock the Casbah +""" + +import argparse + + +# -------------------------------------------------- +def get_args(): + """Get command-line arguments""" + + parser = argparse.ArgumentParser( + description='Rock the Casbah', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('positional', + metavar='str', + help='A positional argument') + + parser.add_argument('-a', + '--arg', + help='A named string argument', + metavar='str', + type=str, + default='') + + parser.add_argument('-i', + '--int', + help='A named integer argument', + metavar='int', + type=int, + default=0) + + parser.add_argument('-f', + '--file', + help='A readable file', + metavar='FILE', + type=argparse.FileType('rt'), + default=None) + + parser.add_argument('-o', + '--on', + help='A boolean flag', + action='store_true') + + return parser.parse_args() + + +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + str_arg = args.arg + int_arg = args.int + file_arg = args.file + flag_arg = args.on + pos_arg = args.positional + + 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}"') + + +# -------------------------------------------------- +if __name__ == '__main__': + main() diff --git a/01_hello/hello3.py b/01_hello/hello3.py new file mode 100755 index 000000000..2ab2930d7 --- /dev/null +++ b/01_hello/hello3.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python3 +""" +Author : kakao +Date : 2021-09-28 +Purpose: Rock the Casbah +""" + +import argparse + + +# -------------------------------------------------- +def get_args(): + """Get command-line arguments""" + + parser = argparse.ArgumentParser( + description='Rock the Casbah', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('positional', + metavar='str', + help='A positional argument') + + parser.add_argument('-a', + '--arg', + help='A named string argument', + metavar='str', + type=str, + default='') + + parser.add_argument('-i', + '--int', + help='A named integer argument', + metavar='int', + type=int, + default=0) + + parser.add_argument('-f', + '--file', + help='A readable file', + metavar='FILE', + type=argparse.FileType('rt'), + default=None) + + parser.add_argument('-o', + '--on', + help='A boolean flag', + action='store_true') + + return parser.parse_args() + + +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + str_arg = args.arg + int_arg = args.int + file_arg = args.file + flag_arg = args.on + pos_arg = args.positional + + 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}"') + + +# -------------------------------------------------- +if __name__ == '__main__': + main() diff --git a/01_hello/hello4.py b/01_hello/hello4.py new file mode 100755 index 000000000..a527d197d --- /dev/null +++ b/01_hello/hello4.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python3 +""" +Author : NowHappy +Date : 2021-09-28 +Purpose: Rock the Casbah +""" + +import argparse + + +# -------------------------------------------------- +def get_args(): + """Get command-line arguments""" + + parser = argparse.ArgumentParser( + description='Rock the Casbah', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('positional', + metavar='str', + help='A positional argument') + + parser.add_argument('-a', + '--arg', + help='A named string argument', + metavar='str', + type=str, + default='') + + parser.add_argument('-i', + '--int', + help='A named integer argument', + metavar='int', + type=int, + default=0) + + parser.add_argument('-f', + '--file', + help='A readable file', + metavar='FILE', + type=argparse.FileType('rt'), + default=None) + + parser.add_argument('-o', + '--on', + help='A boolean flag', + action='store_true') + + return parser.parse_args() + + +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + str_arg = args.arg + int_arg = args.int + file_arg = args.file + flag_arg = args.on + pos_arg = args.positional + + 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}"') + + +# -------------------------------------------------- +if __name__ == '__main__': + main() From bc0b217d63001cb0e77e85df8b3f8b6a62aa4ca2 Mon Sep 17 00:00:00 2001 From: joy Date: Fri, 1 Oct 2021 10:50:52 +0900 Subject: [PATCH 02/15] #2 joy.y --- 02_crowsnest/crowsnest.py | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100755 02_crowsnest/crowsnest.py diff --git a/02_crowsnest/crowsnest.py b/02_crowsnest/crowsnest.py new file mode 100755 index 000000000..9a7045fb8 --- /dev/null +++ b/02_crowsnest/crowsnest.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 +""" +Author : NowHappy +Date : 2021-09-28 +Purpose: Rock the Casbah +""" + +import argparse + + +# -------------------------------------------------- +def get_args(): + """Get command-line arguments""" + + parser = argparse.ArgumentParser( + description="Crow's Nest -- choose the correct article", + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('word', + metavar='word', + help='A word') + + return parser.parse_args() + + +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + word = args.word + char = word[0].lower() + article = 'an' if char in 'aeiou' else 'a' + print(f'Ahoy, Captain, {article} {word} off the larboard bow!') + + +# -------------------------------------------------- +if __name__ == '__main__': + main() From c98c3a7b4847618182552d7936626827d39daddb Mon Sep 17 00:00:00 2001 From: joy Date: Fri, 1 Oct 2021 10:51:01 +0900 Subject: [PATCH 03/15] #3 joy.y --- 03_picnic/picnic.py | 54 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100755 03_picnic/picnic.py diff --git a/03_picnic/picnic.py b/03_picnic/picnic.py new file mode 100755 index 000000000..e814370b3 --- /dev/null +++ b/03_picnic/picnic.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +""" +Author : NowHappy +Date : 2021-09-30 +Purpose: Rock the Casbah +""" + +import argparse + + +# -------------------------------------------------- +def get_args(): + """Get command-line arguments""" + + parser = argparse.ArgumentParser( + description='Picnic game', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('item', + nargs='+', + metavar='str', # for help + help='Item(s) to bring') + + parser.add_argument('-s', + '--sorted', + help='Sort the items', + action='store_true') + + return parser.parse_args() + + +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + items = args.item + num = len(items) + + if args.sorted: + items.sort() + + if num < 2: + print(f'You are bringing {items[0]}.') + elif num < 3: + print(f'You are bringing {items[0]} and {items[1]}.') + else: + items[-1] = 'and ' + items[-1] + print('You are bringing ' + ', '.join(items) + '.') + + +# -------------------------------------------------- +if __name__ == '__main__': + main() From c14bd30e4dbf19f88744ef6a1c4804e208fc06db Mon Sep 17 00:00:00 2001 From: joy Date: Sat, 2 Oct 2021 15:32:19 +0900 Subject: [PATCH 04/15] #4 joy.y --- 04_jump_the_five/jump.py | 52 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100755 04_jump_the_five/jump.py diff --git a/04_jump_the_five/jump.py b/04_jump_the_five/jump.py new file mode 100755 index 000000000..16c55c483 --- /dev/null +++ b/04_jump_the_five/jump.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Author : NowHappy +Date : 2021-10-02 +Purpose: Jump the Five +""" + +import argparse + + +# -------------------------------------------------- +def get_args(): + """Get command-line arguments""" + + parser = argparse.ArgumentParser( + description='Jump the Five', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('input', + metavar='str', + help='Input text') + + return parser.parse_args() + + +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + text = args.input + + jumper = { '1': '9', + '2': '8', + '3': '7', + '4': '6', + '5': '0', + '6': '4', + '7': '3', + '8': '2', + '9': '1', + '0': '5' + } + + for char in args.input: + print(jumper.get(char, char), end='') + print() + + +# -------------------------------------------------- +if __name__ == '__main__': + main() From 050bca14998513311d885e0817bb5e8f082d2faa Mon Sep 17 00:00:00 2001 From: joy Date: Sat, 2 Oct 2021 15:32:26 +0900 Subject: [PATCH 05/15] #5 joy.y --- 05_howler/howler.py | 50 +++++++++++++++++++++++++++++++++++++++++++++ inputs/out.txt | 3 +-- 2 files changed, 51 insertions(+), 2 deletions(-) create mode 100755 05_howler/howler.py diff --git a/05_howler/howler.py b/05_howler/howler.py new file mode 100755 index 000000000..089c7726c --- /dev/null +++ b/05_howler/howler.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python3 +""" +Author : NowHappy +Date : 2021-10-02 +Purpose: Rock the Casbah +""" + +import argparse +import os + + +# -------------------------------------------------- +def get_args(): + """Get command-line arguments""" + + parser = argparse.ArgumentParser( + description='howler (upper-cases input)', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('input', + metavar='text', + help='Input string or file') + + parser.add_argument('-o', + '--outfile', + help='Output filename', + metavar='str', + type=argparse.FileType('wt'), + default='') + + return parser.parse_args() + + +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + str_args = args.input + outfile_args = args.outfile + + if os.path.isfile(args.input): + str_args = open(str_args).read() + + print(f'{str_args.upper()}', file=outfile_args) if outfile_args else print(f'{str_args.upper()}') + + +# -------------------------------------------------- +if __name__ == '__main__': + main() diff --git a/inputs/out.txt b/inputs/out.txt index 1746bd0e2..65facd7b1 100644 --- a/inputs/out.txt +++ b/inputs/out.txt @@ -1,2 +1 @@ -this is some text -this is some more text +test222 \ No newline at end of file From 1a67f3d7110ae93fb8805f8bb8cffb2b0c4680ef Mon Sep 17 00:00:00 2001 From: joy Date: Sat, 2 Oct 2021 15:57:37 +0900 Subject: [PATCH 06/15] #5-2 joy.y --- 05_howler/howler.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/05_howler/howler.py b/05_howler/howler.py index 089c7726c..48a8cef0a 100755 --- a/05_howler/howler.py +++ b/05_howler/howler.py @@ -26,9 +26,14 @@ def get_args(): help='Output filename', metavar='str', type=argparse.FileType('wt'), - default='') + default=None) - return parser.parse_args() + args = parser.parse_args() + + if os.path.isfile(args.input): + args.input = open(args.input).read().rstrip() + + return args # -------------------------------------------------- @@ -36,13 +41,10 @@ def main(): """Make a jazz noise here""" args = get_args() - str_args = args.input + str_args = args.input.upper() outfile_args = args.outfile - if os.path.isfile(args.input): - str_args = open(str_args).read() - - print(f'{str_args.upper()}', file=outfile_args) if outfile_args else print(f'{str_args.upper()}') + print(f'{str_args}', file=outfile_args) if outfile_args else print(f'{str_args}') # -------------------------------------------------- From 6f8aa4297803318f1b5d024af7314a450b22a933 Mon Sep 17 00:00:00 2001 From: joy Date: Mon, 4 Oct 2021 23:56:47 +0900 Subject: [PATCH 07/15] #6 joy.y --- 06_wc/wc.py | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100755 06_wc/wc.py diff --git a/06_wc/wc.py b/06_wc/wc.py new file mode 100755 index 000000000..43f87ab6c --- /dev/null +++ b/06_wc/wc.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 +""" +Author : NowHappy +Date : 2021-10-04 +Purpose: Rock the Casbah +""" + +import argparse +import sys + +# -------------------------------------------------- +def get_args(): + """Get command-line arguments""" + + parser = argparse.ArgumentParser( + description='Emulate wc (word count)', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('file', + help='Input file(s)', + metavar='FILE', + nargs='*', + type=argparse.FileType('rt'), + default=[sys.stdin]) + + return parser.parse_args() + + +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + t_num_lines = t_num_words = t_num_bytes = 0 + + for fh in args.file: + num_lines = num_words = num_bytes = 0 + for line in fh: + num_lines += 1 + num_words += len(line.split()) + num_bytes += len(line) + print(f'{num_lines:8}{num_words:8}{num_bytes:8} {fh.name}') + t_num_lines += num_lines + t_num_words += num_words + t_num_bytes += num_bytes + + if len(args.file) > 1: + print(f'{t_num_lines:8}{t_num_words:8}{t_num_bytes:8} total') + + +# -------------------------------------------------- +if __name__ == '__main__': + main() From f12667fa9df5b5da82180da9380c480b1b466ce9 Mon Sep 17 00:00:00 2001 From: joy Date: Wed, 6 Oct 2021 14:24:21 +0900 Subject: [PATCH 08/15] #7 joy.y --- 04_jump_the_five/jump.py | 5 +--- 07_gashlycrumb/gashlycrumb.py | 50 +++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 4 deletions(-) create mode 100755 07_gashlycrumb/gashlycrumb.py diff --git a/04_jump_the_five/jump.py b/04_jump_the_five/jump.py index 16c55c483..fe23c39df 100755 --- a/04_jump_the_five/jump.py +++ b/04_jump_the_five/jump.py @@ -28,7 +28,6 @@ def main(): """Make a jazz noise here""" args = get_args() - text = args.input jumper = { '1': '9', '2': '8', @@ -42,9 +41,7 @@ def main(): '0': '5' } - for char in args.input: - print(jumper.get(char, char), end='') - print() + print(''.join([jumper.get(char, char) for char in args.input])) # -------------------------------------------------- diff --git a/07_gashlycrumb/gashlycrumb.py b/07_gashlycrumb/gashlycrumb.py new file mode 100755 index 000000000..891c4d41f --- /dev/null +++ b/07_gashlycrumb/gashlycrumb.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python3 +""" +Author : NowHappy +Date : 2021-10-05 +Purpose: Rock the Casbah +""" + +import argparse + + +# -------------------------------------------------- +def get_args(): + """Get command-line arguments""" + + parser = argparse.ArgumentParser( + description='Gashlycrumb', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('letter', + metavar='letter', + help='Letter(s)', + nargs='+') + + parser.add_argument('-f', + '--file', + help='Input file', + metavar='FILE', + type=argparse.FileType('rt'), + default='gashlycrumb.txt') + + args = parser.parse_args() + + args.sentences = { line[0].upper() : line.rstrip() for line in args.file } + + return args + + +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + + for letter in args.letter: + print(args.sentences.get(letter.upper(), f'I do not know "{letter}".')) + + +# -------------------------------------------------- +if __name__ == '__main__': + main() From 5ce2d01e30970e4f6e7039d9a3b321af3797dc75 Mon Sep 17 00:00:00 2001 From: joy Date: Thu, 7 Oct 2021 00:45:04 +0900 Subject: [PATCH 09/15] #8 joy.y --- 08_apples_and_bananas/apples.py | 55 +++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100755 08_apples_and_bananas/apples.py diff --git a/08_apples_and_bananas/apples.py b/08_apples_and_bananas/apples.py new file mode 100755 index 000000000..e56d7fa3b --- /dev/null +++ b/08_apples_and_bananas/apples.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +""" +Author : NowHappy +Date : 2021-10-06 +Purpose: Apples and bananas +""" + +import argparse +import os + +# -------------------------------------------------- +def get_args(): + """Get command-line arguments""" + + parser = argparse.ArgumentParser( + description='Apples and bananas', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('text', + metavar='text', + help='Input text or file') + + parser.add_argument('-v', + '--vowel', + help='The vowel to substitute', + metavar='vowel', + choices=list('aeiou'), + type=str, + default='a') + + return parser.parse_args() + + +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + vowel = args.vowel + + # dictionary = { 'a' : vowel, 'e' : vowel, 'i': vowel, 'o': vowel, 'u': vowel, 'A' : vowel.upper(), 'E': vowel.upper(), 'I': vowel.upper(), 'O': vowel.upper(), 'U': vowel.upper() } + + trans = str.maketrans('aeiouAEIOU', vowel * 5 + vowel.upper() * 5) # == str.maketrans(dictionary) + + if os.path.isfile(args.text): + fh = open(args.text, 'rt') + for line in fh: + print(f'{line.rstrip().translate(trans)}') + else: + print(f'{args.text.translate(trans)}') + + +# -------------------------------------------------- +if __name__ == '__main__': + main() From b230f2de184226f666251e243ec2cd0c0e538e82 Mon Sep 17 00:00:00 2001 From: joy Date: Fri, 8 Oct 2021 00:12:55 +0900 Subject: [PATCH 10/15] #9 joy.y --- 09_abuse/abuse.py | 76 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100755 09_abuse/abuse.py diff --git a/09_abuse/abuse.py b/09_abuse/abuse.py new file mode 100755 index 000000000..e88d04dc2 --- /dev/null +++ b/09_abuse/abuse.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 +""" +Author : NowHappy +Date : 2021-10-07 +Purpose: Heap abuse +""" + +import argparse +import random + + +# -------------------------------------------------- +def get_args(): + """Get command-line arguments""" + + parser = argparse.ArgumentParser( + description='Heap abuse', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('-a', + '--adjectives', + help='Number of adjectives', + metavar='adjectives', + type=int, + default=2) + + parser.add_argument('-n', + '--number', + help='Number of insults', + metavar='insults', + type=int, + default=3) + + parser.add_argument('-s', + '--seed', + help='Random seed', + metavar='seed', + type=int, + default=None) + + args = parser.parse_args() + + if args.adjectives < 1: + parser.error(f'--adjectives "{args.adjectives}" must be > 0') + + if args.number < 1: + parser.error(f'--number "{args.number}" must be > 0') + + return args + + +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + random.seed(args.seed) # 무작위성을 제어하기 위해 설정. (유사 무작위 : seed를 사용해서 무작위성을 제어), 해당 라인 주석 처리하면 seed 값으로 current system time을 기본값으로 사용하므로 실행시마다 값이 바뀜. + + adjective_list = '''bankrupt base caterwauling corrupt cullionly detestable dishonest false + filthsome filthy foolish foul gross heedless indistinguishable infected + insatiate irksome lascivious lecherous loathsome lubbery old peevish + rascaly rotten ruinous scurilous scurvy slanderous sodden-witted + thin-faced toad-spotted unmannered vile wall-eyed'''.split() + + noun_list = '''Judas Satan ape ass barbermonger beggar block boy braggart butt + carbuncle coward coxcomb cur dandy degenerate fiend fishmonger fool + gull harpy jack jolthead knave liar lunatic maw milksop minion + ratcatcher recreant rogue scold slave swine traitor varlet villain worm'''.split() + + for _ in range(args.number): + print(f'You {", ".join(random.sample(adjective_list, args.adjectives))} {random.choice(noun_list)}!') + + +# -------------------------------------------------- +if __name__ == '__main__': + main() From 209017ef8d8753037bb512fb9ba324850d5014fb Mon Sep 17 00:00:00 2001 From: joy Date: Sat, 9 Oct 2021 14:02:32 +0900 Subject: [PATCH 11/15] #10 joy.y --- 10_telephone/telephone.py | 83 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100755 10_telephone/telephone.py diff --git a/10_telephone/telephone.py b/10_telephone/telephone.py new file mode 100755 index 000000000..e790c72fb --- /dev/null +++ b/10_telephone/telephone.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 +""" +Author : NowHappy +Date : 2021-10-09 +Purpose: Telephone +""" + +import argparse +import random +import os +import string + +# -------------------------------------------------- +def get_args(): + """Get command-line arguments""" + + parser = argparse.ArgumentParser( + description='Telephone', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('text', + metavar='text', + help='Input text of file') + + parser.add_argument('-s', + '--seed', + help='Random seed', + metavar='seed', + type=int, + default=None) + + parser.add_argument('-m', + '--mutations', + help='Percent mutations', + metavar='mutations', + type=float, + default=0.1) + + args = parser.parse_args() + + if args.mutations > 1 or args.mutations < 0: + parser.error(f'--mutations "{args.mutations}" must be between 0 and 1') + + return args + + +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + text = args.text + mutations = args.mutations + random.seed(args.seed) + alpha = ''.join(sorted(string.ascii_letters + string.punctuation)) + + new_text_line = [] + if os.path.isfile(text): + print('You said: ', end='') + for line in open(text, 'rt'): + new_text_line = list(line.rstrip()) + print(f'"{line.rstrip()}"') + len_text = len(line.rstrip()) + num_mutations = round(len_text * mutations) + for i in random.sample(range(len_text), num_mutations): + # print(f'i = {i}, char = {line[i]}, index = {alpha.find(line[i])}') + # list.index 함수로 색인 위치 찾으면 없을때 error 발생. 있는지 확인하고 쓰던가 아니면 find 함수 쓸 것!! + # find 반환값 : 색인 위치. 찾을 수 없는 경우 -1 반환 + new_text_line[i] = random.choice(alpha.replace(line[i], '')) # replace 함수는 line[i] 에 해당하는 문자가 alpha에 '있으면' 해당 문자를 치환한다. 없어도 error 안 남. + print(f'I heard : "' + ''.join(new_text_line)+ '"') + else: + print(f'You said: "{text}"') + new_text_line = list(text) + len_text = len(text) + num_mutations = round(len_text * mutations) + for i in random.sample(range(len_text), num_mutations): + new_text_line[i] = random.choice(alpha.replace(text[i], '')) + print(f'I heard : "' + ''.join(new_text_line)+ '"') + + +# -------------------------------------------------- +if __name__ == '__main__': + main() From 54f5523caaf60fb1492682fd976afb73c2c9f0d2 Mon Sep 17 00:00:00 2001 From: joy Date: Wed, 13 Oct 2021 22:48:34 +0900 Subject: [PATCH 12/15] #11 joy.y --- 11_bottles_of_beer/bottles.py | 82 +++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100755 11_bottles_of_beer/bottles.py diff --git a/11_bottles_of_beer/bottles.py b/11_bottles_of_beer/bottles.py new file mode 100755 index 000000000..f85aeaa44 --- /dev/null +++ b/11_bottles_of_beer/bottles.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python3 +""" +Author : NowHappy +Date : 2021-10-13 +Purpose: Bottles of beer song +""" + +import argparse + + +# -------------------------------------------------- +def get_args(): + """Get command-line arguments""" + + parser = argparse.ArgumentParser( + description='Bottles of beer song', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('-n', + '--num', + help='How many bottles', + metavar='number', + type=int, + default=10) + + args = parser.parse_args() + + if args.num < 1: + parser.error(f'--num "{args.num}" must be greater than 0') + + return args + + +# -------------------------------------------------- +def verse(bottle): + """Sing a verse""" + + bottle_str = str(bottle) + s1 = 's' if bottle > 1 else '' + s2 = 's' if bottle != 2 else '' + next_bottle = str(bottle - 1) if bottle > 1 else 'No more' + + return '\n'.join([ + f'{bottle_str} bottle{s1} of beer on the wall,', + f'{bottle_str} bottle{s1} of beer,', + 'Take one down, pass it around,', + # f'{str(bottle - 1)} bottle{s2} of beer on the wall!' if bottle > 1 else 'No more bottles of beer on the wall!' + f'{next_bottle} bottle{s2} of beer on the wall!' + ]) + + +# -------------------------------------------------- +def test_verse(): + """Test verse""" + + last_verse = verse(1) + assert last_verse == '\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_bottles = verse(2) + assert two_bottles == '\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!' + ]) + + +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + # for i in range(args.num, 0, -1): + # print(verse(i)) + # print() if i > 1 else None + print('\n\n'.join(map(verse, range(args.num, 0, -1)))) + + +# -------------------------------------------------- +if __name__ == '__main__': + main() From dfe5b748655dce8285418c58fb46d7132f83439b Mon Sep 17 00:00:00 2001 From: joy Date: Wed, 13 Oct 2021 23:37:12 +0900 Subject: [PATCH 13/15] #12 joy.y --- 12_ransom/ransom.py | 70 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100755 12_ransom/ransom.py diff --git a/12_ransom/ransom.py b/12_ransom/ransom.py new file mode 100755 index 000000000..fc0373d0e --- /dev/null +++ b/12_ransom/ransom.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 +""" +Author : NowHappy +Date : 2021-10-13 +Purpose: Ransom Note +""" + +import argparse +import random +import os + +# -------------------------------------------------- +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) + + return parser.parse_args() + + +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + random.seed(args.seed) + + if os.path.isfile(args.text): + for line in open(args.text, 'rt'): + print(''.join(map(choose, line.rstrip()))) + else: + print(''.join(map(choose, args.text))) + + +# -------------------------------------------------- +def choose(char): + """change a character""" + + # return char.upper() if random.choice([False, True]) else char.lower() + return random.choice([char.lower(), char.upper()]) + + +# -------------------------------------------------- +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.setstate(state) + + +# -------------------------------------------------- +if __name__ == '__main__': + main() From 103df332a046f5b2248eb2a26c98cd3f7096e285 Mon Sep 17 00:00:00 2001 From: joy Date: Fri, 15 Oct 2021 00:12:42 +0900 Subject: [PATCH 14/15] #13 joy.y --- 13_twelve_days/twelve_days.py | 93 +++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100755 13_twelve_days/twelve_days.py diff --git a/13_twelve_days/twelve_days.py b/13_twelve_days/twelve_days.py new file mode 100755 index 000000000..c076eadea --- /dev/null +++ b/13_twelve_days/twelve_days.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 +""" +Author : NowHappy +Date : 2021-10-14 +Purpose: Twelve Days of Christmas +""" + +import argparse +import sys + +# -------------------------------------------------- +def get_args(): + """Get command-line arguments""" + + parser = argparse.ArgumentParser( + description='Twelve Days of Christmas', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('-n', + '--num', + help='Number of days to sing', + metavar='days', + type=int, + default=12) + + parser.add_argument('-o', + '--outfile', + help='Outfile', + metavar='FILE', + type=argparse.FileType('wt'), + default=sys.stdout) + + args = parser.parse_args() + + if args.num < 1 or args.num > 12: + parser.error(f'--num "{args.num}" must be between 1 and 12') + + return args + + +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + outfile_args = args.outfile + + result = '\n\n'.join(map(verse, range(1, args.num + 1))) + print(result, file=outfile_args) + + +# -------------------------------------------------- +def verse(day): + """Create a verse""" + ordinal = ['first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh', + 'eighth', 'ninth', 'tenth', 'eleventh', 'twelfth'] + + text = ['A partridge in a pear tree.', + 'Two turtle doves,', + 'Three French hens,', + 'Four calling birds,', + 'Five gold rings,', + 'Six geese a laying,', + 'Seven swans a swimming,', + 'Eight maids a milking,', + 'Nine ladies dancing,', + 'Ten lords a leaping,', + 'Eleven pipers piping,', + 'Twelve drummers drumming,'] + + verses = [f'On the {ordinal[day-1]} day of Christmas,', 'My true love gave to me,'] + for n in reversed(range(0, day)): + verses.append('And ' + text[n].replace('A', 'a', 1)) if n == 0 and day > 1 else verses.append(text[n]) + + return '\n'.join(verses) + + +# -------------------------------------------------- +def test_verse(): + """Test verse""" + assert verse(1) == '\n'.join(['On the first day of Christmas,', + 'My true love gave to me,', + 'A partridge in a pear tree.']) + + assert verse(2) == '\n'.join(['On the second day of Christmas,', + 'My true love gave to me,', + 'Two turtle doves,', + 'And a partridge in a pear tree.']) + + +# -------------------------------------------------- +if __name__ == '__main__': + main() From a7a2335a250caa4393e97230125be09a17b7eaa9 Mon Sep 17 00:00:00 2001 From: joy Date: Mon, 18 Oct 2021 22:29:11 +0900 Subject: [PATCH 15/15] #14 joy.y --- 14_rhymer/rhymer.py | 78 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100755 14_rhymer/rhymer.py diff --git a/14_rhymer/rhymer.py b/14_rhymer/rhymer.py new file mode 100755 index 000000000..470aabc53 --- /dev/null +++ b/14_rhymer/rhymer.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +""" +Author : NowHappy +Date : 2021-10-15 +Purpose: Make rhyming "words" +""" + +import argparse +import re +import string as s + +consonants = ''.join([c for c in s.ascii_lowercase if c not in 'aeiou']) + + +# -------------------------------------------------- +def get_args(): + """Get command-line arguments""" + + parser = argparse.ArgumentParser( + description='Make rhyming "words"', + formatter_class=argparse.ArgumentDefaultsHelpFormatter) + + parser.add_argument('word', + metavar='word', + help='A word to rhyme') + + return parser.parse_args() + + +# -------------------------------------------------- +def main(): + """Make a jazz noise here""" + + args = get_args() + first, second = stemmer(args.word) + + ex = [c for c in s.ascii_lowercase if c not in 'aeiou'] + ex.extend(['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']) + ex.sort() + + if second: + if len(first) != 0: + ex.remove(first) + for c in ex: + print(f'{c}{second}') + else: + print(f'Cannot rhyme "{args.word}"') + + +# -------------------------------------------------- +def stemmer(word): + """Return leading consonants (if any), and 'stem' of word""" + match = re.match(f'([{consonants}]+)?([aeiou])(.*)', word.lower()) + if match: + p1 = match.group(1) or '' + p2 = match.group(2) or '' + p3 = match.group(3) or '' + return p1, p2 + p3 + else: + return word.lower(), '' + + +# -------------------------------------------------- +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', '') + assert stemmer('123') == ('123', '') + + +# -------------------------------------------------- +if __name__ == '__main__': + main()