{"group":{"id":1,"name":"Community","lockable":false,"created_at":"2012-01-18T18:02:15.000Z","updated_at":"2026-04-06T14:01:22.000Z","description":"Problems submitted by members of the MATLAB Central community.","is_default":true,"created_by":161519,"badge_id":null,"featured":false,"trending":false,"solution_count_in_trending_period":0,"trending_last_calculated":"2026-04-06T00:00:00.000Z","image_id":null,"published":true,"community_created":false,"status_id":2,"is_default_group_for_player":false,"deleted_by":null,"deleted_at":null,"restored_by":null,"restored_at":null,"description_opc":null,"description_html":null,"published_at":null},"problems":[{"id":43125,"title":"cross in array","description":"Make a cross from \"1\" in odd size array. Other value from array should be equal to \"0\";\r\nAs input you get length of side of array;\r\nx=3;\r\n\r\n  y=[ 0 1 0; \r\n      1 1 1;\r\n      0 1 0];\r\n\r\nplease pay attention input will be always odd nubmer greater than 1;\r\n","description_html":"\u003cp\u003eMake a cross from \"1\" in odd size array. Other value from array should be equal to \"0\";\r\nAs input you get length of side of array;\r\nx=3;\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003ey=[ 0 1 0; \r\n    1 1 1;\r\n    0 1 0];\r\n\u003c/pre\u003e\u003cp\u003eplease pay attention input will be always odd nubmer greater than 1;\u003c/p\u003e","function_template":"function y = drawCross(x)\r\n  y = x;\r\nend","test_suite":"%%\r\nx = 3;\r\ny_correct = [0 1 0;\r\n             1 1 1;\r\n             0 1 0 ];  \r\nassert(isequal(drawCross(x),y_correct))\r\n\r\n%%\r\nx = 5;\r\ny_correct = [0 0 1 0 0;\r\n             0 0 1 0 0;\r\n             1 1 1 1 1;\r\n             0 0 1 0 0;\r\n             0 0 1 0 0]\r\nassert(isequal(drawCross(x),y_correct))\r\n","published":true,"deleted":false,"likes_count":27,"comments_count":2,"created_by":90955,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":191,"test_suite_updated_at":"2016-10-23T02:50:44.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2016-10-06T13:47:17.000Z","updated_at":"2026-02-18T10:04:02.000Z","published_at":"2016-10-06T13:47:17.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eMake a cross from \\\"1\\\" in odd size array. Other value from array should be equal to \\\"0\\\"; As input you get length of side of array; x=3;\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[y=[ 0 1 0; \\n    1 1 1;\\n    0 1 0];]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eplease pay attention input will be always odd nubmer greater than 1;\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":42762,"title":"Is 3D point set Co-Planar?","description":"This Challenge is to determine if four 3D integer points are co-planar.\r\nGiven a 4x3 matrix representing four x,y,z integer points, output True if the set is co-planar and False otherwise.\r\n\r\nExamples\r\n\r\n m = [0 0 0;1 0 0;0 1 0;0 0 1] \r\n Output: False, this point set is non-coplanar.\r\n\r\n m = [0 0 0;0 0 1;1 1 0;1 1 1]\r\n Output: True, this point set is co-planar.\r\n\r\nReference: The \u003chttp://68.173.157.131/Contest/Tetrahedra March 2016 Al Zimmermann Non-Coplanar contest\u003e is to maximize the number of points in an NxNxN cube with no 4 points in a common plane. Future challenge will be to find N=2 and N=3 solutions.\r\n\r\nTheory: Plane is defined as Ax+By+cZ=D. [A,B,C] can be found using cross of 3 points. D can be found by substitution using any of these 3 points. Co-Planarity of the fourth point is True if Ax4+By4+Cz4==D\r\n","description_html":"\u003cp\u003eThis Challenge is to determine if four 3D integer points are co-planar.\r\nGiven a 4x3 matrix representing four x,y,z integer points, output True if the set is co-planar and False otherwise.\u003c/p\u003e\u003cp\u003eExamples\u003c/p\u003e\u003cpre\u003e m = [0 0 0;1 0 0;0 1 0;0 0 1] \r\n Output: False, this point set is non-coplanar.\u003c/pre\u003e\u003cpre\u003e m = [0 0 0;0 0 1;1 1 0;1 1 1]\r\n Output: True, this point set is co-planar.\u003c/pre\u003e\u003cp\u003eReference: The \u003ca href = \"http://68.173.157.131/Contest/Tetrahedra\"\u003eMarch 2016 Al Zimmermann Non-Coplanar contest\u003c/a\u003e is to maximize the number of points in an NxNxN cube with no 4 points in a common plane. Future challenge will be to find N=2 and N=3 solutions.\u003c/p\u003e\u003cp\u003eTheory: Plane is defined as Ax+By+cZ=D. [A,B,C] can be found using cross of 3 points. D can be found by substitution using any of these 3 points. Co-Planarity of the fourth point is True if Ax4+By4+Cz4==D\u003c/p\u003e","function_template":"function TF = iscoplanar(m)\r\n% m is a 4x3 matrix\r\n  TF=false;\r\nend","test_suite":"%%\r\nm=[0 0 1;1 1 0;1 0 1;2 0 0];\r\ny_correct = false;\r\nassert(isequal(iscoplanar(m),y_correct))\r\n%%\r\nm=[0 0 1;1 1 0;1 0 1;2 1 2];\r\ny_correct = false;\r\nassert(isequal(iscoplanar(m),y_correct))\r\n%%\r\nm=[0 0 1;1 1 0;1 0 1;0 1 0];\r\ny_correct = true;\r\nassert(isequal(iscoplanar(m),y_correct))\r\n%%\r\nm=[0 0 1;1 1 0;1 0 1;2 1 0];\r\ny_correct = true;\r\nassert(isequal(iscoplanar(m),y_correct))\r\n%%\r\nm=[0 0 1;1 1 0;1 0 1;2 0 1];\r\ny_correct = true;\r\nassert(isequal(iscoplanar(m),y_correct))\r\n%%\r\nm=[2 0 0;1 2 0;2 1 1;2 2 2];\r\ny_correct = true;\r\nassert(isequal(iscoplanar(m),y_correct))\r\n%%\r\nm=[2 0 0;1 2 0;2 1 1;2 1 2];\r\ny_correct = false;\r\nassert(isequal(iscoplanar(m),y_correct))\r\n%%\r\nm=[0 0 0;1 0 0;0 1 0;0 0 1];\r\ny_correct = false;\r\nassert(isequal(iscoplanar(m),y_correct))\r\n%%\r\nm=[0 0 0;1 0 0;0 1 0;1 1 1];\r\ny_correct = false;\r\nassert(isequal(iscoplanar(m),y_correct))\r\n%%\r\nm=[0 0 0;1 0 0;0 1 0;1 1 0];\r\ny_correct = true;\r\nassert(isequal(iscoplanar(m),y_correct))\r\n%%\r\nm=[0 0 0;0 0 1;1 1 1;1 1 0];\r\ny_correct = true;\r\nassert(isequal(iscoplanar(m),y_correct))\r\n\r\n%0 0 0 \r\n%1 0 0 \r\n%0 1 0 \r\n%0 0 1 \r\n%1 1 1","published":true,"deleted":false,"likes_count":1,"comments_count":0,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":26,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2016-03-05T21:58:07.000Z","updated_at":"2026-04-04T03:46:57.000Z","published_at":"2016-03-06T19:31:31.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis Challenge is to determine if four 3D integer points are co-planar. Given a 4x3 matrix representing four x,y,z integer points, output True if the set is co-planar and False otherwise.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eExamples\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ m = [0 0 0;1 0 0;0 1 0;0 0 1] \\n Output: False, this point set is non-coplanar.\\n\\n m = [0 0 0;0 0 1;1 1 0;1 1 1]\\n Output: True, this point set is co-planar.]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eReference: The\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://68.173.157.131/Contest/Tetrahedra\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eMarch 2016 Al Zimmermann Non-Coplanar contest\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e is to maximize the number of points in an NxNxN cube with no 4 points in a common plane. Future challenge will be to find N=2 and N=3 solutions.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eTheory: Plane is defined as Ax+By+cZ=D. [A,B,C] can be found using cross of 3 points. D can be found by substitution using any of these 3 points. Co-Planarity of the fourth point is True if Ax4+By4+Cz4==D\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":52328,"title":"ICFP2021 Hole-In-Wall: Figure Validation with Segment Crossing Check","description":"The ICFP held its annual 3-day contest in July 2021 with Hole-In-Wall. Contest Specification.\r\nThe contest folds the figure in Red to fit within the hole shown in light grey \r\nThis Challenge is to evaluate the complete Figure validation defined in the Specification when given the hole vertices in hxy, original figure vertices in pxy, updated figure vertices in npxy, segment matrix mseg, and epsilon. The hxy matrix is [N+1,2] where N is number of hole vertices. A repeat of the first vertex occurs for drawing the hole.  The pxy(original) and npxy(final) matrices are [P,2] where P is the number of figure vertices. The mseg indicates connected vertices that must maintain a length as a function of epsilon from the original length. The final figure vertices must be integer thus the allowed fuzziness of segment lengths.\r\nValid is 1) all npxy vertices must be on or inside the hole, hxy 2) all npxy segments must match the pxy segments within an allowed epsilon, abs(Lsqr(npxy,seg(i,:))/Lsqr(pxy,seg(i,:))-1)\u003c= epsilon/1000000.  Lsqr is length squared 3) No figure segments may cross hole segments. Segment vertices may touch segments. No part of any Red segment should be outside the hole shown in light grey.  \r\nValid=check_figureS(hxy, pxy, mseg, epsilon, npxy)  \r\nCrossing Segments appears in Cody 1720 but the test set is not strong. A 7/18/21 solution of size 117 is robust and fast. See the function template for reference material to solve intersecting segments.\r\nThe ICFP 2021 Hole In Wall contest site has enabled a public user login to allow submissions. A login must be created to access all the problems and to submit solutions. Solutions are simple text files. Other challenges will show reading files, drawing figures, and producing submission files. To fully access the ICFP/Problems site use Register Team. Anyone can select Problems Page and then click problem numbers to see the puzzles and to download problem files.","description_html":"\u003cdiv style = \"text-align: start; line-height: 20.4333px; min-height: 0px; white-space: normal; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, monospace; font-style: normal; font-size: 14px; font-weight: 400; text-decoration: rgb(0, 0, 0); white-space: normal; \"\u003e\u003cdiv style=\"block-size: 669px; display: block; min-width: 0px; padding-block-start: 0px; padding-top: 0px; perspective-origin: 407px 334.5px; transform-origin: 407px 334.5px; vertical-align: baseline; \"\u003e\u003cdiv style=\"block-size: 21px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 10.5px; text-align: left; transform-origin: 384px 10.5px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 14px 7.91667px; transform-origin: 14px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://www.icfpconference.org/\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eICFP\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 146.65px 7.91667px; transform-origin: 146.65px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e held its annual 3-day contest in July 2021 with \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://icfpcontest2021.github.io/\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eHole-In-Wall\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 29.95px 7.91667px; transform-origin: 29.95px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e. Contest \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://icfpcontest2021.github.io/spec-v4.1.pdf\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eSpecification\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 1.95px 7.91667px; transform-origin: 1.95px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 237px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 118.5px; text-align: left; transform-origin: 384px 118.5px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 230.267px 7.91667px; transform-origin: 230.267px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe contest folds the figure in Red to fit within the hole shown in light grey \u003c/span\u003e\u003c/span\u003e\u003cimg class=\"imageNode\" style=\"vertical-align: middle;width: 238px;height: 237px\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdsAAAHaCAYAAABIJuORAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAFuKSURBVHhe7d13mB1V/QbwCCIgRUT0J0gVpVpAQJAuoFgBFQUVCwJK74IopGd777333nvvvSXZJJsCJJts+m56z/d3Z5Z7997d7/Y7c8/MvH98noewc/dOOXPePWXmLHBe8REBAACAchC2AAAACkPYAgAAKAxhCwAAoDCELQAAgMIQtgAAAApD2AIAACgMYQsAAKAwhC0AAIDCELYAAAAKQ9iCZnm6LaOyogxqa64AA6gozSYvj+VsWQAQHcIWNMfLfRllZ8RRT0ctfbqxFwykr6uecrMSyMdzBVs2AESFsAVNSYwLo6b6ErYiBuNobSyj5IQItowAiAhhC5oQEepLlWU5tGmgi618wXg+2dBD1RV5FBXuz5YZAJEgbEFo/j4uVJCbTKt7m9gKF2DNyhYqyk+lQD83tgwBiABhC0JydV5M6SlR1NFSyVawAON1tVVTZloMebguZcsUgCMhbEE4sVFBVFddyFaoANNpqC2m+JgQtmwBOArCFoQREuhJpUUZNNDfzlaiADO1YW0nlZdkUViwN1vWANSGsAWH8/ZYQTmZ8dTbWcdWnABztbK7gfKyE8nXy4ktewBqQdiCQyUnhFNLQylbUQLYS1tTOaUmRZLLioVsOQRQGsIWHCIyzI+qynPp4/U9bOUIoISaynyKjghgyySAkhC2oKoAX1cqzEuh/r5mtjIEUNraVa1UXJBGQf7ubBkFUALCFlTh7rKEMlJjqLO1iq0AAdTW3V5DWemx8ju2uTILYE8IW1BcfEwwNdQUsRUegKM11ZVQYlwoW3YB7AVhC4oJDfKisuJMWr+mg63kAESxcaBLXlUoPNSHLcsA84WwBbvz8XSSV2aRVmjhKjYAUa3qaaT8nCTy83ZhyzbAXCFswa5SEiOotbGcrcgAtKK9uYLSkqPI1WkRW84BZgthC3YRFeFPNRV5bMUFoFV1VQUUGxXIlnmA2UDYwrwE+rvLK66sWdXCVlYAWreuv41KCtMpONCDvQcAZgJhC3MiraySmRYrr7TCVVAAetPTUUvZGfHk5b6cvScApoKwhVlLiA2hxtpitkIC0Lvm+lJKig9j7w2AySBsYcbCQrypoiSLNq7rZCshAKP4eH03VZXlUESYL3uvAIyHsIVp+Xo7U152Eq3saWArHgCjWt3XRAW5yeTv68reOwBmCFuYlLRCirRSSltTBVvRAMCojpYqSk+JJjfnxey9BICwBVZMZADVVuazFQsA8OqrCykuOoi9p8DYELZgIyjAQ14RZe3qVrYyAYCprV/TTqVFGRQS5MXeY2BMCFuQebovo6z0OOruqGErEACYnd6uOsrJTCBvzxXsPQfGgrAFecUTaeUTrsIAgPlpaSij5IRw9t4D40DYGlhEqC9VlmbTpoEutpIAAPv4ZEMPVZfnUlS4H3svgv4hbA3Iz8eF8nOSaVVvI1sxAIAy+lc2U2FeKgX4ubH3JugXwtZAXJ0XySuZtLdUshUBAKijs62aMlJjyN11CXuvgv4gbA1CWrlEWsGEu/EBwDEaaoooPiaYvWdBXxC2OhcS6Emlhek00N/G3uwA4Fgb1nZQeXEmhQV7s/cw6APCVqe8PJbLK5T0dNaxNzgAiKWvu55ysxLJx8uJvadB2xC2OiStSNLcUMre0AAgttamckpJjGDvbdAuhK2ORIb5ySuRSCuScDcxAGhHTUUeRUcEsPc6aA/CVgekFUcKc1Oov6+JvWkBQJvWrmqh4vw0CvJ3Z+990A6ErYa5uSyWVxrpaK1ib1QA0Ieu9hrKTIslD7elbF0A4kPYapS0skh9TSF7YwKAPjXWFVNCbAhbJ4DYELYaExrkRWXFmfLKItzNCAD6tnFdJ1WUZFF4iA9bR4CYELYaIa0ckpuZQH1d9ewNCADGsqqnkfKzk8jP25mtM0AsCFsNkFYMaWksY284ADC2tuYKSk2KJBenRWz9AWJA2AosKtyfqity5RVDuJsMAMCstiqfYiID2boEHA9hK6BAPzcqyk+lNStb2JsKAICzbnUrlRSmU3CAB1u3gOMgbAUirQAirQTS1VbN3kgAADPR01FLWelx5Om+jK1rQH0IW0HEx4RQQ20Re+MAAMxFU30JJcaFsnUOqAth62DSSh/lJVnyyh/czQIAMB+bBrqosiyHIkJ92ToI1IGwdRBfLyfKy06kld0N7A0CAGBPq3ubqCA3mfx9XNg6CZSFsFXdQnlFD2llD+6GAABQUntLJaUlR5Gr82KmfgKlIGxVJK3gUVOZz94AAABqqqsuoNioILauAvtD2KpAWrGjuCCN1q5qZQs9AIAjDPS3UWlRBoUEerJ1F9gPwlZBnm7LKCs9lrrba9iCDgAggt7OOsrJjCdvjxVsXQbzh7BVSEJsqLxCB1ewAQBE1NxQSknx4WydBvODsLUzaSWOitJseWUOrjADAIjs4/XdVFWeS5FhfmwdB3ODsLUTaeWN/JwkeSUOrgADAGhJf18zFealUICvK1vnwewgbOfJ1WmRPI2+vbmCLbAAAFrW2VpFGanR5O6yhK0DYWYQtvMgrbBRW1XAFlAAAD2prymiuOhgti6E6SFs50BaUUNaWWPd6ja2UAIA6NH6NR1UVpxJoUFebN0Ik0PYzoKX+3LKzoiTV9TgCiIAgBH0ddVTblYC+Xg6sXUlTISwnaGk+DBqri9hCx4AgBG1NpbJr5/l6kywhbCdRkSYr7xixqaBbrawAQAY2Scbeqi6Io+iIvzZOhRGIWynkJoUKS9PxRUwAAAYI9WV0luouLoUELaTktZ+lJak4goVAABMtG51K8VEBrB1qtEhbCchdR1zhQkAACZXW5lPLisWsvWqkSFsGYnxYRijBQCYI2kIjqtbjQxhO470eA9mHQMAzF1bUwX5ejuzdaxRIWzHkZ6j5QoPAADMXF52ElvHGhXC1or0Zii8sAIAYP5W9jTIq6Bxda0RIWytSK9g5AoNAADMXkVJFlvXGhHC9jPSogJ41zEAgP1I63onxIawda7RIGxNXJwWYfUeAAAFNNYWk4frUrbuNRKErYk0TZ0rJAAAMH+ZabFs3Wskhg9bP29nLPwOAKCgrrZqCvR3Z+tgozB82ObnJLGFAwAA7KcoP5Wtg43C0GErTUtf1dPIFgwAALCfNataKNrAKwMZOmwrSrPZQgEAAPZXU5HH1sVGYNiwTYgNlaelcwUCAACUYdTF5g0Zth5uS6mxrpgtCAAAoJzWxnLy8XRi62Y9M2TYZqXFsoUAAACUl5uVyNbNema4sA3yd6fu9hq2AAAAgPL6uuopNNiLraP1ynBhW1yQxl58ANENtlTS/uf+QnTGGbL9zzxFW2sxHALaVFacydbRemWosI2OCKC1q1rZCw8gqiHTH4gHH/8l0ZlnEi1YYMv0/w79/Ce0PTOe/SyAqNav7aD4mGC2rtYjA4XtQqqpzGMvOoCIdob40JE7b58QrocffoAOPfoInT77bJufHb3le7QrwIM+Hehifx+AaBpqisjdZQlTX+uPYcJWmm7OXWwAkWytKqC9/3uXjo4L2ePXf5tGXvknDWWPvfFMavGOvPkSHfvOjTbbHv3BLTT83pu0rSzH5ncDiCgjNYats/XGEGHr6+VErU3l7IUGEMFQZgLte+l5Ov7ta22C88hdd9DeD/9NW00tAO5zksGGMtq7+AM6ct+PbD57/JqraN8Lf6ftpsqM+xyACDpbqyjA142tu/XEEGGbl5XIXmQAR9sZEUAHnv4dnbzkK5aQPH3WWfI47G7PFbSlt4n9HGfz6jba5etKB3/9czp97rmW33fqoi/RwScfl7ulP93Qw34WwJEK81LYultPdB+2YcHetLK7gb3AAI6wxVQed7svo0OPPmwz6enk175KB/70e9oZFch+bjZ2xIXS/r/+kU5cdqnl90uk8d49zotoCx5/A4H09zVTZLgfW4frhe7Dtrwki724AGrbWpVPe//7Dh394W02ATg6HvsCDWXbvwdmKD+VRt54iY7dPH5c9/s0/N4btA3vBwdBVJXnsnW4Xug6bKVp5RvWdrAXFkAt2zPiad9Lz00xHlvIfs6eBhtKR8d177Ud1z1x9VW07/m/0faUaPZzAGr5ZEMPJSeEs3W5Hug2bN1dl1BD7eSTSgCUtjPcnw48JY3HXmwJt9Nnfd5qPFb95R03r26Vx3UPjR/X/dKFdPB3j9POYG/6dH03+1kApbU0lJG3xwq2Ttc63YatNJ2cu5gAStrSVU+73ZbRoZ8+NPqmp8/CzJ7jsfYy6bjuQ/fTHqdFNNhWzX4OQEk5mfFsna51ugzbQD836kRFASraWplPwx+8TUfv+IFNcEnjsfsUGo+1l0nHdW/9Hg3/+3WM64KqejvrKCTQk63btUyXYVuUl8peRAB7254RR/te/Acd/9Y3bYLKMh5brfx4rL1MPq57Je17/q+0PTmK/RyAvZUWZbB1u5bpLmyjwv1pzcpm9gIC2MvOcD868NRv6eRXrMZjP/95OvSzR2i3xwra0qP+eKy92I7rnmM5vlMXXkgHf/sY7QrywishQVED/e0UGx3E1vFapbuwra7IZS8ewHxt6ayj3a5L6fBPpPHYz1lC6ORXL6EDf3ySdkaKMx5rL6Pjuk/Tycu+bjleyeEf3097ViykwdYq9nMA81VfXUhuzovZel6LdBW20rRxafo4d+EA5mprRR4N/+dtOnr7rTaBc/y6b9G+l1+gIQO8oWwoTxrXfZGO3XyDzTk4est3afjd12kbnmcHBaSnRLN1vRbpJmy9PVdQS2MZe8EA5mJ7ehzt+9ezdPzaa2wD5s7b5cUCtDQeay+D9aW0d9F/6Mg9d9mckxNXXSGvtYtxXbCnjpZK8vdxYet8rdFN2OZkJrAXC2C2dob50oE//IZOXfxlS5iMjccu1/R4rL1sXtVKu0yV4KFf/YxOn2M9rnsBHfztr2lXkCd9ug7jujB/BbnJbJ2vNboI29AgL+rrqmcvFMBMbOmopd2uS+jwT35M9DluPDaA/Rz00o7YENr/l6fp5KXjxnUfvI/2LP+IBk2tE+5zADOxureJIkJ92bpfS3QRtmVFmexFApjOtvJcGn7/LTp6Gzce+zwNZaHHZKaG8lJo5PUX6dhNtuO6x77/XRp+5zXaVoz7FOamsiyHrfu1RPNhGxcdROvXtLMXCGAy29Niad8/n6Xj37zaJhjGxmML2M/B9LbWl/DjuldeTvv/8RfanhTJfg5gMpsGuikpPozNAK3QdNi6uSymehVe4g76sTPUlw78/gk69eWLLCFgOx6L5RjtZfOqFn5c94Lz6eBvfkW7Aj1p87pO9rMA4zWb/ojzcl/OZoEWaDpspWnh3EUBsCaNx+4x/WF2+JEHLRW+5ORXv4LxWJVMPq57L+1Z/iENNmNcF6aXnRHHZoEWaDZs/X1dqQMP1MMUtpXn0PD7b9LR226xqeAxHus4Y+O619tck2Pf/w4Nv/0qbSvKYD8HIOkx/eEcHODBZoLoNBu2Bbkp7MUA2J4aQ/te+PvE8dgf3k57//suba3CeKyjTTque8XltP/ZZ2hHYgT7OYCSwnQ2E0SnybCNDPOj/r4m9kKAQW3ooZ0hPnTwySfo1EVj47F05pl06NGHabf7ctrSjfFY0diO655tuW6nzj+PDj7xK9plasVsXtvBfhaMad3qNoqJDGSzQWSaDNuqshz2IoDxbGmvoT3Oi+nwww+MBazJyUu+Qgee/h3tjMB4rFZYxnW//n821/LwA/fQnmXSuG4F+zkwntqqAnJxWsTmg6g0F7bS9O+P13ezFwCMY5vpD67h996goz/4vk3FfPzb19K+l56jIbxRTLOGclNo5LV/0bEbx43rfu9mGnn7FYzrgiwtOZLNCFFpKmy9PJZTc0Mpe+LBGLanRtO+F/5GJ665yqYiPvrD22jvf9/BeKyObK0rob0L36cjd99pc61PXP4N2v/3P9OOhHD2c2AM7c0V5OftzGaFiDQVttkZ8exJB51b3007g73p4JOP06mLvjRW8VrGY5dhPFbHNq9sod2mSvXQLx+l02dbjeuedx4dfPyXtMvfnTbjxTaGlJ+TxGaFiDQTtsGBntTTWceecNCnwbZq2uO0iA4/NNl4rD/7OdCvHTHBtP+ZpyaM6x65/x7as/R/NNhUzn4O9GlVTyOFh/iwmSEazYRtaWE6e7JBf7aVZtPwv9+go7fy47HbM9HDYXRDucn8uO53b6KRt16hbagvDKPCVF9wmSEaTYRtbFQgDfS3sSca9GN7SjTte/6vdOLqK20q0LHx2Hz2c2BcW+uKJxnXvQzjugaxcV0nJcSGstkhEuHD1tV5EdVh0ot+re+mXcFedPB3j9GpL104VmHajMdi+USY2uaVzey47unzvkgHH/sF7fJzo839GNfVq0bTH12ebsvYDBGF8GGblhzFnlzQtsHWKtqzYiEdfuj+sYA1OXnJxRiPhXmRxnUPcOO6991Ne5b8lwYby9jPgbZlpceyGSIKocPWz8eF2rHwtK5sK8mi4Xdfp6O3fM+mIjz+rW/Svhefo+2YcQ52Mum47nduopE3X6ahgjT2c6BN3e01FOTvzmaJCIQO2/ycZPakgvZsT46i/c/9lU5cdYVNxXf0jtto+IN3aGslxmNBGWPjuj+0KXsnvnEZ7f/bn2hHfBj7OdCeYtMfUFyWiEDYsI0I9aFVvY3sCQWNGOiiXUFedPC3j9GpCy8Yq+jOOIMO/fRh2u22jLZ0YTwW1GE7rvsFS3k8/cVz6eBjP/9sXBcTMbVs7apWio4IYDPF0YQN28rSbPZkgvhGx2M/osM/vm8sYE1OfuViOvDUb2lnOMZjwbF2RJvHdb9mU0aP3Pcj2rv4AxpswLiuVtVU5psyZOGETHE0IcM2MS6UNplaRdyJBHFtK86k4Xdfo2O3fNemAhsdj/0HxmNBOEM5yTTy6j/p+A3X2ZTZYzffSCNvvERD+ans50BsKYkRbLY4knBh6+m+jJrqStgTCGLanhRJ+//xFzpx5fjx2B/Q8AdvYzwWhLe1tpj2fvQeHfnRuHHdyy6l/X/9I+0wNQC4z4GYWpvKydfLic0YRxEubLPS49iTB2LZvK6TdgV60sHf/JpOXWA7Hnv4pw/RbrelGI8Fzdnc10y7TZX0oV/8lE5/wWpc99xz6dCvf067fF1p8+pW9rMglrysRDZjHEWosA0K8KDujhr2xIEYBlsqac/yj+jwg5ONx/qxnwPQmh3RQXTgz3+gk/83blz3XvO4LlYgE9nK7gYKC/Zms8YRhApbado2d9LA8eTx2HdepWPf/45NxTM2HoseCdCnoZykScZ1b6CRN16koTyM64qqvCSLzRpHECZsYyIDaC26Z4SzIzGC9v/jGTpx5eU2Fc3YeGwe+zkAvdlaW8SO65689Ou0/y9P047YEPZz4Dgb1nZQfEwImzlqEyJsXVYspFpMohHGZlMB3RXgQQef+BWduuD8sYrFZjwWyx2CMW3pa+LHdc85hw796me0y8eFNq9qYT8L6msw/ZHk7rqEzR41CRG2qUmR7EkCdQ02V9CeZR/S4QfuHQtYE8t4bBjGYwGsTTque89dtHfRf2hrPZ6sEEFGagybPWpyeNj6ejtTW1MFe4JAHduKMmjk7Vfp2PfGjcdeew3t+9c/aDtmiANMadJx3ZtuoJHXpXHdFPZzoI6utmoK9HNjM0gtDg/bvOxE9uSA8qQXsUtjTdZLkkmk9xfv/fA9+fV23OcAgCe97lHqHZL+ULW+p6R77MAffktDWajvHKUoL5XNILU4NGzDQrzl6dnciQFl7f3fv20qA8nR22+lnSE+8juNuc8AwMxJryWVupPH32f7Xvgbuz0oa83KFooyXRMui9Tg0LCVpmVzJwWUd/yaqyw3/8lLvkJDmQnsdgAwP1IP0slLx9bWPfm1r7LbgfKqK3Ll7HFxeo+8PJ4gP7/vUmDAFRQcfJEsMPByCvC7nrw8f0Guzm9OyKz5cFjYJsSG0MZ1newJAWXt8ne33Phm0tgsty0AzI/0juXx95u04hW3LShr66c5lJ/3C1OwXkihoQumFBLyBfLzvZ3cXZ9lM2y2HBK2Hq5LqbG2mD0ZoDzpkQXphj9xzdWWN0GdPuss+a043PYAMDd7nBdbHp+T3jxlnkAlrYiFx4PUtX0wnk6e+D/asmUBxcfzAcuRQldqBXNZNhsOCdvMtFj2ZIDyrFu18qom2Ul09PYfyP+WXlyxM9SH/RwAzM6OmGA6/u1r5Xvr2Hdvou3JUTT8n7cs9x9at+rZtcOVTp8+m0wnXtbSwgfrVHy872PzbKZUD9tAP3d5GjZ3QkB55latVAls+2zMfFewF524/DL5/x/94W00lIvHFADmY1tpNh25/x75npLmREiL1kv/f2tdseURO7Ru1bF7hzOdPHmJJWgle/cuoMxMPlSn4u31CJtrM6F62BZhfUiHGd+qtf7Z3oXvE515pvyzg4//kgbxBxHAnEhvmJJeAmO+14bfe9Pm52jdqmfwk0o6dfIim6A1W7mSD9QphZxB7q5/Z7NtOqqGbVSEvzz9mjspoDybVq3pL+/xP9/3wt/ln0ukxQXG/xwApmc9IUpaC3fzWtuJoGjdqmf/yJ/YoJUcPbqASkqYQJ2GNFvZZcV/2IybiqphW12Bl9Y7ylStWjNp+TxpzU5pm9NfwIQpgNna47LEMiHq8E8eoq01Rex2w/9523I/onWrjK2bC4hOn8kGrdnGjQsoMpIP1al4uP+BzbipqBa2KYkR7AkBdUzXqjWznTB1Be0M9WW3AwBb0qo/x6/7lnzvmCdEcdtJ5NbtZ8tVonWrjOE9r7MBO15dHR+oU/HzvYXNuamoErY+nk7U2ljOnhBQ3kxatdZsJkzdeTve6wowjW1l2XTkgYkToqaC1q2yjh65lQ3X8bZvX0DJyXyoTiYk5BxTtn04IeumokrY5mbh7USONNNWrTWbCVNP/JK2tNew2wEY3ea+Zjrw1O/ke0UyfkLUZNC6VdbJk19lw5XT2cmH6lTcXF5i824yiodtaJAX9XXVsycDlDfbVq012wlTz7HbABjdyJsvW+4TbkLUVNC6VcbgJ9WmED1jQqhOZv/+BZSXx4fqZDzc/spm3mQUD9uy4kz2ZIA6LK3a674141atme2EqS/QniX/ZbcDMKrdrkvo1IUXyPfIVBOiJrO1rgStWwUMflrGhupU1qzhQ3Uy7iKFbVxMMK1f08GeDFDefFq1ZqMTpm6Vf4e09B4WkAcYtSM2lI5fP7MJUVMZ/gCtW3vb/HEznT59Lhuqkzl1agFVVPDBynF3/Qebe5NRLGzdXZZQwyz/ygP7mk+r1pr1hKkjd91BQ3gxCRjctrIcOvzAvfI9MdMJUZNB61YZ0nuQpRCdjc2bF1BsLB+u47k6vcVm32QUC9uM1Bj2BIA67NGqtWY7YepXmDAFhrV5ZTMdeHr2E6Kmgtat/R3Y/wQbqNNpbubD1VpgwJVs7k1FkbAN8HWlztYq9gSAOuzVqrVmM2HqJUyYAmMaeWvuE6Img9at/e3ZuZgN0+ns3r2AMjL4kDXz9b6Hzb6pKBK2hXgu06FsWrVvvsxuMxc2E6bO/gLtWfo/djsAvdrtupROXXihfA/MZULUVNC6ta+tm/Pp2FHTHzBMoE6nt5cPWUlw8Hnk4fYMm31TsXvYRob5UX9fM3vwoA4lWrVmNhOmrr6SdoZjwhQYw444aULUt+WyP58JUZPZWi+1br8r/360bu1j7+5/s2E6nSNHFlBRER+2vj53stk3HbuHbVV5LnvQoA6lWrXWMGEKjGabqV47/KB9JkRNBa1bO9vUZQrO29lAnc6GDQsoPNw2aIODLyIXp3fZ7JuOXcM2OSGcPl7fwx80qELJVq01mwlTv/k1bemoZbcD0DqphXngj0/KZV1ijwlRk0Hr1v6GBpPp6JHb2ECdTm2tVdAGfZk83J9is28m7Ba23h4rqKWhlD1YUIcarVprNhOmXn6e3QZA60beesVSzu01IWoqaN3a3/atkXT40INsoE5l27YFlJQkzT6+nDzdn2Szb6bsFrY5mfHsQYJ6bFq1Zcq1as1sJ0ydjQlToDu73ZbSqS9ZT4gqZLezJ7RulSG96GL/vqenXXZvvIb622f9TC3HLmEbEuhJvZ117AGCOtRu1ZrZTpi6inaG+7PbAWjNjvgwOn7DdXLZVmJC1FSGP3jHcj+jdWtf27Zk0qEDP6PTp77IhqvMFMhHDt9FO7aF0qreRooI9WGzbzbsEralRRnsQYF6bFu1Oew2SrGZMPWjH9JQQRq7HYBWyBOiTK1KqUwrOSFqMnLr9ha0bpW0eVObHKZ7di6ikb0vyvbs+pB2bveRW8HW21aWZrPZNxvzDtvYqCAa6G+32TFQl6NatdZsJkz9FhOmQLs2r2pVbULUVNC6FcemgS5KjAtlM3Cm5hW2rs6Lqa5a+TEMmJqlVXu9+q1aa7YTpl5gtwEQ3cjbr1rKsRoToiaD1q1YmupKyNN9GZuFMzGvsE1PUW8MA3gitGrNbCZMnXMO7Vn2IbsdgKh2myrTUxd9aTTgVJoQNRW0bsWSlR7HZuFMzDls/X1cqMNUuXI7BOoZa9V+26GtWjObCVPXXEU7IzBhCrTBkROiJrO1vhStW4F0d9RQUIAHm4nTmXPYFuQmszsD6hGpVWvNZsLU3dKEqXR2OwBRbK3IM4XZ/XKZdcSEqKns/S9atyIpLkhjM3E6cwrbiFBfWt3bxO4IqEe0Vq012wlTj9EWPBoGgtq8upUO/On3lkBz1ISoyQyaWrdH0boVxlpTeYmJDGCzcSpzCttKwSp2I7Jp1b4lTqvWmvWEqZFXMGEKxDQsyISoqaB1K5baynxyWbGQzcfJzDpsE+PC5GnQ3A6AekRu1ZrZTJg69xzas/wjdjsAR9ntvpxOffkiuYyKMCFqMqOt2++N7idat0JITYpkM3IyswpbL/dl1FRfwn4xqEcLrVoz6wlTx795Ne2MCGC3A1DbjoRwOnbj9XLZFGVC1FTQuhVLW1MF+Xo7s1nJmVXYZmfEsV8K6tJCq9bariDrCVN30rZCTJgCx9pamUeHHxJzQtRkBhvQuhVNnqkxwWUlZ8ZhGxzgQT14K5DD2bZqX2G3EZHNhKnfPUZbuurZ7QCUtnl1Gx348x8s95FoE6KmgtatWFb2NFBYiDebmePNOGzL8P5jIWitVWvNZsLUq/9ktwFQ2vA7r1nKoagToiaD1q14pGzkMnO8GYdtW3MF+0WgHq22as1sJ0ydiwlToLrdHtYTon4s7ISoqaB161ir+5rk1xRnZ8TLj8G6Oi9iM3M8hK2G2LRqy7X5+NWECVORmDAF6tiRGEHHbtLOhKjJoHWrrvVr2qnFdM4Lc1MoNjqIvEx/sHEZOR2ErUZovVVrzWbC1D130TYMUYDCtlbm0+GHHpDLnFYmRE1l73/ftdQHaN3a1ycbeqiztYrKijMpOSGcAnxd2UycLYStRti2anPZbbTEZsLUk49jwhQoZnO/didETUZu3d6K1q299Jnqn+qKPMpIjaFQU2OAy8D5QthqgJ5atdYwYQrUMPyudidErfx4FVVtXkup2zbIajevof6PV8o/Q+t27taY/jhpqC2i3KxEiorwJ3fXJWzu2RPCVgP01qo1s5kw9cUv0p4VC9ntAOZqt+cKOnXxl+UyppUJUVLA/m/3NrrjyEH6/OnTZIpTG2eb/t+9hw9QQE8bHUHrdkY2ruuktqZyKs5Po4TYEPL1cmJzTkkIW8HptVVrZjNh6tpraGdUILsdwGyNToi6QS5bWpkQ5bRrkC4+eWJCwE5mibub6T9M/2WC1q2t7vYaqijNll+rGGSqR7lcUxPCVnCWVu0N1+mqVWvNZsLUvZgwBfO3taqADj+snQlRUvfwn/ftZgN1Klds3kzNd91l+ofpj/GH7jd063ZVTyPVVuXLC7yHh/iQi9PsFgpQGsJWYHpv1VqznTD1BG3pbmC3A5jO5jXtdOCZpyz3jugToqQx2FuPHmLDdCbe9vQ0/Yfpv0x2uhundbuuv01+V39+TjLFRAWSp+nYuewSBcJWYEZo1VqzmTD12r/YbQCmM/zu65ZyJPqEqDWmoH1mDi1aa1LrtulHPzL9YwGt/Okjum3dfry+mzpaKqm0MIOS4sPI38eFzSpRIWwFZdOqfVvfrVozmwlT532R9jhhwhTMjjQh6qSGJkRJY7Tjw3Mu3vLyMv2H6b9MGn3c2e/Sot7OOqoqz6H0lGgKCfRks0krELaCMlqr1mwoO3FswtS3vkk7o4LY7QDG254UScduvlEuO1qYEFW+ZR195+hhNjxn6/ItWyyt2+afPUrdazrY7xRdf18z1Zv+QMrJTKDIMD9yc1nM5pEWIWwFZMRWrTXbCVM/om3Fmex2AGbyhKhHHpTLjFbeECU93jM+NOfDunVb5evBfqdoNqztoJbGMirMS6W46GDy9lzB5o8eIGwFZNRWrTXrCVMHfv8EbenBhCngbTa14vZraEKU2UOH9rGhOVfWrduuR38i7NhtV1s1lZv+gE5JjKBAPzc2b/QIYSsY21btq+w2RmEzYer1F9ltAIb//YalnGjlDVHSiyu4F1bMl3XrVpTnbld2N1BNZR5lpsVSWPDM1n7VI4StYNCqHWM9YerUeefRHqdF7HZgXLu9nOjkVy6Wy4iWlswrHBxgw3K+rFu3+37smOdu165qpca6YsrLTqLoiADycFvKZorRIGwFglbtROMnTO2IxoQpGCVPiPqOdiZEWUvctpENS3tQu3W7aaCL2k35UFwgvQoxlHy9ndkMMTqErUBsWrUVxm7VWrOZMHXf3bStJIvdDoxja3UhHX7kx3KZ0OKSeXHbNrFBaQ/WrVul3pnc01FLlaXZlGb6Ayc4wIPNDLCFsBUEWrVTs50w9Rva0tPIbgf6t3ltB+3/y9OW+0WLS+aVbFnHBqW9vGvn1u3q3iaqqy6g7Ix4igj1JVenRWxOwOQQtoKwbdXmsdsYHSZMgWT4Pe1NiBpPekWjtHqPORzt7QeffExHf/B90z/m1rod6G+n5oZSKshNptioIPLyWM7mAswcwlYAaNXOjM2EqfPPoz3OmDBlNLu9nOVuYzlENDQhivPzgyNsUNrD3/btpr3/+7fpH6Z/mUzXuv1kQw91tlZRaZH0KsRw8vd1ZXMA5g5hKwBzq/bYjdfRVrRqp2QzYerb19KO6GB2O9AfaQLUse/cNHqvaGxCFMder2rkxA1tosHGsilbt31d9VRdnksZqTEUGuTF1vtgPwhbB7Nu1Q6jVTsjmDBlPFILVmrJStdcixOiOI2frqEfHjnIhuV8/MzUYpYWOJC+w7p1u235R9RQW0S5WQkUFe5P7i5L2LoelIGwdTC0amdGWnJvKCeZdvm6yl3t5r/YhXTmmbTvpefY49CC4fffpNOf/zx/bAI49r2b5TIglQWpTGh5Ocbg7Z+wgTlX0osycgbXy797w9pO6s5NpuEbrjP9cAF9fOP15LHoP2z9DspD2DoQWrW2xgfqwcd/SUdv+R6d+vJFlvOkFSe/egl7jFpw8rJL2WMSmVRGpLIilRmtBfELIzvZ4JyLl9avpoqSLEpNiqRAU/0i1d0Vn/1BLyn43WMT6nZQB8LWgcZatdcbplVrl0A1tRyPX3uNzPz/Rt54UQjHr71a3h+p5c0dvxYceeAe+RikrnruGB3BfJ1PXHXF6HX/7DGwmRA9iDdu6qO7jhxgw3NaIyO0YP16WtDYSLelJJLLioUT6u6A99+kwSsvN228gDZc/220bh0EYesgem7VDjaU0vaUaNrtsYJG3npFfi72yN0/pBPSDX/GGZbjnsqpCy+gYzddL4/T7X/2Gdr74Xu0M8SHhgrSLJWk9P/M24/fB0cxjyseufN29udaIOIxmK+zFLzSv7f0NtG2wnTaGeYrP4O9/7m/0KFHH5aX2Dt10Zcs20/nxOXfoCN33UEHf/e46Xe/RLvdl8lvptpaVzxhH5TU8clqenF4J5013eNAhw/Tgk8/pQXt7bSgsJAWxMTQF0OC6RFvd1o0xbOvaN06HsLWQbTeqrUEqqeygToVhK0ytBC2U5kQxP+YQxB/7nNjQfzk+CAuYb/XHnx2bKb7D+8fC9eTJ2nB0BAt6O2lBeXltCApiRaEhlrc7OdDf3F3Yutsa2jdOh7C1gFsWrXviNuq5QP1ztkHqukPitFA/fOsA3UqCFtlaD1sp2KXFvFkQZwcZZcg7uyqp0UNlXRfSQGdn5ZqE66SLwUH0R2+XvSs++zWfq34JVq3joSwdQCRWrWTB+oVRGc6PlCngrBVhp7DdirKtYiXTxnE/X3NVF9dSDmZ8RQZ5kduzott6t5lKxbSe85LZCuYMdmZQuvWsRC2KrNt1b7GbmNvgw1ltD3VKlD/YB2oM5to4qhAnQrCVhlGDdup2C2Ir/gGHTad152/fJQG/vR7anj+b5T28vMU+O/X2XrX3tC6dRyErcqUatWOBmrMxEC9apaBahlDFSNQp4KwVQbCdnbsEcSnTUE8/OWL6JNvXk29t91CdQ8/QPmmlnHC83+1axCPtm5NdYLpO9G6VRfCVkXzbdWOBaoTjbw9j0C1tFBnPylJJAhbZSBs52+l6V6qMf0xnRsbTBkf/psynnmKyn/1KLXecxetu/kG2n7Z1+nIuedajmsqkwbxC3+bUxCjdesYCFsV2bRqK/lWrfQ+07FAfdUOgSp+C3WuELbKQNjO3tpVrdRYW0x52YkUHRFAHq5L2XrUmtfC9yjytX9ZgrhtrkF88eyCGK1bx0DYqsS6Vbvvn8+OC9Tf0pF7EKizhbBVBsJ2ehvXdcl1YrHpfkuIDSFfL2e23pwr+wXxl9kgbnjofst2aN2qA2GrkhPf+OwVeDMMU5lpW+ltOYdNN4YcqIs/oB3RQbS1qoD9DqNB2CoDYcvr7qilitJs+VWIQQEebD2plpC3X6HUv/+Jyn79M2q7+05ab2qh7v7qJXRqho/kSczbHrzgfLRuVYCwVcFgfcmEgm6BQJ0zhK0yELajVvc2UZ3pPszOiKOIUF9yneINTSKZSxAnm+oe7neB/SBsVbC1tthSqKVQRaDaB8JWGUYN24H+dmquL6WC3GSKjQokL/flbF2oZdZBvPbmGyznNfLVf7Lbg/0gbFVgHbbSuCq3DcwewlYZRgnbj9d3U0drFZUWZVBSfBj5+7iydZ9eJT7/V8t5RdgqD2GrAoStMhC2ytBz2PZ11VNVeS6lp0RTSJAXW9cZBcJWXQhbFSBslYGwVYaewnbNyhZqqCmi3KwEigr3I3eXJWz9ZkQIW3UhbFWAsFUGwlYZWg7bDWs7qLWxnIryUyk+Jph8PKdfEceoELbqQtiqAGGrDIStMrQWtl3tNVRekkUpiREU6OfO1l8wEcJWXQhbFSBslYGwVYboYbuqp5FqK/MpMy2WwkK8TfXT3FfCMTKErboQtipA2CoDYasM0Y5h3epWy3XufvwX5Om2jK2jYHYQtupC2KoAYasMhK0yHH0Mmwa6qL25kkoK0ykxLpT8vF0s17n+oQfY+glmD2GrLoStChC2ykDYKsMRx9DTWUeVZTmUlhxFwcyrEM3XGWFrPwhbdSFsVYCwVQbCVhlqHEN/XxPVVxdSTkY8RYT5kqvzYrbeMTNfZ4St/SBs1YWwVQHCVhkIW2UocQzr17RTS0MZFealUFx0EHl7rGDrmcmYrzPC1n4QtupC2KoAYasMhK0y7HEMn2zooc7WaiorzqTkhHAK8J3fqxDN1xlhaz8IW3UhbFWAsFUGwlYZcz2Gvu56qq7Io4zUGAq186sQzdcZYWs/CFt1IWxVgLBVBsJWGTM9hrWrWqjRVLbzshIpKsKf3F2VexWi+TojbO0HYasuhK0KELbKQNgqY7Jj2Liuk9qaKqi4II0SYkPI10u9VyGarzPC1n4QtupC2KoAYasMhK0yrI+hu72GKkqzKTUpkoL8HfcqRPN1RtjaD8JWXQhbFSBslYGwtb9VvY20+5675GPYdt23yMVpEVsfqM18nRG29oOwVRfCVgUIW2UgbOdvoL+NmutLqSAnmWKjAsnTfRmtu+n60XN6zVVsXeAI5uuMsLUfhK26ELYqQNgqA2E7ex+v76aOlkoqLcqgpPgw8vdxmXCvI2yNAWGrLoStChC2ykDYzkxvZx1VledSeko0hQR6sve3NYStMSBs1YWwVQHCVhkIW17/ymaqryminMwEigz3IzeXqV+FOB7C1hgQtupC2KoAYasM67DdnhQphKO33yrvj5phu2FtB7U2llFRXirFxwSTj+fsXoU4njlst1/6f3KFLALzdUbY2o/1eUXYKg9hqwKErTL2PTdWWYjm1AXns/tsL11t1VRekkUpiREU6OfG3rNzdfD889ljEkHfD77P7jPMHsJWXQhbFSBslbHHeZHlvArnzDPZfbYXJcP2xFln8cckgKqfPcLuM8wewlZdCFsVIGyVsz01hnbEhLBduo4w8vLzlmst/ZvbZ3uz7kaOiwkm73l0I0db7X/bPXdaunEdLeXZP1Psv55l9xnmRjqv5muNsFUewlYFCFvj2FaaTafPOUe+1sP/fYfdRmn9fdIEqcLRCVJhs5sgVfzELy1lNealf7DbgD4gbNWFsFUBwtZYjt7xA/laH/r1z9mfq2300Z+cGT360/3ZvkuTo1yW/Y/dBvQBYasuhK0KELbGsv/ZZ+RrfeKaq2hLXxO7jaNYXmpRmC6/1MJv3Esthi67VN73nttvsfn/oD8IW3UhbFWAsDWW3Z4rLNd7h0rjtnO1bnUbNdWXUH5OEuV/9L5lv0se+zlbD4B+IGzVhbBVAcLWWGzGbT9wzLjtXOxZPvbyiGrnRRRuKqsuKxay9QFoH8JWXQhbFSBsjUe0cduZOPD07+R9Pnbj9fTpQJf8/+Ql9kqy5CX2Ah24xB7YH8JWXQhbFSBsjUfkcdvJHPvOjfI+H/jDb9ifb1jbSa1N5VSUL72pKoR8VFw8HuwPYasuhK0KELbGYzNumxjBbiOSoZxky/7uWfo/dpvx1qxsoYaaIsrNSqCocH9yd1nC1h0gJoStuhC2KkDYGo/tuO3b7DYisR6vHcpKZLeZTl9XPVWbVxcK8mLrERAHwlZdCFsVIGyNSUvjttx47XzIjxi1Vlmtm+vK1ivgOAhbdSFsVYCwNSbLuO3VV9GWXoHHbTf0TDteO18D/W3UXF9KBbnJFBsVSF7uy9l6BtSDsFUXwlYFCFtj0sq47VzGa+drdW8j1VUVUHZ6HIWH+pCL0yK23gHlIGzVhbBVAcLWmLQybmuP8dr56u6opQrT+ZIeMQrCI0aqQNiqC2GrAoStcY2N2/6M/bkI7D1eO18b13VSW1MFFRekUUJsCPniESNFIGzVhbBVAcLWuIQft5XGa29Wdrx2vtauaqFG0z2UZ2p1R0X4k7srHjGyB4StuhC2KkDYGpfo47ZDOUmW/VNrvHa++rrrqboijzJSYygUjxjNGcJWXQhbFSBsjUv0cds9yz+0lE1HjdfOxyemlnlnaxWVFWdSckI4BfjiEaOZQtiqC2GrAoStsVnGbX8l3rjtgafEGq+dr/Vr2qmloZQKc1MoNjqIvDzwiNFkELbqQtiqAGFrbGPjtlfSlt5GdhuH0MB47Xyt7muiuuoCys6Ip4hQX3J1xiNGZghbdSFsVYCwNTZRx221OF47Xz0dtVRZlk1pyVEUHODB1nVGgbBVF8JWBQhbY7MZt/2POOO2e5Zpe7x2vjYNdFG7qV4rKUijxLhQ8vV2Zus+vULYqgthqwKELYg4bnvgqd/K+6SX8dr5WruqlRrriikvO4miIwLIw20pWxfqBcJWXQhbFSBsQbhxWwOM187Xyu4GqqnMo8y0WAoL9mbrRS1D2KoLYasChC3YjNsmhLPbqGnI1Hoz749Rxmvnq6utmsqLMyklMYIC/NzYelJLELbqQtiqAGELoo3bGn28dr7Wr+mglsYyKsxLobjoYPI2/THF1ZsiQ9iqC2GrAoQtSEQat8V4rX319zVTfXUh5WTGU2SYH7k5L2brUZEgbNWFsFUBwhYkNuO2PQ4ct13fTcduvkHeF4zXKqO3s46qynIoPSWKggM92TrV0RC26kLYqgBhCxJRxm0xXquuTQPd1N5SSSWF6fIjRn4+LmwdqzaErboQtipA2ILEdtz2LXYbNWC81rHWrW6jproSys9JopjIAPJ0W8bWuUpD2KoLYasChC2YiTBui/FasazqaaTaynzKSoulcFP94Lxi4YT6VwkIW3UhbFWAsAUzy7jtVQ4at5XGa2/CeK3IutprqLwkS37EKNDPna2P7QFhqy6ErQoQtmDm6HHboexEy/djvFZ8G9Z2UGtjORXlp1J8TDD5eDqx9fNcIGzVhbBVAcIWzBw9bovxWm1bs7KZGmqKKDczgaLC/cjNZQlbX88EwlZdCFsVIGzBmmXc9pePsj9X0oE/YLxWT3q76qiqPJfSU6IpZJaPGCFs1YWwVQHCFqyNjdteoe64LcZrde1j0/XtaKmk0qIMSooPI/9pHjFC2KoLYasChC1Yc9S4LcZrjWWgv42a60upICeZYqMCydPd9hEjhK26ELYqQNiCNZtx2/fVG7eVAtZcDjFeazyrehuptqqAstLj5EeMkp7/m6U8IGyVh7BVAcIWxnPEuK1lvPYmjNdCL6031UXmeinN9EcfV++D/SBsVYCwhfFsx20b2G3sCuO1MM72pEhLvbQlJ5namsqpOD+NEmJDyMfLfo8YwSiErQoQtjCezbhtfBi7jT1J3cbm78N4LUisw3aoIM3mZ2tWtVBDbRHlmspNVLg/ubvO/REjGIWwVQHCFsZTe9wW47Uw3lRhO15fVz1VV+RSRmoMhQZ5sRkBU0PYqgBhCxw1x22lrmPpuzBeC2azCVtrn2zooc7WKioryqDkhHDy93VlMwNsIWxVgLAFjs24bbeC47YD0njt9fJ3YbwWzOYatuMN9LdTc0MpFeRKjxgFkZfHcjZDjA5hqwKELXDUGrfFeC1w7BW2463ubaK66gLKzoijiFBfcnVaxGaK0SBsVYCwBY7tuO2b7Db2gPFa4CgVtuP1dNRSpamspyVHUXCAB5svRoCwVYFewnaL6abZERUo36RKkVt4BhpTNI/bHv3hbez5sIfD998jf4eh3odsOs4dMSHs+bCXHVFBtKW1iv9+DZCOwVwvKRm21jau65KzpNj0fQmxoeTr7czmjR4hbFWgh7DdWlVAdMbnLMehpOPf+ia7D3p09PZb2XOghGPfuZHdBz06+oPvs+fA7j73ORrKS2H3QXSOCNvx1q5qpUZT/ZiXnUjREQHk4bqUzR89QNiqQA9he8TU8jIfg+LOPJM2r2xm90Nvjptam+w5UIA0EYvbB73Z3N9GdNZZ7DlQwrHvfUeTPQYihO14K7sbqKYijzLTYigs2JvNIq1C2KpA62G798P3LPt/8De/tnSj2dvw269avmfP8o/YfdGTrXXFdOLyy0bP689/wp4Tezj428fk7zj15YtoW3Emuy96stvLyVKO9r3yPHtO7OHAU6Ovv5QMv/s6uy8ik47BvP+ihK01+RGjtmoqM5VZ6RGjAD83Npu0AmGrAi2H7fbUaLlbV9r3ww/cS4MNpex29iA9/iKNK0rfdejXP2e30ZPdbsvGykW4P7uNPVhXqnsXf8BuoyfmEJRa8oONZew29iDNYTj0s0dGv8v0R5M0RsxtJyrRw3a89WvaqaWhjArzUiguOoi8PVawWSUqhK0KtBq2m1e30sEnfiXv98mvXEw7g73Z7exp/7N/Hv2+r11CWyvy2G304uDvRlucx757k+Ld5kfvvF3+rkOmFjT3c70YbCqnE1dfKR+rtPACt4097YgJphPfGO2dkIJXCmBuOxFpLWzH6+9rovrqQsrJiKfIMF9ydV7MZpcoELYq0GrYWncfj7zyAruNvUnnx/yde1YsZLfRA+su5H3P/43dxp5G3nhR/i69dyXv9na2lB+pO5nbxt6G33nN8p1a6k7WetiO19NZR5VlOaOPGAWK94gRwlYFWgxb6+7jI/ffQ4P1ynUfW7PuSj74mH67ktXqQjYzSlfygad/Jx+j0l3I1uTu5EcfHv1eDXUn6y1srW0a6KL25koqKUynxLhQ8hPgESOErQq0FrbW3cenLv4y7VKh+9jaWFfyV2lrZT67jdap2YVspveu5EFTHXXimqvkY1SjC9najuggOnHZpaPnVyPdyXoO2/HWmeq0proSys9OopjIAPI0/bHL5ZySELYq0FrYWncf73tZne5jazZdyU7660pWuwvZTO9dybt8XCzlRq0uZGvD74zNptdCd7KRwna8lT0NVGP6Qz4zLfazR4wWTsg8e0PYqkBLYWvbfXw3ba0vYbdTkm1X8i/YbbRM7S5kM713JR/445PysanZhWxtS3sNHfrpQ6P7oIHuZCOH7XhdbdVUXpJFKYkRFKjQI0YIWxVoJWxtuo9NrZ9dQV7sdmqwdCX/39doa5W+upId0YVspteu5MHmSjr+zavlY1O7C9ma9ArHk5d9ffQcC96djLDlbVjbQa2mP9aK8lIpPiaYfDzt84gRwlYFWglb2+7j59lt1GLTley8iN1GixzVhWym167kXT6ulvLiiC5kayNWL2cRuTsZYTsz/aY/iOtrCiknM4Eiw/zIzWVujxghbFWghbC16T6+7245FLjt1GLTlfz4L9lttMhRXchmeu1KPvDH38vH5KguZGuDbdV0+CfW3cnB7HaOhrCdm97OOqoqz6H0lGgKCfRk85Iz47CtKM1mvximJ3rYTug+NhUgbju1WbqSv/5/8kII3DZa48guZLMjOutKHmyppOPXXiMfkyO7kK3tjAqkk5eK3Z2MsLUPaQUjLjPHm3HYhgZ5UV9XPftlMDXRw9am+/il59htHMG2K3kxu42WOLoL2UxvXcm7fMXpQrY28tYrlv0SsTsZYTt/q/uaKCLMl83M8WYctpLcrAT2C2FqIoetTffxvT+S95XbzhFsupJNLW9uGy1xdBeymd66kg/8SZwuZGuj3ck/Ht03AWcnI2znryA3mc1KzqzCVpqVJc3S4r4UJidq2Np0H1/0JWG6j61ZupIv/TptrS5kt9EKEbqQzfTSlTzYWiVcF7K1nZGB8jCIfK4F605G2M5PR0sV+fu4slnJmVXYSqSljqSlj7gvB56oYWvTffyiON3H1my6kl2WsNtogVQGROhCNtNLV/IuPzdL+RCpC9nayFsvW/ZRpO5khO38SBOkuIyczKzDVlKt89VY7E3EsJ3YfVzEbudoNl3Jv/k1u40WiNKFbKaXruQDf/6DfAyidSFbk1rfhx95cHQ/BepORtjOnbTakNssVxmaU9hGmSqLNStb2J2AiUQLW5vu4y9dSLsCPNjtRGHuSj5x2ddpa42YfxRMR6QuZDOtdyVLY6LmPxhF7EK2tjMigE5+/Wuj51uQ7mSE7dxI6+pK6+ly2TiVOYWtpCg/ld0RmEi0sN37kXX38T/YbURi3ZW823Upu43IROtCNht54yV5n7TalbzL332sXAjahWxt5E2xupMRtnNTWpTBZuJ05hy20vsjpfdJcjsDtkQKW5vu43vuMrUUxZ90ZNOV/NvH2G1EZtOFHOH4LmQzrXcl73/mKXnfRe5CtiY9D3z4YXG6kxG2s9fbVUchQTN/kYW1OYetJDMtht0hsCVK2E7oPja1DLjtRLT/2Wfk/T7xjUtN51NbXckidiGbabUrWXrp//FvXyvvu+hdyNakP7ak933L51zqTu50XHcywnb2pFc2clk4E/MKW3fXpdRgChJup2CMKGFrM/v4X8+y24jKpivZTTtdyaJ2IZtptStZmmdgKQ8a6EK2Zj7nEkd2JyNsZ6eloYy8Pea+KMG8wlYSHxNCG9Z2sjsHo0QI2+2pMWPdx3ffqblnVm26kk0tRW4bEYnahWym1a7k/X95Wt5nrXQhW5NWKDr88AOj++/A7mSE7cxJj7tKj71yGThT8w5bibQOILeDMMrRYWvTfXzhBZrqPrZm6Uo2VVCOXihhpkTuQjbTWleyNJP3+HXfkvdZS13I1qTHv05+7auj591B3ckI25mrLs9ls2827BK20kr3K00tD24nwfFha9N9/E9tdR9bs+lKdl/GbiMS0buQzbTWlSy96cxSDjTWhWzN/GIRiSO6kxG2M7PG9EdyVLgfm32zYZewleRlJ7I7Co4N24ndx9pdPcemK/nJx9ltRCJ6F7KZ1rqS9//1j/K+arEL2dpgcwUdfuj+0WNxQHcywnZmCvNS2cybLbuFra/pL8y2pnJ2Z43OUWFr0318wQXyq+247bTE0pV8xTdoa10Ju40otNCFbKaVruQtnXV0/Ppvy/uq1S5kazvD/Ojk1y4ZPfcqdycjbKfX2VZNAaZ6k8u82bJb2EpSTReP22Gjc1TY2nYf/53dRmtsu5KXs9uIQCtdyGZa6UreFeQ1dv013IVsbeR1x3QnI2ynl5Eaw2bdXNg1bJ1XLKSaynx2p43MEWFr0338ox/qZvF1267kJ9htRKCVLmQzrXQl7//bn+R91HoXsrXBpnI6/GP1u5MRtlNrqCkid9clTM7NjZ3D9iOKjgigtata2Z03KrXD1rb7+Hx5cW1uO60a60q+nAbrS9ltHG2sC/lm4buQzSxdyT97hP25o23pqqPjN1wn76MeupCt7QzzpZNfVbc7GWE7uQ1rOyg+JpjNuLmye9hKinHhbKgdtjbdxy+I34U5WzZdyR4r2G0cSWtdyGaidyXvCtZfF7K1kdf+ZTk+NbqTEbaTKzeVfy7b5kORsA3yd6fu9hr2IIxIzbC1effxXXfQVh1268tdyTeNdiUf+P1v2G0cSWtdyGaidyXv/7v+upCtDTZK3cn3jR6jCt3JCFten6l+CQ32ZrNtPhQJW0lWeix7IEakVtjadB+ff57uuo+tWbqSrzRVvA1idSVrsQvZTNSu5C1d9XTsRn12IVvbGepLJy/5iuUaKNmdjLDl5WYlspk2X4qFrafpr/smwR/NUItaYWvTfayh7su5sOlK9hSnK1mrXchmonYl7zS1NCzXW4ddyNZGXlWnOxlhO1FrUzn5mMoXl2nzpVjYShLjQmnjQBd7UEaiRthO6D6uyGO304vRWcmjLZ1jN98gv41HBId/8uOxa62hLmQz6wr4yIP3ssfoCEdv+a68T3rtQrYmHd/hB5XvTkbYTpSSGMFmmT0oGraSitJs9qCMRI2wlVpR5u+QbiJuG705cu/dlmMWzelzz2X3WQuk92dzxySCo7fdwu6z3kj1xMmvXCwfs/S4E7fNfCFsbdWYGihchtmL4mEbbio0q3oa2YMzCjXCdkd0kPxX//AHb7M/1yOpsjh91lmWcyuMz32ODvz5D+w+a8HIKy8QnXEGf2wOdPqsz9POyAB2n/Voz7IP5Xtasd4whK3F2lUtFB3hz2aYvSgetpL8nCT2AI1CrTFbAICZQtiOKc5PY7PLnlQJWz9vF2pvrmAP0ggQtgAgGoTtqK72Ggr0d2ezy55UCVtJWnIUe6BGgLAFANEgbEdlpsWymWVvqoWtq9MiqtPJ+3lnC2ELAKJB2PZSY10xebgtZTPL3lQLW0lMVCCt629jD1rPELYAIBqjh+3GdZ2UEBvCZpUSVA1bSUlhOnvgeoawBQDRGD1sK0qy2IxSiuphGxzgQT0d6i2QLAKELQCIxshhKz2OKj2WymWUUlQPW0l2Rjx7AvQKYQsAojFy2OZlJ7HZpCSHhK2X+3JqFnQdUiUgbAFANEYN27bmCvL1dmazSUkOCVtJUnwYfby+mz0ZeoOwBQDRGDVsU03HzWWS0hwWtpKqshz2ZOgNwhYARGPEsK2tyicXp4VsHinNoWEbEeZLq/ua2JOiJwhbABCN0cJ23epWiokMZLNIDQ4NW0lBbjJ7YvQEYQsAojFa2JYUpLMZpBaHh62/jyt1tFSxJ0cvELYAIBojha30uKn02CmXQWpxeNhK0lOi2ROkFwhbABCNkcI2Kz2OzR41CRG2bs6Lqb66kD1JeoCwBQDRGCVsm+pLyNN9GZs9ahIibCVx0UG0fk07e7K0DmELAKIxQthuGuiixLhQNnPUJkzYSsqKMtgTpnUIWwAQjRHCtrIsh80aRxAqbEOCvKi3q449aVqGsAUA0eg9bFf3NlFEqC+bNY4gVNhKcjIT2BOnZQhbABCN3sO2ICeZzRhHES5svT1XUEtDGXvytAphCwCi0XPYdrRUkr+PC5sxjiJc2EqSE8Lpkw097EnUIoQtAIhGz2GblhzFZosjCRm2kuryXPYkapF12AIAiEZPYVtXXUCuzovZXHEkYcM2KtyP1qxsZk+m1mwrymALOACACLanxbJ1l9YM9LdTbFQQmymOJmzYSgrzUtkTqjXWLdv9f/sT7XZbphl7P3qPTn7tqzY3puTUBefT8LtvsJ8xsmM3XCefnxNXX8n+XAuO3zh6DMevuoL9uZENv/u6XPat7wXJya9dYrpX3mc/I6p9L/7Dsv96admWmho2XJaIQOiwDfBzo862avakaolWx2yHMhPo8AP3WPZdujlH3n6VTp99tvzvo7d8j3ZEB7GfNarDP/mxfG6O3Hk7+3Mt0MMxKEEa45TOiXw/fO5zNPLGSzLpv+Xzddcd8jbcZ0WktzHb3s46Cgn0ZLNEBEKHrSQjNYY9sVqixbDlgnZz/+gbvobfe4NOn4PA5SBs9YkLWvPPtBq4egvbnMx4NkNEIXzYursuoYaaIvbkaoXWwnYoSwraey37vO/F52jzuFdpDr/3JgKXgbDVn6mC1mxC4CZHTdhGNHoK2+aGUvL2WM5miCiED1tJfEwwbVjbwZ5kLdBS2M4kaM1GA/cceTsE7iiErb7MJGjNtBa4egnbj9d3U1J8GJsdItFE2ErKizPZE60FWgnboaxE26B9afKgNUPg2kLY6seEoH1z8qA1G3nz5bHA/ZHYgauXsK0qz2UzQzSaCduwYG/q625gT7botBC2ctA+OLugNRt+H4FrhrDVh4lB+zK7Hcc2cH8obODqIWz7+5opMsyPzQzRaCZsJbmmQOBOuOhED1s+aGfXbS8H7rkIXISt9tkE7RlnzCpozeTANX1WPo+CBq4ewrYwL4XNChFpKmx9vJyotamcPekiEzlsh7KloL3Psn9y0M5xfHz4/bcMH7gIW22zR9CaTQjclGh2O0fReth2tlZRgK8rmxUi0lTYSlISI9gTLzJRw3Zi0D4/56A1M3rgImy1y55BayZy4Go9bDNSo9mMEJXmwlZSU5nHnnxRiRi2E4L25fkHrdlo4J4r/16jBS7CVpuUCFqzkbesAvducQJXy2FbX1NEbi5L2HwQlSbDNjoigNauamEvgohEC9uh7CQ6/GNlgtZs+D/GDFyErfZMCFpTOHLbzcfIW69YBe6dQgSuVsN2/ZoOiosOZrNBZJoMW0lxvnYKh0hhywdtJ7vtfBkxcBG22jIxaF9ht7MH0QJXq2FbVpzJZoLoNBu2Qf7u1NVew14M0YgStmoGrZkcuF80TuAibLXDJmjPPFPRoDWTA9f0XfL5lQI31XGBq8Ww7euqp9AgLzYTRKfZsJVkamRZKBHCdihHCtr7Lfux7+UXaPM6ZYPWbPg/bxsmcBG22uCIoDWbGLiOef+7FsM2NyuBzQIt0HTYergtpca6YvaiiMTRYevIoDUzSuAibMXnyKA1EyFwtRa2rY1l5OPpxGaBFmg6bCUJsSG0UeXgmC1Hhq0ctA9ZBe0r6get2fAHUuB+Ud4PvQaukcK2dvMa8ty5md7cu52e3r+H/jmyk/63exvFDW2igU197GccTYSgNZOWq7QE7j13qR64WgrbT0ykxz65DNAKzYetpKI0m71AonBU2A7lJNsE7YgDg9ZM74Gr97DdaApR151b6NrjR8lUqiZ13qlT9OsDw3Igj/8djjIhaE1hx22nJkcGrpbCtroij637tUQXYRtuCrBVPY3sRRKBI8KWC9pP13Wx26pNz4Gr57At3jJANx07zIbrZM4+fZpeG94hh7T171KbTdB+XoygNZMD17RP8jmXAjdNncDVStiuWdlCUeH+bN2vJboIW0l+dhJ7oUSgdtgO5UpB+4DlO+WgHRAjaM2GP3iHTp+nv8DVa9i6mFqz35ymNTuV3xzYS4WDAzbfoxbroD39+c8LFbRmw6Z9kvZNPu8qBa5WwrYoP5Wt87VGN2Hr6+1Mbc0V7MVyNDXDdmLQ/lO4oDXTY+DqMWzdTUF70amTbIjOxqMH91HDp+p2K48PWinUuO1EMDFwlX3aQgth29VWTYF+bmydrzW6CVtJqqnwcBfM0dQKWzloH7YK2lfFDVqz4f/qK3D1FrZlW9bJ46/mwJyvJ/fvZb9TCVoKWrPhd6wC915lA1cLYZtpauFzdb0W6SpsXZwWUm1VPnvRHEmNsB3KTdFc0JrtNQXuqfPOk/db64Grp7A9dNcd9IuDI2xoztWZdJr8dnzKfq89TQhaU4hx24lo+J3XrAL3R4oFruhh22iqNz1cl7J1vRbpKmwlMZGBtG51K3vxHEXpsOWDtpvdVlR6CVw9he3g3XexgTlf1x87ouiEqYlB+xq7ncjUCFyRw3bDuk75sU6ujtcq3YWtpKQwnb2AjqJk2A7lMUG7XltBayYH7vnaDlw9hW3vffeyYWkPEUMfs989XzZBe5Y2g9ZMDlzTMcjlSQrcdPsGrshhW16SxdbtWqbLsA0O8KCejlr2IjqCUmE7GrQPWn63loPWbO9/39V04OopbBseeIANSnt4aXgn+93zYRu0Z2k6aM1GA/cs+ZhGAzeO3W4uRA3bld0NFBbizdbtWqbLsJVk27FQzpcSYTsxaP+l+aA103Lg6ilsqx98kA1Ke7j16CH2u+dKj0FrZhO499kvcEUN27zsRLZO1zrdhq2n+zJqqi9hL6ba7B22ctA+YhW0r+knaM32/k+bgYuwnRnpmV3uu+diQtC+q5+gNZOOyd6BK2LYtjWVk6+XM1una51uw1aSGBdKmwSYkWvPsB3KS9V90JqNBu758nFqJXARtjPHffdsGSFozYbffd0qcO+ed+CKGLbS45tcXa4Hug5bSWVZDntR1WSvsB3KZ4J2Qw+7rV5oLXARtjNzxYlj7HfPhk3QfkEK2tfZ7fREDlzTscplTArcjLkHrmhhW1uZTy4rFrL1uB7oPmwjQn1pdW8Te3HVYo+wNWLQmsmBe4E2AhdhOzM/ODK/MVsjBq2ZvQJXpLBdu7qVoiMD2DpcL3QftpKC3GT2AqtlvmE7GrSjFaDESEFrtvd//9ZE4OopbGsUDNtn9u1mv3smbIP2C4YKWrPRwP2CfA6O3C8Fbjy73VRECtti0/dzdbeeGCJs/X1cqKOlkr3IaphP2MpB+1nlJxl5/UXDBa2ZFgJXT2Hbef99bFDag/eOzex3TwdBO2b43/MLXFHCtru9hoIC3Nm6W08MEbaStOQo9kKrYa5hO5SfhqAdZ++HYgeunsJ24z13s0E5XxefPEH9H69kv3sqE4LWFDbcdkZiG7j3zCpwRQnbrPQ4ts7WG8OEravzYqqrLmAvttKsw1Z6GbpUyKez27S/R+6+0/I5BO2Y0cC9QD4vx266gfa+/xZ7Dh3h6O23yvulh7A9aDq3/yotpgerq+0qKjeDPXdT2fvhe6Y/rr4r79do0L7B7rsRSefCHLhH77iN9i79L3sOx5POqfQZiaPCtqmuhDzdlrF1tt4YJmwlsVFBNNDfzl50JW2tKrAU6rnY/+yf2d9rZNYVhYhOfONSdr+14Ph132KPSRTStef228jmez8MZSWwv1dJ0mOZ0uOZXF2tR4YKW0lpUQZ74RW1pt3yfNxsHfr5T/jfCbTvub+y50wE0nqk3D5rwaFf/JQ9JhHs/8sf2X2GXvnccOdsWmeeSVu6G9jfqaSK0my2jtYrw4VtSKAn9XbWsRdfSVJh3laaJXcpz1h1Ifu7YMzWuhK554A9fw6yzRF/0NnZtopcy/F8ajrHr63qpqs//njObtm4gYpaam3O06yZ9oPbVxgj3w/cuZvEtvJchwTtqt5GCg/1YetovTJc2EpyMmc/TR7A6Fx3bqGzT59mJz1N5Y4jB6nl0372d4Ix5ecksXWznhkybL09llNzQylbCABgclJo/ubAXjZUx7v0xHHymeMjPqBf7c2V5OfjwtbNembIsJUkxYfTxzp9pzCA0jo+WS23dJ/cv5fuOnKArj5+jL539DA9fGgfvTS8gzK2blB0gXjQLukxTK5O1jvDhq2kqjyXLQwAAGB/dVUF5Oq0iK2P9c7QYRsZ5kf9fc1soQAAAPsZ6G+j2KhAti42AkOHraQwL4UtGAAAYD8lhelsHWwUhg/bAF9X6mytYgsHAADMX09nLQUHerJ1sFEYPmwlGanRbAEBAID5y86IZ+teI0HYmri7LKH6miK2kAAAwNw115eSl8dytu41EoTtZ+Kig2n9mg62sAAAwOxJj1cmxYexda7RIGytlBVnsgUGAABmr6osh61rjQhhayU0yIv6uurZQgMAADO3uq+JIsN82brWiBC24+Q6YKkpAAC9KchNYetYo0LYjuPj6UStjWVs4QEAgOl1tFaRv68rW8caFcKWkZIYQZ9s6GELEQAATC09JZqtW40MYTuJ6oo8thABAMDk6qsLyc1lMVuvGhnCdhJREf60ZmULW5gAAGCi9WvaKS46iK1TjQ5hOwVpkXl0JwMATE+qKwtyk9m6FBC204qJDKDayny2cAEAwGjXMVq0U0PYzoCL00JKTYqktuYKtqABABiRNOtYmgyFMdrpIWxnwdfbmfKyk2hlTwNb8AAAjEB6YYX0HC0e75k5hO0chIf4UEVJFm1c18kWRAAAPZLedSy9ghFvhpo9hO08JMSGUGNtMVsoAQD0RFq9B4sKzB3Cdp483JZSZlosdbXXsAUUAEDLpIXfpfVosUze/CBs7STQ352K8lNpzSo8mwsA2jfQ30YlhekUHOjJ1nkwOwhbO4uO8KcavH0KADSsrqqAYqMC2ToO5gZhqxDp/cqtjeVsQQYAEFF7cyWlJUeRq9Mitl6DuUPYKsjHy4lysxKprxtr5AKAuFb1NlJ+ThL5+biwdRnMH8JWBaHBXlRWnEkb1nawBR0AwBE2DXRRZWk2hYf6sHUX2A/CVkXxMcHUUFPEFnoAADU11ZVQYlwoW1eB/SFsVebusoQyUmOos7WKvQEAAJTU3V5DWelx5Om2jK2jQBkIWwcJ8HWjwrwU6l/ZzN4QAAD2tHZ1KxUXpFFQgDtbJ4GyELYOFhnuR1XluVjKDwAUI61cFh0ZwNZBoA6ErSCSE8KppaGMvVEAAOairalcXrHMZcVCtt4B9SBsBeLtsUJesL63s469cQAAZmJldwPlZSeSr5czW9eA+hC2AgoJ9KTSogwa6G9nbyQAAM6GdZ1UXpJFYSHebN0CjoOwFVhsdBDVVxeyNxUAgDVpBTJpJTKuLgHHQ9gKzs15MaWnRFNHSyV7gwGAsXW1Vcsrj3m4LmXrEBADwlYj/H1cqCA3mVb3NrE3HAAYy5qVLfJKY4F+bmydAWJB2GpMRKgvVZbl0KaBbvYGBAB9+2RDL1VX5FFUhD9bR4CYELYalRQfRs31JezNCAD61NpYJq8oxtUJIDaErYZ5uS+n7Iw46umoZW9MANCHvq56ys1KIB9PJ7YuAPEhbHUgOMCDSgrTad3qNvZGBQBtWr+mQ14xLDTIi733QTsQtjoSExlItVUF7E0LANpSX1NEcdHB7L0O2oOw1RkXp0WUlhxJ7c0V7A0MAGKTVgTLSI2WVwjj7nHQJoStTvl5O1N+ThKt6mlkb2gAEEt/X7O8EliAryt7T4O2IWx1LjzEhypKs2njuk72BgcAx/p4fbe88ldkmB97D4M+IGwNIiE2lBrritmbHQAco7mhlJLiw9l7FvQFYWsgnm7LKCs9lrrba9gbHwDUIa3sJa3w5e2xnL1XQX8QtgYU5O9OxQVptHZVK1sRAIAypJW8pBW9pJW9uHsT9Atha2DREQFUU5nPVgoAYF911QUUGxXE3ougfwhbw1sov/6ttamcrSAAYH6kFbvSkqPI1Xkxc/+BUSBsQebr5UR5WYm0sruBrTAAYHakFbqklbqkFbu4ew6MBWELNsKCvam8JIs2rO1gKxAAmNqmgS55ZS5phS7uHgNjQtgCKz4mhBpqi9jKBAB4TfUllBgXyt5TYGwIW5iUu+sSykiNoa62arZiAYBR0spbWelx5Om+jL2XABC2MK1APzcqykulNStb2IoGwKjWrW6VV9ySVt7i7h0AM4QtzFhUuD9VV+TSJxt62IoHwEhqq/Lllba4ewVgPIQtzFpyQji1NJaxFRCA3rU1V1BqUiS5OC1k7w8ADsIW5sTbcwXlZCZQX1c9WyEB6I20glZ+dhL5ejuz9wTAVBC2MC+hQV5UVpRJ69e0sxUUgNZJK2ZVlGbJK2hx9wDATCBswS7iooOovqaQrawAtEpaKSshNoQt8wCzgbAFu3FzWUzpKdHU0VrFVlwAWtHVXkOZabHk4baULesAs4WwBbvz93WlwtwU6u9rYisyAFGtXdVCxflp8spYXNkGmCuELSgmMsyPqspy6OP13WzFBiCSmoo8eSUsriwDzBfCFhSXFB9GzQ2lbAUH4GjSilfSyldc2QWwF4QtqMLLYzllZ8RTT2cdW+EBqK2vu55ysxLJx8uJLbMA9oSwBVUFB3pSaWE6DfS3sRUggNKkFa3KizPlFa64MgqgBIQtOERsVCDVVRWwlSGAUhpqiig+JpgtkwBKQtiCw7g6L6K05Chqb6lkK0YAe+lsq5ZXsJJWsuLKIoDSELbgcH4+LpSfk0yrehvZihJgrvpXNlNhXioF+LmxZQ9ALQhbEEZEqA9VlmbTpoEutuIEmClpZarq8lyKCvdjyxqA2hC2IJzEuFBqqithK1GA6bQ0lMkrU3FlC8BRELYgJE/3ZZSVHkfdHTVshQowXm9XnbwSlbQiFVemABwJYQtCCwrwoOKCNFq7upWtYAGkFadKizIoJMiLLUMAIkDYgibERAZQbWU+W9mCcdVXF8orTnFlBkAkCFvQDJcVCyk1KZLamirYiheMo6OlSl5hys15MVtWAESDsAXN8fV2przsRFrZ3cBWxKBfq/uaqCA3mfx9XNmyASAqhC1oljQRRlpVqK25AgyguiJPfiabKwsAokPYAgAAKAxhCwAAoDCELQAAgMIQtgAAAApD2AIAACgMYQsAAKAwhC0AAIDCELYAAACK+oj+H1uATMgBRYWEAAAAAElFTkSuQmCC\" data-image-state=\"image-loaded\" width=\"238\" height=\"237\"\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 126px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 63px; text-align: left; transform-origin: 384px 63px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 231.083px 7.91667px; transform-origin: 231.083px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThis Challenge is to evaluate the complete Figure validation defined in the \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://icfpcontest2021.github.io/spec-v4.1.pdf\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eSpecification\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 113.25px 7.91667px; transform-origin: 113.25px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e when given the hole vertices in hxy, original figure vertices in pxy, updated figure vertices in npxy, segment matrix mseg, and epsilon. The hxy matrix is [N+1,2] where N is number of hole vertices. A repeat of the first vertex occurs for drawing the hole.  The pxy(original) and npxy(final) matrices are [P,2] where P is the number of figure vertices. The mseg indicates connected vertices that must maintain a length as a function of epsilon from the original length. The final figure vertices must be integer thus the allowed fuzziness of segment lengths.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 84px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 42px; text-align: left; transform-origin: 384px 42px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 381.05px 7.91667px; transform-origin: 381.05px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eValid is 1) all npxy vertices must be on or inside the hole, hxy 2) all npxy segments must match the pxy segments within an allowed epsilon, abs(Lsqr(npxy,seg(i,:))/Lsqr(pxy,seg(i,:))-1)\u0026lt;= epsilon/1000000.  Lsqr is length squared 3) No figure segments may cross hole segments. Segment vertices may touch segments. No part of any Red segment should be outside the hole shown in light grey.  \u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 21px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 10.5px; text-align: left; transform-origin: 384px 10.5px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 170.667px 7.91667px; transform-origin: 170.667px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"font-weight: 700; \"\u003eValid=check_figureS(hxy, pxy, mseg, epsilon, npxy)\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 3.88333px 7.91667px; transform-origin: 3.88333px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e  \u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 42px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 21px; text-align: left; transform-origin: 384px 21px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 97.65px 7.91667px; transform-origin: 97.65px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eCrossing Segments appears in \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://www.mathworks.com/matlabcentral/cody/problems/1720\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eCody 1720\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 242.167px 7.91667px; transform-origin: 242.167px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e but the test set is not strong. A 7/18/21 solution of size 117 is robust and fast. See the function template for reference material to solve intersecting segments.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 84px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 42px; text-align: left; transform-origin: 384px 42px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 375.883px 7.91667px; transform-origin: 375.883px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe ICFP 2021 Hole In Wall contest site has enabled a public user login to allow submissions. A login must be created to access all the problems and to submit solutions. Solutions are simple text files. Other challenges will show reading files, drawing figures, and producing submission files. To fully access the ICFP/Problems site use \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://poses.live/register\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eRegister Team\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 42.7833px 7.91667px; transform-origin: 42.7833px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e. Anyone can select \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://poses.live/problems\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eProblems Page\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 256.35px 7.91667px; transform-origin: 256.35px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e and then click problem numbers to see the puzzles and to download problem files.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e","function_template":"function valid=check_figureS(hxy,pxy,mseg,epsilon,npxy)\r\n% hxy hole vertices in order of connection. Last row repeats first for use in inpolygon\r\n% pxy figure original vertices used for initial segment length calculations\r\n% mseg is paired list of connected vertices\r\n% epsilon is allowed stretchiness of segment. hxy,pxy,npxy are all integer\r\n% npxy is figure final vertices used for scoring and Validation\r\n valid=0;\r\n nseg=size(mseg,1);\r\n msegMM=calc_msegMM(pxy,mseg,epsilon,nseg); %Create Min and Max segment integer values\r\n %hplot(hxy,pxy,mseg,size(mseg,1),1);\r\n %hplot3(hxy,npxy,mseg,size(mseg,1),3,segMM);\r\n \r\n%Confirm all final vertices of npxy are in hxy polygon\r\n[in] = inpolygon(npxy(:,1),npxy(:,2),hxy(:,1),hxy(:,2)); % inside or on edge\r\n%check if all vertices are in\r\n\r\n%Confirm all segments are of valid length squared\r\n for i=1:nseg\r\n  nsegL2=0; %calc length squared of segment\r\n  %Check if nsegL2\u003cMin or nsegL2\u003eMax  Min=msegMM(i,1) and Max=msegMM(i,2)\r\n end\r\n \r\n%Confirm all figure segments do not cross hole segments\r\n%Segment/Hole Vertices may touch other vertices and segments\r\n%Intersecting Segments was addressed in Cody 1720\r\n%https://www.mathworks.com/matlabcentral/cody/problems/1720\r\n%A Robust/Fast solution for 1720 was created on 7/18/21 of size 117\r\n \r\n valid=check_intersecting_segments(hxy,mseg,nseg,npxy);\r\nend % check_figure\r\n\r\nfunction valid=check_intersecting_segments(hxy,mseg,nseg,npxy)\r\n%Confirm no figure segments cross hole segments; \r\n % Allowed: \r\n % a) Overlaying segments. \r\n % b) Segments touching hole vertices.\r\n % c) Figure vertices touching hole segments\r\n \r\n valid=0;\r\n nhxy=size(hxy,1)-1;\r\n \r\n for i=1:nseg\r\n  A=[]; % npxy points defined by mseg   A=[a1 a2;a3 a4]\r\n  for j=1:nhxy  %1-2,2-3, end-1 to end  thus why nhxy is 1 less than rows\r\n   B=[]; % hxy points    B=[b1 b2;b3 b4]\r\n   if intersecting(A,B), return;end % intersect detected thus fail\r\n  end\r\n end\r\n \r\n valid=1;\r\nend % check_intersecting_segments\r\n\r\nfunction tf=intersecting(A,B) %\r\n%Correct full solution requires two cross product checks which can be implemented using det\r\n%Segment A [A1;A2],  Segment B [B1;B2]\r\n% Points A1=[a1,a2] A2=[a3,a4] B1=[b1 b2] B2=[b3 b4]  All data in z=0 plane\r\n%p0= B2A1 x B2B1 is det([B2A1;B2B1]) where B2A1 = B2-A1= [b3-a1 b4-a2], B2B1=B2-B1=[b3-b1 b4-b2]\r\n%p1= B2A2 x B2B1 is det([B2A2;B2B1]) where B2A2 = B2-A2= [b3-a3 b4-a4], B2B1=B2-B1=[b3-b1 b4-b2]\r\n%p2= A2B1 x A2A1 is det([A2B1;A2A1]) where A2B1 = A2-B1= [a3-b1 a4-b2], A2A1=A2-A1=[a3-a1 a4-a2]\r\n%p3= A2B2 x A2A1 is det([A2B2;A2A1]) where A2B2 = A2-B2= [a3-b3 a4-b4], A2A1=A2-A1=[a3-a1 a4-a2]\r\n%visualization https://www.desmos.com/calculator/0wr2rfkjbk\r\n%source https://stackoverflow.com/questions/3838329/how-can-i-check-if-two-segments-intersect\r\n% by BenMan95 in ghastly Python not using det or matlab array vectors\r\n%https://www.mathworks.com/matlabcentral/cody/problems/1720\r\n%  Robust Fast solution of size 117 created on 7/18/21 for 1720\r\n%\r\n% Both cross product pair multiplications must be negative for an intersection to occur\r\n% p0p1\u003c0 \u0026\u0026 p2p3\u003c0 for non-endpoint segments intersection. For End point intersection change \u003c to \u003c=\r\n\r\ntf=0;\r\nend % intersecting\r\n\r\n\r\nfunction msegMM=calc_msegMM(pxy,mseg,epsilon,nseg)\r\n%determine Min and Max integer value of allowed length squared for each segment\r\n%abs(Lsqr(npxy,seg(i))/Lsqr(pxy,seg(i))-1)\u003c= epsilon/1000000.\r\n%mseg has indices of connected vertices [nseg,2].  The nseg may exceed number of vertices.\r\n msegMM=zeros(nseg,2);\r\n for i=1:nseg\r\n  Lseg=0; % sum((pxy(mseg(i,1),:)-pxy(mseg(i,2),:)).^2)\r\n  delta=0; % epsilon*Lseg/1000000 and a little tweak\r\n  msegMM(i,:)=[-delta delta]+Lseg;\r\n end\r\nend % calc_msegMM\r\n\r\n%These routines can be used to visualize the data\r\n\r\n% function hplot(vxy,qxy,mseg,Lmseg,id)\r\n% %Need check of segment crossing a hole segment but ignore endpoint\r\n%  [in] = inpolygon(qxy(:,1),qxy(:,2),vxy(:,1),vxy(:,2)); % inside or on edge\r\n%  figure(id)\r\n%   plot(vxy(:,1),vxy(:,2),'k.-') % hole polygon\r\n%   hold on\r\n%   plot(qxy(in,1),qxy(in,2),'b*') % points inside\r\n%   plot(qxy(~in,1),qxy(~in,2),'ro') % points outside\r\n%   for i=1:size(qxy,1)%length(xq)\r\n%    text(qxy(i,1)+.75,qxy(i,2)-1.5,num2str(i),'FontSize',12);\r\n%   end\r\n%   \r\n%   for i=1:Lmseg\r\n%    if in(mseg(i,1))+in(mseg(i,2))\u003c2\r\n%      plot(qxy(mseg(i,:),1),qxy(mseg(i,:),2),'r-') % segment to OOB pt\r\n%    else\r\n%     plot(qxy(mseg(i,:),1),qxy(mseg(i,:),2),'b-')\r\n%    end\r\n%    text(sum(qxy(mseg(i,:),1))/2,sum(qxy(mseg(i,:),2))/2,num2str(i),'Color','b');\r\n%   end\r\n%   \r\n%   %o+*.x_|sd^v\u003e\u003cph\r\n%   %colors ymcrgbwk\r\n%    \r\n%   axis tight\r\n%   axis ij\r\n%   hold off  \r\n% end % hplot\r\n\r\n% function hplot3(vxy,qxy,mseg,Lmseg,id,segMM)\r\n%  segMNM=[segMM(:,1) segMM(:,1)+segMM(:,2) segMM(:,2)];\r\n%  [in] = inpolygon(qxy(:,1),qxy(:,2),vxy(:,1),vxy(:,2)); % inside or on edge\r\n%  figure(id)\r\n%   plot(vxy(:,1),vxy(:,2),'k.-') % hole polygon\r\n%   hold on\r\n%   plot(qxy(in,1),qxy(in,2),'b*') % points inside\r\n%   plot(qxy(~in,1),qxy(~in,2),'ro') % points outside\r\n%   for i=1:size(qxy,1) %length(xq)\r\n%    text(qxy(i,1)+.75,qxy(i,2)-1.5,num2str(i));\r\n%   end\r\n%   \r\n%   for i=1:Lmseg\r\n%    d2seg=(qxy(mseg(i,1),1)-qxy(mseg(i,2),1))^2+(qxy(mseg(i,1),2)-qxy(mseg(i,2),2))^2;\r\n%    if d2seg\u003csegMNM(i,1)\r\n%      plot(qxy(mseg(i,:),1),qxy(mseg(i,:),2),'b-') % segment too short\r\n%    elseif d2seg\u003esegMNM(i,3)\r\n%      plot(qxy(mseg(i,:),1),qxy(mseg(i,:),2),'r-') % segment too long\r\n%    else\r\n%     plot(qxy(mseg(i,:),1),qxy(mseg(i,:),2),'g-') \r\n%    end\r\n%    text(sum(qxy(mseg(i,:),1))/2,sum(qxy(mseg(i,:),2))/2,num2str(i),'Color','b');\r\n%   end\r\n%   \r\n%   %o+*.x_|sd^v\u003e\u003cph\r\n%   %colors ymcrgbwk\r\n%   \r\n%   axis tight\r\n%   axis ij\r\n%   hold off\r\n% end % hplot3\r\n%","test_suite":"%%\r\nhxy=[53 0;100 22;66 68;43 68;0 41;53 0];\r\npxy=[0    48\r\n     9    34\r\n    14    34\r\n    27    41\r\n    30    53\r\n    33    68\r\n    44     0\r\n    44    58\r\n    44    63\r\n    56    68\r\n    59    53\r\n    61    41\r\n    89    21];\r\nmseg=[8     7\r\n     7     4\r\n     4     8\r\n     4     5\r\n     5     8\r\n     8     9\r\n     9     6\r\n     6     5\r\n     9    10\r\n    10    11\r\n    11     8\r\n     8    12\r\n    12    11\r\n    12     7\r\n    10    13\r\n    13     9\r\n     6     2\r\n     2     3\r\n     3     9\r\n     3     1\r\n     1     2];\r\nepsilon=40000;\r\nnpxy=[0    41\r\n    16    36\r\n    20    39\r\n    37    41\r\n    40    53\r\n    43    68\r\n    53     0\r\n    54    58\r\n    54    63\r\n    66    68\r\n    69    53\r\n    71    41\r\n   100    22];\r\nValid=check_figureS(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=1;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nhxy=[53 0;100 22;66 68;43 68;0 41;53 0];\r\npxy=[0    48\r\n     9    34\r\n    14    34\r\n    27    41\r\n    30    53\r\n    33    68\r\n    44     0\r\n    44    58\r\n    44    63\r\n    56    68\r\n    59    53\r\n    61    41\r\n    89    21];\r\nmseg=[8     7\r\n     7     4\r\n     4     8\r\n     4     5\r\n     5     8\r\n     8     9\r\n     9     6\r\n     6     5\r\n     9    10\r\n    10    11\r\n    11     8\r\n     8    12\r\n    12    11\r\n    12     7\r\n    10    13\r\n    13     9\r\n     6     2\r\n     2     3\r\n     3     9\r\n     3     1\r\n     1     2];\r\nepsilon=40000;\r\nnpxy=pxy;\r\nValid=check_figureS(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nhxy=[53 0;100 22;66 68;43 68;0 41;53 0];\r\npxy=[0    48\r\n     9    34\r\n    14    34\r\n    27    41\r\n    30    53\r\n    33    68\r\n    44     0\r\n    44    58\r\n    44    63\r\n    56    68\r\n    59    53\r\n    61    41\r\n    89    21];\r\nmseg=[8     7\r\n     7     4\r\n     4     8\r\n     4     5\r\n     5     8\r\n     8     9\r\n     9     6\r\n     6     5\r\n     9    10\r\n    10    11\r\n    11     8\r\n     8    12\r\n    12    11\r\n    12     7\r\n    10    13\r\n    13     9\r\n     6     2\r\n     2     3\r\n     3     9\r\n     3     1\r\n     1     2];\r\nepsilon=40000;\r\nnpxy=[0    41\r\n    16    36\r\n    20    39\r\n    37    41\r\n    40    53\r\n    43    68\r\n    53     0+10\r\n    54    58\r\n    54    63\r\n    66    68\r\n    69    53\r\n    71    41\r\n   100    22];\r\nValid=check_figureS(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nhxy=[53 0;100 22;66 68;43 68;0 41;53 0];\r\npxy=[0    48\r\n     9    34\r\n    14    34\r\n    27    41\r\n    30    53\r\n    33    68\r\n    44     0\r\n    44    58\r\n    44    63\r\n    56    68\r\n    59    53\r\n    61    41\r\n    89    21];\r\nmseg=[8     7\r\n     7     4\r\n     4     8\r\n     4     5\r\n     5     8\r\n     8     9\r\n     9     6\r\n     6     5\r\n     9    10\r\n    10    11\r\n    11     8\r\n     8    12\r\n    12    11\r\n    12     7\r\n    10    13\r\n    13     9\r\n     6     2\r\n     2     3\r\n     3     9\r\n     3     1\r\n     1     2];\r\nepsilon=40000;\r\nnpxy=[0    41\r\n    16    36\r\n    20    39\r\n    37    41\r\n    40    53\r\n    43    68\r\n    53     0\r\n    54    58\r\n    54    63\r\n    66    68\r\n    69    53\r\n    71    41\r\n   100    22];\r\nValid=check_figureS(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=1;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nhxy=[53 0;100 22;66 68;43 68;0 41;53 0];\r\npxy=[0    48\r\n     9    34\r\n    14    34\r\n    27    41\r\n    30    53\r\n    33    68\r\n    44     0\r\n    44    58\r\n    44    63\r\n    56    68\r\n    59    53\r\n    61    41\r\n    89    21];\r\nmseg=[8     7\r\n     7     4\r\n     4     8\r\n     4     5\r\n     5     8\r\n     8     9\r\n     9     6\r\n     6     5\r\n     9    10\r\n    10    11\r\n    11     8\r\n     8    12\r\n    12    11\r\n    12     7\r\n    10    13\r\n    13     9\r\n     6     2\r\n     2     3\r\n     3     9\r\n     3     1\r\n     1     2];\r\nepsilon=40000;\r\nnpxy=[0.001    41\r\n    16    36\r\n    20    39\r\n    37    41\r\n    40    53\r\n    43    68\r\n    53     0\r\n    54    58\r\n    54    63\r\n    66    68\r\n    69    53\r\n    71    41\r\n   100    22];\r\nValid=check_figureS(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0; %non-integer npxy\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nhxy=[53 0;100 22;66 68;43 68;0 41;53 0];\r\npxy=[0    48\r\n     9    34\r\n    14    34\r\n    27    41\r\n    30    53\r\n    33    68\r\n    44     0\r\n    44    58\r\n    44    63\r\n    56    68\r\n    59    53\r\n    61    41\r\n    89    21];\r\nmseg=[8     7\r\n     7     4\r\n     4     8\r\n     4     5\r\n     5     8\r\n     8     9\r\n     9     6\r\n     6     5\r\n     9    10\r\n    10    11\r\n    11     8\r\n     8    12\r\n    12    11\r\n    12     7\r\n    10    13\r\n    13     9\r\n     6     2\r\n     2     3\r\n     3     9\r\n     3     1\r\n     1     2];\r\nepsilon=40000;\r\nnpxy=[0    41\r\n    16+1    36\r\n    20    39\r\n    37    41\r\n    40    53\r\n    43    68\r\n    53     0\r\n    54    58\r\n    54    63\r\n    66    68\r\n    69    53\r\n    71    41\r\n   100    22];\r\nValid=check_figureS(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nhxy=[15     0\r\n    35    20\r\n    20    44\r\n     0    24\r\n    15     0];\r\npxy=[0    20\r\n    20     0\r\n    20    40\r\n    40    20\r\n    49    45];\r\nmseg=[1     2\r\n     1     3\r\n     2     4\r\n     3     4\r\n     3     5\r\n     4     5];\r\nepsilon=1250;\r\nnpxy=[20    44\r\n     0    24\r\n    35    20\r\n    15     0\r\n     6    25];\r\nValid=check_figureS(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=1;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n\r\n%%\r\n% Problem 6 shifted up7,left10, 1 seg fail\r\nepsilon=150000;\r\nhxy=[164   164\r\n   121   189\r\n    71   189\r\n    28   164\r\n     3   121\r\n     3    71\r\n    28    28\r\n    71     3\r\n   121     3\r\n   164    28\r\n   189    71\r\n    96    96\r\n   189   121\r\n   164   164];\r\npxy=[36    86\r\n    36   141\r\n    36   156\r\n    41   156\r\n    46   131\r\n    51    56\r\n    56   116\r\n    56   141\r\n    66   116\r\n    71    81\r\n    71    96\r\n    71   131\r\n    71   156\r\n    86    81\r\n    86    96\r\n    86   131\r\n    86   141\r\n    86   156\r\n    91   116\r\n    96    36\r\n   101   116\r\n   106    81\r\n   106    96\r\n   106   131\r\n   106   141\r\n   106   156\r\n   121    81\r\n   121    96\r\n   121   131\r\n   121   156\r\n   126   116\r\n   136   116\r\n   136   141\r\n   141    56\r\n   146   131\r\n   151   156\r\n   156    86\r\n   156   141\r\n   156   156];\r\nmseg=[2     3\r\n     3     4\r\n     4     8\r\n     8     2\r\n     2     1\r\n     1     6\r\n     6    20\r\n    20    34\r\n    34    37\r\n    37    38\r\n    38    33\r\n    33    36\r\n    36    39\r\n    39    38\r\n    33    30\r\n    30    26\r\n    26    25\r\n    25    33\r\n     8    17\r\n    17    18\r\n    18    13\r\n    13     8\r\n    17    25\r\n    10    11\r\n    11    15\r\n    15    14\r\n    14    10\r\n    22    23\r\n    23    28\r\n    28    27\r\n    27    22\r\n     6    10\r\n    10     1\r\n    34    27\r\n    27    37\r\n     5     7\r\n     7     9\r\n     9    12\r\n    12    16\r\n    16    19\r\n    19    21\r\n    21    24\r\n    24    29\r\n    29    31\r\n    31    32\r\n    32    35\r\n    15    19\r\n    23    21];\r\nnpxy=[26    79\r\n    26   134\r\n    26   149\r\n    31   149\r\n    36   124\r\n    41    49\r\n    46   109\r\n    46   134\r\n    56   109\r\n    61    74\r\n    61    89\r\n    61   124\r\n    61   149\r\n    76    74\r\n    76    89\r\n    76   124\r\n    76   134\r\n    76   149\r\n    81   109\r\n    86    29\r\n    91   109\r\n    96    74\r\n    96    89\r\n    96   124\r\n    96   134\r\n    96   149\r\n   111    74\r\n   111    89\r\n   111   124\r\n   111   149\r\n   116   109\r\n   126   109\r\n   126   134\r\n   131    49\r\n   136   124\r\n   141   149\r\n   146    79\r\n   146   134\r\n   146   149];\r\nValid=check_figureS(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\n%problem 6 with rotate/shift, 1 seg fail\r\nepsilon=150000;\r\nhxy=[164   164\r\n   121   189\r\n    71   189\r\n    28   164\r\n     3   121\r\n     3    71\r\n    28    28\r\n    71     3\r\n   121     3\r\n   164    28\r\n   189    71\r\n    96    96\r\n   189   121\r\n   164   164];\r\npxy=[36    86\r\n    36   141\r\n    36   156\r\n    41   156\r\n    46   131\r\n    51    56\r\n    56   116\r\n    56   141\r\n    66   116\r\n    71    81\r\n    71    96\r\n    71   131\r\n    71   156\r\n    86    81\r\n    86    96\r\n    86   131\r\n    86   141\r\n    86   156\r\n    91   116\r\n    96    36\r\n   101   116\r\n   106    81\r\n   106    96\r\n   106   131\r\n   106   141\r\n   106   156\r\n   121    81\r\n   121    96\r\n   121   131\r\n   121   156\r\n   126   116\r\n   136   116\r\n   136   141\r\n   141    56\r\n   146   131\r\n   151   156\r\n   156    86\r\n   156   141\r\n   156   156];\r\nmseg=[2     3\r\n     3     4\r\n     4     8\r\n     8     2\r\n     2     1\r\n     1     6\r\n     6    20\r\n    20    34\r\n    34    37\r\n    37    38\r\n    38    33\r\n    33    36\r\n    36    39\r\n    39    38\r\n    33    30\r\n    30    26\r\n    26    25\r\n    25    33\r\n     8    17\r\n    17    18\r\n    18    13\r\n    13     8\r\n    17    25\r\n    10    11\r\n    11    15\r\n    15    14\r\n    14    10\r\n    22    23\r\n    23    28\r\n    28    27\r\n    27    22\r\n     6    10\r\n    10     1\r\n    34    27\r\n    27    37\r\n     5     7\r\n     7     9\r\n     9    12\r\n    12    16\r\n    16    19\r\n    19    21\r\n    21    24\r\n    24    29\r\n    29    31\r\n    31    32\r\n    32    35\r\n    15    19\r\n    23    21];\r\nnpxy=[53   156\r\n   108   156\r\n   123   156\r\n   123   151\r\n    98   146\r\n    23   141\r\n    83   136\r\n   108   136\r\n    83   126\r\n    48   121\r\n    63   121\r\n    98   121\r\n   123   121\r\n    48   106\r\n    63   106\r\n    98   106\r\n   108   106\r\n   123   106\r\n    83   101\r\n     3    96\r\n    83    91\r\n    48    86\r\n    63    86\r\n    98    86\r\n   108    86\r\n   123    86\r\n    48    71\r\n    63    71\r\n    98    71\r\n   123    71\r\n    83    66\r\n    83    56\r\n   108    56\r\n    23    51\r\n    98    46\r\n   123    41\r\n    53    36\r\n   108    36\r\n   123    36];\r\nValid=check_figureS(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":2,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2021-07-18T21:43:20.000Z","updated_at":"2021-07-19T01:11:39.000Z","published_at":"2021-07-19T01:11:39.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://www.icfpconference.org/\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eICFP\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e held its annual 3-day contest in July 2021 with \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://icfpcontest2021.github.io/\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eHole-In-Wall\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. Contest \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://icfpcontest2021.github.io/spec-v4.1.pdf\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eSpecification\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe contest folds the figure in Red to fit within the hole shown in light grey \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:customXml w:element=\\\"image\\\"\u003e\u003cw:customXmlPr\u003e\u003cw:attr w:name=\\\"height\\\" w:val=\\\"237\\\"/\u003e\u003cw:attr w:name=\\\"width\\\" w:val=\\\"238\\\"/\u003e\u003cw:attr w:name=\\\"verticalAlign\\\" w:val=\\\"middle\\\"/\u003e\u003cw:attr w:name=\\\"altText\\\" w:val=\\\"\\\"/\u003e\u003cw:attr w:name=\\\"relationshipId\\\" w:val=\\\"rId1\\\"/\u003e\u003c/w:customXmlPr\u003e\u003c/w:customXml\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis Challenge is to evaluate the complete Figure validation defined in the \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://icfpcontest2021.github.io/spec-v4.1.pdf\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eSpecification\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e when given the hole vertices in hxy, original figure vertices in pxy, updated figure vertices in npxy, segment matrix mseg, and epsilon. The hxy matrix is [N+1,2] where N is number of hole vertices. A repeat of the first vertex occurs for drawing the hole.  The pxy(original) and npxy(final) matrices are [P,2] where P is the number of figure vertices. The mseg indicates connected vertices that must maintain a length as a function of epsilon from the original length. The final figure vertices must be integer thus the allowed fuzziness of segment lengths.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eValid is 1) all npxy vertices must be on or inside the hole, hxy 2) all npxy segments must match the pxy segments within an allowed epsilon, abs(Lsqr(npxy,seg(i,:))/Lsqr(pxy,seg(i,:))-1)\u0026lt;= epsilon/1000000.  Lsqr is length squared 3) No figure segments may cross hole segments. Segment vertices may touch segments. No part of any Red segment should be outside the hole shown in light grey.  \u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eValid=check_figureS(hxy, pxy, mseg, epsilon, npxy)\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e  \u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eCrossing Segments appears in \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://www.mathworks.com/matlabcentral/cody/problems/1720\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eCody 1720\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e but the test set is not strong. A 7/18/21 solution of size 117 is robust and fast. See the function template for reference material to solve intersecting segments.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe ICFP 2021 Hole In Wall contest site has enabled a public user login to allow submissions. A login must be created to access all the problems and to submit solutions. Solutions are simple text files. Other challenges will show reading files, drawing figures, and producing submission files. To fully access the ICFP/Problems site use \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://poses.live/register\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eRegister Team\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. Anyone can select \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://poses.live/problems\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eProblems Page\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e and then click problem numbers to see the puzzles and to download problem files.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\",\"relationship\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"target\":\"/media/image1.png\",\"relationshipId\":\"rId1\"}]},{\"partUri\":\"/media/image1.png\",\"contentType\":\"image/png\",\"content\":\"data:image/png;base64,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\",\"relationship\":null}],\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"target\":\"/matlab/document.xml\",\"relationshipId\":\"rId1\"}]}"},{"id":52334,"title":"ICFP2021 Hole-In-Wall: Figure Validation with Segment Crossing and Segment on Wall Checks","description":"The ICFP held its annual 3-day contest in July 2021 with Hole-In-Wall. Contest Specification.\r\nThe contest folds the figure in Red to fit within the hole shown in light grey \r\nThis Challenge is to evaluate the complete Figure validation defined in the Specification when given the hole vertices in hxy, original figure vertices in pxy, updated figure vertices in npxy, segment matrix mseg, and epsilon. The hxy matrix is [N+1,2] where N is number of hole vertices. A repeat of the first vertex occurs for drawing the hole.  The pxy(original) and npxy(final) matrices are [P,2] where P is the number of figure vertices. The mseg indicates connected vertices that must maintain a length as a function of epsilon from the original length. The final figure vertices must be integer thus the allowed fuzziness of segment lengths.\r\nValid is 1) all npxy vertices must be on or inside the hole, hxy 2) all npxy segments must match the pxy segments within an allowed epsilon, abs(Lsqr(npxy,seg(i,:))/Lsqr(pxy,seg(i,:))-1)\u003c= epsilon/1000000.  Lsqr is length squared 3) No figure segments may cross hole segments. Segment vertices may touch segments. No part of any Red segment should be outside the hole shown in light grey.   4) Pathological cases of Segments crossing Wall region between Hole Vertices or from figure vertices on Hole edges is not allowed.\r\nValid=check_figureSP(hxy, pxy, mseg, epsilon, npxy)  \r\nCrossing Segments appears in Cody 1720 but the test set is not strong. A 7/18/21 solution of size 117 is robust and fast. See the function template for reference material to solve intersecting segments.\r\nThe ICFP 2021 Hole In Wall contest site has enabled a public user login to allow submissions. A login must be created to access all the problems and to submit solutions. Solutions are simple text files. Other challenges will show reading files, drawing figures, and producing submission files. To fully access the ICFP/Problems site use Register Team. Anyone can select Problems Page and then click problem numbers to see the puzzles and to download problem files.","description_html":"\u003cdiv style = \"text-align: start; line-height: 20.4333px; min-height: 0px; white-space: normal; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, monospace; font-style: normal; font-size: 14px; font-weight: 400; text-decoration: rgb(0, 0, 0); white-space: normal; \"\u003e\u003cdiv style=\"block-size: 690px; display: block; min-width: 0px; padding-block-start: 0px; padding-top: 0px; perspective-origin: 407px 345px; transform-origin: 407px 345px; vertical-align: baseline; \"\u003e\u003cdiv style=\"block-size: 21px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 10.5px; text-align: left; transform-origin: 384px 10.5px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 14px 7.91667px; transform-origin: 14px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://www.icfpconference.org/\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eICFP\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 146.65px 7.91667px; transform-origin: 146.65px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e held its annual 3-day contest in July 2021 with \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://icfpcontest2021.github.io/\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eHole-In-Wall\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 29.95px 7.91667px; transform-origin: 29.95px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e. Contest \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://icfpcontest2021.github.io/spec-v4.1.pdf\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eSpecification\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 1.95px 7.91667px; transform-origin: 1.95px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 237px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 118.5px; text-align: left; transform-origin: 384px 118.5px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 230.267px 7.91667px; transform-origin: 230.267px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe contest folds the figure in Red to fit within the hole shown in light grey \u003c/span\u003e\u003c/span\u003e\u003cimg class=\"imageNode\" style=\"vertical-align: middle;width: 238px;height: 237px\" src=\"data:image/png;base64,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\" data-image-state=\"image-loaded\" width=\"238\" height=\"237\"\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 126px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 63px; text-align: left; transform-origin: 384px 63px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 231.083px 7.91667px; transform-origin: 231.083px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThis Challenge is to evaluate the complete Figure validation defined in the \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://icfpcontest2021.github.io/spec-v4.1.pdf\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eSpecification\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 113.25px 7.91667px; transform-origin: 113.25px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e when given the hole vertices in hxy, original figure vertices in pxy, updated figure vertices in npxy, segment matrix mseg, and epsilon. The hxy matrix is [N+1,2] where N is number of hole vertices. A repeat of the first vertex occurs for drawing the hole.  The pxy(original) and npxy(final) matrices are [P,2] where P is the number of figure vertices. The mseg indicates connected vertices that must maintain a length as a function of epsilon from the original length. The final figure vertices must be integer thus the allowed fuzziness of segment lengths.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 105px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 52.5px; text-align: left; transform-origin: 384px 52.5px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 381.05px 7.91667px; transform-origin: 381.05px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eValid is 1) all npxy vertices must be on or inside the hole, hxy 2) all npxy segments must match the pxy segments within an allowed epsilon, abs(Lsqr(npxy,seg(i,:))/Lsqr(pxy,seg(i,:))-1)\u0026lt;= epsilon/1000000.  Lsqr is length squared 3) No figure segments may cross hole segments. Segment vertices may touch segments. No part of any Red segment should be outside the hole shown in light grey.   4) Pathological cases of Segments crossing Wall region between Hole Vertices or from figure vertices on Hole edges is not allowed.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 21px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 10.5px; text-align: left; transform-origin: 384px 10.5px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 175.333px 7.91667px; transform-origin: 175.333px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"font-weight: 700; \"\u003eValid=check_figureSP(hxy, pxy, mseg, epsilon, npxy)\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 3.88333px 7.91667px; transform-origin: 3.88333px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e  \u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 42px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 21px; text-align: left; transform-origin: 384px 21px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 97.65px 7.91667px; transform-origin: 97.65px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eCrossing Segments appears in \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://www.mathworks.com/matlabcentral/cody/problems/1720\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eCody 1720\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 242.167px 7.91667px; transform-origin: 242.167px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e but the test set is not strong. A 7/18/21 solution of size 117 is robust and fast. See the function template for reference material to solve intersecting segments.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 84px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 42px; text-align: left; transform-origin: 384px 42px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 375.883px 7.91667px; transform-origin: 375.883px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe ICFP 2021 Hole In Wall contest site has enabled a public user login to allow submissions. A login must be created to access all the problems and to submit solutions. Solutions are simple text files. Other challenges will show reading files, drawing figures, and producing submission files. To fully access the ICFP/Problems site use \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://poses.live/register\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eRegister Team\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 42.7833px 7.91667px; transform-origin: 42.7833px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e. Anyone can select \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://poses.live/problems\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eProblems Page\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 256.35px 7.91667px; transform-origin: 256.35px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e and then click problem numbers to see the puzzles and to download problem files.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e","function_template":"function valid=check_figureSP(hxy,pxy,mseg,epsilon,npxy)\r\n% hxy hole vertices in order of connection. Last row repeats first for use in inpolygon\r\n% pxy figure original vertices used for initial segment length calculations\r\n% mseg is paired list of connected vertices\r\n% epsilon is allowed stretchiness of segment. hxy,pxy,npxy are all integer\r\n% npxy is figure final vertices used for scoring and Validation\r\n valid=0;\r\n nseg=size(mseg,1);\r\n msegMM=calc_msegMM(pxy,mseg,epsilon,nseg); %Create Min and Max segment integer values\r\n %hplot(hxy,pxy,mseg,size(mseg,1),1);\r\n %hplot3(hxy,npxy,mseg,size(mseg,1),3,segMM);\r\n \r\n%Confirm all final vertices of npxy are in hxy polygon\r\n[in] = inpolygon(npxy(:,1),npxy(:,2),hxy(:,1),hxy(:,2)); % inside or on edge\r\n%check if all vertices are in\r\n\r\n%Confirm all segments are of valid length squared\r\n for i=1:nseg\r\n  nsegL2=0; %calc length squared of segment\r\n  %Check if nsegL2\u003cMin or nsegL2\u003eMax  Min=msegMM(i,1) and Max=msegMM(i,2)\r\n end\r\n \r\n%Confirm all figure segments do not cross hole segments\r\n%Segment/Hole Vertices may touch other vertices and segments\r\n%Intersecting Segments was addressed in Cody 1720\r\n%https://www.mathworks.com/matlabcentral/cody/problems/1720\r\n%A Robust/Fast solution for 1720 was created on 7/18/21 of size 117\r\n \r\n valid=check_intersecting_segments(hxy,mseg,nseg,npxy);\r\n if valid==0,return;end\r\n \r\n valid=check_segments_inpoly(hxy,mseg,npxy);\r\nend % check_figureSP\r\n\r\nfunction valid=check_segments_inpoly(hxy,mseg,npxy)\r\n%Verify whole of segments are within the hole\r\n%Method: Test point along segment at distance \u003c=0.5 from segment start point\r\n valid=0;\r\n dpxy=[]; % start point for each segment\r\n %intra-segment create a point a small delta from starting point; \r\n %mid-point not sufficient\r\n dxdy=[];\r\n dxdyabsmax=[];  % Note: max has a new form of max(m,[],2) to get row max values\r\n dpxy=dpxy+dxdy./dxdyabsmax;\r\n \r\n [in] = inpolygon(dpxy(:,1),dpxy(:,2),hxy(:,1),hxy(:,2)); % inside or on edge\r\n if nnz(in==0),return;end  %nnz is fastest check of a vector all condition\r\n \r\n valid=1;\r\nend %check_segments_inpoly\r\n\r\nfunction valid=check_intersecting_segments(hxy,mseg,nseg,npxy)\r\n%Confirm no figure segments cross hole segments; \r\n % Allowed: \r\n % a) Overlaying segments. \r\n % b) Segments touching hole vertices.\r\n % c) Figure vertices touching hole segments\r\n \r\n valid=0;\r\n nhxy=size(hxy,1)-1;\r\n \r\n for i=1:nseg\r\n  A=[]; % npxy points defined by mseg   A=[a1 a2;a3 a4]\r\n  for j=1:nhxy  %1-2,2-3, end-1 to end  thus why nhxy is 1 less than rows\r\n   B=[]; % hxy points    B=[b1 b2;b3 b4]\r\n   if intersecting(A,B), return;end % intersect detected thus fail\r\n  end\r\n end\r\n \r\n valid=1;\r\nend % check_intersecting_segments\r\n\r\nfunction tf=intersecting(A,B) %\r\n%Correct full solution requires two cross product checks which can be implemented using det\r\n%Segment A [A1;A2],  Segment B [B1;B2]\r\n% Points A1=[a1,a2] A2=[a3,a4] B1=[b1 b2] B2=[b3 b4]  All data in z=0 plane\r\n%p0= B2A1 x B2B1 is det([B2A1;B2B1]) where B2A1 = B2-A1= [b3-a1 b4-a2], B2B1=B2-B1=[b3-b1 b4-b2]\r\n%p1= B2A2 x B2B1 is det([B2A2;B2B1]) where B2A2 = B2-A2= [b3-a3 b4-a4], B2B1=B2-B1=[b3-b1 b4-b2]\r\n%p2= A2B1 x A2A1 is det([A2B1;A2A1]) where A2B1 = A2-B1= [a3-b1 a4-b2], A2A1=A2-A1=[a3-a1 a4-a2]\r\n%p3= A2B2 x A2A1 is det([A2B2;A2A1]) where A2B2 = A2-B2= [a3-b3 a4-b4], A2A1=A2-A1=[a3-a1 a4-a2]\r\n%visualization https://www.desmos.com/calculator/0wr2rfkjbk\r\n%source https://stackoverflow.com/questions/3838329/how-can-i-check-if-two-segments-intersect\r\n% by BenMan95 in ghastly Python not using det or matlab array vectors\r\n%https://www.mathworks.com/matlabcentral/cody/problems/1720\r\n%  Robust Fast solution of size 117 created on 7/18/21 for 1720\r\n%\r\n% Both cross product pair multiplications must be negative for an intersection to occur\r\n% p0p1\u003c0 \u0026\u0026 p2p3\u003c0 for non-endpoint segments intersection. For End point intersection change \u003c to \u003c=\r\n\r\ntf=0;\r\nend % intersecting\r\n\r\n\r\nfunction msegMM=calc_msegMM(pxy,mseg,epsilon,nseg)\r\n%determine Min and Max integer value of allowed length squared for each segment\r\n%abs(Lsqr(npxy,seg(i))/Lsqr(pxy,seg(i))-1)\u003c= epsilon/1000000.\r\n%mseg has indices of connected vertices [nseg,2].  The nseg may exceed number of vertices.\r\n msegMM=zeros(nseg,2);\r\n for i=1:nseg\r\n  Lseg=0; % sum((pxy(mseg(i,1),:)-pxy(mseg(i,2),:)).^2)\r\n  delta=0; % epsilon*Lseg/1000000 and a little tweak\r\n  msegMM(i,:)=[-delta delta]+Lseg;\r\n end\r\nend % calc_msegMM\r\n\r\n%These routines can be used to visualize the data\r\n\r\n% function hplot(vxy,qxy,mseg,Lmseg,id)\r\n% %Need check of segment crossing a hole segment but ignore endpoint\r\n%  [in] = inpolygon(qxy(:,1),qxy(:,2),vxy(:,1),vxy(:,2)); % inside or on edge\r\n%  figure(id)\r\n%   plot(vxy(:,1),vxy(:,2),'k.-') % hole polygon\r\n%   hold on\r\n%   plot(qxy(in,1),qxy(in,2),'b*') % points inside\r\n%   plot(qxy(~in,1),qxy(~in,2),'ro') % points outside\r\n%   for i=1:size(qxy,1)%length(xq)\r\n%    text(qxy(i,1)+.75,qxy(i,2)-1.5,num2str(i),'FontSize',12);\r\n%   end\r\n%   \r\n%   for i=1:Lmseg\r\n%    if in(mseg(i,1))+in(mseg(i,2))\u003c2\r\n%      plot(qxy(mseg(i,:),1),qxy(mseg(i,:),2),'r-') % segment to OOB pt\r\n%    else\r\n%     plot(qxy(mseg(i,:),1),qxy(mseg(i,:),2),'b-')\r\n%    end\r\n%    text(sum(qxy(mseg(i,:),1))/2,sum(qxy(mseg(i,:),2))/2,num2str(i),'Color','b');\r\n%   end\r\n%   \r\n%   %o+*.x_|sd^v\u003e\u003cph\r\n%   %colors ymcrgbwk\r\n%    \r\n%   axis tight\r\n%   axis ij\r\n%   hold off  \r\n% end % hplot\r\n\r\n% function hplot3(vxy,qxy,mseg,Lmseg,id,segMM)\r\n%  segMNM=[segMM(:,1) segMM(:,1)+segMM(:,2) segMM(:,2)];\r\n%  [in] = inpolygon(qxy(:,1),qxy(:,2),vxy(:,1),vxy(:,2)); % inside or on edge\r\n%  figure(id)\r\n%   plot(vxy(:,1),vxy(:,2),'k.-') % hole polygon\r\n%   hold on\r\n%   plot(qxy(in,1),qxy(in,2),'b*') % points inside\r\n%   plot(qxy(~in,1),qxy(~in,2),'ro') % points outside\r\n%   for i=1:size(qxy,1) %length(xq)\r\n%    text(qxy(i,1)+.75,qxy(i,2)-1.5,num2str(i));\r\n%   end\r\n%   \r\n%   for i=1:Lmseg\r\n%    d2seg=(qxy(mseg(i,1),1)-qxy(mseg(i,2),1))^2+(qxy(mseg(i,1),2)-qxy(mseg(i,2),2))^2;\r\n%    if d2seg\u003csegMNM(i,1)\r\n%      plot(qxy(mseg(i,:),1),qxy(mseg(i,:),2),'b-') % segment too short\r\n%    elseif d2seg\u003esegMNM(i,3)\r\n%      plot(qxy(mseg(i,:),1),qxy(mseg(i,:),2),'r-') % segment too long\r\n%    else\r\n%     plot(qxy(mseg(i,:),1),qxy(mseg(i,:),2),'g-') \r\n%    end\r\n%    text(sum(qxy(mseg(i,:),1))/2,sum(qxy(mseg(i,:),2))/2,num2str(i),'Color','b');\r\n%   end\r\n%   \r\n%   %o+*.x_|sd^v\u003e\u003cph\r\n%   %colors ymcrgbwk\r\n%   \r\n%   axis tight\r\n%   axis ij\r\n%   hold off\r\n% end % hplot3\r\n%","test_suite":"%%\r\nhxy=[53 0;100 22;66 68;43 68;0 41;53 0];\r\npxy=[0    48\r\n     9    34\r\n    14    34\r\n    27    41\r\n    30    53\r\n    33    68\r\n    44     0\r\n    44    58\r\n    44    63\r\n    56    68\r\n    59    53\r\n    61    41\r\n    89    21];\r\nmseg=[8     7\r\n     7     4\r\n     4     8\r\n     4     5\r\n     5     8\r\n     8     9\r\n     9     6\r\n     6     5\r\n     9    10\r\n    10    11\r\n    11     8\r\n     8    12\r\n    12    11\r\n    12     7\r\n    10    13\r\n    13     9\r\n     6     2\r\n     2     3\r\n     3     9\r\n     3     1\r\n     1     2];\r\nepsilon=40000;\r\nnpxy=[0    41\r\n    16    36\r\n    20    39\r\n    37    41\r\n    40    53\r\n    43    68\r\n    53     0\r\n    54    58\r\n    54    63\r\n    66    68\r\n    69    53\r\n    71    41\r\n   100    22];\r\nValid=check_figureSP(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=1;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nhxy=[53 0;100 22;66 68;43 68;0 41;53 0];\r\npxy=[0    48\r\n     9    34\r\n    14    34\r\n    27    41\r\n    30    53\r\n    33    68\r\n    44     0\r\n    44    58\r\n    44    63\r\n    56    68\r\n    59    53\r\n    61    41\r\n    89    21];\r\nmseg=[8     7\r\n     7     4\r\n     4     8\r\n     4     5\r\n     5     8\r\n     8     9\r\n     9     6\r\n     6     5\r\n     9    10\r\n    10    11\r\n    11     8\r\n     8    12\r\n    12    11\r\n    12     7\r\n    10    13\r\n    13     9\r\n     6     2\r\n     2     3\r\n     3     9\r\n     3     1\r\n     1     2];\r\nepsilon=40000;\r\nnpxy=pxy;\r\nValid=check_figureSP(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nhxy=[53 0;100 22;66 68;43 68;0 41;53 0];\r\npxy=[0    48\r\n     9    34\r\n    14    34\r\n    27    41\r\n    30    53\r\n    33    68\r\n    44     0\r\n    44    58\r\n    44    63\r\n    56    68\r\n    59    53\r\n    61    41\r\n    89    21];\r\nmseg=[8     7\r\n     7     4\r\n     4     8\r\n     4     5\r\n     5     8\r\n     8     9\r\n     9     6\r\n     6     5\r\n     9    10\r\n    10    11\r\n    11     8\r\n     8    12\r\n    12    11\r\n    12     7\r\n    10    13\r\n    13     9\r\n     6     2\r\n     2     3\r\n     3     9\r\n     3     1\r\n     1     2];\r\nepsilon=40000;\r\nnpxy=[0    41\r\n    16    36\r\n    20    39\r\n    37    41\r\n    40    53\r\n    43    68\r\n    53     0+10\r\n    54    58\r\n    54    63\r\n    66    68\r\n    69    53\r\n    71    41\r\n   100    22];\r\nValid=check_figureSP(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nhxy=[53 0;100 22;66 68;43 68;0 41;53 0];\r\npxy=[0    48\r\n     9    34\r\n    14    34\r\n    27    41\r\n    30    53\r\n    33    68\r\n    44     0\r\n    44    58\r\n    44    63\r\n    56    68\r\n    59    53\r\n    61    41\r\n    89    21];\r\nmseg=[8     7\r\n     7     4\r\n     4     8\r\n     4     5\r\n     5     8\r\n     8     9\r\n     9     6\r\n     6     5\r\n     9    10\r\n    10    11\r\n    11     8\r\n     8    12\r\n    12    11\r\n    12     7\r\n    10    13\r\n    13     9\r\n     6     2\r\n     2     3\r\n     3     9\r\n     3     1\r\n     1     2];\r\nepsilon=40000;\r\nnpxy=[0    41\r\n    16    36\r\n    20    39\r\n    37    41\r\n    40    53\r\n    43    68\r\n    53     0\r\n    54    58\r\n    54    63\r\n    66    68\r\n    69    53\r\n    71    41\r\n   100    22];\r\nValid=check_figureSP(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=1;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nhxy=[53 0;100 22;66 68;43 68;0 41;53 0];\r\npxy=[0    48\r\n     9    34\r\n    14    34\r\n    27    41\r\n    30    53\r\n    33    68\r\n    44     0\r\n    44    58\r\n    44    63\r\n    56    68\r\n    59    53\r\n    61    41\r\n    89    21];\r\nmseg=[8     7\r\n     7     4\r\n     4     8\r\n     4     5\r\n     5     8\r\n     8     9\r\n     9     6\r\n     6     5\r\n     9    10\r\n    10    11\r\n    11     8\r\n     8    12\r\n    12    11\r\n    12     7\r\n    10    13\r\n    13     9\r\n     6     2\r\n     2     3\r\n     3     9\r\n     3     1\r\n     1     2];\r\nepsilon=40000;\r\nnpxy=[0.001    41\r\n    16    36\r\n    20    39\r\n    37    41\r\n    40    53\r\n    43    68\r\n    53     0\r\n    54    58\r\n    54    63\r\n    66    68\r\n    69    53\r\n    71    41\r\n   100    22];\r\nValid=check_figureSP(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0; %non-integer npxy\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nhxy=[53 0;100 22;66 68;43 68;0 41;53 0];\r\npxy=[0    48\r\n     9    34\r\n    14    34\r\n    27    41\r\n    30    53\r\n    33    68\r\n    44     0\r\n    44    58\r\n    44    63\r\n    56    68\r\n    59    53\r\n    61    41\r\n    89    21];\r\nmseg=[8     7\r\n     7     4\r\n     4     8\r\n     4     5\r\n     5     8\r\n     8     9\r\n     9     6\r\n     6     5\r\n     9    10\r\n    10    11\r\n    11     8\r\n     8    12\r\n    12    11\r\n    12     7\r\n    10    13\r\n    13     9\r\n     6     2\r\n     2     3\r\n     3     9\r\n     3     1\r\n     1     2];\r\nepsilon=40000;\r\nnpxy=[0    41\r\n    16+1    36\r\n    20    39\r\n    37    41\r\n    40    53\r\n    43    68\r\n    53     0\r\n    54    58\r\n    54    63\r\n    66    68\r\n    69    53\r\n    71    41\r\n   100    22];\r\nValid=check_figureSP(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nhxy=[15     0\r\n    35    20\r\n    20    44\r\n     0    24\r\n    15     0];\r\npxy=[0    20\r\n    20     0\r\n    20    40\r\n    40    20\r\n    49    45];\r\nmseg=[1     2\r\n     1     3\r\n     2     4\r\n     3     4\r\n     3     5\r\n     4     5];\r\nepsilon=1250;\r\nnpxy=[20    44\r\n     0    24\r\n    35    20\r\n    15     0\r\n     6    25];\r\nValid=check_figureSP(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=1;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n\r\n%%\r\n% Problem 6 shifted up7,left10, 1 seg fail\r\nepsilon=150000;\r\nhxy=[164   164\r\n   121   189\r\n    71   189\r\n    28   164\r\n     3   121\r\n     3    71\r\n    28    28\r\n    71     3\r\n   121     3\r\n   164    28\r\n   189    71\r\n    96    96\r\n   189   121\r\n   164   164];\r\npxy=[36    86\r\n    36   141\r\n    36   156\r\n    41   156\r\n    46   131\r\n    51    56\r\n    56   116\r\n    56   141\r\n    66   116\r\n    71    81\r\n    71    96\r\n    71   131\r\n    71   156\r\n    86    81\r\n    86    96\r\n    86   131\r\n    86   141\r\n    86   156\r\n    91   116\r\n    96    36\r\n   101   116\r\n   106    81\r\n   106    96\r\n   106   131\r\n   106   141\r\n   106   156\r\n   121    81\r\n   121    96\r\n   121   131\r\n   121   156\r\n   126   116\r\n   136   116\r\n   136   141\r\n   141    56\r\n   146   131\r\n   151   156\r\n   156    86\r\n   156   141\r\n   156   156];\r\nmseg=[2     3\r\n     3     4\r\n     4     8\r\n     8     2\r\n     2     1\r\n     1     6\r\n     6    20\r\n    20    34\r\n    34    37\r\n    37    38\r\n    38    33\r\n    33    36\r\n    36    39\r\n    39    38\r\n    33    30\r\n    30    26\r\n    26    25\r\n    25    33\r\n     8    17\r\n    17    18\r\n    18    13\r\n    13     8\r\n    17    25\r\n    10    11\r\n    11    15\r\n    15    14\r\n    14    10\r\n    22    23\r\n    23    28\r\n    28    27\r\n    27    22\r\n     6    10\r\n    10     1\r\n    34    27\r\n    27    37\r\n     5     7\r\n     7     9\r\n     9    12\r\n    12    16\r\n    16    19\r\n    19    21\r\n    21    24\r\n    24    29\r\n    29    31\r\n    31    32\r\n    32    35\r\n    15    19\r\n    23    21];\r\nnpxy=[26    79\r\n    26   134\r\n    26   149\r\n    31   149\r\n    36   124\r\n    41    49\r\n    46   109\r\n    46   134\r\n    56   109\r\n    61    74\r\n    61    89\r\n    61   124\r\n    61   149\r\n    76    74\r\n    76    89\r\n    76   124\r\n    76   134\r\n    76   149\r\n    81   109\r\n    86    29\r\n    91   109\r\n    96    74\r\n    96    89\r\n    96   124\r\n    96   134\r\n    96   149\r\n   111    74\r\n   111    89\r\n   111   124\r\n   111   149\r\n   116   109\r\n   126   109\r\n   126   134\r\n   131    49\r\n   136   124\r\n   141   149\r\n   146    79\r\n   146   134\r\n   146   149];\r\nValid=check_figureSP(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\n%problem 6 with rotate/shift, 1 seg fail\r\nepsilon=150000;\r\nhxy=[164   164\r\n   121   189\r\n    71   189\r\n    28   164\r\n     3   121\r\n     3    71\r\n    28    28\r\n    71     3\r\n   121     3\r\n   164    28\r\n   189    71\r\n    96    96\r\n   189   121\r\n   164   164];\r\npxy=[36    86\r\n    36   141\r\n    36   156\r\n    41   156\r\n    46   131\r\n    51    56\r\n    56   116\r\n    56   141\r\n    66   116\r\n    71    81\r\n    71    96\r\n    71   131\r\n    71   156\r\n    86    81\r\n    86    96\r\n    86   131\r\n    86   141\r\n    86   156\r\n    91   116\r\n    96    36\r\n   101   116\r\n   106    81\r\n   106    96\r\n   106   131\r\n   106   141\r\n   106   156\r\n   121    81\r\n   121    96\r\n   121   131\r\n   121   156\r\n   126   116\r\n   136   116\r\n   136   141\r\n   141    56\r\n   146   131\r\n   151   156\r\n   156    86\r\n   156   141\r\n   156   156];\r\nmseg=[2     3\r\n     3     4\r\n     4     8\r\n     8     2\r\n     2     1\r\n     1     6\r\n     6    20\r\n    20    34\r\n    34    37\r\n    37    38\r\n    38    33\r\n    33    36\r\n    36    39\r\n    39    38\r\n    33    30\r\n    30    26\r\n    26    25\r\n    25    33\r\n     8    17\r\n    17    18\r\n    18    13\r\n    13     8\r\n    17    25\r\n    10    11\r\n    11    15\r\n    15    14\r\n    14    10\r\n    22    23\r\n    23    28\r\n    28    27\r\n    27    22\r\n     6    10\r\n    10     1\r\n    34    27\r\n    27    37\r\n     5     7\r\n     7     9\r\n     9    12\r\n    12    16\r\n    16    19\r\n    19    21\r\n    21    24\r\n    24    29\r\n    29    31\r\n    31    32\r\n    32    35\r\n    15    19\r\n    23    21];\r\nnpxy=[53   156\r\n   108   156\r\n   123   156\r\n   123   151\r\n    98   146\r\n    23   141\r\n    83   136\r\n   108   136\r\n    83   126\r\n    48   121\r\n    63   121\r\n    98   121\r\n   123   121\r\n    48   106\r\n    63   106\r\n    98   106\r\n   108   106\r\n   123   106\r\n    83   101\r\n     3    96\r\n    83    91\r\n    48    86\r\n    63    86\r\n    98    86\r\n   108    86\r\n   123    86\r\n    48    71\r\n    63    71\r\n    98    71\r\n   123    71\r\n    83    66\r\n    83    56\r\n   108    56\r\n    23    51\r\n    98    46\r\n   123    41\r\n    53    36\r\n   108    36\r\n   123    36];\r\nValid=check_figureSP(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nepsilon=100000; %vertext to vertex across wall\r\nhxy=[0 0;0 2;2 2;1 1;2 0;0 0];\r\npxy=[0 0;0 2;2 2;2 0];\r\nmseg=[1 2;2 3;3 4;4 1];\r\nnpxy=[0 0;0 2;2 2;2 0];\r\nValid=check_figureSP(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nepsilon=100000; % mid seg connects across wall\r\nhxy=[0 0;0 4;4 4;2 2;4 0;0 0];\r\npxy=[0 0;0 4;3 3;3 1];\r\nmseg=[1 2;2 3;3 4;4 1];\r\nnpxy=[0 0;0 4;3 3;3 1];\r\nValid=check_figureSP(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nepsilon=100000; %mid seg intersect node\r\nhxy=[0 0;0 4;4 4;1 2;4 2;1 1;4 0;0 0];\r\npxy=[0 0;0 4;4 4;4 0];\r\nmseg=[1 2;2 3;3 4;4 1];\r\nnpxy=[0 0;0 4;4 4;4 0];\r\nValid=check_figureSP(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":2,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2021-07-19T18:59:14.000Z","updated_at":"2021-07-19T19:33:01.000Z","published_at":"2021-07-19T19:33:01.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://www.icfpconference.org/\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eICFP\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e held its annual 3-day contest in July 2021 with \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://icfpcontest2021.github.io/\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eHole-In-Wall\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. Contest \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://icfpcontest2021.github.io/spec-v4.1.pdf\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eSpecification\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe contest folds the figure in Red to fit within the hole shown in light grey \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:customXml w:element=\\\"image\\\"\u003e\u003cw:customXmlPr\u003e\u003cw:attr w:name=\\\"height\\\" w:val=\\\"237\\\"/\u003e\u003cw:attr w:name=\\\"width\\\" w:val=\\\"238\\\"/\u003e\u003cw:attr w:name=\\\"verticalAlign\\\" w:val=\\\"middle\\\"/\u003e\u003cw:attr w:name=\\\"altText\\\" w:val=\\\"\\\"/\u003e\u003cw:attr w:name=\\\"relationshipId\\\" w:val=\\\"rId1\\\"/\u003e\u003c/w:customXmlPr\u003e\u003c/w:customXml\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis Challenge is to evaluate the complete Figure validation defined in the \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://icfpcontest2021.github.io/spec-v4.1.pdf\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eSpecification\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e when given the hole vertices in hxy, original figure vertices in pxy, updated figure vertices in npxy, segment matrix mseg, and epsilon. The hxy matrix is [N+1,2] where N is number of hole vertices. A repeat of the first vertex occurs for drawing the hole.  The pxy(original) and npxy(final) matrices are [P,2] where P is the number of figure vertices. The mseg indicates connected vertices that must maintain a length as a function of epsilon from the original length. The final figure vertices must be integer thus the allowed fuzziness of segment lengths.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eValid is 1) all npxy vertices must be on or inside the hole, hxy 2) all npxy segments must match the pxy segments within an allowed epsilon, abs(Lsqr(npxy,seg(i,:))/Lsqr(pxy,seg(i,:))-1)\u0026lt;= epsilon/1000000.  Lsqr is length squared 3) No figure segments may cross hole segments. Segment vertices may touch segments. No part of any Red segment should be outside the hole shown in light grey.   4) Pathological cases of Segments crossing Wall region between Hole Vertices or from figure vertices on Hole edges is not allowed.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eValid=check_figureSP(hxy, pxy, mseg, epsilon, npxy)\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e  \u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eCrossing Segments appears in \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://www.mathworks.com/matlabcentral/cody/problems/1720\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eCody 1720\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e but the test set is not strong. A 7/18/21 solution of size 117 is robust and fast. See the function template for reference material to solve intersecting segments.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe ICFP 2021 Hole In Wall contest site has enabled a public user login to allow submissions. A login must be created to access all the problems and to submit solutions. Solutions are simple text files. Other challenges will show reading files, drawing figures, and producing submission files. To fully access the ICFP/Problems site use \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://poses.live/register\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eRegister Team\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. Anyone can select \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://poses.live/problems\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eProblems Page\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e and then click problem numbers to see the puzzles and to download problem files.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\",\"relationship\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"target\":\"/media/image1.png\",\"relationshipId\":\"rId1\"}]},{\"partUri\":\"/media/image1.png\",\"contentType\":\"image/png\",\"content\":\"data:image/png;base64,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\",\"relationship\":null}],\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"target\":\"/matlab/document.xml\",\"relationshipId\":\"rId1\"}]}"},{"id":737,"title":"Criss_Cross_000 : Unique elements in a Square array","description":"Criss Cross matrix puzzle - Easy: Square matrix, Unique elements\r\n\r\nArrange the \"words\" into a solid square such that all words are used.\r\n\r\nGiven an array of row words and an array of column words make the unique Square.\r\n\r\nThere is no flipping or rotating in this simplest case.\r\n\r\nexample:\r\n\r\nM_orig =[1 2 3; 4 5 6; 7 8 9]\r\n\r\n*Inputs:*\r\n\r\nvr = [1 2 3; 4 5 6; 7 8 9]\r\n\r\nscramled gives vr =[7 8 9; 1 2 3; 4 5 6]\r\n\r\nvc =[1 2 3; 4 5 6; 7 8 9]\r\n\r\nscrambled gives vc =[3 1 2;6 4 5; 9 7 8]\r\n\r\n*Output:*\r\n\r\nM_out=[1 2 3; 4 5 6; 7 8 9]\r\n\r\nMax size : 4096\r\n\r\n\r\nThis is the first in a series of Criss Cross puzzles.\r\n\r\nFollow up puzzles will have non-unique values, non-identified row or col, and there are quite a few other variations.","description_html":"\u003cp\u003eCriss Cross matrix puzzle - Easy: Square matrix, Unique elements\u003c/p\u003e\u003cp\u003eArrange the \"words\" into a solid square such that all words are used.\u003c/p\u003e\u003cp\u003eGiven an array of row words and an array of column words make the unique Square.\u003c/p\u003e\u003cp\u003eThere is no flipping or rotating in this simplest case.\u003c/p\u003e\u003cp\u003eexample:\u003c/p\u003e\u003cp\u003eM_orig =[1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003e\u003cb\u003eInputs:\u003c/b\u003e\u003c/p\u003e\u003cp\u003evr = [1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003escramled gives vr =[7 8 9; 1 2 3; 4 5 6]\u003c/p\u003e\u003cp\u003evc =[1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003escrambled gives vc =[3 1 2;6 4 5; 9 7 8]\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eM_out=[1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003eMax size : 4096\u003c/p\u003e\u003cp\u003eThis is the first in a series of Criss Cross puzzles.\u003c/p\u003e\u003cp\u003eFollow up puzzles will have non-unique values, non-identified row or col, and there are quite a few other variations.\u003c/p\u003e","function_template":"function M_out = Criss_Cross(vr,vc)\r\n\r\n M_out=vr*0;\r\n \r\nend","test_suite":"%%\r\nformat long\r\nformat compact\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed)\r\n\r\nn=4;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n)\r\n\r\nvr=M(1:n,:);\r\nvr=sortrows(vr);\r\n\r\nvc=M(:,1:n);\r\nvc=sortrows(vc')';\r\n\r\ntic\r\nM_out=Criss_Cross(vr,vc);\r\ntoc\r\nM_out\r\n\r\nassert(isequal(M,M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed)\r\n\r\nn=8;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n)\r\n\r\nvr=M(1:n,:);\r\nvr=sortrows(vr);\r\n\r\nvc=M(:,1:n);\r\nvc=sortrows(vc')';\r\n\r\ntic\r\nM_out=Criss_Cross(vr,vc);\r\ntoc\r\nM_out\r\n\r\nassert(isequal(M,M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed)\r\n\r\nn=128;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n);\r\n\r\nvr=M(1:n,:);\r\nvr=sortrows(vr);\r\n\r\nvc=M(:,1:n);\r\nvc=sortrows(vc')';\r\n\r\ntic\r\nM_out=Criss_Cross(vr,vc);\r\ntoc\r\n\r\nassert(isequal(M,M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed)\r\n\r\nn=1024;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n);\r\n\r\nvr=M(1:n,:);\r\nvr=sortrows(vr);\r\n\r\nvc=M(:,1:n);\r\nvc=sortrows(vc')';\r\n\r\ntic\r\nM_out=Criss_Cross(vr,vc);\r\ntoc\r\n\r\nassert(isequal(M,M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed)\r\n\r\nn=4096;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n);\r\n\r\nvr=M(1:n,:);\r\nvr=sortrows(vr);\r\n\r\nvc=M(:,1:n);\r\nvc=sortrows(vc')';\r\n\r\ntic\r\nM_out=Criss_Cross(vr,vc);\r\ntoc\r\n\r\nassert(isequal(M,M_out));","published":true,"deleted":false,"likes_count":1,"comments_count":0,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":8,"test_suite_updated_at":"2012-06-03T20:42:28.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2012-06-03T18:05:05.000Z","updated_at":"2012-06-04T02:25:58.000Z","published_at":"2012-06-03T19:37:49.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eCriss Cross matrix puzzle - Easy: Square matrix, Unique elements\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eArrange the \\\"words\\\" into a solid square such that all words are used.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eGiven an array of row words and an array of column words make the unique Square.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThere is no flipping or rotating in this simplest case.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eexample:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eM_orig =[1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInputs:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003evr = [1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003escramled gives vr =[7 8 9; 1 2 3; 4 5 6]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003evc =[1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003escrambled gives vc =[3 1 2;6 4 5; 9 7 8]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eOutput:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eM_out=[1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eMax size : 4096\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis is the first in a series of Criss Cross puzzles.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eFollow up puzzles will have non-unique values, non-identified row or col, and there are quite a few other variations.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":738,"title":"Criss_Cross_010 : Unique elements, Square array, Words in one array","description":"Criss Cross matrix puzzle - Square matrix, Unique elements, Single Word List\r\n\r\nArrange the \"words\" into a solid square such that all words are used.\r\n\r\nGiven an array of words make the original Square or Square Transpose.\r\n\r\nWords are left to Right or Top to Bottom. No fliplr or flipud.\r\n\r\n*Example:*\r\n\r\nM_orig = [1 2 3; 4 5 6; 7 8 9]\r\n\r\nvr = [1 2 3; 4 5 6; 7 8 9]\r\n\r\nvc = [1 2 3; 4 5 6; 7 8 9]\r\n\r\n*Inputs:*\r\n\r\nw = [1 2 3; 4 5 6; 7 8 9;1 4 7; 2 5 8; 3 6 9]\r\n\r\nsorted w gives\r\n\r\nw = [1 2 3; 1 4 7; 2 5 8; 3 6 9; 4 5 6; 7 8 9]\r\n\r\n\r\n*Output:*\r\n\r\nM_out = [1 2 3; 4 5 6; 7 8 9] or\r\n\r\nM_out=[1 4 7; 2 5 8; 3 6 9]\r\n\r\n\r\nMax size : 256\r\n\r\nThis is the second in the Criss Cross puzzles series.\r\n\r\nFollow up puzzles will have non-unique values and quite a few other variations.\r\n","description_html":"\u003cp\u003eCriss Cross matrix puzzle - Square matrix, Unique elements, Single Word List\u003c/p\u003e\u003cp\u003eArrange the \"words\" into a solid square such that all words are used.\u003c/p\u003e\u003cp\u003eGiven an array of words make the original Square or Square Transpose.\u003c/p\u003e\u003cp\u003eWords are left to Right or Top to Bottom. No fliplr or flipud.\u003c/p\u003e\u003cp\u003e\u003cb\u003eExample:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eM_orig = [1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003evr = [1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003evc = [1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003e\u003cb\u003eInputs:\u003c/b\u003e\u003c/p\u003e\u003cp\u003ew = [1 2 3; 4 5 6; 7 8 9;1 4 7; 2 5 8; 3 6 9]\u003c/p\u003e\u003cp\u003esorted w gives\u003c/p\u003e\u003cp\u003ew = [1 2 3; 1 4 7; 2 5 8; 3 6 9; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eM_out = [1 2 3; 4 5 6; 7 8 9] or\u003c/p\u003e\u003cp\u003eM_out=[1 4 7; 2 5 8; 3 6 9]\u003c/p\u003e\u003cp\u003eMax size : 256\u003c/p\u003e\u003cp\u003eThis is the second in the Criss Cross puzzles series.\u003c/p\u003e\u003cp\u003eFollow up puzzles will have non-unique values and quite a few other variations.\u003c/p\u003e","function_template":"function M_out = Criss_Cross(w)\r\n\r\n M_out=zeros(size(w,2));\r\n \r\nend","test_suite":"%%\r\nformat long\r\nformat compact\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed);\r\n\r\nn=4;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n)\r\n\r\nvr=M(1:n,:);\r\nvc=M(:,1:n);\r\n\r\nw=[vr;vc'];\r\nw=sortrows(w);\r\n\r\nM_out=Criss_Cross(w)\r\n\r\nassert(isequal(M,M_out)||isequal(M',M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed);\r\n\r\nn=8;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n)\r\n\r\nvr=M(1:n,:);\r\nvc=M(:,1:n);\r\n\r\nw=[vr;vc'];\r\nw=sortrows(w);\r\n\r\nM_out=Criss_Cross(w)\r\n\r\nassert(isequal(M,M_out)||isequal(M',M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed);\r\n\r\nn=16;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n);\r\n\r\nvr=M(1:n,:);\r\nvc=M(:,1:n);\r\n\r\nw=[vr;vc'];\r\nw=sortrows(w);\r\n\r\ntic\r\nM_out=Criss_Cross(w);\r\ntoc\r\n\r\nassert(isequal(M,M_out)||isequal(M',M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed);\r\n\r\nn=16;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n);\r\n\r\nvr=M(1:n,:);\r\nvc=M(:,1:n);\r\n\r\nw=[vr;vc'];\r\nw=sortrows(w);\r\n\r\ntic\r\nM_out=Criss_Cross(w);\r\ntoc\r\n\r\nassert(isequal(M,M_out)||isequal(M',M_out));\r\n%%\r\nn=256;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n);\r\n\r\nvr=M(1:n,:);\r\nvc=M(:,1:n);\r\n\r\nw=[vr;vc'];\r\nw=sortrows(w);\r\n\r\ntic\r\nM_out=Criss_Cross(w);\r\ntoc\r\n\r\nassert(isequal(M,M_out)||isequal(M',M_out));","published":true,"deleted":false,"likes_count":1,"comments_count":0,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":8,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2012-06-03T20:11:23.000Z","updated_at":"2012-06-04T02:27:22.000Z","published_at":"2012-06-03T21:38:39.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eCriss Cross matrix puzzle - Square matrix, Unique elements, Single Word List\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eArrange the \\\"words\\\" into a solid square such that all words are used.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eGiven an array of words make the original Square or Square Transpose.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eWords are left to Right or Top to Bottom. No fliplr or flipud.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eExample:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eM_orig = [1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003evr = [1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003evc = [1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInputs:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003ew = [1 2 3; 4 5 6; 7 8 9;1 4 7; 2 5 8; 3 6 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003esorted w gives\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003ew = [1 2 3; 1 4 7; 2 5 8; 3 6 9; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eOutput:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eM_out = [1 2 3; 4 5 6; 7 8 9] or\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eM_out=[1 4 7; 2 5 8; 3 6 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eMax size : 256\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis is the second in the Criss Cross puzzles series.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eFollow up puzzles will have non-unique values and quite a few other variations.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"}],"problem_search":{"errors":[],"problems":[{"id":43125,"title":"cross in array","description":"Make a cross from \"1\" in odd size array. Other value from array should be equal to \"0\";\r\nAs input you get length of side of array;\r\nx=3;\r\n\r\n  y=[ 0 1 0; \r\n      1 1 1;\r\n      0 1 0];\r\n\r\nplease pay attention input will be always odd nubmer greater than 1;\r\n","description_html":"\u003cp\u003eMake a cross from \"1\" in odd size array. Other value from array should be equal to \"0\";\r\nAs input you get length of side of array;\r\nx=3;\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003ey=[ 0 1 0; \r\n    1 1 1;\r\n    0 1 0];\r\n\u003c/pre\u003e\u003cp\u003eplease pay attention input will be always odd nubmer greater than 1;\u003c/p\u003e","function_template":"function y = drawCross(x)\r\n  y = x;\r\nend","test_suite":"%%\r\nx = 3;\r\ny_correct = [0 1 0;\r\n             1 1 1;\r\n             0 1 0 ];  \r\nassert(isequal(drawCross(x),y_correct))\r\n\r\n%%\r\nx = 5;\r\ny_correct = [0 0 1 0 0;\r\n             0 0 1 0 0;\r\n             1 1 1 1 1;\r\n             0 0 1 0 0;\r\n             0 0 1 0 0]\r\nassert(isequal(drawCross(x),y_correct))\r\n","published":true,"deleted":false,"likes_count":27,"comments_count":2,"created_by":90955,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":191,"test_suite_updated_at":"2016-10-23T02:50:44.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2016-10-06T13:47:17.000Z","updated_at":"2026-02-18T10:04:02.000Z","published_at":"2016-10-06T13:47:17.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eMake a cross from \\\"1\\\" in odd size array. Other value from array should be equal to \\\"0\\\"; As input you get length of side of array; x=3;\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[y=[ 0 1 0; \\n    1 1 1;\\n    0 1 0];]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eplease pay attention input will be always odd nubmer greater than 1;\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":42762,"title":"Is 3D point set Co-Planar?","description":"This Challenge is to determine if four 3D integer points are co-planar.\r\nGiven a 4x3 matrix representing four x,y,z integer points, output True if the set is co-planar and False otherwise.\r\n\r\nExamples\r\n\r\n m = [0 0 0;1 0 0;0 1 0;0 0 1] \r\n Output: False, this point set is non-coplanar.\r\n\r\n m = [0 0 0;0 0 1;1 1 0;1 1 1]\r\n Output: True, this point set is co-planar.\r\n\r\nReference: The \u003chttp://68.173.157.131/Contest/Tetrahedra March 2016 Al Zimmermann Non-Coplanar contest\u003e is to maximize the number of points in an NxNxN cube with no 4 points in a common plane. Future challenge will be to find N=2 and N=3 solutions.\r\n\r\nTheory: Plane is defined as Ax+By+cZ=D. [A,B,C] can be found using cross of 3 points. D can be found by substitution using any of these 3 points. Co-Planarity of the fourth point is True if Ax4+By4+Cz4==D\r\n","description_html":"\u003cp\u003eThis Challenge is to determine if four 3D integer points are co-planar.\r\nGiven a 4x3 matrix representing four x,y,z integer points, output True if the set is co-planar and False otherwise.\u003c/p\u003e\u003cp\u003eExamples\u003c/p\u003e\u003cpre\u003e m = [0 0 0;1 0 0;0 1 0;0 0 1] \r\n Output: False, this point set is non-coplanar.\u003c/pre\u003e\u003cpre\u003e m = [0 0 0;0 0 1;1 1 0;1 1 1]\r\n Output: True, this point set is co-planar.\u003c/pre\u003e\u003cp\u003eReference: The \u003ca href = \"http://68.173.157.131/Contest/Tetrahedra\"\u003eMarch 2016 Al Zimmermann Non-Coplanar contest\u003c/a\u003e is to maximize the number of points in an NxNxN cube with no 4 points in a common plane. Future challenge will be to find N=2 and N=3 solutions.\u003c/p\u003e\u003cp\u003eTheory: Plane is defined as Ax+By+cZ=D. [A,B,C] can be found using cross of 3 points. D can be found by substitution using any of these 3 points. Co-Planarity of the fourth point is True if Ax4+By4+Cz4==D\u003c/p\u003e","function_template":"function TF = iscoplanar(m)\r\n% m is a 4x3 matrix\r\n  TF=false;\r\nend","test_suite":"%%\r\nm=[0 0 1;1 1 0;1 0 1;2 0 0];\r\ny_correct = false;\r\nassert(isequal(iscoplanar(m),y_correct))\r\n%%\r\nm=[0 0 1;1 1 0;1 0 1;2 1 2];\r\ny_correct = false;\r\nassert(isequal(iscoplanar(m),y_correct))\r\n%%\r\nm=[0 0 1;1 1 0;1 0 1;0 1 0];\r\ny_correct = true;\r\nassert(isequal(iscoplanar(m),y_correct))\r\n%%\r\nm=[0 0 1;1 1 0;1 0 1;2 1 0];\r\ny_correct = true;\r\nassert(isequal(iscoplanar(m),y_correct))\r\n%%\r\nm=[0 0 1;1 1 0;1 0 1;2 0 1];\r\ny_correct = true;\r\nassert(isequal(iscoplanar(m),y_correct))\r\n%%\r\nm=[2 0 0;1 2 0;2 1 1;2 2 2];\r\ny_correct = true;\r\nassert(isequal(iscoplanar(m),y_correct))\r\n%%\r\nm=[2 0 0;1 2 0;2 1 1;2 1 2];\r\ny_correct = false;\r\nassert(isequal(iscoplanar(m),y_correct))\r\n%%\r\nm=[0 0 0;1 0 0;0 1 0;0 0 1];\r\ny_correct = false;\r\nassert(isequal(iscoplanar(m),y_correct))\r\n%%\r\nm=[0 0 0;1 0 0;0 1 0;1 1 1];\r\ny_correct = false;\r\nassert(isequal(iscoplanar(m),y_correct))\r\n%%\r\nm=[0 0 0;1 0 0;0 1 0;1 1 0];\r\ny_correct = true;\r\nassert(isequal(iscoplanar(m),y_correct))\r\n%%\r\nm=[0 0 0;0 0 1;1 1 1;1 1 0];\r\ny_correct = true;\r\nassert(isequal(iscoplanar(m),y_correct))\r\n\r\n%0 0 0 \r\n%1 0 0 \r\n%0 1 0 \r\n%0 0 1 \r\n%1 1 1","published":true,"deleted":false,"likes_count":1,"comments_count":0,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":26,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2016-03-05T21:58:07.000Z","updated_at":"2026-04-04T03:46:57.000Z","published_at":"2016-03-06T19:31:31.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis Challenge is to determine if four 3D integer points are co-planar. Given a 4x3 matrix representing four x,y,z integer points, output True if the set is co-planar and False otherwise.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eExamples\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ m = [0 0 0;1 0 0;0 1 0;0 0 1] \\n Output: False, this point set is non-coplanar.\\n\\n m = [0 0 0;0 0 1;1 1 0;1 1 1]\\n Output: True, this point set is co-planar.]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eReference: The\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://68.173.157.131/Contest/Tetrahedra\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eMarch 2016 Al Zimmermann Non-Coplanar contest\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e is to maximize the number of points in an NxNxN cube with no 4 points in a common plane. Future challenge will be to find N=2 and N=3 solutions.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eTheory: Plane is defined as Ax+By+cZ=D. [A,B,C] can be found using cross of 3 points. D can be found by substitution using any of these 3 points. Co-Planarity of the fourth point is True if Ax4+By4+Cz4==D\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":52328,"title":"ICFP2021 Hole-In-Wall: Figure Validation with Segment Crossing Check","description":"The ICFP held its annual 3-day contest in July 2021 with Hole-In-Wall. Contest Specification.\r\nThe contest folds the figure in Red to fit within the hole shown in light grey \r\nThis Challenge is to evaluate the complete Figure validation defined in the Specification when given the hole vertices in hxy, original figure vertices in pxy, updated figure vertices in npxy, segment matrix mseg, and epsilon. The hxy matrix is [N+1,2] where N is number of hole vertices. A repeat of the first vertex occurs for drawing the hole.  The pxy(original) and npxy(final) matrices are [P,2] where P is the number of figure vertices. The mseg indicates connected vertices that must maintain a length as a function of epsilon from the original length. The final figure vertices must be integer thus the allowed fuzziness of segment lengths.\r\nValid is 1) all npxy vertices must be on or inside the hole, hxy 2) all npxy segments must match the pxy segments within an allowed epsilon, abs(Lsqr(npxy,seg(i,:))/Lsqr(pxy,seg(i,:))-1)\u003c= epsilon/1000000.  Lsqr is length squared 3) No figure segments may cross hole segments. Segment vertices may touch segments. No part of any Red segment should be outside the hole shown in light grey.  \r\nValid=check_figureS(hxy, pxy, mseg, epsilon, npxy)  \r\nCrossing Segments appears in Cody 1720 but the test set is not strong. A 7/18/21 solution of size 117 is robust and fast. See the function template for reference material to solve intersecting segments.\r\nThe ICFP 2021 Hole In Wall contest site has enabled a public user login to allow submissions. A login must be created to access all the problems and to submit solutions. Solutions are simple text files. Other challenges will show reading files, drawing figures, and producing submission files. To fully access the ICFP/Problems site use Register Team. Anyone can select Problems Page and then click problem numbers to see the puzzles and to download problem files.","description_html":"\u003cdiv style = \"text-align: start; line-height: 20.4333px; min-height: 0px; white-space: normal; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, monospace; font-style: normal; font-size: 14px; font-weight: 400; text-decoration: rgb(0, 0, 0); white-space: normal; \"\u003e\u003cdiv style=\"block-size: 669px; display: block; min-width: 0px; padding-block-start: 0px; padding-top: 0px; perspective-origin: 407px 334.5px; transform-origin: 407px 334.5px; vertical-align: baseline; \"\u003e\u003cdiv style=\"block-size: 21px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 10.5px; text-align: left; transform-origin: 384px 10.5px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 14px 7.91667px; transform-origin: 14px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://www.icfpconference.org/\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eICFP\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 146.65px 7.91667px; transform-origin: 146.65px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e held its annual 3-day contest in July 2021 with \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://icfpcontest2021.github.io/\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eHole-In-Wall\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 29.95px 7.91667px; transform-origin: 29.95px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e. Contest \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://icfpcontest2021.github.io/spec-v4.1.pdf\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eSpecification\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 1.95px 7.91667px; transform-origin: 1.95px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 237px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 118.5px; text-align: left; transform-origin: 384px 118.5px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 230.267px 7.91667px; transform-origin: 230.267px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe contest folds the figure in Red to fit within the hole shown in light grey \u003c/span\u003e\u003c/span\u003e\u003cimg class=\"imageNode\" style=\"vertical-align: middle;width: 238px;height: 237px\" src=\"data:image/png;base64,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\" data-image-state=\"image-loaded\" width=\"238\" height=\"237\"\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 126px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 63px; text-align: left; transform-origin: 384px 63px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 231.083px 7.91667px; transform-origin: 231.083px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThis Challenge is to evaluate the complete Figure validation defined in the \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://icfpcontest2021.github.io/spec-v4.1.pdf\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eSpecification\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 113.25px 7.91667px; transform-origin: 113.25px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e when given the hole vertices in hxy, original figure vertices in pxy, updated figure vertices in npxy, segment matrix mseg, and epsilon. The hxy matrix is [N+1,2] where N is number of hole vertices. A repeat of the first vertex occurs for drawing the hole.  The pxy(original) and npxy(final) matrices are [P,2] where P is the number of figure vertices. The mseg indicates connected vertices that must maintain a length as a function of epsilon from the original length. The final figure vertices must be integer thus the allowed fuzziness of segment lengths.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 84px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 42px; text-align: left; transform-origin: 384px 42px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 381.05px 7.91667px; transform-origin: 381.05px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eValid is 1) all npxy vertices must be on or inside the hole, hxy 2) all npxy segments must match the pxy segments within an allowed epsilon, abs(Lsqr(npxy,seg(i,:))/Lsqr(pxy,seg(i,:))-1)\u0026lt;= epsilon/1000000.  Lsqr is length squared 3) No figure segments may cross hole segments. Segment vertices may touch segments. No part of any Red segment should be outside the hole shown in light grey.  \u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 21px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 10.5px; text-align: left; transform-origin: 384px 10.5px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 170.667px 7.91667px; transform-origin: 170.667px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"font-weight: 700; \"\u003eValid=check_figureS(hxy, pxy, mseg, epsilon, npxy)\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 3.88333px 7.91667px; transform-origin: 3.88333px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e  \u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 42px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 21px; text-align: left; transform-origin: 384px 21px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 97.65px 7.91667px; transform-origin: 97.65px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eCrossing Segments appears in \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://www.mathworks.com/matlabcentral/cody/problems/1720\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eCody 1720\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 242.167px 7.91667px; transform-origin: 242.167px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e but the test set is not strong. A 7/18/21 solution of size 117 is robust and fast. See the function template for reference material to solve intersecting segments.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 84px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 42px; text-align: left; transform-origin: 384px 42px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 375.883px 7.91667px; transform-origin: 375.883px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe ICFP 2021 Hole In Wall contest site has enabled a public user login to allow submissions. A login must be created to access all the problems and to submit solutions. Solutions are simple text files. Other challenges will show reading files, drawing figures, and producing submission files. To fully access the ICFP/Problems site use \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://poses.live/register\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eRegister Team\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 42.7833px 7.91667px; transform-origin: 42.7833px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e. Anyone can select \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://poses.live/problems\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eProblems Page\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 256.35px 7.91667px; transform-origin: 256.35px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e and then click problem numbers to see the puzzles and to download problem files.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e","function_template":"function valid=check_figureS(hxy,pxy,mseg,epsilon,npxy)\r\n% hxy hole vertices in order of connection. Last row repeats first for use in inpolygon\r\n% pxy figure original vertices used for initial segment length calculations\r\n% mseg is paired list of connected vertices\r\n% epsilon is allowed stretchiness of segment. hxy,pxy,npxy are all integer\r\n% npxy is figure final vertices used for scoring and Validation\r\n valid=0;\r\n nseg=size(mseg,1);\r\n msegMM=calc_msegMM(pxy,mseg,epsilon,nseg); %Create Min and Max segment integer values\r\n %hplot(hxy,pxy,mseg,size(mseg,1),1);\r\n %hplot3(hxy,npxy,mseg,size(mseg,1),3,segMM);\r\n \r\n%Confirm all final vertices of npxy are in hxy polygon\r\n[in] = inpolygon(npxy(:,1),npxy(:,2),hxy(:,1),hxy(:,2)); % inside or on edge\r\n%check if all vertices are in\r\n\r\n%Confirm all segments are of valid length squared\r\n for i=1:nseg\r\n  nsegL2=0; %calc length squared of segment\r\n  %Check if nsegL2\u003cMin or nsegL2\u003eMax  Min=msegMM(i,1) and Max=msegMM(i,2)\r\n end\r\n \r\n%Confirm all figure segments do not cross hole segments\r\n%Segment/Hole Vertices may touch other vertices and segments\r\n%Intersecting Segments was addressed in Cody 1720\r\n%https://www.mathworks.com/matlabcentral/cody/problems/1720\r\n%A Robust/Fast solution for 1720 was created on 7/18/21 of size 117\r\n \r\n valid=check_intersecting_segments(hxy,mseg,nseg,npxy);\r\nend % check_figure\r\n\r\nfunction valid=check_intersecting_segments(hxy,mseg,nseg,npxy)\r\n%Confirm no figure segments cross hole segments; \r\n % Allowed: \r\n % a) Overlaying segments. \r\n % b) Segments touching hole vertices.\r\n % c) Figure vertices touching hole segments\r\n \r\n valid=0;\r\n nhxy=size(hxy,1)-1;\r\n \r\n for i=1:nseg\r\n  A=[]; % npxy points defined by mseg   A=[a1 a2;a3 a4]\r\n  for j=1:nhxy  %1-2,2-3, end-1 to end  thus why nhxy is 1 less than rows\r\n   B=[]; % hxy points    B=[b1 b2;b3 b4]\r\n   if intersecting(A,B), return;end % intersect detected thus fail\r\n  end\r\n end\r\n \r\n valid=1;\r\nend % check_intersecting_segments\r\n\r\nfunction tf=intersecting(A,B) %\r\n%Correct full solution requires two cross product checks which can be implemented using det\r\n%Segment A [A1;A2],  Segment B [B1;B2]\r\n% Points A1=[a1,a2] A2=[a3,a4] B1=[b1 b2] B2=[b3 b4]  All data in z=0 plane\r\n%p0= B2A1 x B2B1 is det([B2A1;B2B1]) where B2A1 = B2-A1= [b3-a1 b4-a2], B2B1=B2-B1=[b3-b1 b4-b2]\r\n%p1= B2A2 x B2B1 is det([B2A2;B2B1]) where B2A2 = B2-A2= [b3-a3 b4-a4], B2B1=B2-B1=[b3-b1 b4-b2]\r\n%p2= A2B1 x A2A1 is det([A2B1;A2A1]) where A2B1 = A2-B1= [a3-b1 a4-b2], A2A1=A2-A1=[a3-a1 a4-a2]\r\n%p3= A2B2 x A2A1 is det([A2B2;A2A1]) where A2B2 = A2-B2= [a3-b3 a4-b4], A2A1=A2-A1=[a3-a1 a4-a2]\r\n%visualization https://www.desmos.com/calculator/0wr2rfkjbk\r\n%source https://stackoverflow.com/questions/3838329/how-can-i-check-if-two-segments-intersect\r\n% by BenMan95 in ghastly Python not using det or matlab array vectors\r\n%https://www.mathworks.com/matlabcentral/cody/problems/1720\r\n%  Robust Fast solution of size 117 created on 7/18/21 for 1720\r\n%\r\n% Both cross product pair multiplications must be negative for an intersection to occur\r\n% p0p1\u003c0 \u0026\u0026 p2p3\u003c0 for non-endpoint segments intersection. For End point intersection change \u003c to \u003c=\r\n\r\ntf=0;\r\nend % intersecting\r\n\r\n\r\nfunction msegMM=calc_msegMM(pxy,mseg,epsilon,nseg)\r\n%determine Min and Max integer value of allowed length squared for each segment\r\n%abs(Lsqr(npxy,seg(i))/Lsqr(pxy,seg(i))-1)\u003c= epsilon/1000000.\r\n%mseg has indices of connected vertices [nseg,2].  The nseg may exceed number of vertices.\r\n msegMM=zeros(nseg,2);\r\n for i=1:nseg\r\n  Lseg=0; % sum((pxy(mseg(i,1),:)-pxy(mseg(i,2),:)).^2)\r\n  delta=0; % epsilon*Lseg/1000000 and a little tweak\r\n  msegMM(i,:)=[-delta delta]+Lseg;\r\n end\r\nend % calc_msegMM\r\n\r\n%These routines can be used to visualize the data\r\n\r\n% function hplot(vxy,qxy,mseg,Lmseg,id)\r\n% %Need check of segment crossing a hole segment but ignore endpoint\r\n%  [in] = inpolygon(qxy(:,1),qxy(:,2),vxy(:,1),vxy(:,2)); % inside or on edge\r\n%  figure(id)\r\n%   plot(vxy(:,1),vxy(:,2),'k.-') % hole polygon\r\n%   hold on\r\n%   plot(qxy(in,1),qxy(in,2),'b*') % points inside\r\n%   plot(qxy(~in,1),qxy(~in,2),'ro') % points outside\r\n%   for i=1:size(qxy,1)%length(xq)\r\n%    text(qxy(i,1)+.75,qxy(i,2)-1.5,num2str(i),'FontSize',12);\r\n%   end\r\n%   \r\n%   for i=1:Lmseg\r\n%    if in(mseg(i,1))+in(mseg(i,2))\u003c2\r\n%      plot(qxy(mseg(i,:),1),qxy(mseg(i,:),2),'r-') % segment to OOB pt\r\n%    else\r\n%     plot(qxy(mseg(i,:),1),qxy(mseg(i,:),2),'b-')\r\n%    end\r\n%    text(sum(qxy(mseg(i,:),1))/2,sum(qxy(mseg(i,:),2))/2,num2str(i),'Color','b');\r\n%   end\r\n%   \r\n%   %o+*.x_|sd^v\u003e\u003cph\r\n%   %colors ymcrgbwk\r\n%    \r\n%   axis tight\r\n%   axis ij\r\n%   hold off  \r\n% end % hplot\r\n\r\n% function hplot3(vxy,qxy,mseg,Lmseg,id,segMM)\r\n%  segMNM=[segMM(:,1) segMM(:,1)+segMM(:,2) segMM(:,2)];\r\n%  [in] = inpolygon(qxy(:,1),qxy(:,2),vxy(:,1),vxy(:,2)); % inside or on edge\r\n%  figure(id)\r\n%   plot(vxy(:,1),vxy(:,2),'k.-') % hole polygon\r\n%   hold on\r\n%   plot(qxy(in,1),qxy(in,2),'b*') % points inside\r\n%   plot(qxy(~in,1),qxy(~in,2),'ro') % points outside\r\n%   for i=1:size(qxy,1) %length(xq)\r\n%    text(qxy(i,1)+.75,qxy(i,2)-1.5,num2str(i));\r\n%   end\r\n%   \r\n%   for i=1:Lmseg\r\n%    d2seg=(qxy(mseg(i,1),1)-qxy(mseg(i,2),1))^2+(qxy(mseg(i,1),2)-qxy(mseg(i,2),2))^2;\r\n%    if d2seg\u003csegMNM(i,1)\r\n%      plot(qxy(mseg(i,:),1),qxy(mseg(i,:),2),'b-') % segment too short\r\n%    elseif d2seg\u003esegMNM(i,3)\r\n%      plot(qxy(mseg(i,:),1),qxy(mseg(i,:),2),'r-') % segment too long\r\n%    else\r\n%     plot(qxy(mseg(i,:),1),qxy(mseg(i,:),2),'g-') \r\n%    end\r\n%    text(sum(qxy(mseg(i,:),1))/2,sum(qxy(mseg(i,:),2))/2,num2str(i),'Color','b');\r\n%   end\r\n%   \r\n%   %o+*.x_|sd^v\u003e\u003cph\r\n%   %colors ymcrgbwk\r\n%   \r\n%   axis tight\r\n%   axis ij\r\n%   hold off\r\n% end % hplot3\r\n%","test_suite":"%%\r\nhxy=[53 0;100 22;66 68;43 68;0 41;53 0];\r\npxy=[0    48\r\n     9    34\r\n    14    34\r\n    27    41\r\n    30    53\r\n    33    68\r\n    44     0\r\n    44    58\r\n    44    63\r\n    56    68\r\n    59    53\r\n    61    41\r\n    89    21];\r\nmseg=[8     7\r\n     7     4\r\n     4     8\r\n     4     5\r\n     5     8\r\n     8     9\r\n     9     6\r\n     6     5\r\n     9    10\r\n    10    11\r\n    11     8\r\n     8    12\r\n    12    11\r\n    12     7\r\n    10    13\r\n    13     9\r\n     6     2\r\n     2     3\r\n     3     9\r\n     3     1\r\n     1     2];\r\nepsilon=40000;\r\nnpxy=[0    41\r\n    16    36\r\n    20    39\r\n    37    41\r\n    40    53\r\n    43    68\r\n    53     0\r\n    54    58\r\n    54    63\r\n    66    68\r\n    69    53\r\n    71    41\r\n   100    22];\r\nValid=check_figureS(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=1;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nhxy=[53 0;100 22;66 68;43 68;0 41;53 0];\r\npxy=[0    48\r\n     9    34\r\n    14    34\r\n    27    41\r\n    30    53\r\n    33    68\r\n    44     0\r\n    44    58\r\n    44    63\r\n    56    68\r\n    59    53\r\n    61    41\r\n    89    21];\r\nmseg=[8     7\r\n     7     4\r\n     4     8\r\n     4     5\r\n     5     8\r\n     8     9\r\n     9     6\r\n     6     5\r\n     9    10\r\n    10    11\r\n    11     8\r\n     8    12\r\n    12    11\r\n    12     7\r\n    10    13\r\n    13     9\r\n     6     2\r\n     2     3\r\n     3     9\r\n     3     1\r\n     1     2];\r\nepsilon=40000;\r\nnpxy=pxy;\r\nValid=check_figureS(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nhxy=[53 0;100 22;66 68;43 68;0 41;53 0];\r\npxy=[0    48\r\n     9    34\r\n    14    34\r\n    27    41\r\n    30    53\r\n    33    68\r\n    44     0\r\n    44    58\r\n    44    63\r\n    56    68\r\n    59    53\r\n    61    41\r\n    89    21];\r\nmseg=[8     7\r\n     7     4\r\n     4     8\r\n     4     5\r\n     5     8\r\n     8     9\r\n     9     6\r\n     6     5\r\n     9    10\r\n    10    11\r\n    11     8\r\n     8    12\r\n    12    11\r\n    12     7\r\n    10    13\r\n    13     9\r\n     6     2\r\n     2     3\r\n     3     9\r\n     3     1\r\n     1     2];\r\nepsilon=40000;\r\nnpxy=[0    41\r\n    16    36\r\n    20    39\r\n    37    41\r\n    40    53\r\n    43    68\r\n    53     0+10\r\n    54    58\r\n    54    63\r\n    66    68\r\n    69    53\r\n    71    41\r\n   100    22];\r\nValid=check_figureS(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nhxy=[53 0;100 22;66 68;43 68;0 41;53 0];\r\npxy=[0    48\r\n     9    34\r\n    14    34\r\n    27    41\r\n    30    53\r\n    33    68\r\n    44     0\r\n    44    58\r\n    44    63\r\n    56    68\r\n    59    53\r\n    61    41\r\n    89    21];\r\nmseg=[8     7\r\n     7     4\r\n     4     8\r\n     4     5\r\n     5     8\r\n     8     9\r\n     9     6\r\n     6     5\r\n     9    10\r\n    10    11\r\n    11     8\r\n     8    12\r\n    12    11\r\n    12     7\r\n    10    13\r\n    13     9\r\n     6     2\r\n     2     3\r\n     3     9\r\n     3     1\r\n     1     2];\r\nepsilon=40000;\r\nnpxy=[0    41\r\n    16    36\r\n    20    39\r\n    37    41\r\n    40    53\r\n    43    68\r\n    53     0\r\n    54    58\r\n    54    63\r\n    66    68\r\n    69    53\r\n    71    41\r\n   100    22];\r\nValid=check_figureS(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=1;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nhxy=[53 0;100 22;66 68;43 68;0 41;53 0];\r\npxy=[0    48\r\n     9    34\r\n    14    34\r\n    27    41\r\n    30    53\r\n    33    68\r\n    44     0\r\n    44    58\r\n    44    63\r\n    56    68\r\n    59    53\r\n    61    41\r\n    89    21];\r\nmseg=[8     7\r\n     7     4\r\n     4     8\r\n     4     5\r\n     5     8\r\n     8     9\r\n     9     6\r\n     6     5\r\n     9    10\r\n    10    11\r\n    11     8\r\n     8    12\r\n    12    11\r\n    12     7\r\n    10    13\r\n    13     9\r\n     6     2\r\n     2     3\r\n     3     9\r\n     3     1\r\n     1     2];\r\nepsilon=40000;\r\nnpxy=[0.001    41\r\n    16    36\r\n    20    39\r\n    37    41\r\n    40    53\r\n    43    68\r\n    53     0\r\n    54    58\r\n    54    63\r\n    66    68\r\n    69    53\r\n    71    41\r\n   100    22];\r\nValid=check_figureS(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0; %non-integer npxy\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nhxy=[53 0;100 22;66 68;43 68;0 41;53 0];\r\npxy=[0    48\r\n     9    34\r\n    14    34\r\n    27    41\r\n    30    53\r\n    33    68\r\n    44     0\r\n    44    58\r\n    44    63\r\n    56    68\r\n    59    53\r\n    61    41\r\n    89    21];\r\nmseg=[8     7\r\n     7     4\r\n     4     8\r\n     4     5\r\n     5     8\r\n     8     9\r\n     9     6\r\n     6     5\r\n     9    10\r\n    10    11\r\n    11     8\r\n     8    12\r\n    12    11\r\n    12     7\r\n    10    13\r\n    13     9\r\n     6     2\r\n     2     3\r\n     3     9\r\n     3     1\r\n     1     2];\r\nepsilon=40000;\r\nnpxy=[0    41\r\n    16+1    36\r\n    20    39\r\n    37    41\r\n    40    53\r\n    43    68\r\n    53     0\r\n    54    58\r\n    54    63\r\n    66    68\r\n    69    53\r\n    71    41\r\n   100    22];\r\nValid=check_figureS(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nhxy=[15     0\r\n    35    20\r\n    20    44\r\n     0    24\r\n    15     0];\r\npxy=[0    20\r\n    20     0\r\n    20    40\r\n    40    20\r\n    49    45];\r\nmseg=[1     2\r\n     1     3\r\n     2     4\r\n     3     4\r\n     3     5\r\n     4     5];\r\nepsilon=1250;\r\nnpxy=[20    44\r\n     0    24\r\n    35    20\r\n    15     0\r\n     6    25];\r\nValid=check_figureS(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=1;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n\r\n%%\r\n% Problem 6 shifted up7,left10, 1 seg fail\r\nepsilon=150000;\r\nhxy=[164   164\r\n   121   189\r\n    71   189\r\n    28   164\r\n     3   121\r\n     3    71\r\n    28    28\r\n    71     3\r\n   121     3\r\n   164    28\r\n   189    71\r\n    96    96\r\n   189   121\r\n   164   164];\r\npxy=[36    86\r\n    36   141\r\n    36   156\r\n    41   156\r\n    46   131\r\n    51    56\r\n    56   116\r\n    56   141\r\n    66   116\r\n    71    81\r\n    71    96\r\n    71   131\r\n    71   156\r\n    86    81\r\n    86    96\r\n    86   131\r\n    86   141\r\n    86   156\r\n    91   116\r\n    96    36\r\n   101   116\r\n   106    81\r\n   106    96\r\n   106   131\r\n   106   141\r\n   106   156\r\n   121    81\r\n   121    96\r\n   121   131\r\n   121   156\r\n   126   116\r\n   136   116\r\n   136   141\r\n   141    56\r\n   146   131\r\n   151   156\r\n   156    86\r\n   156   141\r\n   156   156];\r\nmseg=[2     3\r\n     3     4\r\n     4     8\r\n     8     2\r\n     2     1\r\n     1     6\r\n     6    20\r\n    20    34\r\n    34    37\r\n    37    38\r\n    38    33\r\n    33    36\r\n    36    39\r\n    39    38\r\n    33    30\r\n    30    26\r\n    26    25\r\n    25    33\r\n     8    17\r\n    17    18\r\n    18    13\r\n    13     8\r\n    17    25\r\n    10    11\r\n    11    15\r\n    15    14\r\n    14    10\r\n    22    23\r\n    23    28\r\n    28    27\r\n    27    22\r\n     6    10\r\n    10     1\r\n    34    27\r\n    27    37\r\n     5     7\r\n     7     9\r\n     9    12\r\n    12    16\r\n    16    19\r\n    19    21\r\n    21    24\r\n    24    29\r\n    29    31\r\n    31    32\r\n    32    35\r\n    15    19\r\n    23    21];\r\nnpxy=[26    79\r\n    26   134\r\n    26   149\r\n    31   149\r\n    36   124\r\n    41    49\r\n    46   109\r\n    46   134\r\n    56   109\r\n    61    74\r\n    61    89\r\n    61   124\r\n    61   149\r\n    76    74\r\n    76    89\r\n    76   124\r\n    76   134\r\n    76   149\r\n    81   109\r\n    86    29\r\n    91   109\r\n    96    74\r\n    96    89\r\n    96   124\r\n    96   134\r\n    96   149\r\n   111    74\r\n   111    89\r\n   111   124\r\n   111   149\r\n   116   109\r\n   126   109\r\n   126   134\r\n   131    49\r\n   136   124\r\n   141   149\r\n   146    79\r\n   146   134\r\n   146   149];\r\nValid=check_figureS(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\n%problem 6 with rotate/shift, 1 seg fail\r\nepsilon=150000;\r\nhxy=[164   164\r\n   121   189\r\n    71   189\r\n    28   164\r\n     3   121\r\n     3    71\r\n    28    28\r\n    71     3\r\n   121     3\r\n   164    28\r\n   189    71\r\n    96    96\r\n   189   121\r\n   164   164];\r\npxy=[36    86\r\n    36   141\r\n    36   156\r\n    41   156\r\n    46   131\r\n    51    56\r\n    56   116\r\n    56   141\r\n    66   116\r\n    71    81\r\n    71    96\r\n    71   131\r\n    71   156\r\n    86    81\r\n    86    96\r\n    86   131\r\n    86   141\r\n    86   156\r\n    91   116\r\n    96    36\r\n   101   116\r\n   106    81\r\n   106    96\r\n   106   131\r\n   106   141\r\n   106   156\r\n   121    81\r\n   121    96\r\n   121   131\r\n   121   156\r\n   126   116\r\n   136   116\r\n   136   141\r\n   141    56\r\n   146   131\r\n   151   156\r\n   156    86\r\n   156   141\r\n   156   156];\r\nmseg=[2     3\r\n     3     4\r\n     4     8\r\n     8     2\r\n     2     1\r\n     1     6\r\n     6    20\r\n    20    34\r\n    34    37\r\n    37    38\r\n    38    33\r\n    33    36\r\n    36    39\r\n    39    38\r\n    33    30\r\n    30    26\r\n    26    25\r\n    25    33\r\n     8    17\r\n    17    18\r\n    18    13\r\n    13     8\r\n    17    25\r\n    10    11\r\n    11    15\r\n    15    14\r\n    14    10\r\n    22    23\r\n    23    28\r\n    28    27\r\n    27    22\r\n     6    10\r\n    10     1\r\n    34    27\r\n    27    37\r\n     5     7\r\n     7     9\r\n     9    12\r\n    12    16\r\n    16    19\r\n    19    21\r\n    21    24\r\n    24    29\r\n    29    31\r\n    31    32\r\n    32    35\r\n    15    19\r\n    23    21];\r\nnpxy=[53   156\r\n   108   156\r\n   123   156\r\n   123   151\r\n    98   146\r\n    23   141\r\n    83   136\r\n   108   136\r\n    83   126\r\n    48   121\r\n    63   121\r\n    98   121\r\n   123   121\r\n    48   106\r\n    63   106\r\n    98   106\r\n   108   106\r\n   123   106\r\n    83   101\r\n     3    96\r\n    83    91\r\n    48    86\r\n    63    86\r\n    98    86\r\n   108    86\r\n   123    86\r\n    48    71\r\n    63    71\r\n    98    71\r\n   123    71\r\n    83    66\r\n    83    56\r\n   108    56\r\n    23    51\r\n    98    46\r\n   123    41\r\n    53    36\r\n   108    36\r\n   123    36];\r\nValid=check_figureS(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":2,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2021-07-18T21:43:20.000Z","updated_at":"2021-07-19T01:11:39.000Z","published_at":"2021-07-19T01:11:39.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://www.icfpconference.org/\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eICFP\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e held its annual 3-day contest in July 2021 with \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://icfpcontest2021.github.io/\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eHole-In-Wall\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. Contest \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://icfpcontest2021.github.io/spec-v4.1.pdf\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eSpecification\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe contest folds the figure in Red to fit within the hole shown in light grey \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:customXml w:element=\\\"image\\\"\u003e\u003cw:customXmlPr\u003e\u003cw:attr w:name=\\\"height\\\" w:val=\\\"237\\\"/\u003e\u003cw:attr w:name=\\\"width\\\" w:val=\\\"238\\\"/\u003e\u003cw:attr w:name=\\\"verticalAlign\\\" w:val=\\\"middle\\\"/\u003e\u003cw:attr w:name=\\\"altText\\\" w:val=\\\"\\\"/\u003e\u003cw:attr w:name=\\\"relationshipId\\\" w:val=\\\"rId1\\\"/\u003e\u003c/w:customXmlPr\u003e\u003c/w:customXml\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis Challenge is to evaluate the complete Figure validation defined in the \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://icfpcontest2021.github.io/spec-v4.1.pdf\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eSpecification\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e when given the hole vertices in hxy, original figure vertices in pxy, updated figure vertices in npxy, segment matrix mseg, and epsilon. The hxy matrix is [N+1,2] where N is number of hole vertices. A repeat of the first vertex occurs for drawing the hole.  The pxy(original) and npxy(final) matrices are [P,2] where P is the number of figure vertices. The mseg indicates connected vertices that must maintain a length as a function of epsilon from the original length. The final figure vertices must be integer thus the allowed fuzziness of segment lengths.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eValid is 1) all npxy vertices must be on or inside the hole, hxy 2) all npxy segments must match the pxy segments within an allowed epsilon, abs(Lsqr(npxy,seg(i,:))/Lsqr(pxy,seg(i,:))-1)\u0026lt;= epsilon/1000000.  Lsqr is length squared 3) No figure segments may cross hole segments. Segment vertices may touch segments. No part of any Red segment should be outside the hole shown in light grey.  \u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eValid=check_figureS(hxy, pxy, mseg, epsilon, npxy)\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e  \u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eCrossing Segments appears in \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://www.mathworks.com/matlabcentral/cody/problems/1720\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eCody 1720\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e but the test set is not strong. A 7/18/21 solution of size 117 is robust and fast. See the function template for reference material to solve intersecting segments.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe ICFP 2021 Hole In Wall contest site has enabled a public user login to allow submissions. A login must be created to access all the problems and to submit solutions. Solutions are simple text files. Other challenges will show reading files, drawing figures, and producing submission files. To fully access the ICFP/Problems site use \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://poses.live/register\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eRegister Team\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. Anyone can select \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://poses.live/problems\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eProblems Page\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e and then click problem numbers to see the puzzles and to download problem files.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\",\"relationship\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"target\":\"/media/image1.png\",\"relationshipId\":\"rId1\"}]},{\"partUri\":\"/media/image1.png\",\"contentType\":\"image/png\",\"content\":\"data:image/png;base64,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\",\"relationship\":null}],\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"target\":\"/matlab/document.xml\",\"relationshipId\":\"rId1\"}]}"},{"id":52334,"title":"ICFP2021 Hole-In-Wall: Figure Validation with Segment Crossing and Segment on Wall Checks","description":"The ICFP held its annual 3-day contest in July 2021 with Hole-In-Wall. Contest Specification.\r\nThe contest folds the figure in Red to fit within the hole shown in light grey \r\nThis Challenge is to evaluate the complete Figure validation defined in the Specification when given the hole vertices in hxy, original figure vertices in pxy, updated figure vertices in npxy, segment matrix mseg, and epsilon. The hxy matrix is [N+1,2] where N is number of hole vertices. A repeat of the first vertex occurs for drawing the hole.  The pxy(original) and npxy(final) matrices are [P,2] where P is the number of figure vertices. The mseg indicates connected vertices that must maintain a length as a function of epsilon from the original length. The final figure vertices must be integer thus the allowed fuzziness of segment lengths.\r\nValid is 1) all npxy vertices must be on or inside the hole, hxy 2) all npxy segments must match the pxy segments within an allowed epsilon, abs(Lsqr(npxy,seg(i,:))/Lsqr(pxy,seg(i,:))-1)\u003c= epsilon/1000000.  Lsqr is length squared 3) No figure segments may cross hole segments. Segment vertices may touch segments. No part of any Red segment should be outside the hole shown in light grey.   4) Pathological cases of Segments crossing Wall region between Hole Vertices or from figure vertices on Hole edges is not allowed.\r\nValid=check_figureSP(hxy, pxy, mseg, epsilon, npxy)  \r\nCrossing Segments appears in Cody 1720 but the test set is not strong. A 7/18/21 solution of size 117 is robust and fast. See the function template for reference material to solve intersecting segments.\r\nThe ICFP 2021 Hole In Wall contest site has enabled a public user login to allow submissions. A login must be created to access all the problems and to submit solutions. Solutions are simple text files. Other challenges will show reading files, drawing figures, and producing submission files. To fully access the ICFP/Problems site use Register Team. Anyone can select Problems Page and then click problem numbers to see the puzzles and to download problem files.","description_html":"\u003cdiv style = \"text-align: start; line-height: 20.4333px; min-height: 0px; white-space: normal; color: rgb(0, 0, 0); font-family: Menlo, Monaco, Consolas, monospace; font-style: normal; font-size: 14px; font-weight: 400; text-decoration: rgb(0, 0, 0); white-space: normal; \"\u003e\u003cdiv style=\"block-size: 690px; display: block; min-width: 0px; padding-block-start: 0px; padding-top: 0px; perspective-origin: 407px 345px; transform-origin: 407px 345px; vertical-align: baseline; \"\u003e\u003cdiv style=\"block-size: 21px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 10.5px; text-align: left; transform-origin: 384px 10.5px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 14px 7.91667px; transform-origin: 14px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://www.icfpconference.org/\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eICFP\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 146.65px 7.91667px; transform-origin: 146.65px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e held its annual 3-day contest in July 2021 with \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://icfpcontest2021.github.io/\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eHole-In-Wall\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 29.95px 7.91667px; transform-origin: 29.95px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e. Contest \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://icfpcontest2021.github.io/spec-v4.1.pdf\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eSpecification\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 1.95px 7.91667px; transform-origin: 1.95px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 237px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 118.5px; text-align: left; transform-origin: 384px 118.5px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 230.267px 7.91667px; transform-origin: 230.267px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe contest folds the figure in Red to fit within the hole shown in light grey \u003c/span\u003e\u003c/span\u003e\u003cimg class=\"imageNode\" style=\"vertical-align: middle;width: 238px;height: 237px\" src=\"data:image/png;base64,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\" data-image-state=\"image-loaded\" width=\"238\" height=\"237\"\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 126px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 63px; text-align: left; transform-origin: 384px 63px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 231.083px 7.91667px; transform-origin: 231.083px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThis Challenge is to evaluate the complete Figure validation defined in the \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://icfpcontest2021.github.io/spec-v4.1.pdf\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eSpecification\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 113.25px 7.91667px; transform-origin: 113.25px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e when given the hole vertices in hxy, original figure vertices in pxy, updated figure vertices in npxy, segment matrix mseg, and epsilon. The hxy matrix is [N+1,2] where N is number of hole vertices. A repeat of the first vertex occurs for drawing the hole.  The pxy(original) and npxy(final) matrices are [P,2] where P is the number of figure vertices. The mseg indicates connected vertices that must maintain a length as a function of epsilon from the original length. The final figure vertices must be integer thus the allowed fuzziness of segment lengths.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 105px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 52.5px; text-align: left; transform-origin: 384px 52.5px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 381.05px 7.91667px; transform-origin: 381.05px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eValid is 1) all npxy vertices must be on or inside the hole, hxy 2) all npxy segments must match the pxy segments within an allowed epsilon, abs(Lsqr(npxy,seg(i,:))/Lsqr(pxy,seg(i,:))-1)\u0026lt;= epsilon/1000000.  Lsqr is length squared 3) No figure segments may cross hole segments. Segment vertices may touch segments. No part of any Red segment should be outside the hole shown in light grey.   4) Pathological cases of Segments crossing Wall region between Hole Vertices or from figure vertices on Hole edges is not allowed.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 21px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 10.5px; text-align: left; transform-origin: 384px 10.5px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 175.333px 7.91667px; transform-origin: 175.333px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"font-weight: 700; \"\u003eValid=check_figureSP(hxy, pxy, mseg, epsilon, npxy)\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 3.88333px 7.91667px; transform-origin: 3.88333px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e  \u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 42px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 21px; text-align: left; transform-origin: 384px 21px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 97.65px 7.91667px; transform-origin: 97.65px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eCrossing Segments appears in \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://www.mathworks.com/matlabcentral/cody/problems/1720\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eCody 1720\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 242.167px 7.91667px; transform-origin: 242.167px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e but the test set is not strong. A 7/18/21 solution of size 117 is robust and fast. See the function template for reference material to solve intersecting segments.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 84px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 42px; text-align: left; transform-origin: 384px 42px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 375.883px 7.91667px; transform-origin: 375.883px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe ICFP 2021 Hole In Wall contest site has enabled a public user login to allow submissions. A login must be created to access all the problems and to submit solutions. Solutions are simple text files. Other challenges will show reading files, drawing figures, and producing submission files. To fully access the ICFP/Problems site use \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://poses.live/register\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eRegister Team\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 42.7833px 7.91667px; transform-origin: 42.7833px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e. Anyone can select \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://poses.live/problems\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eProblems Page\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 256.35px 7.91667px; transform-origin: 256.35px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e and then click problem numbers to see the puzzles and to download problem files.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e","function_template":"function valid=check_figureSP(hxy,pxy,mseg,epsilon,npxy)\r\n% hxy hole vertices in order of connection. Last row repeats first for use in inpolygon\r\n% pxy figure original vertices used for initial segment length calculations\r\n% mseg is paired list of connected vertices\r\n% epsilon is allowed stretchiness of segment. hxy,pxy,npxy are all integer\r\n% npxy is figure final vertices used for scoring and Validation\r\n valid=0;\r\n nseg=size(mseg,1);\r\n msegMM=calc_msegMM(pxy,mseg,epsilon,nseg); %Create Min and Max segment integer values\r\n %hplot(hxy,pxy,mseg,size(mseg,1),1);\r\n %hplot3(hxy,npxy,mseg,size(mseg,1),3,segMM);\r\n \r\n%Confirm all final vertices of npxy are in hxy polygon\r\n[in] = inpolygon(npxy(:,1),npxy(:,2),hxy(:,1),hxy(:,2)); % inside or on edge\r\n%check if all vertices are in\r\n\r\n%Confirm all segments are of valid length squared\r\n for i=1:nseg\r\n  nsegL2=0; %calc length squared of segment\r\n  %Check if nsegL2\u003cMin or nsegL2\u003eMax  Min=msegMM(i,1) and Max=msegMM(i,2)\r\n end\r\n \r\n%Confirm all figure segments do not cross hole segments\r\n%Segment/Hole Vertices may touch other vertices and segments\r\n%Intersecting Segments was addressed in Cody 1720\r\n%https://www.mathworks.com/matlabcentral/cody/problems/1720\r\n%A Robust/Fast solution for 1720 was created on 7/18/21 of size 117\r\n \r\n valid=check_intersecting_segments(hxy,mseg,nseg,npxy);\r\n if valid==0,return;end\r\n \r\n valid=check_segments_inpoly(hxy,mseg,npxy);\r\nend % check_figureSP\r\n\r\nfunction valid=check_segments_inpoly(hxy,mseg,npxy)\r\n%Verify whole of segments are within the hole\r\n%Method: Test point along segment at distance \u003c=0.5 from segment start point\r\n valid=0;\r\n dpxy=[]; % start point for each segment\r\n %intra-segment create a point a small delta from starting point; \r\n %mid-point not sufficient\r\n dxdy=[];\r\n dxdyabsmax=[];  % Note: max has a new form of max(m,[],2) to get row max values\r\n dpxy=dpxy+dxdy./dxdyabsmax;\r\n \r\n [in] = inpolygon(dpxy(:,1),dpxy(:,2),hxy(:,1),hxy(:,2)); % inside or on edge\r\n if nnz(in==0),return;end  %nnz is fastest check of a vector all condition\r\n \r\n valid=1;\r\nend %check_segments_inpoly\r\n\r\nfunction valid=check_intersecting_segments(hxy,mseg,nseg,npxy)\r\n%Confirm no figure segments cross hole segments; \r\n % Allowed: \r\n % a) Overlaying segments. \r\n % b) Segments touching hole vertices.\r\n % c) Figure vertices touching hole segments\r\n \r\n valid=0;\r\n nhxy=size(hxy,1)-1;\r\n \r\n for i=1:nseg\r\n  A=[]; % npxy points defined by mseg   A=[a1 a2;a3 a4]\r\n  for j=1:nhxy  %1-2,2-3, end-1 to end  thus why nhxy is 1 less than rows\r\n   B=[]; % hxy points    B=[b1 b2;b3 b4]\r\n   if intersecting(A,B), return;end % intersect detected thus fail\r\n  end\r\n end\r\n \r\n valid=1;\r\nend % check_intersecting_segments\r\n\r\nfunction tf=intersecting(A,B) %\r\n%Correct full solution requires two cross product checks which can be implemented using det\r\n%Segment A [A1;A2],  Segment B [B1;B2]\r\n% Points A1=[a1,a2] A2=[a3,a4] B1=[b1 b2] B2=[b3 b4]  All data in z=0 plane\r\n%p0= B2A1 x B2B1 is det([B2A1;B2B1]) where B2A1 = B2-A1= [b3-a1 b4-a2], B2B1=B2-B1=[b3-b1 b4-b2]\r\n%p1= B2A2 x B2B1 is det([B2A2;B2B1]) where B2A2 = B2-A2= [b3-a3 b4-a4], B2B1=B2-B1=[b3-b1 b4-b2]\r\n%p2= A2B1 x A2A1 is det([A2B1;A2A1]) where A2B1 = A2-B1= [a3-b1 a4-b2], A2A1=A2-A1=[a3-a1 a4-a2]\r\n%p3= A2B2 x A2A1 is det([A2B2;A2A1]) where A2B2 = A2-B2= [a3-b3 a4-b4], A2A1=A2-A1=[a3-a1 a4-a2]\r\n%visualization https://www.desmos.com/calculator/0wr2rfkjbk\r\n%source https://stackoverflow.com/questions/3838329/how-can-i-check-if-two-segments-intersect\r\n% by BenMan95 in ghastly Python not using det or matlab array vectors\r\n%https://www.mathworks.com/matlabcentral/cody/problems/1720\r\n%  Robust Fast solution of size 117 created on 7/18/21 for 1720\r\n%\r\n% Both cross product pair multiplications must be negative for an intersection to occur\r\n% p0p1\u003c0 \u0026\u0026 p2p3\u003c0 for non-endpoint segments intersection. For End point intersection change \u003c to \u003c=\r\n\r\ntf=0;\r\nend % intersecting\r\n\r\n\r\nfunction msegMM=calc_msegMM(pxy,mseg,epsilon,nseg)\r\n%determine Min and Max integer value of allowed length squared for each segment\r\n%abs(Lsqr(npxy,seg(i))/Lsqr(pxy,seg(i))-1)\u003c= epsilon/1000000.\r\n%mseg has indices of connected vertices [nseg,2].  The nseg may exceed number of vertices.\r\n msegMM=zeros(nseg,2);\r\n for i=1:nseg\r\n  Lseg=0; % sum((pxy(mseg(i,1),:)-pxy(mseg(i,2),:)).^2)\r\n  delta=0; % epsilon*Lseg/1000000 and a little tweak\r\n  msegMM(i,:)=[-delta delta]+Lseg;\r\n end\r\nend % calc_msegMM\r\n\r\n%These routines can be used to visualize the data\r\n\r\n% function hplot(vxy,qxy,mseg,Lmseg,id)\r\n% %Need check of segment crossing a hole segment but ignore endpoint\r\n%  [in] = inpolygon(qxy(:,1),qxy(:,2),vxy(:,1),vxy(:,2)); % inside or on edge\r\n%  figure(id)\r\n%   plot(vxy(:,1),vxy(:,2),'k.-') % hole polygon\r\n%   hold on\r\n%   plot(qxy(in,1),qxy(in,2),'b*') % points inside\r\n%   plot(qxy(~in,1),qxy(~in,2),'ro') % points outside\r\n%   for i=1:size(qxy,1)%length(xq)\r\n%    text(qxy(i,1)+.75,qxy(i,2)-1.5,num2str(i),'FontSize',12);\r\n%   end\r\n%   \r\n%   for i=1:Lmseg\r\n%    if in(mseg(i,1))+in(mseg(i,2))\u003c2\r\n%      plot(qxy(mseg(i,:),1),qxy(mseg(i,:),2),'r-') % segment to OOB pt\r\n%    else\r\n%     plot(qxy(mseg(i,:),1),qxy(mseg(i,:),2),'b-')\r\n%    end\r\n%    text(sum(qxy(mseg(i,:),1))/2,sum(qxy(mseg(i,:),2))/2,num2str(i),'Color','b');\r\n%   end\r\n%   \r\n%   %o+*.x_|sd^v\u003e\u003cph\r\n%   %colors ymcrgbwk\r\n%    \r\n%   axis tight\r\n%   axis ij\r\n%   hold off  \r\n% end % hplot\r\n\r\n% function hplot3(vxy,qxy,mseg,Lmseg,id,segMM)\r\n%  segMNM=[segMM(:,1) segMM(:,1)+segMM(:,2) segMM(:,2)];\r\n%  [in] = inpolygon(qxy(:,1),qxy(:,2),vxy(:,1),vxy(:,2)); % inside or on edge\r\n%  figure(id)\r\n%   plot(vxy(:,1),vxy(:,2),'k.-') % hole polygon\r\n%   hold on\r\n%   plot(qxy(in,1),qxy(in,2),'b*') % points inside\r\n%   plot(qxy(~in,1),qxy(~in,2),'ro') % points outside\r\n%   for i=1:size(qxy,1) %length(xq)\r\n%    text(qxy(i,1)+.75,qxy(i,2)-1.5,num2str(i));\r\n%   end\r\n%   \r\n%   for i=1:Lmseg\r\n%    d2seg=(qxy(mseg(i,1),1)-qxy(mseg(i,2),1))^2+(qxy(mseg(i,1),2)-qxy(mseg(i,2),2))^2;\r\n%    if d2seg\u003csegMNM(i,1)\r\n%      plot(qxy(mseg(i,:),1),qxy(mseg(i,:),2),'b-') % segment too short\r\n%    elseif d2seg\u003esegMNM(i,3)\r\n%      plot(qxy(mseg(i,:),1),qxy(mseg(i,:),2),'r-') % segment too long\r\n%    else\r\n%     plot(qxy(mseg(i,:),1),qxy(mseg(i,:),2),'g-') \r\n%    end\r\n%    text(sum(qxy(mseg(i,:),1))/2,sum(qxy(mseg(i,:),2))/2,num2str(i),'Color','b');\r\n%   end\r\n%   \r\n%   %o+*.x_|sd^v\u003e\u003cph\r\n%   %colors ymcrgbwk\r\n%   \r\n%   axis tight\r\n%   axis ij\r\n%   hold off\r\n% end % hplot3\r\n%","test_suite":"%%\r\nhxy=[53 0;100 22;66 68;43 68;0 41;53 0];\r\npxy=[0    48\r\n     9    34\r\n    14    34\r\n    27    41\r\n    30    53\r\n    33    68\r\n    44     0\r\n    44    58\r\n    44    63\r\n    56    68\r\n    59    53\r\n    61    41\r\n    89    21];\r\nmseg=[8     7\r\n     7     4\r\n     4     8\r\n     4     5\r\n     5     8\r\n     8     9\r\n     9     6\r\n     6     5\r\n     9    10\r\n    10    11\r\n    11     8\r\n     8    12\r\n    12    11\r\n    12     7\r\n    10    13\r\n    13     9\r\n     6     2\r\n     2     3\r\n     3     9\r\n     3     1\r\n     1     2];\r\nepsilon=40000;\r\nnpxy=[0    41\r\n    16    36\r\n    20    39\r\n    37    41\r\n    40    53\r\n    43    68\r\n    53     0\r\n    54    58\r\n    54    63\r\n    66    68\r\n    69    53\r\n    71    41\r\n   100    22];\r\nValid=check_figureSP(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=1;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nhxy=[53 0;100 22;66 68;43 68;0 41;53 0];\r\npxy=[0    48\r\n     9    34\r\n    14    34\r\n    27    41\r\n    30    53\r\n    33    68\r\n    44     0\r\n    44    58\r\n    44    63\r\n    56    68\r\n    59    53\r\n    61    41\r\n    89    21];\r\nmseg=[8     7\r\n     7     4\r\n     4     8\r\n     4     5\r\n     5     8\r\n     8     9\r\n     9     6\r\n     6     5\r\n     9    10\r\n    10    11\r\n    11     8\r\n     8    12\r\n    12    11\r\n    12     7\r\n    10    13\r\n    13     9\r\n     6     2\r\n     2     3\r\n     3     9\r\n     3     1\r\n     1     2];\r\nepsilon=40000;\r\nnpxy=pxy;\r\nValid=check_figureSP(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nhxy=[53 0;100 22;66 68;43 68;0 41;53 0];\r\npxy=[0    48\r\n     9    34\r\n    14    34\r\n    27    41\r\n    30    53\r\n    33    68\r\n    44     0\r\n    44    58\r\n    44    63\r\n    56    68\r\n    59    53\r\n    61    41\r\n    89    21];\r\nmseg=[8     7\r\n     7     4\r\n     4     8\r\n     4     5\r\n     5     8\r\n     8     9\r\n     9     6\r\n     6     5\r\n     9    10\r\n    10    11\r\n    11     8\r\n     8    12\r\n    12    11\r\n    12     7\r\n    10    13\r\n    13     9\r\n     6     2\r\n     2     3\r\n     3     9\r\n     3     1\r\n     1     2];\r\nepsilon=40000;\r\nnpxy=[0    41\r\n    16    36\r\n    20    39\r\n    37    41\r\n    40    53\r\n    43    68\r\n    53     0+10\r\n    54    58\r\n    54    63\r\n    66    68\r\n    69    53\r\n    71    41\r\n   100    22];\r\nValid=check_figureSP(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nhxy=[53 0;100 22;66 68;43 68;0 41;53 0];\r\npxy=[0    48\r\n     9    34\r\n    14    34\r\n    27    41\r\n    30    53\r\n    33    68\r\n    44     0\r\n    44    58\r\n    44    63\r\n    56    68\r\n    59    53\r\n    61    41\r\n    89    21];\r\nmseg=[8     7\r\n     7     4\r\n     4     8\r\n     4     5\r\n     5     8\r\n     8     9\r\n     9     6\r\n     6     5\r\n     9    10\r\n    10    11\r\n    11     8\r\n     8    12\r\n    12    11\r\n    12     7\r\n    10    13\r\n    13     9\r\n     6     2\r\n     2     3\r\n     3     9\r\n     3     1\r\n     1     2];\r\nepsilon=40000;\r\nnpxy=[0    41\r\n    16    36\r\n    20    39\r\n    37    41\r\n    40    53\r\n    43    68\r\n    53     0\r\n    54    58\r\n    54    63\r\n    66    68\r\n    69    53\r\n    71    41\r\n   100    22];\r\nValid=check_figureSP(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=1;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nhxy=[53 0;100 22;66 68;43 68;0 41;53 0];\r\npxy=[0    48\r\n     9    34\r\n    14    34\r\n    27    41\r\n    30    53\r\n    33    68\r\n    44     0\r\n    44    58\r\n    44    63\r\n    56    68\r\n    59    53\r\n    61    41\r\n    89    21];\r\nmseg=[8     7\r\n     7     4\r\n     4     8\r\n     4     5\r\n     5     8\r\n     8     9\r\n     9     6\r\n     6     5\r\n     9    10\r\n    10    11\r\n    11     8\r\n     8    12\r\n    12    11\r\n    12     7\r\n    10    13\r\n    13     9\r\n     6     2\r\n     2     3\r\n     3     9\r\n     3     1\r\n     1     2];\r\nepsilon=40000;\r\nnpxy=[0.001    41\r\n    16    36\r\n    20    39\r\n    37    41\r\n    40    53\r\n    43    68\r\n    53     0\r\n    54    58\r\n    54    63\r\n    66    68\r\n    69    53\r\n    71    41\r\n   100    22];\r\nValid=check_figureSP(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0; %non-integer npxy\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nhxy=[53 0;100 22;66 68;43 68;0 41;53 0];\r\npxy=[0    48\r\n     9    34\r\n    14    34\r\n    27    41\r\n    30    53\r\n    33    68\r\n    44     0\r\n    44    58\r\n    44    63\r\n    56    68\r\n    59    53\r\n    61    41\r\n    89    21];\r\nmseg=[8     7\r\n     7     4\r\n     4     8\r\n     4     5\r\n     5     8\r\n     8     9\r\n     9     6\r\n     6     5\r\n     9    10\r\n    10    11\r\n    11     8\r\n     8    12\r\n    12    11\r\n    12     7\r\n    10    13\r\n    13     9\r\n     6     2\r\n     2     3\r\n     3     9\r\n     3     1\r\n     1     2];\r\nepsilon=40000;\r\nnpxy=[0    41\r\n    16+1    36\r\n    20    39\r\n    37    41\r\n    40    53\r\n    43    68\r\n    53     0\r\n    54    58\r\n    54    63\r\n    66    68\r\n    69    53\r\n    71    41\r\n   100    22];\r\nValid=check_figureSP(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nhxy=[15     0\r\n    35    20\r\n    20    44\r\n     0    24\r\n    15     0];\r\npxy=[0    20\r\n    20     0\r\n    20    40\r\n    40    20\r\n    49    45];\r\nmseg=[1     2\r\n     1     3\r\n     2     4\r\n     3     4\r\n     3     5\r\n     4     5];\r\nepsilon=1250;\r\nnpxy=[20    44\r\n     0    24\r\n    35    20\r\n    15     0\r\n     6    25];\r\nValid=check_figureSP(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=1;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n\r\n%%\r\n% Problem 6 shifted up7,left10, 1 seg fail\r\nepsilon=150000;\r\nhxy=[164   164\r\n   121   189\r\n    71   189\r\n    28   164\r\n     3   121\r\n     3    71\r\n    28    28\r\n    71     3\r\n   121     3\r\n   164    28\r\n   189    71\r\n    96    96\r\n   189   121\r\n   164   164];\r\npxy=[36    86\r\n    36   141\r\n    36   156\r\n    41   156\r\n    46   131\r\n    51    56\r\n    56   116\r\n    56   141\r\n    66   116\r\n    71    81\r\n    71    96\r\n    71   131\r\n    71   156\r\n    86    81\r\n    86    96\r\n    86   131\r\n    86   141\r\n    86   156\r\n    91   116\r\n    96    36\r\n   101   116\r\n   106    81\r\n   106    96\r\n   106   131\r\n   106   141\r\n   106   156\r\n   121    81\r\n   121    96\r\n   121   131\r\n   121   156\r\n   126   116\r\n   136   116\r\n   136   141\r\n   141    56\r\n   146   131\r\n   151   156\r\n   156    86\r\n   156   141\r\n   156   156];\r\nmseg=[2     3\r\n     3     4\r\n     4     8\r\n     8     2\r\n     2     1\r\n     1     6\r\n     6    20\r\n    20    34\r\n    34    37\r\n    37    38\r\n    38    33\r\n    33    36\r\n    36    39\r\n    39    38\r\n    33    30\r\n    30    26\r\n    26    25\r\n    25    33\r\n     8    17\r\n    17    18\r\n    18    13\r\n    13     8\r\n    17    25\r\n    10    11\r\n    11    15\r\n    15    14\r\n    14    10\r\n    22    23\r\n    23    28\r\n    28    27\r\n    27    22\r\n     6    10\r\n    10     1\r\n    34    27\r\n    27    37\r\n     5     7\r\n     7     9\r\n     9    12\r\n    12    16\r\n    16    19\r\n    19    21\r\n    21    24\r\n    24    29\r\n    29    31\r\n    31    32\r\n    32    35\r\n    15    19\r\n    23    21];\r\nnpxy=[26    79\r\n    26   134\r\n    26   149\r\n    31   149\r\n    36   124\r\n    41    49\r\n    46   109\r\n    46   134\r\n    56   109\r\n    61    74\r\n    61    89\r\n    61   124\r\n    61   149\r\n    76    74\r\n    76    89\r\n    76   124\r\n    76   134\r\n    76   149\r\n    81   109\r\n    86    29\r\n    91   109\r\n    96    74\r\n    96    89\r\n    96   124\r\n    96   134\r\n    96   149\r\n   111    74\r\n   111    89\r\n   111   124\r\n   111   149\r\n   116   109\r\n   126   109\r\n   126   134\r\n   131    49\r\n   136   124\r\n   141   149\r\n   146    79\r\n   146   134\r\n   146   149];\r\nValid=check_figureSP(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\n%problem 6 with rotate/shift, 1 seg fail\r\nepsilon=150000;\r\nhxy=[164   164\r\n   121   189\r\n    71   189\r\n    28   164\r\n     3   121\r\n     3    71\r\n    28    28\r\n    71     3\r\n   121     3\r\n   164    28\r\n   189    71\r\n    96    96\r\n   189   121\r\n   164   164];\r\npxy=[36    86\r\n    36   141\r\n    36   156\r\n    41   156\r\n    46   131\r\n    51    56\r\n    56   116\r\n    56   141\r\n    66   116\r\n    71    81\r\n    71    96\r\n    71   131\r\n    71   156\r\n    86    81\r\n    86    96\r\n    86   131\r\n    86   141\r\n    86   156\r\n    91   116\r\n    96    36\r\n   101   116\r\n   106    81\r\n   106    96\r\n   106   131\r\n   106   141\r\n   106   156\r\n   121    81\r\n   121    96\r\n   121   131\r\n   121   156\r\n   126   116\r\n   136   116\r\n   136   141\r\n   141    56\r\n   146   131\r\n   151   156\r\n   156    86\r\n   156   141\r\n   156   156];\r\nmseg=[2     3\r\n     3     4\r\n     4     8\r\n     8     2\r\n     2     1\r\n     1     6\r\n     6    20\r\n    20    34\r\n    34    37\r\n    37    38\r\n    38    33\r\n    33    36\r\n    36    39\r\n    39    38\r\n    33    30\r\n    30    26\r\n    26    25\r\n    25    33\r\n     8    17\r\n    17    18\r\n    18    13\r\n    13     8\r\n    17    25\r\n    10    11\r\n    11    15\r\n    15    14\r\n    14    10\r\n    22    23\r\n    23    28\r\n    28    27\r\n    27    22\r\n     6    10\r\n    10     1\r\n    34    27\r\n    27    37\r\n     5     7\r\n     7     9\r\n     9    12\r\n    12    16\r\n    16    19\r\n    19    21\r\n    21    24\r\n    24    29\r\n    29    31\r\n    31    32\r\n    32    35\r\n    15    19\r\n    23    21];\r\nnpxy=[53   156\r\n   108   156\r\n   123   156\r\n   123   151\r\n    98   146\r\n    23   141\r\n    83   136\r\n   108   136\r\n    83   126\r\n    48   121\r\n    63   121\r\n    98   121\r\n   123   121\r\n    48   106\r\n    63   106\r\n    98   106\r\n   108   106\r\n   123   106\r\n    83   101\r\n     3    96\r\n    83    91\r\n    48    86\r\n    63    86\r\n    98    86\r\n   108    86\r\n   123    86\r\n    48    71\r\n    63    71\r\n    98    71\r\n   123    71\r\n    83    66\r\n    83    56\r\n   108    56\r\n    23    51\r\n    98    46\r\n   123    41\r\n    53    36\r\n   108    36\r\n   123    36];\r\nValid=check_figureSP(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nepsilon=100000; %vertext to vertex across wall\r\nhxy=[0 0;0 2;2 2;1 1;2 0;0 0];\r\npxy=[0 0;0 2;2 2;2 0];\r\nmseg=[1 2;2 3;3 4;4 1];\r\nnpxy=[0 0;0 2;2 2;2 0];\r\nValid=check_figureSP(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nepsilon=100000; % mid seg connects across wall\r\nhxy=[0 0;0 4;4 4;2 2;4 0;0 0];\r\npxy=[0 0;0 4;3 3;3 1];\r\nmseg=[1 2;2 3;3 4;4 1];\r\nnpxy=[0 0;0 4;3 3;3 1];\r\nValid=check_figureSP(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))\r\n%%\r\nepsilon=100000; %mid seg intersect node\r\nhxy=[0 0;0 4;4 4;1 2;4 2;1 1;4 0;0 0];\r\npxy=[0 0;0 4;4 4;4 0];\r\nmseg=[1 2;2 3;3 4;4 1];\r\nnpxy=[0 0;0 4;4 4;4 0];\r\nValid=check_figureSP(hxy,pxy,mseg,epsilon,npxy);\r\nexpValid=0;\r\nfprintf('Expected Valid: %i  Valid: %i\\n',expValid,Valid);\r\nassert(isequal(Valid,expValid))","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":2,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2021-07-19T18:59:14.000Z","updated_at":"2021-07-19T19:33:01.000Z","published_at":"2021-07-19T19:33:01.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://www.icfpconference.org/\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eICFP\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e held its annual 3-day contest in July 2021 with \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://icfpcontest2021.github.io/\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eHole-In-Wall\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. Contest \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://icfpcontest2021.github.io/spec-v4.1.pdf\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eSpecification\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe contest folds the figure in Red to fit within the hole shown in light grey \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:customXml w:element=\\\"image\\\"\u003e\u003cw:customXmlPr\u003e\u003cw:attr w:name=\\\"height\\\" w:val=\\\"237\\\"/\u003e\u003cw:attr w:name=\\\"width\\\" w:val=\\\"238\\\"/\u003e\u003cw:attr w:name=\\\"verticalAlign\\\" w:val=\\\"middle\\\"/\u003e\u003cw:attr w:name=\\\"altText\\\" w:val=\\\"\\\"/\u003e\u003cw:attr w:name=\\\"relationshipId\\\" w:val=\\\"rId1\\\"/\u003e\u003c/w:customXmlPr\u003e\u003c/w:customXml\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis Challenge is to evaluate the complete Figure validation defined in the \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://icfpcontest2021.github.io/spec-v4.1.pdf\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eSpecification\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e when given the hole vertices in hxy, original figure vertices in pxy, updated figure vertices in npxy, segment matrix mseg, and epsilon. The hxy matrix is [N+1,2] where N is number of hole vertices. A repeat of the first vertex occurs for drawing the hole.  The pxy(original) and npxy(final) matrices are [P,2] where P is the number of figure vertices. The mseg indicates connected vertices that must maintain a length as a function of epsilon from the original length. The final figure vertices must be integer thus the allowed fuzziness of segment lengths.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eValid is 1) all npxy vertices must be on or inside the hole, hxy 2) all npxy segments must match the pxy segments within an allowed epsilon, abs(Lsqr(npxy,seg(i,:))/Lsqr(pxy,seg(i,:))-1)\u0026lt;= epsilon/1000000.  Lsqr is length squared 3) No figure segments may cross hole segments. Segment vertices may touch segments. No part of any Red segment should be outside the hole shown in light grey.   4) Pathological cases of Segments crossing Wall region between Hole Vertices or from figure vertices on Hole edges is not allowed.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eValid=check_figureSP(hxy, pxy, mseg, epsilon, npxy)\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e  \u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eCrossing Segments appears in \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://www.mathworks.com/matlabcentral/cody/problems/1720\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eCody 1720\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e but the test set is not strong. A 7/18/21 solution of size 117 is robust and fast. See the function template for reference material to solve intersecting segments.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe ICFP 2021 Hole In Wall contest site has enabled a public user login to allow submissions. A login must be created to access all the problems and to submit solutions. Solutions are simple text files. Other challenges will show reading files, drawing figures, and producing submission files. To fully access the ICFP/Problems site use \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://poses.live/register\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eRegister Team\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. Anyone can select \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://poses.live/problems\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eProblems Page\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e and then click problem numbers to see the puzzles and to download problem files.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\",\"relationship\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"target\":\"/media/image1.png\",\"relationshipId\":\"rId1\"}]},{\"partUri\":\"/media/image1.png\",\"contentType\":\"image/png\",\"content\":\"data:image/png;base64,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\",\"relationship\":null}],\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"target\":\"/matlab/document.xml\",\"relationshipId\":\"rId1\"}]}"},{"id":737,"title":"Criss_Cross_000 : Unique elements in a Square array","description":"Criss Cross matrix puzzle - Easy: Square matrix, Unique elements\r\n\r\nArrange the \"words\" into a solid square such that all words are used.\r\n\r\nGiven an array of row words and an array of column words make the unique Square.\r\n\r\nThere is no flipping or rotating in this simplest case.\r\n\r\nexample:\r\n\r\nM_orig =[1 2 3; 4 5 6; 7 8 9]\r\n\r\n*Inputs:*\r\n\r\nvr = [1 2 3; 4 5 6; 7 8 9]\r\n\r\nscramled gives vr =[7 8 9; 1 2 3; 4 5 6]\r\n\r\nvc =[1 2 3; 4 5 6; 7 8 9]\r\n\r\nscrambled gives vc =[3 1 2;6 4 5; 9 7 8]\r\n\r\n*Output:*\r\n\r\nM_out=[1 2 3; 4 5 6; 7 8 9]\r\n\r\nMax size : 4096\r\n\r\n\r\nThis is the first in a series of Criss Cross puzzles.\r\n\r\nFollow up puzzles will have non-unique values, non-identified row or col, and there are quite a few other variations.","description_html":"\u003cp\u003eCriss Cross matrix puzzle - Easy: Square matrix, Unique elements\u003c/p\u003e\u003cp\u003eArrange the \"words\" into a solid square such that all words are used.\u003c/p\u003e\u003cp\u003eGiven an array of row words and an array of column words make the unique Square.\u003c/p\u003e\u003cp\u003eThere is no flipping or rotating in this simplest case.\u003c/p\u003e\u003cp\u003eexample:\u003c/p\u003e\u003cp\u003eM_orig =[1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003e\u003cb\u003eInputs:\u003c/b\u003e\u003c/p\u003e\u003cp\u003evr = [1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003escramled gives vr =[7 8 9; 1 2 3; 4 5 6]\u003c/p\u003e\u003cp\u003evc =[1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003escrambled gives vc =[3 1 2;6 4 5; 9 7 8]\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eM_out=[1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003eMax size : 4096\u003c/p\u003e\u003cp\u003eThis is the first in a series of Criss Cross puzzles.\u003c/p\u003e\u003cp\u003eFollow up puzzles will have non-unique values, non-identified row or col, and there are quite a few other variations.\u003c/p\u003e","function_template":"function M_out = Criss_Cross(vr,vc)\r\n\r\n M_out=vr*0;\r\n \r\nend","test_suite":"%%\r\nformat long\r\nformat compact\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed)\r\n\r\nn=4;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n)\r\n\r\nvr=M(1:n,:);\r\nvr=sortrows(vr);\r\n\r\nvc=M(:,1:n);\r\nvc=sortrows(vc')';\r\n\r\ntic\r\nM_out=Criss_Cross(vr,vc);\r\ntoc\r\nM_out\r\n\r\nassert(isequal(M,M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed)\r\n\r\nn=8;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n)\r\n\r\nvr=M(1:n,:);\r\nvr=sortrows(vr);\r\n\r\nvc=M(:,1:n);\r\nvc=sortrows(vc')';\r\n\r\ntic\r\nM_out=Criss_Cross(vr,vc);\r\ntoc\r\nM_out\r\n\r\nassert(isequal(M,M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed)\r\n\r\nn=128;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n);\r\n\r\nvr=M(1:n,:);\r\nvr=sortrows(vr);\r\n\r\nvc=M(:,1:n);\r\nvc=sortrows(vc')';\r\n\r\ntic\r\nM_out=Criss_Cross(vr,vc);\r\ntoc\r\n\r\nassert(isequal(M,M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed)\r\n\r\nn=1024;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n);\r\n\r\nvr=M(1:n,:);\r\nvr=sortrows(vr);\r\n\r\nvc=M(:,1:n);\r\nvc=sortrows(vc')';\r\n\r\ntic\r\nM_out=Criss_Cross(vr,vc);\r\ntoc\r\n\r\nassert(isequal(M,M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed)\r\n\r\nn=4096;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n);\r\n\r\nvr=M(1:n,:);\r\nvr=sortrows(vr);\r\n\r\nvc=M(:,1:n);\r\nvc=sortrows(vc')';\r\n\r\ntic\r\nM_out=Criss_Cross(vr,vc);\r\ntoc\r\n\r\nassert(isequal(M,M_out));","published":true,"deleted":false,"likes_count":1,"comments_count":0,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":8,"test_suite_updated_at":"2012-06-03T20:42:28.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2012-06-03T18:05:05.000Z","updated_at":"2012-06-04T02:25:58.000Z","published_at":"2012-06-03T19:37:49.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eCriss Cross matrix puzzle - Easy: Square matrix, Unique elements\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eArrange the \\\"words\\\" into a solid square such that all words are used.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eGiven an array of row words and an array of column words make the unique Square.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThere is no flipping or rotating in this simplest case.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eexample:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eM_orig =[1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInputs:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003evr = [1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003escramled gives vr =[7 8 9; 1 2 3; 4 5 6]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003evc =[1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003escrambled gives vc =[3 1 2;6 4 5; 9 7 8]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eOutput:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eM_out=[1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eMax size : 4096\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis is the first in a series of Criss Cross puzzles.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eFollow up puzzles will have non-unique values, non-identified row or col, and there are quite a few other variations.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":738,"title":"Criss_Cross_010 : Unique elements, Square array, Words in one array","description":"Criss Cross matrix puzzle - Square matrix, Unique elements, Single Word List\r\n\r\nArrange the \"words\" into a solid square such that all words are used.\r\n\r\nGiven an array of words make the original Square or Square Transpose.\r\n\r\nWords are left to Right or Top to Bottom. No fliplr or flipud.\r\n\r\n*Example:*\r\n\r\nM_orig = [1 2 3; 4 5 6; 7 8 9]\r\n\r\nvr = [1 2 3; 4 5 6; 7 8 9]\r\n\r\nvc = [1 2 3; 4 5 6; 7 8 9]\r\n\r\n*Inputs:*\r\n\r\nw = [1 2 3; 4 5 6; 7 8 9;1 4 7; 2 5 8; 3 6 9]\r\n\r\nsorted w gives\r\n\r\nw = [1 2 3; 1 4 7; 2 5 8; 3 6 9; 4 5 6; 7 8 9]\r\n\r\n\r\n*Output:*\r\n\r\nM_out = [1 2 3; 4 5 6; 7 8 9] or\r\n\r\nM_out=[1 4 7; 2 5 8; 3 6 9]\r\n\r\n\r\nMax size : 256\r\n\r\nThis is the second in the Criss Cross puzzles series.\r\n\r\nFollow up puzzles will have non-unique values and quite a few other variations.\r\n","description_html":"\u003cp\u003eCriss Cross matrix puzzle - Square matrix, Unique elements, Single Word List\u003c/p\u003e\u003cp\u003eArrange the \"words\" into a solid square such that all words are used.\u003c/p\u003e\u003cp\u003eGiven an array of words make the original Square or Square Transpose.\u003c/p\u003e\u003cp\u003eWords are left to Right or Top to Bottom. No fliplr or flipud.\u003c/p\u003e\u003cp\u003e\u003cb\u003eExample:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eM_orig = [1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003evr = [1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003evc = [1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003e\u003cb\u003eInputs:\u003c/b\u003e\u003c/p\u003e\u003cp\u003ew = [1 2 3; 4 5 6; 7 8 9;1 4 7; 2 5 8; 3 6 9]\u003c/p\u003e\u003cp\u003esorted w gives\u003c/p\u003e\u003cp\u003ew = [1 2 3; 1 4 7; 2 5 8; 3 6 9; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eM_out = [1 2 3; 4 5 6; 7 8 9] or\u003c/p\u003e\u003cp\u003eM_out=[1 4 7; 2 5 8; 3 6 9]\u003c/p\u003e\u003cp\u003eMax size : 256\u003c/p\u003e\u003cp\u003eThis is the second in the Criss Cross puzzles series.\u003c/p\u003e\u003cp\u003eFollow up puzzles will have non-unique values and quite a few other variations.\u003c/p\u003e","function_template":"function M_out = Criss_Cross(w)\r\n\r\n M_out=zeros(size(w,2));\r\n \r\nend","test_suite":"%%\r\nformat long\r\nformat compact\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed);\r\n\r\nn=4;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n)\r\n\r\nvr=M(1:n,:);\r\nvc=M(:,1:n);\r\n\r\nw=[vr;vc'];\r\nw=sortrows(w);\r\n\r\nM_out=Criss_Cross(w)\r\n\r\nassert(isequal(M,M_out)||isequal(M',M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed);\r\n\r\nn=8;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n)\r\n\r\nvr=M(1:n,:);\r\nvc=M(:,1:n);\r\n\r\nw=[vr;vc'];\r\nw=sortrows(w);\r\n\r\nM_out=Criss_Cross(w)\r\n\r\nassert(isequal(M,M_out)||isequal(M',M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed);\r\n\r\nn=16;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n);\r\n\r\nvr=M(1:n,:);\r\nvc=M(:,1:n);\r\n\r\nw=[vr;vc'];\r\nw=sortrows(w);\r\n\r\ntic\r\nM_out=Criss_Cross(w);\r\ntoc\r\n\r\nassert(isequal(M,M_out)||isequal(M',M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed);\r\n\r\nn=16;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n);\r\n\r\nvr=M(1:n,:);\r\nvc=M(:,1:n);\r\n\r\nw=[vr;vc'];\r\nw=sortrows(w);\r\n\r\ntic\r\nM_out=Criss_Cross(w);\r\ntoc\r\n\r\nassert(isequal(M,M_out)||isequal(M',M_out));\r\n%%\r\nn=256;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n);\r\n\r\nvr=M(1:n,:);\r\nvc=M(:,1:n);\r\n\r\nw=[vr;vc'];\r\nw=sortrows(w);\r\n\r\ntic\r\nM_out=Criss_Cross(w);\r\ntoc\r\n\r\nassert(isequal(M,M_out)||isequal(M',M_out));","published":true,"deleted":false,"likes_count":1,"comments_count":0,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":8,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2012-06-03T20:11:23.000Z","updated_at":"2012-06-04T02:27:22.000Z","published_at":"2012-06-03T21:38:39.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eCriss Cross matrix puzzle - Square matrix, Unique elements, Single Word List\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eArrange the \\\"words\\\" into a solid square such that all words are used.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eGiven an array of words make the original Square or Square Transpose.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eWords are left to Right or Top to Bottom. No fliplr or flipud.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eExample:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eM_orig = [1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003evr = [1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003evc = [1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInputs:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003ew = [1 2 3; 4 5 6; 7 8 9;1 4 7; 2 5 8; 3 6 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003esorted w gives\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003ew = [1 2 3; 1 4 7; 2 5 8; 3 6 9; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eOutput:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eM_out = [1 2 3; 4 5 6; 7 8 9] or\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eM_out=[1 4 7; 2 5 8; 3 6 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eMax size : 256\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis is the second in the Criss Cross puzzles series.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eFollow up puzzles will have non-unique values and quite a few other variations.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"}],"term":"tag:\"cross\"","current_player_id":null,"fields":[{"name":"page","type":"integer","callback":null,"default":1,"directive":null,"facet":null,"facet_method":"and","operator":null,"param":null,"static":null,"prepend":true},{"name":"per_page","type":"integer","callback":null,"default":50,"directive":null,"facet":null,"facet_method":"and","operator":null,"param":null,"static":null,"prepend":true},{"name":"sort","type":"string","callback":null,"default":null,"directive":null,"facet":null,"facet_method":"and","operator":null,"param":null,"static":null,"prepend":true},{"name":"body","type":"text","callback":null,"default":"*:*","directive":null,"facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":false},{"name":"group","type":"string","callback":null,"default":null,"directive":"group","facet":true,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"difficulty_rating_bin","type":"string","callback":null,"default":null,"directive":"difficulty_rating_bin","facet":true,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"id","type":"integer","callback":null,"default":null,"directive":"id","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"tag","type":"string","callback":null,"default":null,"directive":"tag","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"product","type":"string","callback":null,"default":null,"directive":"product","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"created_at","type":"timeframe","callback":{},"default":null,"directive":"created_at","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"profile_id","type":"integer","callback":null,"default":null,"directive":"author_id","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"created_by","type":"string","callback":null,"default":null,"directive":"author","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"player_id","type":"integer","callback":null,"default":null,"directive":"solver_id","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"player","type":"string","callback":null,"default":null,"directive":"solver","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"solvers_count","type":"integer","callback":null,"default":null,"directive":"solvers_count","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"comments_count","type":"integer","callback":null,"default":null,"directive":"comments_count","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"likes_count","type":"integer","callback":null,"default":null,"directive":"likes_count","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"leader_id","type":"integer","callback":null,"default":null,"directive":"leader_id","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true},{"name":"leading_solution","type":"integer","callback":null,"default":null,"directive":"leading_solution","facet":null,"facet_method":"and","operator":null,"param":"term","static":null,"prepend":true}],"filters":[{"name":"asset_type","type":"string","callback":null,"default":null,"directive":null,"facet":null,"facet_method":"and","operator":null,"param":null,"static":"\"cody:problem\"","prepend":true},{"name":"profile_id","type":"integer","callback":{},"default":null,"directive":null,"facet":null,"facet_method":"and","operator":null,"param":"author_id","static":null,"prepend":true}],"query":{"params":{"per_page":50,"term":"tag:\"cross\"","current_player":null,"sort":"map(difficulty_value,0,0,999) asc"},"parser":"MathWorks::Search::Solr::QueryParser","directives":{"term":{"directives":{"tag":[["tag:\"cross\"","","\"","cross","\""]]}}},"facets":{"#\u003cMathWorks::Search::Field:0x00007ffbbd69c448\u003e":null,"#\u003cMathWorks::Search::Field:0x00007ffbbd69c3a8\u003e":null},"filters":{"#\u003cMathWorks::Search::Field:0x00007ffbbd69bae8\u003e":"\"cody:problem\""},"fields":{"#\u003cMathWorks::Search::Field:0x00007ffbbd69c6c8\u003e":1,"#\u003cMathWorks::Search::Field:0x00007ffbbd69c628\u003e":50,"#\u003cMathWorks::Search::Field:0x00007ffbbd69c588\u003e":"map(difficulty_value,0,0,999) asc","#\u003cMathWorks::Search::Field:0x00007ffbbd69c4e8\u003e":"tag:\"cross\""},"user_query":{"#\u003cMathWorks::Search::Field:0x00007ffbbd69c4e8\u003e":"tag:\"cross\""},"queried_facets":{}},"query_backend":{"connection":{"configuration":{"index_url":"http://index-op-v2/solr/","query_url":"http://search-op-v2/solr/","direct_access_index_urls":["http://index-op-v2/solr/"],"direct_access_query_urls":["http://search-op-v2/solr/"],"timeout":10,"vhost":"search","exchange":"search.topic","heartbeat":30,"pre_index_mode":false,"host":"rabbitmq-eks","port":5672,"username":"cody-search","password":"78X075ddcV44","virtual_host":"search","indexer":"amqp","http_logging":"true","core":"cody"},"query_connection":{"uri":"http://search-op-v2/solr/cody/","proxy":null,"connection":{"parallel_manager":null,"headers":{"User-Agent":"Faraday v1.0.1"},"params":{},"options":{"params_encoder":"Faraday::FlatParamsEncoder","proxy":null,"bind":null,"timeout":null,"open_timeout":null,"read_timeout":null,"write_timeout":null,"boundary":null,"oauth":null,"context":null,"on_data":null},"ssl":{"verify":true,"ca_file":null,"ca_path":null,"verify_mode":null,"cert_store":null,"client_cert":null,"client_key":null,"certificate":null,"private_key":null,"verify_depth":null,"version":null,"min_version":null,"max_version":null},"default_parallel_manager":null,"builder":{"adapter":{"name":"Faraday::Adapter::NetHttp","args":[],"block":null},"handlers":[{"name":"Faraday::Response::RaiseError","args":[],"block":null}],"app":{"app":{"ssl_cert_store":{"verify_callback":null,"error":null,"error_string":null,"chain":null,"time":null},"app":{},"connection_options":{},"config_block":null}}},"url_prefix":"http://search-op-v2/solr/cody/","manual_proxy":false,"proxy":null},"update_format":"RSolr::JSON::Generator","update_path":"update","options":{"url":"http://search-op-v2/solr/cody"}}},"query":{"params":{"per_page":50,"term":"tag:\"cross\"","current_player":null,"sort":"map(difficulty_value,0,0,999) asc"},"parser":"MathWorks::Search::Solr::QueryParser","directives":{"term":{"directives":{"tag":[["tag:\"cross\"","","\"","cross","\""]]}}},"facets":{"#\u003cMathWorks::Search::Field:0x00007ffbbd69c448\u003e":null,"#\u003cMathWorks::Search::Field:0x00007ffbbd69c3a8\u003e":null},"filters":{"#\u003cMathWorks::Search::Field:0x00007ffbbd69bae8\u003e":"\"cody:problem\""},"fields":{"#\u003cMathWorks::Search::Field:0x00007ffbbd69c6c8\u003e":1,"#\u003cMathWorks::Search::Field:0x00007ffbbd69c628\u003e":50,"#\u003cMathWorks::Search::Field:0x00007ffbbd69c588\u003e":"map(difficulty_value,0,0,999) asc","#\u003cMathWorks::Search::Field:0x00007ffbbd69c4e8\u003e":"tag:\"cross\""},"user_query":{"#\u003cMathWorks::Search::Field:0x00007ffbbd69c4e8\u003e":"tag:\"cross\""},"queried_facets":{}},"options":{"fields":["id","difficulty_rating"]},"join":" "},"results":[{"id":43125,"difficulty_rating":"easy"},{"id":42762,"difficulty_rating":"easy-medium"},{"id":52328,"difficulty_rating":"medium"},{"id":52334,"difficulty_rating":"medium"},{"id":737,"difficulty_rating":"unrated"},{"id":738,"difficulty_rating":"unrated"}]}}