From 71c1288c1dcf3b54f6f45ca67a2b714f408d8944 Mon Sep 17 00:00:00 2001
From: Valentin Gehrke <madmaurice@zom.bi>
Date: Tue, 4 Nov 2014 13:02:25 +0100
Subject: [PATCH] some more bullsh*t

---
 1000games.py                         |  19 +++++++
 __pycache__/tictactoe.cpython-34.pyc | Bin 0 -> 8062 bytes
 ackermann.py                         |  21 ++++++++
 binomial.py                          |  34 +++++++++++++
 flooring.rkt                         |   9 ++++
 logic.rkt                            |  17 +++++++
 looknsay.py                          |  24 +++++++++
 number_of_ways.py                    |  20 ++++++++
 pivottable.py                        |  38 ++++++++++++++
 tictactoe.py                         |  72 +++++++++++++++++++--------
 10 files changed, 233 insertions(+), 21 deletions(-)
 create mode 100644 1000games.py
 create mode 100644 __pycache__/tictactoe.cpython-34.pyc
 create mode 100644 ackermann.py
 create mode 100644 binomial.py
 create mode 100644 flooring.rkt
 create mode 100644 logic.rkt
 create mode 100644 looknsay.py
 create mode 100644 number_of_ways.py
 create mode 100644 pivottable.py

