{"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":58503,"title":"Google Drive file download","description":"This Challenge is to download a file from GoogleDrive given its \"copylink\" provided URL and a file name.\r\nGoogleDrive links fail for Matlab function like urlwrite, imread, imwrite, webread, and others. \r\nThe file 2.png is given by https://drive.google.com/file/d/1v3GsGgP3p905wzdvUqypL_-djYmxiyzK/view?usp=drive_link, which will bring up the file in a new window but this URL fails for matlab commands.\r\nThe GoogleDrive file must be \"Shared\" . The file must at least have share to those \"anyone with this link\".\r\nTo enable file download the Google URL string must be modified:\r\n 1) Delete the end '/view?usp=*'; Anything after and inlcuding \"/view\" must be deleted\r\n 2) Replace 'file/d/' with 'uc?export=download\u0026id='\r\n\r\nGiven a URL and filename download the URL contents into a file called filename in the local Cody directory.\r\nVerification will be done by file name and file size.\r\n\r\n","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: 372px; display: block; min-width: 0px; padding-block-start: 0px; padding-top: 0px; perspective-origin: 407px 186px; transform-origin: 407px 186px; 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: 327px 8px; transform-origin: 327px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThis Challenge is to download a file from GoogleDrive given its \"copylink\" provided URL and a file name.\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: 288px 8px; transform-origin: 288px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eGoogleDrive links fail for Matlab function like urlwrite, imread, imwrite, webread, and others. \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: 81px 8px; transform-origin: 81px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe file 2.png is given by \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://drive.google.com/file/d/1v3GsGgP3p905wzdvUqypL_-djYmxiyzK/view?usp=drive_link,\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003ehttps://drive.google.com/file/d/1v3GsGgP3p905wzdvUqypL_-djYmxiyzK/view?usp=drive_link,\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: 2px 8px; transform-origin: 2px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e which will bring up the file in a new window but this URL fails for matlab commands.\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: 330.5px 8px; transform-origin: 330.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe GoogleDrive file must be \"Shared\" . The file must at least have share to those \"anyone with this link\".\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: 203.5px 8px; transform-origin: 203.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eTo enable file download the Google URL string must be modified:\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: 266.5px 8px; transform-origin: 266.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e 1) Delete the end '/view?usp=*'; Anything after and inlcuding \"/view\" must be deleted\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: 156.5px 8px; transform-origin: 156.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e 2) Replace 'file/d/' with 'uc?export=download\u0026amp;id='\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: 0px 8px; transform-origin: 0px 8px; 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: 336px 8px; transform-origin: 336px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eGiven a URL and filename download the URL contents into a file called filename in the local Cody directory.\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: 154.5px 8px; transform-origin: 154.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eVerification will be done by file name and file size.\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: 0px 8px; transform-origin: 0px 8px; 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: 0px 8px; transform-origin: 0px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e","function_template":"function url=GoogleDrive_urlwrite(url,fname)\r\n% The GoogleDrive \"copy link\" does not play well with matlab urlwrite/imread/imwrite/webread/... \r\n% Expect 'https://drive.google.com/file/d/1WDYDJJZ3wJ8Fs0-8E2u6bYxlZbOapNJn/view?usp=drive_link'\r\n% 1) Delete the end '/view...'\r\n% 2) Replace 'file/d/' with 'uc?export=download\u0026id='\r\n \r\n %urlwrite(url,fname);\r\nend","test_suite":"%%\r\n%Google Drive Dowloads need to come from shared files\r\n% Tweak link: file/d/ to uc?export=download\u0026id=   while removing /view?usp=sharing\r\n% https://drive.google.com/file/d/1v3GsGgP3p905wzdvUqypL_-djYmxiyzK/view?usp=sharing\r\n% https://drive.google.com/uc?export=download\u0026id=1v3GsGgP3p905wzdvUqypL_-djYmxiyzK\r\n\r\n\r\n%2.png Robot\r\nurl='https://drive.google.com/file/d/1v3GsGgP3p905wzdvUqypL_-djYmxiyzK/view?usp=drive_link';\r\nfname='2.png'; \r\nfile_size=7025; % bytes \r\n\r\nfprintf('******Initial Test 1 Dir:\\n\\n')\r\ndir % Initial Dir\r\n\r\nGoogleDrive_urlwrite(url,fname); %expect  7025 bytes for 2.png\r\n\r\nfprintf('Dir after first call:\\n\\n')\r\ndir\r\ndir_struct=dir\r\nvalid=0;\r\nfor i=1:length(dir_struct)\r\n fprintf('%i %s %i\\n',i,dir_struct(i).name,dir_struct(i).bytes)\r\n if isequal(dir_struct(i).name,fname)  % contains(dir_struct(i).name,fname)\r\n  if dir_struct(i).bytes==file_size\r\n   valid=1;\r\n   break;\r\n  end\r\n end\r\nend\r\n\r\nassert(valid)\r\n%%\r\n%28.png Starry Night\r\nurl='https://drive.google.com/file/d/1WDYDJJZ3wJ8Fs0-8E2u6bYxlZbOapNJn/view?usp=drive_link';\r\nfname='28.png'; \r\nfile_size=58061; % bytes \r\n\r\nfprintf('\\n***** Test 2 start Dir:\\n\\n')\r\ndir % Test 2 Dir\r\n\r\nGoogleDrive_urlwrite(url,fname); %expect  58061 bytes for 28.png\r\n\r\nfprintf('Dir after second Call:\\n\\n')\r\ndir\r\ndir_struct=dir\r\nvalid=0;\r\nfor i=1:length(dir_struct)\r\n fprintf('%i %s %i\\n',i,dir_struct(i).name,dir_struct(i).bytes)\r\n if isequal(dir_struct(i).name,fname)  % contains(dir_struct(i).name,fname)\r\n  if dir_struct(i).bytes==file_size\r\n   valid=1;\r\n   break;\r\n  end\r\n end\r\nend\r\n\r\nassert(valid)\r\n%%\r\n%cube_small.gif Rubiks Cube\r\nurl='https://drive.google.com/file/d/1N3p9M6WKGXqD3lilYuv-sUKTkGGI66Xk/view?usp=drive_link';\r\nfname='cube_small.gif'; \r\nfile_size=3812; % bytes \r\n\r\nfprintf('\\n***** Test 3 Dir:\\n\\n\\n')\r\ndir % Initial Dir\r\n\r\nGoogleDrive_urlwrite(url,fname); %expect   bytes for cube_small.gif\r\n\r\nfprintf('Dir after third call:\\n\\n')\r\ndir\r\ndir_struct=dir\r\nvalid=0;\r\nfor i=1:length(dir_struct)\r\n fprintf('%i %s %i\\n',i,dir_struct(i).name,dir_struct(i).bytes)\r\n if isequal(dir_struct(i).name,fname)  % contains(dir_struct(i).name,fname)\r\n  if dir_struct(i).bytes==file_size\r\n   valid=1;\r\n   break;\r\n  end\r\n end\r\nend\r\n\r\nassert(valid)","published":true,"deleted":false,"likes_count":1,"comments_count":2,"created_by":3097,"edited_by":3097,"edited_at":"2023-07-13T17:33:19.000Z","deleted_by":null,"deleted_at":null,"solvers_count":7,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2023-07-13T14:26:50.000Z","updated_at":"2023-07-13T17:33:19.000Z","published_at":"2023-07-13T16:15:25.000Z","restored_at":null,"restored_by":null,"spam":null,"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\u003eThis Challenge is to download a file from GoogleDrive given its \\\"copylink\\\" provided URL and a file name.\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\u003eGoogleDrive links fail for Matlab function like urlwrite, imread, imwrite, webread, and others. \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 file 2.png is given by \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://drive.google.com/file/d/1v3GsGgP3p905wzdvUqypL_-djYmxiyzK/view?usp=drive_link,\\\"\u003e\u003cw:r\u003e\u003cw:t\u003ehttps://drive.google.com/file/d/1v3GsGgP3p905wzdvUqypL_-djYmxiyzK/view?usp=drive_link,\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e which will bring up the file in a new window but this URL fails for matlab commands.\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 GoogleDrive file must be \\\"Shared\\\" . The file must at least have share to those \\\"anyone with this link\\\".\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\u003eTo enable file download the Google URL string must be modified:\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\u003e 1) Delete the end '/view?usp=*'; Anything after and inlcuding \\\"/view\\\" must be deleted\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\u003e 2) Replace 'file/d/' with 'uc?export=download\u0026amp;id='\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\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\u003eGiven a URL and filename download the URL contents into a file called filename in the local Cody directory.\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\u003eVerification will be done by file name and file size.\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\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\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\",\"relationship\":null}],\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"target\":\"/matlab/document.xml\",\"relationshipId\":\"rId1\"}]}"},{"id":58513,"title":"Google Drive:  MATLAB mat file download","description":"Matlab 'mat' files are notoriously hard to email and download as they are binary files.\r\nTo make a 'mat' file downloadable from Google Drive requires a trick.\r\nCopy the 'mat' file and change its extension to 'PDF'. Place this 'PDF' on the Google Drive.\r\nTo download this file into 'mat' form use urlwrite with a Google Drive url, which will need to be fixed, and a destination fname ending in '.mat'\r\n\r\nThis Challenge is to download a file given a GoogleDrive link  and a fname, ending in '.mat', to the local directory. \r\nThe file for this URL ends in 'PDF' on a GoogleDrive.\r\nVerification will be done by loading the fname and verifying the size. This file is the ICFP2023 Orchestra Problem set compressed 90% as a mat file.","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: 273px; display: block; min-width: 0px; padding-block-start: 0px; padding-top: 0px; perspective-origin: 407px 136.5px; transform-origin: 407px 136.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: 265.5px 8px; transform-origin: 265.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eMatlab 'mat' files are notoriously hard to email and download as they are binary files.\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: 216px 8px; transform-origin: 216px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eTo make a 'mat' file downloadable from Google Drive requires a trick.\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: 284.5px 8px; transform-origin: 284.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eCopy the 'mat' file and change its extension to 'PDF'. Place this 'PDF' on the Google Drive.\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: 366.5px 8px; transform-origin: 366.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eTo download this file into 'mat' form use urlwrite with a Google Drive url, which will need to be fixed, and a destination fname ending in '.mat'\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: 0px 8px; transform-origin: 0px 8px; 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: 357px 8px; transform-origin: 357px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThis Challenge is to download a file given a GoogleDrive link  and a fname, ending in '.mat', to the local directory. \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 8px; transform-origin: 166px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe file for this URL ends in 'PDF' on a GoogleDrive.\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: 366px 8px; transform-origin: 366px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eVerification will be done by loading the fname and verifying the size. This file is the ICFP2023 Orchestra Problem set compressed 90% as a mat file.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e","function_template":"function url=GoogleDrive_urlwrite(url,fname)\r\n% The GoogleDrive \"copy link\" does not play well with matlab urlwrite/imread/imwrite/webread/... \r\n% Expect 'https://drive.google.com/file/d/1WDYDJJZ3wJ8Fs0-8E2u6bYxlZbOapNJn/view?usp=drive_link'\r\n% 1) Delete the end '/view...'\r\n% 2) Replace 'file/d/' with 'uc?export=download\u0026id='\r\n\r\n%This Challenge gives a URL for a .mat file that was saved as a .PDF on the googledrive.\r\n \r\n %urlwrite(url,fname);\r\nend","test_suite":"%%\r\nurl='https://drive.google.com/file/d/1mgxzsmVQNXgqHEdd61QR2r0STm3N9lgG/view?usp=drive_link';\r\nfname='orc_d_mu_axy_am_pxyr.mat';\r\ntic\r\nGoogleDrive_urlwrite(url,fname);\r\nfprintf('Process/Download Time: %.1f sec\\n',toc);\r\n\r\nload(fname); % This loads the cell array orc\r\n\r\nz=dir;\r\nfprintf('Local Directory: Filenames      Sizes\\n');\r\nfor i=1:length(z)\r\n fprintf('%30s  %i\\n',z(i).name,z(i).bytes);\r\nend\r\nfprintf('\\n\\n');\r\n\r\nfprintf('Size orc: %i %i\\n',size(orc));\r\n\r\nfprintf('\\n\\n orc{end}\\n');\r\norc{end}\r\n\r\nvalid=isequal([1 90],size(orc));\r\nassert(valid)\r\n","published":true,"deleted":false,"likes_count":1,"comments_count":1,"created_by":3097,"edited_by":3097,"edited_at":"2023-07-13T18:21:49.000Z","deleted_by":null,"deleted_at":null,"solvers_count":8,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2023-07-13T17:45:26.000Z","updated_at":"2023-07-13T18:21:49.000Z","published_at":"2023-07-13T18:21:49.000Z","restored_at":null,"restored_by":null,"spam":null,"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\u003eMatlab 'mat' files are notoriously hard to email and download as they are binary files.\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\u003eTo make a 'mat' file downloadable from Google Drive requires a trick.\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\u003eCopy the 'mat' file and change its extension to 'PDF'. Place this 'PDF' on the Google Drive.\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\u003eTo download this file into 'mat' form use urlwrite with a Google Drive url, which will need to be fixed, and a destination fname ending in '.mat'\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\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\u003eThis Challenge is to download a file given a GoogleDrive link  and a fname, ending in '.mat', to the local directory. \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 file for this URL ends in 'PDF' on a GoogleDrive.\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\u003eVerification will be done by loading the fname and verifying the size. This file is the ICFP2023 Orchestra Problem set compressed 90% as a mat file.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\",\"relationship\":null}],\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"target\":\"/matlab/document.xml\",\"relationshipId\":\"rId1\"}]}"},{"id":1313,"title":"PACMAT 09 - Awesome Tunnelling Ghosts, Equal Speed, 20 Lives, Game Download","description":"The Classic PACMAN game brought to Cody.\r\n\r\nPACMAT requires clearing all the Yellow Dots. Twenty lives are available. Adjacent Ghosts will capture PACMAT.  Awesome Ghosts use the tunnel. On Ghost capture everyone gets reset. These trained ghosts take the minimum path, including tunnel paths, to PACMAT assuming the other Ghosts are walls. \r\n\r\n\u003c\u003chttps://sites.google.com/site/razapor/matlab_cody/PACMAT_300.jpg\u003e\u003e\r\n\r\nTo aid in development of your routine, a PACMAT_Interactive.m file that creates a solver script and video has been posted at \u003chttps://sites.google.com/site/razapor/matlab_cody/PACMAT_Interactive_009a.m PACMAT_Interactive_009a.m\u003e. (Right click, 'save link as'). The routine creates a PACMAT9_1Xsolver.m script from the interactive play. The script demonstrates Interactivity, figure/KeyPressFcn, listdlg, and VideoWriter.\r\n\r\n\r\n\u003chttps://sites.google.com/site/razapor/matlab_cody/PACMAT9_1Xvideo_11_630.mp4 11 Lives Interactive\u003e (MP4)  Best Score seen is 11 Lives.\r\n\r\n\r\n*Inputs:* Map   Definitions: -1=Wall, 0=Empty, 1=Dot, 2=PACMAT, \u003e2=Ghost\r\n\r\n*Output:* Direction  Definitions: 1-Up, 2-Right, 3-Down, 4-Left, 0-No move\r\n\r\n*Pass Criteria:* Clear all dots in less than 4000 moves\r\n\r\n*Scoring:* Moves + 1000 * Lives\r\n\r\n\r\n*Near Future:* Awesome Tunnel Ghosts and 2X Speed PACMAT; Randomized Awesome Tunnel Ghosts to make them non-deterministic","description_html":"\u003cp\u003eThe Classic PACMAN game brought to Cody.\u003c/p\u003e\u003cp\u003ePACMAT requires clearing all the Yellow Dots. Twenty lives are available. Adjacent Ghosts will capture PACMAT.  Awesome Ghosts use the tunnel. On Ghost capture everyone gets reset. These trained ghosts take the minimum path, including tunnel paths, to PACMAT assuming the other Ghosts are walls.\u003c/p\u003e\u003cimg src = \"https://sites.google.com/site/razapor/matlab_cody/PACMAT_300.jpg\"\u003e\u003cp\u003eTo aid in development of your routine, a PACMAT_Interactive.m file that creates a solver script and video has been posted at \u003ca href = \"https://sites.google.com/site/razapor/matlab_cody/PACMAT_Interactive_009a.m\"\u003ePACMAT_Interactive_009a.m\u003c/a\u003e. (Right click, 'save link as'). The routine creates a PACMAT9_1Xsolver.m script from the interactive play. The script demonstrates Interactivity, figure/KeyPressFcn, listdlg, and VideoWriter.\u003c/p\u003e\u003cp\u003e\u003ca href = \"https://sites.google.com/site/razapor/matlab_cody/PACMAT9_1Xvideo_11_630.mp4\"\u003e11 Lives Interactive\u003c/a\u003e (MP4)  Best Score seen is 11 Lives.\u003c/p\u003e\u003cp\u003e\u003cb\u003eInputs:\u003c/b\u003e Map   Definitions: -1=Wall, 0=Empty, 1=Dot, 2=PACMAT, \u003e2=Ghost\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e Direction  Definitions: 1-Up, 2-Right, 3-Down, 4-Left, 0-No move\u003c/p\u003e\u003cp\u003e\u003cb\u003ePass Criteria:\u003c/b\u003e Clear all dots in less than 4000 moves\u003c/p\u003e\u003cp\u003e\u003cb\u003eScoring:\u003c/b\u003e Moves + 1000 * Lives\u003c/p\u003e\u003cp\u003e\u003cb\u003eNear Future:\u003c/b\u003e Awesome Tunnel Ghosts and 2X Speed PACMAT; Randomized Awesome Tunnel Ghosts to make them non-deterministic\u003c/p\u003e","function_template":"function ans = PACMAT9_1Xsolver(map)\r\npersistent mv\r\nif isempty(mv)\r\n mv=[2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1]; \r\nend\r\nmv(1);\r\nmv(1)=[];\r\n","test_suite":"%%\r\nfeval(@assignin,'caller','score',20000);\r\n%%\r\nmax_moves=4000; % Interactive approx 1000 moves\r\nmaxLives=20;\r\n\r\nmap=[...\r\n      repmat('a',1,28);\r\n      'accccccccccccaacccccccccccca';\r\n      'acaaaacaaaaacaacaaaaacaaaaca';\r\n      'acaaaacaaaaacaacaaaaacaaaaca';\r\n      'acaaaacaaaaacaacaaaaacaaaaca';\r\n      'acccccccccccccccccccccccccca';\r\n      'acaaaacaacaaaaaaaacaacaaaaca';\r\n      'acaaaacaacaaaaaaaacaacaaaaca';\r\n      'accccccaaccccaaccccaacccccca';\r\n      'aaaaaacaaaaabaabaaaaacaaaaaa';\r\n      'aaaaaacaaaaabaabaaaaacaaaaaa';\r\n      'aaaaaacaabbbbbbbbbbaacaaaaaa';\r\n      'aaaaaacaabaaabbaaabaacaaaaaa';\r\n      'aaaaaacaabalbbbblabaacaaaaaa';\r\n      'bbbbbbcbbbabbbbbbabbbcbbbbbb';\r\n      'aaaaaacaabalbbbblabaacaaaaaa';\r\n      'aaaaaacaabaaaaaaaabaacaaaaaa';\r\n      'aaaaaacaabbbbbbbbbbaacaaaaaa';\r\n      'aaaaaacaabaaaaaaaabaacaaaaaa';\r\n      'aaaaaacaabaaaaaaaabaacaaaaaa';\r\n      'accccccccccccaacccccccccccca';\r\n      'acaaaacaaaaacaacaaaaacaaaaca';\r\n      'acaaaacaaaaacaacaaaaacaaaaca';\r\n      'acccaacccccccbdcccccccaaccca';\r\n      'aaacaacaacaaaaaaaacaacaacaaa';\r\n      'aaacaacaacaaaaaaaacaacaacaaa';\r\n      'accccccaaccccaaccccaacccccca';\r\n      'acaaaaaaaaaacaacaaaaaaaaaaca';\r\n      'acaaaaaaaaaacaacaaaaaaaaaaca';\r\n      'acccccccccccccccccccccccccca';\r\n      repmat('a',1,28);];\r\n  \r\n  map=map-'b';\r\n  [nr, nc]=size(map);\r\n\r\n  mapdelta=[-1 nr 1 -nr]; % Valid as long as not on an edge\r\n  gmovxy=[0 -1;1 0;0 1;-1 0];\r\n\r\n  tunnel=find(map(:,1)==0); % tunnelptr\r\n  tunnel=[tunnel tunnel+nr*(nc-1)]; % Entrance/Exit Tunnel\r\n\r\n  [pmr, pmc]=find(map==2); % pi 24 row  pj 15 column of map\r\n   ptrpac=find(map==2);\r\n\r\n  ptrpac=find(map==2);\r\n  ptrpac_start=ptrpac;\r\n  ptrg_start=find(map\u003e2);\r\n  map(ptrg_start)=[10 20 30 40];\r\n  [gstartx, gstarty]=find(map\u003e2);\r\n  \r\n  lives=0; % Lives\r\n  movepac=0;\r\n\r\nwhile lives\u003cmaxLives \u0026\u0026 any(mod(map(:),10)==1) \u0026\u0026 movepac\u003cmax_moves\r\n for pac2x=1:1\r\n  if lives\u003emaxLives-1 || ~any(mod(map(:),10)==1),break;end % Died or Completed\r\n  movepac=movepac+1;\r\n\r\n  [curdir]=PACMAT9_1Xsolver(map);\r\n\r\n  [pmr, pmc]=find(map==2);\r\n\r\n if curdir\u003e0\r\n  if map(ptrpac+mapdelta(curdir))==-1\r\n   % Do nothing - Ran into a Wall\r\n  elseif map(ptrpac+mapdelta(curdir))\u003e2 % ran into ghost\r\n   map(ptrpac)=0; % remove PAC from the board\r\n   lives=lives+1;\r\n   %if lives==0,break;end\r\n   % reset the board\r\n   [ptrgx, ptrgy]=find(map\u003e2);\r\n   ptrg=find(map\u003e2);\r\n   map(ptrg)=mod(map(ptrg),10);\r\n   map(ptrpac_start)=2;\r\n   map(ptrg_start)=[10 20 30 40];\r\n   ptrpac=find(map==2);\r\n   continue; % Lost a Life\r\n  else % legal move\r\n   map(ptrpac)=0; % Eat Dot and clear PAC\r\n   ptrpac=ptrpac+mapdelta(curdir);\r\n   if ptrpac==tunnel(1),ptrpac=tunnel(2)-nr;end\r\n   if ptrpac==tunnel(2),ptrpac=tunnel(1)+nr;end\r\n   map(ptrpac)=2;\r\n  end\r\n end % curdir \u003e0\r\n\r\nend % pac2x\r\n\r\nif lives\u003emaxLives-1 || ~any(mod(map(:),10)==1),break;end % Completed\r\n\r\n\r\n% Ghosts\r\n for i=1:4\r\n\r\n  ghosts=find(map\u003e2);\r\n  ptrpac=find(map==2); % Target\r\n\r\n  dot=false;\r\n  [gptrx, gptry]=find(map==10*i);\r\n  gidx=find(map==10*i);\r\n  if isempty(gidx)\r\n   [gptrx, gptry]=find(map==10*i+1); % ghost must be on a dot\r\n   gidx=find(map==10*i+1);\r\n   dot=true;\r\n  end\r\n\r\n% Find valid ghost moves using gmap\r\n% mapdelta=[-1 nr 1 -nr]; \r\n  gmov=find(map(gidx+mapdelta)==2); % adjacent to PACMAT\r\n  if gidx==15+nr \u0026\u0026 ptrpac==nr*(nc-2)+15 % Ghost Tunnel Adj\r\n    gmov=4;\r\n   end\r\n   if gidx==nr*(nc-2)+15 \u0026\u0026 ptrpac==15+nr % Ghost Tunnel Adj\r\n    gmov=2;\r\n   end\r\n\r\n  if ~isempty(gmov) % PAC adjacent\r\n   lives=lives+1;\r\n   % reset the board\r\n   [pmr, pmc]=find(map==2); % PACMAT erase coords\r\n   map(map==2)=0;\r\n      \r\n   [ptrgx, ptrgy]=find(map\u003e2);\r\n   ptrg=find(map\u003e2);\r\n   map(ptrg)=mod(map(ptrg),10);\r\n   map(ptrpac_start)=2;\r\n   map(ptrg_start)=[10 20 30 40];\r\n   ptrpac=find(map==2);     \r\n   break; % Ghost move loop\r\n      \r\n  else % gmap avoid walls and other ghosts Walls\r\n \r\n   gmap=map;\r\n       \r\n   ptctr=0;\r\n   gmap(gmap\u003e=0)=Inf;\r\n      \r\n    gmap(ghosts)=-1; % other ghosts are like walls Ghosts_004/5\r\n    gmap(gidx)=Inf; % Ultimate target\r\n    gmap(ptrpac)=1; % Start at PACMAT and expand to ghost\r\n    while gmap(gidx)\u003e101 \u0026\u0026 ptctr\u003c100 % potential boxed dot\r\n % find dots, add a counter to distance form location, keep min value\r\n % when ptrpac gets a value it will be from nearest dot\r\n % find side with dmap(ptrpac)-1\r\n     ptctr=ptctr+1;\r\n     dpts=find(gmap==ptctr);\r\n     newpt_idx=repmat(dpts,1,4)+repmat(mapdelta,length(dpts),1);\r\n% Ghost Tunnel Access\r\n     tunL=find(newpt_idx==15);\r\n     tunR=find(newpt_idx==nr*nc-16);\r\n     if ~isempty(tunL)\r\n      newpt_idx(tunL)=nr*(nc-2)+15;\r\n     end\r\n     if ~isempty(tunR)\r\n      newpt_idx(tunR)=15+nr;\r\n     end\r\n\r\n     gmap(newpt_idx(:))=min(gmap(newpt_idx(:)),ptctr+1);\r\n    end\r\n\r\n% Simplified by ghosts are walls: No Ghost Jumping\r\n    if ~isinf(gmap(gidx)) % Path(s) to Ghost found\r\n% Tunnel Check\r\n    gmov=[];\r\n    if gidx==15+nr % Tunnel\r\n     gmov=2;\r\n     if gmap(gidx+mapdelta(2))==gmap(gidx)-1\r\n      gmov=2;\r\n     else\r\n      gmov=4; % Possible error ghost onto ghost\r\n     end   \r\n    end\r\n\r\n    if gidx==nr*(nc-2)+15 % Tunnel\r\n      if gmap(gidx+mapdelta(4))==gmap(gidx)-1\r\n        gmov=4;\r\n      else\r\n        gmov=2; % Possible error ghost onto ghost\r\n      end\r\n     end\r\n    \r\n     if isempty(gmov) % Non-Tunnel Move\r\n      for gmov=1:4 % execute with a find?\r\n        if gmap(gidx+mapdelta(gmov))==gmap(gidx)-1,break;end\r\n       end\r\n      end\r\n     else\r\n      gmov=[]; % No path to PACMAT found\r\n     end\r\n \r\n   if ~isempty(gmov) % valid g move : ghost may not stand on ghost\r\n    map(gptrx,gptry)=mod(map(gptrx,gptry),10);\r\n\r\n     %tunLtf=false;\r\n     %tunRtf=false;\r\n       if gidx==nr+15\r\n        if gmov==2 % Left Tunnel but go Right\r\n         map(gidx+mapdelta(gmov))=map(gidx+mapdelta(gmov))+10*i;\r\n        else\r\n         % Tunnel\r\n          map(nr*(nc-2)+15)=10*i;\r\n          %tunLtf=true;\r\n        end\r\n       elseif gidx==nr*(nc-2)+15\r\n        if gmov==4 % Right Tunnel but go Left\r\n         map(gidx+mapdelta(gmov))=map(gidx+mapdelta(gmov))+10*i;\r\n        else\r\n         % Tunnel\r\n         map(nr+15)=10*i;\r\n         %tunRtf=true;\r\n        end\r\n       else % Standard move\r\n        map(gidx+mapdelta(gmov))=map(gidx+mapdelta(gmov))+10*i;\r\n       end\r\n    \r\n   end % ~isempty(gmov) standard move - no capture\r\n\r\n  end % ~isempty(gmov) PACMAT adjacent\r\n  \r\n end % i ghost moves\r\nend % while any dots and \u003c max_moves maxLives\r\n%\r\ndots=length(find(mod(map,10)==1));\r\n%\r\nfprintf('moves %i\\n',movepac)\r\nfprintf('dots %i\\n',dots)\r\nfprintf('Lives Spent %i\\n',lives)\r\n%\r\n% To Pass need to leave at most 0 dots\r\nassert(dots==0,sprintf('Max Dots 0, Dots Remaining %i\\n',dots))\r\n\r\nscore= movepac + 1000*lives; % All dots must be removed\r\n\r\nfeval( @assignin,'caller','score',floor(min( 20000,score )) );\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":2,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2013-03-02T19:16:46.000Z","updated_at":"2025-12-03T15:31:49.000Z","published_at":"2013-03-03T03:24:45.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\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/media/image1.JPEG\"}],\"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\u003eThe Classic PACMAN game brought to Cody.\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\u003ePACMAT requires clearing all the Yellow Dots. Twenty lives are available. Adjacent Ghosts will capture PACMAT. Awesome Ghosts use the tunnel. On Ghost capture everyone gets reset. These trained ghosts take the minimum path, including tunnel paths, to PACMAT assuming the other Ghosts are walls.\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:customXml w:element=\\\"image\\\"\u003e\u003cw:customXmlPr\u003e\u003cw:attr w:name=\\\"height\\\" w:val=\\\"-1\\\"/\u003e\u003cw:attr w:name=\\\"width\\\" w:val=\\\"-1\\\"/\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\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eTo aid in development of your routine, a PACMAT_Interactive.m file that creates a solver script and video has been posted at\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=\\\"https://sites.google.com/site/razapor/matlab_cody/PACMAT_Interactive_009a.m\\\"\u003e\u003cw:r\u003e\u003cw:t\u003ePACMAT_Interactive_009a.m\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. (Right click, 'save link as'). The routine creates a PACMAT9_1Xsolver.m script from the interactive play. The script demonstrates Interactivity, figure/KeyPressFcn, listdlg, and VideoWriter.\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:hyperlink w:docLocation=\\\"https://sites.google.com/site/razapor/matlab_cody/PACMAT9_1Xvideo_11_630.mp4\\\"\u003e\u003cw:r\u003e\u003cw:t\u003e11 Lives Interactive\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e (MP4) Best Score seen is 11 Lives.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInputs:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Map Definitions: -1=Wall, 0=Empty, 1=Dot, 2=PACMAT, \u0026gt;2=Ghost\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 Direction Definitions: 1-Up, 2-Right, 3-Down, 4-Left, 0-No move\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\u003ePass Criteria:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Clear all dots in less than 4000 moves\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\u003eScoring:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Moves + 1000 * Lives\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\u003eNear Future:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Awesome Tunnel Ghosts and 2X Speed PACMAT; Randomized Awesome Tunnel Ghosts to make them non-deterministic\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\"},{\"partUri\":\"/media/image1.JPEG\",\"contentType\":\"image/JPEG\",\"content\":\"data:image/JPEG;base64,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\"}]}"},{"id":1314,"title":"PACMAT 08 - Awesome Tunneling Ghosts, 2X Speed, 6 Lives, Game Download","description":"The Classic PACMAN game brought to Cody.\r\n\r\nPACMAT requires clearing all the Yellow Dots. PACMAT moves at 2X Ghost speed. Six lives are available. Adjacent Ghosts will capture PACMAT.  Awesome Ghosts use the tunnel. On Ghost capture everyone gets reset. These trained ghosts take the minimum path, including tunnel paths, to PACMAT assuming the other Ghosts are walls. \r\n\r\n\u003c\u003chttps://sites.google.com/site/razapor/matlab_cody/PACMAT_300.jpg\u003e\u003e\r\n\r\nTo aid in development of your routine, a PACMAT_Interactive.m file that creates a solver script and video has been posted at \u003chttps://sites.google.com/site/razapor/matlab_cody/PACMAT_Interactive_008a.m PACMAT_Interactive_008a.m\u003e. (Right click, 'save link as'). The routine creates a PACMAT8_2Xsolver.m script from the interactive play. The script demonstrates Interactivity, figure/KeyPressFcn, listdlg, and VideoWriter.\r\n\r\n\r\n\u003chttps://sites.google.com/site/razapor/matlab_cody/PACMAT8_2Xvideo_492.mp4 492 Moves Interactive\u003e (MP4)  Best Score seen is Zero Lives lost, 492 moves.\r\n\r\n\r\n*Inputs:* Map   Definitions: -1=Wall, 0=Empty, 1=Dot, 2=PACMAT, \u003e2=Ghost\r\n\r\n*Output:* Direction  Definitions: 1-Up, 2-Right, 3-Down, 4-Left, 0-No move\r\n\r\n*Pass Criteria:* Clear all dots in less than 4000 moves\r\n\r\n*Scoring:* Moves + 1000 * Lives\r\n\r\n\r\n*Near Future:* Randomized Awesome Tunnel Ghosts to make them non-deterministic to require Adaptive Bot solutions","description_html":"\u003cp\u003eThe Classic PACMAN game brought to Cody.\u003c/p\u003e\u003cp\u003ePACMAT requires clearing all the Yellow Dots. PACMAT moves at 2X Ghost speed. Six lives are available. Adjacent Ghosts will capture PACMAT.  Awesome Ghosts use the tunnel. On Ghost capture everyone gets reset. These trained ghosts take the minimum path, including tunnel paths, to PACMAT assuming the other Ghosts are walls.\u003c/p\u003e\u003cimg src = \"https://sites.google.com/site/razapor/matlab_cody/PACMAT_300.jpg\"\u003e\u003cp\u003eTo aid in development of your routine, a PACMAT_Interactive.m file that creates a solver script and video has been posted at \u003ca href = \"https://sites.google.com/site/razapor/matlab_cody/PACMAT_Interactive_008a.m\"\u003ePACMAT_Interactive_008a.m\u003c/a\u003e. (Right click, 'save link as'). The routine creates a PACMAT8_2Xsolver.m script from the interactive play. The script demonstrates Interactivity, figure/KeyPressFcn, listdlg, and VideoWriter.\u003c/p\u003e\u003cp\u003e\u003ca href = \"https://sites.google.com/site/razapor/matlab_cody/PACMAT8_2Xvideo_492.mp4\"\u003e492 Moves Interactive\u003c/a\u003e (MP4)  Best Score seen is Zero Lives lost, 492 moves.\u003c/p\u003e\u003cp\u003e\u003cb\u003eInputs:\u003c/b\u003e Map   Definitions: -1=Wall, 0=Empty, 1=Dot, 2=PACMAT, \u003e2=Ghost\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e Direction  Definitions: 1-Up, 2-Right, 3-Down, 4-Left, 0-No move\u003c/p\u003e\u003cp\u003e\u003cb\u003ePass Criteria:\u003c/b\u003e Clear all dots in less than 4000 moves\u003c/p\u003e\u003cp\u003e\u003cb\u003eScoring:\u003c/b\u003e Moves + 1000 * Lives\u003c/p\u003e\u003cp\u003e\u003cb\u003eNear Future:\u003c/b\u003e Randomized Awesome Tunnel Ghosts to make them non-deterministic to require Adaptive Bot solutions\u003c/p\u003e","function_template":"function ans = PACMAT8_2Xsolver(map)\r\npersistent mv\r\nif isempty(mv)\r\n mv=[2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1]; \r\nend\r\nmv(1);\r\nmv(1)=[];","test_suite":"%%\r\nfeval(@assignin,'caller','score',6000);\r\n%%\r\nmax_moves=4000; % Interactive approx 1000 moves\r\nmaxLives=6;\r\n\r\nmap=[...\r\n      repmat('a',1,28);\r\n      'accccccccccccaacccccccccccca';\r\n      'acaaaacaaaaacaacaaaaacaaaaca';\r\n      'acaaaacaaaaacaacaaaaacaaaaca';\r\n      'acaaaacaaaaacaacaaaaacaaaaca';\r\n      'acccccccccccccccccccccccccca';\r\n      'acaaaacaacaaaaaaaacaacaaaaca';\r\n      'acaaaacaacaaaaaaaacaacaaaaca';\r\n      'accccccaaccccaaccccaacccccca';\r\n      'aaaaaacaaaaabaabaaaaacaaaaaa';\r\n      'aaaaaacaaaaabaabaaaaacaaaaaa';\r\n      'aaaaaacaabbbbbbbbbbaacaaaaaa';\r\n      'aaaaaacaabaaabbaaabaacaaaaaa';\r\n      'aaaaaacaabalbbbblabaacaaaaaa';\r\n      'bbbbbbcbbbabbbbbbabbbcbbbbbb';\r\n      'aaaaaacaabalbbbblabaacaaaaaa';\r\n      'aaaaaacaabaaaaaaaabaacaaaaaa';\r\n      'aaaaaacaabbbbbbbbbbaacaaaaaa';\r\n      'aaaaaacaabaaaaaaaabaacaaaaaa';\r\n      'aaaaaacaabaaaaaaaabaacaaaaaa';\r\n      'accccccccccccaacccccccccccca';\r\n      'acaaaacaaaaacaacaaaaacaaaaca';\r\n      'acaaaacaaaaacaacaaaaacaaaaca';\r\n      'acccaacccccccbdcccccccaaccca';\r\n      'aaacaacaacaaaaaaaacaacaacaaa';\r\n      'aaacaacaacaaaaaaaacaacaacaaa';\r\n      'accccccaaccccaaccccaacccccca';\r\n      'acaaaaaaaaaacaacaaaaaaaaaaca';\r\n      'acaaaaaaaaaacaacaaaaaaaaaaca';\r\n      'acccccccccccccccccccccccccca';\r\n      repmat('a',1,28);];\r\n  \r\n  map=map-'b';\r\n  [nr, nc]=size(map);\r\n\r\n  mapdelta=[-1 nr 1 -nr]; % Valid as long as not on an edge\r\n  gmovxy=[0 -1;1 0;0 1;-1 0];\r\n\r\n  tunnel=find(map(:,1)==0); % tunnelptr\r\n  tunnel=[tunnel tunnel+nr*(nc-1)]; % Entrance/Exit Tunnel\r\n\r\n  [pmr, pmc]=find(map==2); % pi 24 row  pj 15 column of map\r\n   ptrpac=find(map==2);\r\n\r\n  ptrpac=find(map==2);\r\n  ptrpac_start=ptrpac;\r\n  ptrg_start=find(map\u003e2);\r\n  map(ptrg_start)=[10 20 30 40];\r\n  [gstartx, gstarty]=find(map\u003e2);\r\n  \r\n  lives=0; % Lives\r\n  movepac=0;\r\n\r\nwhile lives\u003cmaxLives \u0026\u0026 any(mod(map(:),10)==1) \u0026\u0026 movepac\u003cmax_moves\r\n for pac2x=1:2\r\n  if lives\u003emaxLives-1 || ~any(mod(map(:),10)==1),break;end % Died or Completed\r\n  movepac=movepac+1;\r\n\r\n  [curdir]=PACMAT8_2Xsolver(map);\r\n\r\n  [pmr, pmc]=find(map==2);\r\n\r\n if curdir\u003e0\r\n  if map(ptrpac+mapdelta(curdir))==-1\r\n   % Do nothing - Ran into a Wall\r\n  elseif map(ptrpac+mapdelta(curdir))\u003e2 % ran into ghost\r\n   map(ptrpac)=0; % remove PAC from the board\r\n   lives=lives+1;\r\n   %if lives==0,break;end\r\n   % reset the board\r\n   [ptrgx, ptrgy]=find(map\u003e2);\r\n   ptrg=find(map\u003e2);\r\n   map(ptrg)=mod(map(ptrg),10);\r\n   map(ptrpac_start)=2;\r\n   map(ptrg_start)=[10 20 30 40];\r\n   ptrpac=find(map==2);\r\n   continue; % Lost a Life\r\n  else % legal move\r\n   map(ptrpac)=0; % Eat Dot and clear PAC\r\n   ptrpac=ptrpac+mapdelta(curdir);\r\n   if ptrpac==tunnel(1),ptrpac=tunnel(2)-nr;end\r\n   if ptrpac==tunnel(2),ptrpac=tunnel(1)+nr;end\r\n   map(ptrpac)=2;\r\n  end\r\n end % curdir \u003e0\r\n\r\nend % pac2x\r\n\r\nif lives\u003emaxLives-1 || ~any(mod(map(:),10)==1),break;end % Completed\r\n\r\n\r\n% Ghosts\r\n for i=1:4\r\n\r\n  ghosts=find(map\u003e2);\r\n  ptrpac=find(map==2); % Target\r\n\r\n  dot=false;\r\n  [gptrx, gptry]=find(map==10*i);\r\n  gidx=find(map==10*i);\r\n  if isempty(gidx)\r\n   [gptrx, gptry]=find(map==10*i+1); % ghost must be on a dot\r\n   gidx=find(map==10*i+1);\r\n   dot=true;\r\n  end\r\n\r\n% Find valid ghost moves using gmap\r\n% mapdelta=[-1 nr 1 -nr]; \r\n  gmov=find(map(gidx+mapdelta)==2); % adjacent to PACMAT\r\n  if gidx==15+nr \u0026\u0026 ptrpac==nr*(nc-2)+15 % Ghost Tunnel Adj\r\n    gmov=4;\r\n   end\r\n   if gidx==nr*(nc-2)+15 \u0026\u0026 ptrpac==15+nr % Ghost Tunnel Adj\r\n    gmov=2;\r\n   end\r\n\r\n  if ~isempty(gmov) % PAC adjacent\r\n   lives=lives+1;\r\n   % reset the board\r\n   [pmr, pmc]=find(map==2); % PACMAT erase coords\r\n   map(map==2)=0;\r\n      \r\n   [ptrgx, ptrgy]=find(map\u003e2);\r\n   ptrg=find(map\u003e2);\r\n   map(ptrg)=mod(map(ptrg),10);\r\n   map(ptrpac_start)=2;\r\n   map(ptrg_start)=[10 20 30 40];\r\n   ptrpac=find(map==2);     \r\n   break; % Ghost move loop\r\n      \r\n  else % gmap avoid walls and other ghosts Walls\r\n \r\n   gmap=map;\r\n       \r\n   ptctr=0;\r\n   gmap(gmap\u003e=0)=Inf;\r\n      \r\n    gmap(ghosts)=-1; % other ghosts are like walls Ghosts_004/5\r\n    gmap(gidx)=Inf; % Ultimate target\r\n    gmap(ptrpac)=1; % Start at PACMAT and expand to ghost\r\n    while gmap(gidx)\u003e101 \u0026\u0026 ptctr\u003c100 % potential boxed dot\r\n % find dots, add a counter to distance form location, keep min value\r\n % when ptrpac gets a value it will be from nearest dot\r\n % find side with dmap(ptrpac)-1\r\n     ptctr=ptctr+1;\r\n     dpts=find(gmap==ptctr);\r\n     newpt_idx=repmat(dpts,1,4)+repmat(mapdelta,length(dpts),1);\r\n% Ghost Tunnel Access\r\n     tunL=find(newpt_idx==15);\r\n     tunR=find(newpt_idx==nr*nc-16);\r\n     if ~isempty(tunL)\r\n      newpt_idx(tunL)=nr*(nc-2)+15;\r\n     end\r\n     if ~isempty(tunR)\r\n      newpt_idx(tunR)=15+nr;\r\n     end\r\n\r\n     gmap(newpt_idx(:))=min(gmap(newpt_idx(:)),ptctr+1);\r\n    end\r\n\r\n% Simplified by ghosts are walls: No Ghost Jumping\r\n    if ~isinf(gmap(gidx)) % Path(s) to Ghost found\r\n% Tunnel Check\r\n    gmov=[];\r\n    if gidx==15+nr % Tunnel\r\n     gmov=2;\r\n     if gmap(gidx+mapdelta(2))==gmap(gidx)-1\r\n      gmov=2;\r\n     else\r\n      gmov=4; % Possible error ghost onto ghost\r\n     end   \r\n    end\r\n\r\n    if gidx==nr*(nc-2)+15 % Tunnel\r\n      if gmap(gidx+mapdelta(4))==gmap(gidx)-1\r\n        gmov=4;\r\n      else\r\n        gmov=2; % Possible error ghost onto ghost\r\n      end\r\n     end\r\n    \r\n     if isempty(gmov) % Non-Tunnel Move\r\n      for gmov=1:4 % execute with a find?\r\n        if gmap(gidx+mapdelta(gmov))==gmap(gidx)-1,break;end\r\n       end\r\n      end\r\n     else\r\n      gmov=[]; % No path to PACMAT found\r\n     end\r\n \r\n   if ~isempty(gmov) % valid g move : ghost may not stand on ghost\r\n    map(gptrx,gptry)=mod(map(gptrx,gptry),10);\r\n\r\n     %tunLtf=false;\r\n     %tunRtf=false;\r\n       if gidx==nr+15\r\n        if gmov==2 % Left Tunnel but go Right\r\n         map(gidx+mapdelta(gmov))=map(gidx+mapdelta(gmov))+10*i;\r\n        else\r\n         % Tunnel\r\n          map(nr*(nc-2)+15)=10*i;\r\n          %tunLtf=true;\r\n        end\r\n       elseif gidx==nr*(nc-2)+15\r\n        if gmov==4 % Right Tunnel but go Left\r\n         map(gidx+mapdelta(gmov))=map(gidx+mapdelta(gmov))+10*i;\r\n        else\r\n         % Tunnel\r\n         map(nr+15)=10*i;\r\n         %tunRtf=true;\r\n        end\r\n       else % Standard move\r\n        map(gidx+mapdelta(gmov))=map(gidx+mapdelta(gmov))+10*i;\r\n       end\r\n    \r\n   end % ~isempty(gmov) standard move - no capture\r\n\r\n  end % ~isempty(gmov) PACMAT adjacent\r\n  \r\n end % i ghost moves\r\nend % while any dots and \u003c max_moves maxLives\r\n%\r\ndots=length(find(mod(map,10)==1));\r\n%\r\nfprintf('moves %i\\n',movepac)\r\nfprintf('dots %i\\n',dots)\r\nfprintf('Lives Spent %i\\n',lives)\r\n%\r\n% To Pass need to leave at most 0 dots\r\nassert(dots==0,sprintf('Max Dots 0, Dots Remaining %i\\n',dots))\r\n\r\nscore= movepac + 1000*lives; % All dots must be removed\r\n\r\nfeval( @assignin,'caller','score',floor(min( 6000,score )) );\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":1,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2013-03-03T04:08:07.000Z","updated_at":"2013-03-03T04:17:37.000Z","published_at":"2013-03-03T04:17:37.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\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/media/image1.JPEG\"}],\"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\u003eThe Classic PACMAN game brought to Cody.\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\u003ePACMAT requires clearing all the Yellow Dots. PACMAT moves at 2X Ghost speed. Six lives are available. Adjacent Ghosts will capture PACMAT. Awesome Ghosts use the tunnel. On Ghost capture everyone gets reset. These trained ghosts take the minimum path, including tunnel paths, to PACMAT assuming the other Ghosts are walls.\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:customXml w:element=\\\"image\\\"\u003e\u003cw:customXmlPr\u003e\u003cw:attr w:name=\\\"height\\\" w:val=\\\"-1\\\"/\u003e\u003cw:attr w:name=\\\"width\\\" w:val=\\\"-1\\\"/\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\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eTo aid in development of your routine, a PACMAT_Interactive.m file that creates a solver script and video has been posted at\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=\\\"https://sites.google.com/site/razapor/matlab_cody/PACMAT_Interactive_008a.m\\\"\u003e\u003cw:r\u003e\u003cw:t\u003ePACMAT_Interactive_008a.m\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. (Right click, 'save link as'). The routine creates a PACMAT8_2Xsolver.m script from the interactive play. The script demonstrates Interactivity, figure/KeyPressFcn, listdlg, and VideoWriter.\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:hyperlink w:docLocation=\\\"https://sites.google.com/site/razapor/matlab_cody/PACMAT8_2Xvideo_492.mp4\\\"\u003e\u003cw:r\u003e\u003cw:t\u003e492 Moves Interactive\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e (MP4) Best Score seen is Zero Lives lost, 492 moves.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInputs:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Map Definitions: -1=Wall, 0=Empty, 1=Dot, 2=PACMAT, \u0026gt;2=Ghost\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 Direction Definitions: 1-Up, 2-Right, 3-Down, 4-Left, 0-No move\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\u003ePass Criteria:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Clear all dots in less than 4000 moves\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\u003eScoring:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Moves + 1000 * Lives\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\u003eNear Future:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Randomized Awesome Tunnel Ghosts to make them non-deterministic to require Adaptive Bot solutions\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\"},{\"partUri\":\"/media/image1.JPEG\",\"contentType\":\"image/JPEG\",\"content\":\"data:image/JPEG;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAEsASwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDzfW9Yl0ySFYkRw4J+bPHNZX/CWXX/ADwh/X/Gn+Lv9dbf7h/nWRcX0c+nWlqLK2ie337p4wfMm3HPzknHHQYA4r38zzDFUsXKEJNJf5HqY3F1oV5RjKyRqDxbc/8APCL9f8aP+Esuf+eEX5H/ABrK02+j0+4aWSytrsGNk2XAJUEj7wwRyO1UjXB/auM/nZy/XcR/Mzov+Etuv+eEP5H/ABo/4Sy5/wCeEP6/41l6lfR39wsqWVtaBY1Ty7YEKcD7xyTye/NEd9HHpU1l9itnkkkVxcsD5qAfwqc4wfoaSzXG/wA7H9dr/wA5qDxZdf8APCL9f8aP+Esuf+eEX6/41jWNwtnfQ3DW0NysbhjDOCUfHZsEHH4io5pBJM8gRYwzEhF6L7D2p/2rjP52L67iP52bv/CW3P8Azwi/I/40f8Jbdf8APCL8j/jWXd30dzZWkC2VtC1urK00YO+bJzl8nGR04ApdPv47GO6V7G1uvPhMSmdSTET/ABrgjDD3yKX9q4y3xsPrtf8AnNP/AISy6/54xfr/AI0HxZdf88Iv1/xrngefX61a1K8S/v5bqO0gtFkIxBbgiNOMcAkn3696f9q4z+dh9dxH87Nf/hLbn/nhF+R/xoHiy5/54Rfr/jWV9uj/ALH+wfYbbf53nfasHzcYxsznG3v0zml0u9j07UIrqSytrxUzmC5BMbZBHIBB4znr1FL+1cZvzsPrtf8AnNT/AISy5/54Rfr/AI0f8JZc/wDPCL9f8a54n5qtXd2tzHbIlrBAYYhGWiBBlIJO5sk/NzjjAwBT/tXGfzsPruI/mNf/AIS26/54Rfkf8aB4tuSQPIi/I/41l2d9HaW13C9lbXBuI9iyTAloec7kwRg/UGqQ+8PrTWa4y/xsf13Efzs9NjbdGjnqygn8aytb1eXTDCI0RvMz97NacH+pi/3F/lXN+LvvWv0avr8zr1KWBdSDs9D38bUnDDOcXroQjxZc/wDPCL8j/jR/wltz/wA8IvyP+NZWmXsen3onksra8AVl8m5BKHIxngg5HXr1qlXx/wDauM/nZ8/9dxH8x0R8WXP/ADwh/X/Gj/hLLn/nhD+R/wAaytRvo7+WJ0sra1EcSxlbcEByP4jkn5j36Cltr6ODTry1aytpXuNm2eQHzIdpz8hBxz0OQaX9q4y3xsPrtf8AnNQeLLn/AJ4Rfkf8aD4suf8AnhF+R/xrFs51t72Gd4I51jdXMUoJR8HOGweh+oovJ1ub2adYIoFkcuIogQiZOdq5OcD6mn/auM252H12v/MbX/CW3P8Azwi/I/40DxZc/wDPCH9f8ay7m+SfTrO1Wytont9+6eMHzJtxyN5Jxx0GAOKNNvo7C5aWSytrsGNk2XAJUZH3hgjkdu1L+1cZb42H13Efzmp/wltz/wA8IvyP+NB8WXP/ADwi/I/41ztXdRvo7+5WZLK2tAsap5dspCnA+8ck8nvz1p/2rjP52H13EfzGr/wllz/zwh/X/Gj/AISy5/54Q/r/AI1lpfRppU1kbK2d5JFcXLA+amP4VOcYP0NRWNytnew3DW0NysbhjDMCUfHZsEHH40f2rjf52P67iP5zZ/4Sy5/54Q/kf8aP+Etuv+feL8j/AI1hTSebM8iosasxYInRc9h7VZu76O5srO3SytoGt1ZWmiBDzZOcvk4JHTgDij+1cZ/OxfXcR/Man/CWXX/PvD+v+NH/AAlt1/zwi/I/41l2N9HaR3SPZW1yZ4jGGmUkxE/xJgjDfXIqlmj+1cZf42H13Efzs6IeLLokDyIvyP8AjXVId8aPz8yg8fSvP7+8S/1KS6jtILRZCCIbcEInGOAST29a7+H/AI94v9xf5V9DkGLrYhz9tK9rHq5XXqVXLndzmPFv+ut/9w/zrIuBpw06za3kuWvTv+0rIqiNefl2EHJ465Awa1/F3+vtv9w/zrIuNOe20+zvWntnS637Y0mDSJtOPnUcrntnqK8DOLfXZ37/AKHmY/8A3mQ3TLP7ffR2+/Zvz82M9Bmt4+ER2vD/AN+//r1leHf+Q3B9G/ka7qvWyXLsNiaDnVjdp+fkd2XYSlWpOU1d3OZ/4RBf+fw/9+//AK9H/CIL/wA/h/79/wD166aiva/sPBfyfi/8z0P7Nw38v4s5hvCQVSfthOAT/q//AK9cwwwxHpXpkn+rf/dP8q80f7xHvXzme4KjhXD2Kte/6Hk5nhqdBx9mrXLl0unfYrM2kly10Vb7UsqqEVs8bCDkjHqBzRpdiNRvVtzJs3A84zRdadJaWVpdNPbOt0rMqRShnTBxhwOVP16irXhn/kNRf7rfyryMFCNSvCEtU3+pw0IKVWMZbNmj/wAIgv8Az+H/AL9//Xo/4RBf+fw/9+//AK9dNRX3X9h4L+T8X/mfS/2bhv5fxZzP/CIL/wA/h/79/wD16P8AhEF/5/D/AN+//r101FL+w8D/ACfi/wDMX9m4b+X8zmv+ERGP+Pw/9+//AK9Ymq2H9nXhg8zfwGzjHWvQK4vxT/yGD/uL/KvIznLsNhsOp0o2d+7ODMcHRo0lKCs7lKyXTWtrv7bJcpMIwbYQqpVnz/GScgY9MmqS/eH1q7Z6dJe215Ok9tGLWPeVmmCM/OMID94+wqkv3h9a+WjbmPEPS4P9RF/uL/Kua8Xfetfo1dLB/qIv9xf5VzXi771r9Gr7rN/+Rc/l+aPp8f8A7o/kYumJp7XoXVJLiO12tlrZVZ8444JAxnFUqu6Zp0mqXotY57aElWbfczCNBgZ6nv8A1qlXwatc+YOisvDQvLOK4+1bfMGcbM/1qf8A4RFf+fw/9+//AK9a+h/8gW2/3T/M1oV93hcnwc6EJyhq0urPpqGX4edOMnHVrzOY/wCEQX/n8P8A37/+vR/wiC/8/h/79/8A166aiuj+w8F/J+L/AMzT+zcN/L+LOZ/4RFf+fw/9+/8A69RXfhgWtnLcfa92xd2CmM/rXV1T1fnRrv8A3P61z4rJ8HCjKUYapd2Z1svw8acpKOqXmeedDV3Ul09LlRpsly8PlqWNwqq2/HzABSRjPTvVLvV3UtPfTLlYHntpi0aybreYSKMjOCR39R2r4V7nzJY0fSf7VeRTL5ewZztzmtT/AIRFf+fw/wDfv/69M8Jf665/3B/Oupr67KcrwuIwqqVI3fqz38DgqNWipzV2cz/wiC/8/h/79/8A16P+EQX/AJ/D/wB+/wD69dNRXqf2Hgv5Pxf+Z1/2bhv5fxZyF/4cFhZSXAud+zsUxnnHrWD/ABV3fiD/AJAdx9F/9CFcGetfLZ3haWGrqFJWVjxcxowo1VGCsrFzUFsV1KRdNeeS0yPLa4ULJjHcKSOue9d/B/x7xf7i/wAq4C/sW03UZLR5oJmjIzJbyiRDxnhhwa7+D/j3i/3F/lXfwxbmn6I6sn+KfyOY8Xf662/3D/OsB7aaKKOZ4nWOTOxipAbHXB71v+Lv9dbf7h/nWLPqV5c2VtZT3Mslra7vIiZsrHuOW2jtk15Ocf77P1/Q4cw/3mRa8O/8hu3/AOBf+gmu6z715irFTx1pTIx/iP5105bm/wBSpOnyXu77muEzD6tBx5b3PTc+9GfevMvMb+8fzo8xv7x/OvQ/1n/6d/j/AMA6/wC2v7n4/wDAPS5D+7fn+E15o/3z9aN7/wB4/nSV5OZ5l9ecXy2t5nDjMZ9ZadrWJZLeaKOOSSJ1jkGUZlIDfQ960vDQ/wCJzH/ut/KqVxqV5d2lta3FzLLBaqVgjY5EYJyQPTJqsCRyDiuDDVXRqRqNbO5y0p+zqKfY9Nz70Z968y8xv7x/OjzG/vH86+l/1n/6d/j/AMA9j+2n/J+P/APTc+9GfevMvMb+8fzo8xv7x/Oj/Wf/AKd/j/wA/tp/yfj/AMA9Nz71xnin/kL/APAF/lWL5jf3j+dISScnk1wZjnP1ykqfJbW+5y4vMPrEOTlsSR280ySPHE7rGMuVUkKPU+lRr94fWrVrqV5ZQXMFrcSxRXKeXOiNgSL1wfUVUrw1ueaelwn/AEaLn+Bf5Vzfi771r9G/pXNB2/vH86QsT1JNe9jM6+sYf2HJbbr/AMA9PEZj7Wl7Llt8ySC3muZPLgieSTBO1FJOB14FRd6t2Go3mlXQurC5ltpwpUSRtg4IwR+VVK8HW55h6Bov/IGtf90/zNXyRnrXmXmOBjcaN7f3j+dfTUOIvZU40/Z3srb/APAPZp5tyQUeS9vP/gHpufejPvXmXmN/eP50eY394/nWv+s//Tv8f+AX/bX9z8f+Aem5HrVPVv8AkD3X+5/WvPt7f3j+dG9iPvGs63EXtacoeztdW3/4BFTN+eDjyb+Y3HNSzW81s4SaN42IDAOpBweh5qGrd/qV5qk6zX1zLcSqixh5GyQo4A+gr5jU8Y3PCP8Arbn/AHB/Oupzx1rzEOR0JFLvb+8fzr38Bnf1SiqXJe3n/wAA9TC5l7Cmoct/mem596M+9eZeY394/nR5jf3j+ddn+s//AE7/AB/4B0f21/c/H/gHd6//AMgS457D+YrgzS727kmkzXiZljvrtVVOW2ljzcXifrM1O1iWSGW3n8qaN45FPKOMEfhXo0P/AB7xf7i/yrz69v7vU797y+uJLi5kILyyHLNgY5P0Fegw/wDHvF/uL/KvX4a3qX8v1PQyf4p/I5jxb/rrf/cP86yLi+jn0+ztVsraJ7ffunjB8ybccjeSccdBgDitfxd/rbb/AHD/ADrIuF05dPtDbS3LXp3/AGlXVRGvPy7CDk8dcgYNeVnC/wBtn6/ocOYf7zINNvo7C5aWSytrsGNk8u4BKjI+8MEcjt2qkTVvTbP7ffR2+/ZvzzjPQVvHwguf+P0/9+//AK9ZYbLsRiYudKN1tuRRwlatHmgrow9Rvo7+5WZLK2tAI1Ty7dSFOBjcck8nvzRHfRx6TNZGytneSRXFywJlTH8KnOMH6Gtv/hEB/wA/p/79/wD16P8AhEF/5/T/AN+//r1v/YeN25PxX+Zr/Z2J/l/I5+xuVs76G4a3huVjYMYZgSj47Ngg4/EVHNIsszyKioGYsEXovsPaujbwiqqT9sPAz/q//r1zLDaSK5cTgq2Fa9rG1zCth6lCyqK1y5d30dzZWlullbQtbqytNECHmyc5fJIJHTgCnafqEdhHdB7C1ujPEYlM6sTET/GuCPmHvkU27TTlsrQ2kly10Vb7SsqqEVs8bCDkjHqBSaXY/wBo3q25k2ZBOcZ6Vz06TqtQitWzOMXKXKt2Ux1q3qV5Hf38t1HaQWiyYIgtwRGnGOAST79a3R4QH/P4f+/f/wBeudvLf7NdywZ3bGK59a6sTl9fDJSqxtfzNa2Fq0UnUVrk/wBuj/sf7B9itvM8/wA37XtPm4xjZnONvfpnPejS76PTtQjupLK2vFTdmC5BMbZBHIBB469eoo26b/Y+7zLn+0/Pxs2L5Xlbeuc53Z7YxioLS3+03cUOdvmMFz9a44x5vdXUwSbdkQ556Vau7tLmO2RLWCDyYhGWiBBlIJO5sk/NzjjAwBW7/wAIgP8An8P/AH7/APr0v/CIL/z+n/v3/wDXr1f7Exu/J+K/zO3+zsT/AC/kYlnfx2ltdwtZW1wbiPYskwJaHnO5MEYP1zVaGRY5kkZFcKwJRujY7H2rpP8AhEF/5/T/AN+//r0f8Igv/P6f+/f/ANej+xMb/J+K/wAw/s3E/wAv5GBqF2l7fzXKWsFqsjbhDACET2AJJx+NPe9jfS47P7Jbq6SNIbkA+awIA2k5xtGM9O9bn/CIL/z+n/v3/wDXo/4RBf8An9P/AH7/APr0v7Exv8n4r/MP7OxP8v5GHpl9Hp96LiSytrwBWXybkEocjGeCDkdevWqVdT/wiC/8/p/79/8A16P+EQX/AJ/T/wB+/wD69P8AsTG/yfiv8w/s7E/y/kYmo30d/JE6WVtaiOJYytuCA5H8RyT8x79BRbXyW+nXdq1lbTPcbNs7g+ZDtOfkIOOehyDxW3/wiA/5/T/37/8Ar1S1XQBptqJ/tHmZbbjbisquUYqlTcpwtFea/wAyZ4GvTi5yjZL0MuznW3vYZ2ginWNw5ilBKPg5w2CDg/UUXk63V3NOkEUCyOWEUQIRMnOFyScD6mizFu13CLtpVti4EpiALhc87QeCcep60Xi2y3cwtGla2DkRNKAHK543AHAOPQmvP6nGTXN9HcadaWq2VtE9vv3ToD5k245G8k446DAHFGm30en3LSyWVteAoybLgEqMj7wwRyO3ar2laANStDP9o8vDbcbc/wCetT3nhdbWyluPtZby13Y2Yz+td0crxEqPtVH3d9zqjg67h7RR0Ocq7qV9Hf3Kyx2VtZhY1Ty7dSFOBjcck8nvzVLHNXdSXT1uFGmyXMkPlruNwqq2/HzYCk8Z6d64XucoqX0a6XNZfY7Z3kkVxcsD5qAfwqc4wfoaisblbS+huHt4blY3DGGYEo+OzYIOPxFXNH0j+1WlUy+XsGc7c5rU/wCEQH/P7/5D/wDr130MrxNeHPTjdPzR1UsHXqx5oRujm5pFlmeRUVAzEhE6L7D2qzd38dzZWdulnbwG3VlaaIEPNk5y+TgkdOAOK2/+EQH/AD+n/v3/APXo/wCEQX/n9P8A37/+vW39iY1/Y/Ff5mn9nYn+X8jEsr6O0iukaytrkzxGMNMCTET/ABJgj5vrkVS9K6DUPDa2NlJcfaS+zHylMZ5x61gY+b2rixGFq4aXLVVmc9ajUoy5aisy3qF5Hf6lJdR2kFokhBEFuCETjHAJJ7Z69676H/j3i/3F/lXA6gtiuoyLpsk8lmCPLa4VVkI9wCR1z3rvof8Aj3i/3F/lX0HDHxTt2R6mT/FP5HM+Lh/pFv8A7p/nWPcaa9tptnetPbOt1v2xxzK0ibTj51HK57Z6itjxd/x8W3+6f51gPbzRwxyvE6xyZ2OVIDY64PevJzi/12fr+hw5h/vMi3otxFa6rDNM+xFzlsZxwa6z/hINL/5+h/3yf8K4iGCa5k2QxPI+NxCKWOO54qLNVgs2rYOm6dNK2+v/AA48NjqmHi4wS1O8/wCEg0v/AJ+h/wB8t/hR/wAJBpn/AD9D/vlv8K4eaCa2cJNG8bEAgOpBIPQ80CCZoWnETmJSFMm07QfQnpXb/rJif5V+P+Z0f2vX7L+vmdu+vaYysouRkgj7p/wrhG5YntmpIo5J5FjjRpHY4CqMkn0ApjKysVYbSDgg9q87HZjUxri6iWnY5MTi54izmti3dadJaWVndNPbOt0rMqRyhnTBxhwOVP17Vc8M/wDIZj/3W/lWXJbzRRxySRuscgJRmUgNj0PetPwz/wAhmP8A3W/lWeXf71Tv3X5k4X+PD1R24rz3V/8AkLXX/XQ/zr0IV57q/wDyFrr/AK6H+dfS8S/woep7Gc/BEP7Of+x/7T8+22ef5Hk+cPNzjO7Z129t3TNN0+VYdQgkc4VZASfQZqL7PN9m+0eU/k7tvmbTt3dcZ9fakggmuZRHBE8kh6KilifwFfIQlyS5ux4EXZ3O4/4SDS/+fof98H/Cj/hINL/5+h/3y3+FcFUskMkKoZI2QOu5CRjcPUeor3v9Y8V/Kvx/zPU/tev2X9fM7j/hINL/AOfof98t/hR/wkGmHj7UP++D/hXERwTTK7xxu6xjc5VchR6n0qMfeH1priPFfyr8f8w/tev2X9fM9NUhlDDkEZBqtd6hbWJQXEnllx8vyk5qaD/j2i/3F/lXN+Lvv2v0b+lfSY/Fzw+EdaK10PYxVeVKh7SK1NX/AISDS/8An6H/AHy3+FH/AAkGmf8AP0P++W/wrh4YJrmTy4I3kfBO1FJPvwKir5v/AFkxP8q/H/M8f+16/Zf18zvv7f0zH/H0P++W/wAKytf1SyvNNEUE29/MBwFI4x71zk0E1syiaN4yw3AOpGQehGe1CQTSQySrE7Rx43uFJC56ZPasMRntevSdOSVn/Xczq5nVqwcJJWY6zt2vLyG1V4o2lcIHlcKi5OMsTwB70Xlu1neTWzPFI0TlC8Th1bBxlSOCPeoo45JZFjjVndjhVUZJJ7AUSxyRStHIjI6nBVhgg+hFeL1POOx8Lf8AIJb/AK6n+Qq/q/8AyB7v/rn/AFqh4W/5BDf9dT/IVf1f/kD3f/XP+tfeYX/kVf8AbrPp6H+4fJnnh61d1LT30y5WCSe2mLRrJut5hIoyM4JHQ+o6iqXepZoJrdwk0TxsQGAdSDg9DzXwb3PmDY8OX1vYvO1xJsDKAOCc810H/CQaZ/z9D/vhv8K4gW8zQtOsTmJTgvtO0H0JpsUck0qxxI0jscKqjJJ9hXsYTOq+FpKlBJpdzvoZjVowUI2sdz/wkGl/8/Q/75b/AAo/4SDS/wDn6H/fLf4VwjKyMVYYIJBB7VI9vNFHHJJG6xyDKMykBvoe9dP+smK7L8f8zb+16/Zf18zqdX1exutKmhhn3O2MDafWuR71LHBLOrmKJ3WNdzlVJ2j1PoKhrysbjamMqe0qJJrTQ4sTiZ4iXNLcu6hYtpmpSWjzQTNGQDJbyiRDxnhhwa7+D/j3i/3F/lXnMkElvP5U0bRyKRlHGCPwNejQf8e8X+4v8q93hj4p+iPSyf4p/I5jxd/x8W/+4f51izX95cWdvaTXMr29vu8mJnJSPccttHQZPpXd3en218ym4i3lRgckYqt/YGmY/wCPUf8AfTf41ePyPEYjESqxas/67F4rLatWtKcWrM4uzvrzTpjNZ3M1vIyFC8TlSVPBGR2NV67z/hH9L/59R/303+NH/CP6X/z6j/vpv8a5P9W8V3X4/wCRz/2RX7r+vkcZeX15qMyzXtxLcSqgQPK5YhRwBk9hQl/eR2ElitzKtpK4d4Q52Mw6EjoSK7P+wNM/59R/323+NH9gaZ/z6j/vtv8AGl/q3idrx/H/ACD+yK3df18jibW5uLK5jubWaSGeIhkkjbaykdCCOaZJI0sjSSMXdiWZickk9Sa7htB0xVZhbDIBI+Y/41wrcMR2zXn47LqmCcfaNO/Y5MThJ4eym9yxPfXdzbW9tPcyyw24Kwxu5KxgnJCjoAT6Ve8M/wDIZi/3W/lVW7vo7mys4EsraFrdWVpowd82TnL5OMjpwBVrw1/yGYv91v5Vnl3+9U/X9ScL/Hh6o7ivPdX/AOQtdf8AXQ/zr0GqEui6fPI0klvl2OSdx619nm+Aq4yEY02tO59Dj8LPERSg9jift95/Z39n/aZvsfmed5G8+Xvxjdt6Zxxn0osr28027S6sriW2uEzslhcoy5GDgjnoSK7P+wNM/wCfUf8AfTf40f2Bpn/PqP8Avtv8a8D/AFbxO14/j/keX/ZFbuv6+RwVWZ7y5ulhS4uJJVgjEUQdifLTJIUZ6DJPHvXaf8I/pef+PUf99t/jXMa/aQ2WomKBNibQcZz2965MblFbCU/aVGreRz4jAVKEeadinb393aQzw291NFFcJsmSNyokXrhgOo+tVl+8PrTaVfvD615a3OJHpkH+oi/3F/lXNeLvvWv0aulg/wCPeL/cX+Vc14u+9a/Rv6V91m//ACLn8vzR9PmH+6P5GDZX95p1yLiyupbaYAqJIXKNgjBGR6iqxpKUda+EPmC3eX15fvG93cy3DRxrGhlcsVQdFGew9KIb+7t7S4tIbmWO2udvnRK5CSbTldw6HB9a6fS9GsLjTIJZYNzupJO488mrf9gaZ/z6j/vpv8a9ylw/iKlOM01Z6/1oenDK604qaa1OIt55rS5juIJHimiYOkiHDKw5BBHQii4nmu7mS4nkeWaVi7yOcszHkkk9TXb/ANgaZ/z6j/vtv8aP7A0z/n1H/fbf41p/q3it7r8f8iv7Ir91/XyK/hb/AJBLY/56n+Qq9q//ACBrvP8Ac/rU9tawWcfl26bEznGSeag1f/kD3ef7n9a+ijQlQy9057qLPWVN0sI4S3SZ553qze395qMyzXtzNcSqgQPK5YhRwBk9hVbuau6lfR39wsqWVtaBY1Ty7cEKSB945J5Pfmvz17nyg1b+8jsZLFLmVbSVw7whzsZh0JHQkVHbXU9lcx3NrNJDPEwaOSNtrKR0II6Vr+HbG2vnnW4j3hQCOSMc+1b/APYGmf8APqP++m/xr18JktbFUvawaSfc76GXVa0OeLVmcNJJJNI0kjF5HJZmY5JJ6k1NPf3lzbW9vPcyyQ26lYY3clYwTkhQemT6V2f9gaX/AM+o/wC+m/xpP7A0v/n1H/fTf410/wCrmJ7r8f8AI2/siv3X9fI422v7yyjnS1uZYUuE8qYRuVEiHqrY6j2NVa73/hH9L/59R/303+NH/CP6X/z6j/vpv8af+rmKvuvx/wAg/sev3X9fI4y6vbrULxrq9uJbi4kI3yysWZscck8npXoUP/HvF/uL/KqI0HTQf+PUf99H/GtALtAUdAMCvYyfLKuCcue2ttj0MBgqmHcuZ7i0UUV756gUUUUAFFFFADZP9W/+6f5V5m/3j9a9Mk/1b/7p/lXmb/eP1r5Hiben8/0PBzneHzLt2unCxs2tJLlroq32pZVUIrZ42EHJGPUDmrPhn/kMxf7rfyqtdadJaWVpdNPbOt0rMqRShnTBxhwOVP16irXhn/kMxf7rfyrwMtt9ap27r8zzML/Hh6o7esC78Ti1u5IDa7vLYrnf6fhXQA8V57q//IWuv+uh/nX12eYythqcZUna7PezLEVKMYum7XNv/hLx/wA+Z/7+f/Wo/wCEvX/nzP8A38/+tXK0V85/bWO/n/Bf5Hj/ANpYn+b8EdUPF65/48z/AN/P/rVi6rqH9o3nniPZwBjOelUKK58RmOJxEOSrK6+RlVxdatHlm7oSlBwQaSiuE5jqU8WhI1T7GTtAGfM/+tWZrGr/ANq+UfJ8vywf4s5rKorvrZlia1P2VSV4+iOqpjK1SHJKV0JRRRXAcp0dl4mFlZRW/wBm3eWMZ34z+lT/APCXr/z6H/v5/wDWrl6QivThm+MhFRjOyXkjsjj8RFKKlovQ6n/hLx/z5n/v5/8AWo/4S8f8+Z/7+f8A1q5Wiq/trHfz/giv7SxP834I9E0zUP7StGnCeWN23Gc+n+NGr/8AIGu/9z+tUPCv/IJb/rqf5Cr+r/8AIHu/+uf9a+rp1Z1ctdSbu3FnuQnKpg3OTu2jzzuau6kunpcKNNkuZIfLXcbhVVt+PmwFJ4z0ql3q7qWnvplysDz20xaNZN1vMJFGRnBI7+o7V+fvc+VNnwj/AK65/wBwfzrqa5bwj/rrn/cH866mvv8AIf8Aco/P8z6nLP8AdkFFFFeyegFFFFABRRRQAUUUUAFFFFABRRRQA2T/AFb/AO6f5V5m/wB9vrXpkn+rf/dP8q80k++31r5Hib4qfz/Q8HOd4fMfJbzRRpJJE6xyAlGZSA30PetPw1/yGY/91v5VRnv7u5tre3nuZZIbcFYY3clYwTkhR2yfSr3hr/kMx/7rfyrwMu/3qnfuvzPMwv8AHh6nbivPdX/5C11/10P869CFee6v/wAha6/66H+dfTcS/wAOHqexnPwRKNOAJOBSVd0of8TS1/66r/OvkYR5pKPc8GKu0ipsb+6fyo2N/dNdnqeq3FpqMdrbwxuz4xu45NMutS1WygM0trAEBxkHP9a76+GwlGp7KdWz/wAP/BPQ+oK0mm2o7+7t+JxxUjqDSdK2L/Xpr+1MDxRqpOcqDmseuOtCnGVqcrr0scFRRi7Rd0JRRRWJA4Ak8DNO8th1U/lUtldNZ3STooLKcgN0rbTxTdSMEW3hyeBwf8a7MPRo1NJyafpf9TanGk1ecrfI57Y390/lQUYDJBArpZfEV7GuWtoAM9s/41NrUxuPDkEzABncEgdO9ddXLIQjL3neKvZxt+pqqNKcZSpzvby/4JyNFFFeQch2vhb/AJBDf9dT/IVf1f8A5A93/wBc/wCtUPC3/IJb/rqf5Cr+r/8AIHu/9z+tfeYX/kVf9us+no/7j8meed6lmt5rdwk0TxsQGAdSDg9DzUR61Zvb+81GZZr25luJVQIHlcsQo4Ayewr4PqfMG54R/wBdc/7g/nXVVyvhH/XXP+4P511Vff5D/uUfn+Z9Tln+7IKKKK9k9AKKKKACiiigDhf+Ej1T/n4H/fC/4Uf8JHqn/PwP++F/wrJor8y+vYr/AJ+P72fG/Wa387+81v8AhI9U/wCfgf8AfC/4Uf8ACR6p/wA/A/74X/Csmij69iv+fj+9h9Zrfzv7zW/4SPVP+fgf98L/AIUf8JHqn/PwP++F/wAKyaKPr2K/5+P72H1mt/O/vNceItTwVNxwevyD/Cstmyee9NorKrXqVf4km7dzOdSc/idy9d30dxZWlutlbwtbqytNGCHmyc5fJIJHTgCorS8lspxNA21wMZxmrF9/ZP8AZ9h9h+1fbdjfbfO2+Xuz8vl45xjrnvWdWNOTjrHRoSbTujWHiTU/+fgf98L/AIVnTTPPK0kh3MxyT71FRW1XEVaqSqSb9WVOrOfxSuFXdJ/5Ctr/ANdV/mKpdqu6T/yFbX/rqv8AMUqH8WPqKn8aNrWZEi8TWzu21F2kk+mam12/tLjTGjiuEkbcOAaz/FR/4mi/9cxWHmrzWip42U3umevLMqmHVahFJqe42iiiuc8UKKKKAFqW3bZMpPAB5NQ0orSlUdOamumomrqxo3k0bwgK4Jz0Fa+of8inafUf1rmB1FdPqP8AyKdp9R/WvdeOnjpVqs1Z8vQ68HFRp1Euxy1FFFfPHKaFpq95ZQmK3l2ITnG0H+dSTa7qE8DwyTZRhhhtHNZlFdCxVdR5FN29TVVqijyqTsFXdSvo7+5WWOytrQLGqeXbqQpwPvHJPJ781SrQ1f8Asr7Wn9ji6+zeUm77Vt3eZj5sbeMZ6d65nuZEVnqN1YMxtpNhcc8A5/Orf/CR6n/z8D/vhf8ACsmjNdNPFV6ceWE2l6msa9SKtGTSNX/hI9U/5+B/3wv+FH/CR6p/z8D/AL4X/Csmir+vYr/n4/vZX1mt/O/vNb/hI9U/5+B/3wv+FH/CR6p/z8D/AL4X/Csmij69iv8An4/vYfWa387+81v+Ej1T/n4H/fC/4Uf8JHqn/PwP++F/wrJozR9exX/Px/ew+s1v5395rf8ACOan/wA8B/32v+NH/COan/zwH/fa/wCNd1RX1f8Aq3hf5pfh/ke5/Y9Hu/6+Rwv/AAjmp/8APAf99r/jR/wjmp/88B/32v8AjXdUUf6t4X+aX4f5B/Y9Hu/6+Rwv/COan/zwH/fa/wCNH/COan/z7j/vtf8AGu6oo/1bwv8ANL8P8g/sej3f9fI4X/hHtTwSbfoM/fH+NZZGDg9a9Nk/1b/7p/lXmTn5z9a8POMup4JwVNvXuebmGEhhnFRd7l680uazsbK7klgeO8VmRY5Qzrg4O4Dlfx61BaWk17OIYF3OQSBnFNkgmijjkkidI5ASjMpAb6HvWn4Z/wCQ1H/ut/KvMwlJVa0acno3Y46MFUqRg+pGPDmp/wDPuP8Avtf8azpont5njkGHQkEe9emV57q//IWuv+uh/nXr5vldLBwjKm279zux+Chh4pxd7lHtV3Sf+Qra/wDXVf5iqParuk/8hW2/66r/ADrxqH8WPqefT+NG/qMMdz4vsIJk3RySRqynuC3Ire8ZeHdJ07w9JcWlkkUolRQwLHAOc9TXNa/PLa69Dcwj95EFdSRkZByKj1XxZq+sWJtLvyzEWDELFg5FRnFCvPMOeDtFPU7q84RqVFJatnPUU7Y390/lRsb+6fypcrPOsNop2xv7p/KjY390/lT5WFhDWv4atobzxHYW9wgeGSZQynoRnpWVsYfwn8qs2N3Pp19DdwKPNhYOu5cjIqKkJuLUd2RVhKUJKO7R6H498O6TpegJPY2KQSmcKWBJ4wTjk/SuZ1H/AJFO0/3h/WotZ8Xavr1ktpe+WYlcP8kW05AI/rUuo8eE7TI7j+tdOR0atHC1Y1nd2/VDyWhXoYWpCu7yt69TlqKKK5yjQtdIvb2IyW8W9AcZ3Ac1JNoWoQQPNJBhEGSdwrofCv8AyCX/AOup/kKv6vxo11/uf1r6Wjk9CeC+sNu9rnsU8vpyw3tW3e1zzyr2q6XLpV0tvNNBI7RrJmCQSKAwyBkd/aqPepZoJrdwk0TxMQGAdSDg9DzXzXU8cms9Oub9mFvHvKDJ5AxVr/hHNT/54D/vsf41o+Ef9fc/7g/nXU9q+ny3JqGKw6qzbTf9dj2cHl1OtSU5N3OF/wCEc1P/AJ9x/wB9r/jR/wAI5qf/ADwH/fa/413VFd/+reF/ml+H+R1f2PR7v+vkcL/wjmp/88B/32v+NH/COan/AM8B/wB9r/jXdUUf6t4X+aX4f5B/Y9Hu/wCvkcL/AMI5qf8AzwH/AH2v+NH/AAjmp/8APAf99r/jXdUUf6t4X+aX4f5B/Y9Hu/6+QUUUV9EesFFFFABRRRQA2T/Vv/un+VeZv94/WvTJP9W/+6f5V5m/3j9a+R4m+Kn8/wBDwc53h8y1c6jeXdpbWtxcySwWoKwRs2VjBOSB6ZNXfDX/ACGYv91v5VBfaoL3TrC0+xWkP2NGXzYY9rzZOcyH+IjoPQVP4a/5DMX+638q8DLdMTT06r8zzML/AB4eqO3Fee6v/wAha6/66H+dehCvPdX/AOQtdf8AXQ/zr6biX+FD1PYzn4IlKpradra4jmHJRgwB9qgpa+QTaaaPATad0dF/wllz/wA8IfyP+NJ/wllx/wA+8X5H/Gudort/tPF/zs6frtf+Y6L/AISy4/54Q/kf8aP+EsuP+eEP5H/Gudoo/tLFfzsX1yv/ADHRf8JZcf8APCH8j/jR/wAJZcf88IfyP+Nc7RzR/aWK/nYfXK/8x0X/AAllx/zwh/I/40f8JZcf88IfyP8AjXO0Uf2li/52H1yv/MdF/wAJZcf88IfyP+NVdR12fUbcQPGiKG3fKDWQKO9RPH4mpFwlJ2YpYqtJcspaMSiiiuM5ztfC3/IIb/rqf5Cr+r/8ge7/ANz+tUPC3/IIb/rqf5Cr+r/8ge7/ANz+tfeYX/kVf9us+nof7h8meed6tX+o3mqTrPfXMtxKqLGHkbJCjgD6CqvetDV9T/ta7ScWVpabYkj8u1i2KdoxuI9T3Pc18G99j5g1fCP+uuf9wfzrqq5Xwj/rrn/cH866qvv8h/3KPz/M+pyz/dkFFFFeyegFFFFABRRRQAUVWvNQtbBlFxLsLDI4JzVc6/pZ/wCXof8AfLf4VyzxuHg3GU0n6oxliKUW1KST9TRorN/t/TP+fof98N/hR/b+mf8AP0P++W/wqfr+F/5+L70L61Q/nX3mlRWb/b+mf8/Q/wC+W/wpf7f0z/n6H/fLf4UfX8L/AM/F96D61Q/nX3mhIP3T/wC6f5V5m/3j9a7pte0xkYfaRkggfKf8K4V+WJHrXy/ENenVdP2ck7X2+R4ubVYVHHkdy5drpwsrQ2kly10Vb7UsqqEVs8bCDkjHqBzVrw1/yGov91v5VVu9OktLK0umntnF0rMqRShnTBxhwOVP16iptCuYbTU0lnfYmDk4z2rxcBKMcRCTeif6nnYZqNaLeyZ3lee6v/yFrr/ro3867Aa/ph/5eh/3yf8ACuN1GVZ9RnljO5HckH1Ga+g4gxFKtTh7OSdn0Z6ua1qc4x5JXKdT2cH2m7igzt8xgufTNQVb06VYb+CRzhFkBJ9BmvmaSTmr7HiwSckmb3/CIL/z+H/v3/8AXo/4RBf+fw/9+/8A69av9v6X/wA/Q/74b/Cj+39L/wCfof8AfLf4V9isHk/df+Bf8E+h+r5f3X3/APBMr/hEF/5/D/37/wDr0f8ACIL/AM/h/wC/f/161f7f0v8A5+h/3y3+FH9v6YT/AMfQ/wC+W/wp/U8n7r/wL/gh9Wy/uvv/AOCZX/CIL/z+H/v3/wDXo/4RBf8An8P/AH7/APr10wbcoK8gjINV7vULax2faZNm/pwT/Kt55Tl0I88o2Xq/8zWWAwkVeSsvVmD/AMIgv/P4f+/f/wBej/hEF/5/D/37/wDr1q/2/pf/AD9D/vlv8KP7f0v/AJ+h/wB8t/hWH1PJ+6/8C/4Jl9Xy/uvv/wCCZf8AwiC/8/h/79//AF6o6roA020E4uPM+bbjbj+tdF/b+mf8/Q/75b/CsvX9Vs7vThFBNvfeDjaRxg1y43C5ZGhJ0muZba/8ExxNDBRpSdNq/qcpRRRXyZ4R2vhb/kEt/wBdT/IVf1f/AJA13/uf1rF0DVLOzsGinm2Nv3Y2k8YFW9R1qwuNOuIo59zsmFG019rhsVQWW8jmk7PqfRUa9JYPlclexxfc1d1JdPS4UabLcyQ+Wu43Cqrb8fNgKTxnpVKrupae+mXKwPPbTFo1k3W8wkUAjOCR0PqO1fFO1z542PCP+uuf9wfzrqq47w5e21jJO1xJsDKAOCc810H9v6YTxdD/AL5b/CvtslxdCng4xnNJ67s+iy6vShQSlJJmjRWb/b+mf8/Q/wC+W/wo/t/TP+fof98t/hXrfX8L/wA/F96O/wCtUP5195pUVm/2/pn/AD9D/vlv8KX+39M/5+h/3y3+FH1/C/8APxfeg+tUP5195o0VnDXtMJwLoZ/3G/wrRUhlDA5BGRWlPE0qt/ZyTt2ZcKsKnwO5yni7/XW3+4f51gvbTRRRzPE6xyZ2OVIDY64Pet7xcf39v/uH+dYst/eXFpb2ktzLJb2+7yYmclY9xy20dBk+lfA5x/vs/X9D5bMP95kRQ281y5SCN5GALEIpJx3PFRVZs7+706YzWVzLbyshQvE5UlTwRkdjVavNOMlmt5rZwk0bxsQCA6kEg9DzQtvM0DTiJzEpCtIFO0E9iakvb+81GYTXt1NcSqgQPK5YhRwBk9hQl/dx2MlilzKtpK4d4A52Mw6EjoSKWoEMUUk0ixxo0jscKqjJJ9AKRlZWKsMEEgg9qktrqeyuY7m1mkhniYMkkbFWUjuCOQaZJI8sjSSOzyMSzMTkknqTT1AdJbzRRpJJE6xyAlGZSA30Pelitppw7Qwu4RdzlFJ2j1OOgp89/d3Nvb289zLLDbgrDG7krGCckKO2T6U601G8sFnW0upoBcRmKYROVEiHqrY6j2pa2AqYqWaGS3laGaN45F6q4wR9QaiBqxeXl1f3b3V7PLcXEhy8srFmbtyT1pgM+zzeR9o8p/J3bfM2nbu64z0z7UQQTXMoigieSQ9ERSxP4CpPt13/AGf/AGf9qm+x+b532fedm/GN23pnHGetFlfXmm3aXVjcy21ymdksLFGXIwcEc9CRS1sBWxUskEkao0kbIHXcpIxuHqPUVFVi4vLm7WFJ55JVgjEcQdiRGmSdq56Dk8e9MBkdvNMkjxxu6xjLlVJCj1PpUa/eH1qxb393aQzw29zNFFcLsmSNyokXrhgOo+tV1+8PrTW4I9Lg/wCPeL/cX+Vc14v+9a/Rv6V0sH+oi/3F/lXNeLvvWv0avus3/wCRc/l+aPp8w/3R/I52GCa5k8uCJ5JME7UUk4HXgVFVmyv7zTrkXFjdTW04BUSQuUbBGCMj1FVq+EPmCWa3mtmUTRPGWUMA6kZB6EZ7UJbzSwyTJG7Rx43uFJC56ZPapLu+vL943u7mW4aNFjRpXLFUHRRnoB6UsN/eW9pcWkN1LHbXO3zolchZNpyu4dDg+vSlrYCCONpZFjjRndjhVUZJPoKJI3ikaORGR1OCrDBB9Kdb3E1pcx3NvI8U0TB0kQ4ZGHIII6EGi4uJru5kubiR5ZpWLvI5yzMeSST1NPUAe3mjhjmeN1jkzscqQGx1we9ENvNcOUgieRgCSEUk4HU8VLNf3lxaW9pNcyyW1vu8mJnJWPccnaOgyfTrSWd/eadM01lczW8rIULxOVJU8EZHY0tbAVqlmt5rZwk0TxsQGAdSCQeh5qKrN7f3mozLLe3MtxKqCMPK5YhRwBk9hTAjFvM0DTrG5iUhS+07QfQmmxRSTyLHGjSOxwqqMkn0AqZL+8SwksUupVtJXDvAHOxmHQkdCRTLW6nsrmO5tZpIZ4mDJJGxVlYdCCOho1AjZWRirqVIOCD2p8lvNFFHJJE6xyAlGZSA2OuD3pskkksjSSOzyMSzMxyST1Jqee/u7m2t7ee5lkht1Kwxu5KxgnJCg9Mn0o16ARRW80yu0cbuIxucqCdo9T6CosVatr+8sknS2uZYUuEMcyxuVEiHqrY6j2NVc0eoE0kMlvP5U0bxyKRlHGCPwr0aD/j3i/3F/lXnl1e3Wo3r3V7cS3FxIQXllcszduSetehwf8e8X+4v8q+n4a3qX8v1Payf4p/I5jxb/rrf/cP86yLi+jn0+ztVsraJ7ffunjB8ybccjeSccdBgDitfxd/rbb/cP86yLhdOXT7Q20ty16d/2lXVRGvPy7CDk8dcgYNeVnC/22fr+hw5h/vMiTRLeG61WKGdN6NnK568Gus/sDTP+fYf99N/jXG6befYL+O4Kb9mflzjORit7/hLl/59D/38/wDrV35TXwNOk1iUnK/VX0OrA1cLCm1WSvfsaf8AYGmf8+o/77P+NH9gaZ/z6j/vs/41mf8ACXL/AM+Z/wC/n/1q0tJ1gaq8iiHy9gz97Oa9qjWyqtNU6cU2/wC7/wAA9CnUwVSShFK78v8AgA2g6Yqs32YcAkfOf8a4V+HI7Zr0uT/VP/un+VeaP98/WvI4hoU6TpqnFK99vkcGbUoU3HkVrly6vo7mys7dbK2ha3VlaaIEPNk5y+SQSOnAFTaFbQ3WppDOm9CCSM46CobpNOWytGtJLlroq32lZVUIrZ42EHJGPUCjTL7+zr1bjy9+3IxnFeFg3TjVi5/Cnr955tFxVSLnsdf/AGBpf/PqP++j/jR/YGl/8+o/76P+NZf/AAl6/wDPmf8Av5/9aj/hL1/58z/38/8ArV9f9cyfsv8AwH/gHvfWMv7L7v8AgGp/YGl/8+o/76P+NH9gaX/z6j/vs/41l/8ACXr/AM+Z/wC/n/1qP+EvX/nzP/fz/wCtR9cyfsv/AAH/AIAfWcv7L7v+Aan/AAj+mf8APsP++j/jXMa/aQWWomKBNibAcZzWp/wly4/48z/38/8ArViarqH9o3v2jy/L+ULjOeleZmuIwFSglh0lK/RWOPHVcLOnailf0Es76O0truJrK2uDcR7FkmBLQ853JgjB+oNUh94fWrlmumtbXZvZLlJxGDbCFVKs+ejknIGPTJqkDgg185G1zyD0yH/URf7i/wAq5rxd9+1+jUsfi0JGq/YydoAz5n/1qzdY1caqYj5Pl+Xn+LPWvrMxzLDVsG6VOWunRnu4vGUamG5IvXQraZex6fei4ksra9UKy+TcglDkYzwQcjr1qlV3TV09r0DVJLmO12tlrZVZ8444JAxnFUjXyelzwjstL0bT7jTIJ5YNzsCSdx9at/2Bpn/PqP8Avs/41iWPiUWdlFb/AGXdsGN2/Gf0qx/wlw/58z/38/8ArV9hh8XlSoxU0rpa+7/wD36VfAqnFSSv6Gn/AGBpf/PqP++j/jR/YGl/8+o/77P+NZf/AAl6/wDPmf8Av5/9aj/hL1/58z/38/8ArVt9cyfsv/Af+AafWcv7L7v+Aan9gaZ/z6j/AL7P+NVtR0XT4NOnlSDa6JkHcaqf8Jev/Pmf+/n/ANaobvxOLqzmtxabfMXbnfnH6VjiMXlTpSUErtae7/wDOrXwLg1FK/oc73q5qV9Hf3CypZW1oFjVPLtwQpwMbjknk9+apDk1d1JdOW4UaZJcyQeWu43CKrb8fNgKTxnpXx73PANHw5Y299JOtxHvCqCOSMc+1dB/YGmDpaj/AL7P+NY/hH/XXP8AuD+ddSzbVJ64BNfa5NhcPPBqc4J77o+jy+hSlh1KUU2Zv9gaX/z6j/vs/wCNH9gaX/z6j/vs/wCNZh8XAEj7Gf8Av5/9ak/4S8f8+Z/7+f8A1qf1zJ+y/wDAf+AH1jL+y+7/AIBNq+j2Ftpk0sUGx1xg7ie4rkc8+tb9/wCIxfWUlv8AZim/HO/OOc+lYHevnc2qYapWTwy923RW1PJx06M6idHaxc1C8jv9Rkuo7SC0SQgiC3BCJxjgEk9s9e9d9D/x7xf7i/yrgdQWxXUZF02S4kswR5bXCqshHuASOue9d9D/AMe8X+4v8q9Thj4p27I7cn+KfyOZ8XD/AEi2/wB0/wA6x7jTXttNs71p7Z0ut+2OOZWkTacfOo5XPbPUVseLVJmt8An5D/Oud2P/AHT+VeVm8W8bO3f9Dix6/wBpkWtN0+TU7loI57aErG0m64mEakAZwCep9B3qkRzS7WHUGkrzbNbnEXdS0+TTLlYJJ7aYtGsm63mEigEZwSOh9R2rZ8If625/3R/Ouemt5rZwk8TxsRkB1IOD0PNdD4Q/1tz/ALo/nXpZN/vlP+uh2Zf/ALzE6eT/AFb/AO6f5V5m/wB4/WvTJP8AVv8A7p/lXmb/AHj9a9fiben8/wBDvzneHzLl3p0lpZWd009tIt0rMqRShnTBxhwOVP16il0/TJNRW6eOe1i+zQtMwnmWPeB/CufvN7Dmq8kE0UUckkTpHIMozKQG+h71CATwOa+Us2tGeIAFW9SsJNMv5bOSaCZ4yMyW8okRsjPDDg1W2N/cP5U08GqaYy7/AGc/9j/2l59t5fn+R5PnDzc7c7tnXb23dM0aZp76pqEdpHPbQNJnElzKI4xgE8seB0/Oq5t5vs/2jyn8ndt8zadu7rjPTNRUrN3sxAeuKt3dk9pHbO8sEguIRMBFKHKDJG1sfdbjoecEVW2N/cP5UbH/ALh/KnysLFuz06S9trudJ7aMWsfmMs0wRn5xhAfvH2HNUqdsb+6fyo2N/cP5U1FjsIDXv/g3wb4O8b+C0lHh2fT5lzGZ/MfLPjl0YnDDPbGAeK8C2N/cP5V3f/C2/Fq6HHpcMtvAqLsE0NuEfb2Ax8o+oANeZmeFxVenGOHfLJPe7X/Dlwst0c0/h6ZfEd3oou7JZbaSSMzSThIm2Z6MeOccetY1PKyeh/Km7G/un8q9GMJpa6kWLmoadJp0sUck9tMZYlmBt5hIFDdiR0Ydx1FFvpz3OnXl6s9siWuzdHJKFkfccfIp5bHfHQVU2P8A3T+VIQR1BFPllYLE9nbteXsNqkkUbSuEDysERcnGSTwB70Xds1neTWzSRSNE5QvEwdGwcZUjgj3qKON5ZFjjRndjhVUZJPoBRLG8UjRyIyOpwVYYIPoRS6iLVxp0ltptnetPbOt1v2xxyhpE2nHzqOVz2z1FGnafJqdy0Ec9tCVjaTdcTCNSAM4BPU+g71TCk9AaUqwGSpFHLKw7Dau6lp76ZcrBJPbTFo1k3W8wkUAjOCR39R1FUhUs1vNbOEmieNiAwDqQcHoeaBHQ+Ef9dc/7g/nXTyf6t/8AdNcx4R/11z/uD+ddPJ/q3/3TX3eTf8i9fM+ny7/dV8zzNvvH61cu9Ne0sbO6ae2dbpWZUimVnTBxh1HKn61Tb7x+tSvbzRRxyPFIkcgJRmUgNjrg96+FlufMMnsdOkv4rqRJ7aIW0RlYTTBC4HZAfvN7DmqWOaUZPAFLsb+4fyoSYFu/sW0zUpLOSaCZoyAZLeUSIeM8MODXfwf8e8X+4v8AKvNlVtw+U9fSvSYf+PeL/cX+VfT8NJqU7+R7WT/FP5DzRj2rB8Q6nd2EsK28mwMuT8oPf3rE/wCEi1P/AJ+B/wB8L/hXp4nOsPQqulOLbXodtbMaNKbhJO6Os1cf8Si64/grz01pTa7fzwvDJNlHGGG0c1m55r5nNsbTxdVTpqySPGx2JhiJqUFZFu8vrzUZ1mvbmW4lVAgeVyxCgYAyewrb8I/625/3R/OsfUr5L+5WWOytrQCNU8u3BCnA+8ck8nv2plnqNzYMzW8mwsMHgGuXL68cPXjVktEY4aqqVZTlsj0KT/Vv/un+VeZv94/WtX/hItTwR9o6jB+Qf4VlFsnNd+b5jSxrg6aenc6cwxcMS4uCtYsz313c21vbz3MskNupWGN3JWME5IUdgT6Ve8Nf8hmP/db+VVbu+jubKzgSytoWt1ZWmjB3zZOcvk4yOnAFWvDX/IZj/wB1v5VwZcv9qp6dV+ZzYX+ND1R2+PavPdX/AOQtdf8AXRv516EK891f/kLXX/XRv519LxKkqULdz184XuRGfb7v+zv7P+1TfY/M87yN52b8Y3bemccZ9Kk0n/kJ2v8A11X+Yo+3R/2P9g+xW3mef5v2vB83GMbM5xt79M571VileCVJIzhkIYH0Ir5KlJRmpNbM8KLtJNnpePajA9K4X/hI9T/5+B/3wv8AhR/wkep/8/A/74H+FfYriHCfyv7l/mfQLNqH8rO6x7UY9q4X/hI9T/5+B/3wP8KUeI9TLAfaB1/uD/Cn/rDhP5X9y/zD+1qH8r/A7nHtRj2pkR3QRk9SoJ/EVjeItSurAwC3k2bwc8A5r1sTiaeHo+2kro761aFKn7SS0NzHtRj2rhf+Ej1P/n4H/fA/wo/4SPU/+fgf98D/AAryf9YsJ/K/w/zOD+1qH8r/AAO5x7VjeKAP7JH/AF1H8jXP/wDCRan/AM9x/wB8D/CorvWL29hEU8u6MHONoHNcmNzvDV6EqcYtN+hjicyo1KThFO7KlvPNaXMdxBI8U0TB0kQ4ZWHIII6Gi5nmu7mS4uJHlmlYu8jnLMx5JJPU0+znW2vYZ3gjnWN1cxSglHwc4bB6H6ii8nW5vZp0gigWR2cRRAhEyc4XJJwPqa+V6nhnWeFh/wASlv8Arqf5Cr2rj/iUXX/XOqPhb/kEN/11P8hV/V/+QPd/9c/6193hUv7K/wC3WfTUUvqPyPPO9Wb2/vNRmWa9uZbiVUCB5XLEKOAMnsKrd6u6lfR39wsqWVtaBY1Ty7cEKcD7xyTye/NfCPc+ZNnwl/r7n/dH866eT/VP/umvPbPUbmwZjbybCwweAatnxDqeCPtAweD8g/wr6XL84oYbCqjJNvX+tz2MLmFOjR9nJO5lN95vrVme+u7m2t7ee5lkht1Kwxu5KxgnJCg9AT6VVzkk1eur6O5sbO3SytoGt1ZWmiBDzZOcvk4JHTgDivmnueOWvDX/ACGov91v5V2+OelecWl3NZTCaF9rjgHGetXT4i1PtcD/AL4H+FfQ5XmtDCUXTqRbd76HrYHHUqFNxmm3c7rHtRmuHXxFqe4ZuBj/AHF/wrtojuhjJ6lQT+VfRYHMqOLcvZRasevhcZDENqCtY5fxb/rbf/cP86yLkacNPtGt5Llr07/tKyKojXn5dhByeOuQMGtfxd/r7b/cP86yLjTnttPs71p7Z0ut+2NJg0ibTj51HK57Z6ivjs5t9dn6/ofPY/8A3mQacunvcsNSkuEh8tipt1Vm34+UEEjjPXvVHvU9ray3dwsMKb3boM4q8fDmp/8APAf99r/jXHSw1aouanFteSOeFGpNXjG5BqQ01blV0yS5kg8tSxuFVW34+YDBPGeneiNdP/suZpJLkagJFESKq+UU7ljnIP0GKn/4RzU/+fcf99r/AI0f8I5qf/PuP++1/wAa0+oYr+SX3Mv6tW/kf3FOxFo19CL5pktCw81oVDOF77QSBn6kVFN5fnv5JYxbjsLjnHbPvWj/AMI5qf8Az7j/AL7X/Gj/AIRzU/8An3H/AH2v+NH1DFf8+39zD6tW/kf3EF2unCytDaSXDXRVvtSyqoRWzxsIOSMeoFWvDX/IZj/3W/lTT4d1P/n3H/fa/wCNaWiaPe2WppNPDtQAgncPSuvAYLEQxMHKDsmuj7m+GoVVWi3F2v2OorzzV/8AkLXX/XRv516GOa47UNC1Ge/uJY4Mo7lgdw6Zr6DiGjUq04KnFuz6HqZrTnOMeVXM3Gm/2Pu8y5/tPz8bNi+V5W3rnOd2e2MYo0xdPbUIxqktylnz5jWyK0g4OMAkDrjv0qx/wjmp/wDPuP8Avtf8aP8AhHNT/wCfcf8Afa/418p9QxX8kvuZ4n1at/I/uMvv7VbuhYrHbfZHndzEDOJVACyZOQuDyuMcnB61ZHh3U/8An3H/AH2v+NUrqzmspvKnTY+M4zmoqYatTXNOLS9CJ0akFeUWiayXTWtrv7bJcpMIwbYQqpVnz/GScgY9MmqS/eH1q7Z6dJe215Ok9tGLWPeVmmCM/OMID94+wqkv3h9axjbmM0elwf6iL/cX+Vc14u+9a/Rq6WH/AFEX+4v8q5rxd961+jV91m//ACLn8vzR9Pj/APdH8jF0xNPa9C6pJcpa7Wy1sqs+cccEgYziqVXdM06TVL0Wsc9tCSrNvuZhGgwM9T3/AK1Sr4PS58wXtQXT1ki/s6S5eMxKZTcKqkSfxAYJ+X0PWi3GnHTrs3Mlyt6Nn2ZY0Uxtz828k5HHTANSQaHf3MKzRQ5jYcHcP8ak/wCEc1P/AJ9x/wB9j/GuqOBxMopqDa9DZYeq1dRf3FGzFs13ELt5Vti6+a0QBcLnnaDwTj1IFF4LdbuYWjytbB28ppQA5XPGQOAcehIq7/wjmp/8+4/77X/Gj/hHNT/59x/32v8AjT+oYn+R/cx/Vq38j+43/C3/ACCW/wCup/kKv6v/AMga7/65/wBag0K0ms7BoZ12vv3dQeMCreowyXGmzxRjLsmFFfa4anNZbyNa2Z9FShJYPla1secd6u6kunLcL/ZslzJD5a7jcIqtvx82ApIxnp3qx/wjmp/8+4/77X/Gj/hHNT/59x/32v8AjXxTwGKv/Df3M+d+rVv5H9xXjXT/AOzJmkkuRqAkAiRVXyinfJzkH8KjsRaNewi+eVLUuPNaFQzhe+0EgZ+pFXP+Ec1P/n3H/fa/40f8I5qf/PuP++1/xo+oYr/n3L7mH1at/I/uM+by/Pk8ksYtx2FxyR2z71Zu105bKzNpJctdFW+1LKqhFbPGwg5Ix6gVP/wjmp/8+4/77X/Gj/hHNT/59x/32v8AjR9QxX8j+5h9WrfyP7iCyXTTFdfbpLlJBETbCFFYNJ2D5IwvuMmqX8VaE+iX9tC00sOI16ncDis/HP8AjWNSjUpStUTT8zOdOUHaSsXNQWxXUZF0153tMjy2uFVZCPcKSOue9d/B/wAe8X+4v8q4C/sW03UZLR5oJmjIBkt5RIh4zww4Nd/B/wAe8X+4v8q+k4YtzT9Eevk/xT+Ry/i7/XW3+4f51gvbzRRRzPE6xyZ2OVIDY64Pet7xcf39v/uH+dYst/eXFpb2ktzLJb2+7yYmclY9xy20dBk+leTnH++z9f0OHMP95kW/Dv8AyG4P+BfyNd1n3rzFWKnI60pd/wC8fzrpy3OPqVJ0+S+t9zXB5h9Wg48t7npufejPvXmXmN/eP50eY394/nXof6z/APTv8f8AgHX/AGz/AHPx/wCAem596M+9eZeY398/nR5jf3j+dH+s/wD07/H/AIAf21/c/H/gHpufejPvXmXmN/fNHmN/eP50f6z/APTv8f8AgB/bX9z8f+Aem596M+9eZeY398/nR5jf3j+dP/Wf/p3+P/AD+2v7n4/8A9Nz70Z968y8xv7x/OjzH/vH86X+s/8A07/H/gB/bP8Ac/H/AIB6bu964vxT/wAhg/7i/wAqx97f3j+dNJJPJzXBmOc/XKSp8ltb7nLi8w+sQ5OWxJHbzTJI8cTusYy7KpIUep9KjX7w+tWLe/u7SGeG3uZoorhdkyRuVEi9cMB1H1qtXhrc809Mh/49ov8AcX+Vc14u+9a/Rv6VzQdv7xpCxPUk172Mzr6xh/Yclvn/AMA9PEZj7al7Llt8ySC3muZPLgieR8E7UUseOvSoe9WrK/vNOuRcWN1LbTgFRJC5RsEYIyPUVWNeCeYegaJ/yBrb/dP8zV8keteZb2Axkijex/iP519NQ4i9lTjT9neytv8A8A9mnm3JBR5L28/+Aem596M+9eZeY398/nR5jf3z+da/6zf9O/x/4Bf9tf3Px/4B6bn3oz715l5jf3j+dHmN/eP50f6z/wDTv8f+AH9s/wBz8f8AgHpufejPvXmXmN/fP50eY394/nR/rP8A9O/x/wCAH9tf3Px/4B6bn3oz715l5jf3z+dHmN/fNP8A1n/6d/j/AMAP7a/ufj/wD03PvRn3rzLzG/vH86PMb++aP9Zv+nf4/wDAD+2v7n4/8A7vX+dEuOfT+YrgzS729SaTNeHmWO+u1VU5baWPNxeJ+sTU7WJZIZrecxTRvHIpGUcYI/A16NB/x7xf7i/yrzy6vbrUb1rq9uJbi4kILyyuWZu3JPJr0OD/AI94v9xf5V6/DW9T5fqehk/xT+RzPi3Jnt8f3D/Osi5vkn0+ztVsreJrffunjB8ybccjeScHHQYA4rvpraCXBlhSQjgF1BxUP2Cz/wCfWH/vgVtjskqYnESqqSVzTE5bOrWclI4bTb2OwuWlksba7BjZNlwCVGRjIwRyO3aqRHtXo39n2f8Az6w/98Cj+z7P/n1h/wC+BXL/AKuVU/jX4nP/AGTP+ZHDalepf3Kyx2NtaARqnl26kKcDG45J5PfmlivUj0qayNlbvJJIri5YEyoB/CpzjB+hruPsFn/z6w/98Cl+wWf/AD6w/wDfApf6t1NudfiP+yKn8yOAsbhbO+huHtorlY3DGGcEo+OzYIOPxFRzP5szyCNUDMWCL0X2HtXoX9n2f/PrD/3wKP7Ps/8An1h/74FP/Vyrf41+If2RU/mRw93epc2VnbpZW8LW6srTRKQ82TnL5OCR04ApdPv0sI7pXsLW68+JogZ1JMRP8a4I+Ye+RXcf2fZ/8+sP/fApPsFn/wA+sP8A3wKn/Vup8POvxH/ZFT+ZHnIHtVvUrtb+/luo7SC0WTBEFuCI04xwCSffr3ru/wCz7P8A59Yf++BR/Z9n/wA+sP8A3wKr/Vyr/OvxJ/smf8yOG+3L/Y/2D7Dbb/P877XtPm4xjZnONvfpnPejS71NOv47mSxt7xUzmC5BMbZBHIBB4znr1Fd1/Z9n/wA+sP8A3wKT7BZ/8+sP/fApf6t1LW51r6j/ALIqfzI85x7Vbu7pbmO2RLWCDyYhGWiBBlIJO5sk/NzjjAwBXd/2fZ/8+sP/AHwKP7Ps/wDn1h/74FP/AFcq3+NfiL+yZ/zI4ezvUtLa7heyt7g3EexZJgS0POdyYIwfqDVaF/LmSQosgVgSjdGx2PtXoP8AZ9n/AM+sP/fAo/s+z/59Yf8AvgUf6uVb/GtfUP7Jn/Mjg9Qulvb6a5jtILVZG3CGAEInsASTj8ac92r6ZHZizt1dJWkNyAfMYEAbSc4wMZ6d67r7BZ/8+sP/AHwKX+z7P/n1h/74FL/Vupb41p6j/sip/MjhdMvV069FxJZW94ArL5VyCUORjPBByOvWqWD6V6P/AGfZ/wDPrD/3wKPsFn/z6w/98Cn/AKuVb351+If2RU/mRwuo3qX8sTpY29qI4ljK26kByP4jkn5j36Cltr1LfTry1ayt5XuNm2eRT5kO05+Qg456HIPFdz/Z9l/z6w/98Cj+z7L/AJ9Yf++BS/1bqfDzr8R/2PU/mRwFnMttewzvBFOsbhzFKCUfBzhsEHB+oou5xd3k06W8UAkcuIogQiZOcLkk4H1Nd/8A2fZ/8+sP/fAo/s+z/wCfWH/vgUf6uVd+dfiL+yKn8yOGub1LjTrS1Wyt4nt9+6eMHzJtxz85Jxx0GAOKTTb2OwuWlksba7BRk8u4BKjIxuGCOR25xXdfYLP/AJ9Yf++BR9gs/wDn1h/74FH+rdTbnX4j/sip/MjzjFXdSvVv7hZUsra0Cxqnl2ykKcDG45J5Pfmu5/s+z/59Yf8AvgUf2fZ/8+sP/fAp/wCrlX+dfiT/AGTP+ZHDR3qJpc1kbG3d5JFcXLA+agH8KnOMH6Go7G4Wzvobh7aK5WNwxhnBKPjs2CDj8RXff2fZ/wDPrD/3wKT7BZ/8+sP/AHwKX+rlT+da+o/7IqfzI89mfzJnlCLGGYkInRfYe1Wru9S5srSBbK3ga3VlaaJSHmyc5fJwSOnAHFdx/Z9n/wA+sP8A3wKP7Ps/+fWH/vgU3w5Vv8a09Rf2TP8AmRw9lepaR3SPZW1yZ4jGGmBJiJ/iTBHzfXIqlg+lejf2fZ/8+sP/AHwKPsFn/wA+sP8A3wKFw5Vu/fX4j/sip/MjhdQu1v8AUZLqOzgtFkIxBbqRGnGOAST2z1rvof8Aj3i/3B/KovsFn/z6w/8AfAqwQB8o6DgV6+U5ZPBOXNK97HfgcHKg5Xe5/9k=\"}]}"}],"problem_search":{"errors":[],"problems":[{"id":58503,"title":"Google Drive file download","description":"This Challenge is to download a file from GoogleDrive given its \"copylink\" provided URL and a file name.\r\nGoogleDrive links fail for Matlab function like urlwrite, imread, imwrite, webread, and others. \r\nThe file 2.png is given by https://drive.google.com/file/d/1v3GsGgP3p905wzdvUqypL_-djYmxiyzK/view?usp=drive_link, which will bring up the file in a new window but this URL fails for matlab commands.\r\nThe GoogleDrive file must be \"Shared\" . The file must at least have share to those \"anyone with this link\".\r\nTo enable file download the Google URL string must be modified:\r\n 1) Delete the end '/view?usp=*'; Anything after and inlcuding \"/view\" must be deleted\r\n 2) Replace 'file/d/' with 'uc?export=download\u0026id='\r\n\r\nGiven a URL and filename download the URL contents into a file called filename in the local Cody directory.\r\nVerification will be done by file name and file size.\r\n\r\n","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: 372px; display: block; min-width: 0px; padding-block-start: 0px; padding-top: 0px; perspective-origin: 407px 186px; transform-origin: 407px 186px; 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: 327px 8px; transform-origin: 327px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThis Challenge is to download a file from GoogleDrive given its \"copylink\" provided URL and a file name.\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: 288px 8px; transform-origin: 288px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eGoogleDrive links fail for Matlab function like urlwrite, imread, imwrite, webread, and others. \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: 81px 8px; transform-origin: 81px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe file 2.png is given by \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://drive.google.com/file/d/1v3GsGgP3p905wzdvUqypL_-djYmxiyzK/view?usp=drive_link,\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003ehttps://drive.google.com/file/d/1v3GsGgP3p905wzdvUqypL_-djYmxiyzK/view?usp=drive_link,\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: 2px 8px; transform-origin: 2px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e which will bring up the file in a new window but this URL fails for matlab commands.\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: 330.5px 8px; transform-origin: 330.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe GoogleDrive file must be \"Shared\" . The file must at least have share to those \"anyone with this link\".\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: 203.5px 8px; transform-origin: 203.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eTo enable file download the Google URL string must be modified:\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: 266.5px 8px; transform-origin: 266.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e 1) Delete the end '/view?usp=*'; Anything after and inlcuding \"/view\" must be deleted\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: 156.5px 8px; transform-origin: 156.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e 2) Replace 'file/d/' with 'uc?export=download\u0026amp;id='\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: 0px 8px; transform-origin: 0px 8px; 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: 336px 8px; transform-origin: 336px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eGiven a URL and filename download the URL contents into a file called filename in the local Cody directory.\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: 154.5px 8px; transform-origin: 154.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eVerification will be done by file name and file size.\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: 0px 8px; transform-origin: 0px 8px; 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: 0px 8px; transform-origin: 0px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e","function_template":"function url=GoogleDrive_urlwrite(url,fname)\r\n% The GoogleDrive \"copy link\" does not play well with matlab urlwrite/imread/imwrite/webread/... \r\n% Expect 'https://drive.google.com/file/d/1WDYDJJZ3wJ8Fs0-8E2u6bYxlZbOapNJn/view?usp=drive_link'\r\n% 1) Delete the end '/view...'\r\n% 2) Replace 'file/d/' with 'uc?export=download\u0026id='\r\n \r\n %urlwrite(url,fname);\r\nend","test_suite":"%%\r\n%Google Drive Dowloads need to come from shared files\r\n% Tweak link: file/d/ to uc?export=download\u0026id=   while removing /view?usp=sharing\r\n% https://drive.google.com/file/d/1v3GsGgP3p905wzdvUqypL_-djYmxiyzK/view?usp=sharing\r\n% https://drive.google.com/uc?export=download\u0026id=1v3GsGgP3p905wzdvUqypL_-djYmxiyzK\r\n\r\n\r\n%2.png Robot\r\nurl='https://drive.google.com/file/d/1v3GsGgP3p905wzdvUqypL_-djYmxiyzK/view?usp=drive_link';\r\nfname='2.png'; \r\nfile_size=7025; % bytes \r\n\r\nfprintf('******Initial Test 1 Dir:\\n\\n')\r\ndir % Initial Dir\r\n\r\nGoogleDrive_urlwrite(url,fname); %expect  7025 bytes for 2.png\r\n\r\nfprintf('Dir after first call:\\n\\n')\r\ndir\r\ndir_struct=dir\r\nvalid=0;\r\nfor i=1:length(dir_struct)\r\n fprintf('%i %s %i\\n',i,dir_struct(i).name,dir_struct(i).bytes)\r\n if isequal(dir_struct(i).name,fname)  % contains(dir_struct(i).name,fname)\r\n  if dir_struct(i).bytes==file_size\r\n   valid=1;\r\n   break;\r\n  end\r\n end\r\nend\r\n\r\nassert(valid)\r\n%%\r\n%28.png Starry Night\r\nurl='https://drive.google.com/file/d/1WDYDJJZ3wJ8Fs0-8E2u6bYxlZbOapNJn/view?usp=drive_link';\r\nfname='28.png'; \r\nfile_size=58061; % bytes \r\n\r\nfprintf('\\n***** Test 2 start Dir:\\n\\n')\r\ndir % Test 2 Dir\r\n\r\nGoogleDrive_urlwrite(url,fname); %expect  58061 bytes for 28.png\r\n\r\nfprintf('Dir after second Call:\\n\\n')\r\ndir\r\ndir_struct=dir\r\nvalid=0;\r\nfor i=1:length(dir_struct)\r\n fprintf('%i %s %i\\n',i,dir_struct(i).name,dir_struct(i).bytes)\r\n if isequal(dir_struct(i).name,fname)  % contains(dir_struct(i).name,fname)\r\n  if dir_struct(i).bytes==file_size\r\n   valid=1;\r\n   break;\r\n  end\r\n end\r\nend\r\n\r\nassert(valid)\r\n%%\r\n%cube_small.gif Rubiks Cube\r\nurl='https://drive.google.com/file/d/1N3p9M6WKGXqD3lilYuv-sUKTkGGI66Xk/view?usp=drive_link';\r\nfname='cube_small.gif'; \r\nfile_size=3812; % bytes \r\n\r\nfprintf('\\n***** Test 3 Dir:\\n\\n\\n')\r\ndir % Initial Dir\r\n\r\nGoogleDrive_urlwrite(url,fname); %expect   bytes for cube_small.gif\r\n\r\nfprintf('Dir after third call:\\n\\n')\r\ndir\r\ndir_struct=dir\r\nvalid=0;\r\nfor i=1:length(dir_struct)\r\n fprintf('%i %s %i\\n',i,dir_struct(i).name,dir_struct(i).bytes)\r\n if isequal(dir_struct(i).name,fname)  % contains(dir_struct(i).name,fname)\r\n  if dir_struct(i).bytes==file_size\r\n   valid=1;\r\n   break;\r\n  end\r\n end\r\nend\r\n\r\nassert(valid)","published":true,"deleted":false,"likes_count":1,"comments_count":2,"created_by":3097,"edited_by":3097,"edited_at":"2023-07-13T17:33:19.000Z","deleted_by":null,"deleted_at":null,"solvers_count":7,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2023-07-13T14:26:50.000Z","updated_at":"2023-07-13T17:33:19.000Z","published_at":"2023-07-13T16:15:25.000Z","restored_at":null,"restored_by":null,"spam":null,"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\u003eThis Challenge is to download a file from GoogleDrive given its \\\"copylink\\\" provided URL and a file name.\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\u003eGoogleDrive links fail for Matlab function like urlwrite, imread, imwrite, webread, and others. \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 file 2.png is given by \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://drive.google.com/file/d/1v3GsGgP3p905wzdvUqypL_-djYmxiyzK/view?usp=drive_link,\\\"\u003e\u003cw:r\u003e\u003cw:t\u003ehttps://drive.google.com/file/d/1v3GsGgP3p905wzdvUqypL_-djYmxiyzK/view?usp=drive_link,\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e which will bring up the file in a new window but this URL fails for matlab commands.\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 GoogleDrive file must be \\\"Shared\\\" . The file must at least have share to those \\\"anyone with this link\\\".\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\u003eTo enable file download the Google URL string must be modified:\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\u003e 1) Delete the end '/view?usp=*'; Anything after and inlcuding \\\"/view\\\" must be deleted\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\u003e 2) Replace 'file/d/' with 'uc?export=download\u0026amp;id='\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\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\u003eGiven a URL and filename download the URL contents into a file called filename in the local Cody directory.\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\u003eVerification will be done by file name and file size.\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\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\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\",\"relationship\":null}],\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"target\":\"/matlab/document.xml\",\"relationshipId\":\"rId1\"}]}"},{"id":58513,"title":"Google Drive:  MATLAB mat file download","description":"Matlab 'mat' files are notoriously hard to email and download as they are binary files.\r\nTo make a 'mat' file downloadable from Google Drive requires a trick.\r\nCopy the 'mat' file and change its extension to 'PDF'. Place this 'PDF' on the Google Drive.\r\nTo download this file into 'mat' form use urlwrite with a Google Drive url, which will need to be fixed, and a destination fname ending in '.mat'\r\n\r\nThis Challenge is to download a file given a GoogleDrive link  and a fname, ending in '.mat', to the local directory. \r\nThe file for this URL ends in 'PDF' on a GoogleDrive.\r\nVerification will be done by loading the fname and verifying the size. This file is the ICFP2023 Orchestra Problem set compressed 90% as a mat file.","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: 273px; display: block; min-width: 0px; padding-block-start: 0px; padding-top: 0px; perspective-origin: 407px 136.5px; transform-origin: 407px 136.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: 265.5px 8px; transform-origin: 265.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eMatlab 'mat' files are notoriously hard to email and download as they are binary files.\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: 216px 8px; transform-origin: 216px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eTo make a 'mat' file downloadable from Google Drive requires a trick.\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: 284.5px 8px; transform-origin: 284.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eCopy the 'mat' file and change its extension to 'PDF'. Place this 'PDF' on the Google Drive.\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: 366.5px 8px; transform-origin: 366.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eTo download this file into 'mat' form use urlwrite with a Google Drive url, which will need to be fixed, and a destination fname ending in '.mat'\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: 0px 8px; transform-origin: 0px 8px; 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: 357px 8px; transform-origin: 357px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThis Challenge is to download a file given a GoogleDrive link  and a fname, ending in '.mat', to the local directory. \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 8px; transform-origin: 166px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe file for this URL ends in 'PDF' on a GoogleDrive.\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: 366px 8px; transform-origin: 366px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eVerification will be done by loading the fname and verifying the size. This file is the ICFP2023 Orchestra Problem set compressed 90% as a mat file.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e","function_template":"function url=GoogleDrive_urlwrite(url,fname)\r\n% The GoogleDrive \"copy link\" does not play well with matlab urlwrite/imread/imwrite/webread/... \r\n% Expect 'https://drive.google.com/file/d/1WDYDJJZ3wJ8Fs0-8E2u6bYxlZbOapNJn/view?usp=drive_link'\r\n% 1) Delete the end '/view...'\r\n% 2) Replace 'file/d/' with 'uc?export=download\u0026id='\r\n\r\n%This Challenge gives a URL for a .mat file that was saved as a .PDF on the googledrive.\r\n \r\n %urlwrite(url,fname);\r\nend","test_suite":"%%\r\nurl='https://drive.google.com/file/d/1mgxzsmVQNXgqHEdd61QR2r0STm3N9lgG/view?usp=drive_link';\r\nfname='orc_d_mu_axy_am_pxyr.mat';\r\ntic\r\nGoogleDrive_urlwrite(url,fname);\r\nfprintf('Process/Download Time: %.1f sec\\n',toc);\r\n\r\nload(fname); % This loads the cell array orc\r\n\r\nz=dir;\r\nfprintf('Local Directory: Filenames      Sizes\\n');\r\nfor i=1:length(z)\r\n fprintf('%30s  %i\\n',z(i).name,z(i).bytes);\r\nend\r\nfprintf('\\n\\n');\r\n\r\nfprintf('Size orc: %i %i\\n',size(orc));\r\n\r\nfprintf('\\n\\n orc{end}\\n');\r\norc{end}\r\n\r\nvalid=isequal([1 90],size(orc));\r\nassert(valid)\r\n","published":true,"deleted":false,"likes_count":1,"comments_count":1,"created_by":3097,"edited_by":3097,"edited_at":"2023-07-13T18:21:49.000Z","deleted_by":null,"deleted_at":null,"solvers_count":8,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2023-07-13T17:45:26.000Z","updated_at":"2023-07-13T18:21:49.000Z","published_at":"2023-07-13T18:21:49.000Z","restored_at":null,"restored_by":null,"spam":null,"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\u003eMatlab 'mat' files are notoriously hard to email and download as they are binary files.\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\u003eTo make a 'mat' file downloadable from Google Drive requires a trick.\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\u003eCopy the 'mat' file and change its extension to 'PDF'. Place this 'PDF' on the Google Drive.\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\u003eTo download this file into 'mat' form use urlwrite with a Google Drive url, which will need to be fixed, and a destination fname ending in '.mat'\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\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\u003eThis Challenge is to download a file given a GoogleDrive link  and a fname, ending in '.mat', to the local directory. \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 file for this URL ends in 'PDF' on a GoogleDrive.\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\u003eVerification will be done by loading the fname and verifying the size. This file is the ICFP2023 Orchestra Problem set compressed 90% as a mat file.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\",\"relationship\":null}],\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"target\":\"/matlab/document.xml\",\"relationshipId\":\"rId1\"}]}"},{"id":1313,"title":"PACMAT 09 - Awesome Tunnelling Ghosts, Equal Speed, 20 Lives, Game Download","description":"The Classic PACMAN game brought to Cody.\r\n\r\nPACMAT requires clearing all the Yellow Dots. Twenty lives are available. Adjacent Ghosts will capture PACMAT.  Awesome Ghosts use the tunnel. On Ghost capture everyone gets reset. These trained ghosts take the minimum path, including tunnel paths, to PACMAT assuming the other Ghosts are walls. \r\n\r\n\u003c\u003chttps://sites.google.com/site/razapor/matlab_cody/PACMAT_300.jpg\u003e\u003e\r\n\r\nTo aid in development of your routine, a PACMAT_Interactive.m file that creates a solver script and video has been posted at \u003chttps://sites.google.com/site/razapor/matlab_cody/PACMAT_Interactive_009a.m PACMAT_Interactive_009a.m\u003e. (Right click, 'save link as'). The routine creates a PACMAT9_1Xsolver.m script from the interactive play. The script demonstrates Interactivity, figure/KeyPressFcn, listdlg, and VideoWriter.\r\n\r\n\r\n\u003chttps://sites.google.com/site/razapor/matlab_cody/PACMAT9_1Xvideo_11_630.mp4 11 Lives Interactive\u003e (MP4)  Best Score seen is 11 Lives.\r\n\r\n\r\n*Inputs:* Map   Definitions: -1=Wall, 0=Empty, 1=Dot, 2=PACMAT, \u003e2=Ghost\r\n\r\n*Output:* Direction  Definitions: 1-Up, 2-Right, 3-Down, 4-Left, 0-No move\r\n\r\n*Pass Criteria:* Clear all dots in less than 4000 moves\r\n\r\n*Scoring:* Moves + 1000 * Lives\r\n\r\n\r\n*Near Future:* Awesome Tunnel Ghosts and 2X Speed PACMAT; Randomized Awesome Tunnel Ghosts to make them non-deterministic","description_html":"\u003cp\u003eThe Classic PACMAN game brought to Cody.\u003c/p\u003e\u003cp\u003ePACMAT requires clearing all the Yellow Dots. Twenty lives are available. Adjacent Ghosts will capture PACMAT.  Awesome Ghosts use the tunnel. On Ghost capture everyone gets reset. These trained ghosts take the minimum path, including tunnel paths, to PACMAT assuming the other Ghosts are walls.\u003c/p\u003e\u003cimg src = \"https://sites.google.com/site/razapor/matlab_cody/PACMAT_300.jpg\"\u003e\u003cp\u003eTo aid in development of your routine, a PACMAT_Interactive.m file that creates a solver script and video has been posted at \u003ca href = \"https://sites.google.com/site/razapor/matlab_cody/PACMAT_Interactive_009a.m\"\u003ePACMAT_Interactive_009a.m\u003c/a\u003e. (Right click, 'save link as'). The routine creates a PACMAT9_1Xsolver.m script from the interactive play. The script demonstrates Interactivity, figure/KeyPressFcn, listdlg, and VideoWriter.\u003c/p\u003e\u003cp\u003e\u003ca href = \"https://sites.google.com/site/razapor/matlab_cody/PACMAT9_1Xvideo_11_630.mp4\"\u003e11 Lives Interactive\u003c/a\u003e (MP4)  Best Score seen is 11 Lives.\u003c/p\u003e\u003cp\u003e\u003cb\u003eInputs:\u003c/b\u003e Map   Definitions: -1=Wall, 0=Empty, 1=Dot, 2=PACMAT, \u003e2=Ghost\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e Direction  Definitions: 1-Up, 2-Right, 3-Down, 4-Left, 0-No move\u003c/p\u003e\u003cp\u003e\u003cb\u003ePass Criteria:\u003c/b\u003e Clear all dots in less than 4000 moves\u003c/p\u003e\u003cp\u003e\u003cb\u003eScoring:\u003c/b\u003e Moves + 1000 * Lives\u003c/p\u003e\u003cp\u003e\u003cb\u003eNear Future:\u003c/b\u003e Awesome Tunnel Ghosts and 2X Speed PACMAT; Randomized Awesome Tunnel Ghosts to make them non-deterministic\u003c/p\u003e","function_template":"function ans = PACMAT9_1Xsolver(map)\r\npersistent mv\r\nif isempty(mv)\r\n mv=[2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1]; \r\nend\r\nmv(1);\r\nmv(1)=[];\r\n","test_suite":"%%\r\nfeval(@assignin,'caller','score',20000);\r\n%%\r\nmax_moves=4000; % Interactive approx 1000 moves\r\nmaxLives=20;\r\n\r\nmap=[...\r\n      repmat('a',1,28);\r\n      'accccccccccccaacccccccccccca';\r\n      'acaaaacaaaaacaacaaaaacaaaaca';\r\n      'acaaaacaaaaacaacaaaaacaaaaca';\r\n      'acaaaacaaaaacaacaaaaacaaaaca';\r\n      'acccccccccccccccccccccccccca';\r\n      'acaaaacaacaaaaaaaacaacaaaaca';\r\n      'acaaaacaacaaaaaaaacaacaaaaca';\r\n      'accccccaaccccaaccccaacccccca';\r\n      'aaaaaacaaaaabaabaaaaacaaaaaa';\r\n      'aaaaaacaaaaabaabaaaaacaaaaaa';\r\n      'aaaaaacaabbbbbbbbbbaacaaaaaa';\r\n      'aaaaaacaabaaabbaaabaacaaaaaa';\r\n      'aaaaaacaabalbbbblabaacaaaaaa';\r\n      'bbbbbbcbbbabbbbbbabbbcbbbbbb';\r\n      'aaaaaacaabalbbbblabaacaaaaaa';\r\n      'aaaaaacaabaaaaaaaabaacaaaaaa';\r\n      'aaaaaacaabbbbbbbbbbaacaaaaaa';\r\n      'aaaaaacaabaaaaaaaabaacaaaaaa';\r\n      'aaaaaacaabaaaaaaaabaacaaaaaa';\r\n      'accccccccccccaacccccccccccca';\r\n      'acaaaacaaaaacaacaaaaacaaaaca';\r\n      'acaaaacaaaaacaacaaaaacaaaaca';\r\n      'acccaacccccccbdcccccccaaccca';\r\n      'aaacaacaacaaaaaaaacaacaacaaa';\r\n      'aaacaacaacaaaaaaaacaacaacaaa';\r\n      'accccccaaccccaaccccaacccccca';\r\n      'acaaaaaaaaaacaacaaaaaaaaaaca';\r\n      'acaaaaaaaaaacaacaaaaaaaaaaca';\r\n      'acccccccccccccccccccccccccca';\r\n      repmat('a',1,28);];\r\n  \r\n  map=map-'b';\r\n  [nr, nc]=size(map);\r\n\r\n  mapdelta=[-1 nr 1 -nr]; % Valid as long as not on an edge\r\n  gmovxy=[0 -1;1 0;0 1;-1 0];\r\n\r\n  tunnel=find(map(:,1)==0); % tunnelptr\r\n  tunnel=[tunnel tunnel+nr*(nc-1)]; % Entrance/Exit Tunnel\r\n\r\n  [pmr, pmc]=find(map==2); % pi 24 row  pj 15 column of map\r\n   ptrpac=find(map==2);\r\n\r\n  ptrpac=find(map==2);\r\n  ptrpac_start=ptrpac;\r\n  ptrg_start=find(map\u003e2);\r\n  map(ptrg_start)=[10 20 30 40];\r\n  [gstartx, gstarty]=find(map\u003e2);\r\n  \r\n  lives=0; % Lives\r\n  movepac=0;\r\n\r\nwhile lives\u003cmaxLives \u0026\u0026 any(mod(map(:),10)==1) \u0026\u0026 movepac\u003cmax_moves\r\n for pac2x=1:1\r\n  if lives\u003emaxLives-1 || ~any(mod(map(:),10)==1),break;end % Died or Completed\r\n  movepac=movepac+1;\r\n\r\n  [curdir]=PACMAT9_1Xsolver(map);\r\n\r\n  [pmr, pmc]=find(map==2);\r\n\r\n if curdir\u003e0\r\n  if map(ptrpac+mapdelta(curdir))==-1\r\n   % Do nothing - Ran into a Wall\r\n  elseif map(ptrpac+mapdelta(curdir))\u003e2 % ran into ghost\r\n   map(ptrpac)=0; % remove PAC from the board\r\n   lives=lives+1;\r\n   %if lives==0,break;end\r\n   % reset the board\r\n   [ptrgx, ptrgy]=find(map\u003e2);\r\n   ptrg=find(map\u003e2);\r\n   map(ptrg)=mod(map(ptrg),10);\r\n   map(ptrpac_start)=2;\r\n   map(ptrg_start)=[10 20 30 40];\r\n   ptrpac=find(map==2);\r\n   continue; % Lost a Life\r\n  else % legal move\r\n   map(ptrpac)=0; % Eat Dot and clear PAC\r\n   ptrpac=ptrpac+mapdelta(curdir);\r\n   if ptrpac==tunnel(1),ptrpac=tunnel(2)-nr;end\r\n   if ptrpac==tunnel(2),ptrpac=tunnel(1)+nr;end\r\n   map(ptrpac)=2;\r\n  end\r\n end % curdir \u003e0\r\n\r\nend % pac2x\r\n\r\nif lives\u003emaxLives-1 || ~any(mod(map(:),10)==1),break;end % Completed\r\n\r\n\r\n% Ghosts\r\n for i=1:4\r\n\r\n  ghosts=find(map\u003e2);\r\n  ptrpac=find(map==2); % Target\r\n\r\n  dot=false;\r\n  [gptrx, gptry]=find(map==10*i);\r\n  gidx=find(map==10*i);\r\n  if isempty(gidx)\r\n   [gptrx, gptry]=find(map==10*i+1); % ghost must be on a dot\r\n   gidx=find(map==10*i+1);\r\n   dot=true;\r\n  end\r\n\r\n% Find valid ghost moves using gmap\r\n% mapdelta=[-1 nr 1 -nr]; \r\n  gmov=find(map(gidx+mapdelta)==2); % adjacent to PACMAT\r\n  if gidx==15+nr \u0026\u0026 ptrpac==nr*(nc-2)+15 % Ghost Tunnel Adj\r\n    gmov=4;\r\n   end\r\n   if gidx==nr*(nc-2)+15 \u0026\u0026 ptrpac==15+nr % Ghost Tunnel Adj\r\n    gmov=2;\r\n   end\r\n\r\n  if ~isempty(gmov) % PAC adjacent\r\n   lives=lives+1;\r\n   % reset the board\r\n   [pmr, pmc]=find(map==2); % PACMAT erase coords\r\n   map(map==2)=0;\r\n      \r\n   [ptrgx, ptrgy]=find(map\u003e2);\r\n   ptrg=find(map\u003e2);\r\n   map(ptrg)=mod(map(ptrg),10);\r\n   map(ptrpac_start)=2;\r\n   map(ptrg_start)=[10 20 30 40];\r\n   ptrpac=find(map==2);     \r\n   break; % Ghost move loop\r\n      \r\n  else % gmap avoid walls and other ghosts Walls\r\n \r\n   gmap=map;\r\n       \r\n   ptctr=0;\r\n   gmap(gmap\u003e=0)=Inf;\r\n      \r\n    gmap(ghosts)=-1; % other ghosts are like walls Ghosts_004/5\r\n    gmap(gidx)=Inf; % Ultimate target\r\n    gmap(ptrpac)=1; % Start at PACMAT and expand to ghost\r\n    while gmap(gidx)\u003e101 \u0026\u0026 ptctr\u003c100 % potential boxed dot\r\n % find dots, add a counter to distance form location, keep min value\r\n % when ptrpac gets a value it will be from nearest dot\r\n % find side with dmap(ptrpac)-1\r\n     ptctr=ptctr+1;\r\n     dpts=find(gmap==ptctr);\r\n     newpt_idx=repmat(dpts,1,4)+repmat(mapdelta,length(dpts),1);\r\n% Ghost Tunnel Access\r\n     tunL=find(newpt_idx==15);\r\n     tunR=find(newpt_idx==nr*nc-16);\r\n     if ~isempty(tunL)\r\n      newpt_idx(tunL)=nr*(nc-2)+15;\r\n     end\r\n     if ~isempty(tunR)\r\n      newpt_idx(tunR)=15+nr;\r\n     end\r\n\r\n     gmap(newpt_idx(:))=min(gmap(newpt_idx(:)),ptctr+1);\r\n    end\r\n\r\n% Simplified by ghosts are walls: No Ghost Jumping\r\n    if ~isinf(gmap(gidx)) % Path(s) to Ghost found\r\n% Tunnel Check\r\n    gmov=[];\r\n    if gidx==15+nr % Tunnel\r\n     gmov=2;\r\n     if gmap(gidx+mapdelta(2))==gmap(gidx)-1\r\n      gmov=2;\r\n     else\r\n      gmov=4; % Possible error ghost onto ghost\r\n     end   \r\n    end\r\n\r\n    if gidx==nr*(nc-2)+15 % Tunnel\r\n      if gmap(gidx+mapdelta(4))==gmap(gidx)-1\r\n        gmov=4;\r\n      else\r\n        gmov=2; % Possible error ghost onto ghost\r\n      end\r\n     end\r\n    \r\n     if isempty(gmov) % Non-Tunnel Move\r\n      for gmov=1:4 % execute with a find?\r\n        if gmap(gidx+mapdelta(gmov))==gmap(gidx)-1,break;end\r\n       end\r\n      end\r\n     else\r\n      gmov=[]; % No path to PACMAT found\r\n     end\r\n \r\n   if ~isempty(gmov) % valid g move : ghost may not stand on ghost\r\n    map(gptrx,gptry)=mod(map(gptrx,gptry),10);\r\n\r\n     %tunLtf=false;\r\n     %tunRtf=false;\r\n       if gidx==nr+15\r\n        if gmov==2 % Left Tunnel but go Right\r\n         map(gidx+mapdelta(gmov))=map(gidx+mapdelta(gmov))+10*i;\r\n        else\r\n         % Tunnel\r\n          map(nr*(nc-2)+15)=10*i;\r\n          %tunLtf=true;\r\n        end\r\n       elseif gidx==nr*(nc-2)+15\r\n        if gmov==4 % Right Tunnel but go Left\r\n         map(gidx+mapdelta(gmov))=map(gidx+mapdelta(gmov))+10*i;\r\n        else\r\n         % Tunnel\r\n         map(nr+15)=10*i;\r\n         %tunRtf=true;\r\n        end\r\n       else % Standard move\r\n        map(gidx+mapdelta(gmov))=map(gidx+mapdelta(gmov))+10*i;\r\n       end\r\n    \r\n   end % ~isempty(gmov) standard move - no capture\r\n\r\n  end % ~isempty(gmov) PACMAT adjacent\r\n  \r\n end % i ghost moves\r\nend % while any dots and \u003c max_moves maxLives\r\n%\r\ndots=length(find(mod(map,10)==1));\r\n%\r\nfprintf('moves %i\\n',movepac)\r\nfprintf('dots %i\\n',dots)\r\nfprintf('Lives Spent %i\\n',lives)\r\n%\r\n% To Pass need to leave at most 0 dots\r\nassert(dots==0,sprintf('Max Dots 0, Dots Remaining %i\\n',dots))\r\n\r\nscore= movepac + 1000*lives; % All dots must be removed\r\n\r\nfeval( @assignin,'caller','score',floor(min( 20000,score )) );\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":2,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2013-03-02T19:16:46.000Z","updated_at":"2025-12-03T15:31:49.000Z","published_at":"2013-03-03T03:24:45.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\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/media/image1.JPEG\"}],\"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\u003eThe Classic PACMAN game brought to Cody.\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\u003ePACMAT requires clearing all the Yellow Dots. Twenty lives are available. Adjacent Ghosts will capture PACMAT. Awesome Ghosts use the tunnel. On Ghost capture everyone gets reset. These trained ghosts take the minimum path, including tunnel paths, to PACMAT assuming the other Ghosts are walls.\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:customXml w:element=\\\"image\\\"\u003e\u003cw:customXmlPr\u003e\u003cw:attr w:name=\\\"height\\\" w:val=\\\"-1\\\"/\u003e\u003cw:attr w:name=\\\"width\\\" w:val=\\\"-1\\\"/\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\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eTo aid in development of your routine, a PACMAT_Interactive.m file that creates a solver script and video has been posted at\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=\\\"https://sites.google.com/site/razapor/matlab_cody/PACMAT_Interactive_009a.m\\\"\u003e\u003cw:r\u003e\u003cw:t\u003ePACMAT_Interactive_009a.m\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. (Right click, 'save link as'). The routine creates a PACMAT9_1Xsolver.m script from the interactive play. The script demonstrates Interactivity, figure/KeyPressFcn, listdlg, and VideoWriter.\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:hyperlink w:docLocation=\\\"https://sites.google.com/site/razapor/matlab_cody/PACMAT9_1Xvideo_11_630.mp4\\\"\u003e\u003cw:r\u003e\u003cw:t\u003e11 Lives Interactive\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e (MP4) Best Score seen is 11 Lives.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInputs:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Map Definitions: -1=Wall, 0=Empty, 1=Dot, 2=PACMAT, \u0026gt;2=Ghost\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 Direction Definitions: 1-Up, 2-Right, 3-Down, 4-Left, 0-No move\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\u003ePass Criteria:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Clear all dots in less than 4000 moves\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\u003eScoring:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Moves + 1000 * Lives\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\u003eNear Future:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Awesome Tunnel Ghosts and 2X Speed PACMAT; Randomized Awesome Tunnel Ghosts to make them non-deterministic\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\"},{\"partUri\":\"/media/image1.JPEG\",\"contentType\":\"image/JPEG\",\"content\":\"data:image/JPEG;base64,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\"}]}"},{"id":1314,"title":"PACMAT 08 - Awesome Tunneling Ghosts, 2X Speed, 6 Lives, Game Download","description":"The Classic PACMAN game brought to Cody.\r\n\r\nPACMAT requires clearing all the Yellow Dots. PACMAT moves at 2X Ghost speed. Six lives are available. Adjacent Ghosts will capture PACMAT.  Awesome Ghosts use the tunnel. On Ghost capture everyone gets reset. These trained ghosts take the minimum path, including tunnel paths, to PACMAT assuming the other Ghosts are walls. \r\n\r\n\u003c\u003chttps://sites.google.com/site/razapor/matlab_cody/PACMAT_300.jpg\u003e\u003e\r\n\r\nTo aid in development of your routine, a PACMAT_Interactive.m file that creates a solver script and video has been posted at \u003chttps://sites.google.com/site/razapor/matlab_cody/PACMAT_Interactive_008a.m PACMAT_Interactive_008a.m\u003e. (Right click, 'save link as'). The routine creates a PACMAT8_2Xsolver.m script from the interactive play. The script demonstrates Interactivity, figure/KeyPressFcn, listdlg, and VideoWriter.\r\n\r\n\r\n\u003chttps://sites.google.com/site/razapor/matlab_cody/PACMAT8_2Xvideo_492.mp4 492 Moves Interactive\u003e (MP4)  Best Score seen is Zero Lives lost, 492 moves.\r\n\r\n\r\n*Inputs:* Map   Definitions: -1=Wall, 0=Empty, 1=Dot, 2=PACMAT, \u003e2=Ghost\r\n\r\n*Output:* Direction  Definitions: 1-Up, 2-Right, 3-Down, 4-Left, 0-No move\r\n\r\n*Pass Criteria:* Clear all dots in less than 4000 moves\r\n\r\n*Scoring:* Moves + 1000 * Lives\r\n\r\n\r\n*Near Future:* Randomized Awesome Tunnel Ghosts to make them non-deterministic to require Adaptive Bot solutions","description_html":"\u003cp\u003eThe Classic PACMAN game brought to Cody.\u003c/p\u003e\u003cp\u003ePACMAT requires clearing all the Yellow Dots. PACMAT moves at 2X Ghost speed. Six lives are available. Adjacent Ghosts will capture PACMAT.  Awesome Ghosts use the tunnel. On Ghost capture everyone gets reset. These trained ghosts take the minimum path, including tunnel paths, to PACMAT assuming the other Ghosts are walls.\u003c/p\u003e\u003cimg src = \"https://sites.google.com/site/razapor/matlab_cody/PACMAT_300.jpg\"\u003e\u003cp\u003eTo aid in development of your routine, a PACMAT_Interactive.m file that creates a solver script and video has been posted at \u003ca href = \"https://sites.google.com/site/razapor/matlab_cody/PACMAT_Interactive_008a.m\"\u003ePACMAT_Interactive_008a.m\u003c/a\u003e. (Right click, 'save link as'). The routine creates a PACMAT8_2Xsolver.m script from the interactive play. The script demonstrates Interactivity, figure/KeyPressFcn, listdlg, and VideoWriter.\u003c/p\u003e\u003cp\u003e\u003ca href = \"https://sites.google.com/site/razapor/matlab_cody/PACMAT8_2Xvideo_492.mp4\"\u003e492 Moves Interactive\u003c/a\u003e (MP4)  Best Score seen is Zero Lives lost, 492 moves.\u003c/p\u003e\u003cp\u003e\u003cb\u003eInputs:\u003c/b\u003e Map   Definitions: -1=Wall, 0=Empty, 1=Dot, 2=PACMAT, \u003e2=Ghost\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e Direction  Definitions: 1-Up, 2-Right, 3-Down, 4-Left, 0-No move\u003c/p\u003e\u003cp\u003e\u003cb\u003ePass Criteria:\u003c/b\u003e Clear all dots in less than 4000 moves\u003c/p\u003e\u003cp\u003e\u003cb\u003eScoring:\u003c/b\u003e Moves + 1000 * Lives\u003c/p\u003e\u003cp\u003e\u003cb\u003eNear Future:\u003c/b\u003e Randomized Awesome Tunnel Ghosts to make them non-deterministic to require Adaptive Bot solutions\u003c/p\u003e","function_template":"function ans = PACMAT8_2Xsolver(map)\r\npersistent mv\r\nif isempty(mv)\r\n mv=[2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1]; \r\nend\r\nmv(1);\r\nmv(1)=[];","test_suite":"%%\r\nfeval(@assignin,'caller','score',6000);\r\n%%\r\nmax_moves=4000; % Interactive approx 1000 moves\r\nmaxLives=6;\r\n\r\nmap=[...\r\n      repmat('a',1,28);\r\n      'accccccccccccaacccccccccccca';\r\n      'acaaaacaaaaacaacaaaaacaaaaca';\r\n      'acaaaacaaaaacaacaaaaacaaaaca';\r\n      'acaaaacaaaaacaacaaaaacaaaaca';\r\n      'acccccccccccccccccccccccccca';\r\n      'acaaaacaacaaaaaaaacaacaaaaca';\r\n      'acaaaacaacaaaaaaaacaacaaaaca';\r\n      'accccccaaccccaaccccaacccccca';\r\n      'aaaaaacaaaaabaabaaaaacaaaaaa';\r\n      'aaaaaacaaaaabaabaaaaacaaaaaa';\r\n      'aaaaaacaabbbbbbbbbbaacaaaaaa';\r\n      'aaaaaacaabaaabbaaabaacaaaaaa';\r\n      'aaaaaacaabalbbbblabaacaaaaaa';\r\n      'bbbbbbcbbbabbbbbbabbbcbbbbbb';\r\n      'aaaaaacaabalbbbblabaacaaaaaa';\r\n      'aaaaaacaabaaaaaaaabaacaaaaaa';\r\n      'aaaaaacaabbbbbbbbbbaacaaaaaa';\r\n      'aaaaaacaabaaaaaaaabaacaaaaaa';\r\n      'aaaaaacaabaaaaaaaabaacaaaaaa';\r\n      'accccccccccccaacccccccccccca';\r\n      'acaaaacaaaaacaacaaaaacaaaaca';\r\n      'acaaaacaaaaacaacaaaaacaaaaca';\r\n      'acccaacccccccbdcccccccaaccca';\r\n      'aaacaacaacaaaaaaaacaacaacaaa';\r\n      'aaacaacaacaaaaaaaacaacaacaaa';\r\n      'accccccaaccccaaccccaacccccca';\r\n      'acaaaaaaaaaacaacaaaaaaaaaaca';\r\n      'acaaaaaaaaaacaacaaaaaaaaaaca';\r\n      'acccccccccccccccccccccccccca';\r\n      repmat('a',1,28);];\r\n  \r\n  map=map-'b';\r\n  [nr, nc]=size(map);\r\n\r\n  mapdelta=[-1 nr 1 -nr]; % Valid as long as not on an edge\r\n  gmovxy=[0 -1;1 0;0 1;-1 0];\r\n\r\n  tunnel=find(map(:,1)==0); % tunnelptr\r\n  tunnel=[tunnel tunnel+nr*(nc-1)]; % Entrance/Exit Tunnel\r\n\r\n  [pmr, pmc]=find(map==2); % pi 24 row  pj 15 column of map\r\n   ptrpac=find(map==2);\r\n\r\n  ptrpac=find(map==2);\r\n  ptrpac_start=ptrpac;\r\n  ptrg_start=find(map\u003e2);\r\n  map(ptrg_start)=[10 20 30 40];\r\n  [gstartx, gstarty]=find(map\u003e2);\r\n  \r\n  lives=0; % Lives\r\n  movepac=0;\r\n\r\nwhile lives\u003cmaxLives \u0026\u0026 any(mod(map(:),10)==1) \u0026\u0026 movepac\u003cmax_moves\r\n for pac2x=1:2\r\n  if lives\u003emaxLives-1 || ~any(mod(map(:),10)==1),break;end % Died or Completed\r\n  movepac=movepac+1;\r\n\r\n  [curdir]=PACMAT8_2Xsolver(map);\r\n\r\n  [pmr, pmc]=find(map==2);\r\n\r\n if curdir\u003e0\r\n  if map(ptrpac+mapdelta(curdir))==-1\r\n   % Do nothing - Ran into a Wall\r\n  elseif map(ptrpac+mapdelta(curdir))\u003e2 % ran into ghost\r\n   map(ptrpac)=0; % remove PAC from the board\r\n   lives=lives+1;\r\n   %if lives==0,break;end\r\n   % reset the board\r\n   [ptrgx, ptrgy]=find(map\u003e2);\r\n   ptrg=find(map\u003e2);\r\n   map(ptrg)=mod(map(ptrg),10);\r\n   map(ptrpac_start)=2;\r\n   map(ptrg_start)=[10 20 30 40];\r\n   ptrpac=find(map==2);\r\n   continue; % Lost a Life\r\n  else % legal move\r\n   map(ptrpac)=0; % Eat Dot and clear PAC\r\n   ptrpac=ptrpac+mapdelta(curdir);\r\n   if ptrpac==tunnel(1),ptrpac=tunnel(2)-nr;end\r\n   if ptrpac==tunnel(2),ptrpac=tunnel(1)+nr;end\r\n   map(ptrpac)=2;\r\n  end\r\n end % curdir \u003e0\r\n\r\nend % pac2x\r\n\r\nif lives\u003emaxLives-1 || ~any(mod(map(:),10)==1),break;end % Completed\r\n\r\n\r\n% Ghosts\r\n for i=1:4\r\n\r\n  ghosts=find(map\u003e2);\r\n  ptrpac=find(map==2); % Target\r\n\r\n  dot=false;\r\n  [gptrx, gptry]=find(map==10*i);\r\n  gidx=find(map==10*i);\r\n  if isempty(gidx)\r\n   [gptrx, gptry]=find(map==10*i+1); % ghost must be on a dot\r\n   gidx=find(map==10*i+1);\r\n   dot=true;\r\n  end\r\n\r\n% Find valid ghost moves using gmap\r\n% mapdelta=[-1 nr 1 -nr]; \r\n  gmov=find(map(gidx+mapdelta)==2); % adjacent to PACMAT\r\n  if gidx==15+nr \u0026\u0026 ptrpac==nr*(nc-2)+15 % Ghost Tunnel Adj\r\n    gmov=4;\r\n   end\r\n   if gidx==nr*(nc-2)+15 \u0026\u0026 ptrpac==15+nr % Ghost Tunnel Adj\r\n    gmov=2;\r\n   end\r\n\r\n  if ~isempty(gmov) % PAC adjacent\r\n   lives=lives+1;\r\n   % reset the board\r\n   [pmr, pmc]=find(map==2); % PACMAT erase coords\r\n   map(map==2)=0;\r\n      \r\n   [ptrgx, ptrgy]=find(map\u003e2);\r\n   ptrg=find(map\u003e2);\r\n   map(ptrg)=mod(map(ptrg),10);\r\n   map(ptrpac_start)=2;\r\n   map(ptrg_start)=[10 20 30 40];\r\n   ptrpac=find(map==2);     \r\n   break; % Ghost move loop\r\n      \r\n  else % gmap avoid walls and other ghosts Walls\r\n \r\n   gmap=map;\r\n       \r\n   ptctr=0;\r\n   gmap(gmap\u003e=0)=Inf;\r\n      \r\n    gmap(ghosts)=-1; % other ghosts are like walls Ghosts_004/5\r\n    gmap(gidx)=Inf; % Ultimate target\r\n    gmap(ptrpac)=1; % Start at PACMAT and expand to ghost\r\n    while gmap(gidx)\u003e101 \u0026\u0026 ptctr\u003c100 % potential boxed dot\r\n % find dots, add a counter to distance form location, keep min value\r\n % when ptrpac gets a value it will be from nearest dot\r\n % find side with dmap(ptrpac)-1\r\n     ptctr=ptctr+1;\r\n     dpts=find(gmap==ptctr);\r\n     newpt_idx=repmat(dpts,1,4)+repmat(mapdelta,length(dpts),1);\r\n% Ghost Tunnel Access\r\n     tunL=find(newpt_idx==15);\r\n     tunR=find(newpt_idx==nr*nc-16);\r\n     if ~isempty(tunL)\r\n      newpt_idx(tunL)=nr*(nc-2)+15;\r\n     end\r\n     if ~isempty(tunR)\r\n      newpt_idx(tunR)=15+nr;\r\n     end\r\n\r\n     gmap(newpt_idx(:))=min(gmap(newpt_idx(:)),ptctr+1);\r\n    end\r\n\r\n% Simplified by ghosts are walls: No Ghost Jumping\r\n    if ~isinf(gmap(gidx)) % Path(s) to Ghost found\r\n% Tunnel Check\r\n    gmov=[];\r\n    if gidx==15+nr % Tunnel\r\n     gmov=2;\r\n     if gmap(gidx+mapdelta(2))==gmap(gidx)-1\r\n      gmov=2;\r\n     else\r\n      gmov=4; % Possible error ghost onto ghost\r\n     end   \r\n    end\r\n\r\n    if gidx==nr*(nc-2)+15 % Tunnel\r\n      if gmap(gidx+mapdelta(4))==gmap(gidx)-1\r\n        gmov=4;\r\n      else\r\n        gmov=2; % Possible error ghost onto ghost\r\n      end\r\n     end\r\n    \r\n     if isempty(gmov) % Non-Tunnel Move\r\n      for gmov=1:4 % execute with a find?\r\n        if gmap(gidx+mapdelta(gmov))==gmap(gidx)-1,break;end\r\n       end\r\n      end\r\n     else\r\n      gmov=[]; % No path to PACMAT found\r\n     end\r\n \r\n   if ~isempty(gmov) % valid g move : ghost may not stand on ghost\r\n    map(gptrx,gptry)=mod(map(gptrx,gptry),10);\r\n\r\n     %tunLtf=false;\r\n     %tunRtf=false;\r\n       if gidx==nr+15\r\n        if gmov==2 % Left Tunnel but go Right\r\n         map(gidx+mapdelta(gmov))=map(gidx+mapdelta(gmov))+10*i;\r\n        else\r\n         % Tunnel\r\n          map(nr*(nc-2)+15)=10*i;\r\n          %tunLtf=true;\r\n        end\r\n       elseif gidx==nr*(nc-2)+15\r\n        if gmov==4 % Right Tunnel but go Left\r\n         map(gidx+mapdelta(gmov))=map(gidx+mapdelta(gmov))+10*i;\r\n        else\r\n         % Tunnel\r\n         map(nr+15)=10*i;\r\n         %tunRtf=true;\r\n        end\r\n       else % Standard move\r\n        map(gidx+mapdelta(gmov))=map(gidx+mapdelta(gmov))+10*i;\r\n       end\r\n    \r\n   end % ~isempty(gmov) standard move - no capture\r\n\r\n  end % ~isempty(gmov) PACMAT adjacent\r\n  \r\n end % i ghost moves\r\nend % while any dots and \u003c max_moves maxLives\r\n%\r\ndots=length(find(mod(map,10)==1));\r\n%\r\nfprintf('moves %i\\n',movepac)\r\nfprintf('dots %i\\n',dots)\r\nfprintf('Lives Spent %i\\n',lives)\r\n%\r\n% To Pass need to leave at most 0 dots\r\nassert(dots==0,sprintf('Max Dots 0, Dots Remaining %i\\n',dots))\r\n\r\nscore= movepac + 1000*lives; % All dots must be removed\r\n\r\nfeval( @assignin,'caller','score',floor(min( 6000,score )) );\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":1,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2013-03-03T04:08:07.000Z","updated_at":"2013-03-03T04:17:37.000Z","published_at":"2013-03-03T04:17:37.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\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/media/image1.JPEG\"}],\"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\u003eThe Classic PACMAN game brought to Cody.\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\u003ePACMAT requires clearing all the Yellow Dots. PACMAT moves at 2X Ghost speed. Six lives are available. Adjacent Ghosts will capture PACMAT. Awesome Ghosts use the tunnel. On Ghost capture everyone gets reset. These trained ghosts take the minimum path, including tunnel paths, to PACMAT assuming the other Ghosts are walls.\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:customXml w:element=\\\"image\\\"\u003e\u003cw:customXmlPr\u003e\u003cw:attr w:name=\\\"height\\\" w:val=\\\"-1\\\"/\u003e\u003cw:attr w:name=\\\"width\\\" w:val=\\\"-1\\\"/\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\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eTo aid in development of your routine, a PACMAT_Interactive.m file that creates a solver script and video has been posted at\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=\\\"https://sites.google.com/site/razapor/matlab_cody/PACMAT_Interactive_008a.m\\\"\u003e\u003cw:r\u003e\u003cw:t\u003ePACMAT_Interactive_008a.m\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. (Right click, 'save link as'). The routine creates a PACMAT8_2Xsolver.m script from the interactive play. The script demonstrates Interactivity, figure/KeyPressFcn, listdlg, and VideoWriter.\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:hyperlink w:docLocation=\\\"https://sites.google.com/site/razapor/matlab_cody/PACMAT8_2Xvideo_492.mp4\\\"\u003e\u003cw:r\u003e\u003cw:t\u003e492 Moves Interactive\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e (MP4) Best Score seen is Zero Lives lost, 492 moves.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInputs:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Map Definitions: -1=Wall, 0=Empty, 1=Dot, 2=PACMAT, \u0026gt;2=Ghost\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 Direction Definitions: 1-Up, 2-Right, 3-Down, 4-Left, 0-No move\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\u003ePass Criteria:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Clear all dots in less than 4000 moves\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\u003eScoring:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Moves + 1000 * Lives\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\u003eNear Future:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Randomized Awesome Tunnel Ghosts to make them non-deterministic to require Adaptive Bot solutions\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\"},{\"partUri\":\"/media/image1.JPEG\",\"contentType\":\"image/JPEG\",\"content\":\"data:image/JPEG;base64,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\"}]}"}],"term":"tag:\"download\"","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:\"download\"","current_player":null,"sort":"map(difficulty_value,0,0,999) asc"},"parser":"MathWorks::Search::Solr::QueryParser","directives":{"term":{"directives":{"tag":[["tag:\"download\"","","\"","download","\""]]}}},"facets":{"#\u003cMathWorks::Search::Field:0x00007fac473edde8\u003e":null,"#\u003cMathWorks::Search::Field:0x00007fac473edd48\u003e":null},"filters":{"#\u003cMathWorks::Search::Field:0x00007fac473ed208\u003e":"\"cody:problem\""},"fields":{"#\u003cMathWorks::Search::Field:0x00007fac473ee2e8\u003e":1,"#\u003cMathWorks::Search::Field:0x00007fac473ee248\u003e":50,"#\u003cMathWorks::Search::Field:0x00007fac473ee1a8\u003e":"map(difficulty_value,0,0,999) asc","#\u003cMathWorks::Search::Field:0x00007fac473ee108\u003e":"tag:\"download\""},"user_query":{"#\u003cMathWorks::Search::Field:0x00007fac473ee108\u003e":"tag:\"download\""},"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:\"download\"","current_player":null,"sort":"map(difficulty_value,0,0,999) asc"},"parser":"MathWorks::Search::Solr::QueryParser","directives":{"term":{"directives":{"tag":[["tag:\"download\"","","\"","download","\""]]}}},"facets":{"#\u003cMathWorks::Search::Field:0x00007fac473edde8\u003e":null,"#\u003cMathWorks::Search::Field:0x00007fac473edd48\u003e":null},"filters":{"#\u003cMathWorks::Search::Field:0x00007fac473ed208\u003e":"\"cody:problem\""},"fields":{"#\u003cMathWorks::Search::Field:0x00007fac473ee2e8\u003e":1,"#\u003cMathWorks::Search::Field:0x00007fac473ee248\u003e":50,"#\u003cMathWorks::Search::Field:0x00007fac473ee1a8\u003e":"map(difficulty_value,0,0,999) asc","#\u003cMathWorks::Search::Field:0x00007fac473ee108\u003e":"tag:\"download\""},"user_query":{"#\u003cMathWorks::Search::Field:0x00007fac473ee108\u003e":"tag:\"download\""},"queried_facets":{}},"options":{"fields":["id","difficulty_rating"]},"join":" "},"results":[{"id":58503,"difficulty_rating":"easy-medium"},{"id":58513,"difficulty_rating":"easy-medium"},{"id":1313,"difficulty_rating":"unrated"},{"id":1314,"difficulty_rating":"unrated"}]}}