Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions module/module.iml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
42 changes: 42 additions & 0 deletions module/src/snakesAndLadders/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package snakesAndLadders;

import snakesAndLadders.game.Game;
import snakesAndLadders.model.Player;

import java.util.*;

//TIP To <b>Run</b> code, press <shortcut actionId="Run"/> or
// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Please enter number of snakes: ");
int snakeCount = sc.nextInt();
Map<Integer, Integer> snakes = new HashMap<>();
for(int i = 0; i < snakeCount; i++){
System.out.println("Enter snake head and tail: ");
int head = sc.nextInt();
int tail = sc.nextInt();
snakes.put(head, tail);
}
System.out.println("Please enter number of ladders: ");
int ladderCount = sc.nextInt();
Map<Integer, Integer> ladders = new HashMap<>();
for(int i = 0; i < ladderCount; i++){
System.out.println("Enter ladder base and top: ");
int base = sc.nextInt();
int top = sc.nextInt();
ladders.put(base, top);
}
System.out.println("Please enter number of players: ");
int playerCount = sc.nextInt();
List<Player> players = new ArrayList<>();
for(int i = 0; i < playerCount; i++){
System.out.println("Enter player name: ");
String name = sc.next();
players.add(new Player(name));
}
Game game = new Game(players, snakes, ladders);
game.start();
}
}
22 changes: 22 additions & 0 deletions module/src/snakesAndLadders/board/Board.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package snakesAndLadders.board;

import java.util.Map;

public class Board {
int size = 100;
Map<Integer,Integer> snakes;
Map<Integer,Integer> ladders;
public Board(Map<Integer,Integer> snakes, Map<Integer,Integer> ladders){
this.snakes = snakes;
this.ladders = ladders;
}
public int getNextPosition(int position){
if(snakes.containsKey(position)){
return snakes.get(position);
}
if(ladders.containsKey(position)){
return ladders.get(position);
}
return position;
}
}
41 changes: 41 additions & 0 deletions module/src/snakesAndLadders/game/Game.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package snakesAndLadders.game;

import snakesAndLadders.board.Board;
import snakesAndLadders.model.Dice;
import snakesAndLadders.model.Player;

import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;

public class Game {
Queue<Player> players;
Board board;
Dice dice;
public Game(List<Player> players, Map<Integer,Integer> snakes, Map<Integer,Integer> ladders){
this.players = new LinkedList<Player>(players);
this.board = new Board(snakes,ladders);
this.dice = new Dice();
}
public void start(){
while(!players.isEmpty()){
Player current = players.peek();
players.remove();
int roll = dice.roll();
System.out.println("Player "+current.getName()+" rolled: "+roll);
int newPosition = current.getPosition() + roll;
if(newPosition > 100){
newPosition = current.getPosition();
} else{
newPosition = board.getNextPosition(newPosition);
}
current.setPosition(newPosition);
if(newPosition == 100){
System.out.println("Player " + current.getName() + " won!");
break;
}
players.add(current);
}
}
}
7 changes: 7 additions & 0 deletions module/src/snakesAndLadders/model/Dice.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package snakesAndLadders.model;

public class Dice {
public int roll(){
return 1 + (int)(Math.random()*6);
}
}
20 changes: 20 additions & 0 deletions module/src/snakesAndLadders/model/Player.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package snakesAndLadders.model;

public class Player {
String name;
int position;

public Player(String name) {
this.name = name;
this.position = 0;
}
public String getName() {
return name;
}
public int getPosition() {
return position;
}
public void setPosition(int position) {
this.position = position;
}
}
80 changes: 80 additions & 0 deletions module/src/splitwise/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package splitwise;

import snakesAndLadders.game.Game;
import snakesAndLadders.model.Player;
import splitwise.model.Expense;
import splitwise.model.Splitwise;
import splitwise.model.User;

import java.util.*;

