From 524510999f0703c35c5129bbea9d9b1435255b72 Mon Sep 17 00:00:00 2001 From: Michael Zhang Date: Mon, 29 Jan 2018 17:37:09 -0600 Subject: [PATCH] f --- .gitignore | 1 + lab1.py | 99 ++++++++++++++++++ lab10.java | 128 +++++++++++++++++++++++ lab11.java | 95 +++++++++++++++++ lab2.py | 34 ++++++ lab3.py | 32 ++++++ lab4.java | 46 +++++++++ lab5.java | 62 +++++++++++ lab6.java | 59 +++++++++++ lab7.docx | Bin 0 -> 46250 bytes lab7.java | 89 ++++++++++++++++ lab9.java | 95 +++++++++++++++++ project1.py | 79 ++++++++++++++ project2.java | 278 ++++++++++++++++++++++++++++++++++++++++++++++++++ 14 files changed, 1097 insertions(+) create mode 100644 .gitignore create mode 100644 lab1.py create mode 100644 lab10.java create mode 100644 lab11.java create mode 100644 lab2.py create mode 100644 lab3.py create mode 100644 lab4.java create mode 100644 lab5.java create mode 100644 lab6.java create mode 100644 lab7.docx create mode 100644 lab7.java create mode 100644 lab9.java create mode 100644 project1.py create mode 100644 project2.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6b468b6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.class diff --git a/lab1.py b/lab1.py new file mode 100644 index 0000000..5c48cbd --- /dev/null +++ b/lab1.py @@ -0,0 +1,99 @@ +def isInside(v, e): + if type(e) is str: + return v == e + elif type(e) is tuple: + if isInside(v, e[0]) or isInside(v, e[2]): return True + return False + +def solve(v, q): + if isInside(v, q[0]): return solving(v, q) + elif isInside(v, q[2]): return solving(v, q[::-1]) + else: return None + +def solvingAdd(v, q): + if isInside(v, q[0][0]): + return solving(v, (q[0][0], '=', (q[2], '-', q[0][2]))) + elif isInside(v, q[0][2]): + return solving(v, (q[0][2], '=', (q[2], '-', q[0][0]))) + +def solvingSubtract(v, q): + if isInside(v, q[0][0]): + return solving(v, (q[0][0], '=', (q[2], '+', q[0][2]))) + elif isInside(v, q[0][2]): + return solving(v, (q[0][2], '=', (q[0][0], '-', q[2]))) + +def solvingMultiply(v, q): + if isInside(v, q[0][0]): + return solving(v, (q[0][0], '=', (q[2], '/', q[0][2]))) + elif isInside(v, q[0][2]): + return solving(v, (q[0][2], '=', (q[2], '/', q[0][0]))) + +def solvingDivide(v, q): + if isInside(v, q[0][0]): + return solving(v, (q[0][0], '=', (q[2], '*', q[0][2]))) + elif isInside(v, q[0][2]): + return solving(v, (q[0][2], '=', (q[0][0], '/', q[2]))) + +def solving(v, q): + assert isInside(v, q[0]) + if v == q[0]: + return q + else: + return { + '+': solvingAdd, + '-': solvingSubtract, + '*': solvingMultiply, + '/': solvingDivide + }[q[0][1]](v, q) + +# +# TESTS. Test the equation solver for CSci 1913 Lab 1. +# +# James B. Moen +# 12 Sep 16 +# + +# Each PRINT is followed by a comment that shows what must be printed if your +# program works correctly. + +print(isInside('x', 'x')) # True +print(isInside('x', 'y')) # False +print(isInside('x', ('x', '+', 'y'))) # True +print(isInside('x', ('a', '+', 'b'))) # False +print(isInside('x', (('m', '*', 'x'), '+', 'b'))) # True + +print(solve('x', (('a', '+', 'x'), '=', 'c'))) # ('x', '=', ('c', '-', 'a')) +print(solve('x', (('x', '+', 'b'), '=', 'c'))) # ('x', '=', ('c', '-', 'b')) + +print(solve('x', (('a', '-', 'x'), '=', 'c'))) # ('x', '=', ('a', '-', 'c')) +print(solve('x', (('x', '-', 'b'), '=', 'c'))) # ('x', '=', ('c', '+', 'b')) + +print(solve('x', (('a', '*', 'x'), '=', 'c'))) # ('x', '=', ('c', '/', 'a')) +print(solve('x', (('x', '*', 'b'), '=', 'c'))) # ('x', '=', ('c', '/', 'b')) + +print(solve('x', (('a', '/', 'x'), '=', 'c'))) # ('x', '=', ('a', '/', 'c')) +print(solve('x', (('x', '/', 'b'), '=', 'c'))) # ('x', '=', ('c', '*', 'b')) + +print(solve('x', ('y', '=', (('m', '*', 'x'), '+', 'b')))) # ('x', '=', (('y', '-', 'b'), '/', 'm') + +# custom case +print(solve('x', (('a', '+', 'b'), '=', ('w', '-', ('x', '*', ('y', '/', 'z')))))) + +''' +Results: +True +False +True +False +True +('x', '=', ('c', '-', 'a')) +('x', '=', ('c', '-', 'b')) +('x', '=', ('a', '-', 'c')) +('x', '=', ('c', '+', 'b')) +('x', '=', ('c', '/', 'a')) +('x', '=', ('c', '/', 'b')) +('x', '=', ('a', '/', 'c')) +('x', '=', ('c', '*', 'b')) +('x', '=', (('y', '-', 'b'), '/', 'm')) +('x', '=', (('w', '-', ('a', '+', 'b')), '/', ('y', '/', 'z'))) +''' \ No newline at end of file diff --git a/lab10.java b/lab10.java new file mode 100644 index 0000000..a932e18 --- /dev/null +++ b/lab10.java @@ -0,0 +1,128 @@ +// ARRAY QUEUE. A fixed length queue implemented as a circular array. + +class ArrayQueue { + private int front; // Index of front object in OBJECTS. + private int rear; // Index obf rear object in OBJECTS. + private Base[] objects; // The objects in the queue. + + public class Iterator { + private ArrayQueue parent; + private int position; + public Iterator(ArrayQueue parent) { + this.parent = parent; + this.position = 0; + } + public boolean hasNext() { + int _rear = parent.rear - parent.front; + if (_rear < 0) _rear += parent.objects.length; + return this.position < _rear; + } + public Base next() { + return parent.objects[(parent.front + ++this.position) % parent.objects.length]; + } + } + + public Iterator iterator() { + return new Iterator(this); + } + + // Constructor. Make a new empty queue that can hold SIZE - 1 elements. + + public ArrayQueue(int size) { + if (size >= 1) { + front = 0; + rear = 0; + objects = (Base[]) new Object[size]; + } else { + throw new IllegalArgumentException("Size must be at least one."); + } + } + + // IS EMPTY. Test if the queue is empty. + + public boolean isEmpty() { + return front == rear; + } + + // IS FULL. Test if the queue can hold no more elements. + + public boolean isFull() { + return front == (rear + 1) % objects.length; + } + + // ENQUEUE. Add OBJECT to the rear of the queue. + + public void enqueue(Base object) { + int nextRear = (rear + 1) % objects.length; + if (front == nextRear) { + throw new IllegalStateException("Queue is full."); + } else { + rear = nextRear; + objects[rear] = object; + } + } + + // DEQUEUE. Remove an object from the front of the queue and return it. + + public Base dequeue() { + if (isEmpty()) { + throw new IllegalStateException("Queue is empty."); + } else { + front = (front + 1) % objects.length; + Base temp = objects[front]; + objects[front] = null; + return temp; + } + } +} + +class lab10 { + + // MAIN. Start execution here. + + public static void main(String[] args) { + + // Make an ARRAY QUEUE and enqueue some things. + + ArrayQueue queue = new ArrayQueue(5); + queue.enqueue("A"); + queue.enqueue("B"); + queue.enqueue("C"); + + // Make an ITERATOR for QUEUE. + + ArrayQueue.Iterator first = queue.iterator(); + while (first.hasNext()) { + System.out.println(first.next()); // Print A B C, one per line. + } + + // The iterator hasn’t changed QUEUE!. + + System.out.println(queue.isEmpty()); // Print false + System.out.println(queue.dequeue()); // Print A + System.out.println(queue.dequeue()); // Print B + System.out.println(queue.dequeue()); // Print C + System.out.println(queue.isEmpty()); // Print true + + // Let’s enqueue more things to QUEUE. + + queue.enqueue("X"); + queue.enqueue("Y"); + queue.enqueue("Z"); + + // Now make a SECOND ITERATOR for QUEUE. The FIRST one won’t work any more. + + ArrayQueue.Iterator second = queue.iterator(); + while (second.hasNext()) { + System.out.println(second.next()); // Print X Y Z, one per line. + } + + // The SECOND iterator hasn’t changed QUEUE either! + + System.out.println(queue.isEmpty()); // Print false + System.out.println(queue.dequeue()); // Print X + System.out.println(queue.dequeue()); // Print Y + System.out.println(queue.dequeue()); // Print Z + System.out.println(queue.isEmpty()); // Print true + } +} \ No newline at end of file diff --git a/lab11.java b/lab11.java new file mode 100644 index 0000000..e908c0f --- /dev/null +++ b/lab11.java @@ -0,0 +1,95 @@ +class AssociationList { + class Node { + private Key key; + private Value value; + private Node next; + public Node(Key key, Value value, Node next) { + this.key = key; + this.value = value; + this.next = next; + } + } + private Node head; + public AssociationList() { + head = new Node(null, null, null); + } + public Value get(Key key) { + Node search = head.next; + while (search != null) { + if (search.key.equals(key)) { + return search.value; + } + search = search.next; + } + throw new IllegalArgumentException("Key not found."); + } + public boolean isEmpty() { + return head.next == null; + } + public void put(Key key, Value value) { + if (key == null) + throw new IllegalArgumentException("Key is null."); + Node search = head.next; + while (search != null) { + if (search.key.equals(key)) { + search.value = value; + return; + } + search = search.next; + } + Node newNode = new Node(key, value, head.next); + head.next = newNode; + } + public void remove(Key key) { + Node search = head; + while (search.next != null) { + if (search.next.key.equals(key)) { + search.next = search.next.next; + return; + } + search = search.next; + } + } +} + +class SmallMediumLarge +{ + public static void main(String [] args) + { + AssociationList a = new AssociationList(); + + a.put("small", 0); + a.put("medium", 1); + a.put("large", 2); + + System.out.println(a.get("small")); // 0 + System.out.println(a.get("medium")); // 1 + System.out.println(a.get("large")); // 2 + + a.put("large", 1000); + + System.out.println(a.get("small")); // 0 + System.out.println(a.get("medium")); // 1 + System.out.println(a.get("large")); // 1000 + + a.remove("large"); + + System.out.println(a.get("small")); // 0 + System.out.println(a.get("medium")); // 1 + System.out.println(a.get("large")); // Throw an exception. + } +} + +/* +0 +1 +2 +0 +1 +1000 +0 +1 +Exception in thread "main" java.lang.IllegalArgumentException: Key not found. + at AssociationList.get(SmallMediumLarge.java:24) + at SmallMediumLarge.main(SmallMediumLarge.java:79) +*/ \ No newline at end of file diff --git a/lab2.py b/lab2.py new file mode 100644 index 0000000..6128ef4 --- /dev/null +++ b/lab2.py @@ -0,0 +1,34 @@ +class Zillion(object): + def __init__(self, digits): + if any([c not in "012456789, " for c in digits]): raise RuntimeError("Contains invalid characters.") + self.digits = [int(c) for c in digits if c.isdigit()] + if not self.digits: raise RuntimeError("Contains no digits.") + def increment(self): + pos = len(self.digits) + while True: + pos -= 1 + self.digits[pos] += 1 + if self.digits[pos] == 10: + if pos == 0: + self.digits = [1, 0] + self.digits[1:] + break + self.digits[pos] = 0 + else: break + def isZero(self): + return all([d == 0 for d in self.digits]) + def __str__(self): + """ + In Python, it's customary to use the __str__ operator overloader to overload the str() + function, rather than using a toString() function, which is common in languages that + don't support operator overloading, such as Java. + + See https://docs.python.org/2/reference/datamodel.html#object.__str__ for more details. + """ + return "".join(map(str, self.digits)) + def toString(self): + return str(self) + +z = Zillion('9') +print z.isZero() +z.increment() +print z, z.digits \ No newline at end of file diff --git a/lab3.py b/lab3.py new file mode 100644 index 0000000..d8b82d2 --- /dev/null +++ b/lab3.py @@ -0,0 +1,32 @@ +class Sieve(object): + def __init__(self, max): + if max < 0: + raise ValueError("max must be positive.") + self.numbers = [False, False] + [True] * (max - 2) + def findPrimes(self): + for i, v in enumerate(self.numbers): + if not v: + continue + for j in range(2 * i, len(self.numbers), i): + self.numbers[j] = False + def howMany(self): + return reduce(lambda i, v: i + (1 if v else 0), self.numbers) + def toList(self): + return [i for i, v in enumerate(self.numbers) if v] + +try: + S = Sieve(-10) +except: + print "Failed!" + +S = Sieve(100) +print S.howMany() # 98 +print S.findPrimes() +print S.howMany() # 25 +print S.toList() # [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97] + +S = Sieve(1000) +print S.howMany() # 98 +print S.findPrimes() +print S.howMany() # 25 +print S.toList() # [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97] \ No newline at end of file diff --git a/lab4.java b/lab4.java new file mode 100644 index 0000000..a775ce8 --- /dev/null +++ b/lab4.java @@ -0,0 +1,46 @@ +class Zillion { + int[] digits; + public Zillion(int size) { + this.digits = new int[size]; + } + public void increment() { + int position = this.digits.length; + while (true) { + position -= 1; + this.digits[position] += 1; + if (this.digits[position] == 10) { + this.digits[position] = 0; + if (position == 0) { + break; + } + } else { + break; + } + } + } + @Override + public String toString() { + String result = ""; + for (int digit : this.digits) { + result += digit; + } + return result; + } +} + +public class Main { + public static void main(String[] args) { + Zillion z = new Zillion(3); + for (int i = 0; i < 999; i += 1) { + z.increment(); + } + System.out.println(z); + z.increment(); + System.out.println(z); + /* + Output: + 999 + 000 + */ + } +} \ No newline at end of file diff --git a/lab5.java b/lab5.java new file mode 100644 index 0000000..45c3416 --- /dev/null +++ b/lab5.java @@ -0,0 +1,62 @@ +class Pathname { + private int depth; + private String[] directories; + private String name; + private String type; + public Pathname(String name) { + this(name, ""); + } + public Pathname(String name, String type) { + this.depth = 0; + this.directories = new String[10]; + this.type = type; + this.name = name; + } + public void addDirectory(String directory) { + if (this.depth >= 10) return; + this.directories[this.depth++] = directory; + } + public boolean equals(Pathname other) { + if (this.depth != other.depth) return false; + for (int i = 0; i < this.depth; i += 1) { + if (this.directories[i] != other.directories[i]) return false; + } + return true; + } + public String toString() { + String result = ""; + for (int i = 0; i < this.depth; i += 1) { + result += "/" + this.directories[i]; + } + result += "/" + this.name; + if (this.type != "") { + result += "." + this.type; + } + return result; + } +} + +class Pathfinder +{ + public static void main(String [] args) + { + Pathname p0 = new Pathname("coffee", "java"); + p0.addDirectory("home"); + p0.addDirectory("Desktop"); + p0.addDirectory("labs"); + System.out.println(p0); // Prints /home/Desktop/labs/coffee.java + + Pathname p1 = new Pathname("cola"); + p1.addDirectory("home"); + p1.addDirectory("hax"); + System.out.println(p1); // Prints /home/hax/cola + + Pathname p2 = new Pathname("tea"); + System.out.println(p2); // Prints /tea + + System.out.println(p0.equals(p0)); // Prints true + System.out.println(p0.equals(p1)); // Prints false + System.out.println(p1.equals(p2)); // Prints false + System.out.println(p0.equals("Not a pathname")); // Prints false + } +} \ No newline at end of file diff --git a/lab6.java b/lab6.java new file mode 100644 index 0000000..dc64f04 --- /dev/null +++ b/lab6.java @@ -0,0 +1,59 @@ +class Polygon { + private int[] sideLengths; + + public Polygon(int sides, int...lengths) { + int index = 0; + sideLengths = new int[sides]; + for (int length: lengths) { + sideLengths[index] = length; + index += 1; + } + } + + public int side(int number) { + return sideLengths[number]; + } + + public int perimeter() { + int total = 0; + for (int index = 0; index < sideLengths.length; index += 1) { + total += side(index); + } + return total; + } +} + +class Rectangle extends Polygon { + private int width, height; + public Rectangle(int width, int height) { + super(4, new int[] { width, height, width, height }); + this.width = width; + this.height = height; + } + public int area() { + return this.width * this.height; + } +} + +class Square extends Polygon { + private int sideLength; + public Square(int sideLength) { + super(4, new int[] { sideLength, sideLength, sideLength, sideLength }); + this.sideLength = sideLength; + } + public int area() { + return this.sideLength * this.sideLength; + } +} + +class Shapes { + public static void main(String[] args) { + Rectangle wrecked = new Rectangle(3, 5); // Make a 3 × 5 rectangle. + System.out.println(wrecked.area()); // Print its area, 15. + System.out.println(wrecked.perimeter()); // Print its perimeter, 16. + + Square nerd = new Square(7); // Make a 7 × 7 square. + System.out.println(nerd.area()); // Print its area, 49. + System.out.println(nerd.perimeter()); // Print its perimeter, 28. + } +} \ No newline at end of file diff --git a/lab7.docx b/lab7.docx new file mode 100644 index 0000000000000000000000000000000000000000..4767de5070de49e7a9b5f753da939c4b890f2ac0 GIT binary patch literal 46250 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 literal 0 HcmV?d00001 diff --git a/lab7.java b/lab7.java new file mode 100644 index 0000000..ee3f94c --- /dev/null +++ b/lab7.java @@ -0,0 +1,89 @@ +class BinaryVsLinear +{ + + private static int linearSearch(int key, int[] array) + { + int comparisons = 0; + for (int i = 0; i < array.length; i += 1) { + comparisons += 1; + if (array[i] == key) + return comparisons; + } + return comparisons; + } + + private static int binarySearch(int key, int[] array) + { + int comparisons = 0; + int low = 0, high = array.length - 1; + while (low < high) { + int mid = (low + high) / 2; + comparisons += 1; + if (array[mid] == key) + return comparisons; + comparisons += 1; + if (array[mid] < key) + low = mid + 1; + else + high = mid - 1; + } + return comparisons; + } + + public static void main(String[] args) + { + for (int length = 1; length <= 30; length += 1) + { + int[] array = new int[length]; + for (int index = 0; index < length; index += 1) + { + array[index] = index; + } + + double linearTotal = 0.0; + double binaryTotal = 0.0; + for (int element = 0; element < length; element += 1) + { + linearTotal += linearSearch(element, array); + binaryTotal += binarySearch(element, array); + } + + double linearAverage = linearTotal / length; + double binaryAverage = binaryTotal / length; + System.out.println(length + " " + linearAverage + " " + binaryAverage); + } + } +} + +/* OUTPUT +1 1.0 0.0 +2 1.5 1.5 +3 2.0 1.6666666666666667 +4 2.5 2.5 +5 3.0 3.0 +6 3.5 3.1666666666666665 +7 4.0 3.2857142857142856 +8 4.5 3.75 +9 5.0 4.111111111111111 +10 5.5 4.4 +11 6.0 4.636363636363637 +12 6.5 4.75 +13 7.0 4.846153846153846 +14 7.5 4.928571428571429 +15 8.0 5.0 +16 8.5 5.25 +17 9.0 5.470588235294118 +18 9.5 5.666666666666667 +19 10.0 5.842105263157895 +20 10.5 6.0 +21 11.0 6.142857142857143 +22 11.5 6.2727272727272725 +23 12.0 6.391304347826087 +24 12.5 6.458333333333333 +25 13.0 6.52 +26 13.5 6.576923076923077 +27 14.0 6.62962962962963 +28 14.5 6.678571428571429 +29 15.0 6.724137931034483 +30 15.5 6.766666666666667 +*/ \ No newline at end of file diff --git a/lab9.java b/lab9.java new file mode 100644 index 0000000..8e86ac7 --- /dev/null +++ b/lab9.java @@ -0,0 +1,95 @@ +class RunnyStack { + class Run { + public Base object; + public int length; + public Run next; + public Run(Base object, Run next) { + this.object = object; + this.length = 1; + this.next = next; + } + public Run(Base object) { + this(object, null); + } + public boolean is(Base other) { + if (other == null || this.object == null) { + return this.object == other; + } else { + return this.object.equals(other); + } + } + } + private int runs, depth; + private Run top; + public RunnyStack() { + this.runs = 0; + this.depth = 0; + this.top = null; + } + public boolean isEmpty() { + return this.top == null; + } + public int depth() { + return this.depth; + } + public int runs() { + return this.runs; + } + public void push(Base object) { + Run run = new Run(object, top); + if (this.top == null) { + this.runs = 1; + this.depth = 1; + this.top = run; + } else { + if (this.top.is(object)) { + this.depth += 1; + this.top.length += 1; + } else { + this.runs += 1; + this.depth += 1; + Run top = this.top; + run.next = top; + this.top = run; + } + } + } + public void pop() { + if (this.isEmpty()) { + throw new IllegalStateException("The stack is empty."); + } + this.depth -= 1; + this.top.length -= 1; + if (this.top.length == 0) { + this.runs -= 1; + this.top = this.top.next; + } + } + public Base peek() { + if (this.isEmpty()) { + throw new IllegalStateException("The stack is empty."); + } + return this.top.object; + } +} + +class RunnyDriver { + public static void main(String[] args) { + RunnyStack s = new RunnyStack(); + + s.push("A"); + System.out.println(s.peek() + " " + s.depth() + " " + s.runs()); // A 1 1 + + s.push("B"); + System.out.println(s.peek() + " " + s.depth() + " " + s.runs()); // B 2 2 + + s.push("B"); + System.out.println(s.peek() + " " + s.depth() + " " + s.runs()); // B 3 2 + + s.pop(); + System.out.println(s.peek() + " " + s.depth() + " " + s.runs()); // B 2 2 + + s.pop(); + System.out.println(s.peek() + " " + s.depth() + " " + s.runs()); // A 1 1 + } +} \ No newline at end of file diff --git a/project1.py b/project1.py new file mode 100644 index 0000000..655eea1 --- /dev/null +++ b/project1.py @@ -0,0 +1,79 @@ +class Random: + def __init__(self, seed): + self.seed = seed + + def next(self, range=2147483648): + number = (7 ** 5 * self.seed) % (2 ** 31 - 1) + self.seed = number + return number % range + + def choose(self, objects): + return objects[self.next(len(objects))] + +class Nonce: + def __init__(self, seed): + self._first = [] + self._follow = {} + self._random = Random(seed) + + def add(self, word): + if word[0] not in self._first: + self._first.append(word[0]) + for i in range(len(word) - 1): + if word[i] not in self._follow: + self._follow[word[i]] = [] + if word[i + 1] not in self._follow[word[i]]: + self._follow[word[i]].append(word[i + 1]) + + def make(self, size): + word = self._random.choose(self._first) + while len(word) < size: + next = self._follow.get(word[-1]) + if not next: + word += self._random.choose(self._first) + else: + word += self._random.choose(next) + return word + +nw = Nonce(101) +nw.add("ada") +nw.add("algol") +nw.add("bliss") +nw.add("ceylon") +nw.add("clojure") +nw.add("curl") +nw.add("dart") +nw.add("eiffel") +nw.add("elephant") +nw.add("elisp") +nw.add("falcon") +nw.add("fortran") +nw.add("go") +nw.add("groovy") +nw.add("haskell") +nw.add("heron") +nw.add("intercal") +nw.add("java") +nw.add("javascript") +nw.add("latex") +nw.add("lisp") +nw.add("mathematica") +nw.add("nice") +nw.add("oak") +nw.add("occam") +nw.add("orson") +nw.add("pascal") +nw.add("postscript") +nw.add("prolog") +nw.add("python") +nw.add("ruby") +nw.add("scala") +nw.add("scheme") +nw.add("self") +nw.add("snobol") +nw.add("swift") +nw.add("tex") +nw.add("wolfram") + +for i in range(100): + print nw.make(6) \ No newline at end of file diff --git a/project2.java b/project2.java new file mode 100644 index 0000000..1c26c50 --- /dev/null +++ b/project2.java @@ -0,0 +1,278 @@ +import java.util.Random; + +// CARD. A playing card. It's immutable. + +final class Card { + + // RANK NAME. Printable names of card ranks. + + private static final String[] rankName = { + "ace", // 0 + "two", // 1 + "three", // 2 + "four", // 3 + "five", // 4 + "six", // 5 + "seven", // 6 + "eight", // 7 + "nine", // 8 + "ten", // 9 + "jack", // 10 + "queen", // 11 + "king" // 12 + }; + + // SUIT NAME. Printable names of card suits. + + private static final String[] suitName = { + "spade", // 0 + "heart", // 1 + "diamond", // 2 + "club" // 3 + }; + + private int rank; // Card rank, between 0 and 12 inclusive. + private int suit; // Card suit, between 0 and 3 inclusive. + + // CARD. Constructor. Make a new CARD with the given RANK and SUIT. + + public Card(int rank, int suit) { + if (0 <= suit && suit <= 3 && 0 <= rank && rank <= 12) { + this.rank = rank; + this.suit = suit; + } else { + throw new IllegalArgumentException("No such card."); + } + } + + // GET RANK. Return the RANK of this card. + + public int getRank() { + return rank; + } + + // GET SUIT. Return the SUIT of this card. + + public int getSuit() { + return suit; + } + + // TO STRING. Return a string that describes this card, for printing only. For + // example, we might return "the queen of diamonds" or "the ace of hearts". + + public String toString() { + return "the " + rankName[rank] + " of " + suitName[suit] + "s"; + } +} + +class Deck { + private Card[] cards; + private Random random; + private int index; + public Deck() { + this.index = 0; + this.random = new Random(); + this.cards = new Card[52]; + for (int suit = 0; suit < 4; suit += 1) { + for (int rank = 0; rank < 13; rank += 1) { + this.cards[4 * rank + suit] = new Card(rank, suit); + } + } + } + public void shuffle() { + for (int i = this.cards.length - 1; i >= 1; i -= 1) { + int j = Math.abs(random.nextInt()) % (i + 1); + Card temp = this.cards[i]; + this.cards[i] = this.cards[j]; + this.cards[j] = temp; + } + } + public boolean canDeal() { + return this.index < this.cards.length; + } + public Card deal() { + if (!this.canDeal()) { + throw new IllegalArgumentException("There are no more cards to deal!"); + } + return this.cards[this.index++]; + } +} + +class Tableau { + private class Pile { + private Card card; + private Pile next; + public Pile(Card card) { + this.card = card; + } + } + private Deck deck; + private Pile pile; + public Tableau() { + this.deck = new Deck(); + this.deck.shuffle(); + this.addPile(this.deck.deal()); + } + public void addPile(Card card) { + Pile pile = new Pile(card); + pile.next = this.pile; + this.pile = pile; + System.out.println("Added " + card.toString() + "."); + } + private boolean canMerge() { + if (!this.hasManyPiles()) + return false; + return this.canPutOn(this.pile.card, this.pile.next.card); + } + private boolean canPutOn(Card left, Card right) { + return left.getSuit() == right.getSuit() || left.getRank() > right.getRank(); + } + private boolean hasManyPiles() { + return this.pile.next != null; + } + private void mergeTwoPiles() { + if (!this.canMerge()) + throw new IllegalStateException("Can't merge!"); + Card c1 = this.pile.card; + Card c2 = this.pile.next.card; + this.pile.next.card = c1; + this.pile = this.pile.next; + System.out.println("Merged " + c1.toString() + " and " + c2.toString() + "."); + } + private void results() { + if (this.hasManyPiles()) { + System.out.println("Lost the game."); + // System.exit(1); + } else { + System.out.println("Won the game."); + // System.exit(0); + } + } + public void play() { + while (this.deck.canDeal()) { + this.addPile(this.deck.deal()); + while (this.canMerge()) { + this.mergeTwoPiles(); + } + } + results(); + } +} + +public class Main { + public static void main(String[] args) { + new Tableau().play(); + } +} + +/* + +NOTES: +A winning seed is 7389. Put this number in Random() constructor. Another one is 46720. Here is the output for 46720: + +Added the two of spades. +Added the queen of clubs. +Merged the queen of clubs and the two of spades. +Added the four of clubs. +Merged the four of clubs and the queen of clubs. +Added the three of diamonds. +Added the queen of hearts. +Merged the queen of hearts and the three of diamonds. +Merged the queen of hearts and the four of clubs. +Added the ace of hearts. +Merged the ace of hearts and the queen of hearts. +Added the eight of spades. +Merged the eight of spades and the ace of hearts. +Added the queen of spades. +Merged the queen of spades and the eight of spades. +Added the six of hearts. +Added the jack of diamonds. +Merged the jack of diamonds and the six of hearts. +Added the ten of diamonds. +Merged the ten of diamonds and the jack of diamonds. +Added the nine of hearts. +Added the seven of hearts. +Merged the seven of hearts and the nine of hearts. +Added the seven of spades. +Added the eight of clubs. +Merged the eight of clubs and the seven of spades. +Merged the eight of clubs and the seven of hearts. +Added the four of diamonds. +Added the ace of spades. +Added the jack of hearts. +Merged the jack of hearts and the ace of spades. +Merged the jack of hearts and the four of diamonds. +Merged the jack of hearts and the eight of clubs. +Merged the jack of hearts and the ten of diamonds. +Added the six of spades. +Added the king of diamonds. +Merged the king of diamonds and the six of spades. +Merged the king of diamonds and the jack of hearts. +Merged the king of diamonds and the queen of spades. +Added the four of spades. +Added the ten of spades. +Merged the ten of spades and the four of spades. +Added the ten of clubs. +Added the eight of hearts. +Added the six of diamonds. +Added the five of hearts. +Added the five of clubs. +Added the queen of diamonds. +Merged the queen of diamonds and the five of clubs. +Merged the queen of diamonds and the five of hearts. +Merged the queen of diamonds and the six of diamonds. +Merged the queen of diamonds and the eight of hearts. +Merged the queen of diamonds and the ten of clubs. +Merged the queen of diamonds and the ten of spades. +Merged the queen of diamonds and the king of diamonds. +Added the four of hearts. +Added the nine of clubs. +Merged the nine of clubs and the four of hearts. +Added the six of clubs. +Merged the six of clubs and the nine of clubs. +Added the seven of clubs. +Merged the seven of clubs and the six of clubs. +Added the jack of spades. +Merged the jack of spades and the seven of clubs. +Added the three of hearts. +Added the three of spades. +Added the two of hearts. +Added the king of hearts. +Merged the king of hearts and the two of hearts. +Merged the king of hearts and the three of spades. +Merged the king of hearts and the three of hearts. +Merged the king of hearts and the jack of spades. +Merged the king of hearts and the queen of diamonds. +Added the seven of diamonds. +Added the five of diamonds. +Merged the five of diamonds and the seven of diamonds. +Added the ace of clubs. +Added the ten of hearts. +Merged the ten of hearts and the ace of clubs. +Merged the ten of hearts and the five of diamonds. +Merged the ten of hearts and the king of hearts. +Added the two of diamonds. +Added the two of clubs. +Added the king of spades. +Merged the king of spades and the two of clubs. +Merged the king of spades and the two of diamonds. +Merged the king of spades and the ten of hearts. +Added the ace of diamonds. +Added the nine of spades. +Merged the nine of spades and the ace of diamonds. +Merged the nine of spades and the king of spades. +Added the three of clubs. +Added the nine of diamonds. +Merged the nine of diamonds and the three of clubs. +Added the five of spades. +Added the jack of clubs. +Merged the jack of clubs and the five of spades. +Merged the jack of clubs and the nine of diamonds. +Merged the jack of clubs and the nine of spades. +Added the eight of diamonds. +Added the king of clubs. +Merged the king of clubs and the eight of diamonds. +Merged the king of clubs and the jack of clubs. +Won the game. + +*/ \ No newline at end of file