External Exam Download Resources Web Applications Games Recycle Bin

Unsorted 2

autotrump.py

import random

#1mb of text data taken from speeches made by Donald Trump
#at various points in his 2016 campaign for President of the United States:
#https://github.com/ryanmcdermott/trump-speeches
trump = open('trump.txt', encoding='utf8').read()
everyWordSaid = trump.split()

def make_pairs(listOfAllWordsSaid):
    #for all the words said, stopping at second last:
    for i in range(len(listOfAllWordsSaid)-1):
        #yield = stream results on the fly, without waiting
        #for the function to complete, then return the values:
        yield (listOfAllWordsSaid[i], listOfAllWordsSaid[i+1])
        #^^this will get the next word that follows.. i.e. i+1!
        
pairs = make_pairs(everyWordSaid)
####got my pairs, now put them into a dictionary, joining 'like' words:

word_dict = {}
for word_1, word_2 in pairs:
    if word_1 in word_dict.keys():
        word_dict[word_1].append(word_2)
    else:
        word_dict[word_1] = [word_2]

#job done. now lets make a sentence, starting with a capital:
first_word = random.choice(list(word_dict.keys()))
while first_word.islower():
    first_word = first_word = random.choice(list(word_dict.keys()))

sentence = [first_word]
word_length = 10

#for the rest of the sentence, take a value from the previous word key:
for i in range(word_length):
    sentence.append(random.choice(word_dict[sentence[-1]]))

print(' '.join(sentence))

block chain.py

import hashlib
import uuid
#--------------------------------BLOCK:
class Block(object):
    def __init__(self, data=None, previous_hash=None):
        self.identifier = uuid.uuid4().hex
        self.nonce = None
        self.data = data
        self.previous_hash = previous_hash

    def hash(self, nonce=None):
        nonce = nonce or self.nonce

        message = hashlib.sha256()
        message.update(self.identifier.encode('utf-8'))
        message.update(str(nonce).encode('utf-8'))
        message.update(str(self.data).encode('utf-8'))
        message.update(str(self.previous_hash).encode('utf-8'))

        return message.hexdigest()

    @staticmethod
    def hash_is_valid(the_hash):
        return the_hash.startswith('0000')

    @property
    def mined(self):
        return self.nonce is not None

    def mine(self):
        the_nonce = self.nonce or 0

        while True:
            the_hash = self.hash(nonce=the_nonce)
            if self.hash_is_valid(the_hash):
                self.nonce = the_nonce
                return
            else:
                the_nonce += 1

    def update_data(self, data):
        self.data = data
        self.nonce = None

    def __repr__(self):
        return 'Block<Hash: {}, Nonce: {}>'.format(self.hash(), self.nonce)

#--------------------------------BLOCKCHAIN:
class Blockchain(object):
    def __init__(self):
        self.head = None
        self.blocks = {}

    def add_block(self, new_block):
        previous_hash = self.head.hash() if self.head else None
        new_block.previous_hash = previous_hash

        self.blocks[new_block.identifier] = {
            'block': new_block,
            'previous_hash': previous_hash,
            'previous': self.head,
        }
        self.head = new_block

    @property
    def broken(self):
        return self.block_is_broken(self.head)

    def block_is_broken(self, block):
        previous = self[block.identifier]['previous']
        previous_hash = self[block.identifier]['previous_hash']
        previous_is_broken = (previous_hash != previous.hash() or self.block_is_broken(previous)) if previous else False
        return previous_is_broken or not block.mined

    def repair(self):
        print('Repairing blockchain starting from head: {}'.format(self.head.identifier))
        self.repair_block(self.head)

    def repair_block(self, block):
        previous = self[block.identifier]['previous']
        if previous and self.block_is_broken(previous):
            print('When trying to repair block {}, found that previous block {} also needed repair'.format(
                block.identifier,
                previous.identifier,
            ))
            self.repair_block(previous)
            self[block.identifier]['previous_hash'] = previous.hash()

        if self.block_is_broken(block):
            print('Repairing block {}'.format(block.identifier))
            block.mine()

    def __len__(self):
        return len(self.blocks)

    def __repr__(self):
        num_existing_blocks = len(self)
        return 'Blockchain<{} Blocks, Head: {}>'.format(
            num_existing_blocks,
            self.head.identifier if self.head else None
        )

    def __getitem__(self, identifier):
        return self.blocks[identifier]