diff --git a/1000games.py b/1000games.py
new file mode 100644
index 0000000..0e38e9e
--- /dev/null
+++ b/1000games.py
@@ -0,0 +1,19 @@
+from tictactoe import *
+
+wins = {}
+
+game = Game([AI("X"),AI("O")])
+
+for i in range(1000):
+    winner = game.run(out=False)
+    game.reset()
+    if winner in wins:
+        wins[winner] += 1
+    else:
+        wins[winner] = 1
+
+for winner,count in wins.items():
+    if winner == Board.draw:
+        print("%d draws." % count)
+    else:
+        print("%s has won %d times." % (str(winner),count))
diff --git a/__pycache__/tictactoe.cpython-34.pyc b/__pycache__/tictactoe.cpython-34.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a1300432dd14181d9e903099362abaa7e93f5c89
GIT binary patch
literal 8062
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
a%oS6`<G2FoW4ICwB?mwLI2<{F?|%asdQgJ^

literal 0
HcmV?d00001

diff --git a/ackermann.py b/ackermann.py
new file mode 100644
index 0000000..ee6806d
--- /dev/null
+++ b/ackermann.py
@@ -0,0 +1,21 @@
+cache = {}
+
+def ack(m,n):
+    if (m,n) in cache:
+        return cache[(m,n)]
+    elif m == 0:
+        ans = n+1
+    elif n == 0:
+        ans = ack(m-1,1)
+    else:
+        ans = ack(m-1, ack(m, n-1))
+    cache[(m,n)] = ans
+    return ans
+
+if __name__ == "__main__":
+    for i in range(6):
+        for j in range(6):
+            try:
+                print("ack(%d,%d) = %d" % (i,j, ack(i,j)))
+            except RuntimeError:
+                print("ack(%d,%d) = <StackOverflow>" % (i,j))
diff --git a/binomial.py b/binomial.py
new file mode 100644
index 0000000..3ecf638
--- /dev/null
+++ b/binomial.py
@@ -0,0 +1,34 @@
+def pascal(n):
+    if n == 0:
+        return [1]
+    p = [1,1]
+    for i in range(n-1):
+        pn = [1]
+        for j in range(len(p)-1):
+            pn.append(p[j]+p[j+1])
+        pn.append(1)
+        p = pn
+    return p
+
+def binomial(n):
+    i = n
+    j = 0
+    for c in pascal(n):
+        yield (c,i,j)
+        i -= 1
+        j += 1
+
+if __name__ == "__main__":
+    print("Form: (x+y)^n")
+    x = float(input("Insert x:"))
+    y = float(input("Insert y:"))
+    n = int(input("Insert n:"))
+
+    assert(n>0)
+    res = 0
+    s = []
+    for (c,i,j) in binomial(n):
+        s.append("%d*(%.2f)^%d*(%.2f)^%d" % (c,x,i,y,j))
+        res += c * x**i * y**j
+    print(" + ".join(s))
+    print("Result: %f" % res)
diff --git a/flooring.rkt b/flooring.rkt
new file mode 100644
index 0000000..7b57467
--- /dev/null
+++ b/flooring.rkt
@@ -0,0 +1,9 @@
+#lang racket
+
+(define (f i N M)
+  (modulo (* (expt i 4) (floor (/ N i))) M))
+
+(define (flooring N M)
+  (modulo (for/sum ([i (in-range N)]) (f (+ i 1) N M)) M))
+
+(displayln (flooring 12412 5123))
diff --git a/logic.rkt b/logic.rkt
new file mode 100644
index 0000000..3a852d1
--- /dev/null
+++ b/logic.rkt
@@ -0,0 +1,17 @@
+#lang racket
+
+(define (_not p)
+  (if (equal? p 1) 0 1))
+
+(define (_or p q)
+  (if (equal? p 1) 1 (if (equal? q 1) 1 0)))
+
+(define (_and p q)
+  (_not (_or (_not p) (_not q))))
+
+(define (_xor p q)
+  (_and (_or p q) (_not (_and p q))))
+
+(for* ([p '(0 1)] [q '(0 1)])
+      (display p) (display q)
+      (displayln (_xor p q)))
diff --git a/looknsay.py b/looknsay.py
new file mode 100644
index 0000000..23f4fbc
--- /dev/null
+++ b/looknsay.py
@@ -0,0 +1,24 @@
+def looknsay(n):
+    s = str(n)
+    sn = ""
+    q = 0
+    c = None
+    for x in s:
+        if c != x:
+            if q > 0:
+                sn += "%d%s" % (q,c)
+            q = 1
+            c = x
+        else:
+            q+=1
+    if q > 0:
+        sn += "%d%s" % (q,c)
+    return int(sn)
+
+if __name__ == "__main__":
+    c = 1
+    print(c)
+    for i in range(5):
+        c = looknsay(c)
+        print(c)
+
diff --git a/number_of_ways.py b/number_of_ways.py
new file mode 100644
index 0000000..b6c0756
--- /dev/null
+++ b/number_of_ways.py
@@ -0,0 +1,20 @@
+def number_of_ways(numbers):
+    s = sum(numbers)
+    if s%3 != 0:
+        return 0
+    s = s/3
+    t = 2*s
+
+    u,v,w = 0,0,0
+    for x in numbers[:-1]:
+        print( (u,v,w) )
+        u += x
+        if u==t:
+            w+=v
+        if u==s:
+            v+=1
+
+    return w
+
+if __name__ == "__main__":
+    print( number_of_ways([0]*4) )
diff --git a/pivottable.py b/pivottable.py
new file mode 100644
index 0000000..ce56b0c
--- /dev/null
+++ b/pivottable.py
@@ -0,0 +1,38 @@
+import urllib.request
+
+dataurl = "https://gist.githubusercontent.com/coderd00d/ca718df8e633285885fa/raw/eb4d0bb084e71c78c68c66e37e07b7f028a41bb6/windfarm.dat"
+
+class Data(object):
+    days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"]
+
+    def __init__(self):
+        self.data = {}
+
+    def addData(self, tower, day, energy):
+        if tower not in self.data:
+            self.data[tower] = { day : 0 for day in self.days }
+
+        self.data[tower][day] += energy
+
+    def __str__(self):
+        s = "| Tower |  " + "  |  ".join(self.days) + "  |\n"
+        for tower in sorted(self.data.keys()):
+            s += ("| %-5d | " % tower) + " | ".join(["%5d" % self.data[tower][day] for day in self.days]) + " |\n"
+        return s
+
+    @staticmethod
+    def get_from_url(url):
+        data = Data()
+        req = urllib.request.urlopen(url)
+        rawdata = req.read().decode("utf-8")
+        req.close()
+        for line in rawdata.split("\n"):
+            try:
+                (tower, day, energy) = line.split(" ")
+                data.addData(int(tower),day,int(energy))
+            except Exception:
+                pass
+        return data
+
+if __name__ == "__main__":
+    print(str(Data.get_from_url(dataurl)))
diff --git a/tictactoe.py b/tictactoe.py
index 7d3b14e..167b110 100644
--- a/tictactoe.py
+++ b/tictactoe.py
@@ -1,5 +1,8 @@
 import random
 
+def rotate(l):
+    return l[1:] + l[:1]
+
 class Player(object):
 
     def __init__(self,rep):
@@ -11,10 +14,18 @@ class Player(object):
     def count_win_chances(self, board):
         chances = 0
         for line in board.get_all_lines():
-            if all( map( lambda v: v == self or v == Board.empty, line) ):
-                chances += 1
+            chances += self.win_chance_line(line)
         return chances
 
+    def win_chance_line(self,line):
+        c = 1
+        for p in line:
+            if p == self:
+                c += 1
+            elif p != Board.empty:
+                return 0
+        return c
+
 class Board(object):
     draw = object()
     empty = Player(" ")
@@ -127,8 +138,38 @@ class Human(Player):
             except Exception:
                 print("Try again?")
 
-def rotate(l):
-    return l[1:] + l[:1]
+class Random(Player):
+    def play(self, enemy, board):
+        fields = list(board.get_empty_fields())
+        return random.choice(fields)
+
+class Game(object):
+    def __init__(self, players, size=3):
+        self.size = size
+        self.players = players
+        self.reset()
+
+    def reset(self):
+        self.board = Board(size=self.size)
+        self.winner = None
+
+    def run(self,out=True):
+        if out:
+            print(str(self.board))
+
+        while self.board.get_winner() is None:
+            (x,y) = self.players[0].play(self.players[1], self.board)
+            while self.board.get(x,y) != Board.empty:
+                print("Fail")
+                (x,y) = self.players[0].play(players[1], self.board)
+            self.board.set(x,y,self.players[0])
+            self.players = rotate(self.players)
+
+            if out:
+                print()
+                print(str(self.board))
+
+        return self.board.get_winner()
 
 def menu(prompt,choices):
     print("> %s" % prompt)
@@ -137,34 +178,23 @@ def menu(prompt,choices):
     return int(input("Your choice: "))
 
 if __name__ == "__main__":
-    c = menu("Playmode",["Ai vs Ai","Ai vs Player","Player vs Player"])
+    c = menu("Playmode",["Ai vs Ai","Ai vs Random","Ai vs Player","Player vs Player"])
     if c == 0:
         players = [ AI("X"), AI("O") ]
     elif c == 1:
-        players = [ Human("X"), AI("O") ]
+        players = [ AI("X"), Random("O") ]
     elif c == 2:
+        players = [ Human("X"), AI("O") ]
+    elif c == 3:
         players = [ Human("X"), Human("O") ]
     else:
         import sys
         sys.exit(0)
 
-    board = Board(size=3)
+    game = Game(players)
 
-    print(str(board))
+    winner = game.run()
 
-    while board.get_winner() is None:
-        (x,y) = players[0].play(players[1],board)
-        while board.get(x,y) != Board.empty:
-            print("Try again!")
-            (x,y) = players[0].play(players[1],board)
-
-        board.set(x,y,players[0])
-        players = rotate(players)
-
-        print()
-        print(str(board))
-
-    winner = board.get_winner()
 
     if winner == Board.draw:
         print("Round draw!")