From 1ac84561a28e50372b5e48cd3c3a4c8ae477d0a8 Mon Sep 17 00:00:00 2001 From: Varsha Lalwani Date: Wed, 18 May 2022 00:05:26 +0530 Subject: [PATCH 1/2] Splitwise Code --- .idea/.gitignore | 3 + .idea/checkstyle-idea.xml | 16 +++ .idea/misc.xml | 6 + .idea/mock-machine-coding-2.iml | 9 ++ .idea/modules.xml | 9 ++ .idea/sonarlint/issuestore/index.pb | 0 .idea/uiDesigner.xml | 124 ++++++++++++++++++ .idea/vcs.xml | 6 + docs/problem-statement.md | 6 +- out/production/splitwise/CommandManager.class | Bin 0 -> 3231 bytes out/production/splitwise/SplitwiseMain.class | Bin 0 -> 2128 bytes .../splitwise/entity/EqualSplit.class | Bin 0 -> 488 bytes .../splitwise/entity/ExactSplit.class | Bin 0 -> 341 bytes .../splitwise/entity/ExpenseManager.class | Bin 0 -> 3543 bytes .../splitwise/entity/PercentSplit.class | Bin 0 -> 612 bytes out/production/splitwise/entity/Split.class | Bin 0 -> 756 bytes .../splitwise/entity/SplitManager.class | Bin 0 -> 1035 bytes .../splitwise/entity/SplitType.class | Bin 0 -> 967 bytes out/production/splitwise/entity/User.class | Bin 0 -> 1441 bytes out/production/splitwise/input.txt | 10 ++ splitwise/splitwise.iml | 16 +++ splitwise/src/CommandManager.java | 80 +++++++++++ splitwise/src/SplitwiseMain.java | 42 ++++++ splitwise/src/entity/EqualSplit.java | 7 + splitwise/src/entity/ExactSplit.java | 7 + splitwise/src/entity/ExpenseManager.java | 74 +++++++++++ splitwise/src/entity/PercentSplit.java | 19 +++ splitwise/src/entity/Split.java | 27 ++++ splitwise/src/entity/SplitManager.java | 25 ++++ splitwise/src/entity/SplitType.java | 9 ++ splitwise/src/entity/User.java | 54 ++++++++ splitwise/src/input.txt | 10 ++ 32 files changed, 556 insertions(+), 3 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/checkstyle-idea.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/mock-machine-coding-2.iml create mode 100644 .idea/modules.xml create mode 100644 .idea/sonarlint/issuestore/index.pb create mode 100644 .idea/uiDesigner.xml create mode 100644 .idea/vcs.xml create mode 100644 out/production/splitwise/CommandManager.class create mode 100644 out/production/splitwise/SplitwiseMain.class create mode 100644 out/production/splitwise/entity/EqualSplit.class create mode 100644 out/production/splitwise/entity/ExactSplit.class create mode 100644 out/production/splitwise/entity/ExpenseManager.class create mode 100644 out/production/splitwise/entity/PercentSplit.class create mode 100644 out/production/splitwise/entity/Split.class create mode 100644 out/production/splitwise/entity/SplitManager.class create mode 100644 out/production/splitwise/entity/SplitType.class create mode 100644 out/production/splitwise/entity/User.class create mode 100644 out/production/splitwise/input.txt create mode 100644 splitwise/splitwise.iml create mode 100644 splitwise/src/CommandManager.java create mode 100644 splitwise/src/SplitwiseMain.java create mode 100644 splitwise/src/entity/EqualSplit.java create mode 100644 splitwise/src/entity/ExactSplit.java create mode 100644 splitwise/src/entity/ExpenseManager.java create mode 100644 splitwise/src/entity/PercentSplit.java create mode 100644 splitwise/src/entity/Split.java create mode 100644 splitwise/src/entity/SplitManager.java create mode 100644 splitwise/src/entity/SplitType.java create mode 100644 splitwise/src/entity/User.java create mode 100644 splitwise/src/input.txt diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/checkstyle-idea.xml b/.idea/checkstyle-idea.xml new file mode 100644 index 0000000..6fb7092 --- /dev/null +++ b/.idea/checkstyle-idea.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..639900d --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/mock-machine-coding-2.iml b/.idea/mock-machine-coding-2.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/.idea/mock-machine-coding-2.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..c4e105d --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/sonarlint/issuestore/index.pb b/.idea/sonarlint/issuestore/index.pb new file mode 100644 index 0000000..e69de29 diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/docs/problem-statement.md b/docs/problem-statement.md index 3dbbb2b..52dfaf9 100755 --- a/docs/problem-statement.md +++ b/docs/problem-statement.md @@ -59,8 +59,8 @@ User3 owes User4: 240 (0+240) ## Requirements -- User: Each user should have a userId, name, email, mobile number. -- Expense: Could either be EQUAL, EXACT or PERCENT +- entity.User: Each user should have a userId, name, email, mobile number. +- entity.SplitType: Could either be EQUAL, EXACT or PERCENT - Users can add any amount, select any type of expense and split with any of the available users. - The percent and amount provided could have decimals upto two decimal places. - In case of percent, you need to verify if the total sum of percentage shares is 100 or not. @@ -73,7 +73,7 @@ User3 owes User4: 240 (0+240) - You can create a few users in your main method. No need to take it as input. - There will be 3 types of input: - - Expense in the format: ```EXPENSE ``` + - entity.SplitType in the format: ```EXPENSE ``` - Show balances for all: ```SHOW``` - Show balances for a single user: ```SHOW ``` diff --git a/out/production/splitwise/CommandManager.class b/out/production/splitwise/CommandManager.class new file mode 100644 index 0000000000000000000000000000000000000000..3e034da66e959ff8aa4eb7c789577f83813d7d58 GIT binary patch literal 3231 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 QDci*&%9P{niDyvx1EQ*K-~a#s literal 0 HcmV?d00001 diff --git a/out/production/splitwise/entity/ExactSplit.class b/out/production/splitwise/entity/ExactSplit.class new file mode 100644 index 0000000000000000000000000000000000000000..591ca239ede895fb10af08343f43edcef919a8e2 GIT binary patch literal 341 zcmYLE%SyvQ6g@Y_jKKg*Ti!VmDHq-R1( z@4&t1zRtPx_y6+?;0i}EcFx1m@y-6`3Sr-eGSF`>;QS9vqP61r-Bwb1;QNI4sMHvb?0?ND{SpIRPC< zD>0~ID2Wt|B#vRY5+m|7lLSAW#0g}R7=!ctu5CL9AFX@&yI8eaH2adPmVQ zvmJeA!C9jqkuirY-6`e`1#>5fyZQ{vF`coFeKcRQj@n59+I7m0N3UHxnl)U1@h;OcoplN-T3Yuji1ye+jI*ZCw2c1Z=usoTSEs6i zx;}eQ&+garrkwrDs54?R=@}EAHl5BHR)Miw`Y`iRFuf%Zpj!`dQYksgNkL;6b}Tmm zJ%6(00xVu+8I^R9w~$8_t0dn{DJe>b7!POKaE+WpU_nry_!@{cb!y@LC%Nr-VM=4TzIguH=m>)DYn=%H| z!xUdC)2`tuv`|!@{O){SACrn}Xu>=N)5@Z)dSQeqYgmY86;vqVq=r*CtzitWDo6z; zSi@_0UBw$3&fu(uH}SfLb9jqoaPb0-(C{|St9VDlyLgZOnhQ;=exa$k(8>R%W-DZ~ z>*#S~kgngy2P!_)Z~-6DalhT_$&_*a@GS!0Nq6E@_LI-(c)jnnJ~Us0q@)N&8? z6Z&o$yp)7>gSO@9rbRL}_=6u*5P+(36z*t7>|+X+PoW&(yO00y45udi?J&j|A;(X_ zqA9R^%U~?5`H=e}-mhn6CYT=S7U*qetl$`<6xc*t>romGkMd_8_k2jVl3fF;Fr>^ zzz-8X!e@gE-~KRg1pRc$ zSs|Jw=ZkkrGC`kd`kYChv-s6(w(GOWvnl!1e4mo0R5Akb?nNdt@$ShMQRc<5jCapr zxgSRdPofiR`xWXnZX#~darbg=pn@^qsRy!x@|9RM1xR!<$bv_Ltfo0%rXGlL5ph&9 zfIAgy8B6pQD*3%`$t@%lT*mj@Bo*92sxw-WcE-{%Uw%e*zCye`O=~TJE2wTy$KCB^ z3`m0MXgYoqRku(bA?W7NRZWEOwVi5oZCV}2wCYRWqWNdk)lHB8f%<`pbaWgInE?X0 z&sbW`jHB_u)dy#;J~%x43R0pwV;oON7o%3EL0 zUtpKMW7mG*^G7VhHTLEgtiTPH_fM>LYqyS-IZNF&=z>a=EY?Eqn)ng4o;xA_of0SR z_?(E~Ha1Y(5zeUIEZH=to7* zjx(&m&ffQV_k5hQeSLp?0yxBudVI}-mkt%{MHH~1VN=7FfHwA{zCVfuL`y(D3PwTP z6tJ8&!61IBUrqd|(Q4JY0?KK4;|rA9!N@;PhCM&J^m+p#Ry*u_gRU0^X`g{gd>2dv zR%b#NQ=`s!5X23NB@`AgXJhFjuo#E2H#ixFNt#K&_2Y~ukauc~s88k~#gW1EPMB~P zXF(dKJa2Sx?>%}3ir6-wVL`yowl)8ffRUjx93}qkzShMq4^8C>3f>grnrB_)i83?0 zKBwv2cK54_^RNODz9a8CZ%|$c=U{MMA_*j$BwD1J>|7{ZZO%%3rqwda(#DoXIf+?h zDMW2hSsK=pQ{laAFNa|35j literal 0 HcmV?d00001 diff --git a/out/production/splitwise/entity/Split.class b/out/production/splitwise/entity/Split.class new file mode 100644 index 0000000000000000000000000000000000000000..ce22bc14c8d2b4a69677a3b813484ab73b348240 GIT binary patch literal 756 zcmZ`#%SyvQ6g`utiLtf5-;b4P1haIZ2%@+ux=;%)(;76TrqZT@U!{T~xbOq~DDliR zQ7X#7oqO-x^O*bb`SuQA8|yAiEIKf-B*U_e6&tGpM!y$#1;%P|nkCtNc+PT1z>01< z{WKF0hb(rJG|Bb^D*n*eVYN%1|EpLu%U^x_dJ4!x1IcDwDc5Bjy{`i96}V zh#40sPU59QT;_2`HFj9*9zm_-Up?|X59;}2&~V_ zHqMKf1Ao}z@&v5?eoXUup!QPI%_lSOsBUZ&G0#M@=-m_9iFA=l)NEXVJ(c|w%Wj(8 zW_!uC*Qc~Jb^k0iO%zx>+rVD?*zd5x(tpFKA9iatcEJ)Fs?3=!;~rYr5TuTUV`CrJf-X$S-Slh0S zk-r2{;#`hKc)BS!MYt)##dX}!>Y>B6ILe7qx?ar2KMc3cg8%>k literal 0 HcmV?d00001 diff --git a/out/production/splitwise/entity/SplitType.class b/out/production/splitwise/entity/SplitType.class new file mode 100644 index 0000000000000000000000000000000000000000..13a76439248295b277bf16af7bfb762082d5f6a6 GIT binary patch literal 967 zcmZuvZEw<06n-u(v~=ZV9h-vlZNm-N9HKLRfGi^f6O(4sl@W=b3Rdh=$^vD{{*|)C z8I5M2{ZYnq@5sg+x5+&{_dMr0&pG%0`TOHHfLGX#LdLp=9P$cM3JMzH*x=iyiiAeN zO^$e~VxHSA6$ZCO1>F=lff_@KX8N7qIK-KLF4q;Df8g_YOTSbysaP9>U;bz z+pL<0b&Fx)!>o+RiS3P?A;V%WKNBF=`X3#Jgz5Uu-l*4h1`WII(TO55_dhYL<;)}d z#4dWa-z{3f!1cT3{H$Vz+3(n1(;m2-V!|W)c8}Hvo`PMC_a+eRSrQ>E=>U=$-UCM|s{VxBG8E|?>KUTK(PZJw2}chLCl>id tIB85zr6rFsXSKp(#H=$gF5t3XLr}_yQRf*dwoW=jlj2!CAzTP+{{ZIZ%hj2j{evEZUgqOOKAp@U_r?bO7L@z3ar zg(g;siN=)+f0XgOHr0;Hlr z2@2e3*lo%gJ>`!&4~aZNB|7$b~X?lzeh3W(#0DuNE|a+Q@&(rA5h|RTIL8=`0~q&Y(6O18$ + + + + + + + + + + + + + \ No newline at end of file diff --git a/splitwise/src/CommandManager.java b/splitwise/src/CommandManager.java new file mode 100644 index 0000000..686abda --- /dev/null +++ b/splitwise/src/CommandManager.java @@ -0,0 +1,80 @@ +import java.util.ArrayList; +import java.util.List; + +import entity.ExpenseManager; +import entity.Split; +import entity.SplitManager; +import entity.SplitType; +import entity.User; + +public class CommandManager { + + private ExpenseManager expenseManager; + + private SplitManager splitManager; + + public CommandManager(final ExpenseManager expenseManager) { + this.expenseManager = expenseManager; + this.splitManager = new SplitManager(); + } + + public void runCommand(String command) { + String[] splitCommand = command.split(" "); + if(splitCommand[0].equals("EXPENSE")){ + addExpense(command); + } else if(splitCommand[0].equals("SHOW")){ + showExpense(command); + } + } + + public void showExpense(String command) { + String[] splitCommand = command.split(" "); + if (splitCommand.length==1) { + expenseManager.showForAllUsers(); + } else { + User user = new User(splitCommand[1]); + expenseManager.showForUser(user); + } + } + + public void addExpense(String command) { + String[] splitCommand = command.split(" "); + User userWhoPaid = new User(splitCommand[1]); + double totalAmountPaid = Double.valueOf(splitCommand[2]); + Integer totalNumOfUsers = Integer.valueOf(splitCommand[3]); + int index = 4; + List userList = new ArrayList<>(); + for (int i=1; i<=totalNumOfUsers; i++){ + User user = new User(splitCommand[index++]); + userList.add(user); + } + if(splitCommand[index].equals(SplitType.EQUAL.toString())) { + for(User user: userList) { + Split split = splitManager.splitExpense(user, totalNumOfUsers, totalAmountPaid); + if(!split.getUser().equals(userWhoPaid)) { + expenseManager.addSplitExpense(userWhoPaid, split); + } + } + } else if(splitCommand[index].equals(SplitType.EXACT.toString())) { + index++; + for (int i=1; i<=totalNumOfUsers; i++){ + Double amount = Double.valueOf(splitCommand[index++]); + Split split = splitManager.splitExpense(userList.get(i-1), amount); + if(!split.getUser().equals(userWhoPaid)) { + expenseManager.addSplitExpense(userWhoPaid, split); + } + } + } else if(splitCommand[index].equals(SplitType.PERCENT.toString())) { + index++; + for (int i=1; i<=totalNumOfUsers; i++){ + Double percent = Double.valueOf(splitCommand[index++]); + Split split = splitManager.splitExpense(userList.get(i-1), percent, + totalAmountPaid); + if(!split.getUser().equals(userWhoPaid)) { + expenseManager.addSplitExpense(userWhoPaid, split); + } + } + } + + } +} diff --git a/splitwise/src/SplitwiseMain.java b/splitwise/src/SplitwiseMain.java new file mode 100644 index 0000000..5a1360f --- /dev/null +++ b/splitwise/src/SplitwiseMain.java @@ -0,0 +1,42 @@ +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import entity.ExpenseManager; +import entity.User; + +public class SplitwiseMain { + public static void main(String[] args) throws IOException { + List userList = new ArrayList<>(); + User user1 = new User("U1", "User1", "User1@gmail.com", + "9798512549"); + User user2 = new User("U2", "User2", "User2@gmail.com", + "9798512548"); + User user3 = new User("U3", "User3", "User3@gmail.com", + "9798512547"); + User user4 = new User("U4", "User4", "User4@gmail.com", + "9798512546"); + userList.add(user1); + userList.add(user2); + userList.add(user3); + userList.add(user4); + ExpenseManager expenseManager = new ExpenseManager(userList); + + CommandManager commandManager = new CommandManager(expenseManager); + + File file = new File("input.txt"); + BufferedReader br = new BufferedReader(new FileReader(file)); + + String command; + while((command = br.readLine()) != null) { + if (command.equals("exit")) { + System.exit(0); + } else { + commandManager.runCommand(command); + } + } + } +} diff --git a/splitwise/src/entity/EqualSplit.java b/splitwise/src/entity/EqualSplit.java new file mode 100644 index 0000000..1c74e17 --- /dev/null +++ b/splitwise/src/entity/EqualSplit.java @@ -0,0 +1,7 @@ +package entity; + +public class EqualSplit extends Split{ + public EqualSplit(final User user, Integer countOfUsers, final double totalAmount) { + super(user, totalAmount/countOfUsers); + } +} diff --git a/splitwise/src/entity/ExactSplit.java b/splitwise/src/entity/ExactSplit.java new file mode 100644 index 0000000..199dd4a --- /dev/null +++ b/splitwise/src/entity/ExactSplit.java @@ -0,0 +1,7 @@ +package entity; + +public class ExactSplit extends Split{ + public ExactSplit(final User user, double amount) { + super(user, amount); + } +} diff --git a/splitwise/src/entity/ExpenseManager.java b/splitwise/src/entity/ExpenseManager.java new file mode 100644 index 0000000..ad8c482 --- /dev/null +++ b/splitwise/src/entity/ExpenseManager.java @@ -0,0 +1,74 @@ +package entity; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ExpenseManager { + + private List users; + + private Map , Double> userOweMap; + + public ExpenseManager() { + users = new ArrayList<>(); + userOweMap = new HashMap<>(); + } + + public ExpenseManager(List userList) { + users = userList; + userOweMap = new HashMap<>(); + } + + public ExpenseManager(List userList, Map , Double> userOweMap) { + users = userList; + userOweMap = userOweMap; + } + + public Map , Double> getWhoOweWhomMap() { + return userOweMap; + } + + public List getUsers() { + return users; + } + + private void showForUsers(List userList) { + boolean isAnyBalanceDue = false; + for (User owedUser : users) { + for (User oweUser : users) { + if ((userList.contains(owedUser) || userList.contains(oweUser)) + && (userOweMap.containsKey(Map.of(owedUser, oweUser)))) { + Double amount = userOweMap.get(Map.of(owedUser, oweUser)); + isAnyBalanceDue = true; + if (amount > 0) { + System.out.printf("%s owes %s: %s %n", owedUser.getUserId(), + oweUser.getUserId(), amount); + } + } + } + } + + if(!isAnyBalanceDue) { + System.out.println("No Balances"); + } + } + public void showForAllUsers() { + showForUsers(users); + } + + public void showForUser(User user) { + showForUsers(Collections.singletonList(user)); + } + + public void addSplitExpense(User owedUser, Split split) { + double prevAmt = 0; + if(userOweMap.containsKey(Map.of(owedUser, split.getUser()))){ + prevAmt = userOweMap.get(Map.of(owedUser, split.getUser())); + } + userOweMap.put(Map.of(owedUser, split.getUser()), prevAmt-split.getAmount()); + userOweMap.put(Map.of(split.getUser(), owedUser), split.getAmount()-prevAmt); + } +} diff --git a/splitwise/src/entity/PercentSplit.java b/splitwise/src/entity/PercentSplit.java new file mode 100644 index 0000000..1e23d2e --- /dev/null +++ b/splitwise/src/entity/PercentSplit.java @@ -0,0 +1,19 @@ + +package entity; + +public class PercentSplit extends Split{ + double percent; + public PercentSplit(final User user, double percent, double totalAmount) { + + super(user, (totalAmount*percent/100)); + this.percent = percent; + } + + public double getPercent() { + return percent; + } + + public void setPercent(double percent) { + this.percent = percent; + } +} diff --git a/splitwise/src/entity/Split.java b/splitwise/src/entity/Split.java new file mode 100644 index 0000000..e6dbb95 --- /dev/null +++ b/splitwise/src/entity/Split.java @@ -0,0 +1,27 @@ +package entity; +public abstract class Split { + private User user; + + double amount; + + public Split(User user, double amount) { + this.user = user; + this.amount = amount; + } + + public void setUser(User user) { + this.user = user; + } + + public User getUser(){ + return this.user; + } + + public void setAmount(double amount) { + this.amount = amount; + } + + public double getAmount(){ + return this.amount; + } +} diff --git a/splitwise/src/entity/SplitManager.java b/splitwise/src/entity/SplitManager.java new file mode 100644 index 0000000..300219a --- /dev/null +++ b/splitwise/src/entity/SplitManager.java @@ -0,0 +1,25 @@ +package entity; + +public class SplitManager { + + + private Split split; + + public SplitManager(){ + } + + public Split splitExpense(User user, double amount) { + split = new ExactSplit(user, amount); + return split; + } + + public Split splitExpense(User user, Integer numOfUsers, double amount) { + split = new EqualSplit(user, numOfUsers, amount); + return split; + } + + public Split splitExpense(User user, double percent, double amount) { + split = new PercentSplit(user, percent, amount); + return split; + } +} diff --git a/splitwise/src/entity/SplitType.java b/splitwise/src/entity/SplitType.java new file mode 100644 index 0000000..fdb7a47 --- /dev/null +++ b/splitwise/src/entity/SplitType.java @@ -0,0 +1,9 @@ +package entity; + +public enum SplitType { + EQUAL, + + EXACT, + + PERCENT +} diff --git a/splitwise/src/entity/User.java b/splitwise/src/entity/User.java new file mode 100644 index 0000000..f0fbf58 --- /dev/null +++ b/splitwise/src/entity/User.java @@ -0,0 +1,54 @@ +package entity; + +import java.util.Objects; + +public class User { + public String id; + private String name; + private String email; + private String contactNum; + + public User(final String id) { + this.id = id; + } + + public User( + final String id, + final String name, + final String email, + final String contactNum) { + this.id = id; + this.name = name; + this.email = email; + this.contactNum = contactNum; + } + + public String getUserId() { + return id; + } + + public String getUserName() { + return name; + } + + public String getUserEmail() { + return email; + } + + public String getUserContactNum() { + return contactNum; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o==null || o.getClass() != getClass()) return false; + User that = (User) o; + return Objects.equals(that.id, this.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } +} diff --git a/splitwise/src/input.txt b/splitwise/src/input.txt new file mode 100644 index 0000000..a991f8e --- /dev/null +++ b/splitwise/src/input.txt @@ -0,0 +1,10 @@ +SHOW +SHOW U1 +EXPENSE U1 1000 4 U1 U2 U3 U4 EQUAL +SHOW U4 +SHOW U1 +EXPENSE U1 1250 2 U2 U3 EXACT 370 880 +SHOW +EXPENSE U4 1200 4 U1 U2 U3 U4 PERCENT 40 20 20 20 +SHOW U1 +SHOW \ No newline at end of file From 4399d6410856aa5e71ad24a2c135ab2e15284f78 Mon Sep 17 00:00:00 2001 From: Varsha Lalwani Date: Wed, 18 May 2022 11:49:35 +0530 Subject: [PATCH 2/2] Snake Ladder --- .idea/modules.xml | 1 + out/production/snake-ladder/Driver.class | Bin 0 -> 1743 bytes .../snake-ladder/SnakeLadderManager.class | Bin 0 -> 3153 bytes .../snake-ladder/SnakeLadderService$1.class | Bin 0 -> 686 bytes .../snake-ladder/SnakeLadderService.class | Bin 0 -> 937 bytes out/production/snake-ladder/models/User.class | Bin 0 -> 710 bytes .../snake-ladder/models/object/Dice.class | Bin 0 -> 744 bytes .../models/object/GameObject.class | Bin 0 -> 804 bytes .../snake-ladder/models/object/Ladder.class | Bin 0 -> 379 bytes .../models/object/ObjectType.class | Bin 0 -> 963 bytes .../snake-ladder/models/object/Snake.class | Bin 0 -> 376 bytes snake-ladder/resources/input.txt | 22 ++++++ snake-ladder/snake-ladder.iml | 16 ++++ snake-ladder/src/Driver.java | 34 +++++++++ snake-ladder/src/SnakeLadderManager.java | 71 ++++++++++++++++++ snake-ladder/src/SnakeLadderService.java | 19 +++++ snake-ladder/src/models/User.java | 27 +++++++ snake-ladder/src/models/object/Dice.java | 10 +++ .../src/models/object/GameObject.java | 32 ++++++++ snake-ladder/src/models/object/Ladder.java | 8 ++ .../src/models/object/ObjectType.java | 7 ++ snake-ladder/src/models/object/Snake.java | 8 ++ .../src/models/object/package-info.java | 1 + snake-ladder/src/models/package-info.java | 1 + 24 files changed, 257 insertions(+) create mode 100644 out/production/snake-ladder/Driver.class create mode 100644 out/production/snake-ladder/SnakeLadderManager.class create mode 100644 out/production/snake-ladder/SnakeLadderService$1.class create mode 100644 out/production/snake-ladder/SnakeLadderService.class create mode 100644 out/production/snake-ladder/models/User.class create mode 100644 out/production/snake-ladder/models/object/Dice.class create mode 100644 out/production/snake-ladder/models/object/GameObject.class create mode 100644 out/production/snake-ladder/models/object/Ladder.class create mode 100644 out/production/snake-ladder/models/object/ObjectType.class create mode 100644 out/production/snake-ladder/models/object/Snake.class create mode 100644 snake-ladder/resources/input.txt create mode 100644 snake-ladder/snake-ladder.iml create mode 100644 snake-ladder/src/Driver.java create mode 100644 snake-ladder/src/SnakeLadderManager.java create mode 100644 snake-ladder/src/SnakeLadderService.java create mode 100644 snake-ladder/src/models/User.java create mode 100644 snake-ladder/src/models/object/Dice.java create mode 100644 snake-ladder/src/models/object/GameObject.java create mode 100644 snake-ladder/src/models/object/Ladder.java create mode 100644 snake-ladder/src/models/object/ObjectType.java create mode 100644 snake-ladder/src/models/object/Snake.java create mode 100644 snake-ladder/src/models/object/package-info.java create mode 100644 snake-ladder/src/models/package-info.java diff --git a/.idea/modules.xml b/.idea/modules.xml index c4e105d..3e41112 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -3,6 +3,7 @@ + diff --git a/out/production/snake-ladder/Driver.class b/out/production/snake-ladder/Driver.class new file mode 100644 index 0000000000000000000000000000000000000000..2528dab005518ff99f942330b569a81314b2b856 GIT binary patch literal 1743 zcmZuxU2hvz5IyUUy&K2*a_WK!2`v=rBy~1TX$naxA5GJiI!VDzAi&Fwy-BuN?^^4% z2@;Rt2OuHw#0yANLgE1-Ifwu+NJt>jhyDrv0}_;TcWr8jZSB2t=gyp&IWxPz{r&w< z050L36h<*Ga4ChD+Fvm6VhRZ?2rQ-`a9J%crEnfs)bg@{S5lb8tIGT}wOm!pl3K0_ zEDK!MpkKCKJGi1Do}b*%khtnqEDb|N+qG63)h)}vBexuCGDWW}oek;R>fBZ)f?d0= z!6+{IcGL0~>0gz$tKnq+-Qr!@l%^xy9kUepw!5>a@Qt!ptxC5-uhAYR8Z?{FO#(@O zhenyYEBCCTtW+$2MY?jw@->_&mX2vv>}^|RIv7Q^J#(37>P5XQT~|4dMpuo%cFae_zUss*;^)&*YYx#TtcvZazHV8rN*$|sEz$TGR(MQcch3Abz2ux^G?&8GD0 zyK=^n&im4}%^EZDTR}#r({^i(U?$iP zR06j&jD)ee$x|1_G*+;h#u{#?@dn;x`%a}%!kskMv604GYIz&C(%4j0=uu%Bh96PA zwsqGk2met;Bh!f)PEng}4ddN4uX@3<*KjNUlBpq^@9I(4?2WYboyiF2(Y5viHSChm*BqM__Jrv99vJLK*l-P#-EliX zdc;-r^wF&|hJvyh2flSRM}BZ!RxO-HhTjnNi-9F0%k?BrCU=c{a_SJ;H{tbTT=hta z$0?`Vat=@M)Q2%VNf0{6a{LDMQFs3cvCTuoi$_RoW|D`{SB@Yy&mF>8Ews?LkjN#z zLuw%zpVzZ`F4;o==a}l;WYR4REQslxh|kd~ClYFFVemlL?mc|aF;f6~d|qTlPVWU^ zOy`UUz-R*u9fZ$VSl9xkL-Y2L^5bm~LT2u@Hx1p^0&>0tWw?u<{g% z>_?uQT*LqtF^DA$;Wmaj_(RyB{ykc5k!qVHH%aq{Wa=ZLeM~Mt;r=Q0pOMKg$m3UJ z@{lop!~}k({3}l3cScaG9}s_uSmV4CnC55wDcC8mg$85Af9%n<1U^oQyo mU<$+p5<+6sEmx`gAe-dj1M}_$ggme`t6;Q_Jl@d((dlP_FC&(>sxED^vC<( z+y$@;p9N8mLn``%D8Zpptj9BAIb4bX3W8!#RMKp*YP6SbnlR`XPh7mkl zhP@aS%c&qvuiv|&WS}A;;~Z15D&mmab9>D4`Kp|047yTDOi;rn>1o} z=4d)Is81_cJus=y=#i|QNJc2=QcxOAjGMZhwG0Kj3U9k}$E0qKNBT|M7&ol0BBCC8 z31%~fl?U1Spqo@WZX`32lhpY)2mbDanXr2lc$!;=6?pg2M1-3#jiGF6%&<=AV@XP? z2GTJ-Ijma=adw1Wdm@ohP%{uU^(kXOkH-ybP&aiEuz~>3@FljS{u3ggM?NJ(_w-rXXt|X?1StP!Py^4Y;{t?9)ko z_MkLVV_C}@)`=>2BwK;sG%mqL z;X_7FIB@w_*lhN4WHms zb|3XvTAEB4;c@nXw5nRk6JN$MJN>p{>2{j^wARTxHwGd(j1#ldB-OH()L4Cdp zR_O5UxRIiUHNz_Bx<2Pg!I`C!t~7th_IUtbbbHP_@mDP;CFhrCI%_M~?S5d6t_#eO zw5$~I#SHZJ_3b~-M>L}+v&ND03hJ8s-KzOXN8Kr7Hfj*Bve{9PbCaUN$fQmnu|#@Z zfqK3ev{5JY%#d-B9y#UsK)t3s)a3PLk1ge1Ram<|$-Opi*kZ>)kYy>l+)U&ncjcWI z6;IGZX9_mEef$@90ges_m+|-WRmIXK2celcY|K6|_VRw1rK`uIvl-h+G5xeCV{IjwL4!Q#qN2! z1!e;Kp z=e&==NBf=V;?7Uho3a`n#_$_0_pmC!J*R3t+_xiuzsbCcz4viWMNmaGf7bnl4*pqW zdzGkIPpd!S7d7SgE?4p9F4Dh`e;aRNZB%U05*+*ovKiM& literal 0 HcmV?d00001 diff --git a/out/production/snake-ladder/SnakeLadderService$1.class b/out/production/snake-ladder/SnakeLadderService$1.class new file mode 100644 index 0000000000000000000000000000000000000000..b67d1713d0947c36bef42308b960cf6f9753ccab GIT binary patch literal 686 zcmaJ;(QeZ)6g_U!rVSYjqtG%K8#LS67b>2303l6VC#JQXM5ghuCpWQHcV0X>X%Sz< zGaw;^&^~~VLR_blK$<|ZeeSur_t-i2=dbTq0A8T$;XaymxMnYT<>z9+lSG(En7NF_ zvnii*Qtzj+(wR)ph9aNn#Ki_ZWhAovjm~lxPkcN@+eaOqj}V(awy@2xYP)-ir)Ry9 zj%M*>Uka7sp7MuyhHyxzjR-rwd` z=UmOK)>@}~I`~)JONL4`+Bxjg+y7VOYLm#6t6~T=mFi$;Z?FG0*q}MrXzna%Subov z{1$w|C1O*QDFQm*z^;CHUr_pNSNSU(=jbDx!-7_cRtowFCDLi2i3(b1ldBa{xJ?Sx sLZ^;pic7Qu+CH3jE>#Te0S9-AZ!5S<=#UCeiH`{=lGXMYp literal 0 HcmV?d00001 diff --git a/out/production/snake-ladder/SnakeLadderService.class b/out/production/snake-ladder/SnakeLadderService.class new file mode 100644 index 0000000000000000000000000000000000000000..cd6d8be0618baed03feed98adb7d6d12be1bf121 GIT binary patch literal 937 zcmZuv-A)rh7(KK7S$5e7TfNeN@rFdxWWkG)CPr_j+X-E0w`6z0_!K^f zH`NPCB=G@!DC3!K6DaK@GvDu=GvCSl{rCG1fLEy5u<*!&jmI|Dux{dsjVv}yxHj_I zJ~gpv;+cTc2tyU^^<*5YSRnr<2!rIUK&D)231s&M9VM{f1)(}P>$g>ODBC?|O5VVi zy_Spu9gmaQq#F=p$!mu4M0v8)QBhMx=Yg+w1uVuN+Q-UI1U{F&K9PHIeK5+@)577` zQ?=_I%X3-p$?&M&2orUrqFJfR4S@HuuTl_F*(s`q6Ii{`d5ww#c9rZ1EY2WhF_A$} zpwLXDf3h!6$79;f!CB<1cYzjSd3x5G9zbCJK*h=|1KnFJx-p8F0PeHn=tLgR#GPiR{O%?F;0Fm&lJib0~(a zW}q2M#M0<4=27GGUNfuN*HQ-D!Cgk=!ZKDy$UC@4&%i3PIb>YRV(Wbd21y^%X4z&F L4m`ETRh;_|Z6nx{ literal 0 HcmV?d00001 diff --git a/out/production/snake-ladder/models/User.class b/out/production/snake-ladder/models/User.class new file mode 100644 index 0000000000000000000000000000000000000000..be11121bfaada7001c31e9434b468d052465e5e7 GIT binary patch literal 710 zcmZvaOH0F05QWc;X=2k@wbu7rH?@LUx=^}N1feLRb)UAO-jb$}rv5GkMRDN|@JET~ z-o~~*2;A4qcjnBHkI%Pv0EgIhU|~6n3|1VhVojaaZEV=s6fk5{V5Zvk?|rYI$k40R z&QFg7%*gKq0);^&^rMz{oy0O~F=idhNG275`O@F;-YwyiZjrX1q~VjyA)jKwT$YD38@T!51JhGISw1Y;pKnfMO|X)3)v!YrvLx| literal 0 HcmV?d00001 diff --git a/out/production/snake-ladder/models/object/Dice.class b/out/production/snake-ladder/models/object/Dice.class new file mode 100644 index 0000000000000000000000000000000000000000..88895942049eaa1f1c2f28e77374b7b0e53b7d84 GIT binary patch literal 744 zcmah{O>fgc5Pg$4acvC!3IR$B{jQTp_{br^1yspWpc1X39@#kCbSq~qx$CMw3oaqz zzz^U@A!c1mJrIE<@65c}c{^`*fBpXP6ToZqe7Jb(;~6%5JjbT>wygKU#Y-34gytKi zm3c>~hn*q8d7q6XVR@jm{8UUwGCvcel##VTmWXsHa%JNRbj+o?CbR}qu1c??Y;+|P z6MayL>=S~CG}ax8v|xsQIJgowB1(mxM6ot0d}$HVn4tE4g(w^4A4QBwf`-TuyQZv zq?AoKETO`vG)gj^6nQSSiOw!_DaPgaK9~Iv+$u-thLzm^R`Ebr?~knJM_5wYRC4(S zS){Awt>HAG5yo+e+}H~^xgfN|c+qsRgC@Td`_;gd@Obq(ir5m{M)y1DTbX{qYx537 zzvMJ=WP{^=P1l$7PFc#%p-;2Xup}9{>OV literal 0 HcmV?d00001 diff --git a/out/production/snake-ladder/models/object/GameObject.class b/out/production/snake-ladder/models/object/GameObject.class new file mode 100644 index 0000000000000000000000000000000000000000..d21574e3db401deb7a12f77752460b6f2f479ac8 GIT binary patch literal 804 zcmZ`$%}&BV7@RGo6|90N2>wNHfW{s@XuO#ClMp>zz=tx< zZmSqmv&ruF&CWM7-F|$&y#qMFRvuYYbFfj<+nS4Y7aIchy^?nV%dNhAkbWqKJ^x}D zsh%1i@-mV^DBv6g!yq~qXw*|^DNv)$*^|+o5-7BSp}L$7I%<3)J0X!$Yt)rtTaE+W zC!ihO2NQv{)__yt#2^fsR+0dG6~s@sPu&2M4Z)Ik*DV{~`($XO9@C7Rb~aZF`3=p5Q zYVp))4tWU7v%2MdhG(Jq3entsfz{l5LFS2&1&@1)LLk*?mMt zgsHTVMS~)i5}RZ87VjKmF;mYQbcvx#Mzs>NepH=AmH#kZ>sQiPt4yuRKUzAM;9AB? plFK(eAEo&W>yZKDk9G(HH6!DhI-5iiD5nl*{tj=Z4p)rD>K768ekK3_ literal 0 HcmV?d00001 diff --git a/out/production/snake-ladder/models/object/Ladder.class b/out/production/snake-ladder/models/object/Ladder.class new file mode 100644 index 0000000000000000000000000000000000000000..b386260953c9066689809e86a26015de08c8dc37 GIT binary patch literal 379 zcmZutO-sW-5PcJ4qG`3-ig?tURWU~oiWfmCEP7CS-y}=BB_EJ({a>C05B>mul=#+q z5i$$2@4cCMv+URR$0vX*j1p{MFUEe1p&+`kwRN|G@u^zqSDlu+o~4u8nVD&?JEZYc z5Z*O~5e$^A&Eu-dO#7mYIAdM{g&Q(^wPh#j}V)JgD!8u(SP|tSLW$=J5CVr8+-^4J(wf1 u301GhXXh91kT=2rF>}HjY>CLWh>q87*k;8?j2`+l@o0xAAl@YlF!%v-2viRM literal 0 HcmV?d00001 diff --git a/out/production/snake-ladder/models/object/ObjectType.class b/out/production/snake-ladder/models/object/ObjectType.class new file mode 100644 index 0000000000000000000000000000000000000000..0ac2ceacd8ba0a3670b2a113f708b09332a968ae GIT binary patch literal 963 zcmaJj5U0)!V`|f$?oO|E<_50gT0MGFx3yw_{5AaaNqKro>G?c{8P%y7j z(GZBTg1m@ZGPW7gcC-Gf!BDii(OWO*nNj=HbNl9D5{^E8@Tv?MtA23Mc+DVhw(8b# z!)91{GxNZi6AZi_!&=Fh3FP~v%8uO`=yZuz|Cfu}tNEed-(@KLN9v`~V&MJvK6R6|{Z8og z2Qe{8B~egnZZJN)Jw@FJ2i@BB9(QS`svQkt*L&fMZu66IS46WK7Q_uMYIuwa!_swk zqoDv(!wOb4%p<2Ej~qj8GB06-F4+yDkYsL_j46{NO|tTAy6yeI>Gi5pu)ia}%39sq zp+}_A%ait&g*ZTw^nrzq zDN@OBlAMTvUi~s-t literal 0 HcmV?d00001 diff --git a/out/production/snake-ladder/models/object/Snake.class b/out/production/snake-ladder/models/object/Snake.class new file mode 100644 index 0000000000000000000000000000000000000000..db6a5f3c8c12a85ee2884a677bef2476a0de018d GIT binary patch literal 376 zcmZut!Ab)$6r8N=$MwaGY11va75vmb&!W#HklOqS->L znLxi~7mHpQE09j=byMnl6PBc#$?Ndi4q|L`w#8ZC7l%1XBJ0 literal 0 HcmV?d00001 diff --git a/snake-ladder/resources/input.txt b/snake-ladder/resources/input.txt new file mode 100644 index 0000000..5be0177 --- /dev/null +++ b/snake-ladder/resources/input.txt @@ -0,0 +1,22 @@ +9 +62 5 +33 6 +49 9 +88 16 +41 20 +56 53 +98 64 +93 73 +95 75 +8 +2 37 +27 46 +10 32 +51 68 +61 79 +65 84 +71 91 +81 100 +2 +Gaurav +Sagar \ No newline at end of file diff --git a/snake-ladder/snake-ladder.iml b/snake-ladder/snake-ladder.iml new file mode 100644 index 0000000..2b6d115 --- /dev/null +++ b/snake-ladder/snake-ladder.iml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/snake-ladder/src/Driver.java b/snake-ladder/src/Driver.java new file mode 100644 index 0000000..3595892 --- /dev/null +++ b/snake-ladder/src/Driver.java @@ -0,0 +1,34 @@ +import java.io.File; +import java.io.FileNotFoundException; +import java.util.Scanner; + +public class Driver { + public static void main(String[] args) throws FileNotFoundException { + SnakeLadderManager snakeLadderManager = new SnakeLadderManager(); + File file = new File("/Users/varsha.lalwani/personal/mock-machine-coding-2/snake-ladder/resources/input.txt"); + Scanner scanner = new Scanner(file); + String command = scanner.nextLine(); + Integer numOfSnakes = Integer.valueOf(command); + for (int i=0; i objectsPosMap; + + private Map userPosMap; + + SnakeLadderManager() { + objectsPosMap = new HashMap<>(); + userPosMap = new HashMap<>(); + } + + public void addSnake(Integer head, Integer tail) { + SnakeLadderService.addObject(ObjectType.SNAKE, head, tail); + objectsPosMap.put(head, tail); + } + + public void addLadder(Integer head, Integer tail) { + SnakeLadderService.addObject(ObjectType.LADDER, head, tail); + objectsPosMap.put(head, tail); + } + + public void addUser(String name) { + User user = new User(name); + userPosMap.put(user, 0); + } + + public void playGame() { + while (true) { + boolean winnerDeclared = false; + for (User user : userPosMap.keySet()) { + Integer currVal = Dice.getDiceValue(1, 6); + Integer currPos = userPosMap.get(user); + if (currPos + currVal == 100) { + printMove(user, currVal, currPos, currPos+currVal); + printWinner(user); + winnerDeclared = true; + break; + } + if (currPos + currVal > 100) { + printMove(user, currVal, currPos, currPos); + continue; + } + Integer newPos = currPos + currVal; + if (objectsPosMap.containsKey(newPos)) { + newPos = objectsPosMap.get(newPos); + } + userPosMap.put(user, newPos); + printMove(user, currVal, currPos, newPos); + } + if (winnerDeclared) { + break; + } + } + } + + public void printMove(User user, Integer diceMove, Integer initialPos, Integer newPos) { + System.out.printf("%s rolled a %s and moved from %s to %s %n", user.getName(), diceMove, + initialPos, newPos); + } + public void printWinner(User user) { + System.out.printf("%s wins the game %n", user.getName()); + } + +} diff --git a/snake-ladder/src/SnakeLadderService.java b/snake-ladder/src/SnakeLadderService.java new file mode 100644 index 0000000..647dd96 --- /dev/null +++ b/snake-ladder/src/SnakeLadderService.java @@ -0,0 +1,19 @@ +import models.object.GameObject; +import models.object.Ladder; +import models.object.ObjectType; +import models.object.Snake; + +public class SnakeLadderService { + + public static GameObject addObject(ObjectType objectType, Integer head, Integer tail) { + switch (objectType) { + case SNAKE: + return new Snake(head, tail); + case LADDER: + return new Ladder(head, tail); + default: + return null; + } + } + +} diff --git a/snake-ladder/src/models/User.java b/snake-ladder/src/models/User.java new file mode 100644 index 0000000..8d4c4b6 --- /dev/null +++ b/snake-ladder/src/models/User.java @@ -0,0 +1,27 @@ +package models; + +import java.util.UUID; + +public class User { + + private UUID id; + + private String name; + + public User(final String name){ + this.name = name; + id = UUID.randomUUID(); + } + + public void setName(String name) { + this.name = name; + } + + public UUID getId() { + return id; + } + + public String getName() { + return name; + } +} diff --git a/snake-ladder/src/models/object/Dice.java b/snake-ladder/src/models/object/Dice.java new file mode 100644 index 0000000..2370787 --- /dev/null +++ b/snake-ladder/src/models/object/Dice.java @@ -0,0 +1,10 @@ +package models.object; + +import java.util.concurrent.ThreadLocalRandom; + +public class Dice { + public static Integer getDiceValue(Integer diceMinValue, Integer diceMaxValue) { + int randomNum = ThreadLocalRandom.current().nextInt(diceMinValue, diceMaxValue + 1); + return randomNum; + } +} diff --git a/snake-ladder/src/models/object/GameObject.java b/snake-ladder/src/models/object/GameObject.java new file mode 100644 index 0000000..9824c5e --- /dev/null +++ b/snake-ladder/src/models/object/GameObject.java @@ -0,0 +1,32 @@ +package models.object; + +public abstract class GameObject { + + private Integer head; + + private Integer tail; + + GameObject( + final Integer head, + final Integer tail) { + this.head = head; + this.tail = tail; + } + + public void setHead(Integer head) { + this.head = head; + } + + public void setTail(Integer tail) { + this.tail = tail; + } + + public Integer getHead() { + return head; + } + + public Integer getTail() { + return tail; + } + +} diff --git a/snake-ladder/src/models/object/Ladder.java b/snake-ladder/src/models/object/Ladder.java new file mode 100644 index 0000000..27a1930 --- /dev/null +++ b/snake-ladder/src/models/object/Ladder.java @@ -0,0 +1,8 @@ +package models.object; + +public class Ladder extends GameObject{ + + public Ladder(Integer head, Integer tail){ + super(head, tail); + } +} diff --git a/snake-ladder/src/models/object/ObjectType.java b/snake-ladder/src/models/object/ObjectType.java new file mode 100644 index 0000000..498b978 --- /dev/null +++ b/snake-ladder/src/models/object/ObjectType.java @@ -0,0 +1,7 @@ +package models.object; + +public enum ObjectType { + SNAKE, + + LADDER +} diff --git a/snake-ladder/src/models/object/Snake.java b/snake-ladder/src/models/object/Snake.java new file mode 100644 index 0000000..81fa579 --- /dev/null +++ b/snake-ladder/src/models/object/Snake.java @@ -0,0 +1,8 @@ +package models.object; + +public class Snake extends GameObject{ + + public Snake(Integer head, Integer tail){ + super(head, tail); + } +} diff --git a/snake-ladder/src/models/object/package-info.java b/snake-ladder/src/models/object/package-info.java new file mode 100644 index 0000000..c96601d --- /dev/null +++ b/snake-ladder/src/models/object/package-info.java @@ -0,0 +1 @@ +package models.object; \ No newline at end of file diff --git a/snake-ladder/src/models/package-info.java b/snake-ladder/src/models/package-info.java new file mode 100644 index 0000000..ff011d5 --- /dev/null +++ b/snake-ladder/src/models/package-info.java @@ -0,0 +1 @@ +package models; \ No newline at end of file