{"group":{"id":1,"name":"Community","lockable":false,"created_at":"2012-01-18T18:02:15.000Z","updated_at":"2025-12-14T01:33:56.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":"2025-12-14T00: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":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":25,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2016-03-05T21:58:07.000Z","updated_at":"2026-03-29T16:54:04.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":1634,"title":"Kurchan Square - Evaluation Function","description":"Evaluate a Kurchan square. An NxN square with values 1:N^2.\r\n\r\nGiven a square matrix determine the products of each row, column, diagonal, and anti-diagonal. \r\n\r\nThe K-value is the Max minus the Minimum of the these products.\r\n\r\nExample: m=[5 1 8;3 9 4;7 2 6]\r\n\r\nRow Products: 40,108, and 84.  Column products 105, 18, and 192.\r\n\r\nDiagonal Products: 270, 1*4*7=28, and 8*3*2=48.\r\n\r\nAnti-Diagonal Products: 8*9*7=504, 1*3*6=18, and 5*4*2=40.\r\n\r\nK is thus 504-18 = 486.  [ Max of all products - Min of all products ]\r\n\r\n*Input:* Square Matrix\r\n\r\n*Output:* Kurchan Score\r\n\r\n*Related Challenges:*\r\n\r\n1) Minimize Kurchan Squares (N=4:9)\r\n\r\n2) Minimize Kurchan Squares (N=10:20) [Very large numbers]\r\n\r\n3) Maximize Sum of Products (N=4:9) and a Large number Challenge\r\n\r\n4) Minimize Sum of Products (N=4:9) and a Large number Challenge\r\n","description_html":"\u003cp\u003eEvaluate a Kurchan square. An NxN square with values 1:N^2.\u003c/p\u003e\u003cp\u003eGiven a square matrix determine the products of each row, column, diagonal, and anti-diagonal.\u003c/p\u003e\u003cp\u003eThe K-value is the Max minus the Minimum of the these products.\u003c/p\u003e\u003cp\u003eExample: m=[5 1 8;3 9 4;7 2 6]\u003c/p\u003e\u003cp\u003eRow Products: 40,108, and 84.  Column products 105, 18, and 192.\u003c/p\u003e\u003cp\u003eDiagonal Products: 270, 1*4*7=28, and 8*3*2=48.\u003c/p\u003e\u003cp\u003eAnti-Diagonal Products: 8*9*7=504, 1*3*6=18, and 5*4*2=40.\u003c/p\u003e\u003cp\u003eK is thus 504-18 = 486.  [ Max of all products - Min of all products ]\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e Square Matrix\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e Kurchan Score\u003c/p\u003e\u003cp\u003e\u003cb\u003eRelated Challenges:\u003c/b\u003e\u003c/p\u003e\u003cp\u003e1) Minimize Kurchan Squares (N=4:9)\u003c/p\u003e\u003cp\u003e2) Minimize Kurchan Squares (N=10:20) [Very large numbers]\u003c/p\u003e\u003cp\u003e3) Maximize Sum of Products (N=4:9) and a Large number Challenge\u003c/p\u003e\u003cp\u003e4) Minimize Sum of Products (N=4:9) and a Large number Challenge\u003c/p\u003e","function_template":"function K=kurchan_score(m)\r\n K=0;\r\nend","test_suite":"%%\r\nm=[5 1 8;3 9 4;7 2 6];\r\nK=kurchan_score(m) % 486\r\nassert(K==486)\r\n\r\n%%\r\nm=[1 24\t65 80 68 41 54 36 39\r\n49 51 28 14 67 57 77 2 45\r\n37 23 40 42 6 10 81 55 69\r\n74 58 3 30 16 43 32 44 70\r\n29 63 79 60 53 35 27 15 4\r\n52 8 31 62 72 73 5 50 25\r\n33 20 22 46 7 71 56 78 18\r\n61 21 38 9 48 13 19 76 66\r\n64 75 59 12 47 11 17 34 26];\r\ntic\r\nK=uint64(kurchan_score(m)) %  481200422400\r\ntoc\r\nassert(K==481200422400)\r\n%%\r\nv=[ 1     6     2     9     3     8     4     5     7]; % 366\r\nm=reshape(v,3,[]);\r\nK=uint64(kurchan_score(m))\r\nassert(K==366)\r\n%%\r\nv=[ 8    2    3    7    5    1    9    4    6]; % 486\r\nm=reshape(v,3,[]);\r\nK=uint64(kurchan_score(m))\r\nassert(K==486)\r\n%%\r\nv=[ 9 11 12 7 10 15 5 6 2 14 8 4 3 13 1 16];\r\nm=reshape(v,4,[]); % 29590\r\nK=uint64(kurchan_score(m))\r\nassert(K==29590)\r\n%%\r\nv=[ 1 16 15 6 12 3 2 8 7 9 14 13 10 11 4 5];\r\nm=reshape(v,4,[]); % 11256\r\nK=uint64(kurchan_score(m))\r\nassert(K==11256)\r\n\r\n\r\n","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":34,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2013-06-09T21:14:35.000Z","updated_at":"2025-12-05T13:26:41.000Z","published_at":"2013-06-09T21:43:14.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\u003eEvaluate a Kurchan square. An NxN square with values 1:N^2.\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 a square matrix determine the products of each row, column, diagonal, and anti-diagonal.\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\u003eThe K-value is the Max minus the Minimum of the these products.\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: m=[5 1 8;3 9 4;7 2 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\u003eRow Products: 40,108, and 84. Column products 105, 18, and 192.\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\u003eDiagonal Products: 270, 1*4*7=28, and 8*3*2=48.\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\u003eAnti-Diagonal Products: 8*9*7=504, 1*3*6=18, and 5*4*2=40.\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\u003eK is thus 504-18 = 486. [ Max of all products - Min of all products ]\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\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Square Matrix\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\u003cw:r\u003e\u003cw:t\u003e Kurchan Score\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\u003eRelated Challenges:\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\u003e1) Minimize Kurchan Squares (N=4: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\u003e2) Minimize Kurchan Squares (N=10:20) [Very large numbers]\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\u003e3) Maximize Sum of Products (N=4:9) and a Large number Challenge\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\u003e4) Minimize Sum of Products (N=4:9) and a Large number Challenge\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":834,"title":"Solve Quadratic : No * - or key functions permitted","description":"Solve the quadratic equation *ax^2+bx+c=0*.  However, some of the normal functions and symbols are not allowed.\r\n\r\nx=[ -b +/- sqrt ( b^2 - 4ac ) ] / ( 2a ) \r\n\r\n\r\n*Unallowed functions and symbols:* \r\n\r\nroots mtimes cross prod cumprod times mldivide mrdivide dot numstr int2str dec2bin * / \\ - ^ '\r\n\r\nDerivative of Aurelien's \u003chttp://www.mathworks.com/matlabcentral/cody/problems/813-multiply-2-numbers Cody 813 Multiply 2 numbers\u003e\r\n\r\nAlso related to \u003chttp://www.mathworks.com/matlabcentral/cody/problems/833-find-third-side-of-a-right-triangle-given-hypotenuse-and-a-side-no-or-other-functions-allowed/solutions/map Cody 833 Side of a Triangle\u003e \r\n\r\nTest suite \"disallowed function usage check\" courtesy of Aurelien Queffurust.\r\n\r\nExample : \r\n\r\n*Input*\r\n\r\na= 1; b= 1; c=1\r\n\r\n*Output* \r\n\r\n x(1)= -0.5+0.866i; x(2)= -0.5-0.866i","description_html":"\u003cp\u003eSolve the quadratic equation \u003cb\u003eax^2+bx+c=0\u003c/b\u003e.  However, some of the normal functions and symbols are not allowed.\u003c/p\u003e\u003cp\u003ex=[ -b +/- sqrt ( b^2 - 4ac ) ] / ( 2a )\u003c/p\u003e\u003cp\u003e\u003cb\u003eUnallowed functions and symbols:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eroots mtimes cross prod cumprod times mldivide mrdivide dot numstr int2str dec2bin * / \\ - ^ '\u003c/p\u003e\u003cp\u003eDerivative of Aurelien's \u003ca href=\"http://www.mathworks.com/matlabcentral/cody/problems/813-multiply-2-numbers\"\u003eCody 813 Multiply 2 numbers\u003c/a\u003e\u003c/p\u003e\u003cp\u003eAlso related to \u003ca href=\"http://www.mathworks.com/matlabcentral/cody/problems/833-find-third-side-of-a-right-triangle-given-hypotenuse-and-a-side-no-or-other-functions-allowed/solutions/map\"\u003eCody 833 Side of a Triangle\u003c/a\u003e\u003c/p\u003e\u003cp\u003eTest suite \"disallowed function usage check\" courtesy of Aurelien Queffurust.\u003c/p\u003e\u003cp\u003eExample :\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput\u003c/b\u003e\u003c/p\u003e\u003cp\u003ea= 1; b= 1; c=1\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput\u003c/b\u003e\u003c/p\u003e\u003cpre\u003e x(1)= -0.5+0.866i; x(2)= -0.5-0.866i\u003c/pre\u003e","function_template":"function x = quadratic(a,b,c)\r\n  x(1)=(-b+sqrt(b^2-4*a*c))/(2*a); % Must delete symbol check will fail\r\n  x(2)=(-b-sqrt(b^2-4*a*c))/(2*a);\r\nend","test_suite":"%%\r\n% Courtesy of Aurelien Queffurust\r\nfiletext = fileread('quadratic.m');\r\nassert(isempty(strfind(filetext, '*')),'sign * forbidden')\r\nassert(isempty(strfind(filetext, 'mtimes')),'mtimes forbidden')\r\nassert(isempty(strfind(filetext, 'cross')),'cross forbidden')\r\nassert(isempty(strfind(filetext, 'prod')),'prod forbidden')\r\nassert(isempty(strfind(filetext, 'cumprod')))\r\nassert(isempty(strfind(filetext, 'times')))\r\nassert(isempty(strfind(filetext, 'mldivide')))\r\nassert(isempty(strfind(filetext, 'mrdivide')))\r\nassert(isempty(strfind(filetext, '/')),'/ forbidden')\r\nassert(isempty(strfind(filetext, '\\')))\r\nassert(isempty(strfind(filetext, '-')))\r\nassert(isempty(strfind(filetext, '^')),'^ forbidden')\r\nassert(isempty(strfind(filetext, 'dot')))\r\nassert(isempty(strfind(filetext, '''')),'string forbidden')\r\nassert(isempty(strfind(filetext, 'num2str')))\r\nassert(isempty(strfind(filetext, 'int2str')))\r\nassert(isempty(strfind(filetext, 'dec2bin')))\r\nassert(isempty(strfind(filetext, 'roots')))\r\n%%\r\na=1;b=1;c=1;\r\nrad=sqrt(b*b-4*a*c);\r\nxe(1)=(-b+rad)/(2*a);\r\nxe(2)=(-b-rad)/(2*a)\r\n\r\nxq = quadratic(a,b,c)\r\n\r\nassert(isequal(round(1e6*xq)/1e6,round(1e6*xe)/1e6) || isequal(round(1e6*xq(2:-1:1))/1e6,round(1e6*xe)/1e6))\r\n%%\r\na=1;b=4;c=1;\r\nrad=sqrt(b*b-4*a*c);\r\nxe(1)=(-b+rad)/(2*a);\r\nxe(2)=(-b-rad)/(2*a)\r\n\r\nxq = quadratic(a,b,c)\r\n\r\nassert(isequal(round(1e6*xq)/1e6,round(1e6*xe)/1e6) || isequal(round(1e6*xq(2:-1:1))/1e6,round(1e6*xe)/1e6))\r\n%%\r\na=1;b=4;c=1;\r\na=a+rand\r\nrad=sqrt(b*b-4*a*c);\r\nxe(1)=(-b+rad)/(2*a);\r\nxe(2)=(-b-rad)/(2*a)\r\n\r\nxq = quadratic(a,b,c)\r\n\r\nassert(isequal(round(1e6*xq)/1e6,round(1e6*xe)/1e6) || isequal(round(1e6*xq(2:-1:1))/1e6,round(1e6*xe)/1e6))\r\n","published":true,"deleted":false,"likes_count":1,"comments_count":1,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":34,"test_suite_updated_at":"2012-07-16T12:17:04.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2012-07-15T21:45:22.000Z","updated_at":"2025-09-27T21:24:29.000Z","published_at":"2012-07-15T22:25:47.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\u003eSolve the quadratic equation\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eax^2+bx+c=0\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e. However, some of the normal functions and symbols are 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\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003ex=[ -b +/- sqrt ( b^2 - 4ac ) ] / ( 2a )\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\u003eUnallowed functions and symbols:\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\u003eroots mtimes cross prod cumprod times mldivide mrdivide dot numstr int2str dec2bin * / \\\\ - ^ '\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\u003eDerivative of Aurelien's\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://www.mathworks.com/matlabcentral/cody/problems/813-multiply-2-numbers\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eCody 813 Multiply 2 numbers\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\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\u003eAlso related to\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://www.mathworks.com/matlabcentral/cody/problems/833-find-third-side-of-a-right-triangle-given-hypotenuse-and-a-side-no-or-other-functions-allowed/solutions/map\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eCody 833 Side of a Triangle\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\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\u003eTest suite \\\"disallowed function usage check\\\" courtesy of Aurelien Queffurust.\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:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput\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\u003ea= 1; b= 1; c=1\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=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ x(1)= -0.5+0.866i; x(2)= -0.5-0.866i]]\u003e\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\"}]}"}],"problem_search":{"errors":[],"problems":[{"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":25,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2016-03-05T21:58:07.000Z","updated_at":"2026-03-29T16:54:04.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":1634,"title":"Kurchan Square - Evaluation Function","description":"Evaluate a Kurchan square. An NxN square with values 1:N^2.\r\n\r\nGiven a square matrix determine the products of each row, column, diagonal, and anti-diagonal. \r\n\r\nThe K-value is the Max minus the Minimum of the these products.\r\n\r\nExample: m=[5 1 8;3 9 4;7 2 6]\r\n\r\nRow Products: 40,108, and 84.  Column products 105, 18, and 192.\r\n\r\nDiagonal Products: 270, 1*4*7=28, and 8*3*2=48.\r\n\r\nAnti-Diagonal Products: 8*9*7=504, 1*3*6=18, and 5*4*2=40.\r\n\r\nK is thus 504-18 = 486.  [ Max of all products - Min of all products ]\r\n\r\n*Input:* Square Matrix\r\n\r\n*Output:* Kurchan Score\r\n\r\n*Related Challenges:*\r\n\r\n1) Minimize Kurchan Squares (N=4:9)\r\n\r\n2) Minimize Kurchan Squares (N=10:20) [Very large numbers]\r\n\r\n3) Maximize Sum of Products (N=4:9) and a Large number Challenge\r\n\r\n4) Minimize Sum of Products (N=4:9) and a Large number Challenge\r\n","description_html":"\u003cp\u003eEvaluate a Kurchan square. An NxN square with values 1:N^2.\u003c/p\u003e\u003cp\u003eGiven a square matrix determine the products of each row, column, diagonal, and anti-diagonal.\u003c/p\u003e\u003cp\u003eThe K-value is the Max minus the Minimum of the these products.\u003c/p\u003e\u003cp\u003eExample: m=[5 1 8;3 9 4;7 2 6]\u003c/p\u003e\u003cp\u003eRow Products: 40,108, and 84.  Column products 105, 18, and 192.\u003c/p\u003e\u003cp\u003eDiagonal Products: 270, 1*4*7=28, and 8*3*2=48.\u003c/p\u003e\u003cp\u003eAnti-Diagonal Products: 8*9*7=504, 1*3*6=18, and 5*4*2=40.\u003c/p\u003e\u003cp\u003eK is thus 504-18 = 486.  [ Max of all products - Min of all products ]\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e Square Matrix\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e Kurchan Score\u003c/p\u003e\u003cp\u003e\u003cb\u003eRelated Challenges:\u003c/b\u003e\u003c/p\u003e\u003cp\u003e1) Minimize Kurchan Squares (N=4:9)\u003c/p\u003e\u003cp\u003e2) Minimize Kurchan Squares (N=10:20) [Very large numbers]\u003c/p\u003e\u003cp\u003e3) Maximize Sum of Products (N=4:9) and a Large number Challenge\u003c/p\u003e\u003cp\u003e4) Minimize Sum of Products (N=4:9) and a Large number Challenge\u003c/p\u003e","function_template":"function K=kurchan_score(m)\r\n K=0;\r\nend","test_suite":"%%\r\nm=[5 1 8;3 9 4;7 2 6];\r\nK=kurchan_score(m) % 486\r\nassert(K==486)\r\n\r\n%%\r\nm=[1 24\t65 80 68 41 54 36 39\r\n49 51 28 14 67 57 77 2 45\r\n37 23 40 42 6 10 81 55 69\r\n74 58 3 30 16 43 32 44 70\r\n29 63 79 60 53 35 27 15 4\r\n52 8 31 62 72 73 5 50 25\r\n33 20 22 46 7 71 56 78 18\r\n61 21 38 9 48 13 19 76 66\r\n64 75 59 12 47 11 17 34 26];\r\ntic\r\nK=uint64(kurchan_score(m)) %  481200422400\r\ntoc\r\nassert(K==481200422400)\r\n%%\r\nv=[ 1     6     2     9     3     8     4     5     7]; % 366\r\nm=reshape(v,3,[]);\r\nK=uint64(kurchan_score(m))\r\nassert(K==366)\r\n%%\r\nv=[ 8    2    3    7    5    1    9    4    6]; % 486\r\nm=reshape(v,3,[]);\r\nK=uint64(kurchan_score(m))\r\nassert(K==486)\r\n%%\r\nv=[ 9 11 12 7 10 15 5 6 2 14 8 4 3 13 1 16];\r\nm=reshape(v,4,[]); % 29590\r\nK=uint64(kurchan_score(m))\r\nassert(K==29590)\r\n%%\r\nv=[ 1 16 15 6 12 3 2 8 7 9 14 13 10 11 4 5];\r\nm=reshape(v,4,[]); % 11256\r\nK=uint64(kurchan_score(m))\r\nassert(K==11256)\r\n\r\n\r\n","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":34,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2013-06-09T21:14:35.000Z","updated_at":"2025-12-05T13:26:41.000Z","published_at":"2013-06-09T21:43:14.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\u003eEvaluate a Kurchan square. An NxN square with values 1:N^2.\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 a square matrix determine the products of each row, column, diagonal, and anti-diagonal.\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\u003eThe K-value is the Max minus the Minimum of the these products.\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: m=[5 1 8;3 9 4;7 2 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\u003eRow Products: 40,108, and 84. Column products 105, 18, and 192.\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\u003eDiagonal Products: 270, 1*4*7=28, and 8*3*2=48.\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\u003eAnti-Diagonal Products: 8*9*7=504, 1*3*6=18, and 5*4*2=40.\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\u003eK is thus 504-18 = 486. [ Max of all products - Min of all products ]\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\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Square Matrix\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\u003cw:r\u003e\u003cw:t\u003e Kurchan Score\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\u003eRelated Challenges:\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\u003e1) Minimize Kurchan Squares (N=4: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\u003e2) Minimize Kurchan Squares (N=10:20) [Very large numbers]\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\u003e3) Maximize Sum of Products (N=4:9) and a Large number Challenge\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\u003e4) Minimize Sum of Products (N=4:9) and a Large number Challenge\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":834,"title":"Solve Quadratic : No * - or key functions permitted","description":"Solve the quadratic equation *ax^2+bx+c=0*.  However, some of the normal functions and symbols are not allowed.\r\n\r\nx=[ -b +/- sqrt ( b^2 - 4ac ) ] / ( 2a ) \r\n\r\n\r\n*Unallowed functions and symbols:* \r\n\r\nroots mtimes cross prod cumprod times mldivide mrdivide dot numstr int2str dec2bin * / \\ - ^ '\r\n\r\nDerivative of Aurelien's \u003chttp://www.mathworks.com/matlabcentral/cody/problems/813-multiply-2-numbers Cody 813 Multiply 2 numbers\u003e\r\n\r\nAlso related to \u003chttp://www.mathworks.com/matlabcentral/cody/problems/833-find-third-side-of-a-right-triangle-given-hypotenuse-and-a-side-no-or-other-functions-allowed/solutions/map Cody 833 Side of a Triangle\u003e \r\n\r\nTest suite \"disallowed function usage check\" courtesy of Aurelien Queffurust.\r\n\r\nExample : \r\n\r\n*Input*\r\n\r\na= 1; b= 1; c=1\r\n\r\n*Output* \r\n\r\n x(1)= -0.5+0.866i; x(2)= -0.5-0.866i","description_html":"\u003cp\u003eSolve the quadratic equation \u003cb\u003eax^2+bx+c=0\u003c/b\u003e.  However, some of the normal functions and symbols are not allowed.\u003c/p\u003e\u003cp\u003ex=[ -b +/- sqrt ( b^2 - 4ac ) ] / ( 2a )\u003c/p\u003e\u003cp\u003e\u003cb\u003eUnallowed functions and symbols:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eroots mtimes cross prod cumprod times mldivide mrdivide dot numstr int2str dec2bin * / \\ - ^ '\u003c/p\u003e\u003cp\u003eDerivative of Aurelien's \u003ca href=\"http://www.mathworks.com/matlabcentral/cody/problems/813-multiply-2-numbers\"\u003eCody 813 Multiply 2 numbers\u003c/a\u003e\u003c/p\u003e\u003cp\u003eAlso related to \u003ca href=\"http://www.mathworks.com/matlabcentral/cody/problems/833-find-third-side-of-a-right-triangle-given-hypotenuse-and-a-side-no-or-other-functions-allowed/solutions/map\"\u003eCody 833 Side of a Triangle\u003c/a\u003e\u003c/p\u003e\u003cp\u003eTest suite \"disallowed function usage check\" courtesy of Aurelien Queffurust.\u003c/p\u003e\u003cp\u003eExample :\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput\u003c/b\u003e\u003c/p\u003e\u003cp\u003ea= 1; b= 1; c=1\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput\u003c/b\u003e\u003c/p\u003e\u003cpre\u003e x(1)= -0.5+0.866i; x(2)= -0.5-0.866i\u003c/pre\u003e","function_template":"function x = quadratic(a,b,c)\r\n  x(1)=(-b+sqrt(b^2-4*a*c))/(2*a); % Must delete symbol check will fail\r\n  x(2)=(-b-sqrt(b^2-4*a*c))/(2*a);\r\nend","test_suite":"%%\r\n% Courtesy of Aurelien Queffurust\r\nfiletext = fileread('quadratic.m');\r\nassert(isempty(strfind(filetext, '*')),'sign * forbidden')\r\nassert(isempty(strfind(filetext, 'mtimes')),'mtimes forbidden')\r\nassert(isempty(strfind(filetext, 'cross')),'cross forbidden')\r\nassert(isempty(strfind(filetext, 'prod')),'prod forbidden')\r\nassert(isempty(strfind(filetext, 'cumprod')))\r\nassert(isempty(strfind(filetext, 'times')))\r\nassert(isempty(strfind(filetext, 'mldivide')))\r\nassert(isempty(strfind(filetext, 'mrdivide')))\r\nassert(isempty(strfind(filetext, '/')),'/ forbidden')\r\nassert(isempty(strfind(filetext, '\\')))\r\nassert(isempty(strfind(filetext, '-')))\r\nassert(isempty(strfind(filetext, '^')),'^ forbidden')\r\nassert(isempty(strfind(filetext, 'dot')))\r\nassert(isempty(strfind(filetext, '''')),'string forbidden')\r\nassert(isempty(strfind(filetext, 'num2str')))\r\nassert(isempty(strfind(filetext, 'int2str')))\r\nassert(isempty(strfind(filetext, 'dec2bin')))\r\nassert(isempty(strfind(filetext, 'roots')))\r\n%%\r\na=1;b=1;c=1;\r\nrad=sqrt(b*b-4*a*c);\r\nxe(1)=(-b+rad)/(2*a);\r\nxe(2)=(-b-rad)/(2*a)\r\n\r\nxq = quadratic(a,b,c)\r\n\r\nassert(isequal(round(1e6*xq)/1e6,round(1e6*xe)/1e6) || isequal(round(1e6*xq(2:-1:1))/1e6,round(1e6*xe)/1e6))\r\n%%\r\na=1;b=4;c=1;\r\nrad=sqrt(b*b-4*a*c);\r\nxe(1)=(-b+rad)/(2*a);\r\nxe(2)=(-b-rad)/(2*a)\r\n\r\nxq = quadratic(a,b,c)\r\n\r\nassert(isequal(round(1e6*xq)/1e6,round(1e6*xe)/1e6) || isequal(round(1e6*xq(2:-1:1))/1e6,round(1e6*xe)/1e6))\r\n%%\r\na=1;b=4;c=1;\r\na=a+rand\r\nrad=sqrt(b*b-4*a*c);\r\nxe(1)=(-b+rad)/(2*a);\r\nxe(2)=(-b-rad)/(2*a)\r\n\r\nxq = quadratic(a,b,c)\r\n\r\nassert(isequal(round(1e6*xq)/1e6,round(1e6*xe)/1e6) || isequal(round(1e6*xq(2:-1:1))/1e6,round(1e6*xe)/1e6))\r\n","published":true,"deleted":false,"likes_count":1,"comments_count":1,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":34,"test_suite_updated_at":"2012-07-16T12:17:04.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2012-07-15T21:45:22.000Z","updated_at":"2025-09-27T21:24:29.000Z","published_at":"2012-07-15T22:25:47.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\u003eSolve the quadratic equation\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eax^2+bx+c=0\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e. However, some of the normal functions and symbols are 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\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003ex=[ -b +/- sqrt ( b^2 - 4ac ) ] / ( 2a )\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\u003eUnallowed functions and symbols:\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\u003eroots mtimes cross prod cumprod times mldivide mrdivide dot numstr int2str dec2bin * / \\\\ - ^ '\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\u003eDerivative of Aurelien's\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://www.mathworks.com/matlabcentral/cody/problems/813-multiply-2-numbers\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eCody 813 Multiply 2 numbers\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\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\u003eAlso related to\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://www.mathworks.com/matlabcentral/cody/problems/833-find-third-side-of-a-right-triangle-given-hypotenuse-and-a-side-no-or-other-functions-allowed/solutions/map\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eCody 833 Side of a Triangle\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\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\u003eTest suite \\\"disallowed function usage check\\\" courtesy of Aurelien Queffurust.\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:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput\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\u003ea= 1; b= 1; c=1\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=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ x(1)= -0.5+0.866i; x(2)= -0.5-0.866i]]\u003e\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\"}]}"}],"term":"tag:\"det\"","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:\"det\"","current_player":null,"sort":"map(difficulty_value,0,0,999) asc"},"parser":"MathWorks::Search::Solr::QueryParser","directives":{"term":{"directives":{"tag":[["tag:\"det\"","","\"","det","\""]]}}},"facets":{"#\u003cMathWorks::Search::Field:0x00007f74d9d08680\u003e":null,"#\u003cMathWorks::Search::Field:0x00007f74d9d085e0\u003e":null},"filters":{"#\u003cMathWorks::Search::Field:0x00007f74d9d07d20\u003e":"\"cody:problem\""},"fields":{"#\u003cMathWorks::Search::Field:0x00007f74d9d08900\u003e":1,"#\u003cMathWorks::Search::Field:0x00007f74d9d08860\u003e":50,"#\u003cMathWorks::Search::Field:0x00007f74d9d087c0\u003e":"map(difficulty_value,0,0,999) asc","#\u003cMathWorks::Search::Field:0x00007f74d9d08720\u003e":"tag:\"det\""},"user_query":{"#\u003cMathWorks::Search::Field:0x00007f74d9d08720\u003e":"tag:\"det\""},"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":"search","password":"J3bGPZzQ7asjJcCk","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:\"det\"","current_player":null,"sort":"map(difficulty_value,0,0,999) asc"},"parser":"MathWorks::Search::Solr::QueryParser","directives":{"term":{"directives":{"tag":[["tag:\"det\"","","\"","det","\""]]}}},"facets":{"#\u003cMathWorks::Search::Field:0x00007f74d9d08680\u003e":null,"#\u003cMathWorks::Search::Field:0x00007f74d9d085e0\u003e":null},"filters":{"#\u003cMathWorks::Search::Field:0x00007f74d9d07d20\u003e":"\"cody:problem\""},"fields":{"#\u003cMathWorks::Search::Field:0x00007f74d9d08900\u003e":1,"#\u003cMathWorks::Search::Field:0x00007f74d9d08860\u003e":50,"#\u003cMathWorks::Search::Field:0x00007f74d9d087c0\u003e":"map(difficulty_value,0,0,999) asc","#\u003cMathWorks::Search::Field:0x00007f74d9d08720\u003e":"tag:\"det\""},"user_query":{"#\u003cMathWorks::Search::Field:0x00007f74d9d08720\u003e":"tag:\"det\""},"queried_facets":{}},"options":{"fields":["id","difficulty_rating"]},"join":" "},"results":[{"id":42762,"difficulty_rating":"easy-medium"},{"id":1634,"difficulty_rating":"easy-medium"},{"id":834,"difficulty_rating":"easy-medium"},{"id":52328,"difficulty_rating":"medium"}]}}