Google
 
Web unafbapune.blogspot.com

Monday, June 10, 2013

 

Brute force Mastermind

Python came to rescue when playing Mastermind with 8 colors permitting repetition and the use of empty slot(s). Much faster and fun than directly using my brain, but received some rather strong objections from my 12 year old :) Here you go.

# Online syntax coloring: http://tohtml.com/python
import itertools
import random

NONE=0
BLACK=1
BLUE=2
GREEN=3
ORANGE=4
PURPLE=5
RED=6
WHITE=7
YELLOW=8

COLORS = {
    NONE:  "NONE",
    BLACK: "BLACK",
    BLUE:  "BLUE",
    GREEN: "GREEN",
    ORANGE:"ORANGE",
    PURPLE:"PURPLE",
    RED:   "RED",
    WHITE: "WHITE",
    YELLOW:"YELLOW",
}

SLOT_NUM = 5 # pick 5 colors in each turn

# Return true if the given target is consistent with the history;
# false otherwise
def match_history(x):
    for t in history:
        a = [0]*len(COLORS)
        for i in x:
            a[i] += 1
        red_c = 0
        white_c = 0
        # Count reds
        for i in range(SLOT_NUM):
            if t[i] == x[i]:
                red_c += 1
                a[t[i]] -= 1
        if red_c != history[t][RED]:
            return False
        # Count whites
        for i in range(SLOT_NUM):
            if t[i] != x[i]:
                if a[t[i]] > 0:
                    white_c += 1
                    a[t[i]] -= 1
        if white_c != history[t][WHITE]:
            return False
    return True
    
def all_possibilities():
    # All unique colors from 0 to 8
    c = [0, 1, 2, 3, 4, 5, 6, 7, 8]
    for x in itertools.product(c, repeat=SLOT_NUM):
        yield x

def display(guess):
    print str(tuple(map(lambda i: COLORS[i], guess))).replace("'","")

def guess_next():
    # Find all possible guesses
    matched = [x for x in all_possibilities() if match_history(x)]
    hit = len(matched)
    if hit == 1:
        print "The only possible permutation:\n"
        map(lambda x: display(x), matched)
    elif hit > 1:
        if hit <= 30:
            print hit, "possible permutations:\n"
            map(lambda x: display(x), matched)
        else: # More than 30
            print "Randomly picking 30 out of", hit, "possible permutations:\n"
            for i in range(30):
                r = random.randrange(hit)
                count = 0
                for x in matched:
                    if count == r:
                        display(x)
                        break
                    count += 1
    else:
        print "Are you sure the history is valid ?"

history = {
    (PURPLE, YELLOW, NONE, ORANGE, NONE):   {RED: 2, WHITE: 0},
    (GREEN, YELLOW, BLACK, ORANGE, RED):    {RED: 0, WHITE: 1},
    # (PURPLE, BLUE, WHITE, WHITE, NONE):  {RED: 0, WHITE: 1},
}

guess_next()


Tuesday, June 04, 2013

 

Taylor series worth memorizing

About \(x = 0\):

  \[ \begin{aligned} \frac{1}{1-x} &= 1 + x + x^2 + \cdots \\ e^x &= 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \cdots \\ \ln(1+x) &= x - \frac{x^2}{2} + \frac{x^3}{3} + \cdots \\ \cos x &= 1 - \frac{x^2}{2!} + \frac{x^4}{4!} + \cdots \\ \sin x &= x - \frac{x^3}{3!} + \frac{x^5}{5!} + \cdots \\ \arctan x &= x - \frac{x^3}{3} + \frac{x^5}{5} + \cdots \\ \end{aligned} \]

About \(x = a\):

  \[ \begin{aligned} f(x) = f(a) + f'(a) (x-a) + f''(a) \frac{(x-a)^2}{2!} + f'''(a) \frac{(x-a)^3}{3!} + \cdots \end{aligned} \]

Let \(h = x - a\):

  \[ \begin{aligned} f(a + h) = f(a) + f'(a) h + f''(a) \frac{h^2}{2!} + f'''(a) \frac{h^3}{3!} + \cdots \end{aligned} \]

This page is powered by Blogger. Isn't yours?