#--------------------------------MAIN:
chain = Blockchain()

first = Block('first')
second = Block('second')
third = Block('third')

chain.add_block(first)
chain.add_block(second)
chain.add_block(third)

first.update_data('so broke')

print("Chain broken? " + str(chain.broken))  # True

chain.repair()

print("Chain broken? " + str(chain.broken))  # False

drawing in tkinter.py

from tkinter import *
import random
import time

window = Tk()
window.title = "Ball"

canvas = Canvas(width=640, height=480)
canvas.pack()

class Ball:
    def __init__(self, canvas):
        self.canvas = canvas
        #create_oval (x,y in top left.. x,y in bottom right):
        self.id = canvas.create_oval(10, 10, 25, 25, fill="salmon")
        self.canvas.move(self.id, 320, 240) #middle
    def shift_right(self):
        self.canvas.move(self.id, +1, 0)

ball = Ball(canvas)

#mainloop() blocks / halts execution of python program.
#update_idletasks() and update() do not block -
#execution continues after those methods.

#therefore, tk.mainloop() can be thought of as:
#while True:
#    tk.update_idletasks()
#    tk.update()


while True:
    ball.shift_right()
    window.update_idletasks()
    window.update()
    time.sleep(0.01)

genetic algorithm.py

from random import randint, random

GLOBAL_PERCENT = 100

def individual(length, min, max):
    'Create a member of the population.'
    return [ randint(min,max) for x in range(length) ]

def population(count, length, min, max):
    """
    Create a number of individuals (i.e. a population).

    count: the number of individuals in the population
    length: the number of values per individual
    min: the minimum possible value in an individual's list of values
    max: the maximum possible value in an individual's list of values

    """
    return [ individual(length, min, max) for x in range(count) ]

def fitness(individual, target):
    """
    Determine the fitness of an individual. Higher is better.

    individual: the individual to evaluate
    target: the target number individuals are aiming for
    """
    sumTotal = 0
    for x in individual:
        sumTotal = sumTotal + x
    return abs(target-sumTotal)

def grade(pop, target):
    'Find average fitness for a population.'
    summed = 0
    for y in (fitness(x, target) for x in pop):
        summed = summed + y
    return abs(GLOBAL_PERCENT - (summed / len(pop) * 1.0))
    

def evolve(pop, target, retain=0.2, random_select=0.05, mutate=0.01):
    graded = [ (fitness(x, target), x) for x in pop]
    graded = [ x[1] for x in sorted(graded)]
    retain_length = int(len(graded)*retain)
    parents = graded[:retain_length]
    # randomly add other individuals to
    # promote genetic diversity
    for individual in graded[retain_length:]:
        if random_select > random():
            parents.append(individual)
    # mutate some individuals
    for individual in parents:
        if mutate > random():
            pos_to_mutate = randint(0, len(individual)-1)
            # this mutation is not ideal, because it
            # restricts the range of possible values,
            # but the function is unaware of the min/max
            # values used to create the individuals,
            individual[pos_to_mutate] = randint(
                min(individual), max(individual))
    # crossover parents to create children
    parents_length = len(parents)
    desired_length = len(pop) - parents_length
    children = []
    while len(children) < desired_length:
        male = randint(0, parents_length-1)
        female = randint(0, parents_length-1)
        if male != female:
            male = parents[male]
            female = parents[female]
            half = len(male) // 2
            child = male[:half] + female[half:]
            children.append(child)        
    parents.extend(children)
    return parents


#-------------------------------------------------------------------
#--------set constants:

#what we want the values in our individual lists to add up to, default 371:
target = 371
#number of individuals in a population, default 100:
p_count = 100
#number of values per individual, default 6:
i_length = 6
#min vaule in an individuals list, default: 0
i_min = 0
#max vaule in an individuals list, default: 100
i_max = 100
#passes in evolution, default: 100
evolution_passes = 100


#--------create population:
p = population(p_count, i_length, i_min, i_max)

#--------parent history:
population_history = [p]

#--------determines starting fitness of population:
fitness_history = [grade(p, target)]

#--------loop through evolution cycle, evolving and grading fitness each pass:
for i in range(evolution_passes):
    p = evolve(p, target)
    population_history.append(p)
    fitness_history.append(grade(p, target))

#--------print fitness history:
for data in fitness_history:
    print("Health: " + str(data) + "%")

#for data in population_history:
#    print(data)

power ball.py

import random

#--------------------------------------------------
stop_on_jackpot = True
powerplay = True
reset_max = True
print_every = 1 #assuming 1 dollar per round
jackpot_value = 1300000000
#--------------------------------------------------
cash_to_spend = 1000

#THESE NEED ADJUSTING TO BE MORE REALISTIC!
#PLACEHOLDERS ONLY ATM
prizes = {(0, False):0,
          (1, False):0,
          (2, False):0,
          (3, False):7,
          (4, False):100,
          (5, False):1000000,
          (0, True):4,
          (1, True):4,
          (2, True):7,
          (3, True):100,
          (4, True):50000,
          (5, True):jackpot_value}

ticket_numbers = set(range(5))
ticket_powerball = 0

balls = tuple(range(40))
powerballs = tuple(range(40))

winnings = 0
spent = 0
max_prize = 0
jackpot = False
powerplay_draw = 0
powerplay_multiplier = 0
iterations = 0

while not jackpot or not stop_on_jackpot:
    chosen_balls = random.sample(balls, 5)
    chosen_powerball = random.choice(powerballs)

    numbers_hit = sum(1 for x in chosen_balls if x in ticket_numbers)
    powerball_hit = chosen_powerball == ticket_powerball
    matches = (numbers_hit, powerball_hit)
    jackpot = matches == (5, True)

    if powerplay:
        if jackpot_value > 150000000:
            powerplay_draw = random.randint(1,42)
        else:
            powerplay_draw = random.randint(1,43)

        if powerplay_draw <= 24:
            powerplay_multiplier = 2
        elif powerplay_draw <= 24+13:
            powerplay_multiplier = 3
        elif powerplay_draw <= 24+13+3:
            powerplay_multiplier = 4
        elif powerplay_draw <= 24+13+3+2:
            powerplay_multiplier = 5
        else:
            powerplay_multiplier = 10

        if jackpot:
            powerplay_multiplier = 1
        elif matches == (5,False):
            powerplay_multiplier = 2

        spent += 3
    else:
        powerplay_multiplier = 1
        spent += 2

    prize = prizes[matches] * powerplay_multiplier
    winnings += prize
    max_prize = max(prize, max_prize)
    iterations += 1

    if iterations % print_every == 0 or jackpot:         
        stats = 'spent:{:,}, winnings:{:,}, net:{:,} max_win:{:,}'.format(
            spent, winnings, winnings-spent, max_prize
        )
        print(stats)
        if reset_max:
            max_prize = 0
    if spent > cash_to_spend:
        break


prime numba gen.py

#Using terminal: Python36-32\Scripts\pip install numba
from numba import vectorize
from math import sqrt

#http://numba.pydata.org/numba-doc/latest/user/vectorize.html
@vectorize(["int32(int32)"], target = "parallel")
def is_prime(n):
    for i in range(3,round(sqrt(n))+1,2):
        if n % i == 0:
            return 0
    return 1

def main():
    f = open("prime.html","a")
    f.write("2\n") #file write
    f.write("3\n") #file write
    n = 6 #..or can skip ahead here if you wish
    while True:    
        if is_prime(n-1):
            f.write(str(n-1)+"\n")
        if is_prime(n+1):
            f.write(str(n+1)+"\n")
        n+=6
main()

#check prime.html in same folder for list of prime numbers

py_game.py

import pygame

pygame.init()
screen = pygame.display.set_mode((400, 300))
done = False
is_blue = True
x = 30
y = 30

clock = pygame.time.Clock()

while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
        if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
            is_blue = not is_blue
        
    pressed = pygame.key.get_pressed()
    if pressed[pygame.K_UP]: y -= 3
    if pressed[pygame.K_DOWN]: y += 3
    if pressed[pygame.K_LEFT]: x -= 3
    if pressed[pygame.K_RIGHT]: x += 3
        
    screen.fill((0, 0, 0))
    if is_blue:
        color = (0, 128, 255)
    else:
        color = (255, 100, 0)
    pygame.draw.rect(screen, color, pygame.Rect(x, y, 60, 60))
        
    pygame.display.flip()
    clock.tick(60)