2. Student that has a name, point and course count. The class should

have methods that can:
(a) add a grade to the GPA and GPA should be calculated and returned appropriately,
(b) create duplicate of itself and
return that duplicate, and
(c) see if another student has the same name and GPA as itself and return True or False appropriately.

To create a Student class with the specified methods, you can use the following Python code:

```python
class Student:
def __init__(self, name, points, course_count):
self.name = name
self.points = points
self.course_count = course_count

def add_grade(self, grade):
self.points += grade
self.course_count += 1

def calculate_gpa(self):
if self.course_count != 0:
return self.points / self.course_count
else:
return 0

def create_duplicate(self):
return Student(self.name, self.points, self.course_count)

def compare_to(self, other_student):
if self.name == other_student.name and self.calculate_gpa() == other_student.calculate_gpa():
return True
else:
return False
```

Explanation:

1. The `__init__` method is used to initialize the instance variables (name, points, course_count) of a Student object.
2. The `add_grade` method takes a grade as a parameter and updates the points and course_count variables accordingly.
3. The `calculate_gpa` method calculates and returns the grade point average (GPA) by dividing the total points by the number of courses taken. If no courses have been taken yet, it returns 0.
4. The `create_duplicate` method returns a new Student object with the same name, points, and course_count as the original object.
5. The `compare_to` method takes another Student object as a parameter and compares its name and GPA with the current object. If they are both the same, it returns True; otherwise, it returns False.

You can create instances of the Student class and use these methods like this:

```python
student1 = Student("Alice", 84, 5)
student1.add_grade(91)
gpa = student1.calculate_gpa()
print(gpa)

student2 = student1.create_duplicate()
print(student2.name)

student3 = Student("Bob", 76, 4)
is_same = student1.compare_to(student3)
print(is_same)
```

In this example, we create a student object named "student1" with initial name "Alice", initial points 84, and initial course count 5. We then add a grade of 91, calculate the GPA, and print it.

Next, we create another student object named "student2" as a duplicate of "student1" using the `create_duplicate` method. We print the name of "student2" to verify it's a duplicate.

Finally, we create a new student object named "student3" with a different name and GPA. We compare "student1" and "student3" using the `compare_to` method and print the result.