Advertisement
RandomBooks

The Program

Aug 2nd, 2019
1,066
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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, 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()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement