diff --git a/implement-shell-tools/cat/cat-python.py b/implement-shell-tools/cat/cat-python.py new file mode 100644 index 00000000..7d0edbf3 --- /dev/null +++ b/implement-shell-tools/cat/cat-python.py @@ -0,0 +1,42 @@ +import sys + +def cat_file(filename, flag): + try: + with open(filename, 'r') as file: + if not flag: + for line in file: + print(line, end="") + + elif flag == "-n": + for index, line in enumerate(file, start=1): + print(f"{index:6}\t{line}", end="") + + elif flag == "-b": + line_number = 1 + for line in file: + if line.strip() == "": + print(line, end="") + else: + print(f"{line_number:6}\t{line}", end="") + line_number += 1 + + except FileNotFoundError: + print(f"cat: {filename}: No such file or directory", file=sys.stderr) + +def main(): + args = sys.argv[1:] + + flag = False + + if "-n" in args: + flag = "-n" + args.remove("-n") + elif "-b" in args: + flag = "-b" + args.remove("-b") + + for filename in args: + cat_file(filename, flag) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/implement-shell-tools/ls/ls-python.py b/implement-shell-tools/ls/ls-python.py new file mode 100644 index 00000000..8b7e2a7b --- /dev/null +++ b/implement-shell-tools/ls/ls-python.py @@ -0,0 +1,33 @@ +import sys +import os + +def main(): + args = sys.argv[1:] + + path = "." + one_per_line = False + show_hidden = False + + for arg in args: + if arg == "-a": + show_hidden = True + elif arg == "-1": + one_per_line = True + elif not arg.startswith("-"): + path = arg + + entries = os.listdir(path) + + entries.sort() + + if not show_hidden: + entries = [f for f in entries if not f.startswith(".")] + + if one_per_line: + for entry in entries: + print(entry) + else: + print(" ".join(entries)) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/implement-shell-tools/wc/wc-python.py b/implement-shell-tools/wc/wc-python.py new file mode 100644 index 00000000..8ad2021e --- /dev/null +++ b/implement-shell-tools/wc/wc-python.py @@ -0,0 +1,66 @@ +import sys + +def count_file(filename): + + with open(filename, 'r') as file: + content = file.read() + + lines = len(content.splitlines()) + words = len(content.split()) + chars = len(content) + + return (lines, words, chars) + + +def format_output(lines, words, chars, filename, show_l, show_w, show_c): + parts = [] + + if show_l: + parts.append(f"{lines:8}") + if show_w: + parts.append(f"{words:8}") + if show_c: + parts.append(f"{chars:8}") + + parts.append(filename) + + return " ".join(parts) + +def main(): + args = sys.argv[1:] + + l = w = c = False + files = [] + + for arg in args: + if arg == "-l": + l = True + elif arg == "-w": + w = True + elif arg == "-c": + c = True + elif not arg.startswith("-"): + files.append(arg) + + if not (l or w or c): + l = w = c = True + + total_lines = total_words = total_chars = 0 + processed_files = 0 + + for filename in files: + result = count_file(filename) + if result: + lines, words, chars = result + print(format_output(lines, words, chars, filename, l, w, c)) + + total_lines += lines + total_words += words + total_chars += chars + processed_files += 1 + + if processed_files > 1: + print(format_output(total_lines, total_words, total_chars, "total", l, w, c)) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/number-systems/README.md b/number-systems/README.md deleted file mode 100644 index 77a3bde9..00000000 --- a/number-systems/README.md +++ /dev/null @@ -1,65 +0,0 @@ -Do not use any tools or programming to solve these problems. Work it out yourself by hand, and fill in the answers. - -Do not convert any binary numbers to decimal when solving a question unless the question explicitly tells you to. - -The goal of these exercises is for you to gain an intuition for binary numbers. Using tools to solve the problems defeats the point. - -Convert the decimal number 14 to binary. -Answer: - -Convert the binary number 101101 to decimal: -Answer: - -Which is larger: 1000 or 0111? -Answer: - -Which is larger: 00100 or 01011? -Answer: - -What is 10101 + 01010? -Answer: - -What is 10001 + 10001? -Answer: - -What's the largest number you can store with 4 bits, if you want to be able to represent the number 0? -Answer: - -How many bits would you need in order to store the numbers between 0 and 255 inclusive? -Answer: - -How many bits would you need in order to store the numbers between 0 and 3 inclusive? -Answer: - -How many bits would you need in order to store the numbers between 0 and 1000 inclusive? -Answer: - -How can you test if a binary number is a power of two (e.g. 1, 2, 4, 8, 16, ...)? -Answer: - -Convert the decimal number 14 to hex. -Answer: - -Convert the decimal number 386 to hex. -Answer: - -Convert the hex number 386 to decimal. -Answer: - -Convert the hex number B to decimal. -Answer: - -If reading the byte 0x21 as a number, what decimal number would it mean? -Answer: - -If reading the byte 0x21 as an ASCII character, what character would it mean? -Answer: - -If reading the byte 0x21 as a greyscale colour, as described in "Approaches for Representing Colors and Images", what colour would it mean? -Answer: - -If reading the bytes 0xAA00FF as an RGB colour, as described in "Approaches for Representing Colors and Images", what colour would it mean? -Answer: - -If reading the bytes 0xAA00FF as a sequence of three one-byte decimal numbers, what decimal numbers would they be? -Answer: