From 72861348996130aca6a28e92e955586b98a00510 Mon Sep 17 00:00:00 2001 From: popem Date: Thu, 23 Jun 2022 22:42:08 -0400 Subject: [PATCH 01/45] Added Icons --- .../rules/DuplicateNumberContradictionRule.java | 2 +- .../ExceedingVisibilityContradictionRule.java | 2 +- .../skyscrapers/rules/FixedMaxBasicRule.java | 2 +- .../InsufficientVisibilityContradictionRule.java | 2 +- .../skyscrapers/rules/LastCellBasicRule.java | 2 +- .../skyscrapers/rules/LastNumberBasicRule.java | 2 +- .../puzzle/skyscrapers/rules/NEdgeBasicRule.java | 2 +- .../skyscrapers/rules/OneEdgeBasicRule.java | 2 +- .../rules/PossibleContentsCaseRule.java | 2 +- .../rules/UnresolvedCellContradictionRule.java | 2 +- .../cases}/PossibleContents.png | Bin .../contradictions}/DuplicateNumber.png | Bin .../contradictions/ExceedingVisibility.png | Bin 0 -> 2413 bytes .../contradictions/InsufficientVisibility.png | Bin 0 -> 2413 bytes .../contradictions/UnresolvedCell.png | Bin 0 -> 2413 bytes .../legup/images/skyscrapers/rules/FixedMax.png | Bin 0 -> 2413 bytes .../legup/images/skyscrapers/rules/LastCell.png | Bin 0 -> 2413 bytes .../rules}/LastNumber.png | Bin .../rpi/legup/images/skyscrapers/rules/NEdge.png | Bin 0 -> 2413 bytes .../legup/images/skyscrapers/rules/OneEdge.png | Bin 0 -> 2413 bytes 20 files changed, 10 insertions(+), 10 deletions(-) rename src/main/resources/edu/rpi/legup/images/{skyscraper => skyscrapers/cases}/PossibleContents.png (100%) rename src/main/resources/edu/rpi/legup/images/{skyscraper => skyscrapers/contradictions}/DuplicateNumber.png (100%) create mode 100644 src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/ExceedingVisibility.png create mode 100644 src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/InsufficientVisibility.png create mode 100644 src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/UnresolvedCell.png create mode 100644 src/main/resources/edu/rpi/legup/images/skyscrapers/rules/FixedMax.png create mode 100644 src/main/resources/edu/rpi/legup/images/skyscrapers/rules/LastCell.png rename src/main/resources/edu/rpi/legup/images/{skyscraper => skyscrapers/rules}/LastNumber.png (100%) create mode 100644 src/main/resources/edu/rpi/legup/images/skyscrapers/rules/NEdge.png create mode 100644 src/main/resources/edu/rpi/legup/images/skyscrapers/rules/OneEdge.png diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/DuplicateNumberContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/DuplicateNumberContradictionRule.java index 34fbaa1dc..9bfab10fe 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/DuplicateNumberContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/DuplicateNumberContradictionRule.java @@ -16,7 +16,7 @@ public class DuplicateNumberContradictionRule extends ContradictionRule { public DuplicateNumberContradictionRule() { super("SKYS-CONT-0001", "Duplicate Number", "Skyscrapers of same height cannot be placed in the same row or column.", - "edu/rpi/legup/images/skyscrapers/DuplicateNumber.png"); + "edu/rpi/legup/images/skyscrapers/contradictions/DuplicateNumber.png"); } /** diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java index a2ecaf527..8d23e07b7 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java @@ -16,7 +16,7 @@ public class ExceedingVisibilityContradictionRule extends ContradictionRule { public ExceedingVisibilityContradictionRule() { super("SKYS-CONT-0002", "Exceeding Visibility", "More skyscrapers are visible than there should be.", - "edu/rpi/legup/images/skyscrapers/ExceedingVisibility.png"); + "edu/rpi/legup/images/skyscrapers/contradictions/ExceedingVisibility.png"); } /** diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java index a3cac5bdd..ac04d9816 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java @@ -19,7 +19,7 @@ public class FixedMaxBasicRule extends BasicRule { public FixedMaxBasicRule() { super("SKYS-BASC-0001","Fixed Max", "If the sum of two opposing edges is n+1, the maximum number appears at a position k spaces away from the edge, where k is the number at that edge.", - "edu/rpi/legup/images/skyscrapers/FixedMax.png"); + "edu/rpi/legup/images/skyscrapers/rules/FixedMax.png"); } /** diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java index d134fd8bf..45418916f 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java @@ -16,7 +16,7 @@ public class InsufficientVisibilityContradictionRule extends ContradictionRule { public InsufficientVisibilityContradictionRule() { super("SKYS-CONT-0003", "Insufficient Visibility", "Less skyscrapers are visible than there should be.", - "edu/rpi/legup/images/skyscrapers/InsufficientVisibility.png"); + "edu/rpi/legup/images/skyscrapers/contradictions/InsufficientVisibility.png"); } /** diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastCellBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastCellBasicRule.java index dc37cbe12..728bf70f8 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastCellBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastCellBasicRule.java @@ -19,7 +19,7 @@ public class LastCellBasicRule extends BasicRule { public LastCellBasicRule() { super("SKYS-BASC-0002", "Last Cell", "A certain number must go in a certain cell, because that cell is the last place that number can appear in that row/column.", - "edu/rpi/legup/images/skyscrapers/LastCell.png"); + "edu/rpi/legup/images/skyscrapers/rules/LastCell.png"); } /** diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java index fa9fb31a0..231287ff6 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java @@ -19,7 +19,7 @@ public class LastNumberBasicRule extends BasicRule { public LastNumberBasicRule() { super("SKYS-BASC-0003", "Last Number", "A certain cell must contain a certain number since that number is the only one that can possibly appear in that cell.", - "edu/rpi/legup/images/skyscrapers/LastNumber.png"); + "edu/rpi/legup/images/skyscrapers/rules/LastNumber.png"); } /** diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/NEdgeBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/NEdgeBasicRule.java index 9344173b1..8a2b148a9 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/NEdgeBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/NEdgeBasicRule.java @@ -19,7 +19,7 @@ public class NEdgeBasicRule extends BasicRule { public NEdgeBasicRule() { super("SKYS-BASC-0004", "N Edge", "If the maximum number appears on an edge, the row or column��s numbers appear in ascending order, starting at that edge.", - "edu/rpi/legup/images/skyscrapers/NEdge.png"); + "edu/rpi/legup/images/skyscrapers/rules/NEdge.png"); } /** diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java index 559817ae1..f5a8d5841 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java @@ -19,7 +19,7 @@ public class OneEdgeBasicRule extends BasicRule { public OneEdgeBasicRule() { super("SKYS-BASC-0005", "One Edge", "If you have a 1 on an edge, put n in the adjacent square.", - "edu/rpi/legup/images/skyscrapers/OneEdge.png"); + "edu/rpi/legup/images/skyscrapers/rules/OneEdge.png"); } /** diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PossibleContentsCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PossibleContentsCaseRule.java index d1ae8a8cd..41f07a906 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PossibleContentsCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PossibleContentsCaseRule.java @@ -19,7 +19,7 @@ public class PossibleContentsCaseRule extends CaseRule { public PossibleContentsCaseRule() { super("SKYS-CASE-0001", "Possible Contents", "Each blank cell is could have height of 1 to n.", - "edu/rpi/legup/images/skyscrapers/PossibleContents.png"); + "edu/rpi/legup/images/skyscrapers/cases/PossibleContents.png"); } @Override diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedCellContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedCellContradictionRule.java index f667fc0e7..0099f52b8 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedCellContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedCellContradictionRule.java @@ -16,7 +16,7 @@ public class UnresolvedCellContradictionRule extends ContradictionRule { public UnresolvedCellContradictionRule() { super("SKYS-CONT-0004", "Unresolved Cell", "Elimination leaves no possible number for a cell.", - "edu/rpi/legup/images/skyscrapers/UnresolvedCell.png"); + "edu/rpi/legup/images/skyscrapers/contradictions/UnresolvedCell.png"); } /** diff --git a/src/main/resources/edu/rpi/legup/images/skyscraper/PossibleContents.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/cases/PossibleContents.png similarity index 100% rename from src/main/resources/edu/rpi/legup/images/skyscraper/PossibleContents.png rename to src/main/resources/edu/rpi/legup/images/skyscrapers/cases/PossibleContents.png diff --git a/src/main/resources/edu/rpi/legup/images/skyscraper/DuplicateNumber.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/DuplicateNumber.png similarity index 100% rename from src/main/resources/edu/rpi/legup/images/skyscraper/DuplicateNumber.png rename to src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/DuplicateNumber.png diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/ExceedingVisibility.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/ExceedingVisibility.png new file mode 100644 index 0000000000000000000000000000000000000000..64fb4fc865c281f533be041dc6aad136e9e208ac GIT binary patch literal 2413 zcmb_d2~bm67EM?>h^T-dw&I4OECCu&qmhK&h(bsMvTImOr)_Z{fe*@m#h2bZt~B9I4g)4>@8ktqN% zhXM+;JecD^IszX|qq8}@agk_2rWdrNJA*_ma?3(Xu$GKQ;Q|0fhMei+pmv<@3}PZ% z1dzdKl0G~<4AwT0LGJwgd_sIY00>f3Q#llb%!4lAm3Sa1oNf3OXF$ZESR#mQHW2}c zxak-zj}qPjuLKWTLJ;H@k$_1AWsq%n*)+{k%aXzoeQTG(0f3JmKW1iT78DeKl%Iq0 zWx*}X1?vj7_5Xe#t_$b-!1}8~j(CNF0Vx~M*;AQEArM%BgPpb8g_F}oXR-$EG?Fld z>T0DAbG!+q@iaN3Yu?J9#{4z|O+_jI1Wt7y%BmPB>UE%x5Bqb)r2~`ZBJ{9-_;}_< z1d89jzcUdcQMq?1=&4G#7ISDUSKw5|T>P7#Z}g_dSW<*lDZK0&x?>bM)<_0!*cKSq z;EZdVmo$8iRR^6cbNv|pIeO=s;_;zW(&!bBq|xG5I@77D1Pg?~!UL5@<<4VLycq9P zOk}FKOCOu`BNthsst`gJLgP&<+Q6a|nnZR4uI04*2m&r(w6I%lL`grh1b!Dd=*R+O zWK*r_*r?r5PTw>OA+I7DD&%fVjBuh=3fm0Ft)IzX5E@(^j~;s+B=s7q=#bz zG+|=81|K>wtF(sWwgP=N^fsGsxn@M<=db-W*IeWXd*9_B>2+YKH_WQ>`eh>0uQ4)P zi0jz=*7W#*%Un#o&etK->u2PlENaG+;v-WJNb8I24Vy{pw|JnfgB@)mMQG%P2U31i z7~FL-L#h?3h@!X!4NM$V7?}T`sY_k5MzC zq>0h!uB3Isr@IW&a3s42S82Btglb;ydWNy>eLs7+lM<*qse~x6DIDqX9CgktXS;(x-2{O&!@H47{d99ba0b_XG2khf%|A9ZNYkS& zGl`kA$#BE$g@>tUla6<1Ab0z!=jmie6%wjtosbjig6p-}(jxM+OQLd-5<&3OWEVO$ z+K(Zv1}=$LN#LbZui;B({X^m&%}dQ@_;U7p-0Qs;*Jeml7Pmgq4JbU!-Jvd+nN9-h zsC2VoP3m(`EUdWdUCqzT;DxXWPwcLdXA-rGX*kK*TrJ~lzxf5bll(XK_{$osV z&thMWSoV}mDB8Sado|WMm9qmG(rsdsi`!*Q;_sdQEa}k%#sP&qtszY+`ScWWjEa$U z?U-|1yL4owt^+AoLa;w=D_s2T+y34>VAC1prrlTV`?VqYY!bDOy3-9LD`_qWQ|cQ` z43BPB<}$+xniv^T&0wZ{B-x#?+^~{>M^X~1*W2G*qjy%%qUF_!O)|pUqB(c)9E3FD z?a~c>Tr9j>k!zbm;bnTS)!lmX*e?gO?_V~$MPzwOPMbF74%T_XQ_>i^ceQQ)NtSZP z!3d^G{}DXlrP;?`-n72;!pqe#c^%ceepU))8&r}*Sl4o&(?NKscNA72fE6W z$=J<-^1c-=)Z<~k%b)AH__M~o(h>R{Q~d53A@bm;PS)gGe$d;k?{q+4okSF05WWz} zHwRys5Aai?*J<6#4$#zReD!0Hfs9YZ`L4Y`m@j99mJ2!#V+|@j?cCo{2HP>&GWff>n0hi0<<9ZvP!xGYiifewZ(zqI{dYKh_Fvj!l`!HRF}O~r5DXu_4mhJDnj+}QQ(zjPEJcAuG=%Sm3pT#u;A$J260X!36`ePCs=e2g3_=unwQ)Q4Kb%P3WS$2T{ADH77x06= Z!k#nZ(snP>&VW}p#K9hG$FT8>`#a>+vu^+Z literal 0 HcmV?d00001 diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/InsufficientVisibility.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/InsufficientVisibility.png new file mode 100644 index 0000000000000000000000000000000000000000..64fb4fc865c281f533be041dc6aad136e9e208ac GIT binary patch literal 2413 zcmb_d2~bm67EM?>h^T-dw&I4OECCu&qmhK&h(bsMvTImOr)_Z{fe*@m#h2bZt~B9I4g)4>@8ktqN% zhXM+;JecD^IszX|qq8}@agk_2rWdrNJA*_ma?3(Xu$GKQ;Q|0fhMei+pmv<@3}PZ% z1dzdKl0G~<4AwT0LGJwgd_sIY00>f3Q#llb%!4lAm3Sa1oNf3OXF$ZESR#mQHW2}c zxak-zj}qPjuLKWTLJ;H@k$_1AWsq%n*)+{k%aXzoeQTG(0f3JmKW1iT78DeKl%Iq0 zWx*}X1?vj7_5Xe#t_$b-!1}8~j(CNF0Vx~M*;AQEArM%BgPpb8g_F}oXR-$EG?Fld z>T0DAbG!+q@iaN3Yu?J9#{4z|O+_jI1Wt7y%BmPB>UE%x5Bqb)r2~`ZBJ{9-_;}_< z1d89jzcUdcQMq?1=&4G#7ISDUSKw5|T>P7#Z}g_dSW<*lDZK0&x?>bM)<_0!*cKSq z;EZdVmo$8iRR^6cbNv|pIeO=s;_;zW(&!bBq|xG5I@77D1Pg?~!UL5@<<4VLycq9P zOk}FKOCOu`BNthsst`gJLgP&<+Q6a|nnZR4uI04*2m&r(w6I%lL`grh1b!Dd=*R+O zWK*r_*r?r5PTw>OA+I7DD&%fVjBuh=3fm0Ft)IzX5E@(^j~;s+B=s7q=#bz zG+|=81|K>wtF(sWwgP=N^fsGsxn@M<=db-W*IeWXd*9_B>2+YKH_WQ>`eh>0uQ4)P zi0jz=*7W#*%Un#o&etK->u2PlENaG+;v-WJNb8I24Vy{pw|JnfgB@)mMQG%P2U31i z7~FL-L#h?3h@!X!4NM$V7?}T`sY_k5MzC zq>0h!uB3Isr@IW&a3s42S82Btglb;ydWNy>eLs7+lM<*qse~x6DIDqX9CgktXS;(x-2{O&!@H47{d99ba0b_XG2khf%|A9ZNYkS& zGl`kA$#BE$g@>tUla6<1Ab0z!=jmie6%wjtosbjig6p-}(jxM+OQLd-5<&3OWEVO$ z+K(Zv1}=$LN#LbZui;B({X^m&%}dQ@_;U7p-0Qs;*Jeml7Pmgq4JbU!-Jvd+nN9-h zsC2VoP3m(`EUdWdUCqzT;DxXWPwcLdXA-rGX*kK*TrJ~lzxf5bll(XK_{$osV z&thMWSoV}mDB8Sado|WMm9qmG(rsdsi`!*Q;_sdQEa}k%#sP&qtszY+`ScWWjEa$U z?U-|1yL4owt^+AoLa;w=D_s2T+y34>VAC1prrlTV`?VqYY!bDOy3-9LD`_qWQ|cQ` z43BPB<}$+xniv^T&0wZ{B-x#?+^~{>M^X~1*W2G*qjy%%qUF_!O)|pUqB(c)9E3FD z?a~c>Tr9j>k!zbm;bnTS)!lmX*e?gO?_V~$MPzwOPMbF74%T_XQ_>i^ceQQ)NtSZP z!3d^G{}DXlrP;?`-n72;!pqe#c^%ceepU))8&r}*Sl4o&(?NKscNA72fE6W z$=J<-^1c-=)Z<~k%b)AH__M~o(h>R{Q~d53A@bm;PS)gGe$d;k?{q+4okSF05WWz} zHwRys5Aai?*J<6#4$#zReD!0Hfs9YZ`L4Y`m@j99mJ2!#V+|@j?cCo{2HP>&GWff>n0hi0<<9ZvP!xGYiifewZ(zqI{dYKh_Fvj!l`!HRF}O~r5DXu_4mhJDnj+}QQ(zjPEJcAuG=%Sm3pT#u;A$J260X!36`ePCs=e2g3_=unwQ)Q4Kb%P3WS$2T{ADH77x06= Z!k#nZ(snP>&VW}p#K9hG$FT8>`#a>+vu^+Z literal 0 HcmV?d00001 diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/UnresolvedCell.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/UnresolvedCell.png new file mode 100644 index 0000000000000000000000000000000000000000..64fb4fc865c281f533be041dc6aad136e9e208ac GIT binary patch literal 2413 zcmb_d2~bm67EM?>h^T-dw&I4OECCu&qmhK&h(bsMvTImOr)_Z{fe*@m#h2bZt~B9I4g)4>@8ktqN% zhXM+;JecD^IszX|qq8}@agk_2rWdrNJA*_ma?3(Xu$GKQ;Q|0fhMei+pmv<@3}PZ% z1dzdKl0G~<4AwT0LGJwgd_sIY00>f3Q#llb%!4lAm3Sa1oNf3OXF$ZESR#mQHW2}c zxak-zj}qPjuLKWTLJ;H@k$_1AWsq%n*)+{k%aXzoeQTG(0f3JmKW1iT78DeKl%Iq0 zWx*}X1?vj7_5Xe#t_$b-!1}8~j(CNF0Vx~M*;AQEArM%BgPpb8g_F}oXR-$EG?Fld z>T0DAbG!+q@iaN3Yu?J9#{4z|O+_jI1Wt7y%BmPB>UE%x5Bqb)r2~`ZBJ{9-_;}_< z1d89jzcUdcQMq?1=&4G#7ISDUSKw5|T>P7#Z}g_dSW<*lDZK0&x?>bM)<_0!*cKSq z;EZdVmo$8iRR^6cbNv|pIeO=s;_;zW(&!bBq|xG5I@77D1Pg?~!UL5@<<4VLycq9P zOk}FKOCOu`BNthsst`gJLgP&<+Q6a|nnZR4uI04*2m&r(w6I%lL`grh1b!Dd=*R+O zWK*r_*r?r5PTw>OA+I7DD&%fVjBuh=3fm0Ft)IzX5E@(^j~;s+B=s7q=#bz zG+|=81|K>wtF(sWwgP=N^fsGsxn@M<=db-W*IeWXd*9_B>2+YKH_WQ>`eh>0uQ4)P zi0jz=*7W#*%Un#o&etK->u2PlENaG+;v-WJNb8I24Vy{pw|JnfgB@)mMQG%P2U31i z7~FL-L#h?3h@!X!4NM$V7?}T`sY_k5MzC zq>0h!uB3Isr@IW&a3s42S82Btglb;ydWNy>eLs7+lM<*qse~x6DIDqX9CgktXS;(x-2{O&!@H47{d99ba0b_XG2khf%|A9ZNYkS& zGl`kA$#BE$g@>tUla6<1Ab0z!=jmie6%wjtosbjig6p-}(jxM+OQLd-5<&3OWEVO$ z+K(Zv1}=$LN#LbZui;B({X^m&%}dQ@_;U7p-0Qs;*Jeml7Pmgq4JbU!-Jvd+nN9-h zsC2VoP3m(`EUdWdUCqzT;DxXWPwcLdXA-rGX*kK*TrJ~lzxf5bll(XK_{$osV z&thMWSoV}mDB8Sado|WMm9qmG(rsdsi`!*Q;_sdQEa}k%#sP&qtszY+`ScWWjEa$U z?U-|1yL4owt^+AoLa;w=D_s2T+y34>VAC1prrlTV`?VqYY!bDOy3-9LD`_qWQ|cQ` z43BPB<}$+xniv^T&0wZ{B-x#?+^~{>M^X~1*W2G*qjy%%qUF_!O)|pUqB(c)9E3FD z?a~c>Tr9j>k!zbm;bnTS)!lmX*e?gO?_V~$MPzwOPMbF74%T_XQ_>i^ceQQ)NtSZP z!3d^G{}DXlrP;?`-n72;!pqe#c^%ceepU))8&r}*Sl4o&(?NKscNA72fE6W z$=J<-^1c-=)Z<~k%b)AH__M~o(h>R{Q~d53A@bm;PS)gGe$d;k?{q+4okSF05WWz} zHwRys5Aai?*J<6#4$#zReD!0Hfs9YZ`L4Y`m@j99mJ2!#V+|@j?cCo{2HP>&GWff>n0hi0<<9ZvP!xGYiifewZ(zqI{dYKh_Fvj!l`!HRF}O~r5DXu_4mhJDnj+}QQ(zjPEJcAuG=%Sm3pT#u;A$J260X!36`ePCs=e2g3_=unwQ)Q4Kb%P3WS$2T{ADH77x06= Z!k#nZ(snP>&VW}p#K9hG$FT8>`#a>+vu^+Z literal 0 HcmV?d00001 diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/rules/FixedMax.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/rules/FixedMax.png new file mode 100644 index 0000000000000000000000000000000000000000..64fb4fc865c281f533be041dc6aad136e9e208ac GIT binary patch literal 2413 zcmb_d2~bm67EM?>h^T-dw&I4OECCu&qmhK&h(bsMvTImOr)_Z{fe*@m#h2bZt~B9I4g)4>@8ktqN% zhXM+;JecD^IszX|qq8}@agk_2rWdrNJA*_ma?3(Xu$GKQ;Q|0fhMei+pmv<@3}PZ% z1dzdKl0G~<4AwT0LGJwgd_sIY00>f3Q#llb%!4lAm3Sa1oNf3OXF$ZESR#mQHW2}c zxak-zj}qPjuLKWTLJ;H@k$_1AWsq%n*)+{k%aXzoeQTG(0f3JmKW1iT78DeKl%Iq0 zWx*}X1?vj7_5Xe#t_$b-!1}8~j(CNF0Vx~M*;AQEArM%BgPpb8g_F}oXR-$EG?Fld z>T0DAbG!+q@iaN3Yu?J9#{4z|O+_jI1Wt7y%BmPB>UE%x5Bqb)r2~`ZBJ{9-_;}_< z1d89jzcUdcQMq?1=&4G#7ISDUSKw5|T>P7#Z}g_dSW<*lDZK0&x?>bM)<_0!*cKSq z;EZdVmo$8iRR^6cbNv|pIeO=s;_;zW(&!bBq|xG5I@77D1Pg?~!UL5@<<4VLycq9P zOk}FKOCOu`BNthsst`gJLgP&<+Q6a|nnZR4uI04*2m&r(w6I%lL`grh1b!Dd=*R+O zWK*r_*r?r5PTw>OA+I7DD&%fVjBuh=3fm0Ft)IzX5E@(^j~;s+B=s7q=#bz zG+|=81|K>wtF(sWwgP=N^fsGsxn@M<=db-W*IeWXd*9_B>2+YKH_WQ>`eh>0uQ4)P zi0jz=*7W#*%Un#o&etK->u2PlENaG+;v-WJNb8I24Vy{pw|JnfgB@)mMQG%P2U31i z7~FL-L#h?3h@!X!4NM$V7?}T`sY_k5MzC zq>0h!uB3Isr@IW&a3s42S82Btglb;ydWNy>eLs7+lM<*qse~x6DIDqX9CgktXS;(x-2{O&!@H47{d99ba0b_XG2khf%|A9ZNYkS& zGl`kA$#BE$g@>tUla6<1Ab0z!=jmie6%wjtosbjig6p-}(jxM+OQLd-5<&3OWEVO$ z+K(Zv1}=$LN#LbZui;B({X^m&%}dQ@_;U7p-0Qs;*Jeml7Pmgq4JbU!-Jvd+nN9-h zsC2VoP3m(`EUdWdUCqzT;DxXWPwcLdXA-rGX*kK*TrJ~lzxf5bll(XK_{$osV z&thMWSoV}mDB8Sado|WMm9qmG(rsdsi`!*Q;_sdQEa}k%#sP&qtszY+`ScWWjEa$U z?U-|1yL4owt^+AoLa;w=D_s2T+y34>VAC1prrlTV`?VqYY!bDOy3-9LD`_qWQ|cQ` z43BPB<}$+xniv^T&0wZ{B-x#?+^~{>M^X~1*W2G*qjy%%qUF_!O)|pUqB(c)9E3FD z?a~c>Tr9j>k!zbm;bnTS)!lmX*e?gO?_V~$MPzwOPMbF74%T_XQ_>i^ceQQ)NtSZP z!3d^G{}DXlrP;?`-n72;!pqe#c^%ceepU))8&r}*Sl4o&(?NKscNA72fE6W z$=J<-^1c-=)Z<~k%b)AH__M~o(h>R{Q~d53A@bm;PS)gGe$d;k?{q+4okSF05WWz} zHwRys5Aai?*J<6#4$#zReD!0Hfs9YZ`L4Y`m@j99mJ2!#V+|@j?cCo{2HP>&GWff>n0hi0<<9ZvP!xGYiifewZ(zqI{dYKh_Fvj!l`!HRF}O~r5DXu_4mhJDnj+}QQ(zjPEJcAuG=%Sm3pT#u;A$J260X!36`ePCs=e2g3_=unwQ)Q4Kb%P3WS$2T{ADH77x06= Z!k#nZ(snP>&VW}p#K9hG$FT8>`#a>+vu^+Z literal 0 HcmV?d00001 diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/rules/LastCell.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/rules/LastCell.png new file mode 100644 index 0000000000000000000000000000000000000000..64fb4fc865c281f533be041dc6aad136e9e208ac GIT binary patch literal 2413 zcmb_d2~bm67EM?>h^T-dw&I4OECCu&qmhK&h(bsMvTImOr)_Z{fe*@m#h2bZt~B9I4g)4>@8ktqN% zhXM+;JecD^IszX|qq8}@agk_2rWdrNJA*_ma?3(Xu$GKQ;Q|0fhMei+pmv<@3}PZ% z1dzdKl0G~<4AwT0LGJwgd_sIY00>f3Q#llb%!4lAm3Sa1oNf3OXF$ZESR#mQHW2}c zxak-zj}qPjuLKWTLJ;H@k$_1AWsq%n*)+{k%aXzoeQTG(0f3JmKW1iT78DeKl%Iq0 zWx*}X1?vj7_5Xe#t_$b-!1}8~j(CNF0Vx~M*;AQEArM%BgPpb8g_F}oXR-$EG?Fld z>T0DAbG!+q@iaN3Yu?J9#{4z|O+_jI1Wt7y%BmPB>UE%x5Bqb)r2~`ZBJ{9-_;}_< z1d89jzcUdcQMq?1=&4G#7ISDUSKw5|T>P7#Z}g_dSW<*lDZK0&x?>bM)<_0!*cKSq z;EZdVmo$8iRR^6cbNv|pIeO=s;_;zW(&!bBq|xG5I@77D1Pg?~!UL5@<<4VLycq9P zOk}FKOCOu`BNthsst`gJLgP&<+Q6a|nnZR4uI04*2m&r(w6I%lL`grh1b!Dd=*R+O zWK*r_*r?r5PTw>OA+I7DD&%fVjBuh=3fm0Ft)IzX5E@(^j~;s+B=s7q=#bz zG+|=81|K>wtF(sWwgP=N^fsGsxn@M<=db-W*IeWXd*9_B>2+YKH_WQ>`eh>0uQ4)P zi0jz=*7W#*%Un#o&etK->u2PlENaG+;v-WJNb8I24Vy{pw|JnfgB@)mMQG%P2U31i z7~FL-L#h?3h@!X!4NM$V7?}T`sY_k5MzC zq>0h!uB3Isr@IW&a3s42S82Btglb;ydWNy>eLs7+lM<*qse~x6DIDqX9CgktXS;(x-2{O&!@H47{d99ba0b_XG2khf%|A9ZNYkS& zGl`kA$#BE$g@>tUla6<1Ab0z!=jmie6%wjtosbjig6p-}(jxM+OQLd-5<&3OWEVO$ z+K(Zv1}=$LN#LbZui;B({X^m&%}dQ@_;U7p-0Qs;*Jeml7Pmgq4JbU!-Jvd+nN9-h zsC2VoP3m(`EUdWdUCqzT;DxXWPwcLdXA-rGX*kK*TrJ~lzxf5bll(XK_{$osV z&thMWSoV}mDB8Sado|WMm9qmG(rsdsi`!*Q;_sdQEa}k%#sP&qtszY+`ScWWjEa$U z?U-|1yL4owt^+AoLa;w=D_s2T+y34>VAC1prrlTV`?VqYY!bDOy3-9LD`_qWQ|cQ` z43BPB<}$+xniv^T&0wZ{B-x#?+^~{>M^X~1*W2G*qjy%%qUF_!O)|pUqB(c)9E3FD z?a~c>Tr9j>k!zbm;bnTS)!lmX*e?gO?_V~$MPzwOPMbF74%T_XQ_>i^ceQQ)NtSZP z!3d^G{}DXlrP;?`-n72;!pqe#c^%ceepU))8&r}*Sl4o&(?NKscNA72fE6W z$=J<-^1c-=)Z<~k%b)AH__M~o(h>R{Q~d53A@bm;PS)gGe$d;k?{q+4okSF05WWz} zHwRys5Aai?*J<6#4$#zReD!0Hfs9YZ`L4Y`m@j99mJ2!#V+|@j?cCo{2HP>&GWff>n0hi0<<9ZvP!xGYiifewZ(zqI{dYKh_Fvj!l`!HRF}O~r5DXu_4mhJDnj+}QQ(zjPEJcAuG=%Sm3pT#u;A$J260X!36`ePCs=e2g3_=unwQ)Q4Kb%P3WS$2T{ADH77x06= Z!k#nZ(snP>&VW}p#K9hG$FT8>`#a>+vu^+Z literal 0 HcmV?d00001 diff --git a/src/main/resources/edu/rpi/legup/images/skyscraper/LastNumber.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/rules/LastNumber.png similarity index 100% rename from src/main/resources/edu/rpi/legup/images/skyscraper/LastNumber.png rename to src/main/resources/edu/rpi/legup/images/skyscrapers/rules/LastNumber.png diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/rules/NEdge.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/rules/NEdge.png new file mode 100644 index 0000000000000000000000000000000000000000..64fb4fc865c281f533be041dc6aad136e9e208ac GIT binary patch literal 2413 zcmb_d2~bm67EM?>h^T-dw&I4OECCu&qmhK&h(bsMvTImOr)_Z{fe*@m#h2bZt~B9I4g)4>@8ktqN% zhXM+;JecD^IszX|qq8}@agk_2rWdrNJA*_ma?3(Xu$GKQ;Q|0fhMei+pmv<@3}PZ% z1dzdKl0G~<4AwT0LGJwgd_sIY00>f3Q#llb%!4lAm3Sa1oNf3OXF$ZESR#mQHW2}c zxak-zj}qPjuLKWTLJ;H@k$_1AWsq%n*)+{k%aXzoeQTG(0f3JmKW1iT78DeKl%Iq0 zWx*}X1?vj7_5Xe#t_$b-!1}8~j(CNF0Vx~M*;AQEArM%BgPpb8g_F}oXR-$EG?Fld z>T0DAbG!+q@iaN3Yu?J9#{4z|O+_jI1Wt7y%BmPB>UE%x5Bqb)r2~`ZBJ{9-_;}_< z1d89jzcUdcQMq?1=&4G#7ISDUSKw5|T>P7#Z}g_dSW<*lDZK0&x?>bM)<_0!*cKSq z;EZdVmo$8iRR^6cbNv|pIeO=s;_;zW(&!bBq|xG5I@77D1Pg?~!UL5@<<4VLycq9P zOk}FKOCOu`BNthsst`gJLgP&<+Q6a|nnZR4uI04*2m&r(w6I%lL`grh1b!Dd=*R+O zWK*r_*r?r5PTw>OA+I7DD&%fVjBuh=3fm0Ft)IzX5E@(^j~;s+B=s7q=#bz zG+|=81|K>wtF(sWwgP=N^fsGsxn@M<=db-W*IeWXd*9_B>2+YKH_WQ>`eh>0uQ4)P zi0jz=*7W#*%Un#o&etK->u2PlENaG+;v-WJNb8I24Vy{pw|JnfgB@)mMQG%P2U31i z7~FL-L#h?3h@!X!4NM$V7?}T`sY_k5MzC zq>0h!uB3Isr@IW&a3s42S82Btglb;ydWNy>eLs7+lM<*qse~x6DIDqX9CgktXS;(x-2{O&!@H47{d99ba0b_XG2khf%|A9ZNYkS& zGl`kA$#BE$g@>tUla6<1Ab0z!=jmie6%wjtosbjig6p-}(jxM+OQLd-5<&3OWEVO$ z+K(Zv1}=$LN#LbZui;B({X^m&%}dQ@_;U7p-0Qs;*Jeml7Pmgq4JbU!-Jvd+nN9-h zsC2VoP3m(`EUdWdUCqzT;DxXWPwcLdXA-rGX*kK*TrJ~lzxf5bll(XK_{$osV z&thMWSoV}mDB8Sado|WMm9qmG(rsdsi`!*Q;_sdQEa}k%#sP&qtszY+`ScWWjEa$U z?U-|1yL4owt^+AoLa;w=D_s2T+y34>VAC1prrlTV`?VqYY!bDOy3-9LD`_qWQ|cQ` z43BPB<}$+xniv^T&0wZ{B-x#?+^~{>M^X~1*W2G*qjy%%qUF_!O)|pUqB(c)9E3FD z?a~c>Tr9j>k!zbm;bnTS)!lmX*e?gO?_V~$MPzwOPMbF74%T_XQ_>i^ceQQ)NtSZP z!3d^G{}DXlrP;?`-n72;!pqe#c^%ceepU))8&r}*Sl4o&(?NKscNA72fE6W z$=J<-^1c-=)Z<~k%b)AH__M~o(h>R{Q~d53A@bm;PS)gGe$d;k?{q+4okSF05WWz} zHwRys5Aai?*J<6#4$#zReD!0Hfs9YZ`L4Y`m@j99mJ2!#V+|@j?cCo{2HP>&GWff>n0hi0<<9ZvP!xGYiifewZ(zqI{dYKh_Fvj!l`!HRF}O~r5DXu_4mhJDnj+}QQ(zjPEJcAuG=%Sm3pT#u;A$J260X!36`ePCs=e2g3_=unwQ)Q4Kb%P3WS$2T{ADH77x06= Z!k#nZ(snP>&VW}p#K9hG$FT8>`#a>+vu^+Z literal 0 HcmV?d00001 diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/rules/OneEdge.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/rules/OneEdge.png new file mode 100644 index 0000000000000000000000000000000000000000..64fb4fc865c281f533be041dc6aad136e9e208ac GIT binary patch literal 2413 zcmb_d2~bm67EM?>h^T-dw&I4OECCu&qmhK&h(bsMvTImOr)_Z{fe*@m#h2bZt~B9I4g)4>@8ktqN% zhXM+;JecD^IszX|qq8}@agk_2rWdrNJA*_ma?3(Xu$GKQ;Q|0fhMei+pmv<@3}PZ% z1dzdKl0G~<4AwT0LGJwgd_sIY00>f3Q#llb%!4lAm3Sa1oNf3OXF$ZESR#mQHW2}c zxak-zj}qPjuLKWTLJ;H@k$_1AWsq%n*)+{k%aXzoeQTG(0f3JmKW1iT78DeKl%Iq0 zWx*}X1?vj7_5Xe#t_$b-!1}8~j(CNF0Vx~M*;AQEArM%BgPpb8g_F}oXR-$EG?Fld z>T0DAbG!+q@iaN3Yu?J9#{4z|O+_jI1Wt7y%BmPB>UE%x5Bqb)r2~`ZBJ{9-_;}_< z1d89jzcUdcQMq?1=&4G#7ISDUSKw5|T>P7#Z}g_dSW<*lDZK0&x?>bM)<_0!*cKSq z;EZdVmo$8iRR^6cbNv|pIeO=s;_;zW(&!bBq|xG5I@77D1Pg?~!UL5@<<4VLycq9P zOk}FKOCOu`BNthsst`gJLgP&<+Q6a|nnZR4uI04*2m&r(w6I%lL`grh1b!Dd=*R+O zWK*r_*r?r5PTw>OA+I7DD&%fVjBuh=3fm0Ft)IzX5E@(^j~;s+B=s7q=#bz zG+|=81|K>wtF(sWwgP=N^fsGsxn@M<=db-W*IeWXd*9_B>2+YKH_WQ>`eh>0uQ4)P zi0jz=*7W#*%Un#o&etK->u2PlENaG+;v-WJNb8I24Vy{pw|JnfgB@)mMQG%P2U31i z7~FL-L#h?3h@!X!4NM$V7?}T`sY_k5MzC zq>0h!uB3Isr@IW&a3s42S82Btglb;ydWNy>eLs7+lM<*qse~x6DIDqX9CgktXS;(x-2{O&!@H47{d99ba0b_XG2khf%|A9ZNYkS& zGl`kA$#BE$g@>tUla6<1Ab0z!=jmie6%wjtosbjig6p-}(jxM+OQLd-5<&3OWEVO$ z+K(Zv1}=$LN#LbZui;B({X^m&%}dQ@_;U7p-0Qs;*Jeml7Pmgq4JbU!-Jvd+nN9-h zsC2VoP3m(`EUdWdUCqzT;DxXWPwcLdXA-rGX*kK*TrJ~lzxf5bll(XK_{$osV z&thMWSoV}mDB8Sado|WMm9qmG(rsdsi`!*Q;_sdQEa}k%#sP&qtszY+`ScWWjEa$U z?U-|1yL4owt^+AoLa;w=D_s2T+y34>VAC1prrlTV`?VqYY!bDOy3-9LD`_qWQ|cQ` z43BPB<}$+xniv^T&0wZ{B-x#?+^~{>M^X~1*W2G*qjy%%qUF_!O)|pUqB(c)9E3FD z?a~c>Tr9j>k!zbm;bnTS)!lmX*e?gO?_V~$MPzwOPMbF74%T_XQ_>i^ceQQ)NtSZP z!3d^G{}DXlrP;?`-n72;!pqe#c^%ceepU))8&r}*Sl4o&(?NKscNA72fE6W z$=J<-^1c-=)Z<~k%b)AH__M~o(h>R{Q~d53A@bm;PS)gGe$d;k?{q+4okSF05WWz} zHwRys5Aai?*J<6#4$#zReD!0Hfs9YZ`L4Y`m@j99mJ2!#V+|@j?cCo{2HP>&GWff>n0hi0<<9ZvP!xGYiifewZ(zqI{dYKh_Fvj!l`!HRF}O~r5DXu_4mhJDnj+}QQ(zjPEJcAuG=%Sm3pT#u;A$J260X!36`ePCs=e2g3_=unwQ)Q4Kb%P3WS$2T{ADH77x06= Z!k#nZ(snP>&VW}p#K9hG$FT8>`#a>+vu^+Z literal 0 HcmV?d00001 From a9fd410dde49bf2378da6ad795396e626e2b0099 Mon Sep 17 00:00:00 2001 From: popem Date: Thu, 23 Jun 2022 23:05:43 -0400 Subject: [PATCH 02/45] Fixed battleship typos/jetbrains (pulled when broken) --- .../puzzle/battleship/BattleshipBoard.java | 33 +++++++++---------- .../rules/AdjacentShipsContradictionRule.java | 14 ++++---- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/battleship/BattleshipBoard.java b/src/main/java/edu/rpi/legup/puzzle/battleship/BattleshipBoard.java index 637cbd926..abe63e22b 100644 --- a/src/main/java/edu/rpi/legup/puzzle/battleship/BattleshipBoard.java +++ b/src/main/java/edu/rpi/legup/puzzle/battleship/BattleshipBoard.java @@ -2,7 +2,6 @@ import edu.rpi.legup.model.gameboard.GridBoard; import edu.rpi.legup.model.gameboard.PuzzleElement; -import org.jetbrains.annotations.NotNull; import java.awt.*; import java.util.ArrayList; @@ -89,13 +88,13 @@ public BattleshipBoard copy() { * @return List of adjacent cells in clockwise order: * { up, right, down, left } */ - public List getAdjacent(@NotNull BattleShipCell cell) { - List adj = new ArrayList<>(); + public List getAdjacent(BattleshipCell cell) { + List adj = new ArrayList<>(); Point loc = cell.getLocation(); - BattleShipCell up = getCell(loc.x, loc.y - 1); - BattleShipCell right = getCell(loc.x + 1, loc.y); - BattleShipCell down = getCell(loc.x, loc.y + 1); - BattleShipCell left = getCell(loc.x - 1, loc.y); + BattleshipCell up = getCell(loc.x, loc.y - 1); + BattleshipCell right = getCell(loc.x + 1, loc.y); + BattleshipCell down = getCell(loc.x, loc.y + 1); + BattleshipCell left = getCell(loc.x - 1, loc.y); adj.add(up); adj.add(right); adj.add(down); @@ -110,13 +109,13 @@ public List getAdjacent(@NotNull BattleShipCell cell) { * @return List of diagonally adjacent cells in clockwise order: * { upRight, downRight, downLeft, upLeft } */ - public List getAdjDiagonals(@NotNull BattleShipCell cell) { - List dia = new ArrayList<>(); + public List getAdjDiagonals(BattleshipCell cell) { + List dia = new ArrayList<>(); Point loc = cell.getLocation(); - BattleShipCell upRight = getCell(loc.x + 1, loc.y - 1); - BattleShipCell downRight = getCell(loc.x + 1, loc.y + 1); - BattleShipCell downLeft = getCell(loc.x - 1, loc.y + 1); - BattleShipCell upLeft = getCell(loc.x - 1, loc.y - 1); + BattleshipCell upRight = getCell(loc.x + 1, loc.y - 1); + BattleshipCell downRight = getCell(loc.x + 1, loc.y + 1); + BattleshipCell downLeft = getCell(loc.x - 1, loc.y + 1); + BattleshipCell upLeft = getCell(loc.x - 1, loc.y - 1); dia.add(upRight); dia.add(downRight); dia.add(downLeft); @@ -130,8 +129,8 @@ public List getAdjDiagonals(@NotNull BattleShipCell cell) { * @param y The y-coordinate of the row. * @return List of cells in the row in increasing x-coordinate order. */ - public List getRow(int y) { - List row = new ArrayList<>(); + public List getRow(int y) { + List row = new ArrayList<>(); for (int x = 0; x < dimension.width; x++) { row.add(getCell(x, y)); } @@ -144,8 +143,8 @@ public List getRow(int y) { * @param x The x-coordinate of the column. * @return List of cells in the column in increasing y-coordinate order. */ - public List getColumn(int x) { - List column = new ArrayList<>(); + public List getColumn(int x) { + List column = new ArrayList<>(); for (int y = 0; y < dimension.height; y++) { column.add(getCell(x, y)); } diff --git a/src/main/java/edu/rpi/legup/puzzle/battleship/rules/AdjacentShipsContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/battleship/rules/AdjacentShipsContradictionRule.java index 4f3fd700e..92d7df933 100644 --- a/src/main/java/edu/rpi/legup/puzzle/battleship/rules/AdjacentShipsContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/battleship/rules/AdjacentShipsContradictionRule.java @@ -3,9 +3,9 @@ import edu.rpi.legup.model.gameboard.Board; import edu.rpi.legup.model.gameboard.PuzzleElement; import edu.rpi.legup.model.rules.ContradictionRule; -import edu.rpi.legup.puzzle.battleship.BattleShipBoard; -import edu.rpi.legup.puzzle.battleship.BattleShipCell; -import edu.rpi.legup.puzzle.battleship.BattleShipType; +import edu.rpi.legup.puzzle.battleship.BattleshipBoard; +import edu.rpi.legup.puzzle.battleship.BattleshipCell; +import edu.rpi.legup.puzzle.battleship.BattleshipType; import java.util.List; @@ -34,14 +34,14 @@ public AdjacentShipsContradictionRule() { */ @Override public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { - BattleShipBoard bsBoard = (BattleShipBoard) board; - BattleShipCell cell = (BattleShipCell) bsBoard.getPuzzleElement(puzzleElement); + BattleshipBoard bsBoard = (BattleshipBoard) board; + BattleshipCell cell = (BattleshipCell) bsBoard.getPuzzleElement(puzzleElement); // check orthogonally adjacent cells - List orthoAdjCells + List orthoAdjCells = bsBoard.getAdjacent(cell); - BattleShipCell up = orthoAdjCells.get(0); + BattleshipCell up = orthoAdjCells.get(0); return null; } From df5eba6a14abaff9fa2850aa7f4b4c79ae712c7f Mon Sep 17 00:00:00 2001 From: popem Date: Wed, 13 Jul 2022 17:37:22 -0400 Subject: [PATCH 03/45] small edits to exceeding visibility contradiction rule --- .../ExceedingVisibilityContradictionRule.java | 90 ++++++++++--------- 1 file changed, 46 insertions(+), 44 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java index 8d23e07b7..af9a035df 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java @@ -29,17 +29,19 @@ public ExceedingVisibilityContradictionRule() { */ @Override public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { + //why is this called for every cell? SkyscrapersCell cell = (SkyscrapersCell) puzzleElement; SkyscrapersBoard skyscrapersboard = (SkyscrapersBoard) board; Point loc = cell.getLocation(); - Set candidates = new HashSet(); - - //check row + //get borders int west = skyscrapersboard.getRow().get(loc.y).getData(); int east = skyscrapersboard.getRowClues().get(loc.y).getData(); int north = skyscrapersboard.getCol().get(loc.x).getData(); int south = skyscrapersboard.getColClues().get(loc.x).getData(); + + //check row + //from west border int max = 0; int count = 0; boolean complete = true; @@ -53,32 +55,33 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { } if (c.getType() == SkyscrapersType.UNKNOWN) { complete = false; + break; } } - if (count > west && complete == true) { - return null; - } - - max = 0; - count = 0; - complete = true; - for (int i = skyscrapersboard.getWidth() - 1; i >= 0; i--) { - SkyscrapersCell c = skyscrapersboard.getCell(i, loc.y); - if (c.getType() == SkyscrapersType.Number && c.getData() > max) { - //System.out.print(c.getData()); - //System.out.println(cell.getData()); - max = c.getData(); - count = count + 1; - } - if (c.getType() == SkyscrapersType.UNKNOWN) { - complete = false; - } - } - if (count > east && complete == true) { + if (count > west && complete) { return null; } + + if(complete) { + //from east border + max = 0; + count = 0; + for (int i = skyscrapersboard.getWidth() - 1; i >= 0; i--) { + SkyscrapersCell c = skyscrapersboard.getCell(i, loc.y); + if (c.getType() == SkyscrapersType.Number && c.getData() > max) { + //System.out.print(c.getData()); + //System.out.println(cell.getData()); + max = c.getData(); + count = count + 1; + } + } + if (count > east) { + return null; + } + } - // check column + //check column + //from north border max = 0; count = 0; complete = true; @@ -94,28 +97,27 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { complete = false; } } - if (count > north && complete == true) { - return null; - } - - max = 0; - count = 0; - complete = true; - for (int i = skyscrapersboard.getHeight() - 1; i >= 0; i--) { - SkyscrapersCell c = skyscrapersboard.getCell(loc.x, i); - if (c.getType() == SkyscrapersType.Number && c.getData() > max) { - //System.out.print(c.getData()); - //System.out.println(cell.getData()); - max = c.getData(); - count = count + 1; - } - if (c.getType() == SkyscrapersType.UNKNOWN) { - complete = false; - } - } - if (count > south && complete == true) { + if (count > north && complete) { return null; } + + if(complete) { + //from south border + max = 0; + count = 0; + for (int i = skyscrapersboard.getHeight() - 1; i >= 0; i--) { + SkyscrapersCell c = skyscrapersboard.getCell(loc.x, i); + if (c.getType() == SkyscrapersType.Number && c.getData() > max) { + //System.out.print(c.getData()); + //System.out.println(cell.getData()); + max = c.getData(); + count = count + 1; + } + } + if (count > south) { + return null; + } + } //System.out.print("Does not contain a contradiction at this index"); return super.getNoContradictionMessage(); From 12d14dcd006decd238d816623412a57d2ad62d85 Mon Sep 17 00:00:00 2001 From: popem Date: Wed, 13 Jul 2022 21:10:16 -0400 Subject: [PATCH 04/45] small edits to exceeding/less visibility contradiction rule --- .../ExceedingVisibilityContradictionRule.java | 7 +- ...sufficientVisibilityContradictionRule.java | 95 ++++++++++--------- 2 files changed, 54 insertions(+), 48 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java index af9a035df..9b59530f2 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java @@ -72,7 +72,7 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { //System.out.print(c.getData()); //System.out.println(cell.getData()); max = c.getData(); - count = count + 1; + count++; } } if (count > east) { @@ -91,10 +91,11 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { //System.out.print(c.getData()); //System.out.println(cell.getData()); max = c.getData(); - count = count + 1; + count++; } if (c.getType() == SkyscrapersType.UNKNOWN) { complete = false; + break; } } if (count > north && complete) { @@ -111,7 +112,7 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { //System.out.print(c.getData()); //System.out.println(cell.getData()); max = c.getData(); - count = count + 1; + count++; } } if (count > south) { diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java index 45418916f..84a270f97 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java @@ -29,17 +29,20 @@ public InsufficientVisibilityContradictionRule() { */ @Override public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { + //why is this run for every cell? SkyscrapersCell cell = (SkyscrapersCell) puzzleElement; SkyscrapersBoard skyscrapersboard = (SkyscrapersBoard) board; Point loc = cell.getLocation(); + - Set candidates = new HashSet(); - - //check row + //get borders int west = skyscrapersboard.getRow().get(loc.y).getData(); int east = skyscrapersboard.getRowClues().get(loc.y).getData(); int north = skyscrapersboard.getCol().get(loc.x).getData(); int south = skyscrapersboard.getColClues().get(loc.x).getData(); + + //check row + //from west border int max = 0; int count = 0; boolean complete = true; @@ -53,32 +56,34 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { } if (c.getType() == SkyscrapersType.UNKNOWN) { complete = false; + break; } } - if (count < west && complete == true) { - return null; - } - - max = 0; - count = 0; - complete = true; - for (int i = skyscrapersboard.getWidth() - 1; i >= 0; i--) { - SkyscrapersCell c = skyscrapersboard.getCell(i, loc.y); - if (c.getType() == SkyscrapersType.Number && c.getData() > max) { - //System.out.print(c.getData()); - //System.out.println(cell.getData()); - max = c.getData(); - count = count + 1; - } - if (c.getType() == SkyscrapersType.UNKNOWN) { - complete = false; - } - } - if (count < east && complete == true) { + if (count < west && complete) { return null; } + + if(complete){ + //from east border + max = 0; + count = 0; + for (int i = skyscrapersboard.getWidth() - 1; i >= 0; i--) { + SkyscrapersCell c = skyscrapersboard.getCell(i, loc.y); + if (c.getType() == SkyscrapersType.Number && c.getData() > max) { + //System.out.print(c.getData()); + //System.out.println(cell.getData()); + max = c.getData(); + count++; + } + } + if (count < east) { + return null; + } + } + - // check column + //check column + //from north border max = 0; count = 0; complete = true; @@ -88,34 +93,34 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { //System.out.print(c.getData()); //System.out.println(cell.getData()); max = c.getData(); - count = count + 1; - } - if (c.getType() == SkyscrapersType.UNKNOWN) { - complete = false; - } - } - if (count < north && complete == true) { - return null; - } - - max = 0; - count = 0; - complete = true; - for (int i = skyscrapersboard.getHeight() - 1; i >= 0; i--) { - SkyscrapersCell c = skyscrapersboard.getCell(loc.x, i); - if (c.getType() == SkyscrapersType.Number && c.getData() > max) { - //System.out.print(c.getData()); - //System.out.println(cell.getData()); - max = c.getData(); - count = count + 1; + count++; } if (c.getType() == SkyscrapersType.UNKNOWN) { complete = false; + break; } } - if (count < south && complete == true) { + if (count < north && complete) { return null; } + + if(complete){ + //from south border + max = 0; + count = 0; + for (int i = skyscrapersboard.getHeight() - 1; i >= 0; i--) { + SkyscrapersCell c = skyscrapersboard.getCell(loc.x, i); + if (c.getType() == SkyscrapersType.Number && c.getData() > max) { + //System.out.print(c.getData()); + //System.out.println(cell.getData()); + max = c.getData(); + count++; + } + } + if (count < south) { + return null; + } + } //System.out.print("Does not contain a contradiction at this index"); return super.getNoContradictionMessage(); From 79cf5e76046cc06a57ceac1e019bdb281ecd43cc Mon Sep 17 00:00:00 2001 From: popem Date: Wed, 13 Jul 2022 22:46:55 -0400 Subject: [PATCH 05/45] exceeding/less visibility contradiction rule now utilize getRowCol, a previously unused board function --- .../ExceedingVisibilityContradictionRule.java | 92 ++++++++--------- ...sufficientVisibilityContradictionRule.java | 99 +++++++++---------- 2 files changed, 89 insertions(+), 102 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java index 9b59530f2..2b7ffd3f3 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java @@ -8,7 +8,9 @@ import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersType; import java.awt.*; +import java.util.Collections; import java.util.HashSet; +import java.util.List; import java.util.Set; public class ExceedingVisibilityContradictionRule extends ContradictionRule { @@ -41,35 +43,30 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { int south = skyscrapersboard.getColClues().get(loc.x).getData(); //check row - //from west border int max = 0; int count = 0; - boolean complete = true; - for (int i = 0; i < skyscrapersboard.getWidth(); i++) { - SkyscrapersCell c = skyscrapersboard.getCell(i, loc.y); - if (c.getType() == SkyscrapersType.Number && c.getData() > max) { - //System.out.print(c.getData()); - //System.out.println(cell.getData()); - max = c.getData(); - count++; - } - if (c.getType() == SkyscrapersType.UNKNOWN) { - complete = false; - break; - } - } - if (count > west && complete) { - return null; - } + List row = skyscrapersboard.getRowCol(loc.y,SkyscrapersType.Number,true); + if(row.size()==skyscrapersboard.getWidth()){ + //from west border + for(SkyscrapersCell c : row){ + if (c.getData() > max) { + System.out.print(c.getData()); + //System.out.println(cell.getData()); + max = c.getData(); + count++; + } + } + if (count > west) { + return null; + } - if(complete) { - //from east border max = 0; count = 0; - for (int i = skyscrapersboard.getWidth() - 1; i >= 0; i--) { - SkyscrapersCell c = skyscrapersboard.getCell(i, loc.y); - if (c.getType() == SkyscrapersType.Number && c.getData() > max) { - //System.out.print(c.getData()); + //from east border + Collections.reverse(row); + for(SkyscrapersCell c : row){ + if (c.getData() > max) { + System.out.print(c.getData()); //System.out.println(cell.getData()); max = c.getData(); count++; @@ -81,35 +78,32 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { } //check column - //from north border - max = 0; - count = 0; - complete = true; - for (int i = 0; i < skyscrapersboard.getHeight(); i++) { - SkyscrapersCell c = skyscrapersboard.getCell(loc.x, i); - if (c.getType() == SkyscrapersType.Number && c.getData() > max) { - //System.out.print(c.getData()); - //System.out.println(cell.getData()); - max = c.getData(); - count++; - } - if (c.getType() == SkyscrapersType.UNKNOWN) { - complete = false; - break; - } - } - if (count > north && complete) { - return null; - } + List col = skyscrapersboard.getRowCol(loc.x,SkyscrapersType.Number,false); + if(col.size()==skyscrapersboard.getHeight()){ + //from north border + max = 0; + count = 0; + for(SkyscrapersCell c : col){ + System.out.println(c.getData()); + if (c.getData() > max) { + + //System.out.println(cell.getData()); + max = c.getData(); + count++; + } + } + if (count > north) { + return null; + } - if(complete) { //from south border max = 0; count = 0; - for (int i = skyscrapersboard.getHeight() - 1; i >= 0; i--) { - SkyscrapersCell c = skyscrapersboard.getCell(loc.x, i); - if (c.getType() == SkyscrapersType.Number && c.getData() > max) { - //System.out.print(c.getData()); + Collections.reverse(col); + for(SkyscrapersCell c : col){ + System.out.println(c.getData()); + if (c.getData() > max) { + //System.out.println(cell.getData()); max = c.getData(); count++; diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java index 84a270f97..90fd471d2 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java @@ -8,7 +8,9 @@ import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersType; import java.awt.*; +import java.util.Collections; import java.util.HashSet; +import java.util.List; import java.util.Set; public class InsufficientVisibilityContradictionRule extends ContradictionRule { @@ -42,35 +44,30 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { int south = skyscrapersboard.getColClues().get(loc.x).getData(); //check row - //from west border - int max = 0; - int count = 0; - boolean complete = true; - for (int i = 0; i < skyscrapersboard.getWidth(); i++) { - SkyscrapersCell c = skyscrapersboard.getCell(i, loc.y); - if (c.getType() == SkyscrapersType.Number && c.getData() > max) { - //System.out.print(c.getData()); - //System.out.println(cell.getData()); - max = c.getData(); - count++; - } - if (c.getType() == SkyscrapersType.UNKNOWN) { - complete = false; - break; - } - } - if (count < west && complete) { - return null; - } + int max = 0; + int count = 0; + java.util.List row = skyscrapersboard.getRowCol(loc.y,SkyscrapersType.Number,true); + if(row.size()==skyscrapersboard.getWidth()){ + //from west border + for(SkyscrapersCell c : row){ + if (c.getData() > max) { + System.out.print(c.getData()); + //System.out.println(cell.getData()); + max = c.getData(); + count++; + } + } + if (count < west) { + return null; + } - if(complete){ - //from east border max = 0; count = 0; - for (int i = skyscrapersboard.getWidth() - 1; i >= 0; i--) { - SkyscrapersCell c = skyscrapersboard.getCell(i, loc.y); - if (c.getType() == SkyscrapersType.Number && c.getData() > max) { - //System.out.print(c.getData()); + //from east border + Collections.reverse(row); + for(SkyscrapersCell c : row){ + if (c.getData() > max) { + System.out.print(c.getData()); //System.out.println(cell.getData()); max = c.getData(); count++; @@ -81,37 +78,33 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { } } - - //check column - //from north border - max = 0; - count = 0; - complete = true; - for (int i = 0; i < skyscrapersboard.getHeight(); i++) { - SkyscrapersCell c = skyscrapersboard.getCell(loc.x, i); - if (c.getType() == SkyscrapersType.Number && c.getData() > max) { - //System.out.print(c.getData()); - //System.out.println(cell.getData()); - max = c.getData(); - count++; - } - if (c.getType() == SkyscrapersType.UNKNOWN) { - complete = false; - break; - } - } - if (count < north && complete) { - return null; - } + //check column + List col = skyscrapersboard.getRowCol(loc.x,SkyscrapersType.Number,false); + if(col.size()==skyscrapersboard.getHeight()){ + //from north border + max = 0; + count = 0; + for(SkyscrapersCell c : col){ + System.out.println(c.getData()); + if (c.getData() > max) { + + //System.out.println(cell.getData()); + max = c.getData(); + count++; + } + } + if (count < north) { + return null; + } - if(complete){ //from south border max = 0; count = 0; - for (int i = skyscrapersboard.getHeight() - 1; i >= 0; i--) { - SkyscrapersCell c = skyscrapersboard.getCell(loc.x, i); - if (c.getType() == SkyscrapersType.Number && c.getData() > max) { - //System.out.print(c.getData()); + Collections.reverse(col); + for(SkyscrapersCell c : col){ + System.out.println(c.getData()); + if (c.getData() > max) { + //System.out.println(cell.getData()); max = c.getData(); count++; From 5277de2bc7bdc245ac7fe995174e89f8e09ae5fc Mon Sep 17 00:00:00 2001 From: popem Date: Wed, 13 Jul 2022 23:46:30 -0400 Subject: [PATCH 06/45] added CellForNumber, no implementation --- .../rules/CellForNumberCaseRule.java | 42 ++++++++++++++++++ .../skyscrapers/cases/CellForNumber.png | Bin 0 -> 67322 bytes 2 files changed, 42 insertions(+) create mode 100644 src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java create mode 100644 src/main/resources/edu/rpi/legup/images/skyscrapers/cases/CellForNumber.png diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java new file mode 100644 index 000000000..c4417701d --- /dev/null +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java @@ -0,0 +1,42 @@ +package edu.rpi.legup.puzzle.skyscrapers.rules; + +import edu.rpi.legup.model.gameboard.Board; +import edu.rpi.legup.model.gameboard.CaseBoard; +import edu.rpi.legup.model.gameboard.PuzzleElement; +import edu.rpi.legup.model.rules.CaseRule; +import edu.rpi.legup.model.tree.TreeTransition; +import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersBoard; +import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersCell; +import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersLine; +import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersType; + +import java.util.List; + +public class CellForNumberCaseRule extends CaseRule { + //select a certain row/col? select a certain number? + public CellForNumberCaseRule() { + super("SKYS-CASE-0002", "Cell For Number", + "Each blank cell is could have height of 1 to n.", + "edu/rpi/legup/images/skyscrapers/cases/CellForNumber.png"); + } + + @Override + public CaseBoard getCaseBoard(Board board) { + return null; + } + + @Override + public List getCases(Board board, PuzzleElement puzzleElement) { + return null; + } + + @Override + public String checkRuleRaw(TreeTransition transition) { + return null; + } + + @Override + public String checkRuleRawAt(TreeTransition transition, PuzzleElement puzzleElement) { + return null; + } +} diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/cases/CellForNumber.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/cases/CellForNumber.png new file mode 100644 index 0000000000000000000000000000000000000000..7eaee5d06bb81e453b84ba30a3a29b969203935e GIT binary patch literal 67322 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
  • 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 E4_Nys#sB~S literal 0 HcmV?d00001 From 2fbce01b2717525d87da973b8c323f92372d0022 Mon Sep 17 00:00:00 2001 From: popem Date: Thu, 4 Aug 2022 11:39:40 -0400 Subject: [PATCH 07/45] filled CaseBoard for cell4number, commented other places --- .../puzzle/skyscrapers/SkyscrapersBoard.java | 8 ++++++++ .../rules/CellForNumberCaseRule.java | 18 +++++++++++++----- .../ExceedingVisibilityContradictionRule.java | 2 +- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java index b4de925e3..97b5455b7 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java @@ -163,6 +163,14 @@ public List getDiagonals(SkyscrapersCell cell, SkyscrapersType return dia; } + /** + * Gets the cells of a certain type in a given row/column + * + * @param index: y pos of row or x pos of col, + * type of cell to collect, + * boolean true if row, false if col + * @return list of cells of the given type, ordered west to east or north to south + */ public List getRowCol(int index, SkyscrapersType type, boolean isRow) { List list = new ArrayList<>(); if (isRow) { diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java index c4417701d..9059ca4aa 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java @@ -5,10 +5,7 @@ import edu.rpi.legup.model.gameboard.PuzzleElement; import edu.rpi.legup.model.rules.CaseRule; import edu.rpi.legup.model.tree.TreeTransition; -import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersBoard; -import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersCell; -import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersLine; -import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersType; +import edu.rpi.legup.puzzle.skyscrapers.*; import java.util.List; @@ -22,7 +19,18 @@ public CellForNumberCaseRule() { @Override public CaseBoard getCaseBoard(Board board) { - return null; + SkyscrapersBoard currentBoard = (SkyscrapersBoard) board.copy(); + currentBoard.setModifiable(false); + CaseBoard caseBoard = new CaseBoard(currentBoard, this); + for (SkyscrapersClue data : currentBoard.getRow()) { + System.out.println(data.getType()); + caseBoard.addPickableElement(data); + } + for (SkyscrapersClue data : currentBoard.getCol()) { + System.out.println(data.getType()); + caseBoard.addPickableElement(data); + } + return caseBoard; } @Override diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java index 2b7ffd3f3..662e8d590 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java @@ -31,7 +31,7 @@ public ExceedingVisibilityContradictionRule() { */ @Override public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { - //why is this called for every cell? + //why is this called for every cell? maybe:override checkcontradiction SkyscrapersCell cell = (SkyscrapersCell) puzzleElement; SkyscrapersBoard skyscrapersboard = (SkyscrapersBoard) board; Point loc = cell.getLocation(); From 5c14e85ac5e0505df9ce29902b1cfecd8dfe661c Mon Sep 17 00:00:00 2001 From: popem Date: Thu, 4 Aug 2022 14:54:10 -0400 Subject: [PATCH 08/45] basic edits, began unresolvedNumber --- .../rules/CellForNumberCaseRule.java | 2 +- .../skyscrapers/rules/FixedMaxBasicRule.java | 19 +++---- ...sufficientVisibilityContradictionRule.java | 2 +- .../rules/LastNumberBasicRule.java | 30 +++++------ .../skyscrapers/rules/OneEdgeBasicRule.java | 7 ++- .../rules/PossibleContentsCaseRule.java | 2 +- .../UnresolvedNumberContradictionRule.java | 48 ++++++++++++++++++ .../contradictions/UnresolvedNumber.png | Bin 0 -> 2413 bytes 8 files changed, 79 insertions(+), 31 deletions(-) create mode 100644 src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedNumberContradictionRule.java create mode 100644 src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/UnresolvedNumber.png diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java index 9059ca4aa..30aec7ffb 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java @@ -13,7 +13,7 @@ public class CellForNumberCaseRule extends CaseRule { //select a certain row/col? select a certain number? public CellForNumberCaseRule() { super("SKYS-CASE-0002", "Cell For Number", - "Each blank cell is could have height of 1 to n.", + "A number (1-n) must appear in any given row/column", "edu/rpi/legup/images/skyscrapers/cases/CellForNumber.png"); } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java index ac04d9816..1dbccdce1 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java @@ -37,8 +37,8 @@ public String checkRuleRawAt(TreeTransition transition, PuzzleElement puzzleElem SkyscrapersCell initCell = (SkyscrapersCell) initialBoard.getPuzzleElement(puzzleElement); SkyscrapersBoard finalBoard = (SkyscrapersBoard) transition.getBoard(); SkyscrapersCell finalCell = (SkyscrapersCell) finalBoard.getPuzzleElement(puzzleElement); - if (!(initCell.getType() == SkyscrapersType.UNKNOWN && finalCell.getType() == SkyscrapersType.Number)) { - return super.getInvalidUseOfRuleMessage() + ": Modified cells must be number"; + if (initCell.getType() != SkyscrapersType.UNKNOWN || finalCell.getType() != SkyscrapersType.Number) { + return super.getInvalidUseOfRuleMessage() + ": Modified cells must transition from unknown to number"; } SkyscrapersBoard emptyCase = initialBoard.copy(); @@ -91,20 +91,21 @@ private boolean isForced(SkyscrapersBoard board, SkyscrapersCell cell) { @Override public Board getDefaultBoard(TreeNode node) { SkyscrapersBoard initialBoard = (SkyscrapersBoard) node.getBoard(); - SkyscrapersBoard lightUpBoard = (SkyscrapersBoard) node.getBoard().copy(); - System.out.println(lightUpBoard.getPuzzleElements().size()); - for (PuzzleElement element : lightUpBoard.getPuzzleElements()) { - System.out.println("123"); + SkyscrapersBoard modBoard = (SkyscrapersBoard) node.getBoard().copy(); + System.out.println(modBoard.getPuzzleElements().size()); + for (PuzzleElement element : modBoard.getPuzzleElements()) { + System.out.println("123"); SkyscrapersCell cell = (SkyscrapersCell) element; if (cell.getType() == SkyscrapersType.UNKNOWN && isForced(initialBoard, cell)) { //cell.setData(SkyscrapersType.BULB.value); - lightUpBoard.addModifiedData(cell); + modBoard.addModifiedData(cell); } } - if (lightUpBoard.getModifiedData().isEmpty()) { + System.out.println(modBoard.getModifiedData().isEmpty()); + if (modBoard.getModifiedData().isEmpty()) { return null; } else { - return lightUpBoard; + return modBoard; } } } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java index 90fd471d2..73cd120bb 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java @@ -31,7 +31,7 @@ public InsufficientVisibilityContradictionRule() { */ @Override public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { - //why is this run for every cell? + //why is this run for every cell? maybe:override checkcontradiction to every row/col SkyscrapersCell cell = (SkyscrapersCell) puzzleElement; SkyscrapersBoard skyscrapersboard = (SkyscrapersBoard) board; Point loc = cell.getLocation(); diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java index 231287ff6..ffed421e4 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java @@ -18,7 +18,7 @@ public class LastNumberBasicRule extends BasicRule { public LastNumberBasicRule() { super("SKYS-BASC-0003", "Last Number", - "A certain cell must contain a certain number since that number is the only one that can possibly appear in that cell.", + "A certain cell must contain a certain number since that number is the only one that does not create a duplicate contradiction.", "edu/rpi/legup/images/skyscrapers/rules/LastNumber.png"); } @@ -37,39 +37,39 @@ public String checkRuleRawAt(TreeTransition transition, PuzzleElement puzzleElem SkyscrapersCell initCell = (SkyscrapersCell) initialBoard.getPuzzleElement(puzzleElement); SkyscrapersBoard finalBoard = (SkyscrapersBoard) transition.getBoard(); SkyscrapersCell finalCell = (SkyscrapersCell) finalBoard.getPuzzleElement(puzzleElement); - if (!(initCell.getType() == SkyscrapersType.UNKNOWN && finalCell.getType() == SkyscrapersType.Number)) { - return super.getInvalidUseOfRuleMessage() + ": Modified cells must be number"; + if (initCell.getType() != SkyscrapersType.UNKNOWN || finalCell.getType() != SkyscrapersType.Number) { + return super.getInvalidUseOfRuleMessage() + ": Modified cells must transition from unknown to number"; } SkyscrapersBoard emptyCase = initialBoard.copy(); emptyCase.getPuzzleElement(finalCell).setData(0); Point loc = finalCell.getLocation(); - + + //init with all possible numbers Set candidates = new HashSet(); for (int i = 1; i <= initialBoard.getWidth(); i++) { candidates.add(i); } - //check row + //remove any existing numbers for (int i = 0; i < initialBoard.getWidth(); i++) { + //check row SkyscrapersCell c = initialBoard.getCell(i, loc.y); if (i != loc.x && c.getType() == SkyscrapersType.Number) { candidates.remove(c.getData()); //System.out.print(c.getData()); //System.out.println(finalCell.getData()); } - } - - // check column - for (int i = 0; i < initialBoard.getHeight(); i++) { - SkyscrapersCell c = initialBoard.getCell(loc.x, i); - if (i != loc.y && c.getType() == SkyscrapersType.Number) { - candidates.remove(c.getData()); - //System.out.print(c.getData()); - //System.out.println(finalCell.getData()); + // check column + c = initialBoard.getCell(loc.x, i); + if (i != loc.y && c.getType() == SkyscrapersType.Number) { + candidates.remove(c.getData()); + //System.out.print(c.getData()); + //System.out.println(finalCell.getData()); } } - + + //check if given value is the only remaining value DuplicateNumberContradictionRule duplicate = new DuplicateNumberContradictionRule(); if (candidates.size() == 1 && duplicate.checkContradictionAt(emptyCase, finalCell) != null) { Iterator it = candidates.iterator(); diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java index f5a8d5841..f78516913 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java @@ -37,8 +37,8 @@ public String checkRuleRawAt(TreeTransition transition, PuzzleElement puzzleElem SkyscrapersCell initCell = (SkyscrapersCell) initialBoard.getPuzzleElement(puzzleElement); SkyscrapersBoard finalBoard = (SkyscrapersBoard) transition.getBoard(); SkyscrapersCell finalCell = (SkyscrapersCell) finalBoard.getPuzzleElement(puzzleElement); - if (!(initCell.getType() == SkyscrapersType.UNKNOWN && finalCell.getType() == SkyscrapersType.Number)) { - return super.getInvalidUseOfRuleMessage() + ": Modified cells must be number"; + if (initCell.getType() != SkyscrapersType.UNKNOWN || finalCell.getType() != SkyscrapersType.Number) { + return super.getInvalidUseOfRuleMessage() + ": Modified cells must transition from unknown to number"; } SkyscrapersBoard emptyCase = initialBoard.copy(); @@ -65,9 +65,8 @@ else if (loc.y == 0 && initialBoard.getCol().get(loc.x).getData() == 1) { else if (loc.y == initialBoard.getHeight() - 1 && initialBoard.getColClues().get(loc.x).getData() == 1) { return null; } else { - return "This cell is not forced."; + return "This cell is not forced."; } - } private boolean isForced(SkyscrapersBoard board, SkyscrapersCell cell) { diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PossibleContentsCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PossibleContentsCaseRule.java index 41f07a906..d1f340429 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PossibleContentsCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PossibleContentsCaseRule.java @@ -18,7 +18,7 @@ public class PossibleContentsCaseRule extends CaseRule { public PossibleContentsCaseRule() { super("SKYS-CASE-0001", "Possible Contents", - "Each blank cell is could have height of 1 to n.", + "A blank cell must have height of 1 to n.", "edu/rpi/legup/images/skyscrapers/cases/PossibleContents.png"); } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedNumberContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedNumberContradictionRule.java new file mode 100644 index 000000000..e99e5c16e --- /dev/null +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedNumberContradictionRule.java @@ -0,0 +1,48 @@ +package edu.rpi.legup.puzzle.skyscrapers.rules; + + +import edu.rpi.legup.model.gameboard.Board; +import edu.rpi.legup.model.gameboard.PuzzleElement; +import edu.rpi.legup.model.rules.ContradictionRule; +import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersBoard; +import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersCell; +import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersType; + +import java.awt.*; +import java.util.HashSet; +import java.util.Set; + +public class UnresolvedNumberContradictionRule extends ContradictionRule { + + public UnresolvedNumberContradictionRule() { + super("SKYS-CONT-0005", "Unresolved Cell", + "No possible cell for a number without a duplicate contradiction.", + //specify a number? defaulting to every number for now. expand to more than duplicate? + "edu/rpi/legup/images/skyscrapers/contradictions/UnresolvedNumber.png"); + } + + /** + * Checks whether the transition has a contradiction at the specific puzzleElement index using this rule + * + * @param board board to check contradiction + * @param puzzleElement equivalent puzzleElement + * @return null if the transition contains a contradiction at the specified puzzleElement, + * otherwise error message + */ + @Override + public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { + //maybe: override check contradiction to only rows/cols for each number + SkyscrapersCell cell = (SkyscrapersCell) puzzleElement; + SkyscrapersBoard skyscrapersboard = (SkyscrapersBoard) board; + Point loc = cell.getLocation(); + + //each possible value + for (int i = 0; i < skyscrapersboard.getWidth(); i++) { + + } + + + return super.getNoContradictionMessage(); + } +} + diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/UnresolvedNumber.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/UnresolvedNumber.png new file mode 100644 index 0000000000000000000000000000000000000000..64fb4fc865c281f533be041dc6aad136e9e208ac GIT binary patch literal 2413 zcmb_d2~bm67EM?>h^T-dw&I4OECCu&qmhK&h(bsMvTImOr)_Z{fe*@m#h2bZt~B9I4g)4>@8ktqN% zhXM+;JecD^IszX|qq8}@agk_2rWdrNJA*_ma?3(Xu$GKQ;Q|0fhMei+pmv<@3}PZ% z1dzdKl0G~<4AwT0LGJwgd_sIY00>f3Q#llb%!4lAm3Sa1oNf3OXF$ZESR#mQHW2}c zxak-zj}qPjuLKWTLJ;H@k$_1AWsq%n*)+{k%aXzoeQTG(0f3JmKW1iT78DeKl%Iq0 zWx*}X1?vj7_5Xe#t_$b-!1}8~j(CNF0Vx~M*;AQEArM%BgPpb8g_F}oXR-$EG?Fld z>T0DAbG!+q@iaN3Yu?J9#{4z|O+_jI1Wt7y%BmPB>UE%x5Bqb)r2~`ZBJ{9-_;}_< z1d89jzcUdcQMq?1=&4G#7ISDUSKw5|T>P7#Z}g_dSW<*lDZK0&x?>bM)<_0!*cKSq z;EZdVmo$8iRR^6cbNv|pIeO=s;_;zW(&!bBq|xG5I@77D1Pg?~!UL5@<<4VLycq9P zOk}FKOCOu`BNthsst`gJLgP&<+Q6a|nnZR4uI04*2m&r(w6I%lL`grh1b!Dd=*R+O zWK*r_*r?r5PTw>OA+I7DD&%fVjBuh=3fm0Ft)IzX5E@(^j~;s+B=s7q=#bz zG+|=81|K>wtF(sWwgP=N^fsGsxn@M<=db-W*IeWXd*9_B>2+YKH_WQ>`eh>0uQ4)P zi0jz=*7W#*%Un#o&etK->u2PlENaG+;v-WJNb8I24Vy{pw|JnfgB@)mMQG%P2U31i z7~FL-L#h?3h@!X!4NM$V7?}T`sY_k5MzC zq>0h!uB3Isr@IW&a3s42S82Btglb;ydWNy>eLs7+lM<*qse~x6DIDqX9CgktXS;(x-2{O&!@H47{d99ba0b_XG2khf%|A9ZNYkS& zGl`kA$#BE$g@>tUla6<1Ab0z!=jmie6%wjtosbjig6p-}(jxM+OQLd-5<&3OWEVO$ z+K(Zv1}=$LN#LbZui;B({X^m&%}dQ@_;U7p-0Qs;*Jeml7Pmgq4JbU!-Jvd+nN9-h zsC2VoP3m(`EUdWdUCqzT;DxXWPwcLdXA-rGX*kK*TrJ~lzxf5bll(XK_{$osV z&thMWSoV}mDB8Sado|WMm9qmG(rsdsi`!*Q;_sdQEa}k%#sP&qtszY+`ScWWjEa$U z?U-|1yL4owt^+AoLa;w=D_s2T+y34>VAC1prrlTV`?VqYY!bDOy3-9LD`_qWQ|cQ` z43BPB<}$+xniv^T&0wZ{B-x#?+^~{>M^X~1*W2G*qjy%%qUF_!O)|pUqB(c)9E3FD z?a~c>Tr9j>k!zbm;bnTS)!lmX*e?gO?_V~$MPzwOPMbF74%T_XQ_>i^ceQQ)NtSZP z!3d^G{}DXlrP;?`-n72;!pqe#c^%ceepU))8&r}*Sl4o&(?NKscNA72fE6W z$=J<-^1c-=)Z<~k%b)AH__M~o(h>R{Q~d53A@bm;PS)gGe$d;k?{q+4okSF05WWz} zHwRys5Aai?*J<6#4$#zReD!0Hfs9YZ`L4Y`m@j99mJ2!#V+|@j?cCo{2HP>&GWff>n0hi0<<9ZvP!xGYiifewZ(zqI{dYKh_Fvj!l`!HRF}O~r5DXu_4mhJDnj+}QQ(zjPEJcAuG=%Sm3pT#u;A$J260X!36`ePCs=e2g3_=unwQ)Q4Kb%P3WS$2T{ADH77x06= Z!k#nZ(snP>&VW}p#K9hG$FT8>`#a>+vu^+Z literal 0 HcmV?d00001 From 93a9e82056a0cb68326ccf6df926e82cbf0874fe Mon Sep 17 00:00:00 2001 From: popem Date: Thu, 4 Aug 2022 15:14:46 -0400 Subject: [PATCH 09/45] checkContradiction overrides --- .../DuplicateNumberContradictionRule.java | 1 + .../ExceedingVisibilityContradictionRule.java | 22 ++++++++++++++++++- ...sufficientVisibilityContradictionRule.java | 21 ++++++++++++++++-- 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/DuplicateNumberContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/DuplicateNumberContradictionRule.java index 9bfab10fe..aacad9059 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/DuplicateNumberContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/DuplicateNumberContradictionRule.java @@ -29,6 +29,7 @@ public DuplicateNumberContradictionRule() { */ @Override public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { + //TODO:? Refactor to count each row/col once rather than per cell (override checkContradiction) SkyscrapersCell cell = (SkyscrapersCell) puzzleElement; SkyscrapersBoard skyscrapersboard = (SkyscrapersBoard) board; Point loc = cell.getLocation(); diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java index 662e8d590..5d0ca049e 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java @@ -31,7 +31,6 @@ public ExceedingVisibilityContradictionRule() { */ @Override public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { - //why is this called for every cell? maybe:override checkcontradiction SkyscrapersCell cell = (SkyscrapersCell) puzzleElement; SkyscrapersBoard skyscrapersboard = (SkyscrapersBoard) board; Point loc = cell.getLocation(); @@ -117,4 +116,25 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { //System.out.print("Does not contain a contradiction at this index"); return super.getNoContradictionMessage(); } + + /** + * Checks whether the tree node has a contradiction using this rule + * + * @param board board to check contradiction + * @return null if the tree node contains a contradiction, otherwise error message + */ + @Override + public String checkContradiction(Board board) { + SkyscrapersBoard skyscrapersBoard = (SkyscrapersBoard) board; + for (int i = 0; i < skyscrapersBoard.getWidth(); i++) { + //checks the middle diagonal (checkContradictionAt checks row/col off each) + String checkStr = checkContradictionAt(board, skyscrapersBoard.getCell(i,i)); + if (checkStr == null) { + return checkStr; + } + } + return "No instance of the contradiction " + this.ruleName + " here"; + } + } + diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java index 73cd120bb..7d8b2eb2b 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java @@ -31,12 +31,10 @@ public InsufficientVisibilityContradictionRule() { */ @Override public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { - //why is this run for every cell? maybe:override checkcontradiction to every row/col SkyscrapersCell cell = (SkyscrapersCell) puzzleElement; SkyscrapersBoard skyscrapersboard = (SkyscrapersBoard) board; Point loc = cell.getLocation(); - //get borders int west = skyscrapersboard.getRow().get(loc.y).getData(); int east = skyscrapersboard.getRowClues().get(loc.y).getData(); @@ -118,4 +116,23 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { //System.out.print("Does not contain a contradiction at this index"); return super.getNoContradictionMessage(); } + + /** + * Checks whether the tree node has a contradiction using this rule + * + * @param board board to check contradiction + * @return null if the tree node contains a contradiction, otherwise error message + */ + @Override + public String checkContradiction(Board board) { + SkyscrapersBoard skyscrapersBoard = (SkyscrapersBoard) board; + for (int i = 0; i < skyscrapersBoard.getWidth(); i++) { + //checks the middle diagonal (checkContradictionAt checks row/col off each) + String checkStr = checkContradictionAt(board, skyscrapersBoard.getCell(i,i)); + if (checkStr == null) { + return checkStr; + } + } + return "No instance of the contradiction " + this.ruleName + " here"; + } } From 5757872de35f452db78311941d9f9be6dbba51c0 Mon Sep 17 00:00:00 2001 From: popem Date: Sun, 14 Aug 2022 13:15:58 -0400 Subject: [PATCH 10/45] gave clueIndex purpose, implemented getCases for CellForNumberCaseRule --- .../puzzle/skyscrapers/SkyscrapersClue.java | 6 +---- .../skyscrapers/SkyscrapersImporter.java | 8 +++---- .../rules/CellForNumberCaseRule.java | 23 ++++++++++++++++++- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersClue.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersClue.java index 70aacd76b..dc68f45c7 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersClue.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersClue.java @@ -9,7 +9,7 @@ public class SkyscrapersClue extends PuzzleElement { public SkyscrapersClue(int value, int clueIndex, SkyscrapersType type) { super(value); this.index = -2; - this.clueIndex = clueIndex; + this.clueIndex = clueIndex;//index in list this.type = type; this.setModifiable(false); } @@ -38,10 +38,6 @@ public int getClueIndex() { return clueIndex; } - public void setClueIndex(int clueIndex) { - this.clueIndex = clueIndex; - } - public SkyscrapersType getType() { return type; } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java index 5ddcc673f..bf535477d 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java @@ -106,8 +106,8 @@ public void initializeBoard(Node node) throws InvalidFileFormatException { if (treeTentBoard.getRowClues().get(index - 1) != null) { throw new InvalidFileFormatException("TreeTent Importer: duplicate clue index"); }*/ - treeTentBoard.getRow().set(/*index - 1*/i, new SkyscrapersClue(index, index, SkyscrapersType.CLUE_WEST)); - treeTentBoard.getRowClues().set(/*index - 1*/i, new SkyscrapersClue(value, index, SkyscrapersType.CLUE_EAST)); + treeTentBoard.getRow().set(/*index - 1*/i, new SkyscrapersClue(index, i, SkyscrapersType.CLUE_WEST)); + treeTentBoard.getRowClues().set(/*index - 1*/i, new SkyscrapersClue(value, i, SkyscrapersType.CLUE_EAST)); } for (int i = 0; i < southClues.getLength(); i++) { @@ -122,8 +122,8 @@ public void initializeBoard(Node node) throws InvalidFileFormatException { if (treeTentBoard.getColClues().get(index - 1) != null) { throw new InvalidFileFormatException("TreeTent Importer: duplicate clue index"); }*/ - treeTentBoard.getCol().set(/*index - 1*/i, new SkyscrapersClue(index, index, SkyscrapersType.CLUE_NORTH)); - treeTentBoard.getColClues().set(/*index - 1*/i, new SkyscrapersClue(value, index, SkyscrapersType.CLUE_SOUTH)); + treeTentBoard.getCol().set(/*index - 1*/i, new SkyscrapersClue(index, i, SkyscrapersType.CLUE_NORTH)); + treeTentBoard.getColClues().set(/*index - 1*/i, new SkyscrapersClue(value, i, SkyscrapersType.CLUE_SOUTH)); } if (boardElement.getElementsByTagName("lines").getLength() == 1) { diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java index 30aec7ffb..9bba6bea2 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java @@ -7,6 +7,8 @@ import edu.rpi.legup.model.tree.TreeTransition; import edu.rpi.legup.puzzle.skyscrapers.*; +import java.awt.*; +import java.util.ArrayList; import java.util.List; public class CellForNumberCaseRule extends CaseRule { @@ -33,9 +35,28 @@ public CaseBoard getCaseBoard(Board board) { return caseBoard; } + public List getCasesFor(Board board, PuzzleElement puzzleElement, Integer number){ + //return null; + ArrayList cases = new ArrayList<>(); + + SkyscrapersClue clue = (SkyscrapersClue) puzzleElement; + SkyscrapersBoard skyscrapersboard = (SkyscrapersBoard) board; + + + List openCells = skyscrapersboard.getRowCol(clue.getClueIndex(),SkyscrapersType.UNKNOWN,clue.getType()==SkyscrapersType.CLUE_WEST); + for(SkyscrapersCell cell : openCells){ + Board newCase = board.copy(); + newCase.getPuzzleElement(cell).setData(number); + //if flags + cases.add(newCase); + } + return cases; + } + @Override public List getCases(Board board, PuzzleElement puzzleElement) { - return null; + int number = 1; //hard-coded for now + return getCasesFor(board,puzzleElement,number); } @Override From 8d1578f2e553c109a22542e24a8077b23a2ba29e Mon Sep 17 00:00:00 2001 From: popem Date: Sun, 14 Aug 2022 13:16:35 -0400 Subject: [PATCH 11/45] defined flags for future implementation --- .../edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java index 97b5455b7..af031c46c 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java @@ -17,6 +17,10 @@ public class SkyscrapersBoard extends GridBoard { private ArrayList row; private ArrayList col; + private boolean viewFlag = false; + private boolean dupeFlag = true; + private boolean unresolvedFlag = false; + public SkyscrapersBoard(int width, int height) { super(width, height); From 42db01060e33684a9a52c7c5c4c76346fc6d6520 Mon Sep 17 00:00:00 2001 From: popem Date: Thu, 18 Aug 2022 16:59:34 -0400 Subject: [PATCH 12/45] documentation --- .../legup/puzzle/skyscrapers/rules/TODO.md | 28 +++++++------ .../rules/skyscrapers_reference_sheet.txt | 39 +++++++++++++------ 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md index d2c6e4bd1..cdc9aa2a3 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md @@ -1,16 +1,22 @@ ## TODO +spreadsheet : https://docs.google.com/spreadsheets/d/1l7aUZtavtysM8dtGnaEIXhBKMRGxekhnLIVoYIHYZi8/edit#gid=0 + 1. Basic Rules: - - Last Cell - - Last Number - - 1-Edge - - N-Edge - - Fixed Max + - Check spreadsheet 2. Contradiction Rules: - - Duplicate Number - - Unresolved Cell - - Exceeding Visibility - - Insufficient Visibility + - check spreadsheet + - UnresovedCell vs. NoNumberForCell (don't need both) + - No Cell for Number - implement w/ flags 3. Case Rules: - - Possible Contents - - Possible Places + - Cell for number - waiting on ui, needs checkrule + 4. Refactoring: + - Remove references to lightup and treetent in variable names + - document utility functions in the reference sheet, COMMENTS! + - review and identify dead code + - create and add rule icons + - check for overrides of by cell functions (ie checkContradiction) + 5. Flags + - add to all case rules + - review all basic/contradiction rules to put in terms of the new cases / add flags + - edit importer and exporter to include flags in xml file format \ No newline at end of file diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/skyscrapers_reference_sheet.txt b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/skyscrapers_reference_sheet.txt index 9f2dd700f..8d17ee0b6 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/skyscrapers_reference_sheet.txt +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/skyscrapers_reference_sheet.txt @@ -1,12 +1,27 @@ -SKYS-BASC-0001 : FixedMaxBasicRule -SKYS-BASC-0002 : LastCellBasicRule -SKYS-BASC-0003 : LastNUmberBasicRule -SKYS-BASC-0004 : NEdgeBasicRule -SKYS-BASC-0005 : OneEdgeBasicRule - -SKYS-CONT-0001 : DuplicateNumbersContradictionRule -SKYS-CONT-0002 : ExceedingVisibilityContradictionRule -SKYS-CONT-0003 : InsufficientVisibilityContradictionRule -SKYS-CONT-0004 : UnresolvedCellContradictionRule - -SKYS-CASE-0001 : PossibleContentsCaseRule \ No newline at end of file +RULE LIST: + SKYS-BASC-0001 : FixedMaxBasicRule + SKYS-BASC-0002 : LastCellBasicRule + SKYS-BASC-0003 : LastNumberBasicRule + SKYS-BASC-0004 : NEdgeBasicRule + SKYS-BASC-0005 : OneEdgeBasicRule + + SKYS-CONT-0001 : DuplicateNumbersContradictionRule + SKYS-CONT-0002 : ExceedingVisibilityContradictionRule + SKYS-CONT-0003 : InsufficientVisibilityContradictionRule + SKYS-CONT-0004 : NoNumberForCellContradictionRule/UnresoveldCell + SKYS-CONT-0005 : NoCellForNumberContradictionRule/UnresoveldNumber + + SKYS-CASE-0001 : NumberForCellCaseRule + SKYS-CASE-0002 : CellForNumberCaseRule + +HELPER FUNCTIONS: + -getRowCol + Location: skyscrapersBoard + Use: returns all elements in a row or col + Notes: more than one element type? + +CODE MOURGE: + - isForced, getDefaultBoard + Locations: + Uses?: Unknown + Notes: \ No newline at end of file From fb606bfe33a67bbbfb2bbdb59dbaa94979343a41 Mon Sep 17 00:00:00 2001 From: popem Date: Tue, 30 Aug 2022 15:10:24 -0400 Subject: [PATCH 13/45] added ANY type to assist with helper functions Commented uncommented functions in Board Added to morgue and TODO --- .../puzzle/skyscrapers/SkyscrapersBoard.java | 79 +++++++++++++------ .../puzzle/skyscrapers/SkyscrapersType.java | 2 +- .../legup/puzzle/skyscrapers/rules/TODO.md | 5 +- .../rules/skyscrapers_reference_sheet.txt | 20 +++-- 4 files changed, 73 insertions(+), 33 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java index af031c46c..d28e99ecc 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java @@ -12,10 +12,15 @@ public class SkyscrapersBoard extends GridBoard { private ArrayList lines; + private ArrayList rowClues; + //EAST clues private ArrayList colClues; + //SOUTH clues private ArrayList row; + //WEST clues private ArrayList col; + //NORTH clues private boolean viewFlag = false; private boolean dupeFlag = true; @@ -53,19 +58,31 @@ public ArrayList getLines() { return lines; } - public ArrayList getRowClues() { //EAST CLUE + /** + * Returns a list of the eastern clues ordered from loc.y = 0->max + */ + public ArrayList getRowClues() { return rowClues; } - public ArrayList getColClues() { //SOUTH CLUE + /** + * Returns a list of the southern clues ordered from loc.x = 0->max + */ + public ArrayList getColClues() { return colClues; } - - public ArrayList getRow() { //WEST CLUE + + /** + * Returns a list of the western clues ordered from loc.y = 0->max + */ + public ArrayList getRow() { return row; } - public ArrayList getCol() { //NORTH CLUE + /** + * Returns a list of the northern clues ordered from loc.x = 0->max + */ + public ArrayList getCol() { return col; } @@ -123,6 +140,13 @@ public void notifyDeletion(PuzzleElement puzzleElement) { } } + /** + * Gets the cells of a certain type directly adjacent to a given cell + * + * @param cell at the center, + * type of cell to collect + * @return list of cells of the given type + */ public List getAdjacent(SkyscrapersCell cell, SkyscrapersType type) { List adj = new ArrayList<>(); Point loc = cell.getLocation(); @@ -130,21 +154,28 @@ public List getAdjacent(SkyscrapersCell cell, SkyscrapersType t SkyscrapersCell right = getCell(loc.x + 1, loc.y); SkyscrapersCell down = getCell(loc.x, loc.y + 1); SkyscrapersCell left = getCell(loc.x - 1, loc.y); - if (up != null && up.getType() == type) { + if (up != null && (up.getType() == type || type == SkyscrapersType.ANY)) { adj.add(up); } - if (right != null && right.getType() == type) { + if (right != null && (right.getType() == type || type == SkyscrapersType.ANY)) { adj.add(right); } - if (down != null && down.getType() == type) { + if (down != null && (down.getType() == type || type == SkyscrapersType.ANY)) { adj.add(down); } - if (left != null && left.getType() == type) { + if (left != null && (left.getType() == type || type == SkyscrapersType.ANY)) { adj.add(left); } return adj; } + /** + * Gets the cells of a certain type directly diagonal to a given cell + * + * @param cell at the center, + * type of cell to collect + * @return list of cells of the given type + */ public List getDiagonals(SkyscrapersCell cell, SkyscrapersType type) { List dia = new ArrayList<>(); Point loc = cell.getLocation(); @@ -152,16 +183,16 @@ public List getDiagonals(SkyscrapersCell cell, SkyscrapersType SkyscrapersCell downRight = getCell(loc.x + 1, loc.y + 1); SkyscrapersCell downLeft = getCell(loc.x - 1, loc.y + 1); SkyscrapersCell upLeft = getCell(loc.x - 1, loc.y - 1); - if (upRight != null && upRight.getType() == type) { + if (upRight != null && (upRight.getType() == type || type == SkyscrapersType.ANY)) { dia.add(upRight); } - if (downLeft != null && downLeft.getType() == type) { + if (downLeft != null && (downLeft.getType() == type || type == SkyscrapersType.ANY)) { dia.add(downLeft); } - if (downRight != null && downRight.getType() == type) { + if (downRight != null && (downRight.getType() == type || type == SkyscrapersType.ANY)) { dia.add(downRight); } - if (upLeft != null && upLeft.getType() == type) { + if (upLeft != null && (upLeft.getType() == type || type == SkyscrapersType.ANY)) { dia.add(upLeft); } return dia; @@ -177,19 +208,17 @@ public List getDiagonals(SkyscrapersCell cell, SkyscrapersType */ public List getRowCol(int index, SkyscrapersType type, boolean isRow) { List list = new ArrayList<>(); - if (isRow) { - for (int i = 0; i < dimension.height; i++) { - SkyscrapersCell cell = getCell(i, index); - if (cell.getType() == type) { - list.add(cell); - } + for (int i = 0; i < dimension.height; i++) { + SkyscrapersCell cell; + if (isRow) { + cell = getCell(i, index); } - } else { - for (int i = 0; i < dimension.width; i++) { - SkyscrapersCell cell = getCell(index, i); - if (cell.getType() == type) { - list.add(cell); - } + else { + cell = getCell(index, i); + } + + if (cell.getType() == type || type == SkyscrapersType.ANY) { + list.add(cell); } } return list; diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersType.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersType.java index 3340af8bf..1fdd668c1 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersType.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersType.java @@ -1,7 +1,7 @@ package edu.rpi.legup.puzzle.skyscrapers; public enum SkyscrapersType { - UNKNOWN(0), Number(1), GRASS(2), TENT(3), CLUE_NORTH(-1), CLUE_EAST(-2), CLUE_SOUTH(-3), CLUE_WEST(-4); + UNKNOWN(0), Number(1), ANY(2), CLUE_NORTH(-1), CLUE_EAST(-2), CLUE_SOUTH(-3), CLUE_WEST(-4); public int value; diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md index cdc9aa2a3..73de45b45 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md @@ -16,7 +16,10 @@ spreadsheet : https://docs.google.com/spreadsheets/d/1l7aUZtavtysM8dtGnaEIXhBKMR - review and identify dead code - create and add rule icons - check for overrides of by cell functions (ie checkContradiction) + - replace row,col,rowClues,colClues and corresponding functions with appropriate names 5. Flags - add to all case rules - review all basic/contradiction rules to put in terms of the new cases / add flags - - edit importer and exporter to include flags in xml file format \ No newline at end of file + - edit importer and exporter to include flags in xml file format + 6. Documentation + - UML diagram(s) \ No newline at end of file diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/skyscrapers_reference_sheet.txt b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/skyscrapers_reference_sheet.txt index 8d17ee0b6..31f18b45e 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/skyscrapers_reference_sheet.txt +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/skyscrapers_reference_sheet.txt @@ -14,14 +14,22 @@ RULE LIST: SKYS-CASE-0001 : NumberForCellCaseRule SKYS-CASE-0002 : CellForNumberCaseRule -HELPER FUNCTIONS: +HELPER FUNCTIONS: (check morgue for unused helpers, ctrl+f "helper function") -getRowCol Location: skyscrapersBoard - Use: returns all elements in a row or col + Use: returns elements in a row or col Notes: more than one element type? -CODE MOURGE: +CODE MORGUE: - isForced, getDefaultBoard - Locations: - Uses?: Unknown - Notes: \ No newline at end of file + Locations: + Uses?: Unknown + Notes: Seems like a sanity check, but I cannot find a situation where it runs + -getDiagonals + Location: skyscrapersBoard + Use: helper function - gets cells immediately diagonal to a cell + Note: If you implement this, move it from morgue to helper functions section! + -getAdjacent + Location: skyscrapersBoard + Use: helper function - gets cells immediately adjacent to a cell + Note: If you implement this, move it from morgue to helper functions section! \ No newline at end of file From 83f14a48b6fcbd61d58fd1a95ef5e710237986a0 Mon Sep 17 00:00:00 2001 From: ThisMatt Date: Tue, 20 Sep 2022 17:43:23 -0400 Subject: [PATCH 14/45] cleanup --- .../legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java index e558029d1..d56a6f959 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java @@ -45,10 +45,7 @@ public String checkRuleRawAt(TreeTransition transition, PuzzleElement puzzleElem emptyCase.getPuzzleElement(finalCell).setData(0); Point loc = finalCell.getLocation(); -<<<<<<< HEAD //init with all possible numbers -======= ->>>>>>> dev Set candidates = new HashSet(); for (int i = 1; i <= initialBoard.getWidth(); i++) { candidates.add(i); @@ -72,10 +69,7 @@ public String checkRuleRawAt(TreeTransition transition, PuzzleElement puzzleElem } } -<<<<<<< HEAD //check if given value is the only remaining value -======= ->>>>>>> dev DuplicateNumberContradictionRule duplicate = new DuplicateNumberContradictionRule(); if (candidates.size() == 1 && duplicate.checkContradictionAt(emptyCase, finalCell) != null) { Iterator it = candidates.iterator(); From b336ec7d0cdb5c15f753985b14317f941fbfc097 Mon Sep 17 00:00:00 2001 From: ThisMatt Date: Fri, 23 Sep 2022 14:52:37 -0400 Subject: [PATCH 15/45] added line functionality to the morgue --- puzzles files/skyscrapers/1646651 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/puzzles files/skyscrapers/1646651 b/puzzles files/skyscrapers/1646651 index 3facc12fe..3ff7ccc5a 100644 --- a/puzzles files/skyscrapers/1646651 +++ b/puzzles files/skyscrapers/1646651 @@ -1,7 +1,7 @@ - + @@ -25,6 +25,7 @@ + From e5c6a097d6a7df2a7e87d2871bcad4237fbc1a41 Mon Sep 17 00:00:00 2001 From: ThisMatt Date: Fri, 23 Sep 2022 14:56:07 -0400 Subject: [PATCH 16/45] Flags can now be set from imported puzzles --- puzzles files/skyscrapers/easy | 3 ++- .../puzzle/skyscrapers/SkyscrapersBoard.java | 9 ++++++++- .../puzzle/skyscrapers/SkyscrapersImporter.java | 16 +++++++++------- .../edu/rpi/legup/puzzle/skyscrapers/TODO.md | 11 ----------- .../rpi/legup/puzzle/skyscrapers/rules/TODO.md | 2 +- .../rules/skyscrapers_reference_sheet.txt | 5 +++++ 6 files changed, 25 insertions(+), 21 deletions(-) delete mode 100644 src/main/java/edu/rpi/legup/puzzle/skyscrapers/TODO.md diff --git a/puzzles files/skyscrapers/easy b/puzzles files/skyscrapers/easy index 48c255771..0d9ca35f8 100644 --- a/puzzles files/skyscrapers/easy +++ b/puzzles files/skyscrapers/easy @@ -1,7 +1,7 @@ - + @@ -17,6 +17,7 @@ + diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java index 7262c0106..2fba41f4b 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java @@ -23,7 +23,7 @@ public class SkyscrapersBoard extends GridBoard { //NORTH clues private boolean viewFlag = false; - private boolean dupeFlag = true; + private boolean dupeFlag = false; private boolean unresolvedFlag = false; public SkyscrapersBoard(int width, int height) { @@ -86,6 +86,13 @@ public ArrayList getCol() { return col; } + public boolean getDupeFlag(){return dupeFlag;} + public boolean getViewFlag(){return viewFlag;} + public boolean getUnresolvedFlag(){return unresolvedFlag;} + public void setDupeFlag(boolean newFlag){dupeFlag = newFlag ;} + public void setViewFlag(boolean newFlag){viewFlag = newFlag;} + public void setUnresolvedFlag(boolean newFlag){unresolvedFlag = newFlag;} + @Override public SkyscrapersCell getCell(int x, int y) { return (SkyscrapersCell) super.getCell(x, y); diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java index 093fcbaec..7f9af32aa 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java @@ -49,13 +49,6 @@ public void initializeBoard(Node node) throws InvalidFileFormatException { int size = Integer.valueOf(boardElement.getAttribute("size")); treeTentBoard = new SkyscrapersBoard(size); } - else { - if (!boardElement.getAttribute("width").isEmpty() && !boardElement.getAttribute("height").isEmpty()) { - int width = Integer.valueOf(boardElement.getAttribute("width")); - int height = Integer.valueOf(boardElement.getAttribute("height")); - treeTentBoard = new SkyscrapersBoard(width, height); - } - } if (treeTentBoard == null) { throw new InvalidFileFormatException("TreeTent Importer: invalid board dimensions"); @@ -149,6 +142,15 @@ public void initializeBoard(Node node) throws InvalidFileFormatException { } } + //Initialize present flags + NodeList flagList = boardElement.getElementsByTagName("flags"); + if(flagList.getLength()==1){ + Element flags = (Element) flagList.item(0); + if(flags.hasAttribute("dupe")){treeTentBoard.setDupeFlag(Boolean.parseBoolean(flags.getAttribute("dupe")));} + if(flags.hasAttribute("view")){treeTentBoard.setViewFlag(Boolean.parseBoolean(flags.getAttribute("view")));} + if(flags.hasAttribute("empty")){treeTentBoard.setUnresolvedFlag(Boolean.parseBoolean(flags.getAttribute("empty")));} + } + puzzle.setCurrentBoard(treeTentBoard); } catch (NumberFormatException e) { diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/TODO.md b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/TODO.md deleted file mode 100644 index 76c86b32f..000000000 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/TODO.md +++ /dev/null @@ -1,11 +0,0 @@ -## TODO - -- Implement board class (`SkyscrapersBoard.java`) -- Implement clues class (`SkyscrapersClue.java`) -- Implement cell generation (`SkyscrapersCellFactory.java`) -- Implement puzzle exporter (`SkyscrapersExporter.java`) -- Add way to interact with puzzle (`SkyscrapersCellController.java`) -- Add vision (`SkyscrapersVision.java`, `SkyscrapersVisionView.java`) -- Puzzle GUI (`SkyscrapersView.java`, `SkyscrapersElementView.java`, `SkyscrapersClueView.java`) -- Determine if puzzle is solved -- Add rules (see Sudoku and the powerpoint) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md index 73de45b45..ed7036f55 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md @@ -20,6 +20,6 @@ spreadsheet : https://docs.google.com/spreadsheets/d/1l7aUZtavtysM8dtGnaEIXhBKMR 5. Flags - add to all case rules - review all basic/contradiction rules to put in terms of the new cases / add flags - - edit importer and exporter to include flags in xml file format + - edit exporter to include flags in xml file format 6. Documentation - UML diagram(s) \ No newline at end of file diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/skyscrapers_reference_sheet.txt b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/skyscrapers_reference_sheet.txt index 31f18b45e..d399ca06a 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/skyscrapers_reference_sheet.txt +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/skyscrapers_reference_sheet.txt @@ -21,6 +21,11 @@ HELPER FUNCTIONS: (check morgue for unused helpers, ctrl+f "helper function") Notes: more than one element type? CODE MORGUE: + - SkyscapersLine, SkyscrapersLineView + Locations: above classes, Board, Importer, CellFactory, View + Uses: drawing lines between cells on the board + Note: No purpose for lines in this puzzle yet, + probably should remove all instances of their use for cleanliness' sake - isForced, getDefaultBoard Locations: Uses?: Unknown From ff920b93cca714c16c5b6c0b6f370fdae2a1ccb4 Mon Sep 17 00:00:00 2001 From: ThisMatt Date: Fri, 23 Sep 2022 16:25:22 -0400 Subject: [PATCH 17/45] flags are now copied, implemented view and dupe flag checking for both case rules --- puzzles files/skyscrapers/easy | 2 +- .../puzzle/skyscrapers/SkyscrapersBoard.java | 4 +++ .../rules/CellForNumberCaseRule.java | 19 ++++++++-- .../rules/PossibleContentsCaseRule.java | 35 ++++++++----------- .../legup/puzzle/skyscrapers/rules/TODO.md | 2 ++ 5 files changed, 39 insertions(+), 23 deletions(-) diff --git a/puzzles files/skyscrapers/easy b/puzzles files/skyscrapers/easy index 0d9ca35f8..b0cfeeafc 100644 --- a/puzzles files/skyscrapers/easy +++ b/puzzles files/skyscrapers/easy @@ -17,7 +17,7 @@ - + diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java index 2fba41f4b..8951b7d96 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java @@ -274,6 +274,10 @@ public SkyscrapersBoard copy() { copy.colClues = colClues; copy.row = row; copy.col = col; + + copy.dupeFlag=dupeFlag; + copy.viewFlag=viewFlag; + copy.unresolvedFlag=unresolvedFlag; return copy; } } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java index 9bba6bea2..773f7b548 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java @@ -46,9 +46,24 @@ public List getCasesFor(Board board, PuzzleElement puzzleElement, Integer List openCells = skyscrapersboard.getRowCol(clue.getClueIndex(),SkyscrapersType.UNKNOWN,clue.getType()==SkyscrapersType.CLUE_WEST); for(SkyscrapersCell cell : openCells){ Board newCase = board.copy(); - newCase.getPuzzleElement(cell).setData(number); + PuzzleElement newCell = newCase.getPuzzleElement(cell); + newCell.setData(number); + newCase.addModifiedData(newCell); //if flags - cases.add(newCase); + boolean passed = true; + if(skyscrapersboard.getDupeFlag()){ + DuplicateNumberContradictionRule DupeRule = new DuplicateNumberContradictionRule(); + passed = passed && DupeRule.checkContradictionAt(newCase,newCell)!=null; + } + if(skyscrapersboard.getViewFlag()){ + InsufficientVisibilityContradictionRule fewRule = new InsufficientVisibilityContradictionRule(); + ExceedingVisibilityContradictionRule moreRule = new ExceedingVisibilityContradictionRule(); + passed = passed && fewRule.checkContradictionAt(newCase,newCell)!=null && moreRule.checkContradictionAt(newCase,newCell)!=null; + } + //how should unresolved be handled? should it be? + if(passed){cases.add(newCase);} + + } return cases; } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PossibleContentsCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PossibleContentsCaseRule.java index e77deca33..ec7bc5876 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PossibleContentsCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PossibleContentsCaseRule.java @@ -52,29 +52,24 @@ public ArrayList getCases(Board board, PuzzleElement puzzleElement) { Set candidates = new HashSet(); for (int i = 1; i <= skyscrapersboard.getWidth(); i++) { - candidates.add(i); - } + Board newCase = board.copy(); + PuzzleElement newCell = newCase.getPuzzleElement(puzzleElement); + newCell.setData(i); + newCase.addModifiedData(newCell); - for (int i = 0; i < skyscrapersboard.getWidth(); i++) { - SkyscrapersCell c = skyscrapersboard.getCell(i, loc.y); - if (c.getType() == SkyscrapersType.Number) { - candidates.remove(c.getData()); + //if flags + boolean passed = true; + if(skyscrapersboard.getDupeFlag()){ + DuplicateNumberContradictionRule DupeRule = new DuplicateNumberContradictionRule(); + passed = passed && DupeRule.checkContradictionAt(newCase,newCell)!=null; } - } - for (int i = 0; i < skyscrapersboard.getHeight(); i++) { - SkyscrapersCell c = skyscrapersboard.getCell(loc.x, i); - if (c.getType() == SkyscrapersType.Number) { - candidates.remove(c.getData()); + if(skyscrapersboard.getViewFlag()){ + InsufficientVisibilityContradictionRule fewRule = new InsufficientVisibilityContradictionRule(); + ExceedingVisibilityContradictionRule moreRule = new ExceedingVisibilityContradictionRule(); + passed = passed && fewRule.checkContradictionAt(newCase,newCell)!=null && moreRule.checkContradictionAt(newCase,newCell)!=null; } - } - - Iterator it = candidates.iterator(); - while (it.hasNext()) { - Board case1 = board.copy(); - PuzzleElement data = case1.getPuzzleElement(puzzleElement); - data.setData(it.next()); - case1.addModifiedData(data); - cases.add(case1); + //how should unresolved be handled? should it be? + if(passed){cases.add(newCase);} } return cases; diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md index ed7036f55..13b3ebd03 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md @@ -8,6 +8,8 @@ spreadsheet : https://docs.google.com/spreadsheets/d/1l7aUZtavtysM8dtGnaEIXhBKMR - check spreadsheet - UnresovedCell vs. NoNumberForCell (don't need both) - No Cell for Number - implement w/ flags + - Generalize visibility rules to non-full lines + - Figure out why these aren't static methods 3. Case Rules: - Cell for number - waiting on ui, needs checkrule 4. Refactoring: From 59c64a702f258ef5a6b8f4af3b8a24ea589939e2 Mon Sep 17 00:00:00 2001 From: ThisMatt Date: Fri, 23 Sep 2022 17:25:39 -0400 Subject: [PATCH 18/45] LastNumber now based upon case rules --- .../rules/LastNumberBasicRule.java | 46 ++++++------------- .../legup/puzzle/skyscrapers/rules/TODO.md | 2 + 2 files changed, 16 insertions(+), 32 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java index d56a6f959..bd64615f6 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java @@ -10,6 +10,7 @@ import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersType; import java.awt.Point; +import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.Set; @@ -41,44 +42,25 @@ public String checkRuleRawAt(TreeTransition transition, PuzzleElement puzzleElem return super.getInvalidUseOfRuleMessage() + ": Modified cells must transition from unknown to number"; } - SkyscrapersBoard emptyCase = initialBoard.copy(); - emptyCase.getPuzzleElement(finalCell).setData(0); - Point loc = finalCell.getLocation(); - - //init with all possible numbers - Set candidates = new HashSet(); - for (int i = 1; i <= initialBoard.getWidth(); i++) { - candidates.add(i); - } - - //remove any existing numbers - for (int i = 0; i < initialBoard.getWidth(); i++) { - //check row - SkyscrapersCell c = initialBoard.getCell(i, loc.y); - if (i != loc.x && c.getType() == SkyscrapersType.Number) { - candidates.remove(c.getData()); - //System.out.print(c.getData()); - //System.out.println(finalCell.getData()); - } - // check column - c = initialBoard.getCell(loc.x, i); - if (i != loc.y && c.getType() == SkyscrapersType.Number) { - candidates.remove(c.getData()); - //System.out.print(c.getData()); - //System.out.println(finalCell.getData()); - } - } + //set all rules used by case rule to false except for dupe, get all cases + boolean dupeTemp = initialBoard.getDupeFlag(); + boolean viewTemp = initialBoard.getViewFlag(); + initialBoard.setDupeFlag(true); + initialBoard.setViewFlag(false); + PossibleContentsCaseRule caseRule = new PossibleContentsCaseRule(); + ArrayList candidates = caseRule.getCases(initialBoard,puzzleElement); + initialBoard.setDupeFlag(dupeTemp); + initialBoard.setViewFlag(viewTemp); //check if given value is the only remaining value - DuplicateNumberContradictionRule duplicate = new DuplicateNumberContradictionRule(); - if (candidates.size() == 1 && duplicate.checkContradictionAt(emptyCase, finalCell) != null) { - Iterator it = candidates.iterator(); - if (it.next() == finalCell.getData()) { + System.out.println("HERE" + candidates.size()); + System.out.println(candidates.get(0).getPuzzleElement(puzzleElement).getData()); + if(candidates.size() == 1){ + if(candidates.get(0).getPuzzleElement(puzzleElement).getData() == finalCell.getData()){ return null; } return super.getInvalidUseOfRuleMessage() + ": Wrong number in the cell."; } - return super.getInvalidUseOfRuleMessage() + ":This cell is not forced."; } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md index 13b3ebd03..3d216af56 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md @@ -4,6 +4,7 @@ spreadsheet : https://docs.google.com/spreadsheets/d/1l7aUZtavtysM8dtGnaEIXhBKMR 1. Basic Rules: - Check spreadsheet + - 1Edge - generalize to last number w/ view flag? 2. Contradiction Rules: - check spreadsheet - UnresovedCell vs. NoNumberForCell (don't need both) @@ -23,5 +24,6 @@ spreadsheet : https://docs.google.com/spreadsheets/d/1l7aUZtavtysM8dtGnaEIXhBKMR - add to all case rules - review all basic/contradiction rules to put in terms of the new cases / add flags - edit exporter to include flags in xml file format + - discuss use/not of unresolved flag 6. Documentation - UML diagram(s) \ No newline at end of file From f25c4480b59f65c59bf43fc0bb184256b407e9a9 Mon Sep 17 00:00:00 2001 From: ThisMatt Date: Tue, 4 Oct 2022 16:56:57 -0400 Subject: [PATCH 19/45] Fixed bug where case rule sanity checks allowed for removing children --- .../rules/CellForNumberCaseRule.java | 48 ++++++++++++++++++- .../rules/PossibleContentsCaseRule.java | 3 ++ .../legup/puzzle/skyscrapers/rules/TODO.md | 1 + 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java index 773f7b548..d861f6cad 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java @@ -6,10 +6,13 @@ import edu.rpi.legup.model.rules.CaseRule; import edu.rpi.legup.model.tree.TreeTransition; import edu.rpi.legup.puzzle.skyscrapers.*; +import org.apache.commons.lang3.ObjectUtils; import java.awt.*; import java.util.ArrayList; import java.util.List; +import java.util.Set; +import java.util.TreeSet; public class CellForNumberCaseRule extends CaseRule { //select a certain row/col? select a certain number? @@ -48,7 +51,10 @@ public List getCasesFor(Board board, PuzzleElement puzzleElement, Integer Board newCase = board.copy(); PuzzleElement newCell = newCase.getPuzzleElement(cell); newCell.setData(number); + + newCase.getPuzzleElement(clue).setModified(true); newCase.addModifiedData(newCell); + //if flags boolean passed = true; if(skyscrapersboard.getDupeFlag()){ @@ -76,11 +82,51 @@ public List getCases(Board board, PuzzleElement puzzleElement) { @Override public String checkRuleRaw(TreeTransition transition) { + List childTransitions = transition.getParents().get(0).getChildren(); + SkyscrapersBoard oldBoard = (SkyscrapersBoard) transition.getParents().get(0).getBoard(); + if (childTransitions.size() == 0) { + return "This case rule must have at least one child."; + } + + //find changed row/col + SkyscrapersClue modClue = null; + for(SkyscrapersClue clue : ((SkyscrapersBoard)childTransitions.get(0).getBoard()).getRow()){ + if(clue.isModified()){ + modClue = clue; + break; + } + } + if(modClue!=null){ + for(SkyscrapersClue clue : ((SkyscrapersBoard)childTransitions.get(0).getBoard()).getCol()){ + if(clue.isModified()){ + modClue = clue; + break; + } + } + } + + if(childTransitions.size() != getCasesFor(oldBoard,modClue,(Integer) childTransitions.get(0).getBoard().getModifiedData().iterator().next().getData()).size()){ + System.out.println("Wrong number of cases."); + return "Wrong number of cases."; + } + + for(TreeTransition newTree : childTransitions){ + SkyscrapersBoard newBoard = (SkyscrapersBoard) newTree.getBoard(); + if(newBoard.getModifiedData().size()!=1){ + System.out.println("Only one cell should be modified."); + return "Only one cell should be modified."; + } + SkyscrapersCell newCell = (SkyscrapersCell) newBoard.getModifiedData().iterator().next(); + if(newCell.getType() != SkyscrapersType.Number){ + System.out.println("Changed value should be a number."); + return "Changed value should be a number."; + } + } return null; } @Override public String checkRuleRawAt(TreeTransition transition, PuzzleElement puzzleElement) { - return null; + return checkRuleRaw(transition); } } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PossibleContentsCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PossibleContentsCaseRule.java index ec7bc5876..6ce0424f3 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PossibleContentsCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PossibleContentsCaseRule.java @@ -88,6 +88,9 @@ public String checkRuleRaw(TreeTransition transition) { //System.out.println("0"); return "This case rule must have at least one child."; } + else if (childTransitions.size() != getCases(transition.getBoard(), childTransitions.get(0).getBoard().getModifiedData().iterator().next()).size()){ + return "Wrong number of children."; + } //TreeTransition case1 = childTransitions.get(0); diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md index 3d216af56..626c7506b 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md @@ -13,6 +13,7 @@ spreadsheet : https://docs.google.com/spreadsheets/d/1l7aUZtavtysM8dtGnaEIXhBKMR - Figure out why these aren't static methods 3. Case Rules: - Cell for number - waiting on ui, needs checkrule + - For both (probably), checkRuleRaw to deny deleting branches 4. Refactoring: - Remove references to lightup and treetent in variable names - document utility functions in the reference sheet, COMMENTS! From 3a9293538ded33829ea29b2b5bbfa3180fdb681c Mon Sep 17 00:00:00 2001 From: ThisMatt Date: Fri, 7 Oct 2022 14:38:19 -0400 Subject: [PATCH 20/45] Last Cell rule now uses case rules --- .../rules/CellForNumberCaseRule.java | 6 +- .../skyscrapers/rules/FixedMaxBasicRule.java | 1 + .../skyscrapers/rules/LastCellBasicRule.java | 75 ++++++++----------- .../rules/LastNumberBasicRule.java | 2 - .../skyscrapers/rules/OneEdgeBasicRule.java | 1 + 5 files changed, 35 insertions(+), 50 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java index d861f6cad..f03591ad0 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java @@ -15,7 +15,6 @@ import java.util.TreeSet; public class CellForNumberCaseRule extends CaseRule { - //select a certain row/col? select a certain number? public CellForNumberCaseRule() { super("SKYS-CASE-0002", "Cell For Number", "A number (1-n) must appear in any given row/column", @@ -38,7 +37,7 @@ public CaseBoard getCaseBoard(Board board) { return caseBoard; } - public List getCasesFor(Board board, PuzzleElement puzzleElement, Integer number){ + public ArrayList getCasesFor(Board board, PuzzleElement puzzleElement, Integer number){ //return null; ArrayList cases = new ArrayList<>(); @@ -66,7 +65,6 @@ public List getCasesFor(Board board, PuzzleElement puzzleElement, Integer ExceedingVisibilityContradictionRule moreRule = new ExceedingVisibilityContradictionRule(); passed = passed && fewRule.checkContradictionAt(newCase,newCell)!=null && moreRule.checkContradictionAt(newCase,newCell)!=null; } - //how should unresolved be handled? should it be? if(passed){cases.add(newCase);} @@ -75,7 +73,7 @@ public List getCasesFor(Board board, PuzzleElement puzzleElement, Integer } @Override - public List getCases(Board board, PuzzleElement puzzleElement) { + public ArrayList getCases(Board board, PuzzleElement puzzleElement) { int number = 1; //hard-coded for now return getCasesFor(board,puzzleElement,number); } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java index 553a8d9bd..e762fa337 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java @@ -33,6 +33,7 @@ public FixedMaxBasicRule() { */ @Override public String checkRuleRawAt(TreeTransition transition, PuzzleElement puzzleElement) { + //last cell for number based on preemptive visibility rules SkyscrapersBoard initialBoard = (SkyscrapersBoard) transition.getParents().get(0).getBoard(); SkyscrapersCell initCell = (SkyscrapersCell) initialBoard.getPuzzleElement(puzzleElement); SkyscrapersBoard finalBoard = (SkyscrapersBoard) transition.getBoard(); diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastCellBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastCellBasicRule.java index 6120eb900..f8495c303 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastCellBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastCellBasicRule.java @@ -10,6 +10,7 @@ import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersType; import java.awt.Point; +import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.Set; @@ -18,7 +19,7 @@ public class LastCellBasicRule extends BasicRule { public LastCellBasicRule() { super("SKYS-BASC-0002", "Last Cell", - "A certain number must go in a certain cell, because that cell is the last place that number can appear in that row/column.", + "A certain number must go in a certain cell, because that cell is only cell in that row/col that does not create a duplicate contradiction", "edu/rpi/legup/images/skyscrapers/rules/LastCell.png"); } @@ -41,55 +42,41 @@ public String checkRuleRawAt(TreeTransition transition, PuzzleElement puzzleElem return super.getInvalidUseOfRuleMessage() + ": Modified cells must be number"; } - SkyscrapersBoard emptyCase = initialBoard.copy(); - emptyCase.getPuzzleElement(finalCell).setData(0); - Point loc = finalCell.getLocation(); + //set all rules used by case rule to false except for dupe, get all cases + boolean dupeTemp = initialBoard.getDupeFlag(); + boolean viewTemp = initialBoard.getViewFlag(); + initialBoard.setDupeFlag(true); + initialBoard.setViewFlag(false); + CellForNumberCaseRule caseRule = new CellForNumberCaseRule(); + ArrayList XCandidates = caseRule.getCasesFor(initialBoard,initialBoard.getRow().get(finalCell.getLocation().y),(Integer)finalCell.getData()); + ArrayList YCandidates = caseRule.getCasesFor(initialBoard,initialBoard.getCol().get(finalCell.getLocation().x),(Integer)finalCell.getData()); + initialBoard.setDupeFlag(dupeTemp); + initialBoard.setViewFlag(viewTemp); - Set candidates = new HashSet(); - for (int i = 1; i <= initialBoard.getWidth(); i++) { - candidates.add(i); - } - - //check row - for (int i = 0; i < initialBoard.getWidth(); i++) { - SkyscrapersCell c = initialBoard.getCell(i, loc.y); - if (i != loc.x && c.getType() == SkyscrapersType.Number) { - candidates.remove(c.getData()); - //System.out.print(c.getData()); - //System.out.println(finalCell.getData()); - } - } - if (candidates.size() == 1) { - Iterator it = candidates.iterator(); - if (it.next() == finalCell.getData()) { - return null; - } - return super.getInvalidUseOfRuleMessage() + ": Wrong number in the cell."; - } + System.out.println(XCandidates.size()); + System.out.println(YCandidates.size()); - candidates.clear(); - for (int i = 1; i <= initialBoard.getWidth(); i++) { - candidates.add(i); + //return null if either pass, both messages otherwise + String xCheck = candidateCheck(XCandidates,puzzleElement,finalCell); + String yCheck = candidateCheck(YCandidates,puzzleElement,finalCell); + if(xCheck==null || yCheck==null){ + return null; } + return super.getInvalidUseOfRuleMessage() + "\nRow" + xCheck + "\nCol" + yCheck; + } - // check column - for (int i = 0; i < initialBoard.getHeight(); i++) { - SkyscrapersCell c = initialBoard.getCell(loc.x, i); - if (i != loc.y && c.getType() == SkyscrapersType.Number) { - candidates.remove(c.getData()); - //System.out.print(c.getData()); - //System.out.println(finalCell.getData()); + //helper to check if candidate list is valid + private String candidateCheck(ArrayList candidates,PuzzleElement puzzleElement, SkyscrapersCell finalCell){ + if(candidates.size() == 1){ + if(((SkyscrapersCell) candidates.get(0).getPuzzleElement(puzzleElement)).getType() == SkyscrapersType.Number) { + if (candidates.get(0).getPuzzleElement(puzzleElement).getData() == finalCell.getData()) { + return null; + } + return ": Wrong number in the cell."; } + return ": No case for this cell."; } - if (candidates.size() == 1) { - Iterator it = candidates.iterator(); - if (it.next() == finalCell.getData()) { - return null; - } - return super.getInvalidUseOfRuleMessage() + ": Wrong number in the cell."; - } - - return super.getInvalidUseOfRuleMessage() + ": This cell is not forced."; + return ": This cell is not forced."; } private boolean isForced(SkyscrapersBoard board, SkyscrapersCell cell) { diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java index bd64615f6..a5f52e568 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java @@ -53,8 +53,6 @@ public String checkRuleRawAt(TreeTransition transition, PuzzleElement puzzleElem initialBoard.setViewFlag(viewTemp); //check if given value is the only remaining value - System.out.println("HERE" + candidates.size()); - System.out.println(candidates.get(0).getPuzzleElement(puzzleElement).getData()); if(candidates.size() == 1){ if(candidates.get(0).getPuzzleElement(puzzleElement).getData() == finalCell.getData()){ return null; diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java index 3e57ae533..7cecdf630 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java @@ -33,6 +33,7 @@ public OneEdgeBasicRule() { */ @Override public String checkRuleRawAt(TreeTransition transition, PuzzleElement puzzleElement) { + //last number for cell based upon preemptive visibility rules SkyscrapersBoard initialBoard = (SkyscrapersBoard) transition.getParents().get(0).getBoard(); SkyscrapersCell initCell = (SkyscrapersCell) initialBoard.getPuzzleElement(puzzleElement); SkyscrapersBoard finalBoard = (SkyscrapersBoard) transition.getBoard(); From a6a4304e6afedd570b7b4a7386e5cc6016fabed4 Mon Sep 17 00:00:00 2001 From: ThisMatt Date: Fri, 7 Oct 2022 15:01:16 -0400 Subject: [PATCH 21/45] renamed possibleContents to NumberForCell --- .../skyscrapers/rules/LastNumberBasicRule.java | 2 +- ...ntsCaseRule.java => NumberForCellCaseRule.java} | 13 +++++++------ .../edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md | 8 +++----- .../{PossibleContents.png => NumberForCell.png} | Bin 4 files changed, 11 insertions(+), 12 deletions(-) rename src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/{PossibleContentsCaseRule.java => NumberForCellCaseRule.java} (95%) rename src/main/resources/edu/rpi/legup/images/skyscrapers/cases/{PossibleContents.png => NumberForCell.png} (100%) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java index a5f52e568..32a13e43c 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java @@ -47,7 +47,7 @@ public String checkRuleRawAt(TreeTransition transition, PuzzleElement puzzleElem boolean viewTemp = initialBoard.getViewFlag(); initialBoard.setDupeFlag(true); initialBoard.setViewFlag(false); - PossibleContentsCaseRule caseRule = new PossibleContentsCaseRule(); + NumberForCellCaseRule caseRule = new NumberForCellCaseRule(); ArrayList candidates = caseRule.getCases(initialBoard,puzzleElement); initialBoard.setDupeFlag(dupeTemp); initialBoard.setViewFlag(viewTemp); diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PossibleContentsCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/NumberForCellCaseRule.java similarity index 95% rename from src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PossibleContentsCaseRule.java rename to src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/NumberForCellCaseRule.java index 6ce0424f3..87eb44da8 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PossibleContentsCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/NumberForCellCaseRule.java @@ -9,17 +9,18 @@ import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersCell; import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersType; -import java.awt.Point; +import java.awt.*; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; -import java.util.*; +import java.util.Set; -public class PossibleContentsCaseRule extends CaseRule { +public class NumberForCellCaseRule extends CaseRule { - public PossibleContentsCaseRule() { - super("SKYS-CASE-0001", "Possible Contents", + public NumberForCellCaseRule() { + super("SKYS-CASE-0001", "Number For Cell", "A blank cell must have height of 1 to n.", - "edu/rpi/legup/images/skyscrapers/cases/PossibleContents.png"); + "edu/rpi/legup/images/skyscrapers/cases/NumberForCell.png"); } @Override diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md index 626c7506b..41a16d486 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md @@ -3,8 +3,8 @@ spreadsheet : https://docs.google.com/spreadsheets/d/1l7aUZtavtysM8dtGnaEIXhBKMRGxekhnLIVoYIHYZi8/edit#gid=0 1. Basic Rules: - - Check spreadsheet - - 1Edge - generalize to last number w/ view flag? + - Rename to fit uses + - Last visible/singular number/cell? 2. Contradiction Rules: - check spreadsheet - UnresovedCell vs. NoNumberForCell (don't need both) @@ -12,8 +12,7 @@ spreadsheet : https://docs.google.com/spreadsheets/d/1l7aUZtavtysM8dtGnaEIXhBKMR - Generalize visibility rules to non-full lines - Figure out why these aren't static methods 3. Case Rules: - - Cell for number - waiting on ui, needs checkrule - - For both (probably), checkRuleRaw to deny deleting branches + - Cell for number - waiting on ui 4. Refactoring: - Remove references to lightup and treetent in variable names - document utility functions in the reference sheet, COMMENTS! @@ -22,7 +21,6 @@ spreadsheet : https://docs.google.com/spreadsheets/d/1l7aUZtavtysM8dtGnaEIXhBKMR - check for overrides of by cell functions (ie checkContradiction) - replace row,col,rowClues,colClues and corresponding functions with appropriate names 5. Flags - - add to all case rules - review all basic/contradiction rules to put in terms of the new cases / add flags - edit exporter to include flags in xml file format - discuss use/not of unresolved flag diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/cases/PossibleContents.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/cases/NumberForCell.png similarity index 100% rename from src/main/resources/edu/rpi/legup/images/skyscrapers/cases/PossibleContents.png rename to src/main/resources/edu/rpi/legup/images/skyscrapers/cases/NumberForCell.png From ffd1c17cbecb529d74394504ae23df79fca57e35 Mon Sep 17 00:00:00 2001 From: ThisMatt Date: Fri, 7 Oct 2022 17:00:12 -0400 Subject: [PATCH 22/45] unresolved cell and number now work in terms of case rules --- .../legup/puzzle/skyscrapers/rules/TODO.md | 3 - .../UnresolvedCellContradictionRule.java | 32 ++-------- .../UnresolvedNumberContradictionRule.java | 61 +++++++++++++++++-- 3 files changed, 59 insertions(+), 37 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md index 41a16d486..ffc68b053 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md @@ -6,9 +6,6 @@ spreadsheet : https://docs.google.com/spreadsheets/d/1l7aUZtavtysM8dtGnaEIXhBKMR - Rename to fit uses - Last visible/singular number/cell? 2. Contradiction Rules: - - check spreadsheet - - UnresovedCell vs. NoNumberForCell (don't need both) - - No Cell for Number - implement w/ flags - Generalize visibility rules to non-full lines - Figure out why these aren't static methods 3. Case Rules: diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedCellContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedCellContradictionRule.java index 445b0841e..2a4ac72b7 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedCellContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedCellContradictionRule.java @@ -8,6 +8,7 @@ import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersType; import java.awt.*; +import java.util.ArrayList; import java.util.HashSet; import java.util.Set; @@ -29,37 +30,12 @@ public UnresolvedCellContradictionRule() { */ @Override public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { - SkyscrapersCell cell = (SkyscrapersCell) puzzleElement; - SkyscrapersBoard skyscrapersboard = (SkyscrapersBoard) board; - Point loc = cell.getLocation(); - Set candidates = new HashSet(); + NumberForCellCaseRule caseRule = new NumberForCellCaseRule(); + ArrayList cases = caseRule.getCases(board,puzzleElement); - //check row - for (int i = 0; i < skyscrapersboard.getWidth(); i++) { - SkyscrapersCell c = skyscrapersboard.getCell(i, loc.y); - if (i != loc.x && cell.getType() == SkyscrapersType.UNKNOWN && c.getType() == SkyscrapersType.Number) { - //System.out.print(c.getData()); - //System.out.println(cell.getData()); - candidates.add(c.getData()); - } - } + if(cases.size()==0){return null;} - // check column - for (int i = 0; i < skyscrapersboard.getHeight(); i++) { - SkyscrapersCell c = skyscrapersboard.getCell(loc.x, i); - if (i != loc.y && cell.getType() == SkyscrapersType.UNKNOWN && c.getType() == SkyscrapersType.Number) { - //System.out.print(c.getData()); - //System.out.println(cell.getData()); - candidates.add(c.getData()); - } - } - - if (candidates.size() == skyscrapersboard.getWidth()) { - System.out.print("violation"); - return null; - } - //System.out.print("Does not contain a contradiction at this index"); return super.getNoContradictionMessage(); } } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedNumberContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedNumberContradictionRule.java index e99e5c16e..ad52b3be2 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedNumberContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedNumberContradictionRule.java @@ -9,13 +9,14 @@ import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersType; import java.awt.*; +import java.util.ArrayList; import java.util.HashSet; import java.util.Set; public class UnresolvedNumberContradictionRule extends ContradictionRule { public UnresolvedNumberContradictionRule() { - super("SKYS-CONT-0005", "Unresolved Cell", + super("SKYS-CONT-0005", "Unresolved Number", "No possible cell for a number without a duplicate contradiction.", //specify a number? defaulting to every number for now. expand to more than duplicate? "edu/rpi/legup/images/skyscrapers/contradictions/UnresolvedNumber.png"); @@ -31,18 +32,66 @@ public UnresolvedNumberContradictionRule() { */ @Override public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { - //maybe: override check contradiction to only rows/cols for each number + SkyscrapersBoard skyscrapersBoard = (SkyscrapersBoard) board; SkyscrapersCell cell = (SkyscrapersCell) puzzleElement; - SkyscrapersBoard skyscrapersboard = (SkyscrapersBoard) board; Point loc = cell.getLocation(); - //each possible value - for (int i = 0; i < skyscrapersboard.getWidth(); i++) { + CellForNumberCaseRule caseRule = new CellForNumberCaseRule(); + for(int i=0;i Date: Tue, 11 Oct 2022 17:26:57 -0400 Subject: [PATCH 23/45] Renamed clues to appropriate names --- .../puzzle/skyscrapers/SkyscrapersBoard.java | 54 ++++++++----------- .../skyscrapers/SkyscrapersExporter.java | 4 +- .../skyscrapers/SkyscrapersImporter.java | 8 +-- .../puzzle/skyscrapers/SkyscrapersView.java | 8 +-- .../rules/CellForNumberCaseRule.java | 8 +-- .../ExceedingVisibilityContradictionRule.java | 8 +-- .../skyscrapers/rules/FixedMaxBasicRule.java | 8 +-- ...sufficientVisibilityContradictionRule.java | 8 +-- .../skyscrapers/rules/LastCellBasicRule.java | 4 +- .../skyscrapers/rules/NEdgeBasicRule.java | 8 +-- .../skyscrapers/rules/OneEdgeBasicRule.java | 8 +-- .../legup/puzzle/skyscrapers/rules/TODO.md | 2 + .../UnresolvedNumberContradictionRule.java | 4 +- .../rules/skyscrapers_reference_sheet.txt | 1 + 14 files changed, 64 insertions(+), 69 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java index 8951b7d96..2d8724352 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java @@ -13,13 +13,13 @@ public class SkyscrapersBoard extends GridBoard { private ArrayList lines; - private ArrayList rowClues; + private ArrayList eastClues; //EAST clues - private ArrayList colClues; + private ArrayList southClues; //SOUTH clues - private ArrayList row; + private ArrayList westClues; //WEST clues - private ArrayList col; + private ArrayList northClues; //NORTH clues private boolean viewFlag = false; @@ -31,22 +31,16 @@ public SkyscrapersBoard(int width, int height) { this.lines = new ArrayList<>(); - this.rowClues = new ArrayList<>(); - this.colClues = new ArrayList<>(); - this.row = new ArrayList<>(); - this.col = new ArrayList<>(); + this.eastClues = new ArrayList<>(); + this.southClues = new ArrayList<>(); + this.westClues = new ArrayList<>(); + this.northClues = new ArrayList<>(); for (int i = 0; i < height; i++) { - rowClues.add(null); - } - for (int i = 0; i < width; i++) { - colClues.add(null); - } - for (int i = 0; i < height; i++) { - row.add(null); - } - for (int i = 0; i < width; i++) { - col.add(null); + eastClues.add(null); + southClues.add(null); + westClues.add(null); + northClues.add(null); } } @@ -61,29 +55,27 @@ public ArrayList getLines() { /** * Returns a list of the eastern clues ordered from loc.y = 0->max */ - public ArrayList getRowClues() { - return rowClues; + public ArrayList getEastClues() { + return eastClues; } /** * Returns a list of the southern clues ordered from loc.x = 0->max */ - public ArrayList getColClues() { - return colClues; + public ArrayList getSouthClues() { + return southClues; } /** * Returns a list of the western clues ordered from loc.y = 0->max */ - public ArrayList getRow() { - return row; - } + public ArrayList getWestClues() {return westClues;} /** * Returns a list of the northern clues ordered from loc.x = 0->max */ - public ArrayList getCol() { - return col; + public ArrayList getNorthClues() { + return northClues; } public boolean getDupeFlag(){return dupeFlag;} @@ -270,10 +262,10 @@ public SkyscrapersBoard copy() { for (PuzzleElement e : modifiedData) { copy.getPuzzleElement(e).setModifiable(false); } - copy.rowClues = rowClues; - copy.colClues = colClues; - copy.row = row; - copy.col = col; + copy.eastClues = eastClues; + copy.southClues = southClues; + copy.westClues = westClues; + copy.northClues = northClues; copy.dupeFlag=dupeFlag; copy.viewFlag=viewFlag; diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersExporter.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersExporter.java index 96a41378f..9beed2379 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersExporter.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersExporter.java @@ -30,7 +30,7 @@ protected org.w3c.dom.Element createBoardElement(Document newDocument) { org.w3c.dom.Element axisEast = newDocument.createElement("axis"); axisEast.setAttribute("side", "east"); - for (SkyscrapersClue clue : board.getRowClues()) { + for (SkyscrapersClue clue : board.getEastClues()) { org.w3c.dom.Element clueElement = newDocument.createElement("clue"); clueElement.setAttribute("value", String.valueOf(clue.getData())); clueElement.setAttribute("index", SkyscrapersClue.colNumToString(clue.getIndex())); @@ -40,7 +40,7 @@ protected org.w3c.dom.Element createBoardElement(Document newDocument) { org.w3c.dom.Element axisSouth = newDocument.createElement("axis"); axisSouth.setAttribute("side", "south"); - for (SkyscrapersClue clue : board.getRowClues()) { + for (SkyscrapersClue clue : board.getSouthClues()) { org.w3c.dom.Element clueElement = newDocument.createElement("clue"); clueElement.setAttribute("value", String.valueOf(clue.getData())); clueElement.setAttribute("index", String.valueOf(clue.getIndex())); diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java index 7f9af32aa..6f33e26e6 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java @@ -114,8 +114,8 @@ public void initializeBoard(Node node) throws InvalidFileFormatException { if (treeTentBoard.getRowClues().get(index - 1) != null) { throw new InvalidFileFormatException("TreeTent Importer: duplicate clue index"); }*/ - treeTentBoard.getRow().set(/*index - 1*/i, new SkyscrapersClue(index, i, SkyscrapersType.CLUE_WEST)); - treeTentBoard.getRowClues().set(/*index - 1*/i, new SkyscrapersClue(value, i, SkyscrapersType.CLUE_EAST)); + treeTentBoard.getWestClues().set(/*index - 1*/i, new SkyscrapersClue(index, i, SkyscrapersType.CLUE_WEST)); + treeTentBoard.getEastClues().set(/*index - 1*/i, new SkyscrapersClue(value, i, SkyscrapersType.CLUE_EAST)); } for (int i = 0; i < southClues.getLength(); i++) { @@ -130,8 +130,8 @@ public void initializeBoard(Node node) throws InvalidFileFormatException { if (treeTentBoard.getColClues().get(index - 1) != null) { throw new InvalidFileFormatException("TreeTent Importer: duplicate clue index"); }*/ - treeTentBoard.getCol().set(/*index - 1*/i, new SkyscrapersClue(index, i, SkyscrapersType.CLUE_NORTH)); - treeTentBoard.getColClues().set(/*index - 1*/i, new SkyscrapersClue(value, i, SkyscrapersType.CLUE_SOUTH)); + treeTentBoard.getNorthClues().set(/*index - 1*/i, new SkyscrapersClue(index, i, SkyscrapersType.CLUE_NORTH)); + treeTentBoard.getSouthClues().set(/*index - 1*/i, new SkyscrapersClue(value, i, SkyscrapersType.CLUE_SOUTH)); } if (boardElement.getElementsByTagName("lines").getLength() == 1) { diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersView.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersView.java index e165686bb..75871bc78 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersView.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersView.java @@ -64,11 +64,11 @@ public SkyscrapersView(SkyscrapersBoard board) { for (int i = 0; i < gridSize.height; i++) { //SkyscrapersClueView row = new SkyscrapersClueView(new SkyscrapersClue(i, i, SkyscrapersType.CLUE_WEST)); - SkyscrapersClueView row = new SkyscrapersClueView(board.getRow().get(i)); + SkyscrapersClueView row = new SkyscrapersClueView(board.getWestClues().get(i)); row.setLocation(new Point(0, (i + 1) * elementSize.height)); row.setSize(elementSize); - SkyscrapersClueView clue = new SkyscrapersClueView(board.getRowClues().get(i)); + SkyscrapersClueView clue = new SkyscrapersClueView(board.getEastClues().get(i)); clue.setLocation(new Point((gridSize.height + 1) * elementSize.height, (i + 1) * elementSize.height)); clue.setSize(elementSize); @@ -78,11 +78,11 @@ public SkyscrapersView(SkyscrapersBoard board) { for (int i = 0; i < gridSize.width; i++) { //SkyscrapersClueView col = new SkyscrapersClueView(new SkyscrapersClue(i, i, SkyscrapersType.CLUE_NORTH)); - SkyscrapersClueView col = new SkyscrapersClueView(board.getCol().get(i)); + SkyscrapersClueView col = new SkyscrapersClueView(board.getNorthClues().get(i)); col.setLocation(new Point((i + 1) * elementSize.width, 0)); col.setSize(elementSize); - SkyscrapersClueView clue = new SkyscrapersClueView(board.getColClues().get(i)); + SkyscrapersClueView clue = new SkyscrapersClueView(board.getSouthClues().get(i)); clue.setLocation(new Point((i + 1) * elementSize.width, (gridSize.width + 1) * elementSize.width)); clue.setSize(elementSize); diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java index f03591ad0..8924525d3 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java @@ -26,11 +26,11 @@ public CaseBoard getCaseBoard(Board board) { SkyscrapersBoard currentBoard = (SkyscrapersBoard) board.copy(); currentBoard.setModifiable(false); CaseBoard caseBoard = new CaseBoard(currentBoard, this); - for (SkyscrapersClue data : currentBoard.getRow()) { + for (SkyscrapersClue data : currentBoard.getWestClues()) { System.out.println(data.getType()); caseBoard.addPickableElement(data); } - for (SkyscrapersClue data : currentBoard.getCol()) { + for (SkyscrapersClue data : currentBoard.getNorthClues()) { System.out.println(data.getType()); caseBoard.addPickableElement(data); } @@ -88,14 +88,14 @@ public String checkRuleRaw(TreeTransition transition) { //find changed row/col SkyscrapersClue modClue = null; - for(SkyscrapersClue clue : ((SkyscrapersBoard)childTransitions.get(0).getBoard()).getRow()){ + for(SkyscrapersClue clue : ((SkyscrapersBoard)childTransitions.get(0).getBoard()).getWestClues()){ if(clue.isModified()){ modClue = clue; break; } } if(modClue!=null){ - for(SkyscrapersClue clue : ((SkyscrapersBoard)childTransitions.get(0).getBoard()).getCol()){ + for(SkyscrapersClue clue : ((SkyscrapersBoard)childTransitions.get(0).getBoard()).getNorthClues()){ if(clue.isModified()){ modClue = clue; break; diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java index 1b9dbae3d..a6912ebfb 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java @@ -36,10 +36,10 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { Point loc = cell.getLocation(); //get borders - int west = skyscrapersboard.getRow().get(loc.y).getData(); - int east = skyscrapersboard.getRowClues().get(loc.y).getData(); - int north = skyscrapersboard.getCol().get(loc.x).getData(); - int south = skyscrapersboard.getColClues().get(loc.x).getData(); + int west = skyscrapersboard.getWestClues().get(loc.y).getData(); + int east = skyscrapersboard.getEastClues().get(loc.y).getData(); + int north = skyscrapersboard.getNorthClues().get(loc.x).getData(); + int south = skyscrapersboard.getSouthClues().get(loc.x).getData(); //check row int max = 0; diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java index e762fa337..b28708f9c 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java @@ -45,10 +45,10 @@ public String checkRuleRawAt(TreeTransition transition, PuzzleElement puzzleElem SkyscrapersBoard emptyCase = initialBoard.copy(); emptyCase.getPuzzleElement(finalCell).setData(0); Point loc = finalCell.getLocation(); - int north = initialBoard.getCol().get(loc.x).getData(); - int south = initialBoard.getColClues().get(loc.x).getData(); - int west = initialBoard.getRow().get(loc.y).getData(); - int east = initialBoard.getRowClues().get(loc.y).getData(); + int north = initialBoard.getNorthClues().get(loc.x).getData(); + int south = initialBoard.getSouthClues().get(loc.x).getData(); + int west = initialBoard.getWestClues().get(loc.y).getData(); + int east = initialBoard.getEastClues().get(loc.y).getData(); int max = initialBoard.getHeight(); System.out.println(north); System.out.println(south); diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java index 807afe847..29612e65c 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java @@ -36,10 +36,10 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { Point loc = cell.getLocation(); //get borders - int west = skyscrapersboard.getRow().get(loc.y).getData(); - int east = skyscrapersboard.getRowClues().get(loc.y).getData(); - int north = skyscrapersboard.getCol().get(loc.x).getData(); - int south = skyscrapersboard.getColClues().get(loc.x).getData(); + int west = skyscrapersboard.getWestClues().get(loc.y).getData(); + int east = skyscrapersboard.getEastClues().get(loc.y).getData(); + int north = skyscrapersboard.getNorthClues().get(loc.x).getData(); + int south = skyscrapersboard.getSouthClues().get(loc.x).getData(); //check row int max = 0; diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastCellBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastCellBasicRule.java index f8495c303..91a8141ea 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastCellBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastCellBasicRule.java @@ -48,8 +48,8 @@ public String checkRuleRawAt(TreeTransition transition, PuzzleElement puzzleElem initialBoard.setDupeFlag(true); initialBoard.setViewFlag(false); CellForNumberCaseRule caseRule = new CellForNumberCaseRule(); - ArrayList XCandidates = caseRule.getCasesFor(initialBoard,initialBoard.getRow().get(finalCell.getLocation().y),(Integer)finalCell.getData()); - ArrayList YCandidates = caseRule.getCasesFor(initialBoard,initialBoard.getCol().get(finalCell.getLocation().x),(Integer)finalCell.getData()); + ArrayList XCandidates = caseRule.getCasesFor(initialBoard,initialBoard.getWestClues().get(finalCell.getLocation().y),(Integer)finalCell.getData()); + ArrayList YCandidates = caseRule.getCasesFor(initialBoard,initialBoard.getNorthClues().get(finalCell.getLocation().x),(Integer)finalCell.getData()); initialBoard.setDupeFlag(dupeTemp); initialBoard.setViewFlag(viewTemp); diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/NEdgeBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/NEdgeBasicRule.java index ac210d15d..3bea76813 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/NEdgeBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/NEdgeBasicRule.java @@ -46,16 +46,16 @@ public String checkRuleRawAt(TreeTransition transition, PuzzleElement puzzleElem Point loc = finalCell.getLocation(); int max = initialBoard.getHeight(); - if (initialBoard.getRow().get(loc.y).getData() == max && finalCell.getData() == loc.x + 1) { + if (initialBoard.getWestClues().get(loc.y).getData() == max && finalCell.getData() == loc.x + 1) { return null; } - if (initialBoard.getRowClues().get(loc.y).getData() == max && finalCell.getData() == max - loc.x) { + if (initialBoard.getEastClues().get(loc.y).getData() == max && finalCell.getData() == max - loc.x) { return null; } - if (initialBoard.getCol().get(loc.x).getData() == max && finalCell.getData() == loc.y + 1) { + if (initialBoard.getNorthClues().get(loc.x).getData() == max && finalCell.getData() == loc.y + 1) { return null; } - if (initialBoard.getColClues().get(loc.x).getData() == max && finalCell.getData() == max - loc.y) { + if (initialBoard.getSouthClues().get(loc.x).getData() == max && finalCell.getData() == max - loc.y) { return null; } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java index 7cecdf630..310d448e7 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java @@ -54,16 +54,16 @@ public String checkRuleRawAt(TreeTransition transition, PuzzleElement puzzleElem return super.getInvalidUseOfRuleMessage() + ": Modified cells must be the max"; } - if (loc.x == 0 && initialBoard.getRow().get(loc.y).getData() == 1) { + if (loc.x == 0 && initialBoard.getWestClues().get(loc.y).getData() == 1) { return null; } - else if (loc.x == initialBoard.getWidth() - 1 && initialBoard.getRowClues().get(loc.y).getData() == 1) { + else if (loc.x == initialBoard.getWidth() - 1 && initialBoard.getEastClues().get(loc.y).getData() == 1) { return null; } - else if (loc.y == 0 && initialBoard.getCol().get(loc.x).getData() == 1) { + else if (loc.y == 0 && initialBoard.getNorthClues().get(loc.x).getData() == 1) { return null; } - else if (loc.y == initialBoard.getHeight() - 1 && initialBoard.getColClues().get(loc.x).getData() == 1) { + else if (loc.y == initialBoard.getHeight() - 1 && initialBoard.getSouthClues().get(loc.x).getData() == 1) { return null; } else { return "This cell is not forced."; diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md index ffc68b053..9c53528f9 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md @@ -12,10 +12,12 @@ spreadsheet : https://docs.google.com/spreadsheets/d/1l7aUZtavtysM8dtGnaEIXhBKMR - Cell for number - waiting on ui 4. Refactoring: - Remove references to lightup and treetent in variable names + - View contains a few of these - document utility functions in the reference sheet, COMMENTS! - review and identify dead code - create and add rule icons - check for overrides of by cell functions (ie checkContradiction) + - replace height/width with size (never not square) - replace row,col,rowClues,colClues and corresponding functions with appropriate names 5. Flags - review all basic/contradiction rules to put in terms of the new cases / add flags diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedNumberContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedNumberContradictionRule.java index ad52b3be2..e3b27a777 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedNumberContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedNumberContradictionRule.java @@ -50,7 +50,7 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { } if(!exists){ //and no possible cases - if(caseRule.getCasesFor(board,skyscrapersBoard.getRow().get(loc.y),num).size()==0) { + if(caseRule.getCasesFor(board,skyscrapersBoard.getWestClues().get(loc.y),num).size()==0) { return null; } } @@ -65,7 +65,7 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { } } if(!exists){ - if(caseRule.getCasesFor(board,skyscrapersBoard.getCol().get(loc.x),num).size()==0) { + if(caseRule.getCasesFor(board,skyscrapersBoard.getNorthClues().get(loc.x),num).size()==0) { return null; } } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/skyscrapers_reference_sheet.txt b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/skyscrapers_reference_sheet.txt index d399ca06a..1a131d10a 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/skyscrapers_reference_sheet.txt +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/skyscrapers_reference_sheet.txt @@ -21,6 +21,7 @@ HELPER FUNCTIONS: (check morgue for unused helpers, ctrl+f "helper function") Notes: more than one element type? CODE MORGUE: + - Exporter has no known use, to has not been updated - SkyscapersLine, SkyscrapersLineView Locations: above classes, Board, Importer, CellFactory, View Uses: drawing lines between cells on the board From 5c7bcd3495423b2b9c4fc34c2c0446bdf99289ce Mon Sep 17 00:00:00 2001 From: sveludandi112 Date: Tue, 18 Oct 2022 16:27:46 -0400 Subject: [PATCH 24/45] push --- .../PreemptiveTooFewContradictionRule.java | 77 ++++++++++++++++++ .../PreemptiveTooManyContradictionRule.java | 4 + .../skyscrapers/contradictions/TooFew.png | Bin 0 -> 2413 bytes 3 files changed, 81 insertions(+) create mode 100644 src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveTooFewContradictionRule.java create mode 100644 src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveTooManyContradictionRule.java create mode 100644 src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/TooFew.png diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveTooFewContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveTooFewContradictionRule.java new file mode 100644 index 000000000..d3463ea12 --- /dev/null +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveTooFewContradictionRule.java @@ -0,0 +1,77 @@ +package edu.rpi.legup.puzzle.skyscrapers.rules; + +import edu.rpi.legup.model.gameboard.Board; +import edu.rpi.legup.model.gameboard.CaseBoard; +import edu.rpi.legup.model.gameboard.PuzzleElement; +import edu.rpi.legup.model.rules.ContradictionRule; +import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersBoard; +import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersCell; +import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersClue; +import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersType; + +import java.awt.*; +import java.util.*; +import java.util.List; + +public class PreemptiveTooFewContradictionRule extends ContradictionRule{ + + public PreemptiveTooFewContradictionRule() { + super("SKYS-CONT-0006", "Preemptive Too Few", + "Less skyscrapers are visible than there should be in an incomplete row/col", + "edu/rpi/legup/images/skyscrapers/contradictions/TooFew.png"); + } + + @Override + public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { + SkyscrapersCell cell = (SkyscrapersCell) puzzleElement; + SkyscrapersBoard skyscrapersboard = (SkyscrapersBoard) board; + Point loc = cell.getLocation(); + + //get borders + int west = skyscrapersboard.getWestClues().get(loc.y).getData(); + int east = skyscrapersboard.getEastClues().get(loc.y).getData(); + int north = skyscrapersboard.getNorthClues().get(loc.x).getData(); + int south = skyscrapersboard.getSouthClues().get(loc.x).getData(); + + + + InsufficientVisibilityContradictionRule tooFew = new InsufficientVisibilityContradictionRule(); + CellForNumberCaseRule caseRule = new CellForNumberCaseRule(); + System.out.println("1"); + + + //Check Row + + + //check west + + + //create board with every possible row permutation given the current cell + + System.out.println("2"); + List list = caseRule.getCasesFor(board, skyscrapersBoard.getWestClues().get(loc.y), 1); + + + +// for(int i = 0; i < list.size(); i++) +// System.out.println(list.get(i)); + + System.out.println("3"); + + + + + //for each row call getCasesFor for each number progressively + //getCasesFor for each clue + + //for each clue iterate 1-n for number + + // + return null; + + + } + + + +} diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveTooManyContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveTooManyContradictionRule.java new file mode 100644 index 000000000..f71b6f6ff --- /dev/null +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveTooManyContradictionRule.java @@ -0,0 +1,4 @@ +package edu.rpi.legup.puzzle.skyscrapers.rules; + +public class PreemptiveTooManyContradictionRule { +} diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/TooFew.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/TooFew.png new file mode 100644 index 0000000000000000000000000000000000000000..64fb4fc865c281f533be041dc6aad136e9e208ac GIT binary patch literal 2413 zcmb_d2~bm67EM?>h^T-dw&I4OECCu&qmhK&h(bsMvTImOr)_Z{fe*@m#h2bZt~B9I4g)4>@8ktqN% zhXM+;JecD^IszX|qq8}@agk_2rWdrNJA*_ma?3(Xu$GKQ;Q|0fhMei+pmv<@3}PZ% z1dzdKl0G~<4AwT0LGJwgd_sIY00>f3Q#llb%!4lAm3Sa1oNf3OXF$ZESR#mQHW2}c zxak-zj}qPjuLKWTLJ;H@k$_1AWsq%n*)+{k%aXzoeQTG(0f3JmKW1iT78DeKl%Iq0 zWx*}X1?vj7_5Xe#t_$b-!1}8~j(CNF0Vx~M*;AQEArM%BgPpb8g_F}oXR-$EG?Fld z>T0DAbG!+q@iaN3Yu?J9#{4z|O+_jI1Wt7y%BmPB>UE%x5Bqb)r2~`ZBJ{9-_;}_< z1d89jzcUdcQMq?1=&4G#7ISDUSKw5|T>P7#Z}g_dSW<*lDZK0&x?>bM)<_0!*cKSq z;EZdVmo$8iRR^6cbNv|pIeO=s;_;zW(&!bBq|xG5I@77D1Pg?~!UL5@<<4VLycq9P zOk}FKOCOu`BNthsst`gJLgP&<+Q6a|nnZR4uI04*2m&r(w6I%lL`grh1b!Dd=*R+O zWK*r_*r?r5PTw>OA+I7DD&%fVjBuh=3fm0Ft)IzX5E@(^j~;s+B=s7q=#bz zG+|=81|K>wtF(sWwgP=N^fsGsxn@M<=db-W*IeWXd*9_B>2+YKH_WQ>`eh>0uQ4)P zi0jz=*7W#*%Un#o&etK->u2PlENaG+;v-WJNb8I24Vy{pw|JnfgB@)mMQG%P2U31i z7~FL-L#h?3h@!X!4NM$V7?}T`sY_k5MzC zq>0h!uB3Isr@IW&a3s42S82Btglb;ydWNy>eLs7+lM<*qse~x6DIDqX9CgktXS;(x-2{O&!@H47{d99ba0b_XG2khf%|A9ZNYkS& zGl`kA$#BE$g@>tUla6<1Ab0z!=jmie6%wjtosbjig6p-}(jxM+OQLd-5<&3OWEVO$ z+K(Zv1}=$LN#LbZui;B({X^m&%}dQ@_;U7p-0Qs;*Jeml7Pmgq4JbU!-Jvd+nN9-h zsC2VoP3m(`EUdWdUCqzT;DxXWPwcLdXA-rGX*kK*TrJ~lzxf5bll(XK_{$osV z&thMWSoV}mDB8Sado|WMm9qmG(rsdsi`!*Q;_sdQEa}k%#sP&qtszY+`ScWWjEa$U z?U-|1yL4owt^+AoLa;w=D_s2T+y34>VAC1prrlTV`?VqYY!bDOy3-9LD`_qWQ|cQ` z43BPB<}$+xniv^T&0wZ{B-x#?+^~{>M^X~1*W2G*qjy%%qUF_!O)|pUqB(c)9E3FD z?a~c>Tr9j>k!zbm;bnTS)!lmX*e?gO?_V~$MPzwOPMbF74%T_XQ_>i^ceQQ)NtSZP z!3d^G{}DXlrP;?`-n72;!pqe#c^%ceepU))8&r}*Sl4o&(?NKscNA72fE6W z$=J<-^1c-=)Z<~k%b)AH__M~o(h>R{Q~d53A@bm;PS)gGe$d;k?{q+4okSF05WWz} zHwRys5Aai?*J<6#4$#zReD!0Hfs9YZ`L4Y`m@j99mJ2!#V+|@j?cCo{2HP>&GWff>n0hi0<<9ZvP!xGYiifewZ(zqI{dYKh_Fvj!l`!HRF}O~r5DXu_4mhJDnj+}QQ(zjPEJcAuG=%Sm3pT#u;A$J260X!36`ePCs=e2g3_=unwQ)Q4Kb%P3WS$2T{ADH77x06= Z!k#nZ(snP>&VW}p#K9hG$FT8>`#a>+vu^+Z literal 0 HcmV?d00001 From e403ee99571f67251a50853e08bc6e6d448ffd9b Mon Sep 17 00:00:00 2001 From: ThisMatt Date: Tue, 18 Oct 2022 16:56:59 -0400 Subject: [PATCH 25/45] Fixed Max and OneEdge generalized to use case rules --- .../rules/CellForNumberCaseRule.java | 5 +- .../skyscrapers/rules/FixedMaxBasicRule.java | 56 +++++++++++-------- .../skyscrapers/rules/OneEdgeBasicRule.java | 43 ++++++-------- .../PreemptiveTooManyContradictionRule.java | 4 -- .../legup/puzzle/skyscrapers/rules/TODO.md | 4 +- 5 files changed, 53 insertions(+), 59 deletions(-) delete mode 100644 src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveTooManyContradictionRule.java diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java index 8924525d3..d52fb3ff9 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java @@ -61,9 +61,8 @@ public ArrayList getCasesFor(Board board, PuzzleElement puzzleElement, In passed = passed && DupeRule.checkContradictionAt(newCase,newCell)!=null; } if(skyscrapersboard.getViewFlag()){ - InsufficientVisibilityContradictionRule fewRule = new InsufficientVisibilityContradictionRule(); - ExceedingVisibilityContradictionRule moreRule = new ExceedingVisibilityContradictionRule(); - passed = passed && fewRule.checkContradictionAt(newCase,newCell)!=null && moreRule.checkContradictionAt(newCase,newCell)!=null; + PreemptiveTooFewContradictionRule ViewRule = new PreemptiveTooFewContradictionRule(); + passed = passed && ViewRule.checkContradictionAt(newCase,newCell)!=null; } if(passed){cases.add(newCase);} diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java index b28708f9c..030567a94 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java @@ -10,6 +10,7 @@ import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersType; import java.awt.Point; +import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.Set; @@ -18,7 +19,7 @@ public class FixedMaxBasicRule extends BasicRule { public FixedMaxBasicRule() { super("SKYS-BASC-0001", "Fixed Max", - "If the sum of two opposing edges is n+1, the maximum number appears at a position k spaces away from the edge, where k is the number at that edge.", + "This is the last cell for this number that does not create a visibility contradiction.", "edu/rpi/legup/images/skyscrapers/rules/FixedMax.png"); } @@ -42,34 +43,41 @@ public String checkRuleRawAt(TreeTransition transition, PuzzleElement puzzleElem return super.getInvalidUseOfRuleMessage() + ": Modified cells must transition from unknown to number"; } - SkyscrapersBoard emptyCase = initialBoard.copy(); - emptyCase.getPuzzleElement(finalCell).setData(0); - Point loc = finalCell.getLocation(); - int north = initialBoard.getNorthClues().get(loc.x).getData(); - int south = initialBoard.getSouthClues().get(loc.x).getData(); - int west = initialBoard.getWestClues().get(loc.y).getData(); - int east = initialBoard.getEastClues().get(loc.y).getData(); - int max = initialBoard.getHeight(); - System.out.println(north); - System.out.println(south); - if (north + south != max + 1 && west + east != max + 1) { - System.out.println("111"); - return super.getInvalidUseOfRuleMessage() + ": Opposing clues must add up to max"; - } + //set all rules used by case rule to false except for dupe, get all cases + boolean dupeTemp = initialBoard.getDupeFlag(); + boolean viewTemp = initialBoard.getViewFlag(); + initialBoard.setDupeFlag(false); + initialBoard.setViewFlag(true); + CellForNumberCaseRule caseRule = new CellForNumberCaseRule(); + ArrayList XCandidates = caseRule.getCasesFor(initialBoard,initialBoard.getWestClues().get(finalCell.getLocation().y),(Integer)finalCell.getData()); + ArrayList YCandidates = caseRule.getCasesFor(initialBoard,initialBoard.getNorthClues().get(finalCell.getLocation().x),(Integer)finalCell.getData()); + initialBoard.setDupeFlag(dupeTemp); + initialBoard.setViewFlag(viewTemp); - if (finalCell.getData() != initialBoard.getWidth()) { - return super.getInvalidUseOfRuleMessage() + ": Modified cells must be the max"; - } + System.out.println(XCandidates.size()); + System.out.println(YCandidates.size()); - if (north + south == max + 1 && loc.y + 1 == north) { - return null; - } - if (west + east == max + 1 && loc.x + 1 == west) { + //return null if either pass, both messages otherwise + String xCheck = candidateCheck(XCandidates,puzzleElement,finalCell); + String yCheck = candidateCheck(YCandidates,puzzleElement,finalCell); + if(xCheck==null || yCheck==null){ return null; } + return super.getInvalidUseOfRuleMessage() + "\nRow" + xCheck + "\nCol" + yCheck; + } - return super.getInvalidUseOfRuleMessage() + ": This cell is not forced."; - + //helper to check if candidate list is valid + private String candidateCheck(ArrayList candidates,PuzzleElement puzzleElement, SkyscrapersCell finalCell){ + if(candidates.size() == 1){ + if(((SkyscrapersCell) candidates.get(0).getPuzzleElement(puzzleElement)).getType() == SkyscrapersType.Number) { + if (candidates.get(0).getPuzzleElement(puzzleElement).getData() == finalCell.getData()) { + return null; + } + return ": Wrong number in the cell."; + } + return ": No case for this cell."; + } + return ": This cell is not forced."; } private boolean isForced(SkyscrapersBoard board, SkyscrapersCell cell) { diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java index 310d448e7..557ea4d5b 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java @@ -10,6 +10,7 @@ import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersType; import java.awt.Point; +import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.Set; @@ -18,7 +19,7 @@ public class OneEdgeBasicRule extends BasicRule { public OneEdgeBasicRule() { super("SKYS-BASC-0005", "One Edge", - "If you have a 1 on an edge, put n in the adjacent square.", + "This is the last number for this cell that does not create a visibility contradiction", "edu/rpi/legup/images/skyscrapers/rules/OneEdge.png"); } @@ -42,32 +43,24 @@ public String checkRuleRawAt(TreeTransition transition, PuzzleElement puzzleElem return super.getInvalidUseOfRuleMessage() + ": Modified cells must transition from unknown to number"; } - SkyscrapersBoard emptyCase = initialBoard.copy(); - emptyCase.getPuzzleElement(finalCell).setData(0); - Point loc = finalCell.getLocation(); + //set all rules used by case rule to false except for dupe, get all cases + boolean dupeTemp = initialBoard.getDupeFlag(); + boolean viewTemp = initialBoard.getViewFlag(); + initialBoard.setDupeFlag(false); + initialBoard.setViewFlag(true); + NumberForCellCaseRule caseRule = new NumberForCellCaseRule(); + ArrayList candidates = caseRule.getCases(initialBoard,puzzleElement); + initialBoard.setDupeFlag(dupeTemp); + initialBoard.setViewFlag(viewTemp); - if (loc.x != 0 && loc.x != initialBoard.getWidth() - 1 && loc.y != 0 && loc.y != initialBoard.getHeight() - 1) { - return super.getInvalidUseOfRuleMessage() + ": Modified cells must be on the edge"; - } - - if (finalCell.getData() != initialBoard.getWidth()) { - return super.getInvalidUseOfRuleMessage() + ": Modified cells must be the max"; - } - - if (loc.x == 0 && initialBoard.getWestClues().get(loc.y).getData() == 1) { - return null; - } - else if (loc.x == initialBoard.getWidth() - 1 && initialBoard.getEastClues().get(loc.y).getData() == 1) { - return null; - } - else if (loc.y == 0 && initialBoard.getNorthClues().get(loc.x).getData() == 1) { - return null; - } - else if (loc.y == initialBoard.getHeight() - 1 && initialBoard.getSouthClues().get(loc.x).getData() == 1) { - return null; - } else { - return "This cell is not forced."; + //check if given value is the only remaining value + if(candidates.size() == 1){ + if(candidates.get(0).getPuzzleElement(puzzleElement).getData() == finalCell.getData()){ + return null; + } + return super.getInvalidUseOfRuleMessage() + ": Wrong number in the cell."; } + return super.getInvalidUseOfRuleMessage() + ":This cell is not forced."; } private boolean isForced(SkyscrapersBoard board, SkyscrapersCell cell) { diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveTooManyContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveTooManyContradictionRule.java deleted file mode 100644 index f71b6f6ff..000000000 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveTooManyContradictionRule.java +++ /dev/null @@ -1,4 +0,0 @@ -package edu.rpi.legup.puzzle.skyscrapers.rules; - -public class PreemptiveTooManyContradictionRule { -} diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md index 9c53528f9..ea520b1ce 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md @@ -18,10 +18,8 @@ spreadsheet : https://docs.google.com/spreadsheets/d/1l7aUZtavtysM8dtGnaEIXhBKMR - create and add rule icons - check for overrides of by cell functions (ie checkContradiction) - replace height/width with size (never not square) - - replace row,col,rowClues,colClues and corresponding functions with appropriate names 5. Flags - review all basic/contradiction rules to put in terms of the new cases / add flags - - edit exporter to include flags in xml file format - - discuss use/not of unresolved flag + - edit exporter to include flags in xml file format (if needed) 6. Documentation - UML diagram(s) \ No newline at end of file From d10e78e7481036dd174b876a412e9fe025bd58f3 Mon Sep 17 00:00:00 2001 From: ThisMatt Date: Tue, 18 Oct 2022 21:36:25 -0400 Subject: [PATCH 26/45] CellForNumber now lets user select number --- .../rules/CellForNumberCaseRule.java | 21 ++++++++++++++++--- .../legup/puzzle/skyscrapers/rules/TODO.md | 1 + 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java index d52fb3ff9..e3d30c64d 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java @@ -8,6 +8,7 @@ import edu.rpi.legup.puzzle.skyscrapers.*; import org.apache.commons.lang3.ObjectUtils; +import javax.swing.*; import java.awt.*; import java.util.ArrayList; import java.util.List; @@ -44,7 +45,6 @@ public ArrayList getCasesFor(Board board, PuzzleElement puzzleElement, In SkyscrapersClue clue = (SkyscrapersClue) puzzleElement; SkyscrapersBoard skyscrapersboard = (SkyscrapersBoard) board; - List openCells = skyscrapersboard.getRowCol(clue.getClueIndex(),SkyscrapersType.UNKNOWN,clue.getType()==SkyscrapersType.CLUE_WEST); for(SkyscrapersCell cell : openCells){ Board newCase = board.copy(); @@ -73,8 +73,21 @@ public ArrayList getCasesFor(Board board, PuzzleElement puzzleElement, In @Override public ArrayList getCases(Board board, PuzzleElement puzzleElement) { - int number = 1; //hard-coded for now - return getCasesFor(board,puzzleElement,number); + int size = ((SkyscrapersBoard)board).getWidth(); + Object[] possibleValues = new Object[size]; + for(int i=0; i Date: Tue, 18 Oct 2022 23:11:11 -0400 Subject: [PATCH 27/45] PreemptiveVisibilityContradictionRule progress/unfinished --- .../PreemptiveTooFewContradictionRule.java | 77 ------------ .../PreemptiveTooManyContradictionRule.java | 4 - ...PreemptiveVisibilityContradictionRule.java | 110 ++++++++++++++++++ .../{TooFew.png => PreemptiveVisibility.png} | Bin 4 files changed, 110 insertions(+), 81 deletions(-) delete mode 100644 src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveTooFewContradictionRule.java delete mode 100644 src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveTooManyContradictionRule.java create mode 100644 src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveVisibilityContradictionRule.java rename src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/{TooFew.png => PreemptiveVisibility.png} (100%) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveTooFewContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveTooFewContradictionRule.java deleted file mode 100644 index d3463ea12..000000000 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveTooFewContradictionRule.java +++ /dev/null @@ -1,77 +0,0 @@ -package edu.rpi.legup.puzzle.skyscrapers.rules; - -import edu.rpi.legup.model.gameboard.Board; -import edu.rpi.legup.model.gameboard.CaseBoard; -import edu.rpi.legup.model.gameboard.PuzzleElement; -import edu.rpi.legup.model.rules.ContradictionRule; -import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersBoard; -import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersCell; -import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersClue; -import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersType; - -import java.awt.*; -import java.util.*; -import java.util.List; - -public class PreemptiveTooFewContradictionRule extends ContradictionRule{ - - public PreemptiveTooFewContradictionRule() { - super("SKYS-CONT-0006", "Preemptive Too Few", - "Less skyscrapers are visible than there should be in an incomplete row/col", - "edu/rpi/legup/images/skyscrapers/contradictions/TooFew.png"); - } - - @Override - public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { - SkyscrapersCell cell = (SkyscrapersCell) puzzleElement; - SkyscrapersBoard skyscrapersboard = (SkyscrapersBoard) board; - Point loc = cell.getLocation(); - - //get borders - int west = skyscrapersboard.getWestClues().get(loc.y).getData(); - int east = skyscrapersboard.getEastClues().get(loc.y).getData(); - int north = skyscrapersboard.getNorthClues().get(loc.x).getData(); - int south = skyscrapersboard.getSouthClues().get(loc.x).getData(); - - - - InsufficientVisibilityContradictionRule tooFew = new InsufficientVisibilityContradictionRule(); - CellForNumberCaseRule caseRule = new CellForNumberCaseRule(); - System.out.println("1"); - - - //Check Row - - - //check west - - - //create board with every possible row permutation given the current cell - - System.out.println("2"); - List list = caseRule.getCasesFor(board, skyscrapersBoard.getWestClues().get(loc.y), 1); - - - -// for(int i = 0; i < list.size(); i++) -// System.out.println(list.get(i)); - - System.out.println("3"); - - - - - //for each row call getCasesFor for each number progressively - //getCasesFor for each clue - - //for each clue iterate 1-n for number - - // - return null; - - - } - - - -} diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveTooManyContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveTooManyContradictionRule.java deleted file mode 100644 index f71b6f6ff..000000000 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveTooManyContradictionRule.java +++ /dev/null @@ -1,4 +0,0 @@ -package edu.rpi.legup.puzzle.skyscrapers.rules; - -public class PreemptiveTooManyContradictionRule { -} diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveVisibilityContradictionRule.java new file mode 100644 index 000000000..88ecd60fe --- /dev/null +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveVisibilityContradictionRule.java @@ -0,0 +1,110 @@ +package edu.rpi.legup.puzzle.skyscrapers.rules; + +import edu.rpi.legup.model.gameboard.Board; +import edu.rpi.legup.model.gameboard.PuzzleElement; +import edu.rpi.legup.model.rules.ContradictionRule; +import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersBoard; +import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersCell; + +import java.awt.*; +import java.util.List; + +public class PreemptiveVisibilityContradictionRule extends ContradictionRule{ + + public PreemptiveVisibilityContradictionRule() { + super("SKYS-CONT-0006", "Preemptive Visibility", + "Visibility constraints are not met given an incomplete row/col", + "edu/rpi/legup/images/skyscrapers/contradictions/PreemptiveVisibility.png"); + } + + @Override + public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { + SkyscrapersBoard skyscrapersBoard = (SkyscrapersBoard) board; + SkyscrapersCell cell = (SkyscrapersCell) puzzleElement; + Point loc = cell.getLocation(); + + //get borders + int west = skyscrapersBoard.getWestClues().get(loc.y).getData(); + int east = skyscrapersBoard.getEastClues().get(loc.y).getData(); + int north = skyscrapersBoard.getNorthClues().get(loc.x).getData(); + int south = skyscrapersBoard.getSouthClues().get(loc.x).getData(); + + InsufficientVisibilityContradictionRule tooFew = new InsufficientVisibilityContradictionRule(); + ExceedingVisibilityContradictionRule tooMany = new ExceedingVisibilityContradictionRule(); + CellForNumberCaseRule caseRule = new CellForNumberCaseRule(); + + + + + // find all cases for the corresponding row and column for each possible skyscraper height + for(int i = 0; i < skyscrapersBoard.getWidth(); i++) { + int num = i + 1; + //find every case board for a height + + //check row west clue + List westBoards = caseRule.getCasesFor(board, skyscrapersBoard.getWestClues().get(loc.y), num); + String tooFewWest; + String tooManyWest; + boolean contradictionWest = true; + //check if each case board has a contradiction + for(int j = 0; j < westBoards.size(); j++) { + //checks if there is a contradiction given the row based on the west clue + tooFewWest = tooFew.checkContradictionAt(westBoards.get(j), cell); // is cell the correct puzzle element to check? + tooManyWest = tooMany.checkContradictionAt(westBoards.get(j), cell); + if(tooFewWest != null || tooManyWest != null) {// !null means there isn't a contradiction, so there must be a valid permutation of the array + contradictionWest = false; + } + } + + //check row east clue + List eastBoards = caseRule.getCasesFor(board, skyscrapersBoard.getEastClues().get(loc.y), num); + String tooFewEast; + String tooManyEast; + boolean contradictionEast = true; + for(int j = 0; j < eastBoards.size(); j++) { + tooFewEast = tooFew.checkContradictionAt(eastBoards.get(j), cell); + tooManyEast = tooMany.checkContradictionAt(eastBoards.get(j), cell); + if(tooFewEast != null || tooManyEast != null) { + contradictionEast = false; + } + } + + //check col north clue + List northBoards = caseRule.getCasesFor(board, skyscrapersBoard.getNorthClues().get(loc.x), num); + String tooFewNorth; + String tooManyNorth; + boolean contradictionNorth = true; + for(int j = 0; j < northBoards.size(); j++) { + tooFewNorth = tooFew.checkContradictionAt(northBoards.get(j), cell); + tooManyNorth = tooMany.checkContradictionAt(northBoards.get(j), cell); + if(tooFewNorth != null || tooManyNorth != null) { + contradictionNorth = false; + } + } + + //check col south clue + List southBoards = caseRule.getCasesFor(board, skyscrapersBoard.getSouthClues().get(loc.x), num); + String tooFewSouth; + String tooManySouth; + boolean contradictionSouth = true; + for(int j = 0; j < southBoards.size(); j++) { + tooFewSouth = tooFew.checkContradictionAt(southBoards.get(j), cell); + tooManySouth = tooMany.checkContradictionAt(southBoards.get(j), cell); + if(tooFewSouth != null || tooManySouth != null) { + contradictionSouth = false; + } + } + + //if every possible permutation results in contradictions + if(contradictionWest && contradictionEast && contradictionNorth && contradictionSouth) + return null; + return super.getNoContradictionMessage(); + } + + return null; + + } + + + +} diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/TooFew.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/PreemptiveVisibility.png similarity index 100% rename from src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/TooFew.png rename to src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/PreemptiveVisibility.png From 091390b6e6e679ded154b3bd5372c15b8c2f54f9 Mon Sep 17 00:00:00 2001 From: ThisMatt Date: Wed, 19 Oct 2022 08:46:55 -0400 Subject: [PATCH 28/45] Fixed bug in CellForNumber sanity checks, removed unresolvedFlag --- .../puzzle/skyscrapers/SkyscrapersBoard.java | 10 +++++---- .../skyscrapers/SkyscrapersImporter.java | 1 - .../rules/CellForNumberCaseRule.java | 21 +++---------------- .../legup/puzzle/skyscrapers/rules/TODO.md | 2 -- 4 files changed, 9 insertions(+), 25 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java index 2d8724352..88f28dddf 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java @@ -24,7 +24,9 @@ public class SkyscrapersBoard extends GridBoard { private boolean viewFlag = false; private boolean dupeFlag = false; - private boolean unresolvedFlag = false; + + private SkyscrapersClue modClue = null; + //helper variable for case rule verification, tracks recently modified row/col public SkyscrapersBoard(int width, int height) { super(width, height); @@ -80,10 +82,11 @@ public ArrayList getNorthClues() { public boolean getDupeFlag(){return dupeFlag;} public boolean getViewFlag(){return viewFlag;} - public boolean getUnresolvedFlag(){return unresolvedFlag;} public void setDupeFlag(boolean newFlag){dupeFlag = newFlag ;} public void setViewFlag(boolean newFlag){viewFlag = newFlag;} - public void setUnresolvedFlag(boolean newFlag){unresolvedFlag = newFlag;} + + public SkyscrapersClue getmodClue(){return modClue;} + public void setModClue(SkyscrapersClue newClue){modClue = newClue ;} @Override public SkyscrapersCell getCell(int x, int y) { @@ -269,7 +272,6 @@ public SkyscrapersBoard copy() { copy.dupeFlag=dupeFlag; copy.viewFlag=viewFlag; - copy.unresolvedFlag=unresolvedFlag; return copy; } } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java index 6f33e26e6..5edbae4b6 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java @@ -148,7 +148,6 @@ public void initializeBoard(Node node) throws InvalidFileFormatException { Element flags = (Element) flagList.item(0); if(flags.hasAttribute("dupe")){treeTentBoard.setDupeFlag(Boolean.parseBoolean(flags.getAttribute("dupe")));} if(flags.hasAttribute("view")){treeTentBoard.setViewFlag(Boolean.parseBoolean(flags.getAttribute("view")));} - if(flags.hasAttribute("empty")){treeTentBoard.setUnresolvedFlag(Boolean.parseBoolean(flags.getAttribute("empty")));} } puzzle.setCurrentBoard(treeTentBoard); diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java index e3d30c64d..71fb6f312 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java @@ -47,12 +47,11 @@ public ArrayList getCasesFor(Board board, PuzzleElement puzzleElement, In List openCells = skyscrapersboard.getRowCol(clue.getClueIndex(),SkyscrapersType.UNKNOWN,clue.getType()==SkyscrapersType.CLUE_WEST); for(SkyscrapersCell cell : openCells){ - Board newCase = board.copy(); + SkyscrapersBoard newCase = skyscrapersboard.copy(); PuzzleElement newCell = newCase.getPuzzleElement(cell); newCell.setData(number); - - newCase.getPuzzleElement(clue).setModified(true); newCase.addModifiedData(newCell); + newCase.setModClue((SkyscrapersClue)newCase.getPuzzleElement(clue)); //if flags boolean passed = true; @@ -99,21 +98,7 @@ public String checkRuleRaw(TreeTransition transition) { } //find changed row/col - SkyscrapersClue modClue = null; - for(SkyscrapersClue clue : ((SkyscrapersBoard)childTransitions.get(0).getBoard()).getWestClues()){ - if(clue.isModified()){ - modClue = clue; - break; - } - } - if(modClue!=null){ - for(SkyscrapersClue clue : ((SkyscrapersBoard)childTransitions.get(0).getBoard()).getNorthClues()){ - if(clue.isModified()){ - modClue = clue; - break; - } - } - } + SkyscrapersClue modClue = ((SkyscrapersBoard)childTransitions.get(0).getBoard()).getmodClue(); System.out.println(modClue.getType()); System.out.println(modClue.getClueIndex()); diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md index 981e78011..294119409 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md @@ -9,8 +9,6 @@ spreadsheet : https://docs.google.com/spreadsheets/d/1l7aUZtavtysM8dtGnaEIXhBKMR - Generalize visibility rules to non-full lines - Figure out why these aren't static methods 3. Case Rules: - - Cell for number - waiting on ui - - Bug where modClue is incorrect after modifying preceding row/col 4. Refactoring: - Remove references to lightup and treetent in variable names - View contains a few of these From 0a5c9abbf654307783265e0eb417284de72615e7 Mon Sep 17 00:00:00 2001 From: ThisMatt Date: Wed, 19 Oct 2022 17:54:28 -0400 Subject: [PATCH 29/45] Error is now printed if case rule produces 0 cases --- .../legup/history/AutoCaseRuleCommand.java | 4 +++ .../rules/CellForNumberCaseRule.java | 35 ++++++++++--------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/main/java/edu/rpi/legup/history/AutoCaseRuleCommand.java b/src/main/java/edu/rpi/legup/history/AutoCaseRuleCommand.java index ae5f62f22..f6f67c8d7 100644 --- a/src/main/java/edu/rpi/legup/history/AutoCaseRuleCommand.java +++ b/src/main/java/edu/rpi/legup/history/AutoCaseRuleCommand.java @@ -105,6 +105,10 @@ public String getErrorString() { return "The selected data element is not pickable with this case rule."; } + if(caseRule.getCases(caseBoard.getBaseBoard(), elementView.getPuzzleElement()).size() == 0){ + return "The selection must produce at least one case"; + } + return null; } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java index 71fb6f312..a03245cb7 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java @@ -22,6 +22,8 @@ public CellForNumberCaseRule() { "edu/rpi/legup/images/skyscrapers/cases/CellForNumber.png"); } + private Integer selectedNumber; + @Override public CaseBoard getCaseBoard(Board board) { SkyscrapersBoard currentBoard = (SkyscrapersBoard) board.copy(); @@ -35,11 +37,26 @@ public CaseBoard getCaseBoard(Board board) { System.out.println(data.getType()); caseBoard.addPickableElement(data); } + + //selects integer before checking Command.canExecute for use in Command.getErrorString + int size = ((SkyscrapersBoard)board).getWidth(); + Object[] possibleValues = new Object[size]; + for(int i=0; i getCasesFor(Board board, PuzzleElement puzzleElement, Integer number){ - //return null; ArrayList cases = new ArrayList<>(); SkyscrapersClue clue = (SkyscrapersClue) puzzleElement; @@ -72,21 +89,7 @@ public ArrayList getCasesFor(Board board, PuzzleElement puzzleElement, In @Override public ArrayList getCases(Board board, PuzzleElement puzzleElement) { - int size = ((SkyscrapersBoard)board).getWidth(); - Object[] possibleValues = new Object[size]; - for(int i=0; i Date: Tue, 25 Oct 2022 20:07:04 -0400 Subject: [PATCH 30/45] PreemptiveVisibilityContradictionRule completed + tested --- ...PreemptiveVisibilityContradictionRule.java | 174 ++++++++++++------ 1 file changed, 115 insertions(+), 59 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveVisibilityContradictionRule.java index 88ecd60fe..88a9dd8f7 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveVisibilityContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveVisibilityContradictionRule.java @@ -7,9 +7,11 @@ import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersCell; import java.awt.*; +import java.util.Queue; +import java.util.LinkedList; import java.util.List; -public class PreemptiveVisibilityContradictionRule extends ContradictionRule{ +public class PreemptiveVisibilityContradictionRule extends ContradictionRule { public PreemptiveVisibilityContradictionRule() { super("SKYS-CONT-0006", "Preemptive Visibility", @@ -17,92 +19,146 @@ public PreemptiveVisibilityContradictionRule() { "edu/rpi/legup/images/skyscrapers/contradictions/PreemptiveVisibility.png"); } + /** + * Checks whether there is an instance of a visibility contradiction in every possible row/col based on the specific + * puzzleElement index using this rule + * + * @param board board to check contradiction + * @param puzzleElement equivalent puzzleElement + * @return null if the all possible rows/cols contain a contradiction at the specified puzzleElement, + * otherwise error message + */ @Override public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { SkyscrapersBoard skyscrapersBoard = (SkyscrapersBoard) board; SkyscrapersCell cell = (SkyscrapersCell) puzzleElement; Point loc = cell.getLocation(); - //get borders - int west = skyscrapersBoard.getWestClues().get(loc.y).getData(); - int east = skyscrapersBoard.getEastClues().get(loc.y).getData(); - int north = skyscrapersBoard.getNorthClues().get(loc.x).getData(); - int south = skyscrapersBoard.getSouthClues().get(loc.x).getData(); - + //Initialize instances of necessary contradiction and case rules InsufficientVisibilityContradictionRule tooFew = new InsufficientVisibilityContradictionRule(); ExceedingVisibilityContradictionRule tooMany = new ExceedingVisibilityContradictionRule(); CellForNumberCaseRule caseRule = new CellForNumberCaseRule(); - - + //Initialize skyscraperBoard queues for rows and cols + Queue rowQ = new LinkedList<>(); + rowQ.add(skyscrapersBoard); + Queue colQ = new LinkedList<>(); + colQ.add(skyscrapersBoard); // find all cases for the corresponding row and column for each possible skyscraper height + + //Add every possible case for all heights for each corresponding row and column for(int i = 0; i < skyscrapersBoard.getWidth(); i++) { int num = i + 1; - //find every case board for a height //check row west clue - List westBoards = caseRule.getCasesFor(board, skyscrapersBoard.getWestClues().get(loc.y), num); - String tooFewWest; - String tooManyWest; - boolean contradictionWest = true; - //check if each case board has a contradiction - for(int j = 0; j < westBoards.size(); j++) { - //checks if there is a contradiction given the row based on the west clue - tooFewWest = tooFew.checkContradictionAt(westBoards.get(j), cell); // is cell the correct puzzle element to check? - tooManyWest = tooMany.checkContradictionAt(westBoards.get(j), cell); - if(tooFewWest != null || tooManyWest != null) {// !null means there isn't a contradiction, so there must be a valid permutation of the array - contradictionWest = false; + List rows; + + for(int j = 0; j < rowQ.size(); j++) { + SkyscrapersBoard temp = rowQ.poll(); //get row from the top of the stack + + //set flags + boolean dupeTemp = temp.getDupeFlag(); + boolean viewTemp = temp.getViewFlag(); + temp.setDupeFlag(true); + temp.setViewFlag(false); + + //get all cases for corresponding row based on west clue + rows = caseRule.getCasesFor(temp, skyscrapersBoard.getWestClues().get(loc.y), num); + + //reset flags + temp.setDupeFlag(dupeTemp); + temp.setViewFlag(viewTemp); + + //add all row cases to row queue + if (rows.size() == 0) + rowQ.add(temp); + else { + for (Board k : rows) { + rowQ.add((SkyscrapersBoard) k); + } } } - //check row east clue - List eastBoards = caseRule.getCasesFor(board, skyscrapersBoard.getEastClues().get(loc.y), num); - String tooFewEast; - String tooManyEast; - boolean contradictionEast = true; - for(int j = 0; j < eastBoards.size(); j++) { - tooFewEast = tooFew.checkContradictionAt(eastBoards.get(j), cell); - tooManyEast = tooMany.checkContradictionAt(eastBoards.get(j), cell); - if(tooFewEast != null || tooManyEast != null) { - contradictionEast = false; - } - } //check col north clue - List northBoards = caseRule.getCasesFor(board, skyscrapersBoard.getNorthClues().get(loc.x), num); - String tooFewNorth; - String tooManyNorth; - boolean contradictionNorth = true; - for(int j = 0; j < northBoards.size(); j++) { - tooFewNorth = tooFew.checkContradictionAt(northBoards.get(j), cell); - tooManyNorth = tooMany.checkContradictionAt(northBoards.get(j), cell); - if(tooFewNorth != null || tooManyNorth != null) { - contradictionNorth = false; + List cols; + + for(int j = 0; j < colQ.size(); j++) { + SkyscrapersBoard temp = colQ.poll(); //get row from the top of the stack + + //set flags + boolean dupeTemp = temp.getDupeFlag(); + boolean viewTemp = temp.getViewFlag(); + temp.setDupeFlag(true); + temp.setViewFlag(false); + + //get all cases for corresponding col based on north clue + cols = caseRule.getCasesFor(temp, skyscrapersBoard.getNorthClues().get(loc.x), num); + + //reset flags + temp.setDupeFlag(dupeTemp); + temp.setViewFlag(viewTemp); + + //add all row cases to row queue + if(cols.size() == 0) + colQ.add(temp); + else { + for(Board k : cols) + colQ.add((SkyscrapersBoard) k); } } - //check col south clue - List southBoards = caseRule.getCasesFor(board, skyscrapersBoard.getSouthClues().get(loc.x), num); - String tooFewSouth; - String tooManySouth; - boolean contradictionSouth = true; - for(int j = 0; j < southBoards.size(); j++) { - tooFewSouth = tooFew.checkContradictionAt(southBoards.get(j), cell); - tooManySouth = tooMany.checkContradictionAt(southBoards.get(j), cell); - if(tooFewSouth != null || tooManySouth != null) { - contradictionSouth = false; - } - } + } + + String rowTooFew; + String rowTooMany; + boolean rowContradiction = true; + //check if each case board has a contradiction + for(int j = 0; j < rowQ.size(); j++) { + SkyscrapersBoard fullRow = rowQ.poll(); + //checks if there is a contradiction given the row based on the west clue + rowTooFew = tooFew.checkContradictionAt(fullRow, cell); // is cell the correct puzzle element to check? + rowTooMany = tooMany.checkContradictionAt(fullRow, cell); + //boolean that checks if there is a contradiction within all rows + rowContradiction = rowContradiction && (rowTooFew == null || rowTooMany == null); // !null means there isn't a contradiction, so there must be a valid permutation of the array + } - //if every possible permutation results in contradictions - if(contradictionWest && contradictionEast && contradictionNorth && contradictionSouth) - return null; - return super.getNoContradictionMessage(); + String colTooFew; + String colTooMany; + boolean colContradiction = true; + for(int j = 0; j < colQ.size(); j++) { + SkyscrapersBoard fullCol = colQ.poll(); + //checks if there is a contradiction given the col baesd on the north clue + colTooFew = tooFew.checkContradictionAt(fullCol, cell); + colTooMany = tooMany.checkContradictionAt(fullCol, cell); + //boolean that checks if there is a contradiction within all the cols + colContradiction = colContradiction && (colTooFew == null || colTooMany == null); } - return null; + //if every possible permutation results in contradictions return null, else no contradiction + if(rowContradiction || colContradiction) + return null; + return super.getNoContradictionMessage(); + } + /** + * Checks whether the tree node has a contradiction using this rule + * + * @param board board to check contradiction + * @return null if the tree node contains a contradiction, otherwise error message + */ + @Override + public String checkContradiction(Board board) { + SkyscrapersBoard skyscrapersBoard = (SkyscrapersBoard) board; + for (int i = 0; i < skyscrapersBoard.getWidth(); i++) { + //checks the middle diagonal (checkContradictionAt checks row/col off each) + String checkStr = checkContradictionAt(board, skyscrapersBoard.getCell(i,i)); + if (checkStr == null) { + return checkStr; + } + } + return "No instance of the contradiction " + this.ruleName + " here"; } From e5ffe6e6ba75aafeaca512ee11fb9edf109a5c63 Mon Sep 17 00:00:00 2001 From: ThisMatt Date: Fri, 28 Oct 2022 16:01:42 -0400 Subject: [PATCH 31/45] Added actual icons --- .../skyscrapers/cases/CellForNumber.png | Bin 67322 -> 10474 bytes .../skyscrapers/cases/NumberForCell.png | Bin 67322 -> 10515 bytes .../contradictions/DuplicateNumber.png | Bin 2413 -> 4460 bytes .../contradictions/ExceedingVisibility.png | Bin 2413 -> 4542 bytes .../contradictions/InsufficientVisibility.png | Bin 2413 -> 4777 bytes .../contradictions/PreemptiveVisibility.png | Bin 2413 -> 3883 bytes .../contradictions/UnresolvedCell.png | Bin 2413 -> 5936 bytes .../contradictions/UnresolvedNumber.png | Bin 2413 -> 6965 bytes .../images/skyscrapers/rules/FixedMax.png | Bin 2413 -> 1465 bytes .../images/skyscrapers/rules/LastCell.png | Bin 2413 -> 7006 bytes .../images/skyscrapers/rules/LastNumber.png | Bin 28799 -> 6936 bytes .../legup/images/skyscrapers/rules/NEdge.png | Bin 2413 -> 6436 bytes .../images/skyscrapers/rules/OneEdge.png | Bin 2413 -> 4294 bytes 13 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/cases/CellForNumber.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/cases/CellForNumber.png index 7eaee5d06bb81e453b84ba30a3a29b969203935e..3c921c0c5648ed3ea46813f5929a6701960ccfe3 100644 GIT binary patch literal 10474 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 literal 67322 zcmZs?2T+sE_Xdg|(xfU#ktPZOq(+b~NEc}$3L?F?L_m5AA~m$2bm<+X7X#8eNbfC3 zi%6FqAR%yH^!L9rcjnH7WWv6?d-j~OyXQRT3H-U1D&>tkHwXv_DAk@Sy&xbU3MC-8 zW<^R2yrah!y?};mt}j#-2+D?7Hh?eJZRIuP2?#0?Ozj{KZLEL+OuS((V9E;{N? z@hoopqOrwiVQstm#NjuKYZSQW^S9wQ{lPT4Dh|u}LjLx1km^APq8Q2F$$KIZN|`#G z*eL9VcEB6t*FraSey+Zm>8eRR!vy_fzuzL6yyc<&C(S2K2VXPB1S;csEL(1>vU+|B9}Y?P7q=;J%N~s=7H8hfH?-i@>4s%!`<LI9>Z(-?pKUmw}W%VgR`u(v0p0nd_*eRNh^9jA@vYH3pysiRWg z)_-weQ088+iqrg>X;!9hp{CO<`_p%~X=A^KU8p7B?Ev2MN{+h{Bzw9PRGfJo%KdN9 zW_sfpIJ_{*UtrgN*SEje$79Ak?7*R}7al^R5N=TLCOX-dY0UbwlXNHzVIf1|)}-X> zh=pCFEcwv4W^Ac+q{~yu8b(rM)(tY1M3eLpwy++bw}~uojyib_oRfuKwM-In`&vxJ zRlx>HcSo;nc+F42e#2uz7I$O=61c+Xzqz?k?bc}z`8Z6KGb}%1Wm@u@AwgLhl9o5! zcTFv{T9(ir_IX1e6Xt&}%p?QoaHzG{zFEsCL3y3zAO^>5Fx-nBJfPk6=I(afR#feA zglUz~b_BY}u+gry!X&t55iHnx{B_2=RM7AF#yQDxzjS94P9iad$-OpYV}$=+?ZwBhEv)r(%q=PC~fA&+K475OA%+* zeK9=zNm1yN3DBHbFhDE$=WcpZR0mvODx2eIme?yjeS6yqdOXB0>84siab58&A1uuy z)_=5B*I_fS129Lv^uX6^@OhJFsI?2-+tR{Z{P;Av~qFq`jorQ0R`M88(C zX*JPsth9FF^Pl>yGPgzllYA03ue*=W_c|t{4=a9_!;XuIPSm#)HuUaWk7oyp$zj)X zU&&3Eo0^i9@0*n4H-Hw~zPFLY{(-_;j6z4$=#vpe>Q|Op&l!09er!Lx;hAsEeJLX#eQ{Y}-E%H1AdOMApM}e*_iKGGeb}y> ziJkC9A1N{ws`M53kLM3FavqW3zq-w(+s`t24$rodW(`MXyA_LA*EYkkPOP8(!>TV1 zl3E5V&(Ss8>#5>V$M&8BsQ>uuFIR0Bw`<0=R$oa^wr1}$KBwSMV^S!ra_u11h8@K9 zPvLdCzkIB+Uv%3M!Rj8@j$w(0)B|;nW?y)0r6Mm3!^-|+vh*7(b(K2Cd{@%jzDED^ z@<7B2SRZfsCS0lpP@>+!05zM`9v-uQ>AhC0DNHZTeac{RxL>eIxb)5UochW` z819d8lfJ5P*q!v`P0J_466mO}#!03gYFxvAhc0FG&P;FR!9sW&UQtwCx+DCH(h~2e zT=owW8GXl8xmkb5U(S7V>~8?)4m}f}cUGJ%<9o-<@vpOSYcKXZ%2wc%H7aK~u?qEH z=wyKKqG^-7-5dS<{ ziTXz2>rCZL9if1;e#2VtE*ZtrJx4vAPQF-U5oGAQ%d(Q7(NSGA`Ej) zhMjGcPigVom7c}k`q=PsBQ2HnMi+c5MloywiPa3J8nOSJl{;%FF^huSWC=s*Ov#hg zwt;g}Ip47(cRar?1`D5yk`L|2Y}Wd$L!5Y(W?yE*F)?*n;kcpR&m9taVC(5%vi6u$U^*^)YI& zBL9?&ORcI@io2);53&n(eXY&+lm)c{jH(s2=pvX=xIzErlw}RLAHYil&>&_>!L*QC z-u&^g>^(NwTt#o&|EA!}QSMq4UNFBH^#1$|_d7dZSk0ugC@e{Fn827-{2f~=>@6oE58-14BR6wk@kqB){Yl-ToJT3ca6W$?kL%ZY?qD zB=$M_+{lXb=F;XGbKjKw{i`W)VgdZ>RFAVoDK&mkd_+%4ei(*4XP`%SvMrLZ6b@$Z zOXJLgV*MrW0}t8knbt7AuLmxyb=k;Al&2Of(+{5lBR*cpPW>+qe^`A3*L#WSewWL5 zO>_4Cop~LpGV9k`5Oe8K8`7Ry5l!QkQF^JGUFjWPjYP(~cqu{RVtWGcQjnWbKTq0B zJ4UfaRg}=6u;B6LhZK*?=ZWitGA@Nf-aAi5U3T201benVxVq94QIHac1Ng-O$I6Yr}8o-#Rt zckALDC~C-elrEQATVBCdJR9YpK~D`0!@6Hr44@@^!n$XcMQ)%h<_kxO$)BLjue;Gu zmv(pj$czioP$u;1>B7YQsiUtMl>%o}$PEI47UL7fII*zqV}d^3BX)Gu$#UIrp{kjm)c#(Q6bBqzF^EN2Vo(m=b8IbB0+)B-f(ZpUZyHYMi+k&n^y&vn)At zK6qd-82t!3(w&p$wN+YM2BVsX7u%ly)@s~6WTtdx-X3A_IQKgi$%)bh;)iI)H<@4j zHlMAYn521CUR{D>7GOMrid?m;N{ZNC`mfecZhYm_J4sJSD}4Y#-~Sd! zW$fPdxkk|Q2KCq9@0*YEg-T%`9OB>bq{cK28>f5GTuH97czN#4b!ftz4qV!AJ4Xtq zo=l@QZz!FK<&Y1hBJaWnIw##O4; ziOYF@FGlAcy@Fd#Cr$=P3GI*NNZ3zXN&2L}VB1APoOaj)=5;nU`KAW~d;{X)5_a#p zIJsAx{LsuBeczJu6{#QBV4GqVv89U-%Eg{jexk8J^6od^)b?AU?Jtf;qW5ifG^^=ja@8RiOXGcAQ_* z)rzKw*s6lyw$Y8jG!~n!x@XWA9hN_dDG`q$v9VCovY}fF;qZ14FDZ5K9U_@UiPjgP zJ0dlPz`ahvn(0R$6tHQWUKia{+r~Cr%uq)?j3^|30o}ni@jJ5HG3pa4gmV$F;WlWW zwFsLl|Ar=Ax=8(ps64G|g+L!&H3Tvq)5 zIG&vBNocgsEF!7n;sPq9WNX*jVX|uI|C&+*wbin**hBb%|C}l%g>nNYBWd0 z)KJ$4#b%o;{XMN_UD^X+H#iDnb*mu4Cx`Cf)Vs-|$x3s#1ZnTZCFmQkRH^lYo`ZPX zVau+NNdFY!kDU9oEogtgA+)GDZZ01oLDB_Vp4S*VkHSMX`EdQRy2xD*nQY6dU>e%? zyUl_&aWu3aHC2pnebQ9%+lkZB9s8!%3(6wJ+(uahumEYlq&P2d`7HFT$=EP>y^Vn8 zJhqGLWz!Vf=n{mgeTMp)B(nOhD;g+-bF2iFO_xU=rmBbh2tQO3QJ<&~b}wO=qJta_E!Pk!Eww6%eH5E`}keDHWpCAVM}i^zmoI99zV8 zi%dV3jx)G-saPYDj4G3W@x9n-?)BCsryG6{U4~QRTY{n#cHC*y&?gNeS~b2C@H#3d zl5nw=(;4u}sgk8t51E7dh`S}x+5U&~OfR`)uFipj0{*SNCO_i=5|IhI5%;!v$Nbfx z?S)otOzf>j?77Vj&3En{g1olo1{EnRuqzR=d#n+J&{JYtFWqs z_T<1F%$|kkoUd;!A%8{;ql*=@*Z8l7cP?4 zWDH{oWvgM7JMmndGm?D$QZ|5&mD{@CJ3gzU5M#E|X+IA99W+49XhlmP`ekIuP6Qj+ zoL#<-6Xjl!ILnJ z3knNF2ZaWX(~Ih~J`u~xwhuz8nvRGcF^Rp`v;p4~U+(#2Nio`!)!WmUsodPXxaC*+ zV=)V1J?j8D4_cXZw$)3C!;d^;ATER}tz%3T)BWnLp0W;tf2TXF8N4S(9NhnhSG+E|_;Rrbds{oVAOiKL9%48u+H;bmH*k*>8| z^RTozkWu)Wt*;G}oC@7Gp>G@PS?A7(J`a{giM{L)ZQ`GDvF$&L6Y-bA((V>ij#I`L zghQ)^i(Xgzy!D3O)>$jjct53+`l-zGg_J{FoC;OnAxca@dAn}eQLln_n^?LXNvd() zx$DKA*#T3ZwK1-2Rz60b9N~K}&l-;LQkS)0vmVy=Os`!3_q%YiZYnk#!xh%SeyI%i zW)s>n&-yYl1`Fmc1>wZYc%sy{m73*d+j1t;* zwWg2T-8Yc&;AHlU5(k6U?=n(QP_SGJiU{mp-7Zk}igs6#3e^8a_pB~A2oq#%?i6*c zn?k&`Euf&e=$|?)rHPi;mtX5d5t5<<87tN1xa~6Ya<6OdyTU>lZCKDEEVMnfWCl^! zsAP#*gFeVx-VSLEd9KOvUPqII7j=1R|E$i#nPbb(Vo$he=e0#+#RX!&Q~RH0I!^6m zK!nWfbe4sJ@;FW?tthP!$fQ%yg0V6xxj=471QKbfft1T*S_NQN?H250`Isf*aUvV+ zbor>2kU9?lWW|5FPaAIlx1P4#<=HUbPY)DyV@P^eV{5ux`{bvmY5nB|Zu}~--8t;N zkH}MH_pgy64o1sMh>70l6BhXVuI@{SSdWC62Aj`%wu1(cCY$P^L$6{^%lV3*JU#Z6 z@#c5#tcuc-^}sFCz%cLvP4{gV`01~i%N2%}r=E-cp7rP$>94PwkEaZa>r|rdPXQ+H zf<-N>9l--BM)VA!uS|}Iw4`@lnouTM+b+ZP;N|-(3!xZ>q|8o*ql^7-8O@wRO7Ej>@T#Yp#H9q?+S*873gazu1fC+b+lzAwF zW*UAvZR}}`{bq{$cA)ia@odO*42Ij0E*f9Q#63GcQ{uJ|B8FfF&!*#N zV<;@%YssGds_{7PJ1W1#&bqCraTmlz02XcBbameOHmwIec&Q^w(6{_MWx}QV;Z4%d zEEYW_dMJMF{${rem0fD7o7(LX(>hur!+9~60AgT-H)`@ZKHmbh|CrgrOTQJx(EXK= z*}VEZ;x=mCKApg?GQb{}^qsj0<|!`OgdxpjGZO zYUEdRc(=zaSZ;m~OKAG~H09<$HMJ5r1>jJ8m7U#hDCj%BQ2Vbd0uklZOOXeRT^ip9 z#ZWKhNa(W|x7YFa9)_nJG%VuZVuxzWG^Mxqz8qZzjV5w{gM1xsE0n`;)cgRY=COLt zS2l{MzFm956P8Niq`4wt_`$|WNz~)eXO(^*ryNuk&TW2WxfBwo!S>T2I|zeaFWl=c z+7yQAq=xMU0iK{k{hZ-m?g=pEwKo*6=qTU6tIJ3}c9{y8dL%-Lrp~F{dGHXkFC@nh za?53)hT8%Ge3XFxespqLfMuSs02@mJoc(X>{ENJ=z#1TsRQkShllCdoJ&sO(-4%Zw z2y)iOe`8fBz+1ANrQEBFuYIS!_u#93(}Vef$ct0NWgQDwKJ(i;j`@OOdiDS7R^Zh} zZt~pZn5r3~E!c8?aPZaBSuv&SMd;IiQ890Pa0rdAA{@XF)n1c=AH{p^Qv4bBId|zv zSXAjqG<<7-_r?~azMb0`p5O+P?SAt+xe9c{{{^}?&hb(UKG^Y0lZ6z*6Phe%*Yih7 z#-A_%NPDoc*QV(g?)a`Zk87C_v&da4ak+h9I8fVsTzcR@I7vXpVUv1mmw6v?d5Tzl z^=z?aIrXY6rBCJ=UcWsSImX41o=GKrG*Z=NC$St%+gEG@;w9T{SzNH6?E5bLsnoFg zor&q=?O4Fs2Omx6A^d*bU#+E#=eVUX@Q`bPp`wS)_ay?(kyPGnm1}sQ!_6W$mk<98 z5;A-7Y0ssHErGk_G%+@e)#v%_yO`Vhh40a}WRU#jVrVJ9dnH5v?(gpy?|4d)WettyZ zylo!jFoPjdxCD}&l{%q*P_aODDA^GBS%nD%NAg%eos^@yyP*p5qMq0B<&q!zzr~^o zJe#dyFpWA*=6ia>o3h#R?i76c%Fv2~l7RyZkXr>-%k+ajTUOB%#?8?h(s9Wy#jzsR zCduc+)?lALI_bKdvs)W5o5NK|Ik3N{fuRHGgS6k##IX!nTgPQ;d$c0Cqy$eQG0_!0 z6+7Nl-aDvCH?|fP*}nWc9G&qZz2%8ud2pMu+8(k+z~v0nLC_wHDp%AR@-wVN(5mYQZywr6f~Z> z!x?^1Vkx;n(hw)wFGSGQ?|v&*Ii0>55wL(rsQ6IWVO6xjfUk>3C;zHojk8PQgwS#$5Yw7!^AloD^GY z(2059O>xs~6oVUp1LZYLbpEsXbZ?z}!E&q~DjyE+|dUnO;-)N`tS`~Y#0V>>Zs>@0*m zXi1=Uwk+aX0)hn04i^P2YFLHCgN|HE6ND&%6q&>}Ziu0jutm*$>d?5^*`F0$EEt@k5kBkPRE4Sf-hG!Bl= zWX4YYe#m>&ukrZzo1YMxG8(d)@M+K@&+qBrT*J?ys>qTZ8KLzeI+dO*r|2b5aS*{{@*cZ-WD)vO{Q-pub^ zCDeh?-zL>%Kptdnfg-F-htz)4O)V{Hno)5Qnj7G@>gBdZhTuQIK3n@M1c(WAzTY<$ zXaE;8)Pv|UHIkpx$33m*G%4a+mqQ`YXg@nbRLC@7%6-2kmPIt`2d0`*Bi0x)W20J> z6wER^u03|;mGps>AX52Ra#S+TVdLb8h4CoyR&G^i9F0qodwgFp-g(Wkf)ex zQwTM!m6g7eVUa#gMeJ==^$GixH?i)S3P|58X83$dDXG&jPEih?q}IlL-J!A-v`sq{ z>5*le`?Q^YQ7GKMpvm5Kt|4;J-g7P^)3Bj-c400PUn@(rF=zWpM{)zEG$knrp3Gl9-5A{^@lJUPiiGz7Q9riCOm71k{koe^G30XzQLY zxWwew1TrC(lH0oVOSTo78cMX?*$gD_>~sCHOILP=EDED&&36b4nBAFj1<@1MB@!kw z>_gC=?NbO$u zW|!N^OjJhshP^`U%ah#e$Xv=1l^P~|@&qSj-y_IQH^x@90A@6*DqY56C|wrII$d8G z-F?zwFr|OB`;(uY=Z^cHIT+C8QB2f#ItEP;uhnpykZ(Wr&AQ6TMJd&0R(8lnr)rv5 zx9l3B3ZXgRHCvY5dT=@ONqTh&wc?C^IK05L5K68>Y-KF0BF{)up=SXk3-S`90`Ld$p+ZBlEtjU zYtxPulSH32uaD$iLyf7dlVC$&RhM4TCwok|M{vAdJK|bTDE@aHr3lCL85y)*svj%O z+1VRti9v_!ymu!ntMA+*ES~NppB2-5SOMM%kJ%*vHvg9xy6!2kPajNi?$^Yw6xtHvgKCm0WqA>1$DgEj4MCG>j_Zy$R z{9}cm*I$QI()1GViT;Ngk6Gu&QW}oP{u}ObsXw$m=6)CWcd{XS@nLmYGx6wRW4XL6 zZ!W8tN!DRi@Op|#^P4I4=b}VPy28#4uv@$Q@4;D`qqZ{y9@(XT{b&i{jl<%g*AF)YX*(fsrhayZy4w~?D_H9PY`Hl0f; z#FI)wm-S;@$B*@2&dmkC9MeSHSUFu@3lNesXP6=L$Q9VXI=Z=*LtdL^mr#!*Hags4EL^Knrf&~yx5h8; zM}nW?<@IQt9>{gkwaRlbx=GJqM6~0^#{%bW38g2*+>vxl&7JEcuY9adBxgbcxt`h< zS~n2#SDjqTHtUM<$K`?-tY>w{u3PBm>6zox-pv8M2bTCx{L(SQeeF1Dy%sn;G>Ei0 zy=yUhz1VsIoNdD5S_z+);vBM#6GBzfnUCmH07n3Gdx1v#Ut=S)e=3O_2}H<}L_gpV zA%-Z#TtM#NvZ7C0?wnt=^MkWb+k#FfAMU!DOkLXu4tm6;$I*UlF9- zQ)O{0ulhL7Ys2ni9Pd7cdONT(xYSH~hSozR;e7jEW4G@q1D8u~Tgt#^B48 zV{QXCIw|;V;`$-`#txvQ%+d`qks?W-lB%{N@%Zr5Om&7{Om#K#7w$vOS^{t&bQ7Q+ zkcI^vo5oOf1yfK;aiH>Wmp02YA0hLV#ugeQ^6QMw#8MyJ|7$Eb&G4kyWpRrtgEQoe zM=UH!v?D7XbrU4)9#+Gy2sdo99bz+yVhkNYvQXs!r)Rxlys9oFkGOt;X1%Ofa*Qn~ zMmU6N80jczi0LjYudOKn_=lv&`d*??)HNvrVs^r|CFPYa zYkomfjz*YPqGm74Q_w=eui{Q=KZ(SON81ROHm_`K*L3_{y>`G*JY)!l?)SIRLHq4M zR92-8hy zMHB0=@1O65cf|kCMjpwQB2W8hC==d&1>{x$XWWfqwxDd6xOYJl#yAadin1a!J9)bA z>_=3po-Y7^)}hN_vPz?+;Wh#dw&9LW(QX%(C8h}qe9{E4A&akdJW(cNB#f4~TnSN0 z@e<&I5i3aknrPqee0^6KTtNEt`u$EgZKg}33Rop5i(>RSZ{cSNh>T9uw}Rk-O4XdE zt+IySmUrMY+~yF3rN&onjfthki{o;ka-X%?VVH+^!kCUKYr_98Y}Fo+XWfJ6{6|It z%cYH1%4zk-T-sj&TCS*H(4PNS9;K0CiSY{nwpy*yeVfWGLRzlfVEMKY{AcpiHr-ph z6cqAMNijdo;a(AQ0JCkpb}wT92o03bM0<9I-<@A9eovOg{+67rliiqFVeS?J4Um8w zoJ~&ZrxWy>4%60T3LBqotmh&!L>@-Lu*R-!@W9shW+Smt;3uyR23v-yCyZ!N&u-jd z_@^DEkzEN(e&HdCz6TXw!F)d$EPsNpDaI)<Q5t=>@?hjot zB82Y*i~3Fv+rJHe(+lY_W4EmYwp95tiPwd+& zlqIqxG^`hO^7*<91^c?=dH=9CX5Mw!Z2;Vp$Ix=xwVEEEC}f%eK(dR^0B1J4 zV&l4Xc$O76+Y3JpO$_Fx3T0*NgNQ#};xEkbQ+U(xd(7?6_qBpJEvd?}D;^l~=_Gb) zP4?t_O}}76yyx%U9Tvvb*h7sKiRu)IMVnNpUK7SmtKI2*i?STNfT_-rf5?kAQk9&P ziIcb})-M+3>Fi}lKq8Hh>hF`Mr8_@7(- zdXa?!WV-;PZ*{WU?OFRoI5BaW3--rGmAX*Lw)>fN(!f^Ld4p}dTJj76WS!Oqz(#LO z1oB*OA-^*1{@=_hK%4#f)@LK;HQ8&2_|KJv#9cYvE$2q9VX{Zro4Bf9Y1PBY>@<97 zM>DwyenWu_!61Oyh05D1Z)yHp>TM5W_i?rpUk7l}_);<9O-`9FXruA@h>W21rAj!r|%et2zqbOpL*8JX0+H9mvJ++NE}FKhIB zmCsk@ya({(c>Is|6#M9dvej>O=j*t6i^A0ySv=O|4@G|6b`(mTo_oaCPtVL~eJkV0 zh3d1>sP3%=N6mBC=-rffm$KY6hYU6LOV=SuZdSJuc>s@ci*WVRW(2>z4NZE)L;vVv z)wb&gcV^lJDgfuSvEvlr%k|-sD}OJ^x>(O7nM(5X{lUgk5i?6eSrx$kOVlS%nc$=_ zy>n9EXS@uFvT<+F_T8t43{_u29y zWLI{6)s+|1QVQF_R^%5-gsCuY`6B|(W@$;->rA~Ly{^A*%lepFD=4%Ltm^-*adXJ% zlp++^J&eZ^D4PYp!@<=_1u5=jsyoDJwl%4~FFqC%Xarcb?UgvjEY^jJ@^dp_w=_~4 zNixE7Y6qeCQzp{YSlYI%Zpk|hCZhb^k^s1_t9d={*4l{hx;NncaI>j6=kou1u7rEp zgjZ4YW#1Rj2LtW)rkpl1QQrSG27cO8_}{tzM9qtXkSPrjaE_kT@4S8h2= zZ83;>C@wK7W_-jDu+Ol{<9d#kyRfV?PDKKxjd#HpDdd@L&#Auihz>D3j&*;JdG}R0 zdw=mYA=Bl7uEt&0Wf8_cj;`x3LhXv;b>U=r07mu~?)vvO@gk8ngy!)Jg{N0o?6^kC z^#Au;&yepTZsEY82GV@?8_?5UY@W+|X6LE>9EPT%#ybMqK4Wox#UVzpv(?o}JMYuw zuwq<)bm}dItKpMv`Wj_DkaG^jzyOVyZ{-5z^am-!eg#0szXZc?U?Bjv?JFJ~dr2V& z@a9)*M_o|R+AoasK=)2FoxSdlGg(XLQhgn|#LZ z`+xQ%)RQr#PX3OkkY&(IirR5K3RBm?N91fmQvAQ~{au)@X3Df9aI33+weY}Wk2eBI z*m!m^-2km3Ax7$;Vl$nG$*TiuR!K$l8SZ?5I#KJw{?B+-+P_Jm1i%=@CGx zXngP|NA3U%G$ml(G}|uNAVTI`5j8z*4f*5R(!8bLw?EbROe)*|TumytkC3rwd$wN! z)BF$9?%<*iEC(IA3@}LQ-Da{$@*T_SWfO;U~dUtm3B!yJk{(2A@X*aJUFQ)i?bP z+G(0LnY^feNztJ~rx#M*a)CWilYS72k_Shd`AfvwUsf6VMFmlNRE9$y-(V@)E>>4dhX zjNX(onmV_gZR}qB+3owN($918p2}m(!Qpnt&O8ujC9r3>PNhs}8SnVS>do(~-} zZ;*(?_|pB_UH;7pR!x~!+%r9&;k?zXIG+FnZQQJ$+d3P4?#1KNEgo;AuE;T04pXky zDu|)F<>jn8eJ{C)@hvx&u>NpZS}xtEk8JW%tE6se+ig8NOpki)$tW}L3c2a2g3ocW zX?g|_O6psleV%RvHLct(FFF^$=XC%7^ruMV8F#ueWZJ9TN3@zAoiZtxwRIcN(!@{A z|CSK95wZt+ZoM2~@t&coWE_88P{i7V9kANkbMU;DE>LuN1_1rQuKCRS|GSa4ix@K$ zyPSazSNa7DUu{;gMZd$Nh8A4I{o6N|ug;=;B64}1h~Zp(=$HBx7D#0m{jzKa-Q1yV z0LB(*Yiok#`m1DT;}369@c%p8~Ho%5F866fFf!*+NquIY5{}fonF#$=0ab_PGB&64=Pc_h6|g zwaO&<5!sA~=EIgGqJ~+F&$0!Y6~N`M)~s~ys`oNkhp###@zIwVq}Kg_gvpu}s_gIu z831+%#Nq$&vnt0TQVQfaSFw}HwfE=-s`lxr6mfInKVex4t(1xA0M?R0E5@GpymRJrwElGA|9aPOO>+qab`kOt`AWCEKEs9}4~D&;)T-lIg3suF>F{$hXUv2gGP z*eumK3M4+Fj%fk!Z{Kzqp_T649lwpb6g!tJQBijL)64cT$3I(YNeBRIn7tn-A20k} zXE@yAg_AXL&IkSn3mFqZ+b~QW^mVG&whNDM#=74`R%H)zEd~-;F7bSH%_E?XE%Pf{ z)4k+RL|NGJ>S+!I_BUr_|3Tu z>)L9Z5WO#dZ*3Q9lQ;05p$?Kdc86pYMWE~_On%v52HgxP|FvY!_gA_8;4ifgBX59A zU!Ju`5~T=Cy>5LxNs8aE%B)_hCSn`52S7xqZEc8OLoQ~{bt;`CP1*48K$kLw2GnFh}^x9mL!KP(W~H5BO7mC~ki84QjzY3z{3A+YwK@hZ=>| zWbaVptf0>-5zXa#$enni9?5(Cb8=%P^WT)N=A+CKPOdRbQSQ=sc{G#LORvG7_xg3^ zjKzMJ1)y{1ut?DCN(>Pzxg@<4@~I{6en~V`4w^Ybjm(5PNr?{+TTZ37kTnS5#wI|H z>W<}${8hX1Q@^J&wi!ZPD-d);!xwKVceh)Tc4)2J{1N*t%pOMfpy@!#L?N8_x^nNN z!RU4E=mWqsF8`g~>!z1Po|@}ek#o^&^B24}o3$t{Gb^U8t?puu6r*?GAMyit%PPNa zK*6drx2bXFDAQ>wWOn~q>Jp3&)rB1WJ^ifefIF8E&p>*%na_c!DdLc^iSO zJiv#LvZ?-bj_xkDeo0F^jo!VnQ zek0#$y;27Qt_`!|iX2A%s4ZlNnBHB~>Wg9Mxlv`=1*;I!^N`_*F%W$V3t&rHTds52 zwquWBx9%B@uzXgzsJ9?SvyPQ;s4={9h{q3kuRQx&F9QWKtD=iIlEzSJRv{up!;oV& zGOzvvLltiSwa&HMx3!z?s_+)3O#*WjXq%l7^f;*I+8kW=^uLcgJsuD~)Ea712&qkn zfTA=6Y#fn|u?tDr||S=V4R zSS@-}&t~-3A94c2yEE-=^tX*8bBlNmh^Qy>89&t1D{6+s?qu$GTBVlFRMvQOo{dn= z5km_o{ceVz%yL5z_!*PMZh14D+P)0kjuJ`-3TwTn8h-hUx+W~C7Ll;nG9+ZD-isst zxR*uuwP!WwtwKVHgj zi?8miKu;3+AIH1_0?&!Pk`kn03MDQhANDZhJlK)jQd$S6aQ&bwTu3SBUMB;iaU?Yx z-vimr8;GLy3jCpe*ga;Qj!x_~R6F>Ish#Ou95VHn1;E@Jm#S>i^Vr@_#-LND^rhk{m?ugUPcF+CkFn}U*P15swbbwfw@eaBreCbf3y{8b?{TB+@54A(J9J`CLCr%M~q$R|9 z2dSHQT>aGRGw0l0;E;0rt!V(Qeb^C=4GT8$%ISRXMEQddK|MW5 zvv7C>p(&%1a^OzpuCLX7hffu<9Z1*45vLdusJ8U*3-Ej}YpqlzLT^gEWY}vlZ0?*r zXZVd=K}n{oU&*#D%#>|9BN8C;`SCx|k$Hk#d~U@&LxIa7KwdDAh139XgAP9MnW)Zl zaT`jso(*iQ@cfqzx12N>3vXFeTh#jf{HGH2EZ&P>dbU>cXq3|la7!v>u^bTVmg+Wj z&rQsdgo}pVW&R6_Y4e^swQV_T{~uUJe3^RV6DYW&@?i6hG!4R#K{^(}&J)4Wi}{Hn z`p}e-^bM%NSm#k+-S){k-R^uMa&SdhRaG2Qr&?JOywU!@lep^iIuvLZ2}fzqAqPjT zD9IWiHtyX843P0-_{9R6;!lIwG2hw;Xg?mH5iY z#y_>Ysbu(Ow6=6u(S099*C7@I<$pKdRNwuu6aClm5eQqJ2>Wn+L8Gy3qP4&DCpJ}q zU>e2$Y9Bf_=-`FlT2G0&%)vXf9>B(e=RkvY?MHFh={zWqx||MD^An^xofCR_cQL?; zy*NMWSbZ)+_CG_{bIAo3!`mIXZCLwsJ4-%h@~E3dNnT-o1LM>s5F_2DZrPU%m$Adw zfLHuZLv6o_!PMIQ4VMW8(ow>eICn?A_~+T?^L-`Ido{GzI>|oJhNY8kf#l_`&Hd=t zhIou^N$pQ+`WSP|pyaM*=Borxnc6F2DYvy-ve=ymUQr;}w@~gm_)pTXT~ zJ=%62IaP6t)^fGDS@apaKy|6^(x8mZbSLwx5lu*&3945BC$KtJNqaDAC_-47C#Q!N_h5l zf*KPHlHh$HhtyU)=PPk}m-Y(U_;jP~JWK986Hr0D+L!)dtN-n%&Xo$7rtkQ$u*uPV zEQP;P*Pfe&WuX>}2wyk1WuimB{1JPR0QG1~WBu=Y;XTJ^;mu@cY1hxvlz;_8vailG zn;4x1K)Yl6@FcPnc)k7DKCPDM>?yoc>*1)C`ImG$S2Pc~WbK+$ zY#1JKVWT6KXWP5qq)Q~~iDf|3aDGJJR{2wF*PZml#7C)1&(}Omedm!ZHiwM3YMa5SXrwAMRYJtlWpen8&+dyMSHtE8>FEpmvhLsmS~ zfh2Xr0b3_bSK4+~A~Nr4mBduHUZ6?`u>J$KqBmbpYLdokCPQgIWKtwo;H}K!8q*2t zHLknIJ^6W^hAZI8roAXt4SF$5c3F10^j;$*7~58gZhqRMxLp(#tbzuv|n zHGk`QFgKKIZ@QB;@ur|I+tH;1#7wMsF@h8F64Kc(DVn8 zR_TPg^HuZc=xUOoKs$nDDDEvD9n|%0T2brTO5A~$CO{Wn=aEERoHeV8-HM~`p6tGn z*=xPnaXKema4r!EQH#<~GUl-96!87%n^w=UsYXlRSw`T@6gfJtTN2jpWJG&)`;C_l>`gbO+8%$s;rbu4~BL@AtjDUa$LoKOfKc?B&Sqp4lhi+b`u4CvBpSG@D#`@a^pIw;;H1Iblk9S2bK& z<@iIY#n<_Kqdt~imWn~>p^%?>i?6cvUTI&{56ahy)kl=l^@`l+aIxK777@JJ{tbkG zc=1c)lpjjk$CTTW!PE7*$?R1tj;~(7f94$1%rpDgd=2rJ}a=6-QjMftF76qc0NBNxV! zMLT@3L{nUTsiZwmN4ZjcF=ch}Rl432m?r+$OahO6c_8rsMb{%z4)kV6b1OKc$XBYf z<@|Km+HtFpfJVp3@1nl4jKAm+M2-5g12HR(?8Y6_^!X&iuFtTas$C6T?OlC3?z9}; z{PAf1%mNbauQ`@asIxZOs#w>GPf7}%vq8e6Nu2l+T~!IqRi_To=jUuZPP1P+!L4#H zDY>eRM%EyyW|0k&5T#?TEQq(Ww=Z|TZH#J|-@A=h>>6R%_71~PZCBDfNO2Wa zK;Q8oG1_gGwSGx`npH`=?%vDquq{tmY?F8h5iRDkM@cllqB2U~(tSkm3t+ABh-eW> z75?)o9La`h#|fVmuZ|flm)tJWfo*R!Q(YC}OuhB`PP0HJe?vXD&#LB@*d9cg(W*Rj zl~kPJ8Zw@G8nGkiXL=wm%(;~6Q7r!!(Sxl_!<^i%q+2Jk&&5`O6+vPi@Q4laGKcG_ z7&)ku9>1S1UgblOdpik%WE-aEPI`ig63U;4E(Bdi^slyOMP-FdB}D3QDZezvFZ*5! z^i>7?FplCuikgP}5LI<=xHwD^GG z5YM3f5aYW;%{B=q6OIR+YG}2N3mWdE^?vUJ?{I+#of1BW=FYOt@%={lTArnpAHq#N zI5!css=p=Wn*t3_{(4AMROsYtthcwLM<8D;WBAFfZjTgsf3`daB+zMC?4nwI`Bcr< z%AhIUM(kgT_6i(u?n^S7*iHJvEKJVr~lSc1$Hg?vI*yQ`1{76@QcX=eD?z@y~mjrC<%&${O znoB_^8zKa52)vt^`4x3vM10pm9oaOMeB6oNhDJUZtr-}R^<~xm1mfGJM`EeXNEshG zsI&25sT*B=IW$5})qDVVf!@Y9mb;le6vxglqSO+lRLG*mxOAvfOgfG8Ztc;CmwqiD z=Vlq4a@xKp&cJ||aDv+{Rz6AoxI47D65rFCmWqK#AxeWu61x+mV3x}fj4tqnb22Of zX-`-c86@gY(m4OO+-H_UcQ<8+!Cr@}D{A}V{OkgOpl zf-RibJ5&sPZ_Iiw4AXa^<>j07JRl&w@tTG#eJ@NM|b ztu*&5^oUtna0vyytXVM^K1R0k2h{Xa>^*J+M-Jm>8+{tzo0#EgXMI;2DApi3R=`PP z0UUj*o7VgLRe>}4??5e`;R0BJ4HEiLarD{Jmjxg?{~SUQC5^hZ@(o~*xRJRGpWOWw zpvYb{mYbzwR=mS^2m}SWAtaSJ#r0c4rN>o$@`rRIm&;QOZ=cfP_}~l#Avp^xFlAO* z*v*yN&9RF;EUp~>t-G+_+^*5m{8|W^*DNUyZX2mlMW@1`J^6BlZgs(Ow5n+kdA)OE zg3ZvWGmSN;p=7AuICxY(z&moq=tf!|Mu|MF7&ASk*ulPk8QS1J5lH(Hz7-6=6|nUp zK<@5jnui*J+050eiKkyfdHrR7P-wnIHB3^0lu=5I{$ujAcVVNtzxexa?M~fVB}s)D zY$@>#-9U6ALu3O9;ed0S!T zIn3t{jWu>0F_IUc-_B&7++#hQ4%mw;;%|CA<^AY&L3H{DuEW*ITTZ<%;CqwQkS3PM zpHb3va{C7>hjnjrNWA9V-@SEPMtpzh(9g^*O;aeD#sFk;-W*9iUOb5Rn0Mlny(F}) zW8N3+#loANM=%enYYE5?z)_dtoP4iXA=hItEqdjlBC1?X65&v1DbaBEcmZP;G;(vm!<8WY3Uthb+Y?1GDDL`l7B`YABa#Ak{G z$fRd#IykD?qxz8JlZn8F$#M z2=0>Ra1ggjL)H*i3#qZg)nq^PpVQVn#te^m_EHo@qWViQ*$}|yO41EwrUdQ zVZaM+!W-_DKkR1GccC>9k67;rQtsW`NA7khz7){~)BV0Ne3F^+n zL;8xY&)1M5x13anE*DxnU&ibnzlB?E`8&y5Vy6Ob)Q}L#2peB;)@P``7F3zyekp4D zR$p3e<|)tZ^Wgy<*$A(b6b}{W%|hP~JLkWIo6uzdF~f09k3d}jV5~dKUV}8f_V87B zcj3zf3$JS8OY?CU7a)EIyH4!+H3d$;CCr zQ;SpH(?g>y55Mg6Z#(0~%afxV_Y}8wysH1v(Sp|en65OsZ4?$eRj=RyY0}{HFu2bl zot(EnVlJWpPE_8P5`mQsUrwvylu7@ZmH*&+z(Mb!COD3%PxYUc^*>*`g_G7jBF;s4 zrfE}8fD=X!Q|~qEh2e*TANbQLMQM?r(U4~8eahBy*H@aiz|A=NHfp=Vg~)8 z0@qBpwn_bXSLOE*YXXO2PCDfnt2Cki&5~hG!2XD1NA>>k03~8kQ->=w*;hEGztohY zxAu5~DXMDW<4nTuD_l+cr%(}NQDcRDS2&s?=f=b=KC7>d^T>$J{Q-&qN9CSpf{_73 ztT-8eskEorm6a+r0tJziUSlq=jwYH3ecdWbp44?&eERU02wZHX%dH`j)A`Q_NRF$; zQ;$z8<^eiKWX$4y$bGo$R*#4CxF0#!<@`y9KeyQeDRx1L<5ieXhzd=icnFQv=0rqt z$b>x9N$W#0YUnyjn zdyleh-I~Rd1tG}$6<<Cbhg@94dD^y~96i8dTfTe&BLsSndnI{Gb{jhpU|g}#F{ z^*Qo!Kno_kr`XZShUSk{u1#)bLr&^IEUF%>54%*y1h=jO_Uwsplug`JrL6T-)!{z{ zwij?RQ#%&ua5()HXI#;gx6JE;CpWoayQ_KIm3 zpW?)9s%rt#X!GjnIB-h;NN9VS|4@$a$yfgcg8XqS&xKI>y*$l}VVu3S&!fzq`!_h; zk!GK|6E#^o_};$P%W%&mSlG?pc&*0kwvnm+-X=3~F!(dA8N>8QpU>r@ON!(zY52o! ztHY&$`&wOlD{#GInY*Qa!RLepz1n2!x4VxH_+8CQq(s&$2Wl+88t*Tl51e;M@I%r@&(pfg z`!iMt_J4MktPY>y5rX(I5OYk!rz(9En;?tA3d!C`@g~tA6oW=2**zr;o_SAkQ+MHZ z_*8xQcFk`E%G5Hfuf9}@;MU6`IBc7DO*dAwDs)`W5aK(Wnfumop02QRHf5dA(zWx( zPMV>V`)uYpVKJ{Zpu~}Tb@(wg)n6FI{dXlCQ)j489E3AD;0}o!rZVxME2#QG9Iz8> zbuWBfz`)l%H+sets`#G_snJk!9GqESq3-?kpIpY#%L5LmV~=KKG#~De28bLkvx0CJ z%SYWy`H z_hzK^Qc+m^tv?i6wA9+Rr7y#%W{PtGaIJ+}^jweIg^~==8oP}5FpD89D;HtjA zP>tZ64H4BJw5I=Gola{{HL$e-)dmo)oCQj?zXHvhoh9Hb9t0;!Zt=cq3g}J#AIgun z#q_*ygO3|+_LS3YhLB5zap^~XHUCH|ESKK%E`t{Oj4lBs&iavZ(zLBlgWtk3Ch=iG zOh9b5A6P$l~f?Zec z-3}k{JEG|F_Q#GC6P!(yI{g|k{zkti|9;MT&+4cDYGZgRDMUE1Hc9vmD(DTM8BKiZ zV+#yBlLU`&)T&tUr{LY^#vNR zm$14|t#;u#!fT*|{`*xUiwq_>apDQ7e%!oP&*2?+f!Xoj*0at$Lai2IzSA_lv-~BdDF}SJO80EMWAWUQg~~;!olL&Rwh+{dHw!! z@h0)$_^A9`8mOR74I#K82->rcu2(tXD)FsSx=DqWZ|f>Z^%Rqv3(F&~C0?-U)`#x5AS|tp%y^~p=<4zktbcQTH&43u)5Y+2EB?DY3-Q6sx5f_-HuLr!%eY;j zZs8yW88b|0A;A_*4>-8mm?qHM>`b|y3Y+xu_Rbo{!FT$WbN3~;u6+aht|VRg znb(UihmJHb;X>DeQpz2O*o>&h05z>Y_SO~`N&j8m5e>D9e$wah)AD8Avn{~|ko0s{ z{5PvRfqY3Oa+1ROzKIdtTeFr1!}9{S3WQ-v1;*7EAx%8Hkg=$vd=Fgu>W1rMlYk@A z-^M;r8VkH%A)>UPxuCS-t>^7Xwa?LH++F>6bn(f?ODmm1zvYLNCW?&0j(3ejeZJ37 z9=uYBezfPdki|JCvBm#Fs_Mzi>Ay=bIlF5q9YhJq+;f6KxYd--sS_923>S)WpKjT_ zFc|;NOPehk_7s@U=5p5^>@0OEbc1W9#jU>7;LRwgCwDCR%)bm602KaTsa@8c**`ZQ zb>_;}OfoJ|OM9t!JKEl1K>KkShDlqlTJ;-Z1sc+Y3hEFZ!^`5;hULg6{>7MJeU2s| zw;k+QeLnf~LgGrLM%7yNPshWmM}YxXHE~6h&^aqcdUjsge=RDH5H`siy=aUMpt4;cTJ#^nOz=uDQn-zgsV1%r1X!6vo6GV^~dn?PK*f$l|F?PXPE?hO7h%6S8^ zy0Z7h99vf#J0~eY1vzC(V%ou`!wozuex_4}W zFkXeN>Rko8=eLV~it18#H!k2n!C&_5Q&%3)pg-Vs^C=tOP9N8##ClK?c=J$VyS4(* zA*%E}Um@LGXC8H;(#xzSFP1sSjXtHXcY)?@p7~7+!qygo+d6bhy!v-aT|krUcSp~y zC*I`>6@@UV{;Hj4|4UAGjeomMqkmn=Q}5}Rw-JyRUkszf{q#@VG@{{~uKk`q7&HgD2@B`U!wdh57)eAU7 zD#hIyWVw!e8F&9LS*|llT92{}zf;tTu?DHGb>7YmEtIDpMGcgQ1|EHwd*baUm9xM7 z&DbpFGL+v2Y-j`+n93;sSAkc>lBMx~_lXj!DeL0@{U4~1qU;jEL~GyBbpDXf#I?Ym z{pjy5cgLED9{b`i^3Y(26q{<~fG1yvcLP(bqwj>C&m6)n=1A{}ay-v&%y>EinDyng zDk*yElA~smRhhaXBNZQv=j+?{!o_?=JF(*ZixR$n6;i6&GOnG^WW+DdXPT9?R1P~6 zE=BmlI|Qv3kZsIT9PdpaXe%P!tCNqCO>{=Vd1BFgo>ZLvRva0mAlos2yk ztG~8nVghWN#;>?JC8B)Z&-^RY3m-De8d#_`Nr*(vT?xAHl}|(PS8L2IKDsz=mOjb8 z{GN`Ku)~6KREFnj?Ie8(5`7MZriiFOp=L+Q|7eyq$viXm`l`+lxtC44r;$$td02C{ zyU_@M^x*%fQK825_*y0VXhN4;^Mk5AMqboD=1ax)i@Z)+!Y#{lt%i=e%j-dYST- z51w)$a_rx~gkIKelI+V0Du{Xpc3COmJEKu4-~N6nv_yLc{Hk#|f{$bQCpBSHN^LIi zW(54HUED2yc;2;tThLZY@YlLxm8>3WZnSM%X0v?f1>7MuEJ7)6WjEo$ukvgnCV%li zUwNPRB`2rE4>{L}S^A<+#!;uMui^LiFsVi4@YUAhIm|kNk?JfVL$;VYQvc%4$ZtJ7 z)@OXLC%M2DZ_uKXy82t`5u}ZgNOi4JqLLBcAna^)y^>1;Q91a+ z1C4~3408@Yhh=KK?OiOt;aMdnpqL3^v2}dq8o|YBP`A2{dn-9&{Nrjn#9Ofd?iy0| zGIaM!+4oKt!jm4$Net4*tEWv@kIoK0r#$HJdYQ_;*L9}v->$if?TL(Jd|+O#7Ij+0 z%6j`;7nhTV`slqF;x4vrdd=%BA?(ycX|^)?2RU!x(m$SzS*|Xxq1J%FsJNK$&7m}P z<;4m;4(sLpZznQPkMu0Ik#tl0%%72eU2|kEJMU@%ZiHHwJduA{DS|J0F=zQd1zTz`piYP^ptNZ;J zTQ@|t&bpYI(=JNVECe6a!{t#wCSW##`Bb9LORy%)VPGfg__5t}UpU6+Jo_qlg&r^y z>d@A7E>rcZ`w~z4%KMwDa7yuSK<+%K^)L z_Mt67kHAk3L^)P}t|FB%dd&R}La`I>{}g_x0hE9cG3Z; zDV?yQwmv8;#lb;rA-DrJ&U6mKSH#QZRn$B!mQbGe88w*kQu0fUg&0Bh^qe&u2p*FV zgrNX&av);7M&j=jfCg(1Qx9qP8|IQ_X*QQ8I`La&YbDA|575$G|)G8jI z)djK8S;r+yHX_$>S)E*_#JJ^$A$;`1!TSzyHzsmB8CT9oP+P_<&(r?yRK~<%V~{!g zRIUM{#buJwgh<=73HuJ?f;#|%Cui!2mZl>DoW!NcY?z6XFf+jD)s3@ynmh3fKlgLs$LD;i-HJw$P{pVP&@34f zgH1;+3AB9pEE+~UP!w(^t=1rE)zBE*o9~!8cGauBP0Wmsmumc-!!2zWM!^E7*SE2u zXKv#X!h#7>Hl&*O^F&muL!dpqxY-^2xkx|KeqmE=Tp2y;IjN|g$UppWw-HtngXAID z6Mjfzr9q2%DCyQHaxRZJ`9<-x3I<&p&12UZgYcQxLW(b|r|J{=asFl|)y4~M-@wvo z4o`j$7EX}B#k0PFHc`x67qFR&cMb4Cq8F37%x>Y&b#MXkDT2S2FY_AF*o3F=ED;Vo z9ET~&Qy5YNC{N3{L98;vTVgAdpmy~`vf>JcKpDGY2=snGGsOS77rs0*)bG!+tBE-@ z98@;^w}Y)^BJ?`IbZ#Gq(AC8kso$)}B}hK=)#u>6{dzPG_ewH(I8w+=6t9dae5sUD zWb3f3PWZ-!9j_C$vnpaFAPG(cEVpmHmpS(BGIsj(pKI9HeB$ufF`5JSw%@Km^g0l8 z^;atoV%*87V>oafoAvLyW!3JN?AyDr5_Q~6;yN~dRsF8TI}T1w51f9&aOAm91v16z z`euT^P$$Z4T6>3MJ+pM2s5V3{p2YKG)0fLo#QqGJ@1Ym616U?bdEL;N)^XD&8snj* zwp!jkUikfGH*YEULFsurzvrN7+YSQNIxPEd(^*s&E)nF6eEkU#clZJ!>sT>$u;hi| z)90)hJj8Jm& zu~_w+kr#a^J{;$lwYZnr4iQi&@az(E<&g%tQ>qu|e#4`Vb(_|1m(jcW`j}_@-(@9N z_nK2DoFn5|X#3NlElq+R(SN->R3)h~r(hmK9VP8Rqd)(HQ(lKUcBQ(Uae&@a+uMAY zb@@60SazK78-E|}`PGrgPqyJlR{NmLc$|ey#vA|r zP*~`q@5gReQCA=n7=KZcZ>44ml%|vlAX$EO{M}MXRy*@Q17IY6@#;)@zAC4_elPI5 z;mA;9GelBHJ!Vw;qSJ8XTdZo!<|v^x*NC{az6ES5Lp=KpOX-m^bU2wcSf-by_(LOd z!j#-2^QtW-j%{Yt%)mgLz={S-?}{JY`av@^6Ip+rpa$DBPyF-p*3rZZ|Ln*H0-DIA zQ!zF{-cID1Ra+@1RR8#N6npNMN1$GyNPf41aO4JZH>K%3E2139yi{`d1?;;^DJv1G zNog8`;K|Rg#XCk$H?2Kb7aOK6uCw-Q-eJOJ$*oKOoqlU0NWBEKo1!RTr49Cyk#JCc z>Tj{8&4?;jYvS*zk$9M_#$JGaz5JdLPd5sY@Ho;Jznr9x|9Aoiq~~cx*KK@!-GFh> z?krF~w?1GQg3ft6I|9#>97bp9AqTc7o2c?P5Q3e3Yhx_yK0_|4OgJDof5jM`m9ocF zyi1r~H&>KxCKtsFZi*7%1lKkKj=;3LbhPe2vT4VQmt;jm{X+($(0qHFZb-Msb86Pk z(&+V8P>6bjq_BXQ(-qEho@gA0AeI^HS_h=E{CO&f){MEF?mm}|VDkG>>l{t#Fv&50 zOC0yC`%%i%3v;GLo1fuewR@li@`R@>$Vm9 zb2ztBHVp`*cB5n;@#O7o%|YEp&mc06_D9*)e9i>78m7;{Zp;71OTYZE&_7hzP_hR9 zH<95to*~^IKXYTfs-I!L0KKylPcHv>NKL@qL1yQN;)j*v^$@Gj{QAdTqT`_R2R&0A z{>D1tFwF{~lyp%s_}k(3LEYxGG}OC3LpwFLG$!Vw5j%h+Pu+Y0);0ZZ&2%37(a8)dNZ(E0k8%r`s(d?<<{tg^N@ ze3ttzcKjtOf7$X?nN;Ua5~S|qpN6Ab&5Yhnbn;YvzxUo*-$;J!`%Pmb9h;MG^W8)|OvyjGW=KSQiE2=GUOIl$ z?Gpq($L(bjFqdrnH`rzH6#Fy(nc4+1>fz+Pr{Z%L=rIi;hcC_@QreW8*fQSU_mjA;7+|4zo%muob>%6gAU6fo zayWG~rO{(W>j~-U49jW@QO~g_o+p$_A0sx8dGwdJuCv#nH>!2XbzqQcgc+9wXY*>qWJZs$palb3@EL>)_He}sT0Kq$o-KW_`ubh0!QOq4prSYo~*b> z8E2>RO?wY--i;#HO;IqNRU1xTDKN{zM~rpoJ@D)=NqC1Q`n;WAzJL;0ElBXWg1G@$ z3lR?jEkSnNRTT951zW%H{YmadrXt4H7t_b8r3WY-AkVg|Yhsm^F1B;_2bVN2d)rRs zp8y_+!9C*jf9INm4>vqM4v5Hm$piv*RyVf2*#8XO_8m$=5iaxI74W^mQu9r@1Hem*X{0}MP|S9!y_n`XnQrr zxE=wQFDPO}wm_%1tR)N>WT*X_qF|WfIt}zMxjV|(%&M)REbeJJ)2p~Mzcve_WZPPJ znqh>BlKqnXuycg34%PN10Wl#Oozuyn#Q7NS1}ZDP{&;lwo*hmz-}zNRYG!sjUbo8g zZmh6FHGiDFh`quYcU3Ywv{`wp4oF4Gm=w?aI7~0E?GPP#ddn?eM(Sc%^|W706d6;j z+`g7M-?XtLniTN-7X)VhHw;Sq34lrug02X{kbf- z8^OJJjkR3otLGFd)z@1>VS7-g#=n30+T=~pnoxc{=8)HQh{5xh@#7Jhn-{}&n|5D8 zQ1^k~C0ms271@YSd23Ypk1~)x019&x$#-GlX zw_I(>ajGog75d4N@W@9H@iI{f$U=7H=&uJyNreyJ`j89buVDtP1K~rjr#qm{UZ1(o zGK{s>0P~uq*1`G((jAL5&zSqMWk&b9RR5iJVZ#VWF{P(#EHaXgl6v#W%it!}6U2Xs zuqreRwdbG^%Z_(ZDcZ}*WMf5Tk?&Z|A4eILClZYBk}>~#oq5_KAz~+V))+xFU|>GG z;$vBw{pOGB(q=SuTdQSJ~D)nCi&=;Bq{mcjbk__*;@@JI#` zE>Ib_ljziU;q-QUqwWRISD#a_FA3{?Lamo3I9zdq0WEZbJwa{ZD5jgub7)S#c)b z)q5_9N7MSe1Eps#*$mU!V%Y7kXb!g*CbjqJMSCPnA%vSjK-1z}N-E{try_@r%KzrI zjn0Xj?3?r(h$5F2W4^Av=T@+oO1EW(>ZVR*Jc#uBPraZ_dtJx-Sn)pDb9==Em}1v& zHcn@bQydSoG%V9XHD26ofAi0VWM7qbv?rp7JuLm!u&^5Z%y2}P?jz3=(ZVX#RzKSd zou^9tf+>WOaYX2WW_6#D^~31ne$S_4F!!N~XKR>&-O3kanvB0(i-E;irw(eJ?dK0V z=;BAm0jxGviSik0`M7rs@9&ek=S|5Vn5=wC)uu*I+2|&<_v#*F5us7A`Jv>pH;z`J`4|9Abc(PQdv^YlAfKaHl{544SQGlVLh@j4`DEq_7o z4OJlWRg~e^QSw=0dUtdxPyDA?DNU|9Zj$=MkM|0f64(dY-SpEc#c4m*VK=W&NKOBi zrP=-4Hf~0ww5lCo6Qq3*Erb>^{#ri$0Wvh)kR2MoW3~kduk}^`6`Wg9u^Y}Uhx>)H z>vfMxs>sK*eyts|EITjXjE~O&{nBRT$;A{sfrkkJ9mQ^}bWgt=J>AlJ#a^7%e2Z~C z(P>}X0fzsnW9N~;E%FaM0^k1GdA)dd$hJ(!)IvmplDRCi_?GHRCH?581EE>yZ~QXk zi(w)>{PdQ*?BYDG8^ z)BM@0GVKd8X32zfw1$UPsZ)Ot@^Kh)3QIStXY7%1Uz+_*I!K_o==OF!?f)so#QS&# zlbmgLI9q6@)zR-X12LcE)iTh+VMJ#@!&N8Zco!+%V`d2w(E*|W?|U% zubjc}4-3DOVvh%T7f@uaw>RScI1i^Phd~>M`U2)fR_QpKzDLFJOUEX?iP3M7^b5)D zRM9_+7<1~lVQ^0>h$3lHg!D2F%m}5XQj&$>&u|oeFW1$2*B8Fn3!O&X>^PnG9YhOVnM5pua{hAbkfT*^=_x@5i9d1*pIPML%;$W{l z(}qGcU(0J{^~1n8z_u&-)_A+|enBdJcNJ}^@22Zw_mHQLT<7xZ1ugBodozx1U4GRn zfNq`t{(4y!xwe-dRgBbDKiUBY2_M4e1@WJ$2kFa(en(l|EsI-jUm6=OB zJk7p?4|PfZJ6Ejp?57s*he@u=IgLbiwim=9Z z<3r6>vd6cY$FEM73;7%sW68Wo?MGenIouDU;ePRTH0ZlfiRW=B>Dbyg-DftgM#_iD z=V)1mWYydX__O$mM+|*lFk^g9vu*Bn%W>O=#dH&kv$VD9fTw#x6XEP(_}bu8K+oa} z(LS@QLVF+W#uMk?M*C%z(~SskinbH>eIFNU5iJs`D2qu$TNnnD^WQLumiG-jxK$q< z0E|h_@{=q#sKisX=AUwqnB4X6)xD2XwRkLiKk2eq_1~?2iIRo8sNHT%tBS1T*!3-@ zbuDnS=iYZp_QiKS6S_Tbs1q?NTxe7SrqdADddv+1a*l_ms(61 z@|GL?J9wBF(|4DR;Zbm26&JP%xYl9{FBs*s{Zc}ac1}$t$_0N-CbUWwLK5- z3N5MMJ919ERGu8*Bx_I0bdPvD$ttZdBgJ z3XNgkFM*PgmhJnCnAGyhap)lVsp9ox{x`-ypc^6g8KP7s+#?~B>~*ni7K)BaU5D=f zgJ4>|D!uzZBe1*2u+7^om-WpG`SXw4w^Cd9grTck4h!NdZ-RYrS&Yg!TemR&7794! z3Zb98?ec9z-Nq_M?5JtsQNFKGT1Cp0!^%T->Hy5V@G+IIB+EDm>sJ50aG`a>WXsMB z8tu1WJBSYX)HIiJ3kFw#y-(#_*txB_}BNV81gFv)TOdw!j_$B(yi(X z`v2}mk|nb$)^`qz=chNEcck|2;flCn%FN#Q8g=|$OByZSylt<|w|x)q%9MjVa4
  • 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 E4_Nys#sB~S diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/cases/NumberForCell.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/cases/NumberForCell.png index 7eaee5d06bb81e453b84ba30a3a29b969203935e..9c001820a3a6d7b6d88114cd2019641f20d2e74a 100644 GIT binary patch literal 10515 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
  • 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 E4_Nys#sB~S diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/DuplicateNumber.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/DuplicateNumber.png index 64fb4fc865c281f533be041dc6aad136e9e208ac..3609464354b491fa87bae7deaee101a4f360f50c 100644 GIT binary patch literal 4460 zcmeAS@N?(olHy`uVBq!ia0y~yVEhJTw{S24$+sf&rUEI(;vjb?hIQv;UIIBR>5jgR z3=A9lx&I`x0{NT;9+AZi3@R@`n6W9DRfd5!GN=7J z-)`j@t;!o5{)(NNGx5WMwi1?R`5iB>?@D(Jxq83O)#b?lm2-Z0{}UAae>Ch!rRB%z z2Dbz!3fBkv{ZZ{Hb9r(keu{8C=VDnw%a7tukHjC!IKBV>*Yi(`R>b}L@tFVj{U=Tt z@i)3G^ws|fxkcxEnasVg>SX7Cl`Z-?u5+e?bn2S@I@ubq_sNlZp}9_c4;IqGJ=Q()EfIY0cJ zejkE4Flq7p7>=vnet*;#)+TB{+5_}}MDE6m{(3F1RMr1YzOZkDXki@41KV!AP#1Ul zI!XAyCyFz(Z+-2&pIF-$uvcf^)-Ugm$Z2nGL$-5&n`>w6wdWjHPd|$E{_po@qfs`h z{)j0zQb)Cq2Hj|~fo0Rdlx5D%{-^inv1eEsFG}gc+by(v&3VC9(~oYR_HXX>FOTni zT&^BD(-ft!GSxZtdEQ=Ac;-K+Ty?(ffAyrPk^Jq15AIH0b4CiKT$U1h zsyt_c{Nr@}jdt!U;>6BJ{VLz*x?k9)3QG{wJUst=@&DAua$*$QG%q$fxOjTReB}`R z?sVP1*7q0P=ajQOd1?(xDZV~2aNfbdnGY^{BjPIm;(L~UY#uxRV1>_z7f7MC{Y80` zyZ;9Vi;3Bqwl9ZXs zDYy5?FPVi^kv7>c@BbA0>-XUWwy5IiJH^tE6je3db?Oygu*E-{duo&WXmE}O=VsJ`%3Rv{kh%5?)noJdRmQBuyXH4y?*YgATb{ zDJ3?VY#^;GlCun`M}BR(hNTEfdvHMe>6pU_h=B-q7r#HQ@bQYX>*N13me~sk%KtA_ R1CEd|c)I$ztaD0e0suUQ9ZvuN literal 2413 zcmb_d2~bm67EM?>h^T-dw&I4OECCu&qmhK&h(bsMvTImOr)_Z{fe*@m#h2bZt~B9I4g)4>@8ktqN% zhXM+;JecD^IszX|qq8}@agk_2rWdrNJA*_ma?3(Xu$GKQ;Q|0fhMei+pmv<@3}PZ% z1dzdKl0G~<4AwT0LGJwgd_sIY00>f3Q#llb%!4lAm3Sa1oNf3OXF$ZESR#mQHW2}c zxak-zj}qPjuLKWTLJ;H@k$_1AWsq%n*)+{k%aXzoeQTG(0f3JmKW1iT78DeKl%Iq0 zWx*}X1?vj7_5Xe#t_$b-!1}8~j(CNF0Vx~M*;AQEArM%BgPpb8g_F}oXR-$EG?Fld z>T0DAbG!+q@iaN3Yu?J9#{4z|O+_jI1Wt7y%BmPB>UE%x5Bqb)r2~`ZBJ{9-_;}_< z1d89jzcUdcQMq?1=&4G#7ISDUSKw5|T>P7#Z}g_dSW<*lDZK0&x?>bM)<_0!*cKSq z;EZdVmo$8iRR^6cbNv|pIeO=s;_;zW(&!bBq|xG5I@77D1Pg?~!UL5@<<4VLycq9P zOk}FKOCOu`BNthsst`gJLgP&<+Q6a|nnZR4uI04*2m&r(w6I%lL`grh1b!Dd=*R+O zWK*r_*r?r5PTw>OA+I7DD&%fVjBuh=3fm0Ft)IzX5E@(^j~;s+B=s7q=#bz zG+|=81|K>wtF(sWwgP=N^fsGsxn@M<=db-W*IeWXd*9_B>2+YKH_WQ>`eh>0uQ4)P zi0jz=*7W#*%Un#o&etK->u2PlENaG+;v-WJNb8I24Vy{pw|JnfgB@)mMQG%P2U31i z7~FL-L#h?3h@!X!4NM$V7?}T`sY_k5MzC zq>0h!uB3Isr@IW&a3s42S82Btglb;ydWNy>eLs7+lM<*qse~x6DIDqX9CgktXS;(x-2{O&!@H47{d99ba0b_XG2khf%|A9ZNYkS& zGl`kA$#BE$g@>tUla6<1Ab0z!=jmie6%wjtosbjig6p-}(jxM+OQLd-5<&3OWEVO$ z+K(Zv1}=$LN#LbZui;B({X^m&%}dQ@_;U7p-0Qs;*Jeml7Pmgq4JbU!-Jvd+nN9-h zsC2VoP3m(`EUdWdUCqzT;DxXWPwcLdXA-rGX*kK*TrJ~lzxf5bll(XK_{$osV z&thMWSoV}mDB8Sado|WMm9qmG(rsdsi`!*Q;_sdQEa}k%#sP&qtszY+`ScWWjEa$U z?U-|1yL4owt^+AoLa;w=D_s2T+y34>VAC1prrlTV`?VqYY!bDOy3-9LD`_qWQ|cQ` z43BPB<}$+xniv^T&0wZ{B-x#?+^~{>M^X~1*W2G*qjy%%qUF_!O)|pUqB(c)9E3FD z?a~c>Tr9j>k!zbm;bnTS)!lmX*e?gO?_V~$MPzwOPMbF74%T_XQ_>i^ceQQ)NtSZP z!3d^G{}DXlrP;?`-n72;!pqe#c^%ceepU))8&r}*Sl4o&(?NKscNA72fE6W z$=J<-^1c-=)Z<~k%b)AH__M~o(h>R{Q~d53A@bm;PS)gGe$d;k?{q+4okSF05WWz} zHwRys5Aai?*J<6#4$#zReD!0Hfs9YZ`L4Y`m@j99mJ2!#V+|@j?cCo{2HP>&GWff>n0hi0<<9ZvP!xGYiifewZ(zqI{dYKh_Fvj!l`!HRF}O~r5DXu_4mhJDnj+}QQ(zjPEJcAuG=%Sm3pT#u;A$J260X!36`ePCs=e2g3_=unwQ)Q4Kb%P3WS$2T{ADH77x06= Z!k#nZ(snP>&VW}p#K9hG$FT8>`#a>+vu^+Z diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/ExceedingVisibility.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/ExceedingVisibility.png index 64fb4fc865c281f533be041dc6aad136e9e208ac..e9253b5992a31069c4677e6d2fe5d5a9eca2376e 100644 GIT binary patch literal 4542 zcmeAS@N?(olHy`uVBq!ia0y~yU}6EXTR512WP<+^10cm%9OUlAu0@ir_{7?E0ef@$de2lp>X{npjO>mp1}iO6 zN2N!D1(+Lv$#OI~43}KuU(54P;NN3mXsmwwr})QR{n~S`tEZpcII(B>)SKHLmYSgLwz3yK{Xg_lZp|5~TjF7Y zb8F6gpK|{H_aArF6IhazS0)Di{qXRo-2T@`e#I=Tx+x<)^ZTCex_YVlYYnjChX2RB zPY?fF&-nqfL3p2eeY^17i22$f`m>XjKhF~ne5e1Y|9)EPHE@}@k-{{M{6)iSv$ zm`##WyUIL&X8Igt8(P!)3y!XaIjQ8&yiZI2bN)F9bJF@pmp=*rX!cukUUb#;vl}N? zp4VRSm3zkv+psiVaPeGK>;LoEf0KW2U|}@Pw51gew3 zHiSsm#L5+{Kr&vkmCL^Bz(U==eZ;7~ssGiIKfmA|FU;G}S}Ex8l3Nd6e`;_>ih|jE zr{>guYH`lrV3eH^AK_X8tf7F_AUOEh;-|CAyh23qosxiOebj`ip^uppHV#a?}zyh#{G4j*qnL*!>M%#*2gDdaVlE8ft>pOX+ zoSJ_I!>QGO-ocX|avVsbI`!EP_8)TltEXaf>KRn0TK;3)cl>=^DmJGYql9W^UwuPU z{GPMeQdcHQ>bflRpW*(8%WSZ0^~7*Ti(p6Zk~Yt+2ai8vY)2{+=3e|~{$~q2EOS)y z=p{l5gWL~$D-SG0WIX@$E&qA#-(pRz`KY#wU9CUte;Zr!n?DC7`F(MD4|Jv$b=VYcM^$+D!j2D%r(sk099?0>`{@bTd=tL_#W!1= z?!Jw0!Wuv=r~$+t`#tT!0SdHmBFVZKx{B)9N>i2Z5#$CnviH$PYN`cu2(JKO@PTDPC;>Lst69tL(MfW`K` z1MN>v?|7$*&>$7{d+m;2a1D0P>NnR|L7XGH9A5wV&%sPHqtcb5!GfseN0S5T$>E99 zinwq0*F5K00;{Imu&r+aHyojLqo-cWE7ksk+K_f3w23!~dtuedh^T-dw&I4OECCu&qmhK&h(bsMvTImOr)_Z{fe*@m#h2bZt~B9I4g)4>@8ktqN% zhXM+;JecD^IszX|qq8}@agk_2rWdrNJA*_ma?3(Xu$GKQ;Q|0fhMei+pmv<@3}PZ% z1dzdKl0G~<4AwT0LGJwgd_sIY00>f3Q#llb%!4lAm3Sa1oNf3OXF$ZESR#mQHW2}c zxak-zj}qPjuLKWTLJ;H@k$_1AWsq%n*)+{k%aXzoeQTG(0f3JmKW1iT78DeKl%Iq0 zWx*}X1?vj7_5Xe#t_$b-!1}8~j(CNF0Vx~M*;AQEArM%BgPpb8g_F}oXR-$EG?Fld z>T0DAbG!+q@iaN3Yu?J9#{4z|O+_jI1Wt7y%BmPB>UE%x5Bqb)r2~`ZBJ{9-_;}_< z1d89jzcUdcQMq?1=&4G#7ISDUSKw5|T>P7#Z}g_dSW<*lDZK0&x?>bM)<_0!*cKSq z;EZdVmo$8iRR^6cbNv|pIeO=s;_;zW(&!bBq|xG5I@77D1Pg?~!UL5@<<4VLycq9P zOk}FKOCOu`BNthsst`gJLgP&<+Q6a|nnZR4uI04*2m&r(w6I%lL`grh1b!Dd=*R+O zWK*r_*r?r5PTw>OA+I7DD&%fVjBuh=3fm0Ft)IzX5E@(^j~;s+B=s7q=#bz zG+|=81|K>wtF(sWwgP=N^fsGsxn@M<=db-W*IeWXd*9_B>2+YKH_WQ>`eh>0uQ4)P zi0jz=*7W#*%Un#o&etK->u2PlENaG+;v-WJNb8I24Vy{pw|JnfgB@)mMQG%P2U31i z7~FL-L#h?3h@!X!4NM$V7?}T`sY_k5MzC zq>0h!uB3Isr@IW&a3s42S82Btglb;ydWNy>eLs7+lM<*qse~x6DIDqX9CgktXS;(x-2{O&!@H47{d99ba0b_XG2khf%|A9ZNYkS& zGl`kA$#BE$g@>tUla6<1Ab0z!=jmie6%wjtosbjig6p-}(jxM+OQLd-5<&3OWEVO$ z+K(Zv1}=$LN#LbZui;B({X^m&%}dQ@_;U7p-0Qs;*Jeml7Pmgq4JbU!-Jvd+nN9-h zsC2VoP3m(`EUdWdUCqzT;DxXWPwcLdXA-rGX*kK*TrJ~lzxf5bll(XK_{$osV z&thMWSoV}mDB8Sado|WMm9qmG(rsdsi`!*Q;_sdQEa}k%#sP&qtszY+`ScWWjEa$U z?U-|1yL4owt^+AoLa;w=D_s2T+y34>VAC1prrlTV`?VqYY!bDOy3-9LD`_qWQ|cQ` z43BPB<}$+xniv^T&0wZ{B-x#?+^~{>M^X~1*W2G*qjy%%qUF_!O)|pUqB(c)9E3FD z?a~c>Tr9j>k!zbm;bnTS)!lmX*e?gO?_V~$MPzwOPMbF74%T_XQ_>i^ceQQ)NtSZP z!3d^G{}DXlrP;?`-n72;!pqe#c^%ceepU))8&r}*Sl4o&(?NKscNA72fE6W z$=J<-^1c-=)Z<~k%b)AH__M~o(h>R{Q~d53A@bm;PS)gGe$d;k?{q+4okSF05WWz} zHwRys5Aai?*J<6#4$#zReD!0Hfs9YZ`L4Y`m@j99mJ2!#V+|@j?cCo{2HP>&GWff>n0hi0<<9ZvP!xGYiifewZ(zqI{dYKh_Fvj!l`!HRF}O~r5DXu_4mhJDnj+}QQ(zjPEJcAuG=%Sm3pT#u;A$J260X!36`ePCs=e2g3_=unwQ)Q4Kb%P3WS$2T{ADH77x06= Z!k#nZ(snP>&VW}p#K9hG$FT8>`#a>+vu^+Z diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/InsufficientVisibility.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/InsufficientVisibility.png index 64fb4fc865c281f533be041dc6aad136e9e208ac..6447242fa03a70415f5b1dc80965b718384cf6e7 100644 GIT binary patch literal 4777 zcmeHLX;4#F6iz^hC=ns05kcZ$0mTYc6cm97gd$c6DvCHj1Y~h5VbHQC%8~^aMk`G% znuxRomqw|msDyxkiW^46SgjBc*(?zDr#zBAcn|VkJHt$8`lHj~N0ys+&b?>(&Ua2O z-`B^BIAiV%91chHUQ64A!)eWezH_E)LGMmKW%oiK_}EQe?l|!ivvz1PEz)g+8xB{P zH4_Zcf!2D=wE?j>+-Gg0FMMj4ju{ST@P^*R51g7Xb6#*V!8R%BmAFN5t#qwRfnp2y=!kLRDuQy=3+Z}SYy&Of)n z%E&OmCh`7enIVbKb2fHqKHtXU(`dp>^IpIGm9%E6dYD?x^%&^wW~*Pba+2p4*_ zKNyua%<=6#yw%YE-KZ*W!@>`13W9t60`)p)UgTXI+ojU#Wb%AJy966? z`e4SE$}I^tPN5c|q;;;dF9@8C{oRM}*fd>mHlDZCuu#vEGQI9AVdmo8ln~>XEyB!W z-}7FkpD;-8u%uUIKP|nIS!_f1^jc5b>t0Q8A2^ZUv@VJ-&Hp`>hc~h^6BB>=Auw(p7|k>b@wx3;60$J1Rd0<|h7TW_oI9|C)zvZmr9< zQ!5}|Ipgc8{h9$yuEA+(#SNEEga*YEwGa|B> zRa=k)xCUxNaeS7>fs23=)KZ-#y^qc42#?*nvp!bm8VgT;gOqp#(9Fh@B@oSz(d+Ix zzgs3pvrO18PzR)LmvU~~7B1T}%CGjx-O#Fj{)9nY913-LpS9`f_nIgro1bBs$b&** zcJ%?Cu}$O>w}~?XO_N#X%mR%~eIcK0R~}AfK$a?W7hmN-y`iW)vQ$CVkpeoPTN2VH zE`%`mDLWI&a(yn<7+(-PEDGx@QnS?ddn-Knlns6uA^wOibP^Xhsln4x> z=60%&E@ZYLj`cH@DI#`nx<@C{CJQ*_*UE3S;<-+RuKoqV4)?xnaT)1hEA3Agmp`~P z+Wn&MUWHasb`vod6H8qTRzBC{s69)aCTgriLJ)5+%z!{OiTiXmNC6Kr7)XX3-v$79 zDJx9_8wUV%R`_aQnNL+2u*xpm!6>N8=~)J;OD9QbEk#YBD&zvVQkoven?ULf8rX=5 zuGGJ|(A{%82@Y*fM2UXG+c-ODNExpbUB+2VVEgZ>%ZGqBE^yl8?ajH6x?pU8fd&#{ z+MYDKr`od)grh(Jrt!2 zD=s@bzylggf)C$ogw$P-LB_8_@k+6v|DeYi%{%bYA$`LFg zAP$r0m5yM42HO5TSo^ORs7zU}IEcTzp+-~IM;~E`jw}{BZ7O zP_FHSDQ8H*pUvuLp-qp$n(nx~e)!BBWOMTpBlX$1P&9VBYcY}Ep4&CpUAY6^U7*MY zA|)gbbY{4)Al=Xy!2Da1LcX@H4iUv_QY+ro~nXPD$a-`Lp4I@XV=G}83$~}Ow zFm|4?v|~H~vN;XI?5@>I(Y3(EGE$tZo6MBm3xFHn;?f~TnWqGuyuZkkH+IRH@^N`f z*Fi=_&}8yAp8g?-c{46gDeY(6J@9YJ`}@9!_8;#NoElIN6Eq1y*0jpnMP)}Fkvx!G z``B8J*HJXDO%X0Rc0FW*TwIShsAt)szWJMEt(J|MZ&rNV#g?ql+M919D&CxJaOzotyA540 O;k-S4Xkzyrseb~1mJksD literal 2413 zcmb_d2~bm67EM?>h^T-dw&I4OECCu&qmhK&h(bsMvTImOr)_Z{fe*@m#h2bZt~B9I4g)4>@8ktqN% zhXM+;JecD^IszX|qq8}@agk_2rWdrNJA*_ma?3(Xu$GKQ;Q|0fhMei+pmv<@3}PZ% z1dzdKl0G~<4AwT0LGJwgd_sIY00>f3Q#llb%!4lAm3Sa1oNf3OXF$ZESR#mQHW2}c zxak-zj}qPjuLKWTLJ;H@k$_1AWsq%n*)+{k%aXzoeQTG(0f3JmKW1iT78DeKl%Iq0 zWx*}X1?vj7_5Xe#t_$b-!1}8~j(CNF0Vx~M*;AQEArM%BgPpb8g_F}oXR-$EG?Fld z>T0DAbG!+q@iaN3Yu?J9#{4z|O+_jI1Wt7y%BmPB>UE%x5Bqb)r2~`ZBJ{9-_;}_< z1d89jzcUdcQMq?1=&4G#7ISDUSKw5|T>P7#Z}g_dSW<*lDZK0&x?>bM)<_0!*cKSq z;EZdVmo$8iRR^6cbNv|pIeO=s;_;zW(&!bBq|xG5I@77D1Pg?~!UL5@<<4VLycq9P zOk}FKOCOu`BNthsst`gJLgP&<+Q6a|nnZR4uI04*2m&r(w6I%lL`grh1b!Dd=*R+O zWK*r_*r?r5PTw>OA+I7DD&%fVjBuh=3fm0Ft)IzX5E@(^j~;s+B=s7q=#bz zG+|=81|K>wtF(sWwgP=N^fsGsxn@M<=db-W*IeWXd*9_B>2+YKH_WQ>`eh>0uQ4)P zi0jz=*7W#*%Un#o&etK->u2PlENaG+;v-WJNb8I24Vy{pw|JnfgB@)mMQG%P2U31i z7~FL-L#h?3h@!X!4NM$V7?}T`sY_k5MzC zq>0h!uB3Isr@IW&a3s42S82Btglb;ydWNy>eLs7+lM<*qse~x6DIDqX9CgktXS;(x-2{O&!@H47{d99ba0b_XG2khf%|A9ZNYkS& zGl`kA$#BE$g@>tUla6<1Ab0z!=jmie6%wjtosbjig6p-}(jxM+OQLd-5<&3OWEVO$ z+K(Zv1}=$LN#LbZui;B({X^m&%}dQ@_;U7p-0Qs;*Jeml7Pmgq4JbU!-Jvd+nN9-h zsC2VoP3m(`EUdWdUCqzT;DxXWPwcLdXA-rGX*kK*TrJ~lzxf5bll(XK_{$osV z&thMWSoV}mDB8Sado|WMm9qmG(rsdsi`!*Q;_sdQEa}k%#sP&qtszY+`ScWWjEa$U z?U-|1yL4owt^+AoLa;w=D_s2T+y34>VAC1prrlTV`?VqYY!bDOy3-9LD`_qWQ|cQ` z43BPB<}$+xniv^T&0wZ{B-x#?+^~{>M^X~1*W2G*qjy%%qUF_!O)|pUqB(c)9E3FD z?a~c>Tr9j>k!zbm;bnTS)!lmX*e?gO?_V~$MPzwOPMbF74%T_XQ_>i^ceQQ)NtSZP z!3d^G{}DXlrP;?`-n72;!pqe#c^%ceepU))8&r}*Sl4o&(?NKscNA72fE6W z$=J<-^1c-=)Z<~k%b)AH__M~o(h>R{Q~d53A@bm;PS)gGe$d;k?{q+4okSF05WWz} zHwRys5Aai?*J<6#4$#zReD!0Hfs9YZ`L4Y`m@j99mJ2!#V+|@j?cCo{2HP>&GWff>n0hi0<<9ZvP!xGYiifewZ(zqI{dYKh_Fvj!l`!HRF}O~r5DXu_4mhJDnj+}QQ(zjPEJcAuG=%Sm3pT#u;A$J260X!36`ePCs=e2g3_=unwQ)Q4Kb%P3WS$2T{ADH77x06= Z!k#nZ(snP>&VW}p#K9hG$FT8>`#a>+vu^+Z diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/PreemptiveVisibility.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/PreemptiveVisibility.png index 64fb4fc865c281f533be041dc6aad136e9e208ac..759ced1a84caa4e215fb2c1341237ca463c5706f 100644 GIT binary patch literal 3883 zcmeAS@N?(olHy`uVBq!ia0y~yU=jkdTRE73WaHvCDH zpZuC7?gvX)!+b5T33Ys-Axi>s_nbIu(k&}xFyZI*>8n<);(vX!B1G=f4<-U|B8qI;_3QV{tC4VMW-$S z$qU}jnA@mWmDqb#=aP6-pl6lYqX6-Zz1Jiq7KvYrIIA>B6#l-j!78*tiYoul|H1tS zL)}BRE3P?<-#Q=ur;&Gv{R6kB&UsT8eVetBOZ2xW@nk<0{;|mV?yvRgzxf|uhnf0@ z|DjZk#Qtf>zCW}f%&z_Yt_xHDf01{t|NTUE58Pk&5086)_;%8|Vmh*hNgIOgde`s1 zaP)u4;rWjk`(cLbuzi2Xh#FixVyD{VbAB8II&b^Sn;p(jzhP6@_2DA3+}`fx_|^5q z-%`)-zkhJ|?JuCRJxMxOUP`R__lE{|6z?BCXjJ)os=CcC-}7!Vuavf3{I)RBa0fqs z#S~L#mLcJXk2#T{D((o;M(Pe z+wJzYqYvzC9s~-VF6O<+?Vm07l6&nAN$VHve||X8OHK8kH-3cdBB(};`vp)<6kc

    uenH`p7S5e*TXy zb$Fd4eEYey-QIY75wCaT)z3Encqe>n@($kvsc|KsM$oQG5wCN&yxo7i*orT;K9b9k zdANA`Wqg5Cy`eDfds+>!DT6xzy*K2={UV@7dP8hDD$#{Gbt0ejxR9>yd7feb* zr=J%8SchK?|Lmuif9#@M4Y2$KnuE7oP~xl@6fL~F0VlCnpLaPl`l-!|IZxz XSt4iQhmCW99b5)aS3j3^P6h^T-dw&I4OECCu&qmhK&h(bsMvTImOr)_Z{fe*@m#h2bZt~B9I4g)4>@8ktqN% zhXM+;JecD^IszX|qq8}@agk_2rWdrNJA*_ma?3(Xu$GKQ;Q|0fhMei+pmv<@3}PZ% z1dzdKl0G~<4AwT0LGJwgd_sIY00>f3Q#llb%!4lAm3Sa1oNf3OXF$ZESR#mQHW2}c zxak-zj}qPjuLKWTLJ;H@k$_1AWsq%n*)+{k%aXzoeQTG(0f3JmKW1iT78DeKl%Iq0 zWx*}X1?vj7_5Xe#t_$b-!1}8~j(CNF0Vx~M*;AQEArM%BgPpb8g_F}oXR-$EG?Fld z>T0DAbG!+q@iaN3Yu?J9#{4z|O+_jI1Wt7y%BmPB>UE%x5Bqb)r2~`ZBJ{9-_;}_< z1d89jzcUdcQMq?1=&4G#7ISDUSKw5|T>P7#Z}g_dSW<*lDZK0&x?>bM)<_0!*cKSq z;EZdVmo$8iRR^6cbNv|pIeO=s;_;zW(&!bBq|xG5I@77D1Pg?~!UL5@<<4VLycq9P zOk}FKOCOu`BNthsst`gJLgP&<+Q6a|nnZR4uI04*2m&r(w6I%lL`grh1b!Dd=*R+O zWK*r_*r?r5PTw>OA+I7DD&%fVjBuh=3fm0Ft)IzX5E@(^j~;s+B=s7q=#bz zG+|=81|K>wtF(sWwgP=N^fsGsxn@M<=db-W*IeWXd*9_B>2+YKH_WQ>`eh>0uQ4)P zi0jz=*7W#*%Un#o&etK->u2PlENaG+;v-WJNb8I24Vy{pw|JnfgB@)mMQG%P2U31i z7~FL-L#h?3h@!X!4NM$V7?}T`sY_k5MzC zq>0h!uB3Isr@IW&a3s42S82Btglb;ydWNy>eLs7+lM<*qse~x6DIDqX9CgktXS;(x-2{O&!@H47{d99ba0b_XG2khf%|A9ZNYkS& zGl`kA$#BE$g@>tUla6<1Ab0z!=jmie6%wjtosbjig6p-}(jxM+OQLd-5<&3OWEVO$ z+K(Zv1}=$LN#LbZui;B({X^m&%}dQ@_;U7p-0Qs;*Jeml7Pmgq4JbU!-Jvd+nN9-h zsC2VoP3m(`EUdWdUCqzT;DxXWPwcLdXA-rGX*kK*TrJ~lzxf5bll(XK_{$osV z&thMWSoV}mDB8Sado|WMm9qmG(rsdsi`!*Q;_sdQEa}k%#sP&qtszY+`ScWWjEa$U z?U-|1yL4owt^+AoLa;w=D_s2T+y34>VAC1prrlTV`?VqYY!bDOy3-9LD`_qWQ|cQ` z43BPB<}$+xniv^T&0wZ{B-x#?+^~{>M^X~1*W2G*qjy%%qUF_!O)|pUqB(c)9E3FD z?a~c>Tr9j>k!zbm;bnTS)!lmX*e?gO?_V~$MPzwOPMbF74%T_XQ_>i^ceQQ)NtSZP z!3d^G{}DXlrP;?`-n72;!pqe#c^%ceepU))8&r}*Sl4o&(?NKscNA72fE6W z$=J<-^1c-=)Z<~k%b)AH__M~o(h>R{Q~d53A@bm;PS)gGe$d;k?{q+4okSF05WWz} zHwRys5Aai?*J<6#4$#zReD!0Hfs9YZ`L4Y`m@j99mJ2!#V+|@j?cCo{2HP>&GWff>n0hi0<<9ZvP!xGYiifewZ(zqI{dYKh_Fvj!l`!HRF}O~r5DXu_4mhJDnj+}QQ(zjPEJcAuG=%Sm3pT#u;A$J260X!36`ePCs=e2g3_=unwQ)Q4Kb%P3WS$2T{ADH77x06= Z!k#nZ(snP>&VW}p#K9hG$FT8>`#a>+vu^+Z diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/UnresolvedCell.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/UnresolvedCell.png index 64fb4fc865c281f533be041dc6aad136e9e208ac..88f915a2c1b98a52b045bb2f1000a1d2b67afc90 100644 GIT binary patch literal 5936 zcmeAS@N?(olHy`uVBq!ia0y~yU=mk44ofy`glX(f`u%tWs zIx;Y9?C1WI$O`0h7I;J!Gcc&U0Aa?aWL6ml2C<`_E{-7;ac^%ru3KX{DdyoVuYA|v z7xqk#)xO{$ePUUUI^(kNyFt(Xb4>}XwfoT`xQEe3`A+SJf8WYI>;M1$A0Qm(>Rb2w zt+{yHmwJO0R~o|ug~i)g*rr;2(8_vrXu^R7LF_;kF%m)&As_dD`Oox{ef=UeJswV; zRS69*^)B(lBo8uNj$If`l)jBCF0 zAt$8O$J2i7e^_RVET(-->&N9EoAZ#9*tIUz58@w>A4N`RYlI&E7p_|*ikxb`CVu$O zRJTG1RqWM&sk+tt$YN6y@BKHbTZbZMns`J0$D;${^-T2vZO938mch&B{<;H8>pNGc zqB!7WywsQ9pY|WvYlQ69u*Zj|+^_#6tT$B=Dd}&Jl3(`c-{koPD|wI|V%zuh!})^6 zM2YeL*oER?+rGaah!u0M3GYPqlicyHAIkeyyC7#r{bc(;g7>!~XV?wXH!A(>cprtF zrEi>$5M}A=`GS&qs(HJWe!S2`u|Y)4^~1$%OT{T@WD7y?&tQ;56_QrKsMp)w>$9`|1JOYay!>ggqCM_XZ-rVKc~AD zIiR}?zt%I_Uui)Wi!%IF&%6IBikOz+`+7jcGq8N30i3r9(yrwrcwm;G@RB^6$4 z@%*2EsDB!28tnO5FJHGECAF0%9Qz;r@iI!v9xcO1WG&?;DCIhddod7k^eUZf4FsYV zw~0>!YRv z>-BX3!s0;lRKIat_615C+S&q*-m-u%%0UJ%O8B-Q)FA=no~2z}0B2gx zzqLB)@nSp*{1aV)?Uua_IFo!8%jt*nA0FeznFH5Wt!bTK_?{J9P+`j%VcOdc&Oac( z2e%!s4$FaBt$3W7`md1vjsHK^clcb&IQt=cOcf)}V&p56*<=dGz)@}nPgg&ebxsLQ E0D-)p(f|Me literal 2413 zcmb_d2~bm67EM?>h^T-dw&I4OECCu&qmhK&h(bsMvTImOr)_Z{fe*@m#h2bZt~B9I4g)4>@8ktqN% zhXM+;JecD^IszX|qq8}@agk_2rWdrNJA*_ma?3(Xu$GKQ;Q|0fhMei+pmv<@3}PZ% z1dzdKl0G~<4AwT0LGJwgd_sIY00>f3Q#llb%!4lAm3Sa1oNf3OXF$ZESR#mQHW2}c zxak-zj}qPjuLKWTLJ;H@k$_1AWsq%n*)+{k%aXzoeQTG(0f3JmKW1iT78DeKl%Iq0 zWx*}X1?vj7_5Xe#t_$b-!1}8~j(CNF0Vx~M*;AQEArM%BgPpb8g_F}oXR-$EG?Fld z>T0DAbG!+q@iaN3Yu?J9#{4z|O+_jI1Wt7y%BmPB>UE%x5Bqb)r2~`ZBJ{9-_;}_< z1d89jzcUdcQMq?1=&4G#7ISDUSKw5|T>P7#Z}g_dSW<*lDZK0&x?>bM)<_0!*cKSq z;EZdVmo$8iRR^6cbNv|pIeO=s;_;zW(&!bBq|xG5I@77D1Pg?~!UL5@<<4VLycq9P zOk}FKOCOu`BNthsst`gJLgP&<+Q6a|nnZR4uI04*2m&r(w6I%lL`grh1b!Dd=*R+O zWK*r_*r?r5PTw>OA+I7DD&%fVjBuh=3fm0Ft)IzX5E@(^j~;s+B=s7q=#bz zG+|=81|K>wtF(sWwgP=N^fsGsxn@M<=db-W*IeWXd*9_B>2+YKH_WQ>`eh>0uQ4)P zi0jz=*7W#*%Un#o&etK->u2PlENaG+;v-WJNb8I24Vy{pw|JnfgB@)mMQG%P2U31i z7~FL-L#h?3h@!X!4NM$V7?}T`sY_k5MzC zq>0h!uB3Isr@IW&a3s42S82Btglb;ydWNy>eLs7+lM<*qse~x6DIDqX9CgktXS;(x-2{O&!@H47{d99ba0b_XG2khf%|A9ZNYkS& zGl`kA$#BE$g@>tUla6<1Ab0z!=jmie6%wjtosbjig6p-}(jxM+OQLd-5<&3OWEVO$ z+K(Zv1}=$LN#LbZui;B({X^m&%}dQ@_;U7p-0Qs;*Jeml7Pmgq4JbU!-Jvd+nN9-h zsC2VoP3m(`EUdWdUCqzT;DxXWPwcLdXA-rGX*kK*TrJ~lzxf5bll(XK_{$osV z&thMWSoV}mDB8Sado|WMm9qmG(rsdsi`!*Q;_sdQEa}k%#sP&qtszY+`ScWWjEa$U z?U-|1yL4owt^+AoLa;w=D_s2T+y34>VAC1prrlTV`?VqYY!bDOy3-9LD`_qWQ|cQ` z43BPB<}$+xniv^T&0wZ{B-x#?+^~{>M^X~1*W2G*qjy%%qUF_!O)|pUqB(c)9E3FD z?a~c>Tr9j>k!zbm;bnTS)!lmX*e?gO?_V~$MPzwOPMbF74%T_XQ_>i^ceQQ)NtSZP z!3d^G{}DXlrP;?`-n72;!pqe#c^%ceepU))8&r}*Sl4o&(?NKscNA72fE6W z$=J<-^1c-=)Z<~k%b)AH__M~o(h>R{Q~d53A@bm;PS)gGe$d;k?{q+4okSF05WWz} zHwRys5Aai?*J<6#4$#zReD!0Hfs9YZ`L4Y`m@j99mJ2!#V+|@j?cCo{2HP>&GWff>n0hi0<<9ZvP!xGYiifewZ(zqI{dYKh_Fvj!l`!HRF}O~r5DXu_4mhJDnj+}QQ(zjPEJcAuG=%Sm3pT#u;A$J260X!36`ePCs=e2g3_=unwQ)Q4Kb%P3WS$2T{ADH77x06= Z!k#nZ(snP>&VW}p#K9hG$FT8>`#a>+vu^+Z diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/UnresolvedNumber.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/UnresolvedNumber.png index 64fb4fc865c281f533be041dc6aad136e9e208ac..ce7a6d7e2a8ddb8dc6ba3e2973e1e8bd7b55d7bb 100644 GIT binary patch literal 6965 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 Z!k#nZ(snP>&VW}p#K9hG$FT8>`#a>+vu^+Z diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/rules/FixedMax.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/rules/FixedMax.png index 64fb4fc865c281f533be041dc6aad136e9e208ac..96682092bde95b432385a360f68b58858ede94aa 100644 GIT binary patch literal 1465 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 Z!k#nZ(snP>&VW}p#K9hG$FT8>`#a>+vu^+Z diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/rules/LastCell.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/rules/LastCell.png index 64fb4fc865c281f533be041dc6aad136e9e208ac..9a1b0a419d81d42c8a72b68726b3f314a43ca1ff 100644 GIT binary patch literal 7006 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 Z!k#nZ(snP>&VW}p#K9hG$FT8>`#a>+vu^+Z diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/rules/LastNumber.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/rules/LastNumber.png index 1c219e3281cae048f73668ebffe66ab498201159..3bc3402953d2bb604d755596e18fbf74b34a7ac4 100644 GIT binary patch literal 6936 zcmeHMYfuwc6y88F$}7~01%bqXj8?ROZxpgk2!>PzT1C)S0@Mn&V?mLMnq-ks9)hGW zZKY412)3lI{m9_5Bcz19D5xb zg1(X3U@=zY^R&d^O-T?mM>Y1Pq`hV33PH0@@ww~`DN+4x>^#r21zVfjf~4~@l-N?jl-A$4`OBY?^A=z9(n)?4LTcn$FphYHxpV)AweR&vamgrwCitefGpkkcGhq z+=w3f#3Xm`Pt@VrMeUM_bs)6N>yZ2Gq)jZGhu2r^De~Pjc`d(smyMP>JbPlDFfvAe z$VJ|tEXWt1-=Rk_i=@BFN^^!Of#x-H4E}p{P;@A1cuj6p+N8$uv2UM+UsX@S#<{nS z=zYcQ`I8pS7;R>ve~E8BN6;XgnlklpWom(DM^(WiwZqFX6wjU;@t*x%%r`Gtys9|U z{Ayc6V0F5cEiSj5&($=u2sxtn7N|Y+Dr82uyRP`-DrsioG#jS{N35S0RmqQ+iL9iW zGUBxj*(%9K1&e;kb3t@v;rOdZ^By_+E2KE@HP2GoX8!27<(k+N4$ZvLFIKii3B6q+{gs%WS>wJC0`qpC)G%{JAy)F zR&cz`90PL<#^B-^t^@i240kp}Fm>@o>v_@&dEcimHLCN)KBq`fGN7g8vcKcq`+Evy z&y9oFQ(M1#?~0wo6yib3IG(B0LnCD$4#Dd0YC$;B&7arG(>lg^7%Ug13X#m7#Xwo# zc`fio@0Csl`}n!6WM|?Yw7#&*Lm$2QgNbmucgl$++E7dJ;HtHZTveGU#4SL^B7(N+ zywy^4hjo&$oU!(#Lo@YMxyV0#P2|OBU-{sTS^bviWzF#{R@>c{=B~bnO3r7}K`+@m zAaPn{WU=U8t5blZ(H*a>2eiQ)SsX|l?H7c{F>tHykRXy;j^@z?MTB)Jwir9@{plrF zMi2Ejk~r92+ZnW5(`WibHr@!UV)*QyUn+g%m#oq1gaNy-x3C}onXE6zbx=ZqBQL_* z3{W1=+btYjyw=qi7D2A7gwRj|(K^*~VBmMeUoVQe9c@f#EHS^Hh1oQUYC+u4k@1P1 z0<&BUagiw`PNVQhdPzbdaHmb*5_R%Co*^t1n%P(IP*#k}<%mxMPghe#vTc)rn`b_p zzu{ggWV<+wj{#&~%NvxPR7|@D=yA%DK5yTB{)SXyBU(!=m4RFV#g3jE zvZWUFGsX@VmJ^}az5PJN!83Z%I+$hZ2O;fW-POuadi{-_!t%C`9V-wSOS;MZ`G;Ph9b%3d$J3!T@jL`)f3#m3=tJGFd zfpu}RsT!@->^1r@*Q1Y2rrZbQLqy4L5;Yzg^AWoG8q$S+6$9$TgunrOdf8ng)-iI5 ziFzcU9+Zx#tVjCXvnIWA?$2X-w}SL~b16vuO_RTI?tgZ|Zri}3)JdXL_uHNDmq6SY z;J$!dY%*y*%2bkCw}Z3}aGeR;7kKVQD9y-{+n)uZ%c|xEvT02Da*BFZ&P1{O1q4&XPb|d~OB1I5K1L_C^ zF0~&}YVCkr2^~x#dGzrCWQ?$5@0^>4YQT!;EKyNy+fCe&{n7BPVKI;ho*Z|`NkL|N z=3OuG5D=ver>SRnJTh&>eA+Re_*Oo3^!*=|^8fX2V;*0*`pJ|XRvzT7 mN#GT}ZW(!FgAKI`2-;8S2b)B(t$yUcSr9)cgnOD3o%R<2a3>Z3 literal 28799 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 DOe;ay diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/rules/NEdge.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/rules/NEdge.png index 64fb4fc865c281f533be041dc6aad136e9e208ac..90ca42513803e8eb5fa4b021488ee773d36f754b 100644 GIT binary patch literal 6436 zcmeHMYdDna8Xlx6v&M9?W@R)giehDz2!%cA$PP==NI8rwWJDO zIy}9mpdUruv|Ia6Xj4_GXLvdfeH9~PZkp!t#&ab^g3xmAT=PJ^N+t2<4`~~+l0DD9 zE0Od|tc~M(-dRdMC*N64+9;&iJd3q2mVRn5y{~j}0zUNa5=Vm&`{a|Om6y)pGeWzZ zPGjFvIwC3Gl7{zNWw{QflV^WQ_Ys2Nq$#yq51iPLwf=|SXwg4|C^qCKt&H&eU!*Cq zF1}F+v1hoSt(<8NqNHrd+WMakR&%taDu9~C$Z}o&GUrSXE%BnW6*#|<#sZt{f2dE{ zJh$uKsa?$<7Tr#HR;0(hM)mY+mga%SR?gGA7dz#2egb{k#gUM>9o(iA3MFQ0;{8dKiW%{EvwedzyKj8tAF9PlL^Vj%IIYx18-BKs#=~Smt zo#yIvS^a;CmAWvONIj@8Q}PzR^V5|dhg4rw?|*smkZm?lG$87?VxwvCKxRR!Xd=|T z-_7Z8kjXnxSfBS1C8dXTpv*dD2?Mf?5Unk28FDL|)X<)jnS(k4FGHEi19|*=+##>9 z_zrWZ=Vs}hxp|MUK%YV9I$)BuI+Q4Gij{4yRL7l{#M6e!USs&oKEoM-CEij&XYMX%9lVU^TS;L|FDJ0CA%7nv53 zX-NBPO&(_^a#azY*b1nx1=TZzZF!Tu@D;XY0!Q!3;6_{9b(Rv^JSQ=ygE#{J`feQkK*c1bLpAq~rFm>6bx5vjA2=SlMIl3$J7<^iAbie+Qr{#h5{qiw_m@xtJ1?s6Yg zNXazFyM>=LL)|+9TZsAv7p7)F^2>w{X8ihCT^@IaoHto`v+&3r^1=v+dL$-@+jgO( z;Y`8}_Y5p*`vQqVbsR*}{v!%W?A~Ez+`e}*lM1qDv$ly}=lVl!80TufR=Pw$$kvwL z4B62{zApl_w}adBPP>5Z@u=-ZN@1mgOW*}Gp)Nq3%S@yBp|xpQ&RIYb1=M;+$-3rR z)b_2Y?dPo%j`6SB%KbM!ZL{HC@=m&W&G=)hku|NsUe_8mizSJLL6DL@qmYtD6{%t? z5i3zz~8hKMZf*!KS^}vdrMP+{uH=#|L_d=2%)(!2~pp zf&{L^1a!wx39u)`Ksh6)CSb>}Mio{~!_l&GUx?qZ5E3|)ds;$fHp-2^v@^t3b6*Nt zXG7h2uR9JHasm<7nQA4aH;rYsol&}3q87YP{=5MyV7yB#ATxua5Dm;U+#`-I8Ab88 zdMbY-VmdNW49a0`ep22yA0n9AFsLaigxv+dhdGtNdc79k!}hY4y?IbAIKUf`JKqGR zL`q5d(}BPJFp9xI3&4f{(faQA!(e?XTwgzeTCdkG$j$FBK-~aPkp(XI?;#pFyy-!C z+7%Q7`yc~{omc~Io}Ip^?rNTMzJ+r?72>z#iki478RDOa!vB7GqC{P2TP=GO1O)nY zDD^S>$tMV3hyAbo%u6W#OhEn=lU7X-IY;)u`twQt_||CDAEMVCyXSbxO(K+!&)PgvC8d;?&XCsS-L;C49g}TcfVY=fyHw~ z{eo0>{c$8WE{h4}yK+^#%1-)3bP2O`&=*RWR@PvPN#7S*U|b+W0{kVag$8#y35=5b zN|7w?Y3>q}Oa{IXK*}ABk^qz)r$4Ra<20J0ks9_kye&!z0k^O@gGA1-1qz7Zc9l+c-8ke4 z-6}(}GRXq5A!dMa6@6Qzr2s~l>pgWUL z(tTPwqxvs~EQw^tS8Q-+wleqqwNX#~gv4q>^81(zXj?uc#(Y0SQK+D%r_RwpAJ4vv zRLE0xxp?Vb0wO+To&{R=++U$q=CkE}`t-6%g9Zm?UwzDi6S?VBr%|2e>YrIw(y{f> zah(v|KYQ~1za8nDE`76BKB#|t>Qo~#e%D%R%LU&Sh=%GcB}(rq3x6W`dXIr`HZa>a L+iuF)=pOYiMbeBQ literal 2413 zcmb_d2~bm67EM?>h^T-dw&I4OECCu&qmhK&h(bsMvTImOr)_Z{fe*@m#h2bZt~B9I4g)4>@8ktqN% zhXM+;JecD^IszX|qq8}@agk_2rWdrNJA*_ma?3(Xu$GKQ;Q|0fhMei+pmv<@3}PZ% z1dzdKl0G~<4AwT0LGJwgd_sIY00>f3Q#llb%!4lAm3Sa1oNf3OXF$ZESR#mQHW2}c zxak-zj}qPjuLKWTLJ;H@k$_1AWsq%n*)+{k%aXzoeQTG(0f3JmKW1iT78DeKl%Iq0 zWx*}X1?vj7_5Xe#t_$b-!1}8~j(CNF0Vx~M*;AQEArM%BgPpb8g_F}oXR-$EG?Fld z>T0DAbG!+q@iaN3Yu?J9#{4z|O+_jI1Wt7y%BmPB>UE%x5Bqb)r2~`ZBJ{9-_;}_< z1d89jzcUdcQMq?1=&4G#7ISDUSKw5|T>P7#Z}g_dSW<*lDZK0&x?>bM)<_0!*cKSq z;EZdVmo$8iRR^6cbNv|pIeO=s;_;zW(&!bBq|xG5I@77D1Pg?~!UL5@<<4VLycq9P zOk}FKOCOu`BNthsst`gJLgP&<+Q6a|nnZR4uI04*2m&r(w6I%lL`grh1b!Dd=*R+O zWK*r_*r?r5PTw>OA+I7DD&%fVjBuh=3fm0Ft)IzX5E@(^j~;s+B=s7q=#bz zG+|=81|K>wtF(sWwgP=N^fsGsxn@M<=db-W*IeWXd*9_B>2+YKH_WQ>`eh>0uQ4)P zi0jz=*7W#*%Un#o&etK->u2PlENaG+;v-WJNb8I24Vy{pw|JnfgB@)mMQG%P2U31i z7~FL-L#h?3h@!X!4NM$V7?}T`sY_k5MzC zq>0h!uB3Isr@IW&a3s42S82Btglb;ydWNy>eLs7+lM<*qse~x6DIDqX9CgktXS;(x-2{O&!@H47{d99ba0b_XG2khf%|A9ZNYkS& zGl`kA$#BE$g@>tUla6<1Ab0z!=jmie6%wjtosbjig6p-}(jxM+OQLd-5<&3OWEVO$ z+K(Zv1}=$LN#LbZui;B({X^m&%}dQ@_;U7p-0Qs;*Jeml7Pmgq4JbU!-Jvd+nN9-h zsC2VoP3m(`EUdWdUCqzT;DxXWPwcLdXA-rGX*kK*TrJ~lzxf5bll(XK_{$osV z&thMWSoV}mDB8Sado|WMm9qmG(rsdsi`!*Q;_sdQEa}k%#sP&qtszY+`ScWWjEa$U z?U-|1yL4owt^+AoLa;w=D_s2T+y34>VAC1prrlTV`?VqYY!bDOy3-9LD`_qWQ|cQ` z43BPB<}$+xniv^T&0wZ{B-x#?+^~{>M^X~1*W2G*qjy%%qUF_!O)|pUqB(c)9E3FD z?a~c>Tr9j>k!zbm;bnTS)!lmX*e?gO?_V~$MPzwOPMbF74%T_XQ_>i^ceQQ)NtSZP z!3d^G{}DXlrP;?`-n72;!pqe#c^%ceepU))8&r}*Sl4o&(?NKscNA72fE6W z$=J<-^1c-=)Z<~k%b)AH__M~o(h>R{Q~d53A@bm;PS)gGe$d;k?{q+4okSF05WWz} zHwRys5Aai?*J<6#4$#zReD!0Hfs9YZ`L4Y`m@j99mJ2!#V+|@j?cCo{2HP>&GWff>n0hi0<<9ZvP!xGYiifewZ(zqI{dYKh_Fvj!l`!HRF}O~r5DXu_4mhJDnj+}QQ(zjPEJcAuG=%Sm3pT#u;A$J260X!36`ePCs=e2g3_=unwQ)Q4Kb%P3WS$2T{ADH77x06= Z!k#nZ(snP>&VW}p#K9hG$FT8>`#a>+vu^+Z diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/rules/OneEdge.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/rules/OneEdge.png index 64fb4fc865c281f533be041dc6aad136e9e208ac..8228154664956910bf47d934dac5a500bbaf0255 100644 GIT binary patch literal 4294 zcmeAS@N?(olHy`uVBq!ia0y~yV44hMw{tK7$)jsr`G6E-age(c!@6@aFM%AEbVpxD z28NCO+0J=f;E6U*`G z2`Ut8d(k}IXSavF#U-Uh{Bf#VH|>nxU})%dG*SY{HF~S`_kl-uhh4?gE2p029XxhK zLo_`R$UV8G`%AO3uF|gup+VZSce6?hFAka0s`%@H>Seuwv1Dhv>g8bN^TsanF;_92 zFe-~2>!YDD8X7|+r~KP^_OJVge*Xi&qGxJ##3rNvKUwX}B`fCv%bHbX6YC0=xVp&i z@yhzjpYtw%?q6Q_`3=3Dfm+`;q{zN_9{;eced2S;Mf~fs#9y+zN4b1CxOz$0|2fZ= zt^O~2-;NPfYQ0N5dCyJ#zv!P&xtOKLKhCqh-v2qw5lWr;?GMebxO(C<&qem|t%yQ! z_4&NKUq7?&{AK|atH2Ca&B^=6{6qUa<4-ouUk-*M6{N3}XU~rM$NT4jFsPt?DmU#7 zZ%KYZ$-~3z3x3;Ty1{PEPR%FxkDW)j;lt@yf6E?D-|=@6rsw8g$-O`Q(p zrfZ<}2GE1A-CXM%y|EaXTD%=dxnm&p{o$i9A3)Xh7(H)cpIE#mjS z*1PCmc}?|ge8zMIUJb_gWT)xLOg|8V|21H6G_@)?-WdGRGJZ8yvR zT-&er;!6_}Xa8v5i8IG%Q{I%%{)MG?@x}M6i|6AX-`j;Zj2F+}e{63lKKHJ6x3BN5 zevL1}zj3a3pYH`VKdJBg4nN16nRB>ne=Fbl!8Dy1g}_p&{XC(3y{+}sU(I#@ zxR(PJ-o_UP+gh*vz5Sz@6;n-ZS@Grb_D8Q)K@0C_m+!y=dLbWXq}%P-nfVNu#=AB` z%I+L--apqr{#L`Ha^+6Vhx>c&!`q-0((4tEfW`PP%#!Zcga5_<55p=0Ta(Y?J3?~s zWwWZRQCU#u2U6&ah6bc7I08fC+#!M550f&H8h6l=%Yqx&=<;5M*$#N518lhI&qQiD zLaX+!%?7}RWD1sgZ2&ECn{@9Ou*C}U6ehF&kEZ7&yQA~#|Ji%h*Q-S?XG#H%JurB> L`njxgN@xNAo|syM literal 2413 zcmb_d2~bm67EM?>h^T-dw&I4OECCu&qmhK&h(bsMvTImOr)_Z{fe*@m#h2bZt~B9I4g)4>@8ktqN% zhXM+;JecD^IszX|qq8}@agk_2rWdrNJA*_ma?3(Xu$GKQ;Q|0fhMei+pmv<@3}PZ% z1dzdKl0G~<4AwT0LGJwgd_sIY00>f3Q#llb%!4lAm3Sa1oNf3OXF$ZESR#mQHW2}c zxak-zj}qPjuLKWTLJ;H@k$_1AWsq%n*)+{k%aXzoeQTG(0f3JmKW1iT78DeKl%Iq0 zWx*}X1?vj7_5Xe#t_$b-!1}8~j(CNF0Vx~M*;AQEArM%BgPpb8g_F}oXR-$EG?Fld z>T0DAbG!+q@iaN3Yu?J9#{4z|O+_jI1Wt7y%BmPB>UE%x5Bqb)r2~`ZBJ{9-_;}_< z1d89jzcUdcQMq?1=&4G#7ISDUSKw5|T>P7#Z}g_dSW<*lDZK0&x?>bM)<_0!*cKSq z;EZdVmo$8iRR^6cbNv|pIeO=s;_;zW(&!bBq|xG5I@77D1Pg?~!UL5@<<4VLycq9P zOk}FKOCOu`BNthsst`gJLgP&<+Q6a|nnZR4uI04*2m&r(w6I%lL`grh1b!Dd=*R+O zWK*r_*r?r5PTw>OA+I7DD&%fVjBuh=3fm0Ft)IzX5E@(^j~;s+B=s7q=#bz zG+|=81|K>wtF(sWwgP=N^fsGsxn@M<=db-W*IeWXd*9_B>2+YKH_WQ>`eh>0uQ4)P zi0jz=*7W#*%Un#o&etK->u2PlENaG+;v-WJNb8I24Vy{pw|JnfgB@)mMQG%P2U31i z7~FL-L#h?3h@!X!4NM$V7?}T`sY_k5MzC zq>0h!uB3Isr@IW&a3s42S82Btglb;ydWNy>eLs7+lM<*qse~x6DIDqX9CgktXS;(x-2{O&!@H47{d99ba0b_XG2khf%|A9ZNYkS& zGl`kA$#BE$g@>tUla6<1Ab0z!=jmie6%wjtosbjig6p-}(jxM+OQLd-5<&3OWEVO$ z+K(Zv1}=$LN#LbZui;B({X^m&%}dQ@_;U7p-0Qs;*Jeml7Pmgq4JbU!-Jvd+nN9-h zsC2VoP3m(`EUdWdUCqzT;DxXWPwcLdXA-rGX*kK*TrJ~lzxf5bll(XK_{$osV z&thMWSoV}mDB8Sado|WMm9qmG(rsdsi`!*Q;_sdQEa}k%#sP&qtszY+`ScWWjEa$U z?U-|1yL4owt^+AoLa;w=D_s2T+y34>VAC1prrlTV`?VqYY!bDOy3-9LD`_qWQ|cQ` z43BPB<}$+xniv^T&0wZ{B-x#?+^~{>M^X~1*W2G*qjy%%qUF_!O)|pUqB(c)9E3FD z?a~c>Tr9j>k!zbm;bnTS)!lmX*e?gO?_V~$MPzwOPMbF74%T_XQ_>i^ceQQ)NtSZP z!3d^G{}DXlrP;?`-n72;!pqe#c^%ceepU))8&r}*Sl4o&(?NKscNA72fE6W z$=J<-^1c-=)Z<~k%b)AH__M~o(h>R{Q~d53A@bm;PS)gGe$d;k?{q+4okSF05WWz} zHwRys5Aai?*J<6#4$#zReD!0Hfs9YZ`L4Y`m@j99mJ2!#V+|@j?cCo{2HP>&GWff>n0hi0<<9ZvP!xGYiifewZ(zqI{dYKh_Fvj!l`!HRF}O~r5DXu_4mhJDnj+}QQ(zjPEJcAuG=%Sm3pT#u;A$J260X!36`ePCs=e2g3_=unwQ)Q4Kb%P3WS$2T{ADH77x06= Z!k#nZ(snP>&VW}p#K9hG$FT8>`#a>+vu^+Z From c737e6130461b8f50931b2a0c1f222ff6ed4dab3 Mon Sep 17 00:00:00 2001 From: ThisMatt Date: Fri, 28 Oct 2022 16:07:58 -0400 Subject: [PATCH 32/45] Case rules now use preemptive visibility --- .../puzzle/skyscrapers/rules/CellForNumberCaseRule.java | 2 +- .../puzzle/skyscrapers/rules/NumberForCellCaseRule.java | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java index a03245cb7..fb047871d 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java @@ -77,7 +77,7 @@ public ArrayList getCasesFor(Board board, PuzzleElement puzzleElement, In passed = passed && DupeRule.checkContradictionAt(newCase,newCell)!=null; } if(skyscrapersboard.getViewFlag()){ - PreemptiveTooFewContradictionRule ViewRule = new PreemptiveTooFewContradictionRule(); + PreemptiveVisibilityContradictionRule ViewRule = new PreemptiveVisibilityContradictionRule(); passed = passed && ViewRule.checkContradictionAt(newCase,newCell)!=null; } if(passed){cases.add(newCase);} diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/NumberForCellCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/NumberForCellCaseRule.java index 87eb44da8..b619522a7 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/NumberForCellCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/NumberForCellCaseRule.java @@ -65,9 +65,8 @@ public ArrayList getCases(Board board, PuzzleElement puzzleElement) { passed = passed && DupeRule.checkContradictionAt(newCase,newCell)!=null; } if(skyscrapersboard.getViewFlag()){ - InsufficientVisibilityContradictionRule fewRule = new InsufficientVisibilityContradictionRule(); - ExceedingVisibilityContradictionRule moreRule = new ExceedingVisibilityContradictionRule(); - passed = passed && fewRule.checkContradictionAt(newCase,newCell)!=null && moreRule.checkContradictionAt(newCase,newCell)!=null; + PreemptiveVisibilityContradictionRule ViewRule = new PreemptiveVisibilityContradictionRule(); + passed = passed && ViewRule.checkContradictionAt(newCase,newCell)!=null; } //how should unresolved be handled? should it be? if(passed){cases.add(newCase);} From 74b92f575ab1ce26bc2f9a7deb2b72aa89756b41 Mon Sep 17 00:00:00 2001 From: ThisMatt Date: Fri, 28 Oct 2022 22:45:16 -0400 Subject: [PATCH 33/45] Added a printBoard function to help with debugging --- .../puzzle/skyscrapers/SkyscrapersBoard.java | 17 +++++++++++++++++ .../rules/skyscrapers_reference_sheet.txt | 7 ++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java index 88f28dddf..13f771a29 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java @@ -226,6 +226,23 @@ public List getRowCol(int index, SkyscrapersType type, boolean return list; } + /** + * Prints a semblance of the board to console (helps in debugging) + */ + public void printBoard(){ + for(int i =0; i Date: Fri, 28 Oct 2022 22:46:30 -0400 Subject: [PATCH 34/45] PreemptiveVisibility rule now correctly checks all possibilities --- ...PreemptiveVisibilityContradictionRule.java | 95 ++++++++++++------- .../legup/puzzle/skyscrapers/rules/TODO.md | 9 +- 2 files changed, 62 insertions(+), 42 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveVisibilityContradictionRule.java index 88a9dd8f7..81533ff9c 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveVisibilityContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveVisibilityContradictionRule.java @@ -5,6 +5,7 @@ import edu.rpi.legup.model.rules.ContradictionRule; import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersBoard; import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersCell; +import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersType; import java.awt.*; import java.util.Queue; @@ -54,84 +55,108 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { //check row west clue List rows; - for(int j = 0; j < rowQ.size(); j++) { + int size = rowQ.size(); + for(int j = 0; j < size; j++) { SkyscrapersBoard temp = rowQ.poll(); //get row from the top of the stack - //set flags - boolean dupeTemp = temp.getDupeFlag(); - boolean viewTemp = temp.getViewFlag(); - temp.setDupeFlag(true); - temp.setViewFlag(false); + //don't do anything if already in row + boolean exists = false; + for(SkyscrapersCell c : temp.getRowCol(loc.y,SkyscrapersType.Number,true)){ + if(c.getData()==num) { + exists = true; + break; + } + } - //get all cases for corresponding row based on west clue - rows = caseRule.getCasesFor(temp, skyscrapersBoard.getWestClues().get(loc.y), num); + if(exists) { + rowQ.add(temp); + } + else{ + //set flags + boolean dupeTemp = temp.getDupeFlag(); + boolean viewTemp = temp.getViewFlag(); + temp.setDupeFlag(false); + temp.setViewFlag(false); - //reset flags - temp.setDupeFlag(dupeTemp); - temp.setViewFlag(viewTemp); + //get all cases for corresponding row based on west clue + rows = caseRule.getCasesFor(temp, skyscrapersBoard.getWestClues().get(loc.y), num); - //add all row cases to row queue - if (rows.size() == 0) - rowQ.add(temp); - else { + //reset flags + temp.setDupeFlag(dupeTemp); + temp.setViewFlag(viewTemp); + + //add all row cases to row queue for (Board k : rows) { rowQ.add((SkyscrapersBoard) k); } } } - //check col north clue List cols; - for(int j = 0; j < colQ.size(); j++) { + size = colQ.size(); + for(int j = 0; j < size; j++) { SkyscrapersBoard temp = colQ.poll(); //get row from the top of the stack - //set flags - boolean dupeTemp = temp.getDupeFlag(); - boolean viewTemp = temp.getViewFlag(); - temp.setDupeFlag(true); - temp.setViewFlag(false); + //don't do anything if already in col + boolean exists = false; + for(SkyscrapersCell c : temp.getRowCol(loc.x,SkyscrapersType.Number,false)){ + if(c.getData()==num) { + exists = true; + break; + } + } + + if(exists){ + colQ.add(temp); + } + else{ + //set flags + boolean dupeTemp = temp.getDupeFlag(); + boolean viewTemp = temp.getViewFlag(); + temp.setDupeFlag(false); + temp.setViewFlag(false); - //get all cases for corresponding col based on north clue - cols = caseRule.getCasesFor(temp, skyscrapersBoard.getNorthClues().get(loc.x), num); + //get all cases for corresponding col based on north clue + cols = caseRule.getCasesFor(temp, skyscrapersBoard.getNorthClues().get(loc.x), num); - //reset flags - temp.setDupeFlag(dupeTemp); - temp.setViewFlag(viewTemp); + //reset flags + temp.setDupeFlag(dupeTemp); + temp.setViewFlag(viewTemp); - //add all row cases to row queue - if(cols.size() == 0) - colQ.add(temp); - else { + //add all row cases to row queue for(Board k : cols) colQ.add((SkyscrapersBoard) k); } } - } String rowTooFew; String rowTooMany; boolean rowContradiction = true; //check if each case board has a contradiction - for(int j = 0; j < rowQ.size(); j++) { + while(rowQ.size()>0) { SkyscrapersBoard fullRow = rowQ.poll(); + //checks if there is a contradiction given the row based on the west clue rowTooFew = tooFew.checkContradictionAt(fullRow, cell); // is cell the correct puzzle element to check? rowTooMany = tooMany.checkContradictionAt(fullRow, cell); + //boolean that checks if there is a contradiction within all rows - rowContradiction = rowContradiction && (rowTooFew == null || rowTooMany == null); // !null means there isn't a contradiction, so there must be a valid permutation of the array + rowContradiction = rowContradiction && (rowTooFew == null || rowTooMany == null);// !null means there isn't a contradiction, so there must be a valid permutation of the array } String colTooFew; String colTooMany; boolean colContradiction = true; - for(int j = 0; j < colQ.size(); j++) { + while(colQ.size()>0) { SkyscrapersBoard fullCol = colQ.poll(); + //checks if there is a contradiction given the col baesd on the north clue colTooFew = tooFew.checkContradictionAt(fullCol, cell); colTooMany = tooMany.checkContradictionAt(fullCol, cell); + //boolean that checks if there is a contradiction within all the cols colContradiction = colContradiction && (colTooFew == null || colTooMany == null); } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md index 294119409..d08b8f326 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md @@ -3,22 +3,17 @@ spreadsheet : https://docs.google.com/spreadsheets/d/1l7aUZtavtysM8dtGnaEIXhBKMRGxekhnLIVoYIHYZi8/edit#gid=0 1. Basic Rules: - - Rename to fit uses - - Last visible/singular number/cell? + - Come up with better names for 1Edge and FixedMax, they are now more general 2. Contradiction Rules: - - Generalize visibility rules to non-full lines - - Figure out why these aren't static methods 3. Case Rules: 4. Refactoring: - Remove references to lightup and treetent in variable names - View contains a few of these - document utility functions in the reference sheet, COMMENTS! - review and identify dead code - - create and add rule icons - - check for overrides of by cell functions (ie checkContradiction) + - Save rule icons from compression - replace height/width with size (never not square) 5. Flags - - review all basic/contradiction rules to put in terms of the new cases / add flags - edit exporter to include flags in xml file format (if needed) 6. Documentation - UML diagram(s) \ No newline at end of file From e2837e12f2d709e31cbd4e703c8d6dba31643374 Mon Sep 17 00:00:00 2001 From: sveludandi112 Date: Tue, 1 Nov 2022 21:21:15 -0400 Subject: [PATCH 35/45] Added new easy skyscraper puzzle files --- puzzles files/skyscrapers/{easy => easy1} | 0 puzzles files/skyscrapers/easy2 | 23 +++++++++++++++++++++ puzzles files/skyscrapers/easy3 | 25 +++++++++++++++++++++++ 3 files changed, 48 insertions(+) rename puzzles files/skyscrapers/{easy => easy1} (100%) create mode 100644 puzzles files/skyscrapers/easy2 create mode 100644 puzzles files/skyscrapers/easy3 diff --git a/puzzles files/skyscrapers/easy b/puzzles files/skyscrapers/easy1 similarity index 100% rename from puzzles files/skyscrapers/easy rename to puzzles files/skyscrapers/easy1 diff --git a/puzzles files/skyscrapers/easy2 b/puzzles files/skyscrapers/easy2 new file mode 100644 index 000000000..4167a5c3d --- /dev/null +++ b/puzzles files/skyscrapers/easy2 @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/puzzles files/skyscrapers/easy3 b/puzzles files/skyscrapers/easy3 new file mode 100644 index 000000000..0097961ff --- /dev/null +++ b/puzzles files/skyscrapers/easy3 @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + From 26feedfcfbe1da719e074bfea1943958944ef83c Mon Sep 17 00:00:00 2001 From: sveludandi112 Date: Tue, 1 Nov 2022 21:34:22 -0400 Subject: [PATCH 36/45] Deleted old unused puzzle files, fixed easy2, added medium1 and medium2 puzzle files --- puzzles files/skyscrapers/1646651 | 31 ------------------- puzzles files/skyscrapers/easy1.xml | 46 ----------------------------- puzzles files/skyscrapers/easy2 | 2 +- puzzles files/skyscrapers/medium1 | 23 +++++++++++++++ puzzles files/skyscrapers/medium2 | 25 ++++++++++++++++ 5 files changed, 49 insertions(+), 78 deletions(-) delete mode 100644 puzzles files/skyscrapers/1646651 delete mode 100644 puzzles files/skyscrapers/easy1.xml create mode 100644 puzzles files/skyscrapers/medium1 create mode 100644 puzzles files/skyscrapers/medium2 diff --git a/puzzles files/skyscrapers/1646651 b/puzzles files/skyscrapers/1646651 deleted file mode 100644 index 3ff7ccc5a..000000000 --- a/puzzles files/skyscrapers/1646651 +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/puzzles files/skyscrapers/easy1.xml b/puzzles files/skyscrapers/easy1.xml deleted file mode 100644 index 9233705e9..000000000 --- a/puzzles files/skyscrapers/easy1.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/puzzles files/skyscrapers/easy2 b/puzzles files/skyscrapers/easy2 index 4167a5c3d..422d73ce4 100644 --- a/puzzles files/skyscrapers/easy2 +++ b/puzzles files/skyscrapers/easy2 @@ -1,7 +1,7 @@ - + diff --git a/puzzles files/skyscrapers/medium1 b/puzzles files/skyscrapers/medium1 new file mode 100644 index 000000000..d0a704577 --- /dev/null +++ b/puzzles files/skyscrapers/medium1 @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/puzzles files/skyscrapers/medium2 b/puzzles files/skyscrapers/medium2 new file mode 100644 index 000000000..fd8de312c --- /dev/null +++ b/puzzles files/skyscrapers/medium2 @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + From 6f7d5060b4ffe5e0965ed696484c1f946c350043 Mon Sep 17 00:00:00 2001 From: ThisMatt Date: Fri, 4 Nov 2022 15:23:32 -0400 Subject: [PATCH 37/45] Clues now highlight for case rules --- .../skyscrapers/SkyscrapersClueView.java | 8 ++- .../puzzle/skyscrapers/SkyscrapersView.java | 56 +++++++++++++++++++ .../rules/CellForNumberCaseRule.java | 14 ++--- .../legup/puzzle/skyscrapers/rules/TODO.md | 1 + 4 files changed, 71 insertions(+), 8 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersClueView.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersClueView.java index 549789c01..d070fdf4d 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersClueView.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersClueView.java @@ -23,9 +23,15 @@ public SkyscrapersClue getPuzzleElement() { return (SkyscrapersClue) super.getPuzzleElement(); } - @Override + @Override public void draw(Graphics2D graphics2D) { drawElement(graphics2D); + if (this.isShowCasePicker() && this.isCaseRulePickable()) { + drawCase(graphics2D); + if(this.isHover()){ + drawHover(graphics2D); + } + } } @Override diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersView.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersView.java index 75871bc78..5b95cb632 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersView.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersView.java @@ -1,6 +1,7 @@ package edu.rpi.legup.puzzle.skyscrapers; import edu.rpi.legup.controller.BoardController; +import edu.rpi.legup.model.gameboard.Board; import edu.rpi.legup.model.gameboard.CaseBoard; import edu.rpi.legup.model.gameboard.PuzzleElement; import edu.rpi.legup.model.tree.TreeElement; @@ -181,6 +182,61 @@ public void onTreeElementChanged(TreeElement treeElement) { } } + /** + * Sets the board associated with this view + * + * @param board board + */ + @Override + public void setBoard(Board board) { + if (this.board != board) { + this.board = board; + + if (board instanceof CaseBoard) { + setCasePickable(); + } + else { + for (ElementView elementView : elementViews) { + elementView.setPuzzleElement(board.getPuzzleElement(elementView.getPuzzleElement())); + elementView.setShowCasePicker(false); + } + for (SkyscrapersClueView clueView : northClues) { + clueView.setPuzzleElement(board.getPuzzleElement(clueView.getPuzzleElement())); + clueView.setShowCasePicker(false); + } + for (SkyscrapersClueView clueView : westClues) { + clueView.setPuzzleElement(board.getPuzzleElement(clueView.getPuzzleElement())); + clueView.setShowCasePicker(false); + } + } + } + } + + @Override + protected void setCasePickable() { + CaseBoard caseBoard = (CaseBoard) board; + Board baseBoard = caseBoard.getBaseBoard(); + + for (ElementView elementView : elementViews) { + PuzzleElement puzzleElement = baseBoard.getPuzzleElement(elementView.getPuzzleElement()); + elementView.setPuzzleElement(puzzleElement); + elementView.setShowCasePicker(true); + elementView.setCaseRulePickable(caseBoard.isPickable(puzzleElement, null)); + } + for (SkyscrapersClueView clueView : northClues) { + PuzzleElement puzzleElement = baseBoard.getPuzzleElement(clueView.getPuzzleElement()); + clueView.setPuzzleElement(puzzleElement); + clueView.setShowCasePicker(true); + clueView.setCaseRulePickable(caseBoard.isPickable(puzzleElement, null)); + } + for (SkyscrapersClueView clueView : westClues) { + PuzzleElement puzzleElement = baseBoard.getPuzzleElement(clueView.getPuzzleElement()); + clueView.setPuzzleElement(puzzleElement); + clueView.setShowCasePicker(true); + clueView.setCaseRulePickable(caseBoard.isPickable(puzzleElement, null)); + } + } + @Override public void drawBoard(Graphics2D graphics2D) { super.drawBoard(graphics2D); diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java index fb047871d..ace3b6c4c 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java @@ -30,11 +30,11 @@ public CaseBoard getCaseBoard(Board board) { currentBoard.setModifiable(false); CaseBoard caseBoard = new CaseBoard(currentBoard, this); for (SkyscrapersClue data : currentBoard.getWestClues()) { - System.out.println(data.getType()); + //System.out.println(data.getType()); caseBoard.addPickableElement(data); } for (SkyscrapersClue data : currentBoard.getNorthClues()) { - System.out.println(data.getType()); + //System.out.println(data.getType()); caseBoard.addPickableElement(data); } @@ -103,22 +103,22 @@ public String checkRuleRaw(TreeTransition transition) { //find changed row/col SkyscrapersClue modClue = ((SkyscrapersBoard)childTransitions.get(0).getBoard()).getmodClue(); - System.out.println(modClue.getType()); - System.out.println(modClue.getClueIndex()); + //System.out.println(modClue.getType()); + //System.out.println(modClue.getClueIndex()); if(childTransitions.size() != getCasesFor(oldBoard,modClue,(Integer) childTransitions.get(0).getBoard().getModifiedData().iterator().next().getData()).size()){ - System.out.println("Wrong number of cases."); + //System.out.println("Wrong number of cases."); return "Wrong number of cases."; } for(TreeTransition newTree : childTransitions){ SkyscrapersBoard newBoard = (SkyscrapersBoard) newTree.getBoard(); if(newBoard.getModifiedData().size()!=1){ - System.out.println("Only one cell should be modified."); + //System.out.println("Only one cell should be modified."); return "Only one cell should be modified."; } SkyscrapersCell newCell = (SkyscrapersCell) newBoard.getModifiedData().iterator().next(); if(newCell.getType() != SkyscrapersType.Number){ - System.out.println("Changed value should be a number."); + //System.out.println("Changed value should be a number."); return "Changed value should be a number."; } } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md index d08b8f326..3e5a3b2c0 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md @@ -13,6 +13,7 @@ spreadsheet : https://docs.google.com/spreadsheets/d/1l7aUZtavtysM8dtGnaEIXhBKMR - review and identify dead code - Save rule icons from compression - replace height/width with size (never not square) + - remove all these damn print statments (commented ones too if they aren't useful) 5. Flags - edit exporter to include flags in xml file format (if needed) 6. Documentation From 639d12873873d5e7850d0fb5eb9cd0cef88008f8 Mon Sep 17 00:00:00 2001 From: sveludandi112 Date: Fri, 4 Nov 2022 18:46:23 -0400 Subject: [PATCH 38/45] simplified height/width to size --- .../puzzle/skyscrapers/SkyscrapersBoard.java | 14 ++--- .../skyscrapers/SkyscrapersElementView.java | 25 +------- .../skyscrapers/SkyscrapersImporter.java | 59 ++++++++----------- .../skyscrapers/SkyscrapersLineView.java | 1 - .../rules/skyscrapers_reference_sheet.txt | 3 +- 5 files changed, 34 insertions(+), 68 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java index 88f28dddf..69f22782f 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java @@ -28,8 +28,8 @@ public class SkyscrapersBoard extends GridBoard { private SkyscrapersClue modClue = null; //helper variable for case rule verification, tracks recently modified row/col - public SkyscrapersBoard(int width, int height) { - super(width, height); + public SkyscrapersBoard(int size) { + super(size, size); this.lines = new ArrayList<>(); @@ -38,7 +38,7 @@ public SkyscrapersBoard(int width, int height) { this.westClues = new ArrayList<>(); this.northClues = new ArrayList<>(); - for (int i = 0; i < height; i++) { + for (int i = 0; i < size; i++) { eastClues.add(null); southClues.add(null); westClues.add(null); @@ -46,10 +46,6 @@ public SkyscrapersBoard(int width, int height) { } } - public SkyscrapersBoard(int size) { - this(size, size); - } - public ArrayList getLines() { return lines; } @@ -93,6 +89,8 @@ public SkyscrapersCell getCell(int x, int y) { return (SkyscrapersCell) super.getCell(x, y); } + public int getSize() {return this.getWidth(); } + @Override public PuzzleElement getPuzzleElement(PuzzleElement element) { switch (element.getIndex()) { @@ -251,7 +249,7 @@ public boolean equalsBoard(Board board) { @Override public SkyscrapersBoard copy() { - SkyscrapersBoard copy = new SkyscrapersBoard(dimension.width, dimension.height); + SkyscrapersBoard copy = new SkyscrapersBoard(dimension.width); for (int x = 0; x < this.dimension.width; x++) { for (int y = 0; y < this.dimension.height; y++) { copy.setCell(x, y, getCell(x, y).copy()); diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersElementView.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersElementView.java index 8df3a18a8..533437d67 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersElementView.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersElementView.java @@ -16,30 +16,7 @@ public SkyscrapersElementView(SkyscrapersCell cell) { @Override public void drawElement(Graphics2D graphics2D) { - /*SkyscrapersCell cell = (SkyscrapersCell) puzzleElement; - SkyscrapersType type = cell.getType(); - graphics2D.setStroke(new BasicStroke(0)); - if (type == SkyscrapersType.UNKNOWN) { - graphics2D.setStroke(new BasicStroke(1)); - graphics2D.setColor(Color.LIGHT_GRAY); - graphics2D.fill(new Rectangle2D.Double(location.x + 0.5f, location.y + 0.5f, size.width - 1, size.height - 1)); - graphics2D.setColor(Color.BLACK); - graphics2D.draw(new Rectangle2D.Double(location.x + 0.5f, location.y + 0.5f, size.width - 1, size.height - 1)); - } else if (type == SkyscrapersType.TREE) { - graphics2D.drawImage(SkyscrapersView.TREE, location.x, location.y, size.width, size.height, null, null); - graphics2D.setColor(Color.BLACK); - graphics2D.drawRect(location.x, location.y, size.width, size.height); - } else if (type == SkyscrapersType.GRASS) { - graphics2D.drawImage(SkyscrapersView.GRASS, location.x, location.y, size.width, size.height, null, null); - graphics2D.setColor(Color.BLACK); - graphics2D.drawRect(location.x, location.y, size.width, size.height); - } else if (type == SkyscrapersType.TENT) { - graphics2D.drawImage(SkyscrapersView.TENT, location.x, location.y, size.width, size.height, null, null); - graphics2D.setColor(Color.BLACK); - graphics2D.drawRect(location.x, location.y, size.width, size.height); - }*/ - - graphics2D.setStroke(new BasicStroke(1)); + graphics2D.setStroke(new BasicStroke(1)); graphics2D.setColor(BACKGROUND_COLOR); graphics2D.fillRect(location.x, location.y, size.width, size.height); graphics2D.setColor(BORDER_COLOR); diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java index 5edbae4b6..80411dd83 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java @@ -44,36 +44,39 @@ public void initializeBoard(Node node) throws InvalidFileFormatException { Element dataElement = (Element) boardElement.getElementsByTagName("cells").item(0); NodeList elementDataList = dataElement.getElementsByTagName("cell"); - SkyscrapersBoard treeTentBoard = null; + + + SkyscrapersBoard skyscrapersBoard = null; + if (!boardElement.getAttribute("size").isEmpty()) { int size = Integer.valueOf(boardElement.getAttribute("size")); - treeTentBoard = new SkyscrapersBoard(size); + skyscrapersBoard = new SkyscrapersBoard(size); } - if (treeTentBoard == null) { + if (skyscrapersBoard == null) { throw new InvalidFileFormatException("TreeTent Importer: invalid board dimensions"); } - int width = treeTentBoard.getWidth(); - int height = treeTentBoard.getHeight(); + int size = skyscrapersBoard.getSize(); + for (int i = 0; i < elementDataList.getLength(); i++) { - SkyscrapersCell cell = (SkyscrapersCell) puzzle.getFactory().importCell(elementDataList.item(i), treeTentBoard); + SkyscrapersCell cell = (SkyscrapersCell) puzzle.getFactory().importCell(elementDataList.item(i), skyscrapersBoard); Point loc = cell.getLocation(); if (cell.getData() != 0) { cell.setModifiable(false); cell.setGiven(true); } - treeTentBoard.setCell(loc.x, loc.y, cell); + skyscrapersBoard.setCell(loc.x, loc.y, cell); } - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) { - if (treeTentBoard.getCell(x, y) == null) { - SkyscrapersCell cell = new SkyscrapersCell(0, new Point(x, y), width); - cell.setIndex(y * height + x); + for (int y = 0; y < size; y++) { + for (int x = 0; x < size; x++) { + if (skyscrapersBoard.getCell(x, y) == null) { + SkyscrapersCell cell = new SkyscrapersCell(0, new Point(x, y), size); + cell.setIndex(y * size + x); cell.setModifiable(true); - treeTentBoard.setCell(x, y, cell); + skyscrapersBoard.setCell(x, y, cell); } } } @@ -98,7 +101,7 @@ public void initializeBoard(Node node) throws InvalidFileFormatException { NodeList eastClues = side1.equalsIgnoreCase("east") ? axis1.getElementsByTagName("clue") : axis2.getElementsByTagName("clue"); NodeList southClues = side1.equalsIgnoreCase("south") ? axis1.getElementsByTagName("clue") : axis2.getElementsByTagName("clue"); - if (eastClues.getLength() != treeTentBoard.getHeight() || southClues.getLength() != treeTentBoard.getWidth()) { + if (eastClues.getLength() != skyscrapersBoard.getHeight() || southClues.getLength() != skyscrapersBoard.getWidth()) { throw new InvalidFileFormatException("TreeTent Importer: there must be same number of clues as the dimension of the board"); } @@ -107,15 +110,9 @@ public void initializeBoard(Node node) throws InvalidFileFormatException { int value = Integer.valueOf(clue.getAttribute("value")); //int index = SkyscrapersClue.colStringToColNum(clue.getAttribute("index")); int index = Integer.valueOf(clue.getAttribute("index")); - /*if (index - 1 < 0 || index - 1 > treeTentBoard.getHeight()) { - throw new InvalidFileFormatException("TreeTent Importer: clue index out of bounds"); - } - if (treeTentBoard.getRowClues().get(index - 1) != null) { - throw new InvalidFileFormatException("TreeTent Importer: duplicate clue index"); - }*/ - treeTentBoard.getWestClues().set(/*index - 1*/i, new SkyscrapersClue(index, i, SkyscrapersType.CLUE_WEST)); - treeTentBoard.getEastClues().set(/*index - 1*/i, new SkyscrapersClue(value, i, SkyscrapersType.CLUE_EAST)); + skyscrapersBoard.getWestClues().set(/*index - 1*/i, new SkyscrapersClue(index, i, SkyscrapersType.CLUE_WEST)); + skyscrapersBoard.getEastClues().set(/*index - 1*/i, new SkyscrapersClue(value, i, SkyscrapersType.CLUE_EAST)); } for (int i = 0; i < southClues.getLength(); i++) { @@ -123,22 +120,16 @@ public void initializeBoard(Node node) throws InvalidFileFormatException { int value = Integer.valueOf(clue.getAttribute("value")); int index = Integer.valueOf(clue.getAttribute("index")); - /*if (index - 1 < 0 || index - 1 > treeTentBoard.getWidth()) { - throw new InvalidFileFormatException("TreeTent Importer: clue index out of bounds"); - } - if (treeTentBoard.getColClues().get(index - 1) != null) { - throw new InvalidFileFormatException("TreeTent Importer: duplicate clue index"); - }*/ - treeTentBoard.getNorthClues().set(/*index - 1*/i, new SkyscrapersClue(index, i, SkyscrapersType.CLUE_NORTH)); - treeTentBoard.getSouthClues().set(/*index - 1*/i, new SkyscrapersClue(value, i, SkyscrapersType.CLUE_SOUTH)); + skyscrapersBoard.getNorthClues().set(/*index - 1*/i, new SkyscrapersClue(index, i, SkyscrapersType.CLUE_NORTH)); + skyscrapersBoard.getSouthClues().set(/*index - 1*/i, new SkyscrapersClue(value, i, SkyscrapersType.CLUE_SOUTH)); } if (boardElement.getElementsByTagName("lines").getLength() == 1) { Element linesElement = (Element) boardElement.getElementsByTagName("lines").item(0); NodeList linesList = linesElement.getElementsByTagName("line"); for (int i = 0; i < linesList.getLength(); i++) { - treeTentBoard.getLines().add((SkyscrapersLine) puzzle.getFactory().importCell(linesList.item(i), treeTentBoard)); + skyscrapersBoard.getLines().add((SkyscrapersLine) puzzle.getFactory().importCell(linesList.item(i), skyscrapersBoard)); } } @@ -146,11 +137,11 @@ public void initializeBoard(Node node) throws InvalidFileFormatException { NodeList flagList = boardElement.getElementsByTagName("flags"); if(flagList.getLength()==1){ Element flags = (Element) flagList.item(0); - if(flags.hasAttribute("dupe")){treeTentBoard.setDupeFlag(Boolean.parseBoolean(flags.getAttribute("dupe")));} - if(flags.hasAttribute("view")){treeTentBoard.setViewFlag(Boolean.parseBoolean(flags.getAttribute("view")));} + if(flags.hasAttribute("dupe")){skyscrapersBoard.setDupeFlag(Boolean.parseBoolean(flags.getAttribute("dupe")));} + if(flags.hasAttribute("view")){skyscrapersBoard.setViewFlag(Boolean.parseBoolean(flags.getAttribute("view")));} } - puzzle.setCurrentBoard(treeTentBoard); + puzzle.setCurrentBoard(skyscrapersBoard); } catch (NumberFormatException e) { throw new InvalidFileFormatException("TreeTent Importer: unknown value where integer expected"); diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersLineView.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersLineView.java index 2f0f30afd..02daa7a11 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersLineView.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersLineView.java @@ -24,7 +24,6 @@ public void draw(Graphics2D graphics2D) { int x2 = (p2.x + 1) * size.width + size.width / 2; int y2 = (p2.y + 1) * size.height + size.height / 2; - //graphics2D.setColor(LINE_COLOR); graphics2D.setColor(line.isModified() ? Color.GREEN : Color.WHITE); graphics2D.setStroke(LINE_STROKE); graphics2D.drawLine(x1, y1, x2, y2); diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/skyscrapers_reference_sheet.txt b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/skyscrapers_reference_sheet.txt index 1a131d10a..1ce5670af 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/skyscrapers_reference_sheet.txt +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/skyscrapers_reference_sheet.txt @@ -38,4 +38,5 @@ CODE MORGUE: -getAdjacent Location: skyscrapersBoard Use: helper function - gets cells immediately adjacent to a cell - Note: If you implement this, move it from morgue to helper functions section! \ No newline at end of file + Note: If you implement this, move it from morgue to helper functions section! + -Skyscrapers Exporter \ No newline at end of file From ffd30f326b259a0641bf1d3de8d539ca75ed6f6c Mon Sep 17 00:00:00 2001 From: ThisMatt Date: Fri, 4 Nov 2022 21:33:50 -0400 Subject: [PATCH 39/45] Icons compress better now --- puzzles files/skyscrapers/easy1 | 2 +- puzzles files/skyscrapers/easy2 | 2 +- puzzles files/skyscrapers/easy3 | 2 +- puzzles files/skyscrapers/medium1 | 2 +- puzzles files/skyscrapers/medium2 | 2 +- .../legup/puzzle/skyscrapers/rules/TODO.md | 3 ++- .../skyscrapers/cases/CellForNumber.png | Bin 10474 -> 1871 bytes .../skyscrapers/cases/NumberForCell.png | Bin 10515 -> 1875 bytes .../contradictions/DuplicateNumber.png | Bin 4460 -> 954 bytes .../contradictions/ExceedingVisibility.png | Bin 4542 -> 1184 bytes .../contradictions/InsufficientVisibility.png | Bin 4777 -> 1291 bytes .../contradictions/PreemptiveVisibility.png | Bin 3883 -> 1101 bytes .../contradictions/UnresolvedCell.png | Bin 5936 -> 1165 bytes .../contradictions/UnresolvedNumber.png | Bin 6965 -> 1357 bytes .../images/skyscrapers/rules/FixedMax.png | Bin 1465 -> 1225 bytes .../images/skyscrapers/rules/LastCell.png | Bin 7006 -> 1352 bytes .../images/skyscrapers/rules/LastNumber.png | Bin 6936 -> 1335 bytes .../legup/images/skyscrapers/rules/NEdge.png | Bin 6436 -> 1523 bytes .../images/skyscrapers/rules/OneEdge.png | Bin 4294 -> 934 bytes 19 files changed, 7 insertions(+), 6 deletions(-) diff --git a/puzzles files/skyscrapers/easy1 b/puzzles files/skyscrapers/easy1 index b0cfeeafc..8cb501fb5 100644 --- a/puzzles files/skyscrapers/easy1 +++ b/puzzles files/skyscrapers/easy1 @@ -17,7 +17,7 @@ - + diff --git a/puzzles files/skyscrapers/easy2 b/puzzles files/skyscrapers/easy2 index 422d73ce4..10ba52996 100644 --- a/puzzles files/skyscrapers/easy2 +++ b/puzzles files/skyscrapers/easy2 @@ -17,7 +17,7 @@ - + diff --git a/puzzles files/skyscrapers/easy3 b/puzzles files/skyscrapers/easy3 index 0097961ff..3bcbd1179 100644 --- a/puzzles files/skyscrapers/easy3 +++ b/puzzles files/skyscrapers/easy3 @@ -19,7 +19,7 @@ - + diff --git a/puzzles files/skyscrapers/medium1 b/puzzles files/skyscrapers/medium1 index d0a704577..8df3f30d3 100644 --- a/puzzles files/skyscrapers/medium1 +++ b/puzzles files/skyscrapers/medium1 @@ -17,7 +17,7 @@ - + diff --git a/puzzles files/skyscrapers/medium2 b/puzzles files/skyscrapers/medium2 index fd8de312c..5493fae5e 100644 --- a/puzzles files/skyscrapers/medium2 +++ b/puzzles files/skyscrapers/medium2 @@ -19,7 +19,7 @@ - + diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md index 3e5a3b2c0..ffe643d34 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md @@ -6,12 +6,13 @@ spreadsheet : https://docs.google.com/spreadsheets/d/1l7aUZtavtysM8dtGnaEIXhBKMR - Come up with better names for 1Edge and FixedMax, they are now more general 2. Contradiction Rules: 3. Case Rules: + - Don't highlight cells when selecting a row/col? + - (override draw() in SkyscrapersElementView) 4. Refactoring: - Remove references to lightup and treetent in variable names - View contains a few of these - document utility functions in the reference sheet, COMMENTS! - review and identify dead code - - Save rule icons from compression - replace height/width with size (never not square) - remove all these damn print statments (commented ones too if they aren't useful) 5. Flags diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/cases/CellForNumber.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/cases/CellForNumber.png index 3c921c0c5648ed3ea46813f5929a6701960ccfe3..7ab0cdbef1007206038251637caf31cccb2407ea 100644 GIT binary patch delta 1842 zcmaJ?c{JOJ7B;oTQcFleHAvcGdTgQ9ks?h6v9{Ktw05=Bo??*SG?wbvb%vy33#x|d zs9lLAK`cWpWvHdrP_@>+v@d_Z^UnL@-h1vj_uTWH@80{}FP4KMi05}LjLr*Q5aijNPPJlP5x?=HI~;;OlTkM?sjeGX7f>7+G5m* zM(7OttbIvWGjQ^3P#spC0d- z62G5Pj!c8lPrfRpq@+*)-cslHPkuN(yAFoLrAF*5KBwwLS}B;nylif6PEq-eO-_QT z_0D%D=|3N)$3!)TZ{}4vHClD0$iTi_n9OAIMjmbzMxX4P|DKdoQdo$n?!@HY49{wb zI_OP>-&{O7*rc=`^JCuvPK`8n-Y>y4ZLHNcB8-nVIzG-HkSvJK7|g0W@o|-nD-N>E zLQ&;1**{aSpAu=_VZ`LQOONn(gy7w2FZE{rx;&0KG z!WH86h^I>If!r4)(m9AC2nh4ooN4jg`||OfXCIWJ7t<7dxP_?xDAx}q9_<)pDLWv~ zj`uVb&8})D=uBffU0UfeC%tV?xd|lSkyqv#eq+iLtw3ut@eKW8TP%L3rPDIAp@$|x zws*7W2t3(dcow!cX8!B$3Ie9;l#b9(V3n9=7yFG@YPc~$(+To`%K9g(h0_6#cplA8 zR-27;E77^rB~w5>N>o-ST|0D{^|Ab(XFnOWvpS+UomEaweWz{>YR5Ma*2d)AxNg+-x{qUYgsxDm~2tK$`c}2x23|QR~uv{4_O`B?tw9ZnwuTUR2 zJLdjE(y@yPLcB!I73J#1prNSGXD0_5t{ps)M>{26%iU>m<3rw*QC@8FPuzU3rEG0& zC!Yo<&SAm$sQs^$saD`2RN3BTGOon;oet{wU{j4fn4djVWV9xe@|bsSYpE~$vm7n+2h94k- zFg6lXR#rANM0!|=bAQU@U~pw5lnwq8x|}?gp9yBfb|4WbV|Ei^E$k1ls&%nh4vrTq z45rg)NbTVHIP|{-k%rXtTdK}YHseWVK%S1nnf;`KG72jeTOo}Sk<(Kaf~j7!9CHb? zYEr~izJC27UPn@SJJ=_k<SV27ZAF^A*}<`{ zp`VHpy<=u$`n{2(1imYIK>?Mc9qP5>-&o?i3Cs~5iEUjXTkaIPcc-onH@*h+R9OUX z2oFjta7KBdJ599qG|8ep63HW?<3BZ9X07PZN^IH8DRSp5LRpc<3IjKcUuvkSvGM9B zBRD!4phMC_g-RH4dC=7fizaW@%cBus{ltV%P?8P86=+g*IR> zZ0ziy4uPK}znlVsa4c<=24A9a1m0%rtOw$CoXu!afSQ{R(+i4P1SZ|WXu1NVSG*?I96+)F&;Oa-$i$A ztE^V*lO}1IWrh>!^}9L#92WLe=*#-{dUer9A@DpbA{ZUDUr}LSg|v~r7$I*@t|qM6 zrTCxTQrwuVHTAyAAWIJP^bsyMHzOqWrJCJ={#|Z}JH`VNmq@ZG&}0}|>iq1=+%3=~ z+b!|MF6t(NJLysEq!3}l#D}Q1aY@zN#qi-_6qd=djTV^4i@-dk|F0_lw_g8@BXW0A XLM$k~0}Rd=(u-d2 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 diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/cases/NumberForCell.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/cases/NumberForCell.png index 9c001820a3a6d7b6d88114cd2019641f20d2e74a..fedbbbac856e3f5cd1679977ceb0685336bba8ac 100644 GIT binary patch delta 1846 zcmai#`8(8&8pa1<5(b%&WNZ^=j6v2$jkOtOG{al6MaPz-yaHonk#CEEh|%x+x@ZQ2+!23E^?3 z)|~6c83LG(vtP@ILFjT<0lsf|Q=>nq_ck*fVu;R{x&bZ8{jPv%752hU*m9~l$|hdS z;xcs(FTcRm==MVKUJDh5p?-&H=c!0FM)JQpa-Vj0q)2JR_w^qi9UC|t2A!NT#%4UW zXL}Au*U(2BeRkQkVfD42RH*DFd>l1{e1B!6F9svxYQc*$GBN_zKE4y%my3#u8l0X+ z5{bl&wuX|TB3vtQ`sN_JX|l#^cU`|!g$(m&Eq1?L{+wf?>CrEFaIovSf}?UR4j0>K zK0W+_BTd#lLji`SX!l!+x(#r$hbaD<%@7y~upV)@*XB zMlh^vi6)uC{}00DnExeWdAz*5zKBt~6J=^C>yt&Jf&Upab7sg4j5Mg<_Kfq9Q~tuf z7H7P-w?|oEomD{rs5^S7TrKC8CrZ+~kB0Z+JL4q!Uh6*2EPwAkUwA9qtt(z?u*6o~ z&&AqK!_B{`-){x_);~dasHQq_YP4+c7z_#PcPX8#K8~!^D-hWAi68S0X+GzwWwwG5yq=__+ z;mRB;yw%sAp_LDuo&>vh5V&#{affK#`bS@_Pv@D$=!wYP**2i9)T!wXGjQ`A4ODRe z)51n<$Vlown*Lm=(`(*<)jPzezhOHkY8m+Sb=5?`nHj1!=Nm>{3V6Ic>Td+}gOR;15r* zySM>gcgX3<(}0z-+7gkQx43(JGcdu`moQY4-vu8FAspx#_v{426KZ}bTh!e2{#5}W zxnE54X|k0i90^U~6~uxfvo;ig$P)aE$+3LPw71R8j?cgdIC4jdTW~`k`vE!_PMc{1 zDx726BZ(QBX2P=9edPr##ldK1&~|wqz2c0Zl%^t7l7@Cp$5$UAY|9_0Avcwg8Y!I@ zS>aqf{vIv`MKfZl_M(hbBTe802;EaxQc@~TuQc_*fq3{WB6O(V=U6TzCS(Yw*qtC< z7}XD>3+7h(ZbPOVq2AAvq*(`6Fc0rv-{&cF?OX}IxrrFt7`Kyh0q(@*zBHd?``fqk z3)C!D`6$6#nb`0u?-5lgeac%ur?XW*o^Uc?Pa?FiA}2@Ak41Ehb_b>^WfRd)c2_C@1?KR2feWlJ(A_82EhcVB5e8($| zM#~%|48U`Z`&(ZTP$-n1OymP)7&6?4i^%lwe3Oxr#qZ}JxHicFrn|cS_Q6K0a8kPoL`?a&kJmX?i6+Tz_OZ!a6 zdu0v4zGJ@pUW zE>Q8fs$FXs^7Da_hLzI7EmfT)mv^fvHdm^d!Mg>VEHe)(L^?5t<6U3!o&k^FkMyfQ ze(%y2w|YHrBOPTGur`bjx|YncBOzg-;JQhdx(mp=BE`)~&%aAJ)cMjkr|NyOic3pN zM@HFB0CdWYYx#XN#9s8{6|!*78iB#h)5*86=Lr=6ySpW0jUC6jg2y+CR)_R-Unt`! zsIZP&aw}wOppDUT#ddL~-0TZ!U5>-qD-PE;DWR|aLLd`_6j@y~GX>U>S z-&kc1^=lSN!O}?(VIK?-`im5}IhhaFjHhtRQF70J>n|dUD=1lsn|P8! z7I>IThS=CaIxXU;vyo3r5h*C{eO5xmE4s#?&6}7gW8-^xG~f`{ f{}TlKlB|YVfcn18Y^@-t3PE@?E7Njgmx%uY)hlq< literal 10515 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 literal 4460 zcmeAS@N?(olHy`uVBq!ia0y~yVEhJTw{S24$+sf&rUEI(;vjb?hIQv;UIIBR>5jgR z3=A9lx&I`x0{NT;9+AZi3@R@`n6W9DRfd5!GN=7J z-)`j@t;!o5{)(NNGx5WMwi1?R`5iB>?@D(Jxq83O)#b?lm2-Z0{}UAae>Ch!rRB%z z2Dbz!3fBkv{ZZ{Hb9r(keu{8C=VDnw%a7tukHjC!IKBV>*Yi(`R>b}L@tFVj{U=Tt z@i)3G^ws|fxkcxEnasVg>SX7Cl`Z-?u5+e?bn2S@I@ubq_sNlZp}9_c4;IqGJ=Q()EfIY0cJ zejkE4Flq7p7>=vnet*;#)+TB{+5_}}MDE6m{(3F1RMr1YzOZkDXki@41KV!AP#1Ul zI!XAyCyFz(Z+-2&pIF-$uvcf^)-Ugm$Z2nGL$-5&n`>w6wdWjHPd|$E{_po@qfs`h z{)j0zQb)Cq2Hj|~fo0Rdlx5D%{-^inv1eEsFG}gc+by(v&3VC9(~oYR_HXX>FOTni zT&^BD(-ft!GSxZtdEQ=Ac;-K+Ty?(ffAyrPk^Jq15AIH0b4CiKT$U1h zsyt_c{Nr@}jdt!U;>6BJ{VLz*x?k9)3QG{wJUst=@&DAua$*$QG%q$fxOjTReB}`R z?sVP1*7q0P=ajQOd1?(xDZV~2aNfbdnGY^{BjPIm;(L~UY#uxRV1>_z7f7MC{Y80` zyZ;9Vi;3Bqwl9ZXs zDYy5?FPVi^kv7>c@BbA0>-XUWwy5IiJH^tE6je3db?Oygu*E-{duo&WXmE}O=VsJ`%3Rv{kh%5?)noJdRmQBuyXH4y?*YgATb{ zDJ3?VY#^;GlCun`M}BR(hNTEfdvHMe>6pU_h=B-q7r#HQ@bQYX>*N13me~sk%KtA_ R1CEd|c)I$ztaD0e0suUQ9ZvuN diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/ExceedingVisibility.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/ExceedingVisibility.png index e9253b5992a31069c4677e6d2fe5d5a9eca2376e..ff999f4bc3b1e829029189e50cc9104fe20b0280 100644 GIT binary patch delta 1149 zcmV-@1cLj%BcKT(iBL{Q4GJ0x0000DNk~Le0001F0000P2nGNE0LNa7OOYWoe*`s2 zL_t(&L+zSPNF+xT$NxRk^U*Wf<7`Y=V+e_$2d|13@fbTQ9z2^<@RGw4=HyYL2X__^ zdr(l(%i_Yu4`M!+=q1r$AfQN0mc@XOK_r7ggK@r`neOS-E4q{HvaYkSdbZd2gTk?E zs5e#rs#ot-my}2(OgMn5s<;)4e*p*kkYpcwBHoP5%C98}?|K2XH+LoU2% zNN8$*XJ-eyySx0e)06AJaAD6$jP><(ba!{7p`iiEWD>GWDVaEE#x5@}qqDOUO-)UR zL?Tv=7)W5lFi=%hh4%J#w6(RNx3?EHH8s{Z+{1-}+8ez_O>JLBoqoE7K>qyg|1s$TWD@>#>&bH78Vu|3gp)tq=|Q3PN$_koi(;{e zgM$O^7Bx*{iM`&%$HvC6xw(mSI?bQCiT{lt1i9Uzp&`DPG&VL0 z4^Bi-wjg$h=*Cd79B7}Kot@QBW@cu%IHFb~4LXIpQ&Urzn3%xy^fboD$I;W%Km3UK zjjUCBNqhl#e)tZNjc=e8!&p^IIIWJt5NRW*z`J-KQ)*%lS~7ig-l_9jCnfek)Iix# zkio*)zi*x7&cxebqQEC#om(gWzL#Y>a4(C_h3$J;MZrOUji;jbvVgw;Kv7WAojSH} P00000NkvXXu0mjf)Y~lm literal 4542 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 O;k-S4Xkzyrseb~1mJksD diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/PreemptiveVisibility.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/PreemptiveVisibility.png index 759ced1a84caa4e215fb2c1341237ca463c5706f..6d330baa6e76585ea860dd7d758c51d841081675 100644 GIT binary patch delta 1065 zcmV+^1lIej9?b|LiBL{Q4GJ0x0000DNk~Le0001F0000P2nGNE0LNa7OOYWoe*@x4 zL_t(&L+zSRNK`=_$G>maRq?;8Vj@bVgn@|YK@Z|t(Ni}eFc6duDwZO&NE8TqHBTM_ z|0ER{qz6Ut<|RFZ1sY|W>4IHM!_{?nb+`ErPv{TjzM8kL%YI;ZF!PxA=J%cX&2N71 zX&W0GL6}H#axxwb598fOC#<$Of4x>6nkZIL0)9UNCnvH_HGa`|U0od-8yj(Sbfnjs zgXw~#rKRCk*B!h}5ChRH9G%{x08Pk|n27stKH%1~DO}0RLoldzIGT9I>gp;cCMM9; z)rG^uL%qcu!Xik^-5xx(y5UVpN8oy?8c`^QC~2=>!SUXOrjf_EoOcPwf5*rA4Qhys zi^JO58m6bG(b?Gpus7epJ=fQ$5k&ZqFcJ_x-hT}3 z@IXls*3mnT9>Oa~j5CP|5@GzaAdEiD#O(gf#A30)YGp8P97BT8NJ&Xa$j!}_@wgdA zOGrpSW@aW%#F^qEijtL;eSs5xTE0LX@t+$3o$bxVQI-O3qTrL^<+3j|{ zMGdF@bLA~AE*c)ld6Os(s6#_Taae}wUUd3iZXOU1#? z1n8oQi;LyV`d9yZp7?w|)YQ~qY-|h-4Gox@nv(V0PmEybZi+&~nFae+eXt7`fj|HS z1qE{N@OV7f+uM`%ZEbCa@?XZ}i}6<|3Q12-$H2e<1_uYFyD~C~V}dA#0?f|NqNu0{ z-QC@WlbsPK$Z4p1e-T4ohU{BgTNoJ`fy3dz^769Gf2E|P=y#lrAwigE+VSzxM$&_rBixGZcjbqsZ)^q2%d`{0$yd#e3Lq z-;9{_J16O{6NsLK;|LW)E{o9uUub`SA8xl>`QW+aDKh(}%le}j5ena(w)wFb5rf2{ ztOz5#f-rKTe>+lAgliDjXd`@rPzNgnbu>SDE;n_v{yJg8Flv5sxZB$cpK~1+x*5e-g(hD-US#Cw!=^`nDxo0U joU5v;(9+UkvLL{BC-(_P3zUm!00000NkvXXu0mjf5@Y|S literal 3883 zcmeAS@N?(olHy`uVBq!ia0y~yU=jkdTRE73WaHvCDH zpZuC7?gvX)!+b5T33Ys-Axi>s_nbIu(k&}xFyZI*>8n<);(vX!B1G=f4<-U|B8qI;_3QV{tC4VMW-$S z$qU}jnA@mWmDqb#=aP6-pl6lYqX6-Zz1Jiq7KvYrIIA>B6#l-j!78*tiYoul|H1tS zL)}BRE3P?<-#Q=ur;&Gv{R6kB&UsT8eVetBOZ2xW@nk<0{;|mV?yvRgzxf|uhnf0@ z|DjZk#Qtf>zCW}f%&z_Yt_xHDf01{t|NTUE58Pk&5086)_;%8|Vmh*hNgIOgde`s1 zaP)u4;rWjk`(cLbuzi2Xh#FixVyD{VbAB8II&b^Sn;p(jzhP6@_2DA3+}`fx_|^5q z-%`)-zkhJ|?JuCRJxMxOUP`R__lE{|6z?BCXjJ)os=CcC-}7!Vuavf3{I)RBa0fqs z#S~L#mLcJXk2#T{D((o;M(Pe z+wJzYqYvzC9s~-VF6O<+?Vm07l6&nAN$VHve||X8OHK8kH-3cdBB(};`vp)<6kc

    uenH`p7S5e*TXy zb$Fd4eEYey-QIY75wCaT)z3Encqe>n@($kvsc|KsM$oQG5wCN&yxo7i*orT;K9b9k zdANA`Wqg5Cy`eDfds+>!DT6xzy*K2={UV@7dP8hDD$#{Gbt0ejxR9>yd7feb* zr=J%8SchK?|Lmuif9#@M4Y2$KnuE7oP~xl@6fL~F0VlCnpLaPl`l-!|IZxz XSt4iQhmCW99b5)aS3j3^P6P6Hd#b~Xyco0wGML~M--qs!j5s^}{7ZJ6#2L+3s zym=Er5K9HoyAP;}6$(X)iB_A7SP}EkMAQAoRZ35-*^QH({lSN1H|#R|b7sDIY)n3% zFNP#0Gcywn4GkzMDZ$0Xg>qCqe=HUYyk0K`1_n@ET#RTms+>`mSS$vI!-1q1lAfN9 zmX;RG&d#zzsg22G!pO)7%F4>%@pv>BVpcvUHB>XGK*z_&s>k{HIl|$vawqN4g%CYq z2;mGv2xk~VI72ugl*Xo}rowKwD@XW3C?RQSX$XZvn3$Nr*47pq!|;YMe?n4HQZO?! zgWTL)w6(RNrltnN!^2DxPY5G~#uL-i(`;<9v9W=ytSoeQcf)40Dc|4&VT91&adL8! zjl3%>E7924$fWRwP<==s5V)D|T3%j8Utb@qIXoeh5Q655R##V%laqsvjt&HaLFEh| z2qlD4UP+QLIy#D#l@)f3e}qso#tXs-F`LbBxm>8Ou0~y59mdASShhvAg{O{P7$Hul z6ZQ4=SYKa9YilbyJ3BExK8~iQCPX3;=>|H&MX=T%T7k`k<5n>PHr1T-8uX}*7TwCJBVui{71MZ$z81ny0m=L*6>IiBQ&m%B}f^i2Z&QuWl zpXf`74lsmp2A4u8m8JeiM7R<{of_?x+TPw~;};R7a3h3df6UL%qqepdRaI3uJUldn z+$CpnM$_Ef%wCGITCFTZgsUcta&Zcg;j&W~nYe@`dTLq(ZY_jl9334QQdEYk8ba5* z&a9|Y7g6@Dg;3{9V+OT4VS4!Vw(Hv38k@jdT3W*8<)v~~9O9}WYGy>V>bJSMiK(e6 zHbYFC+71p5f7o%6;HI>+cvV_jitOxcxZQ3P6cn(RYecIhT>blzlt060vJCDVeF>oq z&2B?1)fsnyLXwmVCk`F0sYh{=o`Ki{59BmWIU5I*a)(23ef@$V?@#@#sqgOYVqsx{ z{k)MD^Hh{BlaNnN`9V>a6IF4)u1Rh{BnL*mdEx0DKtx%x|2z{3q0v0m4tgzFDk44ofy`glX(f`u%tWs zIx;Y9?C1WI$O`0h7I;J!Gcc&U0Aa?aWL6ml2C<`_E{-7;ac^%ru3KX{DdyoVuYA|v z7xqk#)xO{$ePUUUI^(kNyFt(Xb4>}XwfoT`xQEe3`A+SJf8WYI>;M1$A0Qm(>Rb2w zt+{yHmwJO0R~o|ug~i)g*rr;2(8_vrXu^R7LF_;kF%m)&As_dD`Oox{ef=UeJswV; zRS69*^)B(lBo8uNj$If`l)jBCF0 zAt$8O$J2i7e^_RVET(-->&N9EoAZ#9*tIUz58@w>A4N`RYlI&E7p_|*ikxb`CVu$O zRJTG1RqWM&sk+tt$YN6y@BKHbTZbZMns`J0$D;${^-T2vZO938mch&B{<;H8>pNGc zqB!7WywsQ9pY|WvYlQ69u*Zj|+^_#6tT$B=Dd}&Jl3(`c-{koPD|wI|V%zuh!})^6 zM2YeL*oER?+rGaah!u0M3GYPqlicyHAIkeyyC7#r{bc(;g7>!~XV?wXH!A(>cprtF zrEi>$5M}A=`GS&qs(HJWe!S2`u|Y)4^~1$%OT{T@WD7y?&tQ;56_QrKsMp)w>$9`|1JOYay!>ggqCM_XZ-rVKc~AD zIiR}?zt%I_Uui)Wi!%IF&%6IBikOz+`+7jcGq8N30i3r9(yrwrcwm;G@RB^6$4 z@%*2EsDB!28tnO5FJHGECAF0%9Qz;r@iI!v9xcO1WG&?;DCIhddod7k^eUZf4FsYV zw~0>!YRv z>-BX3!s0;lRKIat_615C+S&q*-m-u%%0UJ%O8B-Q)FA=no~2z}0B2gx zzqLB)@nSp*{1aV)?Uua_IFo!8%jt*nA0FeznFH5Wt!bTK_?{J9P+`j%VcOdc&Oac( z2e%!s4$FaBt$3W7`md1vjsHK^clcb&IQt=cOcf)}V&p56*<=dGz)@}nPgg&ebxsLQ E0D-)p(f|Me diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/UnresolvedNumber.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/contradictions/UnresolvedNumber.png index ce7a6d7e2a8ddb8dc6ba3e2973e1e8bd7b55d7bb..8862702f182093687b4fecb187ff755e7b4569cd 100644 GIT binary patch delta 1324 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 literal 7006 zcmeHMdr;F?77he9pr+xWqJRk$!qZvUg@vj>NQpoY2*C%~QKBLhDr>Nm5=0VSf(RJR zBGA&JJXE$UP_SK59uY!u)~Y`>;jU+nk_%BY6QT~-VKbV|9?kl0my*Z^joT|;qe~Uau=2-mL z!ZG)&$-t98Kd!%rT~fz27QHO#9YsUS*^8fS7&WO=Xw-ae!GdMrC`=xcmI5 zYHJfK)L-6RTMFR(|A(nkG>H?$(miIHu7v0KZU4IwUMGiFQPxL0I**6&p%$}kp;vr@ z?hdgG3-2Mc5E`)^sGwr1Q+4U79QS~CoQr~R0!m-@O2(w0Y%inT!`wEFQA|4cD?ZDaDP~egzU>{_Hh35n*nFM-YVDf-l4S zaYu)IAl}sLS1g$M9?F137+V}e80@+I#%ikpjQCXrPy-zH40D% zYZGf8x@nm%WZ_2;a8nE+<#Wvw!tAxB3K3j`Nh!U*o)V+#ONxzrf*^n1T3$+ZnnF0a zb8bx8MCACnB%&{sM%4QN-Nqb2Cd-LMfOzB61o^ZbW!hBwB(KtRb+5z<&<`&|Oo6 z<3XlNn)KFUJ++%JTh|4;uWGkF!XF~Gbs^^bLaj}s{#hXNGG!O z8^W2or3T-2>9PQMWNJ{EXx2$@xXlOB@?`oO`Y$Y99zYorDny8E%OTk z;NAI5o=D?ot6ZNkXSi2GwWee$0iHu%B1QZ8)8iND*UqvVxn z*pQi;p$(UQ#-;)B>-Jy4LD8_qTWv8|F_O!`C{rV2_O+lSXJAtkl8lmhrfOUYlj{|m>B_Ui@`2{F&(u2JmBgi1cSmUeZZ2rf1{k0;-oHIS}K#%3am zN2#L1k=S5pPHr46QieE83t;g*7oOPmCon%P_JE+QW&WkclF>iIqG0MX82u0o zWs5B#sA{f`E{brM0vFgohK*RmW7z?^M`IJaavz+pvBhY>>*bW)HXW+-2=U1uF_j+q z0Q8ZJE8uMnd+!e#1ylYTo7wiK@hVqseu_^(+rheOxl`bkU%Q-JOtX~7kbfeh!>gOL z(eCUbeNmEm@ED>kKjaqFB6 zFX@1l(OPYa*mBDm2bHb9wcJ(G4{NI!gg_BAqMywLP2IGFD;ULWvoRf9I*b0Jz^aH}9_MG>{V zE?iV&)oy$&1&g?FCn$Jr7lOSCmY``Z*W&vTH8IUMJ-PdO=CpH8^MixQ92n-Dzcb%| zzHg#)yWIf@gw<-r($W$(Ha6Jje?WlG@O(ZW^7HdiUS1Bb*DJM(13jnNY=&@x*lae8 zjg6tErUvQh>G1pg(j9pi3!2h zuDVgJAdioaI5;@K$;k=ZuV@8T3PNI}q@*A*F;QyK4yuhIv|;46ix&yi3ZhlQf(V9c z1)ivqnCP^BQ0liJZ*MPFR#sTPN(-W>QV?=k$;ruRZf-_rXD2Ev zD-jV9p@|@`+9iubxw*N)f7R6$t8ZwhbI>VwzsC+d@PMBA{QMl#)6=p=;UY*>R1}(;nlL*%f6HptJfJ~+_w5w+ zKXu`4(restczI@>5&CE!o_*Pk5!csT4^C89S7Ug1n7KVUa1*4pwUx_%NC;Z8#$V0A z{mBpTCVAknzJfRK^uA3xD}KKJ5wFd2c=pvxd^6d{ZLBddF{rJr#mLAAH$j9A>W>Jp zm-&(PGkj=qJo)`@H}?Xm*Fmq;=F9yd?E?%)fG@gVgmK4IG{82^eO zl#Qi$!`mVgTB)UnP+SlS();`S=;`TUZY(x7R=Oh(ayWG2gzD<_m+Z0@P*f0d4RmmN zZEX$5$H(lvZewF3b0=~jF)lAJ**+jQH^a zR8+*4#esnVHcQlwqJo^AoiV4iyu8c=p%_BeRBrGkf7`pYwS~#aNtXV1xm+y4$Ft7y zU!kZVl)NfnR5OYPbrOYU39q71 z2oi;6MCj6j7=+@2g!yL(ErY}9{#Yc9b zwe)-ZYia)pw?6rS+5#I4(SF3Yyu|PX-x4mFmBGP5F-o|!QwNgOcxVAy?*7rF1h+u_TFGR*7i>&!)xVUfe%f|&6at9xQwOfJ+;00000 LNkvXXu0mjfZMtRb literal 6936 zcmeHMYfuwc6y88F$}7~01%bqXj8?ROZxpgk2!>PzT1C)S0@Mn&V?mLMnq-ks9)hGW zZKY412)3lI{m9_5Bcz19D5xb zg1(X3U@=zY^R&d^O-T?mM>Y1Pq`hV33PH0@@ww~`DN+4x>^#r21zVfjf~4~@l-N?jl-A$4`OBY?^A=z9(n)?4LTcn$FphYHxpV)AweR&vamgrwCitefGpkkcGhq z+=w3f#3Xm`Pt@VrMeUM_bs)6N>yZ2Gq)jZGhu2r^De~Pjc`d(smyMP>JbPlDFfvAe z$VJ|tEXWt1-=Rk_i=@BFN^^!Of#x-H4E}p{P;@A1cuj6p+N8$uv2UM+UsX@S#<{nS z=zYcQ`I8pS7;R>ve~E8BN6;XgnlklpWom(DM^(WiwZqFX6wjU;@t*x%%r`Gtys9|U z{Ayc6V0F5cEiSj5&($=u2sxtn7N|Y+Dr82uyRP`-DrsioG#jS{N35S0RmqQ+iL9iW zGUBxj*(%9K1&e;kb3t@v;rOdZ^By_+E2KE@HP2GoX8!27<(k+N4$ZvLFIKii3B6q+{gs%WS>wJC0`qpC)G%{JAy)F zR&cz`90PL<#^B-^t^@i240kp}Fm>@o>v_@&dEcimHLCN)KBq`fGN7g8vcKcq`+Evy z&y9oFQ(M1#?~0wo6yib3IG(B0LnCD$4#Dd0YC$;B&7arG(>lg^7%Ug13X#m7#Xwo# zc`fio@0Csl`}n!6WM|?Yw7#&*Lm$2QgNbmucgl$++E7dJ;HtHZTveGU#4SL^B7(N+ zywy^4hjo&$oU!(#Lo@YMxyV0#P2|OBU-{sTS^bviWzF#{R@>c{=B~bnO3r7}K`+@m zAaPn{WU=U8t5blZ(H*a>2eiQ)SsX|l?H7c{F>tHykRXy;j^@z?MTB)Jwir9@{plrF zMi2Ejk~r92+ZnW5(`WibHr@!UV)*QyUn+g%m#oq1gaNy-x3C}onXE6zbx=ZqBQL_* z3{W1=+btYjyw=qi7D2A7gwRj|(K^*~VBmMeUoVQe9c@f#EHS^Hh1oQUYC+u4k@1P1 z0<&BUagiw`PNVQhdPzbdaHmb*5_R%Co*^t1n%P(IP*#k}<%mxMPghe#vTc)rn`b_p zzu{ggWV<+wj{#&~%NvxPR7|@D=yA%DK5yTB{)SXyBU(!=m4RFV#g3jE zvZWUFGsX@VmJ^}az5PJN!83Z%I+$hZ2O;fW-POuadi{-_!t%C`9V-wSOS;MZ`G;Ph9b%3d$J3!T@jL`)f3#m3=tJGFd zfpu}RsT!@->^1r@*Q1Y2rrZbQLqy4L5;Yzg^AWoG8q$S+6$9$TgunrOdf8ng)-iI5 ziFzcU9+Zx#tVjCXvnIWA?$2X-w}SL~b16vuO_RTI?tgZ|Zri}3)JdXL_uHNDmq6SY z;J$!dY%*y*%2bkCw}Z3}aGeR;7kKVQD9y-{+n)uZ%c|xEvT02Da*BFZ&P1{O1q4&XPb|d~OB1I5K1L_C^ zF0~&}YVCkr2^~x#dGzrCWQ?$5@0^>4YQT!;EKyNy+fCe&{n7BPVKI;ho*Z|`NkL|N z=3OuG5D=ver>SRnJTh&>eA+Re_*Oo3^!*=|^8fX2V;*0*`pJ|XRvzT7 mN#GT}ZW(!FgAKI`2-;8S2b)B(t$yUcSr9)cgnOD3o%R<2a3>Z3 diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/rules/NEdge.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/rules/NEdge.png index 90ca42513803e8eb5fa4b021488ee773d36f754b..d3dd36bbc10fb66ad83d8c04d0214e5f25836739 100644 GIT binary patch delta 1491 zcmV;^1uXicGV==|iBL{Q4GJ0x0000DNk~Le0001F0000K2nGNE0DHigm60Jde+7t1 zL_t(&L+x2xNE~Mr{$}>-?y4*1!ArHVF0`~rmEvWgh$M{(w7Do4azP75(HE`8hS&;1 zLr5Z|P3TiXw8a-iQUocb5hYL2f=JRfUYZ9}#Td;l#u_hsb9XxD?`V@IuIoS3kcWKm zvpe(8o;iEI?_7ovCMPE)sDvO0e~^4S9RKD+ILZU?ta_9keneT#n7fvQjM5m)NFxY_ z)|4GS=mb4XRs&`)?L=bzBs|MLNC+vrd@!5MnC%zQl-&i#dv9WGjo(K}l3+9%p&cP! z9m-mrcpCACQa>e$be}f+G;1tG8 zKjGo&_mSB0EAj$m@_no_C48iqV8MXUj{DtyG^X{yk&*fe5^~Lng!*Z8*(7*F{OU7{ zB0lq^;g56C_@K^)ctZ*rqPt|0`D_{?V%YyPzLh@4{1;Bx&kf>|@d4t+WCS@0F$*FZ zR^P=)w+mmU|EL)uqH?S)e`Jb1(jxZ?$}xJnoCM|E@T;=vm4CmgSo;S)IfFgY(toat zd6A0-VK5lj(i);%I<IE1 z9z<7H*Ooqpy&D-D92`VJL4oQ&OAU*NIDh^;>gwu{kdS~ockZZCHu-eu&>>`IX2R)o z;@Gics{AA}yk0L_TU(jG6u?MSy%}gMzH;RX_U_%w?AFxOptrY|+1?DB5<-Exefu^l zD=S&x)T%iU2p}gXe+MlsEf^XaV&|5Zmst>aK+3&)_b$rI%h`ldTU(3H&Q2^WEO4uu z>{zW<96frJ`D?S;lpQ`02~|~9$j;72Q&SU*DG4XsG`6Yd>R#ujBMjhzS5~)i| zOQ^4}M@dNu_UzdMzu&K1u|0(3u{t$16}xxuhR^3iettd@e-jf~hR_}_$WLCMUIemt z{rYtrIB)1o`%cMm;1J!oufM09ktvb%jy;3;_2 zo338Hitg@itgNgkyRQaFEJZ~{jF9p1aa2@PASNb8*?k^-xy=bG2We?(tYqo+dJGQ_ zvrjc3La8oSe^*x{FE3A1b*lwUlGH0{fFS`!f|o`JskpSXlw}=(K93wZ!W6^{DuLAJ zE?l^P+1XiE3j6x{Hl{fqP!_Kb8Wd38enh{WpPy%qoqQY{8)N6soH-LVi^JZH)cfSg z6ZT#0a|8W;U|;~Tv9W9_qDhO=cXjpIC+J8)fts6}f5ZO$`!PB?ist5KHeMDM7H*Kv z18T%KZrs?IFlT0FxJaQ=pOln@;^Jb~FApC+%qqf;9Xt4%It7qQ3mLn3@gmyW+f|W5 zX*)GF#hNCdm#EBCqD=Wjkefv~3cnTH~K7%V<@*@8GnVkkwo;8%#PZ-i$}=u6YD}Ymn&0 tDUAxycAH6X-@zX85K1*M9_3l;zX002ovPDHLkV1m|cxnBSP literal 6436 zcmeHMYdDna8Xlx6v&M9?W@R)giehDz2!%cA$PP==NI8rwWJDO zIy}9mpdUruv|Ia6Xj4_GXLvdfeH9~PZkp!t#&ab^g3xmAT=PJ^N+t2<4`~~+l0DD9 zE0Od|tc~M(-dRdMC*N64+9;&iJd3q2mVRn5y{~j}0zUNa5=Vm&`{a|Om6y)pGeWzZ zPGjFvIwC3Gl7{zNWw{QflV^WQ_Ys2Nq$#yq51iPLwf=|SXwg4|C^qCKt&H&eU!*Cq zF1}F+v1hoSt(<8NqNHrd+WMakR&%taDu9~C$Z}o&GUrSXE%BnW6*#|<#sZt{f2dE{ zJh$uKsa?$<7Tr#HR;0(hM)mY+mga%SR?gGA7dz#2egb{k#gUM>9o(iA3MFQ0;{8dKiW%{EvwedzyKj8tAF9PlL^Vj%IIYx18-BKs#=~Smt zo#yIvS^a;CmAWvONIj@8Q}PzR^V5|dhg4rw?|*smkZm?lG$87?VxwvCKxRR!Xd=|T z-_7Z8kjXnxSfBS1C8dXTpv*dD2?Mf?5Unk28FDL|)X<)jnS(k4FGHEi19|*=+##>9 z_zrWZ=Vs}hxp|MUK%YV9I$)BuI+Q4Gij{4yRL7l{#M6e!USs&oKEoM-CEij&XYMX%9lVU^TS;L|FDJ0CA%7nv53 zX-NBPO&(_^a#azY*b1nx1=TZzZF!Tu@D;XY0!Q!3;6_{9b(Rv^JSQ=ygE#{J`feQkK*c1bLpAq~rFm>6bx5vjA2=SlMIl3$J7<^iAbie+Qr{#h5{qiw_m@xtJ1?s6Yg zNXazFyM>=LL)|+9TZsAv7p7)F^2>w{X8ihCT^@IaoHto`v+&3r^1=v+dL$-@+jgO( z;Y`8}_Y5p*`vQqVbsR*}{v!%W?A~Ez+`e}*lM1qDv$ly}=lVl!80TufR=Pw$$kvwL z4B62{zApl_w}adBPP>5Z@u=-ZN@1mgOW*}Gp)Nq3%S@yBp|xpQ&RIYb1=M;+$-3rR z)b_2Y?dPo%j`6SB%KbM!ZL{HC@=m&W&G=)hku|NsUe_8mizSJLL6DL@qmYtD6{%t? z5i3zz~8hKMZf*!KS^}vdrMP+{uH=#|L_d=2%)(!2~pp zf&{L^1a!wx39u)`Ksh6)CSb>}Mio{~!_l&GUx?qZ5E3|)ds;$fHp-2^v@^t3b6*Nt zXG7h2uR9JHasm<7nQA4aH;rYsol&}3q87YP{=5MyV7yB#ATxua5Dm;U+#`-I8Ab88 zdMbY-VmdNW49a0`ep22yA0n9AFsLaigxv+dhdGtNdc79k!}hY4y?IbAIKUf`JKqGR zL`q5d(}BPJFp9xI3&4f{(faQA!(e?XTwgzeTCdkG$j$FBK-~aPkp(XI?;#pFyy-!C z+7%Q7`yc~{omc~Io}Ip^?rNTMzJ+r?72>z#iki478RDOa!vB7GqC{P2TP=GO1O)nY zDD^S>$tMV3hyAbo%u6W#OhEn=lU7X-IY;)u`twQt_||CDAEMVCyXSbxO(K+!&)PgvC8d;?&XCsS-L;C49g}TcfVY=fyHw~ z{eo0>{c$8WE{h4}yK+^#%1-)3bP2O`&=*RWR@PvPN#7S*U|b+W0{kVag$8#y35=5b zN|7w?Y3>q}Oa{IXK*}ABk^qz)r$4Ra<20J0ks9_kye&!z0k^O@gGA1-1qz7Zc9l+c-8ke4 z-6}(}GRXq5A!dMa6@6Qzr2s~l>pgWUL z(tTPwqxvs~EQw^tS8Q-+wleqqwNX#~gv4q>^81(zXj?uc#(Y0SQK+D%r_RwpAJ4vv zRLE0xxp?Vb0wO+To&{R=++U$q=CkE}`t-6%g9Zm?UwzDi6S?VBr%|2e>YrIw(y{f> zah(v|KYQ~1za8nDE`76BKB#|t>Qo~#e%D%R%LU&Sh=%GcB}(rq3x6W`dXIr`HZa>a L+iuF)=pOYiMbeBQ diff --git a/src/main/resources/edu/rpi/legup/images/skyscrapers/rules/OneEdge.png b/src/main/resources/edu/rpi/legup/images/skyscrapers/rules/OneEdge.png index 8228154664956910bf47d934dac5a500bbaf0255..40d6ff65f97e0110b9e2b68ef87e32cf6b16e0a5 100644 GIT binary patch delta 897 zcmV-{1AhF*A*Kf*iBL{Q4GJ0x0000DNk~Le0001F0000K2nGNE0DHigm60Jde*-&7 zL_t(&L+zPONE<;E$N#%YHj)@6hah+pS`b?hBKE^mJr!*Akb?;AL3%MzK@mTCsvbOB zPf}>1=)oRBDdZqtik|dPs^CRWD%R*Fl4{Iu$Y=A0Sp`9p%#Kj({>ZR9GhvvW|Gs^1 z-YEO~`$b4VQ559!d3^m6fm`wMe^zTK-V74SIImelRaMl~)IisD-Xc!1SVUc29s2wG zVHgH)m4h@v=z;Y_7H_@8X42Q#kcs!29#YK#b zjae4O=kp;P4r6+H8mUx@x5`1PAjY2@2EISV!vPJi)j1f2Gu~Sr9MA-qI?&bCg`=Y*Ta+u@CFFtpCg$honKPp{5on*1NFT7-QC6Pf9xzg9uM!eA;e#K z0ce9p=@t59k)_Pc%viFzyGTW=VLDzb4w%FstDr*k_V%Kwsfpd&TvAq$Y&MI{%}sW{ zzP`@ha1ki6x3si`*49>xj*c?xh(@Ef54l2FK`5Kq*Vl*R<70GpcO#un^PcLUoX`09 zICge+(9_d{!^1;ne<38e%_U_8p^Y4crnGRBRCBppyr+67Yunh^h+r_tLSR|J!d;>w zA3~9qS*${vOxr51ry@bBMTHZN(#Z9SU#O@Gjd3ee`{z;i_V%QtRVjRB=ONK2?0_n# zQ^r=zqLh*tj@mq86D?T&_)FMtnb6$K11btAtd2(k%HZH2S0*PXjS$*omRsC=vJz XNuhHZzlE}i00000NkvXXu0mjfqRptQ literal 4294 zcmeAS@N?(olHy`uVBq!ia0y~yV44hMw{tK7$)jsr`G6E-age(c!@6@aFM%AEbVpxD z28NCO+0J=f;E6U*`G z2`Ut8d(k}IXSavF#U-Uh{Bf#VH|>nxU})%dG*SY{HF~S`_kl-uhh4?gE2p029XxhK zLo_`R$UV8G`%AO3uF|gup+VZSce6?hFAka0s`%@H>Seuwv1Dhv>g8bN^TsanF;_92 zFe-~2>!YDD8X7|+r~KP^_OJVge*Xi&qGxJ##3rNvKUwX}B`fCv%bHbX6YC0=xVp&i z@yhzjpYtw%?q6Q_`3=3Dfm+`;q{zN_9{;eced2S;Mf~fs#9y+zN4b1CxOz$0|2fZ= zt^O~2-;NPfYQ0N5dCyJ#zv!P&xtOKLKhCqh-v2qw5lWr;?GMebxO(C<&qem|t%yQ! z_4&NKUq7?&{AK|atH2Ca&B^=6{6qUa<4-ouUk-*M6{N3}XU~rM$NT4jFsPt?DmU#7 zZ%KYZ$-~3z3x3;Ty1{PEPR%FxkDW)j;lt@yf6E?D-|=@6rsw8g$-O`Q(p zrfZ<}2GE1A-CXM%y|EaXTD%=dxnm&p{o$i9A3)Xh7(H)cpIE#mjS z*1PCmc}?|ge8zMIUJb_gWT)xLOg|8V|21H6G_@)?-WdGRGJZ8yvR zT-&er;!6_}Xa8v5i8IG%Q{I%%{)MG?@x}M6i|6AX-`j;Zj2F+}e{63lKKHJ6x3BN5 zevL1}zj3a3pYH`VKdJBg4nN16nRB>ne=Fbl!8Dy1g}_p&{XC(3y{+}sU(I#@ zxR(PJ-o_UP+gh*vz5Sz@6;n-ZS@Grb_D8Q)K@0C_m+!y=dLbWXq}%P-nfVNu#=AB` z%I+L--apqr{#L`Ha^+6Vhx>c&!`q-0((4tEfW`PP%#!Zcga5_<55p=0Ta(Y?J3?~s zWwWZRQCU#u2U6&ah6bc7I08fC+#!M550f&H8h6l=%Yqx&=<;5M*$#N518lhI&qQiD zLaX+!%?7}RWD1sgZ2&ECn{@9Ou*C}U6ehF&kEZ7&yQA~#|Ji%h*Q-S?XG#H%JurB> L`njxgN@xNAo|syM From 019373725472e1a6765ca97103f2971e6e7c5e7c Mon Sep 17 00:00:00 2001 From: sveludandi112 Date: Mon, 14 Nov 2022 22:15:27 -0500 Subject: [PATCH 40/45] Skyscraper Ruleset completed --- .../skyscrapers/rules/Skyscrapers Ruleset.pdf | Bin 0 -> 174484 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/Skyscrapers Ruleset.pdf diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/Skyscrapers Ruleset.pdf b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/Skyscrapers Ruleset.pdf new file mode 100644 index 0000000000000000000000000000000000000000..31122613c87a844dc3697732fbb6100cadd66cd6 GIT binary patch literal 174484 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 z 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 literal 0 HcmV?d00001 From a4b19df8351268f7e274b4ff3f2faef8410add3f Mon Sep 17 00:00:00 2001 From: ThisMatt Date: Fri, 18 Nov 2022 18:27:22 -0500 Subject: [PATCH 41/45] Renamed basic rules --- ...BasicRule.java => LastSingularCellBasicRule.java} | 12 ++++-------- ...sicRule.java => LastSingularNumberBasicRule.java} | 12 ++++-------- ...xBasicRule.java => LastVisibleCellBasicRule.java} | 12 ++++-------- ...asicRule.java => LastVisibleNumberBasicRule.java} | 12 ++++-------- .../edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md | 3 ++- .../rules/skyscrapers_reference_sheet.txt | 12 ++++++------ 6 files changed, 24 insertions(+), 39 deletions(-) rename src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/{LastCellBasicRule.java => LastSingularCellBasicRule.java} (93%) rename src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/{LastNumberBasicRule.java => LastSingularNumberBasicRule.java} (91%) rename src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/{FixedMaxBasicRule.java => LastVisibleCellBasicRule.java} (94%) rename src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/{OneEdgeBasicRule.java => LastVisibleNumberBasicRule.java} (92%) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastCellBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastSingularCellBasicRule.java similarity index 93% rename from src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastCellBasicRule.java rename to src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastSingularCellBasicRule.java index 91a8141ea..727559083 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastCellBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastSingularCellBasicRule.java @@ -9,17 +9,13 @@ import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersCell; import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersType; -import java.awt.Point; import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; -public class LastCellBasicRule extends BasicRule { +public class LastSingularCellBasicRule extends BasicRule { - public LastCellBasicRule() { - super("SKYS-BASC-0002", "Last Cell", - "A certain number must go in a certain cell, because that cell is only cell in that row/col that does not create a duplicate contradiction", + public LastSingularCellBasicRule() { + super("SKYS-BASC-0002", "Last Non-Duplicate Cell", + "There is only one cell on this row/col for this number that does not create a duplicate contradiction", "edu/rpi/legup/images/skyscrapers/rules/LastCell.png"); } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastSingularNumberBasicRule.java similarity index 91% rename from src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java rename to src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastSingularNumberBasicRule.java index 32a13e43c..248998e84 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastNumberBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastSingularNumberBasicRule.java @@ -9,17 +9,13 @@ import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersCell; import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersType; -import java.awt.Point; import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; -public class LastNumberBasicRule extends BasicRule { +public class LastSingularNumberBasicRule extends BasicRule { - public LastNumberBasicRule() { - super("SKYS-BASC-0003", "Last Number", - "A certain cell must contain a certain number since that number is the only one that does not create a duplicate contradiction.", + public LastSingularNumberBasicRule() { + super("SKYS-BASC-0003", "Last Non-Duplicate Number", + "There is only one number for this cell that does not create a duplicate contradiction", "edu/rpi/legup/images/skyscrapers/rules/LastNumber.png"); } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastVisibleCellBasicRule.java similarity index 94% rename from src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java rename to src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastVisibleCellBasicRule.java index 030567a94..778a6e2c9 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/FixedMaxBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastVisibleCellBasicRule.java @@ -9,17 +9,13 @@ import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersCell; import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersType; -import java.awt.Point; import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; -public class FixedMaxBasicRule extends BasicRule { +public class LastVisibleCellBasicRule extends BasicRule { - public FixedMaxBasicRule() { - super("SKYS-BASC-0001", "Fixed Max", - "This is the last cell for this number that does not create a visibility contradiction.", + public LastVisibleCellBasicRule() { + super("SKYS-BASC-0001", "Last Visible Cell", + "There is only one cell on this row/col for this number that does not create a visibility contradiction", "edu/rpi/legup/images/skyscrapers/rules/FixedMax.png"); } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastVisibleNumberBasicRule.java similarity index 92% rename from src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java rename to src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastVisibleNumberBasicRule.java index 557ea4d5b..7a4a7210a 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/OneEdgeBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastVisibleNumberBasicRule.java @@ -9,17 +9,13 @@ import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersCell; import edu.rpi.legup.puzzle.skyscrapers.SkyscrapersType; -import java.awt.Point; import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; -public class OneEdgeBasicRule extends BasicRule { +public class LastVisibleNumberBasicRule extends BasicRule { - public OneEdgeBasicRule() { - super("SKYS-BASC-0005", "One Edge", - "This is the last number for this cell that does not create a visibility contradiction", + public LastVisibleNumberBasicRule() { + super("SKYS-BASC-0005", "Last Visible Number", + "There is only one number for this cell that does not create a visibility contradiction", "edu/rpi/legup/images/skyscrapers/rules/OneEdge.png"); } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md index ffe643d34..cf0db25ac 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md @@ -13,8 +13,9 @@ spreadsheet : https://docs.google.com/spreadsheets/d/1l7aUZtavtysM8dtGnaEIXhBKMR - View contains a few of these - document utility functions in the reference sheet, COMMENTS! - review and identify dead code - - replace height/width with size (never not square) - remove all these damn print statments (commented ones too if they aren't useful) + - Edit to allow blank clues + - Display flags somewhere 5. Flags - edit exporter to include flags in xml file format (if needed) 6. Documentation diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/skyscrapers_reference_sheet.txt b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/skyscrapers_reference_sheet.txt index d036e4708..d5ea4d0b8 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/skyscrapers_reference_sheet.txt +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/skyscrapers_reference_sheet.txt @@ -1,15 +1,15 @@ RULE LIST: - SKYS-BASC-0001 : FixedMaxBasicRule - SKYS-BASC-0002 : LastCellBasicRule - SKYS-BASC-0003 : LastNumberBasicRule + SKYS-BASC-0001 : LastVisibleNumberBasicRule + SKYS-BASC-0002 : LastSingularCellBasicRule + SKYS-BASC-0003 : LastSingularNumberBasicRule SKYS-BASC-0004 : NEdgeBasicRule - SKYS-BASC-0005 : OneEdgeBasicRule + SKYS-BASC-0005 : LastVisibleNumberBasicRule SKYS-CONT-0001 : DuplicateNumbersContradictionRule SKYS-CONT-0002 : ExceedingVisibilityContradictionRule SKYS-CONT-0003 : InsufficientVisibilityContradictionRule - SKYS-CONT-0004 : NoNumberForCellContradictionRule/UnresoveldCell - SKYS-CONT-0005 : NoCellForNumberContradictionRule/UnresoveldNumber + SKYS-CONT-0004 : UnresolvedCellContradictionRule + SKYS-CONT-0005 : UnresolvedNumberContradictionRule SKYS-CONT-0006 : PreemptiveVisibilityContradictionRule SKYS-CASE-0001 : NumberForCellCaseRule From 3765ac76892f1ce60059d7873a40b8ceccf2845a Mon Sep 17 00:00:00 2001 From: sveludandi112 Date: Mon, 21 Nov 2022 23:30:34 -0500 Subject: [PATCH 42/45] Skyscraper Ruleset fixed + removed treeTent/lightUp code --- .../legup/puzzle/skyscrapers/Skyscrapers.java | 4 -- .../puzzle/skyscrapers/SkyscrapersBoard.java | 6 +- .../skyscrapers/SkyscrapersCellFactory.java | 11 ++-- .../skyscrapers/SkyscrapersController.java | 12 +--- .../skyscrapers/SkyscrapersExporter.java | 4 +- .../skyscrapers/SkyscrapersImporter.java | 20 +++---- .../puzzle/skyscrapers/SkyscrapersView.java | 52 ------------------ .../ExceedingVisibilityContradictionRule.java | 4 +- ...sufficientVisibilityContradictionRule.java | 4 +- .../skyscrapers/rules/Skyscrapers Ruleset.pdf | Bin 174484 -> 194684 bytes 10 files changed, 26 insertions(+), 91 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/Skyscrapers.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/Skyscrapers.java index a4853993d..71e8f8306 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/Skyscrapers.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/Skyscrapers.java @@ -4,9 +4,6 @@ import edu.rpi.legup.model.gameboard.Board; import edu.rpi.legup.model.gameboard.PuzzleElement; import edu.rpi.legup.model.rules.ContradictionRule; -import edu.rpi.legup.puzzle.lightup.LightUpBoard; -import edu.rpi.legup.puzzle.lightup.LightUpCell; -import edu.rpi.legup.puzzle.lightup.LightUpCellType; public class Skyscrapers extends Puzzle { @@ -26,7 +23,6 @@ public Skyscrapers() { */ @Override public void initializeView() { - SkyscrapersBoard board = (SkyscrapersBoard) currentBoard; boardView = new SkyscrapersView((SkyscrapersBoard) currentBoard); } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java index fa7a5f010..a02908fb4 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java @@ -249,10 +249,10 @@ public void printBoard(){ */ @Override public boolean equalsBoard(Board board) { - SkyscrapersBoard treeTentBoard = (SkyscrapersBoard) board; + SkyscrapersBoard skyscrapersBoard= (SkyscrapersBoard) board; for (SkyscrapersLine l1 : lines) { boolean hasLine = false; - for (SkyscrapersLine l2 : treeTentBoard.lines) { + for (SkyscrapersLine l2 : skyscrapersBoard.lines) { if (l1.compare(l2)) { hasLine = true; } @@ -261,7 +261,7 @@ public boolean equalsBoard(Board board) { return false; } } - return super.equalsBoard(treeTentBoard); + return super.equalsBoard(skyscrapersBoard); } @Override diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersCellFactory.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersCellFactory.java index 4e66708bd..b6329aac2 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersCellFactory.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersCellFactory.java @@ -22,9 +22,10 @@ public class SkyscrapersCellFactory extends ElementFactory { @Override public PuzzleElement importCell(Node node, Board board) throws InvalidFileFormatException { try { - SkyscrapersBoard treeTentBoard = (SkyscrapersBoard) board; - int width = treeTentBoard.getWidth(); - int height = treeTentBoard.getHeight(); + //SkyscrapersBoard treeTentBoard = (SkyscrapersBoard) board; + SkyscrapersBoard skyscrapersBoard = (SkyscrapersBoard) board; + int width = skyscrapersBoard.getWidth(); + int height = skyscrapersBoard.getHeight(); NamedNodeMap attributeList = node.getAttributes(); if (node.getNodeName().equalsIgnoreCase("cell")) { @@ -52,8 +53,8 @@ public PuzzleElement importCell(Node node, Board board) throws InvalidFileFormat throw new InvalidFileFormatException("TreeTent Factory: line location out of bounds"); } - SkyscrapersCell c1 = treeTentBoard.getCell(x1, y1); - SkyscrapersCell c2 = treeTentBoard.getCell(x2, y2); + SkyscrapersCell c1 = skyscrapersBoard.getCell(x1, y1); + SkyscrapersCell c2 = skyscrapersBoard.getCell(x2, y2); return new SkyscrapersLine(c1, c2); } else { diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersController.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersController.java index fa771beca..0558213ab 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersController.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersController.java @@ -85,17 +85,7 @@ public void mouseReleased(MouseEvent e) { treePanel.updateError(edit.getError()); } } - } /*else if (lastCellPressed != null) { - if (dragStart instanceof SkyscrapersElementView) { - ICommand editLine = new EditLineCommand(selection, (SkyscrapersElementView) dragStart, lastCellPressed); - if (editLine.canExecute()) { - editLine.execute(); - getInstance().getHistory().pushChange(editLine); - } else { - treePanel.updateError(editLine.getError()); - } - } - }*/ + } } } dragStart = null; diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersExporter.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersExporter.java index 9beed2379..dac09bd16 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersExporter.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersExporter.java @@ -6,8 +6,8 @@ public class SkyscrapersExporter extends PuzzleExporter { - public SkyscrapersExporter(Skyscrapers treeTent) { - super(treeTent); + public SkyscrapersExporter(Skyscrapers skyscrapers) { + super(skyscrapers); } @Override diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java index 80411dd83..5e71c29e0 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java @@ -9,8 +9,8 @@ import java.awt.*; public class SkyscrapersImporter extends PuzzleImporter { - public SkyscrapersImporter(Skyscrapers treeTent) { - super(treeTent); + public SkyscrapersImporter(Skyscrapers skyscrapers) { + super(skyscrapers); } /** @@ -35,11 +35,11 @@ public void initializeBoard(int rows, int columns) { public void initializeBoard(Node node) throws InvalidFileFormatException { try { if (!node.getNodeName().equalsIgnoreCase("board")) { - throw new InvalidFileFormatException("TreeTent Importer: cannot find board puzzleElement"); + throw new InvalidFileFormatException("Skyscrapers Importer: cannot find board puzzleElement"); } Element boardElement = (Element) node; if (boardElement.getElementsByTagName("cells").getLength() == 0) { - throw new InvalidFileFormatException("TreeTent Importer: no puzzleElement found for board"); + throw new InvalidFileFormatException("Skyscrapers Importer: no puzzleElement found for board"); } Element dataElement = (Element) boardElement.getElementsByTagName("cells").item(0); NodeList elementDataList = dataElement.getElementsByTagName("cell"); @@ -54,7 +54,7 @@ public void initializeBoard(Node node) throws InvalidFileFormatException { } if (skyscrapersBoard == null) { - throw new InvalidFileFormatException("TreeTent Importer: invalid board dimensions"); + throw new InvalidFileFormatException("Skyscraper Importer: invalid board dimensions"); } int size = skyscrapersBoard.getSize(); @@ -83,26 +83,26 @@ public void initializeBoard(Node node) throws InvalidFileFormatException { NodeList axes = boardElement.getElementsByTagName("axis"); if (axes.getLength() != 2) { - throw new InvalidFileFormatException("TreeTent Importer: cannot find axes"); + throw new InvalidFileFormatException("Skyscraper Importer: cannot find axes"); } Element axis1 = (Element) axes.item(0); Element axis2 = (Element) axes.item(1); if (!axis1.hasAttribute("side") || !axis1.hasAttribute("side")) { - throw new InvalidFileFormatException("TreeTent Importer: side attribute of axis not specified"); + throw new InvalidFileFormatException("Skyscraper Importer: side attribute of axis not specified"); } String side1 = axis1.getAttribute("side"); String side2 = axis2.getAttribute("side"); if (side1.equalsIgnoreCase(side2) || !(side1.equalsIgnoreCase("east") || side1.equalsIgnoreCase("south")) || !(side2.equalsIgnoreCase("east") || side2.equalsIgnoreCase("south"))) { - throw new InvalidFileFormatException("TreeTent Importer: axes must be different and be {east | south}"); + throw new InvalidFileFormatException("Skyscraper Importer: axes must be different and be {east | south}"); } NodeList eastClues = side1.equalsIgnoreCase("east") ? axis1.getElementsByTagName("clue") : axis2.getElementsByTagName("clue"); NodeList southClues = side1.equalsIgnoreCase("south") ? axis1.getElementsByTagName("clue") : axis2.getElementsByTagName("clue"); if (eastClues.getLength() != skyscrapersBoard.getHeight() || southClues.getLength() != skyscrapersBoard.getWidth()) { - throw new InvalidFileFormatException("TreeTent Importer: there must be same number of clues as the dimension of the board"); + throw new InvalidFileFormatException("Skyscraper Importer: there must be same number of clues as the dimension of the board"); } for (int i = 0; i < eastClues.getLength(); i++) { @@ -144,7 +144,7 @@ public void initializeBoard(Node node) throws InvalidFileFormatException { puzzle.setCurrentBoard(skyscrapersBoard); } catch (NumberFormatException e) { - throw new InvalidFileFormatException("TreeTent Importer: unknown value where integer expected"); + throw new InvalidFileFormatException("Skyscraper Importer: unknown value where integer expected"); } } } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersView.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersView.java index 5b95cb632..b12867eda 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersView.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersView.java @@ -4,7 +4,6 @@ import edu.rpi.legup.model.gameboard.Board; import edu.rpi.legup.model.gameboard.CaseBoard; import edu.rpi.legup.model.gameboard.PuzzleElement; -import edu.rpi.legup.model.tree.TreeElement; import edu.rpi.legup.ui.boardview.ElementView; import edu.rpi.legup.ui.boardview.GridBoardView; import org.apache.logging.log4j.LogManager; @@ -17,21 +16,8 @@ public class SkyscrapersView extends GridBoardView { private final static Logger LOGGER = LogManager.getLogger(SkyscrapersView.class.getName()); - static Image TREE, GRASS, TENT; - - static { - try { - TREE = ImageIO.read(ClassLoader.getSystemResourceAsStream("edu/rpi/legup/images/treetent/tree.png")); - GRASS = ImageIO.read(ClassLoader.getSystemResourceAsStream("edu/rpi/legup/images/treetent/grass.png")); - TENT = ImageIO.read(ClassLoader.getSystemResourceAsStream("edu/rpi/legup/images/treetent/tent.png")); - } - catch (IOException e) { - LOGGER.error("Failed to open TreeTent images"); - } - } private ArrayList lineViews; - private ArrayList northClues; private ArrayList eastClues; private ArrayList southClues; @@ -64,7 +50,6 @@ public SkyscrapersView(SkyscrapersBoard board) { } for (int i = 0; i < gridSize.height; i++) { - //SkyscrapersClueView row = new SkyscrapersClueView(new SkyscrapersClue(i, i, SkyscrapersType.CLUE_WEST)); SkyscrapersClueView row = new SkyscrapersClueView(board.getWestClues().get(i)); row.setLocation(new Point(0, (i + 1) * elementSize.height)); row.setSize(elementSize); @@ -78,7 +63,6 @@ public SkyscrapersView(SkyscrapersBoard board) { } for (int i = 0; i < gridSize.width; i++) { - //SkyscrapersClueView col = new SkyscrapersClueView(new SkyscrapersClue(i, i, SkyscrapersType.CLUE_NORTH)); SkyscrapersClueView col = new SkyscrapersClueView(board.getNorthClues().get(i)); col.setLocation(new Point((i + 1) * elementSize.width, 0)); col.setSize(elementSize); @@ -130,22 +114,10 @@ public ElementView getElement(Point point) { return null; } - public ArrayList getLineViews() { - return lineViews; - } - public ArrayList getNorthClues() { return northClues; } - public ArrayList getEastClues() { - return eastClues; - } - - public ArrayList getSouthClues() { - return southClues; - } - public ArrayList getWestClues() { return westClues; } @@ -158,30 +130,6 @@ protected Dimension getProperSize() { return boardViewSize; } - /** - * Called when the tree element has changed. - * - * @param treeElement tree element - */ - @Override - public void onTreeElementChanged(TreeElement treeElement) { - super.onTreeElementChanged(treeElement); - SkyscrapersBoard treeTentBoard; - if (board instanceof CaseBoard) { - treeTentBoard = (SkyscrapersBoard) ((CaseBoard) board).getBaseBoard(); - } - else { - treeTentBoard = (SkyscrapersBoard) board; - } - - lineViews.clear(); - for (SkyscrapersLine line : treeTentBoard.getLines()) { - SkyscrapersLineView lineView = new SkyscrapersLineView(line); - lineView.setSize(elementSize); - lineViews.add(lineView); - } - } - /** * Sets the board associated with this view * diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java index a6912ebfb..ef8f72711 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/ExceedingVisibilityContradictionRule.java @@ -118,10 +118,10 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { } /** - * Checks whether the tree node has a contradiction using this rule + * Checks whether the Skyscraper cell has a contradiction using this rule * * @param board board to check contradiction - * @return null if the tree node contains a contradiction, otherwise error message + * @return null if the Skyscraper cell contains a contradiction, otherwise error message */ @Override public String checkContradiction(Board board) { diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java index 29612e65c..fb3764a2b 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/InsufficientVisibilityContradictionRule.java @@ -118,10 +118,10 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { } /** - * Checks whether the tree node has a contradiction using this rule + * Checks whether the Skyscraper cell has a contradiction using this rule * * @param board board to check contradiction - * @return null if the tree node contains a contradiction, otherwise error message + * @return null if the Skyscraper cell contains a contradiction, otherwise error message */ @Override public String checkContradiction(Board board) { diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/Skyscrapers Ruleset.pdf b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/Skyscrapers Ruleset.pdf index 31122613c87a844dc3697732fbb6100cadd66cd6..3ff35c2fe9eca703566e225aff879c8029337faa 100644 GIT binary patch delta 52025 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 B6>$In delta 32323 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 From 746c71a34cef3ec8728dc5d0df0f64b95260e896 Mon Sep 17 00:00:00 2001 From: sveludandi112 Date: Sun, 4 Dec 2022 23:17:40 -0500 Subject: [PATCH 43/45] 9 new puzzle files across easy/medium 4x4 and 5x5 puzzles --- .../{easy1 => 4x4 Skyscrapers Easy1} | 6 ++--- .../{easy2 => 4x4 Skyscrapers Easy2} | 10 +++---- .../{medium1 => 4x4 Skyscrapers Easy3} | 8 +++--- .../{easy3 => 5x5 Skyscrapers Easy1} | 13 +++++----- .../skyscrapers/5x5 Skyscrapers Easy2 | 26 +++++++++++++++++++ .../skyscrapers/5x5 Skyscrapers Easy3 | 26 +++++++++++++++++++ .../{medium2 => 5x5 Skyscrapers Medium1} | 13 +++++----- .../skyscrapers/5x5 Skyscrapers Medium2 | 26 +++++++++++++++++++ .../skyscrapers/5x5 Skyscrapers Medium3 | 26 +++++++++++++++++++ .../legup/puzzle/skyscrapers/rules/TODO.md | 8 +++--- 10 files changed, 134 insertions(+), 28 deletions(-) rename puzzles files/skyscrapers/{easy1 => 4x4 Skyscrapers Easy1} (87%) rename puzzles files/skyscrapers/{easy2 => 4x4 Skyscrapers Easy2} (75%) rename puzzles files/skyscrapers/{medium1 => 4x4 Skyscrapers Easy3} (87%) rename puzzles files/skyscrapers/{easy3 => 5x5 Skyscrapers Easy1} (83%) create mode 100644 puzzles files/skyscrapers/5x5 Skyscrapers Easy2 create mode 100644 puzzles files/skyscrapers/5x5 Skyscrapers Easy3 rename puzzles files/skyscrapers/{medium2 => 5x5 Skyscrapers Medium1} (83%) create mode 100644 puzzles files/skyscrapers/5x5 Skyscrapers Medium2 create mode 100644 puzzles files/skyscrapers/5x5 Skyscrapers Medium3 diff --git a/puzzles files/skyscrapers/easy1 b/puzzles files/skyscrapers/4x4 Skyscrapers Easy1 similarity index 87% rename from puzzles files/skyscrapers/easy1 rename to puzzles files/skyscrapers/4x4 Skyscrapers Easy1 index 8cb501fb5..f7e0d82e4 100644 --- a/puzzles files/skyscrapers/easy1 +++ b/puzzles files/skyscrapers/4x4 Skyscrapers Easy1 @@ -7,14 +7,14 @@ - - + + - + diff --git a/puzzles files/skyscrapers/easy2 b/puzzles files/skyscrapers/4x4 Skyscrapers Easy2 similarity index 75% rename from puzzles files/skyscrapers/easy2 rename to puzzles files/skyscrapers/4x4 Skyscrapers Easy2 index 10ba52996..e30fbd89e 100644 --- a/puzzles files/skyscrapers/easy2 +++ b/puzzles files/skyscrapers/4x4 Skyscrapers Easy2 @@ -6,16 +6,16 @@ - + - - - - + + + + diff --git a/puzzles files/skyscrapers/medium1 b/puzzles files/skyscrapers/4x4 Skyscrapers Easy3 similarity index 87% rename from puzzles files/skyscrapers/medium1 rename to puzzles files/skyscrapers/4x4 Skyscrapers Easy3 index 8df3f30d3..61fa8054b 100644 --- a/puzzles files/skyscrapers/medium1 +++ b/puzzles files/skyscrapers/4x4 Skyscrapers Easy3 @@ -6,16 +6,16 @@ + - - + - - + + diff --git a/puzzles files/skyscrapers/easy3 b/puzzles files/skyscrapers/5x5 Skyscrapers Easy1 similarity index 83% rename from puzzles files/skyscrapers/easy3 rename to puzzles files/skyscrapers/5x5 Skyscrapers Easy1 index 3bcbd1179..111d2bd87 100644 --- a/puzzles files/skyscrapers/easy3 +++ b/puzzles files/skyscrapers/5x5 Skyscrapers Easy1 @@ -6,20 +6,21 @@ - - - + + + + - - - + + + diff --git a/puzzles files/skyscrapers/5x5 Skyscrapers Easy2 b/puzzles files/skyscrapers/5x5 Skyscrapers Easy2 new file mode 100644 index 000000000..45a1db188 --- /dev/null +++ b/puzzles files/skyscrapers/5x5 Skyscrapers Easy2 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/puzzles files/skyscrapers/5x5 Skyscrapers Easy3 b/puzzles files/skyscrapers/5x5 Skyscrapers Easy3 new file mode 100644 index 000000000..87f7db3d7 --- /dev/null +++ b/puzzles files/skyscrapers/5x5 Skyscrapers Easy3 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/puzzles files/skyscrapers/medium2 b/puzzles files/skyscrapers/5x5 Skyscrapers Medium1 similarity index 83% rename from puzzles files/skyscrapers/medium2 rename to puzzles files/skyscrapers/5x5 Skyscrapers Medium1 index 5493fae5e..9e79c6248 100644 --- a/puzzles files/skyscrapers/medium2 +++ b/puzzles files/skyscrapers/5x5 Skyscrapers Medium1 @@ -6,20 +6,21 @@ - + + - - - - - + + + + + diff --git a/puzzles files/skyscrapers/5x5 Skyscrapers Medium2 b/puzzles files/skyscrapers/5x5 Skyscrapers Medium2 new file mode 100644 index 000000000..fab87f9f7 --- /dev/null +++ b/puzzles files/skyscrapers/5x5 Skyscrapers Medium2 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/puzzles files/skyscrapers/5x5 Skyscrapers Medium3 b/puzzles files/skyscrapers/5x5 Skyscrapers Medium3 new file mode 100644 index 000000000..efd123165 --- /dev/null +++ b/puzzles files/skyscrapers/5x5 Skyscrapers Medium3 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md index cf0db25ac..94ef1e214 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/TODO.md @@ -3,14 +3,12 @@ spreadsheet : https://docs.google.com/spreadsheets/d/1l7aUZtavtysM8dtGnaEIXhBKMRGxekhnLIVoYIHYZi8/edit#gid=0 1. Basic Rules: - - Come up with better names for 1Edge and FixedMax, they are now more general + - Come up with better names for 1Edge and FixedMax, they are now more general 2. Contradiction Rules: 3. Case Rules: - Don't highlight cells when selecting a row/col? - (override draw() in SkyscrapersElementView) 4. Refactoring: - - Remove references to lightup and treetent in variable names - - View contains a few of these - document utility functions in the reference sheet, COMMENTS! - review and identify dead code - remove all these damn print statments (commented ones too if they aren't useful) @@ -19,4 +17,6 @@ spreadsheet : https://docs.google.com/spreadsheets/d/1l7aUZtavtysM8dtGnaEIXhBKMR 5. Flags - edit exporter to include flags in xml file format (if needed) 6. Documentation - - UML diagram(s) \ No newline at end of file + - UML diagram(s) + 7. Merge Skyscrapers to dev + 8. Add 5 more easy/med puzzles to skyscrapers \ No newline at end of file From 84ea07c7acd50c3a1a19859b3f75710784044960 Mon Sep 17 00:00:00 2001 From: ThisMatt Date: Thu, 8 Dec 2022 02:31:37 -0500 Subject: [PATCH 44/45] Attempt to fix checkstyle errs --- .../puzzle/skyscrapers/SkyscrapersBoard.java | 16 ++++++++-------- .../puzzle/skyscrapers/SkyscrapersImporter.java | 4 ++-- .../skyscrapers/rules/CellForNumberCaseRule.java | 5 +++-- .../rules/LastVisibleCellBasicRule.java | 3 ++- .../skyscrapers/rules/NumberForCellCaseRule.java | 2 +- .../PreemptiveVisibilityContradictionRule.java | 6 ++++-- .../rules/UnresolvedCellContradictionRule.java | 2 +- 7 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java index a02908fb4..000cfbc15 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java @@ -67,7 +67,7 @@ public ArrayList getSouthClues() { /** * Returns a list of the western clues ordered from loc.y = 0->max */ - public ArrayList getWestClues() {return westClues;} + public ArrayList getWestClues() { return westClues; } /** * Returns a list of the northern clues ordered from loc.x = 0->max @@ -76,20 +76,20 @@ public ArrayList getNorthClues() { return northClues; } - public boolean getDupeFlag(){return dupeFlag;} - public boolean getViewFlag(){return viewFlag;} - public void setDupeFlag(boolean newFlag){dupeFlag = newFlag ;} - public void setViewFlag(boolean newFlag){viewFlag = newFlag;} + public boolean getDupeFlag(){ return dupeFlag; } + public boolean getViewFlag(){ return viewFlag; } + public void setDupeFlag(boolean newFlag){ dupeFlag = newFlag ; } + public void setViewFlag(boolean newFlag){ viewFlag = newFlag; } - public SkyscrapersClue getmodClue(){return modClue;} - public void setModClue(SkyscrapersClue newClue){modClue = newClue ;} + public SkyscrapersClue getmodClue(){ return modClue; } + public void setModClue(SkyscrapersClue newClue){ modClue = newClue ; } @Override public SkyscrapersCell getCell(int x, int y) { return (SkyscrapersCell) super.getCell(x, y); } - public int getSize() {return this.getWidth(); } + public int getSize() { return this.getWidth(); } @Override public PuzzleElement getPuzzleElement(PuzzleElement element) { diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java index 5e71c29e0..c1c31eec9 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java @@ -137,8 +137,8 @@ public void initializeBoard(Node node) throws InvalidFileFormatException { NodeList flagList = boardElement.getElementsByTagName("flags"); if(flagList.getLength()==1){ Element flags = (Element) flagList.item(0); - if(flags.hasAttribute("dupe")){skyscrapersBoard.setDupeFlag(Boolean.parseBoolean(flags.getAttribute("dupe")));} - if(flags.hasAttribute("view")){skyscrapersBoard.setViewFlag(Boolean.parseBoolean(flags.getAttribute("view")));} + if(flags.hasAttribute("dupe")){ skyscrapersBoard.setDupeFlag(Boolean.parseBoolean(flags.getAttribute("dupe"))); } + if(flags.hasAttribute("view")){ skyscrapersBoard.setViewFlag(Boolean.parseBoolean(flags.getAttribute("view"))); } } puzzle.setCurrentBoard(skyscrapersBoard); diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java index ace3b6c4c..87014cb5f 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java @@ -50,7 +50,8 @@ public CaseBoard getCaseBoard(Board board) { "Pick the number to be added", "Cell For Number", JOptionPane.INFORMATION_MESSAGE, null, possibleValues, possibleValues[0]); - }while(selectedValue==null); + } + while(selectedValue==null); selectedNumber = (Integer)selectedValue; return caseBoard; @@ -80,7 +81,7 @@ public ArrayList getCasesFor(Board board, PuzzleElement puzzleElement, In PreemptiveVisibilityContradictionRule ViewRule = new PreemptiveVisibilityContradictionRule(); passed = passed && ViewRule.checkContradictionAt(newCase,newCell)!=null; } - if(passed){cases.add(newCase);} + if(passed){ cases.add(newCase); } } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastVisibleCellBasicRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastVisibleCellBasicRule.java index 778a6e2c9..d28ed6cbd 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastVisibleCellBasicRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/LastVisibleCellBasicRule.java @@ -109,7 +109,8 @@ public Board getDefaultBoard(TreeNode node) { System.out.println(modBoard.getModifiedData().isEmpty()); if (modBoard.getModifiedData().isEmpty()) { return null; - } else { + } + else { return modBoard; } } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/NumberForCellCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/NumberForCellCaseRule.java index b619522a7..317ed75bc 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/NumberForCellCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/NumberForCellCaseRule.java @@ -69,7 +69,7 @@ public ArrayList getCases(Board board, PuzzleElement puzzleElement) { passed = passed && ViewRule.checkContradictionAt(newCase,newCell)!=null; } //how should unresolved be handled? should it be? - if(passed){cases.add(newCase);} + if(passed){ cases.add(newCase); } } return cases; diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveVisibilityContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveVisibilityContradictionRule.java index 81533ff9c..1d96b3ed6 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveVisibilityContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/PreemptiveVisibilityContradictionRule.java @@ -126,8 +126,9 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { temp.setViewFlag(viewTemp); //add all row cases to row queue - for(Board k : cols) + for(Board k : cols) { colQ.add((SkyscrapersBoard) k); + } } } } @@ -162,8 +163,9 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { } //if every possible permutation results in contradictions return null, else no contradiction - if(rowContradiction || colContradiction) + if(rowContradiction || colContradiction) { return null; + } return super.getNoContradictionMessage(); } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedCellContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedCellContradictionRule.java index 2a4ac72b7..d0400e399 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedCellContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedCellContradictionRule.java @@ -34,7 +34,7 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { NumberForCellCaseRule caseRule = new NumberForCellCaseRule(); ArrayList cases = caseRule.getCases(board,puzzleElement); - if(cases.size()==0){return null;} + if(cases.size()==0){ return null; } return super.getNoContradictionMessage(); } From 3dd7a9f765455abb8f3367e9eda44c3e75bf4852 Mon Sep 17 00:00:00 2001 From: ThisMatt Date: Thu, 8 Dec 2022 02:38:50 -0500 Subject: [PATCH 45/45] Attempt to fix checkstyle errs --- .../puzzle/skyscrapers/SkyscrapersBoard.java | 32 ++++++++++++++----- .../skyscrapers/SkyscrapersImporter.java | 8 +++-- .../rules/CellForNumberCaseRule.java | 4 ++- .../rules/NumberForCellCaseRule.java | 4 ++- .../UnresolvedCellContradictionRule.java | 4 ++- 5 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java index 000cfbc15..c23d2c46f 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersBoard.java @@ -67,7 +67,9 @@ public ArrayList getSouthClues() { /** * Returns a list of the western clues ordered from loc.y = 0->max */ - public ArrayList getWestClues() { return westClues; } + public ArrayList getWestClues() { + return westClues; + } /** * Returns a list of the northern clues ordered from loc.x = 0->max @@ -76,20 +78,34 @@ public ArrayList getNorthClues() { return northClues; } - public boolean getDupeFlag(){ return dupeFlag; } - public boolean getViewFlag(){ return viewFlag; } - public void setDupeFlag(boolean newFlag){ dupeFlag = newFlag ; } - public void setViewFlag(boolean newFlag){ viewFlag = newFlag; } + public boolean getDupeFlag(){ + return dupeFlag; + } + public boolean getViewFlag(){ + return viewFlag; + } + public void setDupeFlag(boolean newFlag){ + dupeFlag = newFlag; + } + public void setViewFlag(boolean newFlag){ + viewFlag = newFlag; + } - public SkyscrapersClue getmodClue(){ return modClue; } - public void setModClue(SkyscrapersClue newClue){ modClue = newClue ; } + public SkyscrapersClue getmodClue(){ + return modClue; + } + public void setModClue(SkyscrapersClue newClue){ + modClue = newClue; + } @Override public SkyscrapersCell getCell(int x, int y) { return (SkyscrapersCell) super.getCell(x, y); } - public int getSize() { return this.getWidth(); } + public int getSize() { + return this.getWidth(); + } @Override public PuzzleElement getPuzzleElement(PuzzleElement element) { diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java index c1c31eec9..c4c909172 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/SkyscrapersImporter.java @@ -137,8 +137,12 @@ public void initializeBoard(Node node) throws InvalidFileFormatException { NodeList flagList = boardElement.getElementsByTagName("flags"); if(flagList.getLength()==1){ Element flags = (Element) flagList.item(0); - if(flags.hasAttribute("dupe")){ skyscrapersBoard.setDupeFlag(Boolean.parseBoolean(flags.getAttribute("dupe"))); } - if(flags.hasAttribute("view")){ skyscrapersBoard.setViewFlag(Boolean.parseBoolean(flags.getAttribute("view"))); } + if(flags.hasAttribute("dupe")){ + skyscrapersBoard.setDupeFlag(Boolean.parseBoolean(flags.getAttribute("dupe"))); + } + if(flags.hasAttribute("view")){ + skyscrapersBoard.setViewFlag(Boolean.parseBoolean(flags.getAttribute("view"))); + } } puzzle.setCurrentBoard(skyscrapersBoard); diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java index 87014cb5f..01a1557b0 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/CellForNumberCaseRule.java @@ -81,7 +81,9 @@ public ArrayList getCasesFor(Board board, PuzzleElement puzzleElement, In PreemptiveVisibilityContradictionRule ViewRule = new PreemptiveVisibilityContradictionRule(); passed = passed && ViewRule.checkContradictionAt(newCase,newCell)!=null; } - if(passed){ cases.add(newCase); } + if(passed){ + cases.add(newCase); + } } diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/NumberForCellCaseRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/NumberForCellCaseRule.java index 317ed75bc..abf6a10b0 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/NumberForCellCaseRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/NumberForCellCaseRule.java @@ -69,7 +69,9 @@ public ArrayList getCases(Board board, PuzzleElement puzzleElement) { passed = passed && ViewRule.checkContradictionAt(newCase,newCell)!=null; } //how should unresolved be handled? should it be? - if(passed){ cases.add(newCase); } + if(passed){ + cases.add(newCase); + } } return cases; diff --git a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedCellContradictionRule.java b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedCellContradictionRule.java index d0400e399..c3abefd4d 100644 --- a/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedCellContradictionRule.java +++ b/src/main/java/edu/rpi/legup/puzzle/skyscrapers/rules/UnresolvedCellContradictionRule.java @@ -34,7 +34,9 @@ public String checkContradictionAt(Board board, PuzzleElement puzzleElement) { NumberForCellCaseRule caseRule = new NumberForCellCaseRule(); ArrayList cases = caseRule.getCases(board,puzzleElement); - if(cases.size()==0){ return null; } + if(cases.size()==0){ + return null; + } return super.getNoContradictionMessage(); }