{"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":52318,"title":"ICFP2021 Hole-In-Wall: Figure Validation","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 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.  \r\nValid=check_figure(hxy, pxy, mseg, epsilon, npxy)  \r\nRqmt of Segments crossing hole edges will follow. Convex holes do not require Segment Crossing validation.\r\nThese types of contests like to avoid non-integer calculations thus the distance squared calculation.\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: 633px; display: block; min-width: 0px; padding-block-start: 0px; padding-top: 0px; perspective-origin: 407px 316.5px; transform-origin: 407px 316.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: 234px; 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 117px; text-align: left; transform-origin: 384px 117px; 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: 231px;height: 234px\" src=\"data:image/png;base64,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\" data-image-state=\"image-loaded\" width=\"231\" height=\"234\"\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: 200.733px 7.91667px; transform-origin: 200.733px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThis Challenge is to evaluate the 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: 138.367px 7.91667px; transform-origin: 138.367px 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: 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: 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.  \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: 166px 7.91667px; transform-origin: 166px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"font-weight: 700; \"\u003eValid=check_figure(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: 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: 337.667px 7.91667px; transform-origin: 337.667px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eRqmt of Segments crossing hole edges will follow. Convex holes do not require Segment Crossing validation.\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: 307.7px 7.91667px; transform-origin: 307.7px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThese types of contests like to avoid non-integer calculations thus the distance squared calculation.\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_figure(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 valid=1;\r\nend % check_figure\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_figure(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_figure(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_figure(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_figure(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_figure(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_figure(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_figure(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","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-17T22:30:20.000Z","updated_at":"2021-07-18T23:33:20.000Z","published_at":"2021-07-18T01:35:23.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=\\\"234\\\"/\u003e\u003cw:attr w:name=\\\"width\\\" w:val=\\\"231\\\"/\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 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.  \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_figure(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\u003eRqmt of Segments crossing hole edges will follow. Convex holes do not require Segment Crossing validation.\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\u003eThese types of contests like to avoid non-integer calculations thus the distance squared calculation.\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":52318,"title":"ICFP2021 Hole-In-Wall: Figure Validation","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 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.  \r\nValid=check_figure(hxy, pxy, mseg, epsilon, npxy)  \r\nRqmt of Segments crossing hole edges will follow. Convex holes do not require Segment Crossing validation.\r\nThese types of contests like to avoid non-integer calculations thus the distance squared calculation.\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: 633px; display: block; min-width: 0px; padding-block-start: 0px; padding-top: 0px; perspective-origin: 407px 316.5px; transform-origin: 407px 316.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: 234px; 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 117px; text-align: left; transform-origin: 384px 117px; 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: 231px;height: 234px\" src=\"data:image/png;base64,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\" data-image-state=\"image-loaded\" width=\"231\" height=\"234\"\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: 200.733px 7.91667px; transform-origin: 200.733px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThis Challenge is to evaluate the 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: 138.367px 7.91667px; transform-origin: 138.367px 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: 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: 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.  \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: 166px 7.91667px; transform-origin: 166px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"font-weight: 700; \"\u003eValid=check_figure(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: 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: 337.667px 7.91667px; transform-origin: 337.667px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eRqmt of Segments crossing hole edges will follow. Convex holes do not require Segment Crossing validation.\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: 307.7px 7.91667px; transform-origin: 307.7px 7.91667px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThese types of contests like to avoid non-integer calculations thus the distance squared calculation.\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_figure(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 valid=1;\r\nend % check_figure\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_figure(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_figure(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_figure(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_figure(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_figure(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_figure(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_figure(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","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-17T22:30:20.000Z","updated_at":"2021-07-18T23:33:20.000Z","published_at":"2021-07-18T01:35:23.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=\\\"234\\\"/\u003e\u003cw:attr w:name=\\\"width\\\" w:val=\\\"231\\\"/\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 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.  \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_figure(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\u003eRqmt of Segments crossing hole edges will follow. Convex holes do not require Segment Crossing validation.\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\u003eThese types of contests like to avoid non-integer calculations thus the distance squared calculation.\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:\"inpolygon\"","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:\"inpolygon\"","current_player":null,"sort":"map(difficulty_value,0,0,999) asc"},"parser":"MathWorks::Search::Solr::QueryParser","directives":{"term":{"directives":{"tag":[["tag:\"inpolygon\"","","\"","inpolygon","\""]]}}},"facets":{"#\u003cMathWorks::Search::Field:0x00007f534af1ab40\u003e":null,"#\u003cMathWorks::Search::Field:0x00007f534af1aaa0\u003e":null},"filters":{"#\u003cMathWorks::Search::Field:0x00007f534af1a1e0\u003e":"\"cody:problem\""},"fields":{"#\u003cMathWorks::Search::Field:0x00007f534af1adc0\u003e":1,"#\u003cMathWorks::Search::Field:0x00007f534af1ad20\u003e":50,"#\u003cMathWorks::Search::Field:0x00007f534af1ac80\u003e":"map(difficulty_value,0,0,999) asc","#\u003cMathWorks::Search::Field:0x00007f534af1abe0\u003e":"tag:\"inpolygon\""},"user_query":{"#\u003cMathWorks::Search::Field:0x00007f534af1abe0\u003e":"tag:\"inpolygon\""},"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:\"inpolygon\"","current_player":null,"sort":"map(difficulty_value,0,0,999) asc"},"parser":"MathWorks::Search::Solr::QueryParser","directives":{"term":{"directives":{"tag":[["tag:\"inpolygon\"","","\"","inpolygon","\""]]}}},"facets":{"#\u003cMathWorks::Search::Field:0x00007f534af1ab40\u003e":null,"#\u003cMathWorks::Search::Field:0x00007f534af1aaa0\u003e":null},"filters":{"#\u003cMathWorks::Search::Field:0x00007f534af1a1e0\u003e":"\"cody:problem\""},"fields":{"#\u003cMathWorks::Search::Field:0x00007f534af1adc0\u003e":1,"#\u003cMathWorks::Search::Field:0x00007f534af1ad20\u003e":50,"#\u003cMathWorks::Search::Field:0x00007f534af1ac80\u003e":"map(difficulty_value,0,0,999) asc","#\u003cMathWorks::Search::Field:0x00007f534af1abe0\u003e":"tag:\"inpolygon\""},"user_query":{"#\u003cMathWorks::Search::Field:0x00007f534af1abe0\u003e":"tag:\"inpolygon\""},"queried_facets":{}},"options":{"fields":["id","difficulty_rating"]},"join":" "},"results":[{"id":52318,"difficulty_rating":"medium"}]}}