//TIP To <b>Run</b> code, press <shortcut actionId="Run"/> or
// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.
public class Main {
public static void main(String[] args) {
System.out.println("Welcome to Splitwise.");
Scanner sc = new Scanner(System.in);

User user1 = new User("Charu", "charu@sweet.com", 12345);
User user2 = new User("Rathi", "rathi@cute.com", 23456);
User user3 = new User("Ishita", "ishita@logic.com", 34567);
User user4 = new User("Kareena", "kareena@bitch.com", 45678);
List<User> users = new ArrayList<>(Arrays.asList(user1, user2, user3, user4));
Splitwise splitwise = new Splitwise(users);
Map<String, User> map = new HashMap<>();
for ( User u : users ) {
map.put(u.getName().toUpperCase(), u);
}
System.out.println("Commands: SHOW, SHOW <User>, EXPENSE <Payer> <Amount> <EQUAL> <User1> <User2>..., EXIT");
while(true) {
System.out.println("> ");
String input = sc.nextLine().trim();
if (input.equalsIgnoreCase("EXIT")) {
System.out.println("Bye bye!");
break;
}
String[] commands = input.split(" ");
if (commands[0].equalsIgnoreCase("SHOW")) {
if (commands.length == 1) {
splitwise.showBalances();
} else if (commands.length == 2) {
User user = map.get(commands[1].toUpperCase());
if (user == null) {
System.out.println("User " + commands[1].toUpperCase() + " not found!");
continue;
}
splitwise.showBalances(user);
} else {
System.out.println("Wrong command!");
continue;
}
}
if (commands[0].equalsIgnoreCase("EXPENSE")) {
User payer = map.get(commands[1].toUpperCase());
if (payer == null) {
System.out.println("User " + commands[1].toUpperCase() + " not found!");
continue;
}
double totalExpense = Double.parseDouble(commands[2]);
int size = Integer.parseInt(commands[3]);
List<User> payees = new ArrayList<>();
for (int i = 0; i < size; i++) {
payees.add(map.get(commands[i+4].toUpperCase()));
}
Expense.ExpenseType type = Expense.ExpenseType.valueOf(commands[4+size]);
List<Double> expenses = new ArrayList<>();
for(int i=5+size;i<commands.length;i++){
expenses.add(Double.parseDouble(commands[i]));
}
Expense expense = new Expense(
payer,
totalExpense,
type,
payees,
expenses
);
splitwise.addExpense(expense);
}
}
}
}
30 changes: 30 additions & 0 deletions module/src/splitwise/model/Expense.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package splitwise.model;

import java.util.List;

public class Expense {

public enum ExpenseType {
EQUAL, EXACT, PERCENT
}

User payer;
double totalExpense;
int size;
ExpenseType type;
List<User> users;
List<Double> expenses;

public Expense(User payer, double totalExpense, ExpenseType type, List<User> users, List<Double> expenses) {
this.payer = payer;
this.totalExpense = totalExpense;
this.type = type;
this.users = users;
this.size = users.size();
this.expenses = expenses;
}

public Expense(User payer, double totalExpense, ExpenseType type, List<User> users) {
this(payer, totalExpense, type, users, null);
}
}
113 changes: 113 additions & 0 deletions module/src/splitwise/model/Splitwise.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
package splitwise.model;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Splitwise {
List<User> users;
double [][] Balances;

public Splitwise(List<User> users) {
this.users = users;
this.Balances = new double[users.size()][users.size()];
for (int i = 0; i < users.size(); i++) {
for (int j = 0; j < users.size(); j++) {
Balances[i][j] = 0;
}
}
}

boolean showBalances(User user1, boolean showOnlyNegative) {
int pos = users.indexOf(user1);
boolean nobalance = true;
for (int i = 0; i < Balances[pos].length; i++) {
if (Balances[pos][i] > 0) {
nobalance = false;
if (showOnlyNegative) continue;
System.out.println(user1.getName() + " owes " + users.get(i).getName() + ": " + Balances[pos][i]);
} else if(Balances[pos][i] < 0) {
nobalance = false;
System.out.println(users.get(i).getName() + " owes " + user1.getName() + ": " + Balances[i][pos]);
}
}
return nobalance;
}

public void showBalances(User user1) {
boolean nobalance = showBalances(user1, false);
if(nobalance){
System.out.println("No balances");
}
}

public void showBalances() {
boolean nobalance = true;
for (int i = 0; i < users.size(); i++) {
boolean val = showBalances(users.get(i), true);
if(!val){
nobalance = false;
}
}
if(nobalance){
System.out.println("No balances");
}
}

void setBalances(User user1, User user2, double expense) {
int pos1 = users.indexOf(user1);
int pos2 = users.indexOf(user2);
Balances[pos1][pos2] -= expense;
Balances[pos2][pos1] += expense;
addPersonalExpense(user2, expense);
}

void addPersonalExpense(User user2, double expense) {
user2.expenses += expense;
}

private double roundToTwoDecimals(double amount) {
return Math.round(amount * 100.0) / 100.0;
}

public void addExpense(Expense expense) {
User payer = expense.payer;
Expense.ExpenseType type = expense.type;
double totalExpense = expense.totalExpense;
int size = expense.size;
List<User> users = expense.users;
List<Double> expenses = expense.expenses;
switch (expense.type) {
case EQUAL -> {
double base = Math.floor((totalExpense / size) * 100) / 100.0;
double remainder = totalExpense - (base * size);
int extra = (int)Math.round(remainder * 100);
for (int i = 0; i < size; i++) {
double amount = i < extra ? base + 0.01 : base;
setBalances(payer, users.get(i), roundToTwoDecimals(amount));
}
}
case EXACT -> {
for (int i = 0; i < size; i++) {
double amount = expenses.get(i);
setBalances(payer, users.get(i), roundToTwoDecimals(amount));
}
}
case PERCENT -> {
int sum = 0;
for (int i = 0; i < size; i++) {
sum += expenses.get(i);
}
if (sum != 100) {
System.out.println("ERROR! Percentages don't add up to 100");
} else {
for (int i = 0; i < size; i++) {
double amount = (expenses.get(i) * totalExpense) / 100;
setBalances(payer, users.get(i), roundToTwoDecimals(amount));
}
}
}
default -> System.out.println("Invalid Expense");
}
}
}
Loading