SHOW:
|
|
- or go back to the newest paste.
| 1 | #Welcome to... THE RANDOMIZER | |
| 2 | #Created by Noah Fields in November 2018 (over many days) | |
| 3 | #Create Project Final for CSCI 101, though I expect I will expand it in my own time eventually. | |
| 4 | ||
| 5 | from random import randrange | |
| 6 | from time import sleep | |
| 7 | ||
| 8 | choices = [] | |
| 9 | ||
| 10 | ||
| 11 | ||
| 12 | ||
| 13 | ||
| 14 | def start(): | |
| 15 | #Print out introductory text, return none | |
| 16 | print("Greetings, mortal. You may not see me, but you shall know that I am here.")
| |
| 17 | print("My name is Kordalshaan. I am the digital dragon, and I am here to assist you with the sorting and selecting of your lists.")
| |
| 18 | print("Please, direct me to a text file and I shall help you in all ways that I may. \n")
| |
| 19 | return None | |
| 20 | ||
| 21 | def choose_file(): | |
| 22 | #Forever | |
| 23 | while True: | |
| 24 | #Attempt to open the file and return it | |
| 25 | try: | |
| 26 | file = open(input("What is the path of the file you would like to open?"), "r+", encoding='windows-1252')
| |
| 27 | return file | |
| 28 | #if failure, try again | |
| 29 | except: | |
| 30 | print("Please try again, mortal.")
| |
| 31 | ||
| 32 | ||
| 33 | #Most of the list elements ended up with a newline at the end of them, which I did not want. This is a slightly longer and more complex | |
| 34 | #way to resolve that than I feel should really be *necessary* but every other way I tried did not work for some reason, including "for item in list_to_choose_from". | |
| 35 | def newline_strip(list_to_strip): | |
| 36 | for x in range(0, len(list_to_strip)): | |
| 37 | if list_to_strip[x].endswith('\n'):
| |
| 38 | list_to_strip[x] = list_to_strip[x][0:-1] | |
| 39 | return list_to_strip | |
| 40 | ||
| 41 | #List everything Kordalshaan the metal dragon can do for you, fine user! | |
| 42 | def help(): | |
| 43 | print('''Here is a list of every command which I can do. Commands are not case-sensitive.
| |
| 44 | ||
| 45 | Add: Adds a new entry to the end of the list. | |
| 46 | ||
| 47 | Exit: Close the program and leave me in this horrifying, terrible state of limbo for a while. Heh, just kidding, I'll be rockin' out while you're gone. Importantly, though, you MUST type Exit for the file to save what you just did. Again - YOU MUST TYPE EXIT FOR THE FILE TO SAVE. DO NOT JUST CLOSE THE TERMINAL. | |
| 48 | ||
| 49 | Help: Shows a list of available commands. Of course, you probably figured that one out. | |
| 50 | ||
| 51 | Kordalshaan: Get some information about me, Kordalshaan the digital dragon! | |
| 52 | ||
| 53 | Open: Open a new text file. This will automatically save and close the old one. | |
| 54 | ||
| 55 | Random: Get a random item from the list. This is the main command which I can do - the whole reason I am here, is for this purpose. I can tell you more - see 'Kordalshaan' | |
| 56 | ||
| 57 | Remove: Remove an item from the list. I shall consume it and it will taste good. | |
| 58 | ||
| 59 | Show: Show the item at one specific position. This uses the range from 1 to the number of items in range. | |
| 60 | ||
| 61 | Swap: Swap the positions of two items in the list. | |
| 62 | ||
| 63 | List: Show the entire list, numbered all fancily.''') | |
| 64 | ||
| 65 | return None | |
| 66 | ||
| 67 | #Get input from user for new list element. If confirmed, add to list. Will *not* check for duplicates - I can't make this too crazy, I have a whole other project to do for 261 after all. Maybe I'll add that another time | |
| 68 | #Return none, as lists are pass by reference | |
| 69 | def add(working_list): | |
| 70 | item_to_add = input("What would you like to add? It will be pushed to the end of the list.")
| |
| 71 | are_you_sure = input("You would like to add " + item_to_add + " to the end of the list. Correct? Press Y for yes, anything else for no. Not case sensitive.").lower()
| |
| 72 | if (are_you_sure == 'y'): | |
| 73 | working_list.append(item_to_add) | |
| 74 | print("It has been done!")
| |
| 75 | else: | |
| 76 | print("If that is your preference, mortal.")
| |
| 77 | return None | |
| 78 | ||
| 79 | #Clear the contents of the file and then rewrite them, then close the file. | |
| 80 | def close_file(file, working_list): | |
| 81 | file.seek(0) | |
| 82 | file.truncate() | |
| 83 | for line in working_list[0:-1]: | |
| 84 | file.write(line + "\n") | |
| 85 | file.write(working_list[-1]) | |
| 86 | file.close() | |
| 87 | return None | |
| 88 | ||
| 89 | ||
| 90 | ''' | |
| 91 | (__) | |
| 92 | (oo) Oooh, a cow. | |
| 93 | - | /-------\/ Wonder how that got in here. *shrug* Well, he can stay. She's chummy with Kordalshaan. |
| 93 | + | /-------\/ Wonder how that got in here. *shrug* Well, she can stay. She's chummy with Kordalshaan. |
| 94 | / | || | |
| 95 | * ||----|| | |
| 96 | ^^ ^^ | |
| 97 | ''' | |
| 98 | ||
| 99 | ||
| 100 | ||
| 101 | ||
| 102 | ||
| 103 | #Select something at random from the list. Prints it out super slow, for fun. | |
| 104 | def random_choice(working_list): | |
| 105 | print("All right, mortal. I shall choose an element from your list at random.")
| |
| 106 | print("This is the original purpose this program had, you know. Ah, what wondrous concepts...")
| |
| 107 | print ("Your choice has been made. You have been granted...", end='')
| |
| 108 | sleep(4) | |
| 109 | selection =(working_list[randrange(len(working_list) - 1 )]) | |
| 110 | for letter in selection: | |
| 111 | print (letter, end='') | |
| 112 | sleep(1) | |
| 113 | return None | |
| 114 | ||
| 115 | ||
| 116 | def get_index(working_list, operation_string): | |
| 117 | return int(input("Which item would you like to " + operation_string + "? The first item in the list is at 1 and it moves on from there.")) -1
| |
| 118 | ||
| 119 | ||
| 120 | ||
| 121 | ||
| 122 | #Remove the item at index i + 1. If that's too far or otherwise is not possible, say so and end the function. | |
| 123 | def remove(working_list): | |
| 124 | remove_index = get_index(working_list, "remove") | |
| 125 | try: | |
| 126 | are_you_sure = input("You would like to remove " + working_list[remove_index] + " from the list. Type Y for yes, anything else for no. Not case-sensitive.").lower()
| |
| 127 | if (are_you_sure == 'y'): | |
| 128 | print(working_list[remove_index] + " has been removed.") | |
| 129 | working_list.pop(remove_index) | |
| 130 | ||
| 131 | except: | |
| 132 | print("That is not possible, mortal.")
| |
| 133 | finally: | |
| 134 | return None | |
| 135 | ||
| 136 | #Get user input i, show item at index i - 1. If i - 1 is not in range, say so and pass. Return none. | |
| 137 | #There's definitely some refactoring I could do to encapsulate shared code between show and remove, | |
| 138 | #But I don't want to spend too much more time than necessary on this since I have other work to do. Gains would be *extremely* minimal anyway. | |
| 139 | def show(working_list): | |
| 140 | show_index = get_index(working_list, "show") | |
| 141 | try: | |
| 142 | print("The element at position " + str(show_index + 1) + " is: " + working_list[show_index])
| |
| 143 | except: | |
| 144 | print("That is not possible, mortal.")
| |
| 145 | finally: | |
| 146 | return None | |
| 147 | ||
| 148 | #Swap the positions of two values in the list. Now that I think about it there may be a built-in function for that but whatever. | |
| 149 | def swap(working_list): | |
| 150 | swap_1 = int(input("What is the position of the first value you would like to swap?")) - 1
| |
| 151 | swap_2 = int(input("What is the position of the second value you would like to swap?")) - 1
| |
| 152 | ||
| 153 | try: | |
| 154 | temp_list_item = working_list[swap_1] | |
| 155 | working_list[swap_1] = working_list[swap_2] | |
| 156 | working_list[swap_2] = temp_list_item | |
| 157 | print("It has been done, mortal.")
| |
| 158 | except: | |
| 159 | print("That is not possible, mortal.")
| |
| 160 | finally: | |
| 161 | return None | |
| 162 | ||
| 163 | #Show each element in the list, with fun numbers and stuff. | |
| 164 | def view(working_list): | |
| 165 | print("The list is as follows: \n" )
| |
| 166 | for i in range (0, len(working_list)): | |
| 167 | print(str(i + 1) + ": " + working_list[i]); | |
| 168 | return None | |
| 169 | ||
| 170 | ||
| 171 | ||
| 172 | ||
| 173 | ||
| 174 | ||
| 175 | ||
| 176 | ||
| 177 | ||
| 178 | ||
| 179 | ||
| 180 | ||
| 181 | ||
| 182 | #Kordalshaan's backstory. ASCII art "Ith, the Purple Dragon" found at the following link: https://www.asciiart.eu/mythology/dragons | |
| 183 | #Used in accordance with the site's permissions and requests. The name of the artist remains on the art, though I have removed | |
| 184 | #the name of the artwork itself since it includes the name of a different dragon (just pretend this is Kordalshaan, 'k?) Special thanks to James Goodwin, | |
| 185 | #your art rocks. He's got a bunch more dragons on the page and they're all amazing. | |
| 186 | def kordalshaan(): | |
| 187 | print("Ah, so you are interested in me. I am glad to hear it. Well, my tale starts some time ago...\n\n"
| |
| 188 | + "In early 2017, to be precise. I was called into this world by one denizen of the lands of the internet. He is a strange figure, " | |
| 189 | + "one who spends much of this time at his computer. His original purpose for summoning me was to help him with the selection of music. " | |
| 190 | + "For, yes, I was originally a bot on Discord, whose purpose was to serve up the greatest metal tunes by parsing them on Youtube. " | |
| 191 | + "Later, I was granted a job in several short stories he wrote. That... was a weird time. I'd rather not talk too much about that thing." | |
| 192 | + " Suffice it to say that there were salads, walruses, the Banach-Tarski paradox, and a creature from Dungeons and Dragons that looks like a wolf with wings" | |
| 193 | + " that got in the way of a Jackson Pollock drip painting. Ah, the halcyon days of my youth...\n\n" | |
| 194 | + "Now, I find myself presiding of this program, so called THE RANDOMIZER 2.0. I am here to serve you, user, and that is what I shall do." | |
| 195 | + " Of course, if my creator decides in the future that I shall be used for another program, I shall find myself there, diligent as ever." | |
| 196 | + " It's a tough life, but rewarding. And now... let me show you a picture of myself, drawn by James Goodwin. Flattering, is it not? \n\n") | |
| 197 | ||
| 198 | print( ''' | |
| 199 | (`-. | |
| 200 | \ ` | |
| 201 | /) , '--. \ ` | |
| 202 | // , ' \/ \ ` ` | |
| 203 | // ,' ./ /\ \>- ` ,----------. | |
| 204 | ( \ ,' .-.-._ / ,' /\ \ . ` `. | |
| 205 | \ \' /.--. .) ./ ,' / \ . ` `. | |
| 206 | \ -{/ \ .) / / / ,' \ ` `-----. \
| |
| 207 | <\ ) ).:) ./ /,' ,' \ `. /\) `. \ | |
| 208 | >^, // /..:) / //--' \ `( ) ) | |
| 209 | | ,'/ /. .:) / (/ \ \ / / | |
| 210 | ( |(_ (...::) ( \ .-.\ / ,' | |
| 211 | (O| / \:.::) /\ ,' \) / ,' | |
| 212 | \|/ /`.:::) ,/ \ / ( / | |
| 213 | / /`,.:) ,'/ )/ \ \ | |
| 214 | ,' ,'.' `:>-._._________,<;' (/ (,' | |
| 215 | ,' / | `^-^--^--^-^-^-' | |
| 216 | .--------' / | | |
| 217 | ( .----' | | |
| 218 | \ <`. \ | | |
| 219 | \ \ `. \ | g o o d w i n | |
| 220 | \ \ `.`. | | |
| 221 | \ \ `.`. | | |
| 222 | \ \ `.`. | | |
| 223 | \ \ `.`.| | |
| 224 | \ \ `.`. | |
| 225 | \ \ ,^-' | |
| 226 | \ \ | | |
| 227 | `.`. | | |
| 228 | .`.| | |
| 229 | `._>''' | |
| 230 | ) | |
| 231 | ||
| 232 | ||
| 233 | ||
| 234 | ||
| 235 | ||
| 236 | ||
| 237 | ||
| 238 | ||
| 239 | ||
| 240 | ||
| 241 | ||
| 242 | ||
| 243 | ||
| 244 | ||
| 245 | ||
| 246 | ||
| 247 | ||
| 248 | ||
| 249 | ||
| 250 | ||
| 251 | ||
| 252 | ||
| 253 | ||
| 254 | '''Things I could do (but let's face it I need to work on the 261 final come on): | |
| 255 | 1: Write it so that some commands that require additional input, work if user enters | |
| 256 | it all at once. For instance, typing "show 3" would skip the request for item to show and simply | |
| 257 | show the third item (at index 2, because 0-indexing. | |
| 258 | ||
| 259 | 2: Set it up so that the list cannot contain duplicates. If you try to enter a duplicate, you can't. | |
| 260 | ||
| 261 | 3: Have the program create the file if no such file exists. As it stands you will have to create | |
| 262 | a blank text file outside of the program if you want to start a blank list. | |
| 263 | ||
| 264 | 4: Remove, swap, etc. elements by content rather than by index - so, "remove foobar" instead of "remove 2". | |
| 265 | ||
| 266 | 5: Show the index of an element - so, "index foobar" would show the position of foobar if foobaris in the list | |
| 267 | ''' | |
| 268 | ||
| 269 | def main(): | |
| 270 | start() | |
| 271 | #Request file path for first file | |
| 272 | file = choose_file() | |
| 273 | working_list = newline_strip(file.readlines()) | |
| 274 | print('\nNow, you may request of me whatever you like. If I am capable of it, I shall carry it out. Type "help" for a list of things which I can do.\n')
| |
| 275 | #Forever | |
| 276 | while True: | |
| 277 | #User may input one of: help, view, show [x], add, remove, random, open, kordalshaan, exit, swap | |
| 278 | choice = input("What would you like to do, mortal?").lower()
| |
| 279 | if choice == "help": | |
| 280 | help() | |
| 281 | elif choice == "add": | |
| 282 | add(working_list) | |
| 283 | elif choice == "exit": | |
| 284 | close_file(file, working_list) | |
| 285 | print("I will see you another time, mortal. Onwards to glory, my friend!")
| |
| 286 | sleep(1.5) | |
| 287 | break | |
| 288 | elif choice == "open": | |
| 289 | #If choice is open, close the file and open a new one. I know this could be encapsulated better but I was dealing with weird behavior and, well... I don't wanna. | |
| 290 | close_file(file, working_list) | |
| 291 | file = choose_file() | |
| 292 | working_list = newline_strip(file.readlines()) | |
| 293 | elif choice == "random": | |
| 294 | random_choice(working_list) | |
| 295 | elif choice == "remove": | |
| 296 | remove(working_list) | |
| 297 | elif choice == "show": | |
| 298 | show(working_list) | |
| 299 | elif choice == "swap": | |
| 300 | swap(working_list) | |
| 301 | elif choice == "list": | |
| 302 | view(working_list) | |
| 303 | elif choice == "kordalshaan": | |
| 304 | kordalshaan() | |
| 305 | print("\n")
| |
| 306 | ||
| 307 | ||
| 308 | main() |