From ee032555eb167c2b4262e0bc4677f39eca7d7f3a Mon Sep 17 00:00:00 2001 From: Phil Bajsicki Date: Fri, 19 Apr 2024 12:57:47 +0200 Subject: [PATCH] First commit. --- LICENSE | 4 +- Python_Programming_Interview_Problem_1.pdf | Bin 0 -> 55045 bytes README.md | 3 - README.org | 196 +++++++++++++++++++++ pydiceprob.py | 81 +++++++++ 5 files changed, 279 insertions(+), 5 deletions(-) create mode 100644 Python_Programming_Interview_Problem_1.pdf delete mode 100644 README.md create mode 100644 README.org create mode 100644 pydiceprob.py diff --git a/LICENSE b/LICENSE index 1354ea8..a375cd2 100644 --- a/LICENSE +++ b/LICENSE @@ -209,7 +209,7 @@ If you develop a new program, and you want it to be of the greatest possible use To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. python-dice-top-k-game-probabilities - Copyright (C) 2024 phil + Copyright (C) 2024 Phil Bajsicki This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. @@ -221,7 +221,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - python-dice-top-k-game-probabilities Copyright (C) 2024 phil + python-dice-top-k-game-probabilities Copyright (C) 2024 Phil Bajsicki This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. diff --git a/Python_Programming_Interview_Problem_1.pdf b/Python_Programming_Interview_Problem_1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d0f1ecd60b228c72f674aeb36e7cfcb68f25bcb1 GIT binary patch literal 55045 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%0Dh6 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md deleted file mode 100644 index c65b431..0000000 --- a/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# python-dice-top-k-game-probabilities - -A programming exercise given to me as part of a job application. \ No newline at end of file diff --git a/README.org b/README.org new file mode 100644 index 0000000..3510fea --- /dev/null +++ b/README.org @@ -0,0 +1,196 @@ +#+title: Python Programming Dice Probabilities +#+auto_tangle: t +#+PROPERTY: session *python* +#+PROPERTY: cache yes +#+PROPERTY: exports both +#+PROPERTY: header-args :tangle pydiceprob.py +* Introduction +:LOGBOOK: +CLOCK: [2024-04-19 Fri 10:33]--[2024-04-19 Fri 12:50] => 2:17 +CLOCK: [2024-04-17 Wed 13:40]--[2024-04-17 Wed 14:14] => 0:34 +:END: + +I was given a problem as such: + +#+begin_quote +You have two players, Bob and Alice, that take turns in rolling a fair k-sided die. Whoever rolls a +k first wins the game. The Python program should output the probability that Bob wins the +game for k = 6 thru 99. That is, the output will be an array of probabilities where index 0 is the +probability when k = 6; index 1 when k = 7; etc. +#+end_quote + +Bonus points: +#+begin_quote +If you have 8me and interest, create a REST server rather than a console program. Flask or +FastAPI can be used. The REST endpoint should be a GET, accept no Request Body, accept an +op8onal Header for “k”, and return: +- The array of probabili8es in JSON format if no “k” is provided in the Header +- A single probability in JSON format if a “k” is provided in the Header +#+end_quote + +* Thinking +Given the problem's nature, we need the following functionality: + +1. Output the probability for Bob to win. +2. Create an array of probabilities that contains the data for the output. +3. Calculate the probabilities based on the value of =k=. +4. Define the value of =k=, between 6 and 99 inclusive. + +For the bonus secion: +1. Create a FastAPI endpoint that takes an optional Header for =k=. +2. Return either the full array of probabilities (no =k= provided), or return the + specific probability if =k= is provided. + + +* Code +The following is python code blocks, with the documentation attached. Using +=org-babel=, these are tangled into =pydiceprob.py=, +which is the final python script. +** Imports +#+begin_src python +import sys +import json +import pprint +#+end_src + +#+RESULTS: +: None +** Pretty Print +#+begin_src python +pp = pp.Printer = pprint.PrettyPrinter(indent=2, compact=True) +#+end_src +And a usage printe + +#+begin_src python +def usagequit(): + print("""Usage: python pydiceprob.py [k] [mode] + k between 6 and 99 + modes: single, single-table, multi, multi-table + single prints out the probability of a single throw with a k-sided dice yielding k. + single-table prints out a table between 6 and k with the probabilities of a single throw yielding k. + multi prints out the probability of winning (assuming we're going first) in a game where two players take turns and the person who throws k first wins. + multi-table prints out the probability of winning for a range between 6 and k if you have the first throw.""") + quit() +#+end_src +** Main +Main function for managing CLI interactions, and dispatch +#+begin_src python +def main(): + global k + try: + if int(sys.argv[1]) >= 6: + k = int(sys.argv[1]) + else: + usagequit() + except IndexError: + usagequit() + global mode + try: + mode = sys.argv[2] + except IndexError: + usagequit() + dispatch(mode, k) + +#+end_src + +#+begin_src python +def dispatch(mode, k): + modes = ["single", "multi", "single-table", "multi-table"] + if mode not in modes: + usagequit() + if mode == "single": + print(first_turn_probability(k)) + elif mode == "multi" : + print(multi_turn_single(k)) + elif mode == "single-table": + print(first_turn_protatbilities(k)) + elif mode == "multi-table": + print(multi_turn_table(k)) + + +#+end_src +** Array of dice and players +Second, we need to grab the value of =k=, the size of the dice we're calculating +the probability for. Depending on the implementation we choose to use, we'll be either +grabbing it from the CLI, or the REST API. For now, this will remain in the CLI. + +Then for the bonus code, we need several steps. First, we need to generate a list +such that we have numbers between 6 and 99 in it. +#+begin_src python +def dice(k): + if k < 6: + print("Dice must be at least 6-sided") + elif k == 6: + dice_array = [6] + else: + dice_array = list(range(6, k)) +#+end_src + +#+RESULTS: +: None + + +** Single turn win probability +Then, we have to calculate the probability of a win on each throw given a dice +of size =k=. + +Both players (Alice and Bob) throw dice, alternating, and the person who throws the top number first (=k=) wins. Bob always goes first for simplicity. + +A dice of size =k= has a 1/k probability of winning each throw. + +=k+1= here, because python calculates range(a, b) indices in the way of b-a, so +for a = 6 and b = 10, it'll give an array of 4 items (10-6 = 4) as such: +~[6, 7, 8, 9]~, as it counts the first item as 1. + +Using =k+1= we can get the correct, inclusive array that we desire: ~[6, 7, 8, 9, 10]~. +#+begin_src python +def first_turn_probabilities(k): + result = {} + for k in range(6, int(k)+1): + result[k] = 1/k + return result + +def first_turn_probability(k): + return first_turn_probabilities(k)[k] + +#+end_src + +#+RESULTS: +** Multi-turn win probability +Over many throws, the advantage of winning will decrease, approaching 50%. + +We're assuming Bob goes first, and then is followed by Alice. +For each throw, the probability of winning is the same. + +#+begin_src python +def multi_turn_single(k): + p_win = 1 / k # Winning probability on any given throw + p_lose = (k-1) / k # Losing probability on any given throw + bob_wins_prob_sum = 0 + r = p_lose**2 + probability_win = p_win / (1 - r) + return probability_win +#+end_src + +And then we want to generate a table of all the probabilities up to =k=. + +#+begin_src python +def multi_turn_table(k): + result = {} + for i in range(6, int(k+1)): + result[i] = multi_turn_single(i) + return result +#+end_src +** Print +#+begin_src python +def print(stuff): + pp.pprint(stuff) +#+end_src + +** Script +To run as a script. + +#+begin_src python +if __name__ == "__main__": + main() +#+end_src diff --git a/pydiceprob.py b/pydiceprob.py new file mode 100644 index 0000000..ed11dd1 --- /dev/null +++ b/pydiceprob.py @@ -0,0 +1,81 @@ +import sys +import json +import pprint + +pp = pp.Printer = pprint.PrettyPrinter(indent=2, compact=True) + +def usagequit(): + print("""Usage: python pydiceprob.py [k] [mode] + k between 6 and 99 + modes: single, single-table, multi, multi-table + single prints out the probability of a single throw with a k-sided dice yielding k. + single-table prints out a table between 6 and k with the probabilities of a single throw yielding k. + multi prints out the probability of winning (assuming we're going first) in a game where two players take turns and the person who throws k first wins. + multi-table prints out the probability of winning for a range between 6 and k if you have the first throw.""") + quit() + +def main(): + global k + try: + if int(sys.argv[1]) >= 6: + k = int(sys.argv[1]) + else: + usagequit() + except IndexError: + usagequit() + global mode + try: + mode = sys.argv[2] + except IndexError: + usagequit() + dispatch(mode, k) + +def dispatch(mode, k): + modes = ["single", "multi", "single-table", "multi-table"] + if mode not in modes: + usagequit() + if mode == "single": + print(first_turn_probability(k)) + elif mode == "multi" : + print(multi_turn_single(k)) + elif mode == "single-table": + print(first_turn_protatbilities(k)) + elif mode == "multi-table": + print(multi_turn_table(k)) + +def dice(k): + if k < 6: + print("Dice must be at least 6-sided") + elif k == 6: + dice_array = [6] + else: + dice_array = list(range(6, k)) + +def first_turn_probabilities(k): + result = {} + for k in range(6, int(k)+1): + result[k] = 1/k + return result + +def first_turn_probability(k): + return first_turn_probabilities(k)[k] + +def multi_turn_single(k): + p_win = 1 / k # Winning probability on any given throw + p_lose = (k-1) / k # Losing probability on any given throw + bob_wins_prob_sum = 0 + r = p_lose**2 + probability_win = p_win / (1 - r) + return probability_win + +def multi_turn_table(k): + result = {} + for i in range(6, int(k+1)): + result[i] = multi_turn_single(i) + return result + +def print(stuff): + pp.pprint(stuff) + +if __name__ == "__main__": + main()