{"group":{"id":1,"name":"Community","lockable":false,"created_at":"2012-01-18T18:02:15.000Z","updated_at":"2026-04-06T14:01:22.000Z","description":"Problems submitted by members of the MATLAB Central community.","is_default":true,"created_by":161519,"badge_id":null,"featured":false,"trending":false,"solution_count_in_trending_period":0,"trending_last_calculated":"2026-04-06T00:00:00.000Z","image_id":null,"published":true,"community_created":false,"status_id":2,"is_default_group_for_player":false,"deleted_by":null,"deleted_at":null,"restored_by":null,"restored_at":null,"description_opc":null,"description_html":null,"published_at":null},"problems":[{"id":58842,"title":"ICFP 2023 Orchestra:  Score Optimization of Puzzle-17 Second point","description":"The ICFP 2023 Competition in July was to place musicians on a stage to maximize the attendees net Joy.  The ICFP 2023 Orchestra Spec shows details of the contest. The musicians played various instruments with attendees having preference values for each instrument type. Musicians could block attendees from seeing musicians behind them. Blocking occurs if a_i to m_j vector touched within 5 of m_k. No musicians allowed within 10 of one another. \r\nThis Challenge is to place a second musician onto the stage, mxy, to increase Joy by at least 23400.  The Joy table am is Joy co-factor of each attendee for each musician type. Joy is scaled by 1/distance-squared between Musician and Attendee. Joy(j,i)=1000000*am(i,mu(j))/d2(i,j).\r\nThe Joy here is to brute force a solution.\r\nThe scoring of a placed musician is a discontinuous non-linear function due to vignetting and the 1/distance-squared scaling. There appears to be a grumpy audience cluster at the top left such that vignetting them and their negative Joy raises the Joy of a musician's placement on the xmax stage edge.\r\nGiven all the contest parameters and an initial musician placed at Top-Left of stage (xmax,ymax) return a muscian position (x,y) and type to raise total Joy by at least 23400. A non-integer solution exists with x=xmax.\r\n\r\nThe scoring and blocking functions are provided in the template.\r\n \r\nProblem 17: Stage in Pink and 5000 audience as black dots in top right corner of arena. The first musician is placed at (xmax,ymax)\r\n\r\nThis plot shows the scoring of a second point placed at (xmax, y) where y is the y-axis of the graph and the x-axis is the additive score created by this second point. The first point is placed at (xmax,1220) thus no points allowed (1210:1220]. Down to 1202.6 the entire audience is blocked from viewing. Different samplings are shown: */1, Green/0.1, Black/.01, and Red/.001  To achieve the \u003e23400 requires a resolution of 0.001.  This graph gives clues for limiting the search range.","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: 1608px; display: block; min-width: 0px; padding-block-start: 0px; padding-top: 0px; perspective-origin: 407px 804px; transform-origin: 407px 804px; vertical-align: baseline; \"\u003e\u003cdiv style=\"block-size: 84px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 42px; text-align: left; transform-origin: 384px 42px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 346.5px 8px; transform-origin: 346.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe ICFP 2023 Competition in July was to place musicians on a stage to maximize the attendees net Joy.  The \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://drive.google.com/file/d/16GFrZMudBrNwjMi3tOaP_iiSHh5pUtXL/view?usp=sharing\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eICFP 2023 Orchestra Spec\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: 334px 8px; transform-origin: 334px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e shows details of the contest. The musicians played various instruments with attendees having preference values for each instrument type. Musicians could block attendees from seeing musicians behind them. Blocking occurs if a_i to m_j vector touched within 5 of m_k. No musicians allowed within 10 of one another. \u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 63px; 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 31.5px; text-align: left; transform-origin: 384px 31.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: 382px 8px; transform-origin: 382px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThis Challenge is to place a second musician onto the stage, mxy, to increase Joy by at least 23400.  The Joy table am is Joy co-factor of each attendee for each musician type. Joy is scaled by 1/distance-squared between Musician and Attendee. Joy(j,i)=1000000*am(i,mu(j))/d2(i,j).\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: 127.5px 8px; transform-origin: 127.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe Joy here is to brute force a solution.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 63px; 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 31.5px; text-align: left; transform-origin: 384px 31.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: 369px 8px; transform-origin: 369px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe scoring of a placed musician is a discontinuous non-linear function due to vignetting and the 1/distance-squared scaling. There appears to be a grumpy audience cluster at the top left such that vignetting them and their negative Joy raises the Joy of a musician's placement on the xmax stage edge.\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: 384px 8px; transform-origin: 384px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eGiven all the contest parameters and an initial musician placed at Top-Left of stage (xmax,ymax) return a muscian position (x,y) and type to raise total Joy by at least 23400. A non-integer solution exists with x=xmax.\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: 202.5px 8px; transform-origin: 202.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe scoring and blocking functions are provided in the template.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 425.5px; 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 212.75px; text-align: left; transform-origin: 384px 212.75px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cimg class=\"imageNode\" style=\"vertical-align: baseline\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjAAAAGkCAIAAACgjIjwAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wgJDTImvUjHDgAAACR0RVh0U29mdHdhcmUATUFUTEFCLCBUaGUgTWF0aFdvcmtzLCBJbmMuPFjdGAAAACJ0RVh0Q3JlYXRpb24gVGltZQAwOS1BdWctMjAyMyAwNjo1MDozOKla/X0AABafSURBVHic7dxhaNT3/cDx7+WsbqRISqaCAUvQNKGlSEwrU1oftORBoa4FKXWTdtQOqk5oSx4IfdAIWkYqWxsfFGYZg6GTUkFIYQNlrsb/tWUse9Cm1RiqkUBnNpPek45qcrn/g2yn07vpMvU+8V6vR7lPvuon11/zNveLyRSLxQQA1VZX7QUAICVBAiAIQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiCEedVeAJjbMpnMDZ4sFou3dBPmOkHiFrrxT1UAgsStNVf+Utza2jo0NFTtLa4v4J7+2sHN4h5STRsaGjp69OjZs2evHI6Ojh49evTaz3pl55UOA/y3BKl2/eIXv9i+ffsf/vCHn/zkJ7/85S9nhn19fRs3bjxy5MjWrVt7e3tLh8vOKx2ei+ZKU+fKnjAbRWrS6dOnH3jggYmJiWKx+Le//a2tre3ChQtTU1Pt7e2nT58uFosXLlxYuXLlmTNnisVi2Xmlw1dygdUCn224WdxDqlHLly8/fPjwPffck1KaN2/e9PT01NRUf39/Q0NDS0tLSqmxsXHdunW5XK65ubnsfGRkpOzhq/6g1tbWmTf81R74zwSpRtXV1bW0tBQKhUOHDh04cOCnP/3pkiVLPvroo7a2ttKZ+vr6mYrk8/lr5/X19WUPX0WHgBvkHlJNm5iY+Pbbb5csWfJ///d/X3/9daFQuPI7prLZbLFYTCmVnVc6DDA7glTTFi1a9OMf//jdd9/97ne/+5vf/Gb+/PnT09Ol9xYKhWw2m1IqO690GGB2BKlGffnll/v37y89XLJkyV//+tfFixcPDg6Whvl8vqOjI6VUdl7pMMDsCFKNmp6e/tnPfvbll1+mlP7+97/ncrnOzs7Vq1enlI4fP55SGh4ezuVya9asSSmVnVc6DDA7Ga/716yDBw/29PSsWrXqL3/5y9atW1966aWU0ieffNLV1bVixYrBwcHdu3c/8cQTM4fLzisdLslkXGB3Pj/LjpvF5wtuIUGqBYLEzeLbvoH/yQ1mxo+847rcQwIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIIR51V6AahoeHh4ZGWlsbFy1atXMZHx8/OzZs6UD991338KFC2feHh0dPXXq1LJly1pbW0sHyg4BZkGQateuXbv++Mc/dnR0DA0N3X333b/+9a8XLFhw+PDht956a8GCBTNnent7H3300ZRSX19fT0/P2rVrBwYGnnrqqZdffrnSEGCWitSkzz///IEHHpiYmJh5+OSTT77//vvFYvGVV17Zv3//VYenpqba29tPnz5dLBYvXLiwcuXKM2fOlB1e9QtdYJS4GLguXyHVqIaGhn379t1zzz0zD5ubm7/66quU0smTJ5999tnx8fGFCxfeddddM+/t7+9vaGhoaWlJKTU2Nq5bty6Xy42MjFw7bG5uvuoPKr2UNzQ0dHs+NELxWi43TpBq1NKlS5cuXTrz9sjIyLFjx7Zs2VIoFM6dO7dr166JiYl8Pr9hw4bdu3enlPL5fFtbW+nX1tfXDw0N1dfXXzu89g/SoRpXugAymUx1NyE+32VX68bGxl544YVt27bdf//958+f7+zs3Ldv38cff/zhhx/29/cfPHgwpVQoFK78bJLNZovFYtlhFT4A4E4hSDXt008/ffrpp5977rlt27allJqamvbu3dvU1JRSWrJkSWdn58DAQEpp/vz509PTpV9VKBSy2WzZ4W3/CIA7hyDVro8++ujFF1/cuXPn5s2bZyYjIyOHDh0qHbh06VJdXV1KafHixYODg6V5Pp/v6OgoO7xduwN3IEGqUaOjo9u3b3/zzTcfe+yxycnJycnJQqFw8eLF7u7u4eHhlNLY2NixY8fWr1+fUlq9enVK6fjx4yml4eHhXC63Zs2assNqfkjAHOebGmrUgQMHvvnmmy1btpQmmzZtev3111977bVnn332wQcf/Oyzz7Zv3z7zj5Dq6ur27NnT1dW1YsWKwcHBnp6eRYsWpZTKDgFmJ+NGNLdOJuMC459cDFyXl+wACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIYV61F6CahoeHR0ZGGhsbV61aVRqOjo6eOnVq2bJlra2tVx4uO690GOC/5Suk2rVr166XXnrpyJEjO3fu/NGPfnTx4sWUUl9f38aNG48cObJ169be3t7S4bLzSocBZqNITfr8888feOCBiYmJmYdPPvnk+++/PzU11d7efvr06WKxeOHChZUrV545c6ZYLJadVzp8JRcYJS4GrstXSDWqoaFh375999xzz8zD5ubmr776qr+/v6GhoaWlJaXU2Ni4bt26XC6XUio7r3QYYHbcQ6pRS5cuXbp06czbIyMjx44d27Jly9DQUFtbW+lMfX390NBQSimfz187r6+vL3v4KqV7S2Xfyx3PzUVunCDVurGxsRdeeGHbtm3333//F198kclkSu/KZrPFYjGlVCgUrp2XHV77++tQjStdAFdeLVCWl+xq2qeffvr0008/99xz27ZtSynNnz9/enq69N5CoZDNZivNKx0GmB1Bql0fffTRiy++uHPnzs2bN89MFi9ePDg4WDqQz+c7OjoqzSsdBpgdQapRo6Oj27dvf/PNNx977LHJycnJyclCobB69eqU0vHjx1NKw8PDuVxuzZo1KaWy80qHAWbHPaQadeDAgW+++WbLli2lyaZNm15//fU9e/Z0dXWtWLFicHCwp6dn0aJFKaW6urqy87JDgNnJlL0RDTdFJuMC459cDFyXl+wACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQ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B++6664rP5Vks9mZF14KhULZOcDseMmOy5qamvbu3dvU1JRSWrJkSWdn58DAwPz586enp0tnCoVCNptNKVWaA8yOIHHZyMjIoUOHSg8vXbpUV1e3ePHiwcHB0jCfz3d0dKSUKs0BZkeQuOzixYvd3d3Dw8MppbGxsWPHjq1fv3716tUppePHj6eUhoeHc7ncmjVrUkqV5gCz4xsx+TcHDhz4+c9//uCDD3722Wfbt2/fvHlzSumTTz7p6upasWLF4ODg7t27n3jiiZnDleYlvtOXEhcD1+US4RbyOYgSFwPX5SU7AEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAk/iejo6NHjx4dGhqq9iLAnCdIzF5fX9/GjRuPHDmydevW3t7eaq/zP2ltba32CjfEntzB5lV7AeaqQqGwc+fO9957r6WlZXx8/PHHH//BD37Q3Nxc7b2AuUqQmKX+/v6GhoaWlpaUUmNj47p163K53LVBymQy1dhuNubKqvbkTiVIzFI+n29rays9rK+vv/ZOUrFYvL1LAXOYe0jMUqFQuPKvwNlsVn6A/4UgMUvz58+fnp4uPSwUCtlstor7AHOdIDFLixcvHhwcLD3M5/MdHR1V3AeY6wSJWVq9enVK6fjx4yml4eHhXC63Zs2aai8FzGEZr/sza5988klXV9eKFSsGBwd37979xBNPVHsjYA4TJABC8JIdACEIEgAhZHfu3FntHbgzjY6O/ulPf5qamvre975X7V1SSml8fPyLL7746l/uvvvuBQsWpAp7Vmv5EydO3HvvvdddI8LOV65a6bkNsipzhSBxS/T19b366quXLl1699138/n897///WpvlH7729/u2LHj97///QcffPDBBx+0t7ffe++9Zfes1vLvvPNOb2/v5s2bZx5WWiPCzletWva5DbIqc0kRbrapqan29vbTp08Xi8ULFy6sXLnyzJkz1V6q+Morr+zfv//KSdk9q7L8xMTEjh072tvbH3nkkf+wW4Sdr121WO65jbAqc457SNx8ZX/uarWXSidPnly+fPn4+Pjk5OTMpOyeVVn+7bffbmxsfOONN0qTSmtUfedrV03lntsIqzLn+OGq3Hw38nNXb7NCoXDu3Lldu3ZNTEzk8/kNGzbs3r277J719fW3f/nu7u66urqZf2U8o9JzWPWdr1217HMbYVXmHF8hcfMF/Lmr58+f7+zs3Ldv38cff/zhhx/29/cfPHiw7J5VWb6u7ur/EyutUfWdr1217HMbYVXmHEHi5gv4c1ebmpr27t3b1NSUUlqyZElnZ+fAwEDZPYMsX2mNgDuXfW5jrkpwgsTNF/Dnro6MjBw6dKj08NKlS3V1dWX3DLJ8pTUC7lz2uY25KsEJEjdfwJ+7evHixe7u7uHh4ZTS2NjYsWPH1q9fX3bPIMtXWiPgzmWf25irEl31vsGPO9nHH3+8du3a559/ftWqVb/73e+qvU6xWCzu37+/vb39+eefb29v/9WvfjUzLLtntZb/8MMPr/xe6kprRNj5qlXLPrdBVmUO8cNVuYX+8Y9/fOc737n2Nni1TE9Pf/vtt9euVHbPIMtXWiPazpWe20pbBXl6CUWQAAjBX08ACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACOH/ASvjkMvaesP1AAAAAElFTkSuQmCC\" data-image-state=\"image-loaded\"\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 \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: 374px 8px; transform-origin: 374px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eProblem 17: Stage in Pink and 5000 audience as black dots in top right corner of arena. The first musician is placed at (xmax,ymax)\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 651.5px; 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 325.75px; text-align: left; transform-origin: 384px 325.75px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cimg class=\"imageNode\" style=\"vertical-align: baseline;width: 882px;height: 646px\" src=\"data:image/png;base64,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\" data-image-state=\"image-loaded\" width=\"882\" height=\"646\"\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 84px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 42px; text-align: left; transform-origin: 384px 42px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 375.5px 8px; transform-origin: 375.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThis plot shows the scoring of a second point placed at (xmax, y) where y is the y-axis of the graph and the x-axis is the additive score created by this second point. The first point is placed at (xmax,1220) thus no points allowed (1210:1220]. Down to 1202.6 the entire audience is blocked from viewing. Different samplings are shown: */1, Green/0.1, Black/.01, and Red/.001  To achieve the \u0026gt;23400 requires a resolution of 0.001.  This graph gives clues for limiting the search range.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e","function_template":"function pxyt = find_pxyt(mxy,mu,am,axy,xmin,xmax,ymin,ymax,min_score)\r\n% pxyt  [x,y,musician]; mxy(musician,:)=[x,y] where x is expected to be xmax\r\n%mxy(3,:)=[1022 1220];\r\n \r\n y=1200; %Solve for y such that mpscr \u003e min_score\r\n % Resolution of .001 required to achieve min_score\r\n % Brute force works with bounds from Performance graph\r\n \r\n %The scoring function is discontinuous and non-linear due to vignetting and 1/distance^2 scale\r\n pxy=[xmax y];\r\n [Totscr,muscr,mpscr]=Calc_scoreP(pxy,mxy,mu,am,axy); %Calc scores for pxy placement \r\n % mpscr is pxy score vec of musician types\r\n \r\n pxyt=[xmax y find(mpscr==max(mpscr),1,'first')];\r\n\r\nend % find_pxyt\r\n\r\nfunction [Totscr,muscr,mpscr]=Calc_scoreP(pxy,mxy,mu,am,axy)\r\n%Evaluate pxy for all musician types, only process non [0 0] mxy values\r\n% mpscr is vector of score for all musician types if placed at pxy\r\n%No error checking,volume,pillars\r\n Lmu=length(mu)+1;\r\n mxy=[mxy;pxy]; % augment mxy\r\n na=size(axy,1);\r\n nmut=max(mu);\r\n  \r\n%Calc each mu score\r\n d2am=zeros(na,Lmu);\r\n for j=1:Lmu\r\n  d2am(:,j)=sum((axy-mxy(j,:)).^2,2);\r\n end\r\n \r\n muscr=zeros(Lmu-1,1);\r\n mpscr=zeros(nmut,1);\r\n dmax=25; % square of the distance 5 vignetting rule\r\n for j=1:Lmu\r\n  if mxy(j,1)==0,continue;end % Unfilled mxy\r\n  for i=1:na\r\n   bflag=0;\r\n   for k=1:Lmu %search for any blockng musician \r\n    if mxy(k,1)==0,continue;end % Unfilled mxy\r\n    if k==j,continue;end\r\n    dv2=distP2S2Z(mxy(k,1),mxy(k,2),mxy(j,1),mxy(j,2),axy(i,1),axy(i,2)); %Intra Seg dist\r\n    if min(dv2)\u003c=dmax\r\n     bflag=1;\r\n     break;\r\n    end\r\n   end\r\n   \r\n   if bflag\r\n    continue;\r\n   end\r\n   \r\n   if j==Lmu % Special End Point being evaluated for all types\r\n    for t=1:nmut\r\n     mpscr(t)=mpscr(t)+1000000*am(i,t)/d2am(i,j);\r\n    end\r\n   else % Standard scoring\r\n     muscr(j)=muscr(j)+1000000*am(i,mu(j))/d2am(i,j);\r\n   end\r\n  end\r\n end\r\n Totscr=sum(muscr);\r\nend %Calc_scoreP\r\n\r\nfunction d2=distP2S2Z(px,py,vx,vy,wx,wy)\r\n% Distance Squared from segment only if intra-segment\r\n% reduce to 0\u003c=t\u003c=1\r\n%The point is (px,py) and the segment is [(vx,vy) to (wx,wy)].\r\n% [px py vx vy wx wy]\r\n\r\n d2=Inf;\r\n sL2=(vx-wx)^2+(vy-wy)^2;\r\n t=( (px-vx)*(wx-vx)+(py-vy)*(wy-vy) )/sL2;\r\n if t\u003c0 % Pt beyond normal of segment\r\n  return\r\n elseif t\u003e1 % Pt beyond normal of segment\r\n  return\r\n else\r\n  sx=vx+t*(wx-vx);\r\n  sy=vy+t*(wy-vy);\r\n  d2=(px-sx)^2+(py-sy)^2;\r\n end\r\nend %distP2S2Z\r\n\r\n","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 fname='orc_d_mu_axy_am_pxyr.mat';\r\n %orc is a cell array orc{90} for the 90 Problems in ICFP 2023 Orchestra Competition\r\n \r\n % fn.mat  https://drive.google.com/file/d/10GsOZTIjzMIuO7xAYIqLT1zIq9Cyubl-/view?usp=drive_link\r\n % Google Gives warning thus aborts urlwrite\r\n %\r\n %fname='orc_d_mu_axy_am_pxyr.pdf'\r\n %Fake name of .pdf on GoogleDrive,  write as a mat\r\n \r\n url='https://drive.google.com/file/d/1mgxzsmVQNXgqHEdd61QR2r0STm3N9lgG/view?usp=drive_link';\r\n ptr=strfind(url,'/view'); % Tweaking the url\r\n url(ptr:end)=[];\r\n url=strrep(url,'file/d/','uc?export=download\u0026id=');\r\n \r\n tic\r\n urlwrite(url,fname); %Writing GoogleDrive orc.pdf into orc.mat\r\n fprintf('Download 14MB Time: %.1f  sec\\n\\n',toc); %14MB download Time, about 1-3 sec\r\n \r\n%dir_struct=dir;\r\n%for i=1:size(dir_struct,1)\r\n% fprintf('%i %s %i\\n',i,dir_struct(i).name,dir_struct(i).bytes)\r\n%end\r\n\r\nload(fname);\r\nfprintf('\\n\\nmat Load Time: %.1f\\n\\n',toc); %Load Time of orc from .mat, 0.1 sec\r\n\r\ntic\r\npid=17;\r\nd=orc{pid}.d; %[1000 1000 10 990 10 10] room_width room_h xmin xmax ymin ymax\r\nmu=orc{pid}.mu; %[1 2 3 4 5 6 7 8 9 3 4 7 2 1 2 4]\r\naxy=orc{pid}.axy; %[400,2]\r\nam=orc{pid}.am;  %[400,9]  there are 9 musician types 1:9 seen in mu\r\npxyr=orc{pid}.pxyr; %[0,3] Pillars that do not exist in pid 22\r\nrw=d(1);rh=d(2);xmin=d(3);xmax=d(4);ymin=d(5);ymax=d(6);\r\nfprintf('xmin:%i xmax:%i ymin:%i ymax:%i\\n\\n',d(3:6));\r\n\r\nLmu=length(mu); % number of musicians\r\nmxy=zeros(Lmu,2);\r\nnmut=max(mu); % number of musician types\r\nna=size(axy,1); % number of attendees\r\n\r\nmxy(3,:)=[xmax ymax]; %Placed best scoring musician at Corner nearest Audience\r\n \r\nmin_score=23400;\r\nztic=tic;\r\npxyt = find_pxyt(mxy,mu,am,axy,xmin,xmax,ymin,ymax,min_score);\r\nfprintf('x:%.0f y:%.4f t:%.0f  Time:%.3f\\n',pxyt,toc(ztic));\r\n\r\n[bTotscr,muscr]=Calc_score(mxy,mu,am,axy); % Base score prior to adding pxyt\r\nfprintf('Base Score: %.2f\\n',bTotscr);\r\n\r\nif pxyt(3)~=3\r\n mxy(pxyt(3),:)=pxyt(1:2);\r\nelse % should not have a 23400 score\r\n tptr=find(mu==3);\r\n mxy(tptr(end),:)=pxyt(1:2);\r\nend\r\n[Totscr,muscr]=Calc_score(mxy,mu,am,axy); % Base score prior to adding pxyt\r\nfprintf('Total Score: %.2f\\n',Totscr);\r\n\r\n\r\nvalid=Totscr\u003ebTotscr+min_score;\r\nassert(valid)\r\n\r\nfunction [Totscr,muscr]=Calc_score(mxy,mu,am,axy)\r\n%No error checking,volume,pillars\r\n Lmu=length(mu);\r\n na=size(axy,1);\r\n  \r\n%Calc each mu score\r\n d2am=zeros(na,Lmu);\r\n for j=1:Lmu\r\n  d2am(:,j)=sum((axy-mxy(j,:)).^2,2);\r\n end\r\n \r\n muscr=zeros(Lmu,1);\r\n dmax=25;\r\n for j=1:Lmu\r\n  if mxy(j,1)==0,continue;end % Unfilled mxy\r\n  for i=1:na\r\n   bflag=0;\r\n   for k=1:Lmu %search for any blockng musician \r\n    if mxy(k,1)==0,continue;end % Unfilled mxy\r\n    if k==j,continue;end\r\n    dv2=distP2S2Z(mxy(k,1),mxy(k,2),mxy(j,1),mxy(j,2),axy(i,1),axy(i,2)); %Intra Seg dist\r\n    if min(dv2)\u003c=dmax\r\n     bflag=1;\r\n     break;\r\n    end\r\n   end\r\n   \r\n   if bflag\r\n     continue;\r\n   end\r\n   \r\n   muscr(j)=muscr(j)+1000000*am(i,mu(j))/d2am(i,j);\r\n  end\r\n end\r\n Totscr=sum(muscr);\r\nend %Calc_score\r\n\r\nfunction d2=distP2S2Z(px,py,vx,vy,wx,wy)\r\n% Distance from segment only if intra-segment\r\n% reduce to 0\u003c=t\u003c=1\r\n%The point is (px,py) and the segment is [(vx,vy) to (wx,wy)].\r\n% [px py vx vy wx wy]\r\n\r\n d2=Inf;\r\n sL2=(vx-wx)^2+(vy-wy)^2;\r\n %if sL2==0 % Segment is a point  %Error check removed\r\n % d2=(px-vx)^2+(py-vy)^2;\r\n %else % non-point segment\r\n  t=( (px-vx)*(wx-vx)+(py-vy)*(wy-vy) )/sL2;\r\n  if t\u003c0 % Pt beyond normal of segment\r\n   return\r\n   %d2=(px-vx)^2+(py-vy)^2;\r\n  elseif t\u003e1 % Pt beyond normal of segment\r\n    return\r\n   %d2=(px-wx)^2+(py-wy)^2;\r\n  else\r\n   sx=vx+t*(wx-vx);\r\n   sy=vy+t*(wy-vy);\r\n   d2=(px-sx)^2+(py-sy)^2;\r\n  end\r\n %end\r\n %d=sqrt(d2);\r\nend %distP2S2Z\r\n\r\n\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":3097,"edited_by":3097,"edited_at":"2023-08-09T18:47:46.000Z","deleted_by":null,"deleted_at":null,"solvers_count":1,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2023-08-09T13:28:37.000Z","updated_at":"2023-08-09T18:47:47.000Z","published_at":"2023-08-09T18:47:47.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\u003eThe ICFP 2023 Competition in July was to place musicians on a stage to maximize the attendees net Joy.  The \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://drive.google.com/file/d/16GFrZMudBrNwjMi3tOaP_iiSHh5pUtXL/view?usp=sharing\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eICFP 2023 Orchestra Spec\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e shows details of the contest. The musicians played various instruments with attendees having preference values for each instrument type. Musicians could block attendees from seeing musicians behind them. Blocking occurs if a_i to m_j vector touched within 5 of m_k. No musicians allowed within 10 of one another. \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 place a second musician onto the stage, mxy, to increase Joy by at least 23400.  The Joy table am is Joy co-factor of each attendee for each musician type. Joy is scaled by 1/distance-squared between Musician and Attendee. Joy(j,i)=1000000*am(i,mu(j))/d2(i,j).\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 Joy here is to brute force a solution.\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 scoring of a placed musician is a discontinuous non-linear function due to vignetting and the 1/distance-squared scaling. There appears to be a grumpy audience cluster at the top left such that vignetting them and their negative Joy raises the Joy of a musician's placement on the xmax stage edge.\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 all the contest parameters and an initial musician placed at Top-Left of stage (xmax,ymax) return a muscian position (x,y) and type to raise total Joy by at least 23400. A non-integer solution exists with x=xmax.\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\u003eThe scoring and blocking functions are provided in the template.\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:customXml w:element=\\\"image\\\"\u003e\u003cw:customXmlPr\u003e\u003cw:attr w:name=\\\"height\\\" w:val=\\\"420\\\"/\u003e\u003cw:attr w:name=\\\"width\\\" w:val=\\\"560\\\"/\u003e\u003cw:attr w:name=\\\"verticalAlign\\\" w:val=\\\"baseline\\\"/\u003e\u003cw:attr w:name=\\\"altText\\\" w:val=\\\"\\\"/\u003e\u003cw:attr w:name=\\\"relationshipId\\\" w:val=\\\"rId1\\\"/\u003e\u003c/w:customXmlPr\u003e\u003c/w:customXml\u003e\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\u003eProblem 17: Stage in Pink and 5000 audience as black dots in top right corner of arena. The first musician is placed at (xmax,ymax)\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:customXml w:element=\\\"image\\\"\u003e\u003cw:customXmlPr\u003e\u003cw:attr w:name=\\\"height\\\" w:val=\\\"646\\\"/\u003e\u003cw:attr w:name=\\\"width\\\" w:val=\\\"882\\\"/\u003e\u003cw:attr w:name=\\\"verticalAlign\\\" w:val=\\\"baseline\\\"/\u003e\u003cw:attr w:name=\\\"altText\\\" w:val=\\\"\\\"/\u003e\u003cw:attr w:name=\\\"relationshipId\\\" w:val=\\\"rId2\\\"/\u003e\u003c/w:customXmlPr\u003e\u003c/w:customXml\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis plot shows the scoring of a second point placed at (xmax, y) where y is the y-axis of the graph and the x-axis is the additive score created by this second point. The first point is placed at (xmax,1220) thus no points allowed (1210:1220]. Down to 1202.6 the entire audience is blocked from viewing. Different samplings are shown: */1, Green/0.1, Black/.01, and Red/.001  To achieve the \u0026gt;23400 requires a resolution of 0.001.  This graph gives clues for limiting the search range.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\",\"relationship\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"target\":\"/media/image1.png\",\"relationshipId\":\"rId1\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"target\":\"/media/image2.png\",\"relationshipId\":\"rId2\"}]},{\"partUri\":\"/media/image1.png\",\"contentType\":\"image/png\",\"content\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjAAAAGkCAIAAACgjIjwAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wgJDTImvUjHDgAAACR0RVh0U29mdHdhcmUATUFUTEFCLCBUaGUgTWF0aFdvcmtzLCBJbmMuPFjdGAAAACJ0RVh0Q3JlYXRpb24gVGltZQAwOS1BdWctMjAyMyAwNjo1MDozOKla/X0AABafSURBVHic7dxhaNT3/cDx7+WsbqRISqaCAUvQNKGlSEwrU1oftORBoa4FKXWTdtQOqk5oSx4IfdAIWkYqWxsfFGYZg6GTUkFIYQNlrsb/tWUse9Cm1RiqkUBnNpPek45qcrn/g2yn07vpMvU+8V6vR7lPvuon11/zNveLyRSLxQQA1VZX7QUAICVBAiAIQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiCEedVeAJjbMpnMDZ4sFou3dBPmOkHiFrrxT1UAgsStNVf+Utza2jo0NFTtLa4v4J7+2sHN4h5STRsaGjp69OjZs2evHI6Ojh49evTaz3pl55UOA/y3BKl2/eIXv9i+ffsf/vCHn/zkJ7/85S9nhn19fRs3bjxy5MjWrVt7e3tLh8vOKx2ei+ZKU+fKnjAbRWrS6dOnH3jggYmJiWKx+Le//a2tre3ChQtTU1Pt7e2nT58uFosXLlxYuXLlmTNnisVi2Xmlw1dygdUCn224WdxDqlHLly8/fPjwPffck1KaN2/e9PT01NRUf39/Q0NDS0tLSqmxsXHdunW5XK65ubnsfGRkpOzhq/6g1tbWmTf81R74zwSpRtXV1bW0tBQKhUOHDh04cOCnP/3pkiVLPvroo7a2ttKZ+vr6mYrk8/lr5/X19WUPX0WHgBvkHlJNm5iY+Pbbb5csWfJ///d/X3/9daFQuPI7prLZbLFYTCmVnVc6DDA7glTTFi1a9OMf//jdd9/97ne/+5vf/Gb+/PnT09Ol9xYKhWw2m1IqO690GGB2BKlGffnll/v37y89XLJkyV//+tfFixcPDg6Whvl8vqOjI6VUdl7pMMDsCFKNmp6e/tnPfvbll1+mlP7+97/ncrnOzs7Vq1enlI4fP55SGh4ezuVya9asSSmVnVc6DDA7Ga/716yDBw/29PSsWrXqL3/5y9atW1966aWU0ieffNLV1bVixYrBwcHdu3c/8cQTM4fLzisdLslkXGB3Pj/LjpvF5wtuIUGqBYLEzeLbvoH/yQ1mxo+847rcQwIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIIR51V6AahoeHh4ZGWlsbFy1atXMZHx8/OzZs6UD991338KFC2feHh0dPXXq1LJly1pbW0sHyg4BZkGQateuXbv++Mc/dnR0DA0N3X333b/+9a8XLFhw+PDht956a8GCBTNnent7H3300ZRSX19fT0/P2rVrBwYGnnrqqZdffrnSEGCWitSkzz///IEHHpiYmJh5+OSTT77//vvFYvGVV17Zv3//VYenpqba29tPnz5dLBYvXLiwcuXKM2fOlB1e9QtdYJS4GLguXyHVqIaGhn379t1zzz0zD5ubm7/66quU0smTJ5999tnx8fGFCxfeddddM+/t7+9vaGhoaWlJKTU2Nq5bty6Xy42MjFw7bG5uvuoPKr2UNzQ0dHs+NELxWi43TpBq1NKlS5cuXTrz9sjIyLFjx7Zs2VIoFM6dO7dr166JiYl8Pr9hw4bdu3enlPL5fFtbW+nX1tfXDw0N1dfXXzu89g/SoRpXugAymUx1NyE+32VX68bGxl544YVt27bdf//958+f7+zs3Ldv38cff/zhhx/29/cfPHgwpVQoFK78bJLNZovFYtlhFT4A4E4hSDXt008/ffrpp5977rlt27allJqamvbu3dvU1JRSWrJkSWdn58DAQEpp/vz509PTpV9VKBSy2WzZ4W3/CIA7hyDVro8++ujFF1/cuXPn5s2bZyYjIyOHDh0qHbh06VJdXV1KafHixYODg6V5Pp/v6OgoO7xduwN3IEGqUaOjo9u3b3/zzTcfe+yxycnJycnJQqFw8eLF7u7u4eHhlNLY2NixY8fWr1+fUlq9enVK6fjx4yml4eHhXC63Zs2assNqfkjAHOebGmrUgQMHvvnmmy1btpQmmzZtev3111977bVnn332wQcf/Oyzz7Zv3z7zj5Dq6ur27NnT1dW1YsWKwcHBnp6eRYsWpZTKDgFmJ+NGNLdOJuMC459cDFyXl+wACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIYV61F6CahoeHR0ZGGhsbV61aVRqOjo6eOnVq2bJlra2tVx4uO690GOC/5Suk2rVr166XXnrpyJEjO3fu/NGPfnTx4sWUUl9f38aNG48cObJ169be3t7S4bLzSocBZqNITfr8888feOCBiYmJmYdPPvnk+++/PzU11d7efvr06WKxeOHChZUrV545c6ZYLJadVzp8JRcYJS4GrstXSDWqoaFh375999xzz8zD5ubmr776qr+/v6GhoaWlJaXU2Ni4bt26XC6XUio7r3QYYHbcQ6pRS5cuXbp06czbIyMjx44d27Jly9DQUFtbW+lMfX390NBQSimfz187r6+vL3v4KqV7S2Xfyx3PzUVunCDVurGxsRdeeGHbtm3333//F198kclkSu/KZrPFYjGlVCgUrp2XHV77++tQjStdAFdeLVCWl+xq2qeffvr0008/99xz27ZtSynNnz9/enq69N5CoZDNZivNKx0GmB1Bql0fffTRiy++uHPnzs2bN89MFi9ePDg4WDqQz+c7OjoqzSsdBpgdQapRo6Oj27dvf/PNNx977LHJycnJyclCobB69eqU0vHjx1NKw8PDuVxuzZo1KaWy80qHAWbHPaQadeDAgW+++WbLli2lyaZNm15//fU9e/Z0dXWtWLFicHCwp6dn0aJFKaW6urqy87JDgNnJlL0RDTdFJuMC459cDFyXl+wACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQ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B++6664rP5Vks9mZF14KhULZOcDseMmOy5qamvbu3dvU1JRSWrJkSWdn58DAwPz586enp0tnCoVCNptNKVWaA8yOIHHZyMjIoUOHSg8vXbpUV1e3ePHiwcHB0jCfz3d0dKSUKs0BZkeQuOzixYvd3d3Dw8MppbGxsWPHjq1fv3716tUppePHj6eUhoeHc7ncmjVrUkqV5gCz4xsx+TcHDhz4+c9//uCDD3722Wfbt2/fvHlzSumTTz7p6upasWLF4ODg7t27n3jiiZnDleYlvtOXEhcD1+US4RbyOYgSFwPX5SU7AEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAk/iejo6NHjx4dGhqq9iLAnCdIzF5fX9/GjRuPHDmydevW3t7eaq/zP2ltba32CjfEntzB5lV7AeaqQqGwc+fO9957r6WlZXx8/PHHH//BD37Q3Nxc7b2AuUqQmKX+/v6GhoaWlpaUUmNj47p163K53LVBymQy1dhuNubKqvbkTiVIzFI+n29rays9rK+vv/ZOUrFYvL1LAXOYe0jMUqFQuPKvwNlsVn6A/4UgMUvz58+fnp4uPSwUCtlstor7AHOdIDFLixcvHhwcLD3M5/MdHR1V3AeY6wSJWVq9enVK6fjx4yml4eHhXC63Zs2aai8FzGEZr/sza5988klXV9eKFSsGBwd37979xBNPVHsjYA4TJABC8JIdACEIEgAhZHfu3FntHbgzjY6O/ulPf5qamvre975X7V1SSml8fPyLL7746l/uvvvuBQsWpAp7Vmv5EydO3HvvvdddI8LOV65a6bkNsipzhSBxS/T19b366quXLl1699138/n897///WpvlH7729/u2LHj97///QcffPDBBx+0t7ffe++9Zfes1vLvvPNOb2/v5s2bZx5WWiPCzletWva5DbIqc0kRbrapqan29vbTp08Xi8ULFy6sXLnyzJkz1V6q+Morr+zfv//KSdk9q7L8xMTEjh072tvbH3nkkf+wW4Sdr121WO65jbAqc457SNx8ZX/uarWXSidPnly+fPn4+Pjk5OTMpOyeVVn+7bffbmxsfOONN0qTSmtUfedrV03lntsIqzLn+OGq3Hw38nNXb7NCoXDu3Lldu3ZNTEzk8/kNGzbs3r277J719fW3f/nu7u66urqZf2U8o9JzWPWdr1217HMbYVXmHF8hcfMF/Lmr58+f7+zs3Ldv38cff/zhhx/29/cfPHiw7J5VWb6u7ur/EyutUfWdr1217HMbYVXmHEHi5gv4c1ebmpr27t3b1NSUUlqyZElnZ+fAwEDZPYMsX2mNgDuXfW5jrkpwgsTNF/Dnro6MjBw6dKj08NKlS3V1dWX3DLJ8pTUC7lz2uY25KsEJEjdfwJ+7evHixe7u7uHh4ZTS2NjYsWPH1q9fX3bPIMtXWiPgzmWf25irEl31vsGPO9nHH3+8du3a559/ftWqVb/73e+qvU6xWCzu37+/vb39+eefb29v/9WvfjUzLLtntZb/8MMPr/xe6kprRNj5qlXLPrdBVmUO8cNVuYX+8Y9/fOc737n2Nni1TE9Pf/vtt9euVHbPIMtXWiPazpWe20pbBXl6CUWQAAjBX08ACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACOH/ASvjkMvaesP1AAAAAElFTkSuQmCC\",\"relationship\":null},{\"partUri\":\"/media/image2.png\",\"contentType\":\"image/png\",\"content\":\"data:image/png;base64,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\",\"relationship\":null}],\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"target\":\"/matlab/document.xml\",\"relationshipId\":\"rId1\"}]}"},{"id":42355,"title":"Minimum Set (A+A)U(A*A) OEIS A263996","description":"This Challenge is to find an integer vector A that creates the minimum set size for (A+A) U (A*A) for a given vector length, \u003chttps://oeis.org/A263996 OEIS A263996\u003e. The length, best value, Prime_max, and Value_max will be provided. \r\n\r\nThe \u003chttps://oeis.org/A263996 OEIS A263996\u003e gives the minimum set sizes thru length 50. Length 7 has best value 26 with Prime_max 5 and Value_max 8. A=[1 2 3 4 5 6 8] yields [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 20 24 25 30 32 36 40 48 64].\r\nThe \u003chttp://68.173.157.131/Contest/SumsAndProducts1/FinalReport Al Zimmermann Sums Contest Final Report\u003e extends A263996 for lengths 40:40:1000 with complete vector solutions. The contest winner, Rokicki, noted his method used P-smooth sets, hill climbing, and random swaps. The contest was a little tougher with only L given.\r\n\r\nExample Input/Output:\r\nL=9;Best=36;pmax=5;vmax=12;\r\nv = SP(L,Best,pmax,vmax); Yields v=[1 2 3 4 5 6 8 10 12]\r\n\r\nTheory/Hints: The V superset is found using \u003chttp://www.mathworks.com/matlabcentral/cody/problems/1298-p-smooth-numbers psmooth(pmax,vmax)\u003e . One observation is that for every v element the set v contains prod of all v element factor permutations. The time eater will be score evaluation. Residual evaluation suggested. A history screen, prior to score evaluation, of prior processed vectors is essential. A quick history pre-screen is vector sum. Replace testing of only values that are not factors of other numbers (eg 2,3 no replace) enables a reasonable time rolling score solution without random for the small test case values. ","description_html":"\u003cp\u003eThis Challenge is to find an integer vector A that creates the minimum set size for (A+A) U (A*A) for a given vector length, \u003ca href = \"https://oeis.org/A263996\"\u003eOEIS A263996\u003c/a\u003e. The length, best value, Prime_max, and Value_max will be provided.\u003c/p\u003e\u003cp\u003eThe \u003ca href = \"https://oeis.org/A263996\"\u003eOEIS A263996\u003c/a\u003e gives the minimum set sizes thru length 50. Length 7 has best value 26 with Prime_max 5 and Value_max 8. A=[1 2 3 4 5 6 8] yields [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 20 24 25 30 32 36 40 48 64].\r\nThe \u003ca href = \"http://68.173.157.131/Contest/SumsAndProducts1/FinalReport\"\u003eAl Zimmermann Sums Contest Final Report\u003c/a\u003e extends A263996 for lengths 40:40:1000 with complete vector solutions. The contest winner, Rokicki, noted his method used P-smooth sets, hill climbing, and random swaps. The contest was a little tougher with only L given.\u003c/p\u003e\u003cp\u003eExample Input/Output:\r\nL=9;Best=36;pmax=5;vmax=12;\r\nv = SP(L,Best,pmax,vmax); Yields v=[1 2 3 4 5 6 8 10 12]\u003c/p\u003e\u003cp\u003eTheory/Hints: The V superset is found using \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/problems/1298-p-smooth-numbers\"\u003epsmooth(pmax,vmax)\u003c/a\u003e . One observation is that for every v element the set v contains prod of all v element factor permutations. The time eater will be score evaluation. Residual evaluation suggested. A history screen, prior to score evaluation, of prior processed vectors is essential. A quick history pre-screen is vector sum. Replace testing of only values that are not factors of other numbers (eg 2,3 no replace) enables a reasonable time rolling score solution without random for the small test case values.\u003c/p\u003e","function_template":"function v = SP(L,Best,pmax,vmax)\r\n% Only L and \u003c=Best need to be satisfied\r\n% pmax and vmax are suggestions when using psmooth numbers\r\n  v=[1:L-1 vmax];\r\nend","test_suite":"%%\r\ntic\r\npass=true;\r\nL=8;Best=30;pmax=5;vmax=10;\r\nv = SP(L,Best,pmax,vmax);\r\nv=unique(floor(v));\r\nv(v\u003c1)=[];\r\nif length(v)~=L,pass=false;end\r\nvm2=zeros(1,v(end)*v(end));\r\nLv=length(v);\r\nvr=repmat(v,Lv,1);vrp=vr';\r\nvp=vr+vrp;\r\n%vp=repmat(v,Lv,1)+repmat(v',1,Lv);\r\nvm2(vp(:))=1;\r\nvm=vr.*vrp;\r\n%vm=repmat(v,Lv,1).*repmat(v',1,Lv);\r\nvm2(vm(:))=1;\r\nscr=nnz(vm2);\r\nif scr\u003eBest,pass=false;end\r\ntoc\r\nassert(pass)\r\n%%\r\ntic\r\npass=true;\r\nL=39;Best=335;pmax=7;vmax=100;\r\nv = SP(L,Best,pmax,vmax);\r\nv=unique(floor(v));\r\nv(v\u003c1)=[];\r\nif length(v)~=L,pass=false;end\r\nvm2=zeros(1,v(end)*v(end));\r\nLv=length(v);\r\nvr=repmat(v,Lv,1);vrp=vr';\r\nvp=vr+vrp;\r\n%vp=repmat(v,Lv,1)+repmat(v',1,Lv);\r\nvm2(vp(:))=1;\r\nvm=vr.*vrp;\r\n%vm=repmat(v,Lv,1).*repmat(v',1,Lv);\r\nvm2(vm(:))=1;\r\nscr=nnz(vm2);\r\nif scr\u003eBest,pass=false;end\r\ntoc\r\nassert(pass)\r\n%%\r\ntic\r\npass=true;\r\nL=50;Best=486;pmax=7;vmax=144;\r\nv = SP(L,Best,pmax,vmax);\r\nv=unique(floor(v));\r\nv(v\u003c1)=[];\r\nif length(v)~=L,pass=false;end\r\nvm2=zeros(1,v(end)*v(end));\r\nLv=length(v);\r\nvr=repmat(v,Lv,1);vrp=vr';\r\nvp=vr+vrp;\r\n%vp=repmat(v,Lv,1)+repmat(v',1,Lv);\r\nvm2(vp(:))=1;\r\nvm=vr.*vrp;\r\n%vm=repmat(v,Lv,1).*repmat(v',1,Lv);\r\nvm2(vm(:))=1;\r\nscr=nnz(vm2);\r\nif scr\u003eBest,pass=false;end\r\ntoc\r\nassert(pass)\r\n%%\r\ntic\r\npass=true;\r\nL=40;Best=348;pmax=7;vmax=120;\r\nv = SP(L,Best,pmax,vmax);\r\nv=unique(floor(v));\r\nv(v\u003c1)=[];\r\nif length(v)~=L,pass=false;end\r\nvm2=zeros(1,v(end)*v(end));\r\nLv=length(v);\r\nvr=repmat(v,Lv,1);vrp=vr';\r\nvp=vr+vrp;\r\n%vp=repmat(v,Lv,1)+repmat(v',1,Lv);\r\nvm2(vp(:))=1;\r\nvm=vr.*vrp;\r\n%vm=repmat(v,Lv,1).*repmat(v',1,Lv);\r\nvm2(vm(:))=1;\r\nscr=nnz(vm2);\r\nif scr\u003eBest,pass=false;end\r\ntoc\r\nassert(pass)\r\n%%\r\ntic\r\npass=true;\r\nL=80;Best=1001;pmax=11;vmax=300;\r\nv = SP(L,Best,pmax,vmax);\r\nv=unique(floor(v));\r\nv(v\u003c1)=[];\r\nif length(v)~=L,pass=false;end\r\nvm2=zeros(1,v(end)*v(end));\r\nLv=length(v);\r\nvr=repmat(v,Lv,1);vrp=vr';\r\nvp=vr+vrp;\r\n%vp=repmat(v,Lv,1)+repmat(v',1,Lv);\r\nvm2(vp(:))=1;\r\nvm=vr.*vrp;\r\n%vm=repmat(v,Lv,1).*repmat(v',1,Lv);\r\nvm2(vm(:))=1;\r\nscr=nnz(vm2);\r\nif scr\u003eBest,pass=false;end\r\ntoc\r\nassert(pass)\r\n%%\r\ntic\r\npass=true;\r\nL=120;Best=1847;pmax=11;vmax=480;\r\nv = SP(L,Best,pmax,vmax);\r\nv=unique(floor(v));\r\nv(v\u003c1)=[];\r\nif length(v)~=L,pass=false;end\r\nvm2=zeros(1,v(end)*v(end));\r\nLv=length(v);\r\nvr=repmat(v,Lv,1);vrp=vr';\r\nvp=vr+vrp;\r\n%vp=repmat(v,Lv,1)+repmat(v',1,Lv);\r\nvm2(vp(:))=1;\r\nvm=vr.*vrp;\r\n%vm=repmat(v,Lv,1).*repmat(v',1,Lv);\r\nvm2(vm(:))=1;\r\nscr=nnz(vm2);\r\nif scr\u003eBest,pass=false;end\r\ntoc\r\nassert(pass)\r\n%%\r\ntic\r\npass=true;\r\nL=160;Best=2864;pmax=11;vmax=840;\r\nv = SP(L,Best,pmax,vmax);\r\nv=unique(floor(v));\r\nv(v\u003c1)=[];\r\nif length(v)~=L,pass=false;end\r\nvm2=zeros(1,v(end)*v(end));\r\nLv=length(v);\r\nvr=repmat(v,Lv,1);vrp=vr';\r\nvp=vr+vrp;\r\n%vp=repmat(v,Lv,1)+repmat(v',1,Lv);\r\nvm2(vp(:))=1;\r\nvm=vr.*vrp;\r\n%vm=repmat(v,Lv,1).*repmat(v',1,Lv);\r\nvm2(vm(:))=1;\r\nscr=nnz(vm2);\r\nif scr\u003eBest,pass=false;end\r\ntoc\r\nassert(pass)\r\n%%\r\ntic\r\npass=true;\r\nL=200;Best=4000;pmax=13;vmax=900;\r\nv = SP(L,Best,pmax,vmax);\r\nv=unique(floor(v));\r\nv(v\u003c1)=[];\r\nif length(v)~=L,pass=false;end\r\nvm2=zeros(1,v(end)*v(end));\r\nLv=length(v);\r\nvr=repmat(v,Lv,1);vrp=vr';\r\nvp=vr+vrp;\r\n%vp=repmat(v,Lv,1)+repmat(v',1,Lv);\r\nvm2(vp(:))=1;\r\nvm=vr.*vrp;\r\n%vm=repmat(v,Lv,1).*repmat(v',1,Lv);\r\nvm2(vm(:))=1;\r\nscr=nnz(vm2);\r\nif scr\u003eBest,pass=false;end\r\ntoc\r\nassert(pass)\r\n%%\r\ntic\r\npass=true;\r\nL=280;Best=6632;pmax=13;vmax=1800;\r\nv = SP(L,Best,pmax,vmax);\r\nv=unique(floor(v));\r\nv(v\u003c1)=[];\r\nif length(v)~=L,pass=false;end\r\nvm2=zeros(1,v(end)*v(end));\r\nLv=length(v);\r\nvr=repmat(v,Lv,1);vrp=vr';\r\nvp=vr+vrp;\r\n%vp=repmat(v,Lv,1)+repmat(v',1,Lv);\r\nvm2(vp(:))=1;\r\nvm=vr.*vrp;\r\n%vm=repmat(v,Lv,1).*repmat(v',1,Lv);\r\nvm2(vm(:))=1;\r\nscr=nnz(vm2);\r\nif scr\u003eBest,pass=false;end\r\ntoc\r\nassert(pass)\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":2,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2015-06-04T19:18:55.000Z","updated_at":"2016-02-22T02:59:36.000Z","published_at":"2016-02-22T02:59:36.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis Challenge is to find an integer vector A that creates the minimum set size for (A+A) U (A*A) for a given vector length,\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://oeis.org/A263996\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eOEIS A263996\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. The length, best value, Prime_max, and Value_max will be provided.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe\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://oeis.org/A263996\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eOEIS A263996\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e gives the minimum set sizes thru length 50. Length 7 has best value 26 with Prime_max 5 and Value_max 8. A=[1 2 3 4 5 6 8] yields [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 20 24 25 30 32 36 40 48 64]. The\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://68.173.157.131/Contest/SumsAndProducts1/FinalReport\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eAl Zimmermann Sums Contest Final Report\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e extends A263996 for lengths 40:40:1000 with complete vector solutions. The contest winner, Rokicki, noted his method used P-smooth sets, hill climbing, and random swaps. The contest was a little tougher with only L given.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eExample Input/Output: L=9;Best=36;pmax=5;vmax=12; v = SP(L,Best,pmax,vmax); Yields v=[1 2 3 4 5 6 8 10 12]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eTheory/Hints: The V superset is found using\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/problems/1298-p-smooth-numbers\\\"\u003e\u003cw:r\u003e\u003cw:t\u003epsmooth(pmax,vmax)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e . One observation is that for every v element the set v contains prod of all v element factor permutations. The time eater will be score evaluation. Residual evaluation suggested. A history screen, prior to score evaluation, of prior processed vectors is essential. A quick history pre-screen is vector sum. Replace testing of only values that are not factors of other numbers (eg 2,3 no replace) enables a reasonable time rolling score solution without random for the small test case values.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":527,"title":"Augmented Lagrange Multiplier (ALM) Method","description":"Write a function to find the values of a design variable vector, _x_, that minimizes a scalar objective function, _f_ ( _x_ ), given a function handle to _f_, and a starting guess, _x0_, subject to inequality and equality constraints with function handles _g_\u003c=0 and _h_=0, respectively. Use the Augmented Lagrangian Multiplier Method (a.k.a., the Method of Multipliers) and return the estimate of Lagrange multipliers _u_ for inequalities, and _v_ for equality constraints.","description_html":"\u003cp\u003eWrite a function to find the values of a design variable vector, \u003ci\u003ex\u003c/i\u003e, that minimizes a scalar objective function, \u003ci\u003ef\u003c/i\u003e ( \u003ci\u003ex\u003c/i\u003e ), given a function handle to \u003ci\u003ef\u003c/i\u003e, and a starting guess, \u003ci\u003ex0\u003c/i\u003e, subject to inequality and equality constraints with function handles \u003ci\u003eg\u003c/i\u003e\u0026lt;=0 and \u003ci\u003eh\u003c/i\u003e=0, respectively. Use the Augmented Lagrangian Multiplier Method (a.k.a., the Method of Multipliers) and return the estimate of Lagrange multipliers \u003ci\u003eu\u003c/i\u003e for inequalities, and \u003ci\u003ev\u003c/i\u003e for equality constraints.\u003c/p\u003e","function_template":"function [x,fmin,u,v]=alm(f,g,h,x0,MaxIter)\r\nif isempty(g), g=@(x)0; end\r\nif isempty(h), h=@(x)0; end\r\nif nargin\u003c5, MaxIter=20; end","test_suite":"%% Haftka \u0026 Gurdal, Figure 5.7.1 example\r\nf = @(x) 0.5*x;\r\ng = @(x) 2-x;\r\nx0 = 0;\r\n[xmin,fmin,u]=alm(f,g,[],x0) %#ok\u003c*NOPTS\u003e\r\nxcorrect=2;\r\nucorrect=0.5;\r\nassert(norm(xmin-xcorrect)\u003c1e-3)\r\nassert(abs(fmin-f(xcorrect))\u003c1e-3)\r\nassert(abs(u-ucorrect)\u003c1e-3)\r\n\r\n%% Haftka \u0026 Gurdal, Example 5.7.1\r\nf = @(x) x(1).^2 + 10*x(2).^2;\r\nh = @(x) sum(x)-4;\r\nx0 = [0; 0];\r\n[xmin,fmin,~,v]=alm(f,[],h,x0)\r\nxcorrect=[40; 4]/11;\r\nvcorrect=-7.2727;\r\nassert(norm(xmin-xcorrect)\u003c1e-3)\r\nassert(abs(fmin-f(xcorrect))\u003c1e-4)\r\nassert(abs(v-vcorrect)\u003c1e-2)\r\n\r\n%% Vanderplaats, Figure 5-4 example\r\nf = @(x) sum(x);\r\ng = @(x) [x(1) - 2*x(2) - 2\r\n          8 - 6*x(1) + x(1).^2 - x(2)];\r\nx0 = [0; 0];\r\n[xmin,fmin,u]=alm(f,g,[],x0)\r\nxcorrect=[2; 0];\r\nucorrect=[0.2; 0.6];\r\nassert(norm(xmin-xcorrect)\u003c1e-4)\r\nassert(abs(fmin-f(xcorrect))\u003c1e-4)\r\nassert(norm(u-ucorrect)\u003c1e-2)","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":279,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":6,"test_suite_updated_at":"2012-03-25T02:49:42.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2012-03-25T02:46:55.000Z","updated_at":"2025-09-01T07:55:40.000Z","published_at":"2012-03-25T02:49:42.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eWrite a function to find the values of a design variable vector,\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ex\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, that minimizes a scalar objective function,\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ef\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e (\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ex\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e ), given a function handle to\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ef\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, and a starting guess,\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ex0\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, subject to inequality and equality constraints with function handles\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eg\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e\u0026lt;=0 and\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eh\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e=0, respectively. Use the Augmented Lagrangian Multiplier Method (a.k.a., the Method of Multipliers) and return the estimate of Lagrange multipliers\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eu\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e for inequalities, and\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ev\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e for equality constraints.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":42774,"title":"GJam March 2016 IOW: Clock Dance","description":"This Challenge is derived from \u003chttp://code.google.com/codejam/contest/8274486/dashboard#s=p1 GJam March 2016 Annual I/O for Women Dance Around the Clock\u003e. This is a mix of the small and large data sets.\r\n\r\nThe GJam story goes that D even dancers are arranged clockwise 1:D. Who is adjacent to dancer K after N pair swaps. The odd move swaps positions 1/2,3/4,..D-1/D. The even move swaps positions D/1, 2/3,...D-2/D-1. D=8 [1:8] becomes [2 1 4 3 6 5 8 7] after the first swap. After second swap we see [7 4 1 6 3 8 5 2].  \r\n\r\n\u003c\u003chttp://code.google.com/codejam/contest/images/?image=dance_around_the_clock.png\u0026p=5733344260128768\u0026c=8274486\u003e\u003e\r\n\r\n*Input:* [D K N] , 4\u003c=D\u003c=1E8, 1\u003c=K\u003c=D, 1\u003c=N\u003c=1E8\r\n\r\n*Output:* [KCW KCCW] , KCW is dancer to left of Kth dancer after N moves\r\n\r\n*Examples:* [m] [v]\r\n\r\n  [8 3 1] creates v=[6 4]\r\n  [8 4 2] creates v=[1 7]\r\n  [6 6 1] creates v=[5 3]\r\n \r\n\r\n*\u003chttp://code.google.com/codejam Google Code Jam 2016 Open Qualifier: April 8, 2016\u003e*\r\n\r\n*Contest Theory:* The small case was D\u003c10 and N\u003c10. This could be done brute force in the 5 minutes of entry submission allowed. However, this is clearly a case of modulo math so might as well solve the unbounded case of D/N \u003c1E8. The number being assigned as 1:D leads to confusion as mod maps to 0:D-1. Suggest offset the K dancer number by 1 for processing and then correct for the final answer. Mod is fun as mod(-1,8) yields a useful 7. Quick observation is for offsetted K vector [0:D-1] the Evens move CW and the Odds move CCW. One method used 5 mod calls to solve.","description_html":"\u003cp\u003eThis Challenge is derived from \u003ca href = \"http://code.google.com/codejam/contest/8274486/dashboard#s=p1\"\u003eGJam March 2016 Annual I/O for Women Dance Around the Clock\u003c/a\u003e. This is a mix of the small and large data sets.\u003c/p\u003e\u003cp\u003eThe GJam story goes that D even dancers are arranged clockwise 1:D. Who is adjacent to dancer K after N pair swaps. The odd move swaps positions 1/2,3/4,..D-1/D. The even move swaps positions D/1, 2/3,...D-2/D-1. D=8 [1:8] becomes [2 1 4 3 6 5 8 7] after the first swap. After second swap we see [7 4 1 6 3 8 5 2].\u003c/p\u003e\u003cimg src = \"http://code.google.com/codejam/contest/images/?image=dance_around_the_clock.png\u0026p=5733344260128768\u0026c=8274486\"\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e [D K N] , 4\u0026lt;=D\u0026lt;=1E8, 1\u0026lt;=K\u0026lt;=D, 1\u0026lt;=N\u0026lt;=1E8\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e [KCW KCCW] , KCW is dancer to left of Kth dancer after N moves\u003c/p\u003e\u003cp\u003e\u003cb\u003eExamples:\u003c/b\u003e [m] [v]\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003e[8 3 1] creates v=[6 4]\r\n[8 4 2] creates v=[1 7]\r\n[6 6 1] creates v=[5 3]\r\n\u003c/pre\u003e\u003cp\u003e\u003cb\u003e\u003ca href = \"http://code.google.com/codejam\"\u003eGoogle Code Jam 2016 Open Qualifier: April 8, 2016\u003c/a\u003e\u003c/b\u003e\u003c/p\u003e\u003cp\u003e\u003cb\u003eContest Theory:\u003c/b\u003e The small case was D\u0026lt;10 and N\u0026lt;10. This could be done brute force in the 5 minutes of entry submission allowed. However, this is clearly a case of modulo math so might as well solve the unbounded case of D/N \u0026lt;1E8. The number being assigned as 1:D leads to confusion as mod maps to 0:D-1. Suggest offset the K dancer number by 1 for processing and then correct for the final answer. Mod is fun as mod(-1,8) yields a useful 7. Quick observation is for offsetted K vector [0:D-1] the Evens move CW and the Odds move CCW. One method used 5 mod calls to solve.\u003c/p\u003e","function_template":"function v=ClockDance(m)\r\n% m [D K N] % Num Dancers, K dancernumber, N swaps\r\n% v=[CW_dancenumber CCW_dancenumber]  [pos+1, pos-1]\r\n v=[0 0];\r\n% This is a mod mod mod type contest question\r\n% Note mod(-1,8)=7\r\n% Note changing dancers from 1:D to 0:D-1 helps mod normalcy and brain function\r\n% At the end add 1 back to the v vector\r\n\r\nend","test_suite":"%%\r\nm=[8 3 1 ];\r\nv=ClockDance(m);\r\nvexp=[6 4 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[8 4 2 ];\r\nv=ClockDance(m);\r\nvexp=[1 7 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[4 1 8 ];\r\nv=ClockDance(m);\r\nvexp=[2 4 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[10 9 6 ];\r\nv=ClockDance(m);\r\nvexp=[2 10 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[4 2 9 ];\r\nv=ClockDance(m);\r\nvexp=[1 3 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[8 2 10 ];\r\nv=ClockDance(m);\r\nvexp=[7 5 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[8 8 7 ];\r\nv=ClockDance(m);\r\nvexp=[3 1 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[4 4 3 ];\r\nv=ClockDance(m);\r\nvexp=[3 1 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[6 6 1 ];\r\nv=ClockDance(m);\r\nvexp=[5 3 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[4 4 6 ];\r\nv=ClockDance(m);\r\nvexp=[1 3 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[4 2 5 ];\r\nv=ClockDance(m);\r\nvexp=[1 3 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[4 4 1 ];\r\nv=ClockDance(m);\r\nvexp=[3 1 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[4 1 1 ];\r\nv=ClockDance(m);\r\nvexp=[4 2 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[6 2 2 ];\r\nv=ClockDance(m);\r\nvexp=[5 3 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[6 1 10 ];\r\nv=ClockDance(m);\r\nvexp=[4 2 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[8 3 1 ];\r\nv=ClockDance(m);\r\nvexp=[6 4 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[8 4 2 ];\r\nv=ClockDance(m);\r\nvexp=[1 7 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[4 1 8 ];\r\nv=ClockDance(m);\r\nvexp=[2 4 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[72137284 16112525 91351141 ];\r\nv=ClockDance(m);\r\nvexp=[54540240 54540238 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[155546 123001 56937611 ];\r\nv=ClockDance(m);\r\nvexp=[138552 138550 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[78548986 44806245 20024652 ];\r\nv=ClockDance(m);\r\nvexp=[6306564 6306562 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[4 2 5 ];\r\nv=ClockDance(m);\r\nvexp=[1 3 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[61256952 31789482 70629381 ];\r\nv=ClockDance(m);\r\nvexp=[13044625 13044623 ];\r\nassert(isequal(vexp,v))\r\n\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":10,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2016-03-16T04:41:57.000Z","updated_at":"2016-03-16T05:17:21.000Z","published_at":"2016-03-16T05:10: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\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis Challenge is derived from\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://code.google.com/codejam/contest/8274486/dashboard#s=p1\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eGJam March 2016 Annual I/O for Women Dance Around the Clock\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. This is a mix of the small and large data sets.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe GJam story goes that D even dancers are arranged clockwise 1:D. Who is adjacent to dancer K after N pair swaps. The odd move swaps positions 1/2,3/4,..D-1/D. The even move swaps positions D/1, 2/3,...D-2/D-1. D=8 [1:8] becomes [2 1 4 3 6 5 8 7] after the first swap. After second swap we see [7 4 1 6 3 8 5 2].\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e [D K N] , 4\u0026lt;=D\u0026lt;=1E8, 1\u0026lt;=K\u0026lt;=D, 1\u0026lt;=N\u0026lt;=1E8\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 [KCW KCCW] , KCW is dancer to left of Kth dancer after N 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\u003eExamples:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e [m] [v]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[[8 3 1] creates v=[6 4]\\n[8 4 2] creates v=[1 7]\\n[6 6 1] creates v=[5 3]]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://code.google.com/codejam\\\"\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eGoogle Code Jam 2016 Open Qualifier: April 8, 2016\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eContest Theory:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e The small case was D\u0026lt;10 and N\u0026lt;10. This could be done brute force in the 5 minutes of entry submission allowed. However, this is clearly a case of modulo math so might as well solve the unbounded case of D/N \u0026lt;1E8. The number being assigned as 1:D leads to confusion as mod maps to 0:D-1. Suggest offset the K dancer number by 1 for processing and then correct for the final answer. Mod is fun as mod(-1,8) yields a useful 7. Quick observation is for offsetted K vector [0:D-1] the Evens move CW and the Odds move CCW. One method used 5 mod calls to solve.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":42765,"title":"Maximize Non-Co-Planar Points in an N-Cube","description":"This Challenge is to find a set with the maximum number of integer points that create planar surfaces with a maximum of three points from the set. No four points may be co-planar.\r\nGiven the size N and the number of expected points Q find a set of Q points. Only N=2/Q=5 and N=3/Q=8 will be tested. N=4/Q=10 or N=5/Q=13 are too large to process.\r\n\r\n  N=2 contains 8 points [0,0,0;0,1,0;1,0,0;1,1,0;0,0,1;0,1,1;1,0,1;1,1,1]\r\n  N=3 contains 27 points [0,0,0;0,0,1;0,0,2;...2,2,2]\r\n\r\nOutput is a Qx3 matrix of the non-co-planar points.\r\n\r\nReference: The \u003chttp://68.173.157.131/Contest/Tetrahedra March 2016 Al Zimmermann Non-Coplanar contest\u003e is N=primes less than 100. Maximize the number of points in an NxNxN cube with no 4 points in a common plane.\r\n\r\nTheory: The N=2 and N=3 cases can be processed by brute force if care is taken. Assumption of [0,0,0] greatly reduces number of cases. Solving \u003chttp://www.mathworks.com/matlabcentral/cody/problems/42762-is-3d-point-set-co-planar Cody Co-Planar Check\u003e may improve speed. ","description_html":"\u003cp\u003eThis Challenge is to find a set with the maximum number of integer points that create planar surfaces with a maximum of three points from the set. No four points may be co-planar.\r\nGiven the size N and the number of expected points Q find a set of Q points. Only N=2/Q=5 and N=3/Q=8 will be tested. N=4/Q=10 or N=5/Q=13 are too large to process.\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003eN=2 contains 8 points [0,0,0;0,1,0;1,0,0;1,1,0;0,0,1;0,1,1;1,0,1;1,1,1]\r\nN=3 contains 27 points [0,0,0;0,0,1;0,0,2;...2,2,2]\r\n\u003c/pre\u003e\u003cp\u003eOutput is a Qx3 matrix of the non-co-planar points.\u003c/p\u003e\u003cp\u003eReference: The \u003ca href = \"http://68.173.157.131/Contest/Tetrahedra\"\u003eMarch 2016 Al Zimmermann Non-Coplanar contest\u003c/a\u003e is N=primes less than 100. Maximize the number of points in an NxNxN cube with no 4 points in a common plane.\u003c/p\u003e\u003cp\u003eTheory: The N=2 and N=3 cases can be processed by brute force if care is taken. Assumption of [0,0,0] greatly reduces number of cases. Solving \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/problems/42762-is-3d-point-set-co-planar\"\u003eCody Co-Planar Check\u003c/a\u003e may improve speed.\u003c/p\u003e","function_template":"function m=MaxNonCoplanarPts(N,Q);\r\n% Place Q or more points in an 0:N-1 #D grid such that each plane created uses only 3 points from the set provided\r\n% N is Cube size\r\n% Q is expected number of points in solution\r\n% Hint: Point [0,0,0] can be assumed to be in the solution for N=2 and N=3\r\n% N=3 is the 27 points [0,0,0;0,0,1;0,0,2;...2,2,2]\r\n  m=[];\r\nend","test_suite":"%%\r\nN=2;\r\nQ=5;\r\nm=MaxNonCoplanarPts(N,Q);\r\nm=floor(abs(m))\r\n% Perform m check\r\nvalid=1;\r\nif size(m,1)\u003cQ,valid=0;end % Must be Q pts or more\r\nif max(m(:))\u003eN-1,valid=0;end\r\npset=nchoosek(1:size(m,1),4);\r\nfor i=1:length(pset)\r\n m4=m(pset(i,:),:);\r\n% Coplanar check method courtesy of Tim\r\n if ~det([m4 ones(4,1)]) % coplanar det=0\r\n  valid=0;\r\n  break\r\n end\r\nend\r\nassert(isequal(1,valid))\r\n%%\r\nN=3;\r\nQ=8;\r\nm=MaxNonCoplanarPts(N,Q);\r\nm=floor(abs(m))\r\n% Perform m check\r\nvalid=1;\r\nif size(m,1)\u003cQ,valid=0;end % Must be Q pts or more\r\nif max(m(:))\u003eN-1,valid=0;end\r\npset=nchoosek(1:size(m,1),4);\r\nfor i=1:length(pset)\r\n m4=m(pset(i,:),:);\r\n% Coplanar check method courtesy of Tim\r\n if ~det([m4 ones(4,1)]) % coplanar det=0\r\n  valid=0;\r\n  break\r\n end\r\nend\r\nassert(isequal(1,valid))\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":6,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2016-03-07T00:22:02.000Z","updated_at":"2016-03-07T01:01:33.000Z","published_at":"2016-03-07T01:01:33.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis Challenge is to find a set with the maximum number of integer points that create planar surfaces with a maximum of three points from the set. No four points may be co-planar. Given the size N and the number of expected points Q find a set of Q points. Only N=2/Q=5 and N=3/Q=8 will be tested. N=4/Q=10 or N=5/Q=13 are too large to process.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[N=2 contains 8 points [0,0,0;0,1,0;1,0,0;1,1,0;0,0,1;0,1,1;1,0,1;1,1,1]\\nN=3 contains 27 points [0,0,0;0,0,1;0,0,2;...2,2,2]]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eOutput is a Qx3 matrix of the non-co-planar points.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eReference: The\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://68.173.157.131/Contest/Tetrahedra\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eMarch 2016 Al Zimmermann Non-Coplanar contest\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e is N=primes less than 100. Maximize the number of points in an NxNxN cube with no 4 points in a common plane.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eTheory: The N=2 and N=3 cases can be processed by brute force if care is taken. Assumption of [0,0,0] greatly reduces number of cases. Solving\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/problems/42762-is-3d-point-set-co-planar\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eCody Co-Planar Check\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e may improve speed.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":42341,"title":"LMI Twins : Fuzzy Image matching","description":"The image below from \u003chttp://logicmastersindia.com/2016/04P/ Logic Masters India Marathon 2016\u003e is puzzle \"Twins Co-Ordinates\" with PDF password of \"TCO_cLiEsh\".\r\n\r\nThe challenge is to find the six matching image squares given a [612,1078,3] PNG file screen captured using Snipping Tool. The matching squares may be rotated but are not reflected. The cells will not match perfectly and the PNG file is oversize into the white around the whole black frame. The image grid is 10x18. Return a 6x4 array of [r1,c1,r2,c2;...] where cell [r1,c1] is a match for [r2,c2] with r(1:10) and c(1:18).\r\nA pscript to obfuscate the solution is implemented. The method for creating a Cody pscript is included in the Test Suite.\r\n\r\n\u003c\u003chttps://sites.google.com/site/razapor/matlab_cody/Twins.PNG\u003e\u003e\r\n\r\nMethod Hints:\r\nMerge into a BW 612x1078 image;Trim outer white space;Locate Top Left corner of each cell;create cell array of 180  squares;grab only 55x55 squares to enable rotation check;Problem size is only  4*180*179/2;Filter positive and negative deltas separately with a + convolution; check residual delta \u003c threshold.","description_html":"\u003cp\u003eThe image below from \u003ca href = \"http://logicmastersindia.com/2016/04P/\"\u003eLogic Masters India Marathon 2016\u003c/a\u003e is puzzle \"Twins Co-Ordinates\" with PDF password of \"TCO_cLiEsh\".\u003c/p\u003e\u003cp\u003eThe challenge is to find the six matching image squares given a [612,1078,3] PNG file screen captured using Snipping Tool. The matching squares may be rotated but are not reflected. The cells will not match perfectly and the PNG file is oversize into the white around the whole black frame. The image grid is 10x18. Return a 6x4 array of [r1,c1,r2,c2;...] where cell [r1,c1] is a match for [r2,c2] with r(1:10) and c(1:18).\r\nA pscript to obfuscate the solution is implemented. The method for creating a Cody pscript is included in the Test Suite.\u003c/p\u003e\u003cimg src = \"https://sites.google.com/site/razapor/matlab_cody/Twins.PNG\"\u003e\u003cp\u003eMethod Hints:\r\nMerge into a BW 612x1078 image;Trim outer white space;Locate Top Left corner of each cell;create cell array of 180  squares;grab only 55x55 squares to enable rotation check;Problem size is only  4*180*179/2;Filter positive and negative deltas separately with a + convolution; check residual delta \u0026lt; threshold.\u003c/p\u003e","function_template":"function m=LMI_Twins(fn)\r\n% Grab png \r\nm=[];\r\npict=imread(fn); % [612,1078,3] size png,  sum(pict,3) may be useful\r\n% useful sub_pict size of 55x55\r\n\r\nend\r\n","test_suite":"%%\r\n% obfuscated check function\r\ntic\r\nfh = fopen('Eval_Twins.p','wb');\r\nfwrite(fh, hex2dec(reshape('7630312E30307630302E30300002901CC14FDFB100000081000000D80000012A48DF9D54B1FA232306002212C284B03C55EA944CADBBEC102FFDF678B732282B51740342451D4E91F086ABE90CD97AEA717741F995FCF6ED6A372B6C44524D61F2179DA76458DBA2B9AA01529272E90AD613EA63642EEECCDE54CD649A84090DE86A418D761593CBABBD4B17018634CA5451EA6A6F4386B000CBE73A136AFE2CE5946FD8FD16225562B3414B8C6268F085E3E3E8F1CFCFBBA469FCC5E0343472A562EAD16FFC1B7D27730414ECC1D42F6EB98289E998DA2EA3F4F820A10F9B23E296CDE97331C46563B702180857770F7A14412389BC1BA2',2,[]).'));\r\nfclose(fh);\r\nrehash path;\r\ntoc\r\n%%\r\ntic\r\nurl='https://sites.google.com/site/razapor/matlab_cody/Twins.PNG?attredirects=0\u0026d=1';\r\nurlwrite(url,'Twins.PNG');\r\nfprintf('url write complete %.1f\\n',toc)\r\n\r\nfn='Twins.PNG';\r\nm=LMI_Twins(fn);\r\nassert(Eval_Twins(m));\r\nfprintf('Process Complete %.1f\\n',toc)\r\n%%\r\n% Creation Process for a Cody p file\r\n% Create function  func_name.m\r\n% pcode func_name\r\n% fn='func_name.p';\r\n% fr=fopen(fn,'r');\r\n% m=fread(fr);\r\n% fclose(fr);\r\n% fw=fopen([fn(1:end-1) 'txt'],'w');\r\n% fprintf(fw,'%s',dec2hex(m)');\r\n% fclose(fw);\r\n% use wordpad to open func_name.txt\r\n% In cody in first block write:\r\n% fh = fopen('func_name.p','wb');\r\n% fwrite(fh, hex2dec(reshape('INSERT WORDPAD TEXT HERE',2,[]).'));\r\n% fclose(fh);\r\n% rehash path;","published":true,"deleted":false,"likes_count":1,"comments_count":0,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":3,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2015-05-28T19:12:46.000Z","updated_at":"2016-05-12T01:56:20.000Z","published_at":"2016-05-12T01:56:20.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.png\"}],\"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 image below from\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://logicmastersindia.com/2016/04P/\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eLogic Masters India Marathon 2016\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e is puzzle \\\"Twins Co-Ordinates\\\" with PDF password of \\\"TCO_cLiEsh\\\".\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe challenge is to find the six matching image squares given a [612,1078,3] PNG file screen captured using Snipping Tool. The matching squares may be rotated but are not reflected. The cells will not match perfectly and the PNG file is oversize into the white around the whole black frame. The image grid is 10x18. Return a 6x4 array of [r1,c1,r2,c2;...] where cell [r1,c1] is a match for [r2,c2] with r(1:10) and c(1:18). A pscript to obfuscate the solution is implemented. The method for creating a Cody pscript is included in the Test Suite.\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\u003eMethod Hints: Merge into a BW 612x1078 image;Trim outer white space;Locate Top Left corner of each cell;create cell array of 180 squares;grab only 55x55 squares to enable rotation check;Problem size is only 4*180*179/2;Filter positive and negative deltas separately with a + convolution; check residual delta \u0026lt; threshold.\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.png\",\"contentType\":\"image/png\",\"content\":\"data:image/png;base64,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\"}]}"},{"id":44784,"title":"Project Euler: Problem 14 Longest Collatz sequence(harder version)","description":"This problem is a harder version of \"Problem 44448. Project Euler: Problem 14 Longest Collatz sequence\", because of time limits. \u003chttps://ww2.mathworks.cn/matlabcentral/cody/problems/44448\u003e \r\n\r\nThe following iterative sequence is defined for the set of positive integers:\r\nn → n/2 (n is even) n → 3n + 1 (n is odd)\r\nUsing the rule above and starting with 13, we generate the following sequence:\r\n13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1 It can be seen that this sequence (starting at 13 and finishing at 1) contains 10 terms. Although it has not been proved yet (Collatz Problem), it is thought that all starting numbers finish at 1.\r\nWhich starting number, no more than N, produces the longest chain, and how long? Don't cheat!","description_html":"\u003cp\u003eThis problem is a harder version of \"Problem 44448. Project Euler: Problem 14 Longest Collatz sequence\", because of time limits. \u003ca href = \"https://ww2.mathworks.cn/matlabcentral/cody/problems/44448\"\u003ehttps://ww2.mathworks.cn/matlabcentral/cody/problems/44448\u003c/a\u003e\u003c/p\u003e\u003cp\u003eThe following iterative sequence is defined for the set of positive integers:\r\nn → n/2 (n is even) n → 3n + 1 (n is odd)\r\nUsing the rule above and starting with 13, we generate the following sequence:\r\n13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1 It can be seen that this sequence (starting at 13 and finishing at 1) contains 10 terms. Although it has not been proved yet (Collatz Problem), it is thought that all starting numbers finish at 1.\r\nWhich starting number, no more than N, produces the longest chain, and how long? Don't cheat!\u003c/p\u003e","function_template":"function y = euler014_v2(x)\r\n  y = x;\r\nend","test_suite":"1\r\n%%\r\nassessFunctionAbsence({'tic','toc','pause','etime','clock','now','str2num','timer'},'FileName','euler014_v2.m')\r\n\r\n2\r\n%%\r\nN = 2e8;\r\nnum_correct = 169941673;\r\nlen_correct = 954;\r\ntic\r\n[num, len] = euler014_v2(N);\r\nt=toc\r\nassert(t\u003e1);\r\nassert(isequal(num, num_correct));\r\nassert(isequal(len, len_correct));\r\n\r\n3\r\n%%\r\nN = 4e8;\r\nnum_correct = 268549803;\r\nlen_correct = 965;\r\ntic\r\n[num, len] = euler014_v2(N);\r\nt=toc\r\nassert(t\u003e1);\r\nassert(isequal(num, num_correct));\r\nassert(isequal(len, len_correct));\r\n\r\n\r\n","published":true,"deleted":false,"likes_count":1,"comments_count":4,"created_by":3668,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":3,"test_suite_updated_at":"2018-11-11T06:11:05.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2018-11-09T16:59:43.000Z","updated_at":"2018-11-11T06:11:05.000Z","published_at":"2018-11-09T16:59:43.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis problem is a harder version of \\\"Problem 44448. Project Euler: Problem 14 Longest Collatz sequence\\\", because of time limits.\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://ww2.mathworks.cn/matlabcentral/cody/problems/44448\\\"\u003e\u003cw:r\u003e\u003cw:t\u003e\u0026lt;https://ww2.mathworks.cn/matlabcentral/cody/problems/44448\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e\u0026gt;\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe following iterative sequence is defined for the set of positive integers: n → n/2 (n is even) n → 3n + 1 (n is odd) Using the rule above and starting with 13, we generate the following sequence: 13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1 It can be seen that this sequence (starting at 13 and finishing at 1) contains 10 terms. Although it has not been proved yet (Collatz Problem), it is thought that all starting numbers finish at 1. Which starting number, no more than N, produces the longest chain, and how long? Don't cheat!\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":44832,"title":"Generate Convolution Matrix of 2D Kernel with Different Convolution Shapes (Full, Same, Valid)","description":"In this problem the challenge is to build the Matrix Form equivalent of the function `conv2()` of MATLAB.\r\n\r\nThe function to be built will generate a sparse matrix `mK` which is the convolution matrix of the 2D Kernel 'mH' (Which is an input to the function).  \r\nThe input to the function is the 2D Kernel and dimensions of the image to apply the convolution upon and the shape of the convolution ('full', 'same', 'valid' as in 'conv2()').\r\n\r\nThe output sparse matrix should match the output of using 'conv2()' on the same image using the same convolution shape.\r\n\r\nFor instance:\r\n\r\n  CONVOLUTION_SHAPE_FULL  = 1;\r\n  CONVOLUTION_SHAPE_SAME  = 2;\r\n  CONVOLUTION_SHAPE_VALID = 3;\r\n  \r\n  numRowsImage = 100;\r\n  numColsImage = 80;\r\n  \r\n  numRowsKernel = 7;\r\n  numColsKernel = 5;\r\n  \r\n  mI = rand(numRowsImage, numColsImage);\r\n  mH = rand(numRowsKernel, numColsKernel);\r\n  \r\n  maxThr = 1e-9;\r\n  \r\n  \r\n  %% Full Convolution\r\n  \r\n  convShape       = CONVOLUTION_SHAPE_FULL;\r\n  \r\n  numRowsOut = numRowsImage + numRowsKernel - 1;\r\n  numColsOut = numColsImage + numColsKernel - 1;\r\n  \r\n  mORef   = conv2(mI, mH, 'full');\r\n  mK      = CreateImageConvMtx(mH, numRowsImage, numColsImage, convShape);\r\n  mO      = reshape(mK * mI(:), numRowsOut, numColsOut);\r\n  \r\n  mE = mO - mORef;\r\n  assert(max(abs(mE(:))) \u003c maxThr);\r\n\r\nThe test case will examine all 3 modes.\r\nTry to solve it once with very clear code (No vectorization tricks) and then optimize.\r\n\r\nA good way to build the output sparse function is using:\r\n\r\n  mK = sparse(vRows, vCols, vVals, numElementsOutputImage, numElementsInputImage);\r\n\r\nLook for the documentation of `sparse()` function for more details.","description_html":"\u003cp\u003eIn this problem the challenge is to build the Matrix Form equivalent of the function `conv2()` of MATLAB.\u003c/p\u003e\u003cp\u003eThe function to be built will generate a sparse matrix `mK` which is the convolution matrix of the 2D Kernel 'mH' (Which is an input to the function).  \r\nThe input to the function is the 2D Kernel and dimensions of the image to apply the convolution upon and the shape of the convolution ('full', 'same', 'valid' as in 'conv2()').\u003c/p\u003e\u003cp\u003eThe output sparse matrix should match the output of using 'conv2()' on the same image using the same convolution shape.\u003c/p\u003e\u003cp\u003eFor instance:\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003eCONVOLUTION_SHAPE_FULL  = 1;\r\nCONVOLUTION_SHAPE_SAME  = 2;\r\nCONVOLUTION_SHAPE_VALID = 3;\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003enumRowsImage = 100;\r\nnumColsImage = 80;\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003enumRowsKernel = 7;\r\nnumColsKernel = 5;\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003emI = rand(numRowsImage, numColsImage);\r\nmH = rand(numRowsKernel, numColsKernel);\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003emaxThr = 1e-9;\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003e%% Full Convolution\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003econvShape       = CONVOLUTION_SHAPE_FULL;\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003enumRowsOut = numRowsImage + numRowsKernel - 1;\r\nnumColsOut = numColsImage + numColsKernel - 1;\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003emORef   = conv2(mI, mH, 'full');\r\nmK      = CreateImageConvMtx(mH, numRowsImage, numColsImage, convShape);\r\nmO      = reshape(mK * mI(:), numRowsOut, numColsOut);\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003emE = mO - mORef;\r\nassert(max(abs(mE(:))) \u0026lt; maxThr);\r\n\u003c/pre\u003e\u003cp\u003eThe test case will examine all 3 modes.\r\nTry to solve it once with very clear code (No vectorization tricks) and then optimize.\u003c/p\u003e\u003cp\u003eA good way to build the output sparse function is using:\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003emK = sparse(vRows, vCols, vVals, numElementsOutputImage, numElementsInputImage);\r\n\u003c/pre\u003e\u003cp\u003eLook for the documentation of `sparse()` function for more details.\u003c/p\u003e","function_template":"function [ mK ] = CreateImageConvMtx( mH, numRows, numCols, convShape )\r\n%Generates a Convolution Matrix for the 2D Kernel (The Matrix mH) with\r\n%support for different convolution shapes (Full / Same / Valid).\r\n% Input:\r\n%   - mH                -   Input 2D Convolution Kernel.\r\n%                           Structure: Matrix.\r\n%                           Type: 'Single' / 'Double'.\r\n%                           Range: (-inf, inf).\r\n%   - numRows           -   Number of Rows.\r\n%                           Number of rows in the output convolution\r\n%                           matrix.\r\n%                           Structure: Scalar.\r\n%                           Type: 'Single' / 'Double'.\r\n%                           Range: {1, 2, 3, ...}.\r\n%   - numCols           -   Number of Columns.\r\n%                           Number of columns in the output convolution\r\n%                           matrix.\r\n%                           Structure: Scalar.\r\n%                           Type: 'Single' / 'Double'.\r\n%                           Range: {1, 2, 3, ...}.\r\n%   - convShape         -   Convolution Shape.\r\n%                           The shape of the convolution which the output\r\n%                           convolution matrix should represent. The\r\n%                           options should match MATLAB's conv2() function\r\n%                           - Full / Same / Valid.\r\n%                           Structure: Scalar.\r\n%                           Type: 'Single' / 'Double'.\r\n%                           Range: {1, 2, 3}.\r\n% Output:\r\n%   - mK                -   Convolution Matrix.\r\n%                           The output convolution matrix. Multiplying in\r\n%                           the column stack form on an image should be\r\n%                           equivalent to applying convolution on the\r\n%                           image.\r\n%                           Structure: Matrix (Sparse).\r\n%                           Type: 'Single' / 'Double'.\r\n%                           Range: (-inf, inf).\r\n% References:\r\n%   1.  MATLAB's 'convmtx2()' - https://www.mathworks.com/help/images/ref/convmtx2.html.\r\n% Remarks:\r\n%   1.  gf\r\n% TODO:\r\n%   1.  \r\n%   Release Notes:\r\n%   -   1.0.000     dd/mm/yyyy  firstName lastName\r\n%       *   First release version.\r\n% ----------------------------------------------------------------------------------------------- %\r\n\r\nCONVOLUTION_SHAPE_FULL  = 1;\r\nCONVOLUTION_SHAPE_SAME  = 2;\r\nCONVOLUTION_SHAPE_VALID = 3;\r\n\r\nswitch(convShape)\r\n    case(CONVOLUTION_SHAPE_FULL)\r\n        % Code for the 'full' case\r\n    case(CONVOLUTION_SHAPE_SAME)\r\n        % Code for the 'same' case\r\n    case(CONVOLUTION_SHAPE_VALID)\r\n        % Code for the 'valid' case\r\nend\r\n\r\n\r\nend\r\n\r\n","test_suite":"%% Testing\r\n\r\n\r\nCONVOLUTION_SHAPE_FULL  = 1;\r\nCONVOLUTION_SHAPE_SAME  = 2;\r\nCONVOLUTION_SHAPE_VALID = 3;\r\n\r\nmaxThr = 1e-9;\r\n\r\n\r\nfor numRowsImage = 28:32\r\n    for numColsImage = 28:32\r\n        \r\n        mI = rand(numRowsImage, numColsImage);\r\n        \r\n        for numRowsKernel = 3:7\r\n            for numColsKernel = 3:7\r\n                \r\n                mH = rand(numRowsKernel, numColsKernel);\r\n                \r\n                for convShape = 1:3\r\n                    \r\n                    switch(convShape)\r\n                        case(CONVOLUTION_SHAPE_FULL)\r\n                            numRowsOut = numRowsImage + numRowsKernel - 1;\r\n                            numColsOut = numColsImage + numColsKernel - 1;\r\n                            \r\n                            convShapeString = 'full';\r\n                        case(CONVOLUTION_SHAPE_SAME)\r\n                            numRowsOut = numRowsImage;\r\n                            numColsOut = numColsImage;\r\n                            \r\n                            convShapeString = 'same';\r\n                        case(CONVOLUTION_SHAPE_VALID)\r\n                            numRowsOut = numRowsImage - numRowsKernel + 1;\r\n                            numColsOut = numColsImage - numColsKernel + 1;\r\n                            \r\n                            convShapeString = 'valid';\r\n                    end\r\n                    \r\n                    mORef   = conv2(mI, mH, convShapeString);\r\n                    mK      = CreateImageConvMtx(mH, numRowsImage, numColsImage, convShape);\r\n                    mO      = reshape(mK * mI(:), numRowsOut, numColsOut);\r\n                    \r\n                    disp([' ']);\r\n                    disp(['Validating solution for the following parameters:']);\r\n                    disp(['Image Size - [', num2str(numRowsImage), ' x ', num2str(numColsImage), ']']);\r\n                    disp(['Kernel Size - [', num2str(numRowsKernel), ' x ', num2str(numColsKernel), ']']);\r\n                    disp(['Convolution Shape - ', convShapeString]);\r\n                    \r\n                    mE = mO - mORef;\r\n                    maxAbsDev = max(abs(mE(:)));\r\n                    if(maxAbsDev \u003e= maxThr)\r\n                        disp([' ']);\r\n                        disp(['Validation Failed']);\r\n                        disp([' ']);\r\n                    end\r\n                    assert(maxAbsDev \u003c maxThr);\r\n                    \r\n                end\r\n            end\r\n        end\r\n    end\r\nend\r\n            \r\n\r\n\r\n\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":6204,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":3,"test_suite_updated_at":"2019-01-15T23:13:37.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2019-01-15T21:20:18.000Z","updated_at":"2019-01-15T23:13:37.000Z","published_at":"2019-01-15T21:20:18.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eIn this problem the challenge is to build the Matrix Form equivalent of the function `conv2()` of MATLAB.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe function to be built will generate a sparse matrix `mK` which is the convolution matrix of the 2D Kernel 'mH' (Which is an input to the function). The input to the function is the 2D Kernel and dimensions of the image to apply the convolution upon and the shape of the convolution ('full', 'same', 'valid' as in 'conv2()').\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe output sparse matrix should match the output of using 'conv2()' on the same image using the same convolution shape.\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\u003eFor instance:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[CONVOLUTION_SHAPE_FULL  = 1;\\nCONVOLUTION_SHAPE_SAME  = 2;\\nCONVOLUTION_SHAPE_VALID = 3;\\n\\nnumRowsImage = 100;\\nnumColsImage = 80;\\n\\nnumRowsKernel = 7;\\nnumColsKernel = 5;\\n\\nmI = rand(numRowsImage, numColsImage);\\nmH = rand(numRowsKernel, numColsKernel);\\n\\nmaxThr = 1e-9;\\n\\n%%Full Convolution\\n\\nconvShape       = CONVOLUTION_SHAPE_FULL;\\n\\nnumRowsOut = numRowsImage + numRowsKernel - 1;\\nnumColsOut = numColsImage + numColsKernel - 1;\\n\\nmORef   = conv2(mI, mH, 'full');\\nmK      = CreateImageConvMtx(mH, numRowsImage, numColsImage, convShape);\\nmO      = reshape(mK * mI(:), numRowsOut, numColsOut);\\n\\nmE = mO - mORef;\\nassert(max(abs(mE(:))) \u003c maxThr);]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe test case will examine all 3 modes. Try to solve it once with very clear code (No vectorization tricks) and then optimize.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eA good way to build the output sparse function is using:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[mK = sparse(vRows, vCols, vVals, numElementsOutputImage, numElementsInputImage);]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eLook for the documentation of `sparse()` function for more details.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":44545,"title":"\"Percentages may not total 100 due to rounding\"","description":"*Percentages* are commonly *rounded* when presented in tables.  As a result, the sum of the individual numbers does not always add up to 100%.  A warning is therefore sometimes appended to such tables, along the lines: _\"Percentages may not total 100 due to rounding\"_.\r\n\r\nEXAMPLE 1:\r\nA survey of eleven people for their opinion on a new policy found five to be in favour, five opposed, and one undecided/neutral.  Percentage-wise this becomes\r\n\r\n  In favour:          45% (5 of 11)\r\n  Undecided/neutral:   9% (1 of 11)  \r\n  Opposed:            45% (5 of 11)  \r\n\r\nThe total of these is 99%, rather than the expected 100%.  Despite this conflict, in this example *all of the individual numbers have been correctly entered*.  \r\n\r\nEXAMPLE 2:\r\nIn the same report, a survey of a further ten people on a different policy found four to be in favour, four opposed, and two undecided/neutral.  Suppose the data were presented in the following table\r\n\r\n  In favour:          45%\r\n  Undecided/neutral:  20%\r\n  Opposed:            45%\r\n\r\nGiven the background information, we would quickly recognise this as inconsistent, with a spurious total of 110%, rather than the expected 100%.  In fact, we would probably guess that a copy-and-paste mistake had occurred.  However, it is important to realise that even if we looked at this table alone, in isolation, without any background knowledge of the survey size or the true number of responses in any category, just by knowing that there are only three categories we can firmly conclude that in this example *one or more of the individual numbers must have been entered incorrectly*.  \r\n\r\nYOUR JOB:  \r\nGiven a list (vector) of integer percentages, determine whether among the individual values at least one of them _must_ have been incorrectly entered (return |true|), as in Example 2, or whether there might not be any incorrect entries (return |false|), as in Example 1.","description_html":"\u003cp\u003e\u003cb\u003ePercentages\u003c/b\u003e are commonly \u003cb\u003erounded\u003c/b\u003e when presented in tables.  As a result, the sum of the individual numbers does not always add up to 100%.  A warning is therefore sometimes appended to such tables, along the lines: \u003ci\u003e\"Percentages may not total 100 due to rounding\"\u003c/i\u003e.\u003c/p\u003e\u003cp\u003eEXAMPLE 1:\r\nA survey of eleven people for their opinion on a new policy found five to be in favour, five opposed, and one undecided/neutral.  Percentage-wise this becomes\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003eIn favour:          45% (5 of 11)\r\nUndecided/neutral:   9% (1 of 11)  \r\nOpposed:            45% (5 of 11)  \r\n\u003c/pre\u003e\u003cp\u003eThe total of these is 99%, rather than the expected 100%.  Despite this conflict, in this example \u003cb\u003eall of the individual numbers have been correctly entered\u003c/b\u003e.\u003c/p\u003e\u003cp\u003eEXAMPLE 2:\r\nIn the same report, a survey of a further ten people on a different policy found four to be in favour, four opposed, and two undecided/neutral.  Suppose the data were presented in the following table\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003eIn favour:          45%\r\nUndecided/neutral:  20%\r\nOpposed:            45%\r\n\u003c/pre\u003e\u003cp\u003eGiven the background information, we would quickly recognise this as inconsistent, with a spurious total of 110%, rather than the expected 100%.  In fact, we would probably guess that a copy-and-paste mistake had occurred.  However, it is important to realise that even if we looked at this table alone, in isolation, without any background knowledge of the survey size or the true number of responses in any category, just by knowing that there are only three categories we can firmly conclude that in this example \u003cb\u003eone or more of the individual numbers must have been entered incorrectly\u003c/b\u003e.\u003c/p\u003e\u003cp\u003eYOUR JOB:  \r\nGiven a list (vector) of integer percentages, determine whether among the individual values at least one of them \u003ci\u003emust\u003c/i\u003e have been incorrectly entered (return \u003ctt\u003etrue\u003c/tt\u003e), as in Example 2, or whether there might not be any incorrect entries (return \u003ctt\u003efalse\u003c/tt\u003e), as in Example 1.\u003c/p\u003e","function_template":"% \"May not sum to total due to rounding: the probability of rounding errors\"\r\n% Henry Bottomley, 03 June 2008\r\n% http://www.se16.info/hgb/rounding.pdf\r\n\r\n% \"How to make rounded percentages add up to 100%\"\r\n% https://stackoverflow.com/questions/13483430/how-to-make-rounded-percentages-add-up-to-100\r\n% cf. https://stackoverflow.com/questions/5227215/how-to-deal-with-the-sum-of-rounded-percentage-not-being-100\r\nfunction containsMistake = checkForMistake(z)\r\n    containsMistake = true * + false,\r\nend","test_suite":"%% Basics\r\nassessFunctionAbsence({'regexp', 'regexpi'}, 'FileName','checkForMistake.m')\r\n\r\n%% Example 1 (Row vector)\r\nxVec = round( 100*[5 1 5]/11 );\r\ncontainsMistake = false;\r\nassert( isequal(checkForMistake(xVec), containsMistake) )\r\n\r\n%% Example 1 (Column vector)\r\nxVec = round( 100*[5 1 5]/11 )';\r\ncontainsMistake = false;\r\nassert( isequal(checkForMistake(xVec), containsMistake) )\r\n\r\n%% Example 2 (Row vector)\r\nxVec = [42 20 45];\r\ncontainsMistake = true;\r\nassert( isequal(checkForMistake(xVec), containsMistake) )\r\n\r\n%% One percentage, over and under\r\nxVec = [100];\r\ncontainsMistake = false;\r\nassert( isequal(checkForMistake(xVec), containsMistake) , 'Failed test a')\r\nxVec = round([100.5]);\r\ncontainsMistake = true;\r\nassert( isequal(checkForMistake(xVec), containsMistake) , 'Failed test b')\r\nxVec = round([99.49]);\r\ncontainsMistake = true;\r\nassert( isequal(checkForMistake(xVec), containsMistake) , 'Failed test c')\r\n\r\n%% Two percentages, over and under\r\nxVec = [50 50];\r\ncontainsMistake = false;\r\nassert( isequal(checkForMistake(xVec), containsMistake) , 'Failed test a')\r\nxVec = round([49.5 50.5]);\r\ncontainsMistake = false;\r\nassert( isequal(checkForMistake(xVec), containsMistake) , 'Failed test b')\r\nxVec = round([50.5 50.5]);\r\ncontainsMistake = true;\r\nassert( isequal(checkForMistake(xVec), containsMistake) , 'Failed test c')\r\nxVec = round([49.49 50.49]);\r\ncontainsMistake = true;\r\nassert( isequal(checkForMistake(xVec), containsMistake) , 'Failed test d')\r\n\r\n%% Equal percentages\r\nfor j = [2:250 1000:1000:10000]\r\n    xVec = round( repelem(100/j, j) );\r\n    containsMistake = false;\r\n    assert( isequal(checkForMistake(xVec), containsMistake) )\r\nend;\r\n\r\n%% Geometric series (from Bottomley, §5)\r\nfor j = 10:30\r\n    xVec = round( 10 * (9/10).^[0:j] );\r\n    containsMistake = j \u003c 21;\r\n    assert( isequal(checkForMistake(xVec), containsMistake) )\r\nend;\r\n\r\n%% Geometric series (from Bottomley, §5), permuted\r\nfor j = 2:40\r\n    xVec = round( 10 * (9/10).^[0:j] );\r\n    xVec = xVec( randperm(j+1) );\r\n    containsMistake = j \u003c 21;\r\n    assert( isequal(checkForMistake(xVec), containsMistake) )\r\nend;\r\n\r\n%% Other geometric series (permuted) I\r\nfor j = 2:100\r\n    xVec = round( (99/100).^[0:j] );\r\n    xVec = xVec( randperm(j+1) );\r\n    containsMistake = j \u003c 66;\r\n    assert( isequal(checkForMistake(xVec), containsMistake) )\r\nend;\r\n\r\n%% Other geometric series (permuted) II\r\nfor j = 2:30\r\n    xVec = round( 20 * (4/5).^[0:j] );\r\n    xVec = xVec( randperm(j+1) );\r\n    containsMistake = j \u003c 12;\r\n    assert( isequal(checkForMistake(xVec), containsMistake) )\r\nend;\r\n\r\n%% Other geometric series (permuted) III\r\nfor j = 2:20\r\n    xVec = round( 25 * (3/4).^[0:j] );\r\n    xVec = xVec( randperm(j+1) );\r\n    containsMistake = j \u003c 10;\r\n    assert( isequal(checkForMistake(xVec), containsMistake) )\r\nend;\r\n\r\n%% Other geometric series (permuted) IV\r\nfor j = 2:20\r\n    xVec = round( 50 * (1/2).^[0:j] );\r\n    xVec = xVec( randperm(j+1) );\r\n    containsMistake = j \u003c 5;\r\n    assert( isequal(checkForMistake(xVec), containsMistake) )\r\nend;\r\n\r\n%% Systematic overestimation\r\nfor j = 2:100\r\n    num = randi(round(100/j)+1) - 1;\r\n    xRaw = repelem(num+0.5, j);   % cf. https://oletus.github.io/float16-simulator.js/\r\n    sm = sum(xRaw);\r\n    xRaw = [xRaw max(100-sm, 0)];\r\n    if sm \u003e 100.5,                % Not sm\u003e100, because need to account for extra zero added.\r\n        containsMistake = true;\r\n    else\r\n        containsMistake = false;\r\n    end;\r\n    xVec = round( xRaw );\r\n    xVec = xVec( randperm(j+1) );\r\n    assert( isequal(checkForMistake(xVec), containsMistake) , ['Failed with xRaw = ' num2str(xRaw)] )\r\nend;\r\n\r\n%% Systematic underestimation\r\nfor j = 2:100\r\n    num = randi(round(100/j)+1) - 1;\r\n    xRaw = repelem(num+0.499755859375, j);   % cf. https://oletus.github.io/float16-simulator.js/ \u0026 https://au.mathworks.com/help/matlab/matlab_prog/floating-point-numbers.html\r\n    cs = cumsum(xRaw);\r\n    if cs(end) \u003e 100,\r\n        xRaw( cs \u003e 100 ) = [];\r\n        containsMistake = true;\r\n    else\r\n        xRaw = [xRaw (100-cs(end))];\r\n        containsMistake = false;\r\n    end;\r\n    xVec = round( xRaw );\r\n    assert( isequal(checkForMistake(xVec), containsMistake) , ['Failed with xRaw = ' num2str(xRaw)] )\r\nend;","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":64439,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":3,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2018-03-23T08:02:20.000Z","updated_at":"2018-03-24T13:53:40.000Z","published_at":"2018-03-24T13:53:40.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ePercentages\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e are commonly\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003erounded\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e when presented in tables. As a result, the sum of the individual numbers does not always add up to 100%. A warning is therefore sometimes appended to such tables, along the lines:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003e\\\"Percentages may not total 100 due to rounding\\\"\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eEXAMPLE 1: A survey of eleven people for their opinion on a new policy found five to be in favour, five opposed, and one undecided/neutral. Percentage-wise this becomes\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[In favour:          45% (5 of 11)\\nUndecided/neutral:   9% (1 of 11)  \\nOpposed:            45% (5 of 11)]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe total of these is 99%, rather than the expected 100%. Despite this conflict, in this example\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eall of the individual numbers have been correctly entered\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eEXAMPLE 2: In the same report, a survey of a further ten people on a different policy found four to be in favour, four opposed, and two undecided/neutral. Suppose the data were presented in the following table\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[In favour:          45%\\nUndecided/neutral:  20%\\nOpposed:            45%]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eGiven the background information, we would quickly recognise this as inconsistent, with a spurious total of 110%, rather than the expected 100%. In fact, we would probably guess that a copy-and-paste mistake had occurred. However, it is important to realise that even if we looked at this table alone, in isolation, without any background knowledge of the survey size or the true number of responses in any category, just by knowing that there are only three categories we can firmly conclude that in this example\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eone or more of the individual numbers must have been entered incorrectly\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eYOUR JOB: Given a list (vector) of integer percentages, determine whether among the individual values at least one of them\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003emust\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e have been incorrectly entered (return\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003etrue\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e), as in Example 2, or whether there might not be any incorrect entries (return\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003efalse\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e), as in Example 1.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":44655,"title":"Computational power of Cody servers","description":"It has been \u003chttps://en.wikipedia.org/wiki/Moore%27s_law#History predicted\u003e that the performance of integrated circuits would _double_ every 18 months.  That suggests the time to perform a given computation should _halve_ roughly every 18 months.  \r\n\r\nWhat about on Cody?  Observational data is available from the final test case of \u003chttps://www.mathworks.com/matlabcentral/cody/problems/963-we-love-vectorized-solutions-problem-1-remove-the-row-average Problem 963\u003e to help us quantify the improvement in performance!  And thereby even make predictions for future computations.\r\n\r\n Solution    Date\t   Runtime [s]\r\n ...\r\n 144393\t     04-Oct-12\t   4.230\r\n ...\r\n 654812\t     17-Apr-15\t   3.099\r\n ...\r\n 1272817     20-Sep-17\t   2.0402\r\n ...\r\n\r\nThe complete data set will be provided to you as input.  You should assume the general trend can be described by the following law:\r\n\r\n runtime = r0 - δ [1 - exp(-t/k)]\r\n runtime = r∞ + δ exp(-t/k)\r\n\r\nwhere |r0| is the runtime at the start of the period in seconds, |r∞| is the predicted runtime (in seconds) that will be approached far in the future, |δ = r0 - r∞|, and |t| is the time in nominal years since the start of the period, and |k| is a kinetic parameter (in nominal years).  \r\n\r\nThe start of the period is defined by the earliest date in the series.  Compute the number of days exactly, and assume that a nominal year comprises 365.24 days.\r\n\r\nYour task is to \u003chttps://au.mathworks.com/help/matlab/math/example-curve-fitting-via-optimization.html fit the curve\u003e and thereby predict the runtime for various future dates.  Your output should be rounded to four decimal places.  \r\n\r\nMETHOD:  You _must_ use \u003chttps://au.mathworks.com/help/matlab/ref/fminsearch.html |fminsearch|\u003e to perform the non-linear regression, and you _must_ set the options using \u003chttps://au.mathworks.com/help/matlab/ref/optimset.html |optimset|\u003e to ensure sufficient accuracy.  The 'best' fit is defined — _for this problem, as in the common convention_ — as that which minimises the sum of the squares of the residuals.  \r\n\r\nEXAMPLE:\r\n\r\n % Input\r\n futureDate = '21-Nov-2023';\r\n data.solutionNumber = [1036949, ..., 1272817];\r\n data.date = ['29-Oct-2016'; ...; '20-Sep-2017'];\r\n data.runtime = [1.2630, ..., 2.0402];\r\n % Output\r\n predictedRuntime = 0.3619;  % seconds\r\n\r\n","description_html":"\u003cp\u003eIt has been \u003ca href = \"https://en.wikipedia.org/wiki/Moore%27s_law#History\"\u003epredicted\u003c/a\u003e that the performance of integrated circuits would \u003ci\u003edouble\u003c/i\u003e every 18 months.  That suggests the time to perform a given computation should \u003ci\u003ehalve\u003c/i\u003e roughly every 18 months.\u003c/p\u003e\u003cp\u003eWhat about on Cody?  Observational data is available from the final test case of \u003ca href = \"https://www.mathworks.com/matlabcentral/cody/problems/963-we-love-vectorized-solutions-problem-1-remove-the-row-average\"\u003eProblem 963\u003c/a\u003e to help us quantify the improvement in performance!  And thereby even make predictions for future computations.\u003c/p\u003e\u003cpre\u003e Solution    Date\t   Runtime [s]\r\n ...\r\n 144393\t     04-Oct-12\t   4.230\r\n ...\r\n 654812\t     17-Apr-15\t   3.099\r\n ...\r\n 1272817     20-Sep-17\t   2.0402\r\n ...\u003c/pre\u003e\u003cp\u003eThe complete data set will be provided to you as input.  You should assume the general trend can be described by the following law:\u003c/p\u003e\u003cpre\u003e runtime = r0 - δ [1 - exp(-t/k)]\r\n runtime = r∞ + δ exp(-t/k)\u003c/pre\u003e\u003cp\u003ewhere \u003ctt\u003er0\u003c/tt\u003e is the runtime at the start of the period in seconds, \u003ctt\u003er∞\u003c/tt\u003e is the predicted runtime (in seconds) that will be approached far in the future, \u003ctt\u003eδ = r0 - r∞\u003c/tt\u003e, and \u003ctt\u003et\u003c/tt\u003e is the time in nominal years since the start of the period, and \u003ctt\u003ek\u003c/tt\u003e is a kinetic parameter (in nominal years).\u003c/p\u003e\u003cp\u003eThe start of the period is defined by the earliest date in the series.  Compute the number of days exactly, and assume that a nominal year comprises 365.24 days.\u003c/p\u003e\u003cp\u003eYour task is to \u003ca href = \"https://au.mathworks.com/help/matlab/math/example-curve-fitting-via-optimization.html\"\u003efit the curve\u003c/a\u003e and thereby predict the runtime for various future dates.  Your output should be rounded to four decimal places.\u003c/p\u003e\u003cp\u003eMETHOD:  You \u003ci\u003emust\u003c/i\u003e use \u003ca href = \"https://au.mathworks.com/help/matlab/ref/fminsearch.html\"\u003e\u003ctt\u003efminsearch\u003c/tt\u003e\u003c/a\u003e to perform the non-linear regression, and you \u003ci\u003emust\u003c/i\u003e set the options using \u003ca href = \"https://au.mathworks.com/help/matlab/ref/optimset.html\"\u003e\u003ctt\u003eoptimset\u003c/tt\u003e\u003c/a\u003e to ensure sufficient accuracy.  The 'best' fit is defined — \u003ci\u003efor this problem, as in the common convention\u003c/i\u003e — as that which minimises the sum of the squares of the residuals.\u003c/p\u003e\u003cp\u003eEXAMPLE:\u003c/p\u003e\u003cpre\u003e % Input\r\n futureDate = '21-Nov-2023';\r\n data.solutionNumber = [1036949, ..., 1272817];\r\n data.date = ['29-Oct-2016'; ...; '20-Sep-2017'];\r\n data.runtime = [1.2630, ..., 2.0402];\r\n % Output\r\n predictedRuntime = 0.3619;  % seconds\u003c/pre\u003e","function_template":"function predictedRuntime = predictor(futureDate, data)\r\n    % Preliminaries:\r\n    ...\r\n    \r\n    \r\n    % Use fminsearch to find the parameters that minimize the objective function.\r\n    myObjectiveFun = ...\r\n    myOptions = ...\r\n    ... = fminsearch\r\n\r\n    % Report your prediction of the runtime at the specified future date.\r\n    predictedRuntime = ...\r\nend\r\n\r\n% Function that accepts a trial set of parameters and the observed data, \r\n% and returns the sum of squared errors for the model . \r\n% https://au.mathworks.com/help/matlab/math/example-curve-fitting-via-optimization.html\r\nfunction SSE = sseVal(...)\r\n    % runtime = r0 - δ [1 - exp(-t/k)]\r\n    % runtime = r∞ + δ exp(-t/k)\r\n    \r\n    ...\r\n    \r\n    SSE = ...\r\nend\r\n","test_suite":"data.solutionNumber = [1036949\t1048171\t1051202\t1078061\t1078699\t1081561\t886761\t1165117\t1202850\t1211446\t1241478\t1241530\t1329044\t1323931\t1382633\t1345204\t1281524\t1272814\t1272815\t1272823\t1272845\t1287012\t1287386\t1262442\t1262445\t1251993\t1252843\t1407137\t1412687\t1448359\t1448368\t1410187\t1465616\t1472214\t1472225\t1490596\t1490602\t1541085\t1541132\t860114\t143879\t144156\t144393\t202249\t210894\t539555\t182974\t276887\t1133109\t654812\t1272817];\r\ndata.date = ['29-Oct-2016';\t'08-Nov-2016';\t'12-Nov-2016';\t'09-Dec-2016';\t'10-Dec-2016';\t'14-Dec-2016';\t'06-May-2016';\t'18-Apr-2017';\t'02-Jun-2017';\t'13-Jun-2017';\t'28-Jul-2017';\t'28-Jul-2017';\t'06-Nov-2017';\t'01-Nov-2017';\t'16-Dec-2017';\t'15-Nov-2017';\t'05-Oct-2017';\t'20-Sep-2017';\t'20-Sep-2017';\t'20-Sep-2017';\t'20-Sep-2017';\t'15-Oct-2017';\t'15-Oct-2017';\t'05-Sep-2017';\t'05-Sep-2017';\t'16-Aug-2017';\t'17-Aug-2017';\t'06-Jan-2018';\t'10-Jan-2018';\t'24-Feb-2018';\t'24-Feb-2018';\t'08-Jan-2018';\t'18-Mar-2018';\t'27-Mar-2018';\t'27-Mar-2018';\t'13-Apr-2018';\t'13-Apr-2018';\t'26-May-2018';\t'26-May-2018';\t'31-Mar-2016';\t'02-Oct-2012';\t'03-Oct-2012';\t'04-Oct-2012';\t'08-Feb-2013';\t'01-Mar-2013';\t'03-Dec-2014';\t'29-Dec-2012';\t'09-Jul-2013';\t'03-Mar-2017';\t'17-Apr-2015';\t'20-Sep-2017'];\r\ndata.runtime = [1.2630\t0.624\t1.3326\t1.2939\t0.5995\t1.1307\t1.3505\t1.2613\t1.2737\t1.3081\t1.2774\t1.252\t1.2179\t1.4431\t1.2637\t1.1614\t1.2542\t1.9135\t1.2996\t1.2595\t1.2664\t1.1858\t1.1501\t1.2516\t1.2786\t1.9461\t1.2492\t1.3654\t1.3263\t1.1484\t1.1728\t1.6177\t1.0538\t1.0571\t1.0454\t1.3873\t1.0600\t1.1154\t1.0635\t1.4359\t4.498\t4.198\t4.230\t5.264\t4.022\t3.153\t4.740\t4.112\t2.3409\t3.099\t2.0402];\r\n\r\n%% Anti-hacking provision\r\n% ADDED 2019-06-29.  \r\n% Ensure only builtin functions will be called.  \r\n! rm -v fileread.m\r\n! rm -v assert.m\r\n\r\n%% Required methodology\r\nassessFunctionPresence({'fminsearch', 'optimset'}, 'FileName','predictor.m', 'Feedback','You must use the specified methodology')\r\n\r\n%% Anti-hardcoding test\r\n% Adapted from a comment at https://www.mathworks.com/matlabcentral/cody/problems/44343 .\r\nassert(~any(cellfun(@(x)ismember(max([0,str2num(x)]),[2012,2019:2023,3000]),regexp(fileread('predictor.m'),'[\\d\\.\\+\\-\\*\\/\\(\\) \\[\\]\\,\\;]+','match'))), 'Please don''t hard-code your ''solution''.') \r\nassert(~any(cellfun(@(x)ismember(max([0,str2num(x)]),[2012,2019:2023,3000]),regexp(fileread('predictor.m'),'\\d+','match'))), 'Please do not hard-code your ''solution''.') \r\n\r\n%% January 2019\r\nfutureDate = '22-Jan-2019';\r\npredictedRuntime_correct = round(0.935043294718475, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\nfutureDate = '23-Jan-2019';\r\npredictedRuntime_correct = round(0.934448955935569, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\nfutureDate = '24-Jan-2019';\r\npredictedRuntime_correct = round(0.933855075296061, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\n%% January 2020\r\nfutureDate = '09-Jan-2020';\r\npredictedRuntime_correct = round(0.751755426901932, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\nfutureDate = '13-Jan-2020';\r\npredictedRuntime_correct = round(0.749945312632780, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\n%% January 2021\r\nfutureDate = '06-Jan-2021';\r\npredictedRuntime_correct = round(0.608254613313523, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\nfutureDate = '11-Jan-2021';\r\npredictedRuntime_correct = round(0.606545074994730, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\n%% February 2022\r\nfutureDate = '06-Feb-2022';\r\npredictedRuntime_correct = round(0.491354117473879, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\nfutureDate = '10-Feb-2022';\r\npredictedRuntime_correct = round(0.490345992043568, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\n%% November 2023\r\nfutureDate = '06-Nov-2023';\r\npredictedRuntime_correct = round(0.364155581026111, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\nfutureDate = '21-Nov-2023';\r\npredictedRuntime_correct = round(0.361853937995679, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\nfutureDate = '25-Nov-2023';\r\npredictedRuntime_correct = round(0.361244649648014, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\nfutureDate = '27-Nov-2023';\r\npredictedRuntime_correct = round(0.360940709522436, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\n%% Let's all meet up in the year 3000\r\nfutureDate = '01-Jan-3000';\r\npredictedRuntime_correct = round(0.164021404839, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\n%% Enforce antihacking\r\n% Assure no 'workarounds' that avoid appropriate use of optimset.\r\n% (Added 29 May 2018.)\r\nfutureDate = {'19-Dec-2019';\t'04-Oct-2020';\t'06-Nov-2020';\t'20-Nov-2020';\t'07-Dec-2020';\t'09-Dec-2020';\t'11-Dec-2020';\t'25-Feb-2021';\t'04-Mar-2021';\t'18-Apr-2021';\t'19-May-2021';\t'23-Jul-2021'};\r\npRuntime_c_unrounded = {0.761350673860113\t0.641651747331991\t0.629650497697623\t0.624650604424140\t0.618651428148657\t0.617950799242008\t0.617251250072375\t0.591452258418511\t0.589151203003048\t0.574651625923890\t0.564951737257372\t0.545350739105932};\r\nfor j = 1 : length(futureDate)\r\n    assert(isequal(predictor(futureDate{j}, data), round(pRuntime_c_unrounded{j}, 4)))\r\nend;\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":64439,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":2,"test_suite_updated_at":"2019-06-29T12:58:19.000Z","rescore_all_solutions":true,"group_id":1,"created_at":"2018-05-27T08:32:09.000Z","updated_at":"2019-06-29T12:58:19.000Z","published_at":"2018-05-27T12:35:16.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eIt has been\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://en.wikipedia.org/wiki/Moore%27s_law#History\\\"\u003e\u003cw:r\u003e\u003cw:t\u003epredicted\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e that the performance of integrated circuits would\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003edouble\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e every 18 months. That suggests the time to perform a given computation should\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ehalve\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e roughly every 18 months.\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\u003eWhat about on Cody? Observational data is available from the final test case of\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://www.mathworks.com/matlabcentral/cody/problems/963-we-love-vectorized-solutions-problem-1-remove-the-row-average\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eProblem 963\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e to help us quantify the improvement in performance! And thereby even make predictions for future computations.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ Solution    Date     Runtime [s]\\n ...\\n 144393       04-Oct-12     4.230\\n ...\\n 654812       17-Apr-15     3.099\\n ...\\n 1272817     20-Sep-17     2.0402\\n ...]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe complete data set will be provided to you as input. You should assume the general trend can be described by the following law:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ runtime = r0 - δ [1 - exp(-t/k)]\\n runtime = r∞ + δ exp(-t/k)]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003ewhere\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003er0\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e is the runtime at the start of the period in seconds,\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003er∞\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e is the predicted runtime (in seconds) that will be approached far in the future,\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eδ = r0 - r∞\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, and\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003et\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e is the time in nominal years since the start of the period, and\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ek\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e is a kinetic parameter (in nominal years).\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe start of the period is defined by the earliest date in the series. Compute the number of days exactly, and assume that a nominal year comprises 365.24 days.\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\u003eYour task is to\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://au.mathworks.com/help/matlab/math/example-curve-fitting-via-optimization.html\\\"\u003e\u003cw:r\u003e\u003cw:t\u003efit the curve\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e and thereby predict the runtime for various future dates. Your output should be rounded to four decimal places.\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\u003eMETHOD: You\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003emust\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e use\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://au.mathworks.com/help/matlab/ref/fminsearch.html\\\"\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003efminsearch\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e to perform the non-linear regression, and you\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003emust\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e set the options using\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://au.mathworks.com/help/matlab/ref/optimset.html\\\"\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eoptimset\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e to ensure sufficient accuracy. The 'best' fit is defined —\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003efor this problem, as in the common convention\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e — as that which minimises the sum of the squares of the residuals.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eEXAMPLE:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ % Input\\n futureDate = '21-Nov-2023';\\n data.solutionNumber = [1036949, ..., 1272817];\\n data.date = ['29-Oct-2016'; ...; '20-Sep-2017'];\\n data.runtime = [1.2630, ..., 2.0402];\\n % Output\\n predictedRuntime = 0.3619;  % seconds]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":1022,"title":"Knot Count - Speed","description":"\r\nThe Matlab Semi-Annual Contest Grand Finale is Knots.\r\nThis Challenge is to Speed up the Scoring routine that counts the number of Knots.\r\nDetails and examples are at Knots Rules.\r\nInput: [adjacency xy]\r\nadjacency is an NxN matrix of topologically adjacent(connected) points\r\n\r\nxy is an Nx2 matrix giving the X and Y coordinates for the N points\r\nOutput: nKnots; Number of Knots\r\nScoring: Speed; Based on cumulative time of Knots [ 3 6 15 18 24 30 37 42 46 49]; Nominal Time 9.7 sec\r\nBaseline Knot Contest Knot scoring for all 50 test cases is 63 seconds on Cody.","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: 329.817px; display: block; min-width: 0px; padding-block-start: 0px; padding-top: 0px; perspective-origin: 407px 164.917px; transform-origin: 407px 164.917px; vertical-align: baseline; \"\u003e\u003cdiv style=\"block-size: 37.5167px; 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 18.7667px; text-align: center; transform-origin: 384px 18.7667px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cimg class=\"imageNode\" style=\"vertical-align: baseline\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAADAFBMVEV4eHiTk5P29vaBgYGcnJzAwMC3t7eKiorS0tLt7e3b29vk5OTJycn///9vb28AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD61b95AAAAyklEQVR42q2SSQ6FIAxAWzQxkcj976lEE5R+hojQOmw+Cxa8RwcoGnhf6oNDD0AvGL8j/E2wC+JiXwSaAKbbatGkLjBrX13szynmtPXnKc2eCRiMGQtXxrq2hmZRuuXx6SVdPlPpopeC387sFMMIwdsyAMFAEcHuptW5oIaKYgjHBBoZ512snMeJ8g7o0DmA5jwKXRdqy9W6gfMzhd7iMOySlxq0qn/z4leR43HNQ8WrLtYi1Dz+pnjsmt/8ZsulwLgQOOeC4EyQHH5z1GUZiLNTtwAAAABJRU5ErkJggg==\" data-image-state=\"image-loaded\"\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.433px 8.05px; transform-origin: 154.433px 8.05px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe Matlab Semi-Annual Contest Grand Finale is \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://web.archive.org/web/20150303060336/http://www.mathworks.com/matlabcentral/contest/contests/38/rules\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eKnots\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 1.95px 8.05px; transform-origin: 1.95px 8.05px; 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: 257.117px 8.05px; transform-origin: 257.117px 8.05px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThis Challenge is to Speed up the Scoring routine that counts the number of Knots.\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: 88.7px 8.05px; transform-origin: 88.7px 8.05px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eDetails and examples are at \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://web.archive.org/web/20150303060336/http://www.mathworks.com/matlabcentral/contest/contests/38/rules\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eKnots Rules\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 1.95px 8.05px; transform-origin: 1.95px 8.05px; 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: 19.4333px 8.05px; transform-origin: 19.4333px 8.05px; unicode-bidi: normal; \"\u003e\u003cspan style=\"font-weight: 700; \"\u003eInput:\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 46.2833px 8.05px; transform-origin: 46.2833px 8.05px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e [adjacency xy]\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cul style=\"block-size: 61.3px; counter-reset: list-item 0; font-family: Helvetica, Arial, sans-serif; list-style-type: square; margin-block-end: 20px; margin-block-start: 10px; margin-bottom: 20px; margin-top: 10px; perspective-origin: 391px 30.65px; transform-origin: 391px 30.65px; margin-top: 10px; margin-bottom: 20px; \"\u003e\u003cli style=\"block-size: 20.4333px; counter-reset: none; display: list-item; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-start: 56px; margin-left: 56px; margin-top: 0px; perspective-origin: 363px 10.2167px; text-align: left; transform-origin: 363px 10.2167px; white-space: pre-wrap; margin-left: 56px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-inline-start: 0px; margin-left: 0px; perspective-origin: 219.017px 8.05px; transform-origin: 219.017px 8.05px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eadjacency is an NxN matrix of topologically adjacent(connected) points\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style=\"block-size: 20.4333px; counter-reset: none; display: list-item; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-start: 56px; margin-left: 56px; margin-top: 0px; perspective-origin: 363px 10.2167px; text-align: left; transform-origin: 363px 10.2167px; white-space: pre-wrap; margin-left: 56px; \"\u003e\u003c/li\u003e\u003cli style=\"block-size: 20.4333px; counter-reset: none; display: list-item; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-start: 56px; margin-left: 56px; margin-top: 0px; perspective-origin: 363px 10.2167px; text-align: left; transform-origin: 363px 10.2167px; white-space: pre-wrap; margin-left: 56px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-inline-start: 0px; margin-left: 0px; perspective-origin: 205.367px 8.05px; transform-origin: 205.367px 8.05px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003exy is an Nx2 matrix giving the X and Y coordinates for the N points\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\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: 25.2667px 8.05px; transform-origin: 25.2667px 8.05px; unicode-bidi: normal; \"\u003e\u003cspan style=\"font-weight: 700; \"\u003eOutput:\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 80.1167px 8.05px; transform-origin: 80.1167px 8.05px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e nKnots; Number of Knots\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: 28.3833px 8.05px; transform-origin: 28.3833px 8.05px; unicode-bidi: normal; \"\u003e\u003cspan style=\"font-weight: 700; \"\u003eScoring:\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 300.4px 8.05px; transform-origin: 300.4px 8.05px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e Speed; Based on cumulative time of Knots [ 3 6 15 18 24 30 37 42 46 49]; Nominal Time 9.7 sec\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: 246.483px 8.05px; transform-origin: 246.483px 8.05px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eBaseline Knot Contest Knot scoring for all 50 test cases is 63 seconds on Cody.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e","function_template":"function nKnots = Knots(adjacency,xy)\r\n nKnots=0;\r\nend","test_suite":"%%\r\nfeval(@assignin,'caller','score',0);\r\n%%\r\n%urlwrite('http://tinyurl.com/matlab-Knots','Knots_sample.mat')\r\nurlwrite('http://rmatlabtest.appspot.com/testsuite_sample_knots.mat','Knots_sample.mat');\r\n%%\r\neKnots=[94 50 1719 11390 18 3446 7402 669 2558 13557 5376 25025 122 11566 2560 15726 7569 11728 35178 1872 972 29917 7433 2013 3 3081 1381 1424 1102 3534 2849 14520 16892 16553 18887 245 5729 3256 400 24811 290 15081 5679 12310 262 16317 1614 249 8782 192];\r\n\r\ncases=4;\r\nnKnots=zeros(cases,1);\r\nKnotTime=zeros(cases,1);\r\n\r\nrclock=clock;\r\nrng(floor(rclock(6)*1000),'twister'); % Seed the random function\r\ntKnots=randi(50,cases,1); % anti-code answer\r\n\r\nload Knots_sample.mat\r\ntestsuite=suite; % update\r\n\r\nfor n=1:cases\r\n a=testsuite(tKnots(n)).a;\r\n xy=testsuite(tKnots(n)).xyIn;\r\n time0 = cputime;\r\n  nKnots(n)=Knots(a,xy);\r\n KnotTime(n) = cputime - time0;\r\nend\r\n\r\nfor n=1:cases\r\n assert(isequal(nKnots(n),eKnots(tKnots(n))),sprintf('Knot %i Was %i Expected %i',tKnots(n),nKnots(n),eKnots(tKnots(n))));\r\nend\r\n\r\n% Success: Report Times\r\nP=[tKnots nKnots KnotTime]';\r\nfprintf('Knot %i  Knots %i  Time %10.6f\\n',P); \r\n\r\n%%\r\n% Run for Time Score uses Knots [3 6 15 18 24 30 37 42 46 49]\r\n\r\neKnots=[94 50 1719 11390 18 3446 7402 669 2558 13557 5376 25025 122 11566 2560 15726 7569 11728 35178 1872 972 29917 7433 2013 3 3081 1381 1424 1102 3534 2849 14520 16892 16553 18887 245 5729 3256 400 24811 290 15081 5679 12310 262 16317 1614 249 8782 192];\r\n\r\ncases=10;\r\nnKnots=zeros(cases,1);\r\nKnotTime=zeros(cases,1);\r\n\r\nrclock=clock;\r\nrng(floor(rclock(6)*1000),'twister'); % Seed the random function\r\n%tKnots=randi(50,cases,1);\r\n\r\n\r\nload Knots_sample.mat\r\ntestsuite=suite; % update\r\n\r\ntKnots=[3 6 15 18 24 30 37 42 46 49]';\r\n\r\n\r\nfor n=1:cases\r\n a=testsuite(tKnots(n)).a;\r\n xy=testsuite(tKnots(n)).xyIn;\r\n time0 = cputime;\r\n  nKnots(n)=Knots(a,xy);\r\n KnotTime(n) = cputime - time0;\r\nend\r\n\r\nfor n=1:cases\r\n assert(isequal(nKnots(n),eKnots(tKnots(n))),sprintf('Knot %i Was %i Expected %i',tKnots(n),nKnots(n),eKnots(tKnots(n))));\r\nend\r\n\r\n% Success: Report Times\r\nP=[tKnots nKnots KnotTime]';\r\nfprintf('Knot %i  Knots %i  Time %10.6f\\n',P); \r\n\r\n% Score in msec\r\nfeval(@assignin,'caller','score',min(10000,floor(1000*sum(KnotTime))));","published":true,"deleted":false,"likes_count":0,"comments_count":2,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":2,"test_suite_updated_at":"2013-11-15T22:18:08.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2012-11-02T12:41:38.000Z","updated_at":"2021-07-24T16:42:30.000Z","published_at":"2012-11-02T14:35:08.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"center\\\"/\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=\\\"verticalAlign\\\" w:val=\\\"baseline\\\"/\u003e\u003cw:attr w:name=\\\"altText\\\" w:val=\\\"\\\"/\u003e\u003cw:attr w:name=\\\"relationshipId\\\" w:val=\\\"rId1\\\"/\u003e\u003c/w:customXmlPr\u003e\u003c/w:customXml\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe Matlab Semi-Annual Contest Grand Finale is \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://web.archive.org/web/20150303060336/http://www.mathworks.com/matlabcentral/contest/contests/38/rules\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eKnots\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis Challenge is to Speed up the Scoring routine that counts the number of Knots.\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\u003eDetails and examples are at \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://web.archive.org/web/20150303060336/http://www.mathworks.com/matlabcentral/contest/contests/38/rules\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eKnots Rules\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e [adjacency xy]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eadjacency is an NxN matrix of topologically adjacent(connected) points\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003exy is an Nx2 matrix giving the X and Y coordinates for the N points\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eOutput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e nKnots; Number of Knots\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eScoring:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Speed; Based on cumulative time of Knots [ 3 6 15 18 24 30 37 42 46 49]; Nominal Time 9.7 sec\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\u003eBaseline Knot Contest Knot scoring for all 50 test cases is 63 seconds on Cody.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\",\"relationship\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"target\":\"/media/image1.png\",\"relationshipId\":\"rId1\"}]},{\"partUri\":\"/media/image1.png\",\"contentType\":\"image/png\",\"content\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAADAFBMVEV4eHiTk5P29vaBgYGcnJzAwMC3t7eKiorS0tLt7e3b29vk5OTJycn///9vb28AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD61b95AAAAyklEQVR42q2SSQ6FIAxAWzQxkcj976lEE5R+hojQOmw+Cxa8RwcoGnhf6oNDD0AvGL8j/E2wC+JiXwSaAKbbatGkLjBrX13szynmtPXnKc2eCRiMGQtXxrq2hmZRuuXx6SVdPlPpopeC387sFMMIwdsyAMFAEcHuptW5oIaKYgjHBBoZ512snMeJ8g7o0DmA5jwKXRdqy9W6gfMzhd7iMOySlxq0qn/z4leR43HNQ8WrLtYi1Dz+pnjsmt/8ZsulwLgQOOeC4EyQHH5z1GUZiLNTtwAAAABJRU5ErkJggg==\",\"relationship\":null}],\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"target\":\"/matlab/document.xml\",\"relationshipId\":\"rId1\"}]}"},{"id":3074,"title":"Compute the cokurtosis of a given portfolio.","description":"As input data, you are given a nObs-by-nAssets matrix _portRet_ of return series for assets in a portfolio along with an nAssets-by-1 vector _portWeights_ of portfolio weights. Example: \r\n\r\n \u003e\u003e nObs = 504; % Number of observations\r\n\r\n \u003e\u003e nAssets = 5; % Number of assets in the portfolio\r\n\r\n \u003e\u003e portRet = randn(nObs, nAssets); % Sample portfolio return series\r\n\r\n \u003e\u003e portWeights = rand(nAssets, 1); \r\n\r\n \u003e\u003e portWeights = portWeights/sum(portWeights); % Portfolio weights are \u003e=0 and sum to 1.\r\n\r\nThe task is to compute the *portfolio cokurtosis* , which is a scalar statistic associated with the portfolio. A full description of this statistic, along with sample MATLAB code for computing it, can be found here:\r\n\r\nhttp://www.quantatrisk.com/2013/01/20/coskewness-and-cokurtosis/\r\n\r\nWrite a function that accepts _portRet_ and _portWeights_ as input arguments and returns the scalar statistic _portCokurt_ as its output. You can use the code at the website above as a starting point, but try to simplify and shorten it in the spirit of Cody.\r\n\r\n\r\n\r\n","description_html":"\u003cp\u003eAs input data, you are given a nObs-by-nAssets matrix \u003ci\u003eportRet\u003c/i\u003e of return series for assets in a portfolio along with an nAssets-by-1 vector \u003ci\u003eportWeights\u003c/i\u003e of portfolio weights. Example:\u003c/p\u003e\u003cpre\u003e \u0026gt;\u0026gt; nObs = 504; % Number of observations\u003c/pre\u003e\u003cpre\u003e \u0026gt;\u0026gt; nAssets = 5; % Number of assets in the portfolio\u003c/pre\u003e\u003cpre\u003e \u0026gt;\u0026gt; portRet = randn(nObs, nAssets); % Sample portfolio return series\u003c/pre\u003e\u003cpre\u003e \u0026gt;\u0026gt; portWeights = rand(nAssets, 1); \u003c/pre\u003e\u003cpre\u003e \u0026gt;\u0026gt; portWeights = portWeights/sum(portWeights); % Portfolio weights are \u0026gt;=0 and sum to 1.\u003c/pre\u003e\u003cp\u003eThe task is to compute the \u003cb\u003eportfolio cokurtosis\u003c/b\u003e , which is a scalar statistic associated with the portfolio. A full description of this statistic, along with sample MATLAB code for computing it, can be found here:\u003c/p\u003e\u003cp\u003e\u003ca href = \"http://www.quantatrisk.com/2013/01/20/coskewness-and-cokurtosis/\"\u003ehttp://www.quantatrisk.com/2013/01/20/coskewness-and-cokurtosis/\u003c/a\u003e\u003c/p\u003e\u003cp\u003eWrite a function that accepts \u003ci\u003eportRet\u003c/i\u003e and \u003ci\u003eportWeights\u003c/i\u003e as input arguments and returns the scalar statistic \u003ci\u003eportCokurt\u003c/i\u003e as its output. You can use the code at the website above as a starting point, but try to simplify and shorten it in the spirit of Cody.\u003c/p\u003e","function_template":"function portCokurt = computePortCokurt(portRet, portWeights)\r\n\r\n\r\nend","test_suite":"%%\r\nrng('default')\r\nR = randn(504, 5);\r\nw = ones(5, 1)/5;\r\nassert(abs(computePortCokurt(R, w)-0.119749008958925)\u003c1e-3)\r\n\r\n%%\r\nrng('default')\r\nR = randn(252, 15);\r\nw = ones(15, 1)/15;\r\nassert(abs(computePortCokurt(R, w)-0.013012357540290)\u003c1e-3)\r\n\r\n%% \r\nrng('default')\r\nR = randn(100, 1);\r\nw = 1;\r\nassert(abs(computePortCokurt(R, w)-6.280759230562035)\u003c1e-3)\r\n\r\n%%\r\nrng('default')\r\nR = randn(5, 10);\r\nw = [0.1*ones(5, 1); 0.5; zeros(4, 1)];\r\nassert(abs(computePortCokurt(R, w)-0.169198885214440)\u003c1e-3)","published":true,"deleted":false,"likes_count":0,"comments_count":2,"created_by":2328,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":5,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2015-03-10T11:04:22.000Z","updated_at":"2015-03-11T18:00:35.000Z","published_at":"2015-03-10T11:25:35.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eAs input data, you are given a nObs-by-nAssets matrix\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eportRet\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e of return series for assets in a portfolio along with an nAssets-by-1 vector\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eportWeights\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e of portfolio weights. Example:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ \u003e\u003e nObs = 504; % Number of observations\\n\\n \u003e\u003e nAssets = 5; % Number of assets in the portfolio\\n\\n \u003e\u003e portRet = randn(nObs, nAssets); % Sample portfolio return series\\n\\n \u003e\u003e portWeights = rand(nAssets, 1); \\n\\n \u003e\u003e portWeights = portWeights/sum(portWeights); % Portfolio weights are \u003e=0 and sum to 1.]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe task is to compute the\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eportfolio cokurtosis\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e , which is a scalar statistic associated with the portfolio. A full description of this statistic, along with sample MATLAB code for computing it, can be found here:\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=\\\"http://www.quantatrisk.com/2013/01/20/coskewness-and-cokurtosis/\\\"\u003e\u003cw:r\u003e\u003cw:t\u003ehttp://www.quantatrisk.com/2013/01/20/coskewness-and-cokurtosis/\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eWrite a function that accepts\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eportRet\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e and\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eportWeights\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e as input arguments and returns the scalar statistic\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eportCokurt\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e as its output. You can use the code at the website above as a starting point, but try to simplify and shorten it in the spirit of Cody.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":1440,"title":"USC Spring 2013 ACM: Snow Cones","description":"This Challenge is to solve the \u003chttp://contest.usc.edu/index.php/Spring13/Home USC Spring 2013 ACM Contest\u003e Problem F, Snow Cones.\r\n\r\nSummary of Challenge is to Swap the Snow Cones in the minimal number of swaps so the children all have their selected flavor. There are only two flavors, X and O.\r\nInput is the string of distributed Cone flavors and a string of desired Cone flavors. Adjacent children may exchange cones but in any one round a child may only swap with one other child. \r\n\r\nDetermine minimum number of Swap rounds to convert the Distributed to the Desired Cone flavor sequence.\r\n\r\n\r\n*Input:* From XXO to  OXX   *Output:* 2\r\n\r\n*Input:* From OXOX to XOXO  *Output:* 1\r\n\r\nOnly two competitors solved this challenge.\r\n\r\nA little complex requiring a Matlab 3-Liner solution versus \u003chttp://contest.usc.edu/index.php/Spring13/Home?action=download\u0026upname=cones.zhengcao.cpp.txt Cao's C solution\u003e ","description_html":"\u003cp\u003eThis Challenge is to solve the \u003ca href = \"http://contest.usc.edu/index.php/Spring13/Home\"\u003eUSC Spring 2013 ACM Contest\u003c/a\u003e Problem F, Snow Cones.\u003c/p\u003e\u003cp\u003eSummary of Challenge is to Swap the Snow Cones in the minimal number of swaps so the children all have their selected flavor. There are only two flavors, X and O.\r\nInput is the string of distributed Cone flavors and a string of desired Cone flavors. Adjacent children may exchange cones but in any one round a child may only swap with one other child.\u003c/p\u003e\u003cp\u003eDetermine minimum number of Swap rounds to convert the Distributed to the Desired Cone flavor sequence.\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e From XXO to  OXX   \u003cb\u003eOutput:\u003c/b\u003e 2\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e From OXOX to XOXO  \u003cb\u003eOutput:\u003c/b\u003e 1\u003c/p\u003e\u003cp\u003eOnly two competitors solved this challenge.\u003c/p\u003e\u003cp\u003eA little complex requiring a Matlab 3-Liner solution versus \u003ca href = \"http://contest.usc.edu/index.php/Spring13/Home?action=download\u0026upname=cones.zhengcao.cpp.txt\"\u003eCao's C solution\u003c/a\u003e\u003c/p\u003e","function_template":"function swaps=snowcones(v1,v2)\r\n% v1 is a string of Xs and Os (not zeros)\r\n% v2 is string of desired sequence\r\n swaps=0;\r\nend","test_suite":"i='X'; %1\r\nd='X';\r\ne=0;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='XO'; %2\r\nd='XO';\r\ne=0;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='XO'; %3\r\nd='OX';\r\ne=1;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='XX'; %4\r\nd='XX';\r\ne=0;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='XXO'; %5\r\nd='XOX';\r\ne=1;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='XXO'; %6\r\nd='OXX';\r\ne=2;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='XOX'; %7\r\nd='OXX';\r\ne=1;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='XXXXOOOO'; %8\r\nd='OOOOXXXX';\r\ne=7;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='XOXOXOXO'; %9\r\nd='OXOXOXOX';\r\ne=1;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='OXXOXXO'; %10\r\nd='XXOXXOO';\r\ne=2;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='XXOOOOXX'; %11\r\nd='OOXXXXOO';\r\ne=3;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='OXXOXOXOXOXOX'; %12\r\nd='XXOOXXOXXOXOO';\r\ne=2;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='XXXOOXOXOXXXO'; %13\r\nd='OXOOXXOXXOXXX';\r\ne=4;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='OXOOXXOXXOXXX'; %14\r\nd='XXXOOXOXOXXXO';\r\ne=4;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='OXOOOOOXOXOXXXXXOOXX'; %15\r\nd='OXOOXXOXXOOXOXOOXOXX';\r\ne=5;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='XXOXXXXOXXOXXXXXXXXX'; %16\r\nd='XXXXXXXOOXXXXXOXXXXX';\r\ne=5;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='OXOXOOXXOOXOXXOXOXOO'; %17\r\nd='XOXOXXOXOXOOOXOXOOOX';\r\ne=3;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='OXXOOXXXOOXXXXXXOXXX'; %18\r\nd='OXOOXOXXXXXXXXXXOOXX';\r\ne=7;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='XXOXXXXXXXOXXXOOXXOO'; %19\r\nd='XXOXXOXOXXXXOOXXXXXO';\r\ne=7;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\n%20\r\ni='XOOXXXXXOXXOXOXXXOOOXXOOXXOOOXXXXOXXXXOOOOXOXXXXXOXOOOOXXOOOXOXOOXOXOOOOOOXOOOXOOXXXXXXXOXXOXXXOXXOXOOOOXOOXXXXOXXXXXXXXOOOOOXOXOXXXOXXOOOXOXXOOOOOXOXXXOXXOXOXOOOOXXOOXXOXOOOOXOOXOOXXOOXXOOOXOXOXXXXOOXXXXXOOXOOXOXXXXXXOOOOOXOXXXOOOXOOOOOOXXOXOOXXOOOOXXXOXOXOXXXOXOOXXOXXOXOXOXXOXOXOOOOXXOXXOXXXXOXOXXOXOOOOOXOXXOOXOOXXXOXOXXOXXOXXXXXOXXOOOOOOXOOOOXOOOOXOXOXXOXOXXXOXOOOOXXOXXXOXXXOXXOOXXXOOXOXXOOXOOXOXOOOOXOOOOXXOXXOOXXXOXXOOXXOXOXXXOXOOOXXOXOOXXOOXOOOXXOOXXOXOXOXOOOOOOXXXXOXXOXOOXOXXOOOOXXXOOOOOOOOXOOOOOOXXOXXOXOOOOOOXOOOOOXOOXXOOXXOXXXOXOXOXXXOOOOOOXXOOOOXOXOXOOXXOOXOXXXOXOOXXOXOXOOXOXOXOXOXOOOXOOXXXOOOXXXOXOOOXOXXOXXOXXOXXXXOXOOXXOXOXXOOOXXXXXOXXXXOOOOOOOOXXOOXOOOXXXXXOOOXOOXOOOOOXXOOXXOOXXOXXXOXOXOXOOOXOXXOXXOOOOOXOOOOXXXOOXXXOOXOXOXXXXXOOXXOXOOOXOOOXXXOXXOXOXXOXOXOOXOOXXXOOXOOXOXOOXOOOOOOOXXOOOOOOXOOOOOOXOXXXXOOXOXOOXXXOXOXXOXOOOXOOOOOOXOOXOXOOXXOOXOOXXOXOXOOOOOOOOXOXXOXXXXOXXXOOXXOXOOXXXOXOXOOOOXXOXXOXOXXOXOXOOXXXOXXXOOXOOOXOOOXXOXXOOXXXXOXOOXOXOXXOOXXOXXXXXXXXXXOXXOOOOXXXOOXXOOXOOX';\r\nd='OXXXXOOOOXXOOOOXOXXOXOXXXOXXOOOXXOOOXXOXOOXXXOOOOOXOOXOOXXOOXOOOXXOXOOXXXOXOXOXOOOOOOOXOXXXOOXOOXOXXOXXXOXXXXOXXXOOXXXXOXXXOOXOXXXOOXOXXOXXOXOOOXXOOXXXOOXXXXXXOOXXXOXOXXOOOOOXOXOOXOOOOXXXOOOXXXXXOOXOXXXOOOOOXOOOOXXXOOOXXOOOOOOOXOOXXOOOOXOXXXXXOOXOXOXOXOOOXOXOOXOOXOOXXXOOXXXXOOOXXOXXOOXOOOOXOOOXOXOOXOXOXOXXOXXOOOOOOOXOXXOXXOOXOXOXOXXOXXOOOXOOOOOOOOOXOOXXOXOXXOOOOOOXOXOOOOOXXOXOXOXXOXOXXXOOOXXOOXXOXXOXOXXOXXXOOOOOXOOOOOXXXXXOXXOXOOXXOXXXXXOOOOOXOXOXOOXXOXOOXXOXOXXOOXOOXOXOXXOXOOOXXXOXXOXXOOXXXXXXOXOXOXOXXXOXXXOOOOOXXXXOXXXOXOXOOXOXOOXOOOXOOOOXOOOXXOXXXXOXXXXOOOOOXOOOOOOXXOOXOOXXXOXOXOXOXOXOOOOOXOOXXXXOOXOXXOXOOXOOXOXXXXOOOOXXOOXOXOOXOOXOOOOXXXOOOOOOOOXOOXXOOXXOOOXOOXXXXXXOOOOXOOOOXXOXXXXXXOXXXOXOXXXOXXXOXOOOXXOOXOOOOXOOOXOXOXOOOXXXOXOOXOXOOOXXXOOOXXXOXXOOOOOOXOXXOXXOOXXOOXOXOOOXXXOOOOOXXOOXXOXOXXXOXXOXOOXXOXOOOXXXOXXOOXOXXXOXXOXXOXXOOXXXXXOXXOXOOOOOXOXXOOOXOXOOOOXXXXXOOXOOXXOXXXXOXOOXXOXXXOOXXOXOXXOOXOXOOOOXXXXXXXOXOXXOXXXXXOOOOXOOXOXOXOOOXXOXOXOOOOXOXOOOXXOOOXXXOXXOXOXXXXXXOXOXOOOOXOOXX';\r\ne=47;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\n%21\r\ni='XOXXOXXXOXOOXXOOOXXXOOXXOOOXXOOXXOOXXOXOXXOOXOXXXOOOXOXXXXOOOXXOOXOXOXXOOOOXXOOOOXOXXOXOXOXOXXOXXXOXXXOOXOOOXXXOXOXXOOOOOXOXXOXXXXXOXOXXXXXOXXOOXXOXXXOOOOXOOOOOOXXXXXXXXOXXXOOXXOOOXXXXXOOXXXOXXOOXXXXXOXOXOOXOXOOXOOOOXOOXXOXXOOXXOOXXOXXXXXXOOXOOXOXOOOXXOOXXOOOOOOXXXXOOXOXXOXOOXXOOXXXOXXXOOOXXOOXOXXXOOXXOOOOOOXOXXXOXOOOXOOXOOXOXOXXOXOOXXOOXXOXXXOXOOXOXXOOOXXXXOXXOOXOOXXXOXXXXXOXOOOXOOOXXOXOXXXXOOOXXXXOXOOXOXOOXOXOXXXOXXXXXXOXOOXOOXOOXXXOXOOOOXXXXXOXXXXOXOXXOOOXOOOOOOOOXXXOXXOOXXXXOXXOOXOXXXOOOXOOXOXXXOXOXXXXXXXOOOXOOXOXXXXOXXOOOOOXOOXOXOOXXXOXXOXXOXXXXXOOXOOOOOXOOOXXOXOXXOOOOXXOXXXXOOOOXOOXOXOOOOXXXOXXXXXXXOXOOXOXOOXOOXOOXXXXOXOOOXXXOXXXXOOOOOOXXOXOXXOXOXXXXOXXOXXXOXOOXXOXXXXOXXXOXOOOXOOOXXOXOXOOOXXOOOOOOXOXOXOXXXXOXOOOXXOOXOOXXXOXXOXXXOXOXXOOOXXXOOXOOXXOOOOOOOOOXXOOXOXXOOOXOXOXOXXXOXXXOOOXOXOOXOOXOXXXOOOOOXOOOXXXOXOXOXOOOOOXXOXXXXXOXXOXXXXXXXOOOOOXXXOXXOOXOXOXXOXOXOOXOOXXXOOXXXXOOOOXXOOOOOOXOOOXXOOXOXOOOOOOXXXOXXOXXOOXXOXXXXXOOOOXOXOOXOOXXOOXXXOXXXXXOXOXOXOOOOOXXOXXXOOOOOOXXXOXOXXOOXXOO';\r\nd='XXXXOXOXOOXXXOOOXXXOXXXOXXXXXOOOXOOOXXOOOOXOOOOOOOOOXXXOOXOOXXXXOXXOXOXXXOXOXOXOOXOOOXXOXXOXOXOXXXXOOOOXXOXXXOOOXOXXXOXOOOOXOXOOOXOOOOXXXOOOOXOOOOXOOXOXXOXXOOXXOXOXXXOOXOXOOOOXOOXXXOXOOOOOOXOXOXXXXOOXXXOXXOXOXXOXOOOXOXXOOXXOXXOXXOXXXXOOOXXXXXOOOOXOXXXXOOOOOXOOOXOOXXXOOOOOOOOOOOXOOOOOOOXOXXOXOOXOOXXXOXXOXXOOOOOXOOOXXOXXXOXOOXOOOOOOOXXOXXOXOXOOXXXOOOXOOXXOOXXXXXOOOOOXXOOOOOXXOXXOXXXXOXXXXXOXXXXOOXXXOXXXXXOXOOXOOOOXXXOOOOXXXOXOOOXOXOXOXOOXOXXXXXOXXXOXOOXOXOXXXXOXOOXOOOXXOOXXOXXXXXXXOXXXXXXXOOXXXXXXOXXOXXXOOXOOOOXXOOOOXOXXXXXOOOXOXXOOXOXOXXXXOOXOOXOOOXXOOOOOXOOXOOXXXXOOXXXOOOXOOXOXXXOXOOXXXXOXXXOXOXXOXXXXOXXXXOOOXXXOOXXXXOOXXOXOOOOXXOXXXXOOXOXXXXXOOXXXXOOXXXXXOXXXOXXOXOOXOXXXOXOXXOOXOXXXOXOOOOXXOXOOXXOOOXOXXOXXOOXXXOOXOOOOXOOOXXOXOXOXOXOXOOXXOOXXXXXXXOOOOOXXXXOOXOXXXXXOXOXOXXXOOXOOXXXXOOXXOXXOXXXXOOXOXXOOXXXXOOXOOXOOXXXOXOOOXOOXOXXXXXOOOOXOOOXOOXOXXOOOXOXOXOOXOXXXOXOOXXXXXXXXXOOXOOXOOOXXOXXOOOXXXOXXOXXOOOXXOXOXOXOXXXOOXOOXXOOXXOOXOXOOOXXXOXOOXOXXOXOOXXOOOOXOXXOXOOOXXOOXOOOOXXXOOXXOXOXOOXOX';\r\ne=60;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\n%22\r\ni='XXXXOOOXXOXXOXXOOXOXXOXOOOXOXOOXXXOOOOOXXOOXXOXOOOXXOOOOXOOOOXXXXOXOOOOXOXXOOOOXOOXOXXXXOXOXXOXOOOOXXXOXXOOOOXOOXOOXXOOOOOXOXOOXXXXXOXXXOXXXOOXOOOOXOXXOOOXXXXOOXOOOOOXXOXOXOOXOOOXOXOXXXXXOOOXXXOXOOXXOOXXXXXOXXXXOOXOXXXXOXOXXOOOOOXOXXXXXXOXXOOOXOOXXXOOOXXOOXOOXXOOOOXOXOOXOOXXXOXXXXXOOXOXOXXXXXXXXOOXOXXOOOXOXOOXXOOOOXOOOOOXOOXXOOXOOXXXOXXOOXXOXOXOXOXXOXXOXXOOOXXOOOXOXOOOOXOOOOXOXXXOXOOOOXXXXXXXXOOXXOOOXXOOXXXOOXXXXXOXXOXOXXXOOOXOOXXOXXOXOXXOXXOOOXOXXOOOXOXXXOXXXOOXXOXXXXXXOOXXXXXOOOOXOXOXOXOOOXOOOXXXOXOOXXXOOXXXOOOOOXXOXXOXXOOXOXXXOOOXXXOXXXOOOXXXXXXXOOOXOOOXXXXXXOXXOXOXXOOOXXOOXOOOXOXOOOXOXXOXXOXOOXOOXOOOXOOOOXOXOXXOOOXOXOXOXXXOOOXOOOXOOXXXOOXOXOXXOOXXXOOOOOOXXXXXXXOOOXXOXOXXOOOXOXOXXOOOOOOXXXXXXOOXOOXXXXOOOOOOOXOOOOXXXXOXOXOOXOXOOOOXOXXXOOOOXXOXOXOXOOXXOOOOOOXXOOOOOXXXXXXOOXOOOOOOXXXOOXXOXXOXXOOOOOXOXOXXOXXOXOXOOXXXOOOOOXOOXXXOXOXOOOXXOXOOOOOXXOXOOOXOXXOOXOXXXOOXXOXXXXXOXOOOXXOXXOOOOOXXXOXXOOOXOOOXOOXOOXXOXXXOXXXOOXXXXOOXXXOOXXXXOXXXXOXXXOOXXOXOOXXOOXOXOXXOXXOXOOXOOOXOXXOOOOOOOXOOOOXOX';\r\nd='OXOXOXXOXXXXOOXOOXOOXXOXXOOXOXXXXXOOOXXOXOOXOXXOXXOXXOOXXOXXOXOOOXOOOOOOXXOOOOXOXXOOXOXOXXOXXXXOXOXOOXOXXXOXOOOXOXOXOOOOOOXOXOOOOXXOOOOXOXOOOOXXOOOXXOXOXOOXXOOXOOOOXXOOXXOXXOOXXOOOOXOXXXOXXXXOOXXOXXOOOXOXXXOOXXXOOXOXOOOXXOOXOOXXXXOOXXOOOOOXOOXOXXXXXOOOXOOXXOOOOOXXXXOXOXXXXOXXOOXOOOOXOOOOOXXOOXOXOOOOOXOOXXXOOXXOOOOOXXXXOXXXOOXXXXOXOXOOXXXOXOXOXOOXOOXOXXOOXOOOOOOOXXXOOXOXOXOOOOOOXOXXOOXXOXXXXOXOXOOOXOXOXOOOXOXOXOXXXXXOOOXXXOXOXOOXXXOXOXOOOOOOOXOOXXXOOXXXOOOOXOOXXXOXOOOOXOOOXXOXOOXXXXXXOXOOXXOOXXXXXOXXXXXXOOOXOXOOOXOXOXXXXXXXOXOOXXOOXXOXXOXOOXXXXOOXOXOOOOOOXOXXOOOXOXXXXOXOXXOOXOOXXXOOOOXOXOXOXXXOOXOOOXXOOOXXOXXXXXOXOXOOXOXOOOXOXXXOOOXOXOOOXXXOXOXOXOOXOOXOOXXOOXXXOOXOOOOXXOOOXXXXOOXOOXXXXOOXXOOXOOXXOOXXOOXOOXXOXXOXXXOXXOOXXXOOOXXOOOOXOXOXXOXOXOXXXOOXXXXOXOXXXOOOXXXOOXOOXOOXXXXOOOXXOOOOOOXXXOOOXOXXXOOOXOOXXXXOOXOXXOXXOOXOOXXXXXOXXXXXOOXOXXOXXOXOXOXOXXXOOXOXOXXOOOOXXOOOOOOOOOOXOOXOOOXXXOXXXXXOXOXXXOOXOOOOOOXXXXXXXOXOOOXXOOOOXXXXOXOXOXXOOXXOOXXOXXOXOXXOXXXXXOXXOXOXXXOOOOXXXOXOXOXOOOOXXOXOOXXO';\r\ne=47;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\n%23\r\ni='OXXXXOOXXXOOOOOOXXXOOXXXOOOOOXOOOOXOOXXOXOOXOOXOXOOOOOOXXXOOXOOXXXOOXXOXOOOXXOXOOOOOOOOXXOOXOXOXXXOXOOOOOXOOXXOOOOXXOXOXXOXOXOXXOXXXXOXXXOXOXXXXXXXOXXOXXXOXXXOOOOXOXOXXOOOXXXXXOOOXXXOXXOXOOXXOXXXOXOXOOOOXXXOOXXOOOOOOXOXOOOXXXXOXOXOXXXOOOOXOOOXOXOXOOOXOOXOXOOOXOOOXXXOOOXXXXXXOXXXOXOXOXOOOOXXOXOOOXXOXXOOOXOOOXOOXOOOXXOOXXXXXOOXOXXXOOOXXXOOXXXXXXOXXOOOOXXOOXXXXXOOXXXOXXXXXXXXOOOOOOXOXXOOOOOXXXOXXOOOOXOOOXXOXOXXOXOOOOXXOOXOXOOXXOXOXOXOOXOOXXXXXOOXXOXXXXXOOXXXXOXOOOOXXXXOOXXXXOOOOXOOOOOOOOXXXOXXXXOOXXXOXXXOOXOXXOXOXXXXOXXOOOOOXOOOOXXOOOXOOXXXOXOXXOOXOOXXOOXXOXOXXXXOXOXXXXOXXOXXXOXOOOOOOOOOXOOOOOOXOXXXOXOXOXXXXXOXOXOXOOOXOOXXOXXOXXOXXXOOOXXOOOOXOXOXXOXOOOXXOXXXOOXXOOXOXXXXOXXXOXXXXOXXXXXXOOXOXOXXXOOOXXXOXOOXXOOOOOXOXOOXOXOXXXOOOXXXOXOXXOOOXOOXXOOXOOXOXOXXOXXOOOXXOXOXXXXXXXXOOXXOOOXXOXOOOOXOOOOXOOOXXXXOOOOXOOXXOXXOXOOOXOXXOOOOXXOOOOXOOXXXXXOOXOOXXOXOXOOXXXOOXXOOXXOXXOXXOOOXXXOXOOOXOXOXXOXXXXXXOXOOXXOXXOOXXOOXOXXXOXOOOOXOXOOXXOXXOXXOOXOXXXXOXOXOOOOXOOOOXXXOOOOXXXXXXXXOXXOXXOXXXXXOXXXOXXOOXXXXO';\r\nd='XXOOXXOXOOXOOOOOXOXXXXXXXOOOXXXOOXOXOXOOOXXOOXXXOOXXXXOOOOXOOOOXOOOXOOXOXXOOOOOXXXOXOOXOXOOOOXOOOXXOOXXOXOXOXOXXOOOXXOOXOXOXOXXXOXXXXOOXXXXOXXXOXXOXXXOOXXXOXOXXOOXXOXXOXOOOOOXXXOOOXOXOOXXXXOXXOXXOXOXXOOXXOOXXXXXOXXXOXXXXXXOOXOOOOXOXOOXOOOXOXXXOXOXOOXOOXXXOXXXXXXXXOXXXOOOXXXXXXOXOOXXXOXXXOOXOXXOOXXOOOOXOXXXOOOXOOXOXOOOXXXOOXXXOOOOOXOOXXOXXOOXXXXXXXOOXOOOXXXOXXXOOXOOOOOOXOXXOOXOOOOOXOXXXOXOXOOOOXXOXXXXOOOXOXXOOXXXOXOXXOOOXXXOXXXXOXOOOOXOXXXOXOXOOXOOXOXXXOXOXXOXOXXXXXOXOOOXOXOOXXXXXOOOXOXXOXXXXOOXOXOXOXXOOOXXXXOOOOOOOOOOOXOOXXOOOOOXXOXXOXXOOOOOXXOXXXXOOXOOXXOXOXOXXXXXOOXOOOOOXOXXOXXXXXOXXOXOXXOOXOOXXXXXOOOOOXOOOOXOXOOOXOXXXOOOOXXOOXOOOOOOXXOXXOXOOOOXOOOXXXXOXXXOXOXXOXXOXXOOXOOOXXXXXXXOXOXXXOOOOOXOOOXXOXXOOOXXOOXXXOXXOXOXXXOOOOOOXXOXOOXXOXXXOXOXXOXOOOXOOXXOXXOXXXOXXOOOOOXOOXOXXXXXOXOXOXOOOXXXOXOXOXXOOXOOOXXOOOXXXOOOOOOOOOOOOXXOOOOXXOOXOOOXXOXOXXOXOXXOXXXOOOXXXOXOOXOOOXXOOXXXOOOOOXXXXOXXOXXXOXOXXXOXXXOXOOOOOXOXXXXXXXOXOOXOXOXXXOXXXXOOXOOXOOXOOOXXOOXXOXOXOOXOXXXOOXXOXXXXOXXXOOXXOOXOXXOXOOXOX';\r\ne=42;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\n%24\r\ni='XOOXXOOXOOOXOOOOOXOOOXXOXXOOOXOXXOOOOXXXOXOOOXXXOXOOXXXOOXOOXOXXXOOOOXOXXOOOXOXXOXXXOXXXXXOOOOXXXOXOOOXOXXXOXOXXOOOOOOOOOOOOOXOXOXXOOXXOXXOXXOOXXOXXXOXOXOXXXXXXOXXOOXXXOXOXXOXXXXOOXXXXOXOXXOOOXOXXOXOOOXXOXOXXXXXOOOOXXOOXOXOOXXXOOOXOOXOOXOXXOOOOOOXXXOOOOOOXXOOXOXXOOXXXXOXXXOOXXOOOOXXOXXXOOXXXOXXOXOOXXXOXXXXOXXXOXXOOXXOXXOXXXXXOXXOXXOOXOXOXXOXOXXOOOXOXXOXXOOOOOOOOOOOXXOOOXOXXOXXXXXOXOOXXXOOOOXOXOXOOXOOOOOOXOXOOOXOXXOXOXXOOXOOOXXOXOOXOXXXXXXOOXOXOOOXXOOOOXOXOXXOXXXOOOXOOXOOXOOXXXXOXOXOOOXXXOOXOOXOXXOOOXXXXXXOXOXOXXOOOXXXOOXXOXOXOOOOOXOOXOXXOXOXXXOXXOXXOXOOOOXOXXOXOXXOOXXXOOXXXXXXOXXXXXXOXOOXXXXOXXOXXXOOOXOXOXXOOOOOOXOOOXXXOOXOOXOOOOOOXXXXXOXXXXXXXXXXXOOOXXOOXXXOOXXOOOXOOXOOXOXOXOOOOXOOXOOXXXXOOOXOXXXOOOOOXXOXXXXOXXOXOOXOXXXXOOXXOXOOOXXOOOOXXOXXXOOOXXOXXXOOOOOOXOOXOOXOXXXOOXXXXOOXXOOXXOOOXOOOOOXOXXOOOXOXXXXXOOOOOXXXXOXOOXXOXOXOOXXXXOOXOXXXXXXXOXXOXOOXXXXXXXOOXXXXOOOXOXOOOXXXXOXXXXXXXOXOXXXXXXOXXXOOXOOXXXOXOXXXXOOXXXXXOXOXXOOOOXXOOOXXOXOOXOXXXOXOOOXXOXXXXOOXXOXOOXOXXXXXOXOXXXXXOXOXOXOXXXOXO';\r\nd='OOXOXXXXOOOOOXXXOXXXOXOXOOOOOOXXXOOOXOOXXXOOOXOXOOOXOOXXXXXXXXXXXXOXXXOXXOOXOOXOOXOXXXXXXXXXOXOOXXOXXOOOOOOOXXXOXOOXXXOXXXOOOXXOOOXXOOXOOXOOOXOOXOOOOOXXXXXXOXXXOOXXXXXXXOXOOXXOOOXOXOXOOXXXXOXOOXXOOOOOXXOOXOXOXXXOOXOXOOOOOOOXXXOOXOOXXOXOOXOOOOXXOOXOXOOOXOXXOOXOXXOXXXOXOXOXXOOXOOXXOXOOXXOXXOOXXOOOXXOXXOXOXXXXXXOXXOOXOOXOXOXXXXXOXXOXOXXOOOXXOXOXOXOOXXXOOXOOXOOXXXOXXXOOOOXOXOOXOOOOOOOXXXXXXOOXOOOOOOXXOXXOXXXXXXXXXOXXXXOOXOXXOXXOOOXXOOXXXXXXOOXXOOXXXOOOOXXOOXXXOOXXOXXXOOOOOXOOOXXXOXOOXOXXOOXXXXOOOXXXXXXXXXOXXXXOXXOOOXOOXXOXXXXOOXXOXOXXOXOOXOXXXOXXXXXXXOXOXXOXOXOXOXOXXXXXOXOOOOXXXXOXOOOXXXOXOXOXOOXXOXXXOXOXXXOOXOXXOXOOOXOXOOXXOXXOOOXOOXXOOXOOXOOXXXXXOXOOXXOXOXXXOXOOOXXXOXXOXOOOXOXXOXXXXOOXOOXOXOOOXXOXOXXOXXOXXOOXXOXOOOOOOOXXXXOOOXXOXOOOXOOOOXXXXOXXXOXOOOOXOXXXOOXOXOOOXXOXXOOOXOXXXXOOXXOOXXXOOOXXXOOXOXXXXOOXXXXXXXXOXOXXXOOXOOOXXXXXXOOXOOXXOOXOXOOXOOOXOXXXXOOXXXXXXOXXOXXXOXXOXXXOOOOOOXXOXOXXOOOXXXOXOOOXXOXOOOXOXOOOOXOOXOXOOXXXOOXOOXXXOOXOXOOOOOOOOOOOXXOXOOXOOXXOXOXOOXXOOXXXOXOXXOXXOXXOXOOXOOXO';\r\ne=64;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\n%25\r\ni='XXXOOOOOOOXXOOXXXXOOOXOOOXXXOOXOOXXXXXOOXXXXXOXOOXXXXXOXXOOOXXOXXXOXXOXOOOXXXXXXOXXXOOXXXOXOXXOXOOOXXOOOOXXOOOXXXXXXXXXOXOOOOOXXOOOXOOXOXOXOOXXXOXXOXOXOOOXXOOOXXOXXXOOOXXOOOXOOOXOOXOXXOOXOXOXOOOXOOXXOXOOXXOOOOOOOXOXOXOXOOOOXOXOXOXOXOXXOOOOOOOXOOOOXOOXXXOOOXXOOXOOXXOOOXXOOOXOXXOOOOXXOOOXXOOXXOOOOXXOOOXOOOXXXOOXXXXXXOOXXOOXXOXXOOXXXOOXXOOOOOOOXOXOOXXXOXXOOXXXOOOXOOOXOOOXOOXXOOOXOOOOXOXXXOXOXOXXOXOOXOXXOOOOXOOOOOXOXOOXOXXXOXXXXXOXXOOXOXXOOOXXXXXXXXXXXXOOOXOXOOXOOOXXOOXOOOXOOOOXOOOXOXXXXXOXOOOXXXOXXXOOOXOOXOOOXOXOXXOXXOOOOXXXOOXOXOOOXOXXOOXXXXOOXOXOXOOXXXOXOOOOXOXOOOXXXOXXXXXXXXXXXXXOOOXXOXXXOOXOOXOXXOOOXXOOOOXOOOXXOOOXXXOOXXXOOOXXXXOOOOXXOOXXXOXOXXOXOXXXXXXOOOOOOOOXXOOOOOOXXOXOOOXXXOOOOOOXXXXXXXOOXOOXXOOOXXXXOOXXXOOOXOXOOXOXOXXOXXXXOOXOXXXXOOOXOOXXXXOOOXOOXXOXOOXXOXXOOOOXXOOOXXXXXXXXOOXOXXOXXXOXXOOXOXOOOOXXOXOXXOOXXOOXOOOOOOOXOOOXOXOOOXXXOXOOXOXXOOXOXXOXOXXXXOXOOOXXOOOOOOXOXXXOOXXOXOXOXOXOOOXOXXXOXOOXOOXXXOXXOXOOXOOXOXXOOOXXOXOXXXOOXOXOOOXOOXOOOOXXXXOXXXXOXOOOXOOXXXXXOOOXXOXXXOXXOXOOXOOO';\r\nd='XXOXXXXOXOOOXOOOXOXOOOOXOOOOOXXXXOXXXXOOOXXOOXOXXOOOXOXXOXXOXXXOOXOOXOOOXXXXOOOOOOOOXXXXOOXXXXXXOXOXOOOOOXXXOXOOXXOXXXOXXOXOXOXXOOOXXXXOOXOXXXOXOOXOXOOXOXXOXOOXXOOXXXXOOOXXOXOXOOOOOOXXXXOXXXXXOXXOOOXOXXOOOOOOOOXOOOOOOXXXOXOOOOOOOXOOOXXXXOOXOXXXOOOOOOOOOXXXXOOOOXXOOOOOOXOOOXOXXXOOOXXXOOOXXOOXXOOOOXXXOXOOXOXXOXXOXXOOXXOXOOXOXOXOOXXOOOXXXXOXXOXOXXXOXXOXOOXXXOXOXXOXOXXOXOOOXXXOOOOXXXXOXOOOXOXXOOOOOOOOOOOXOOXOXOOXXOXOXXOOOOOXXXOXOXXXOXXXOOXXOOOOXOOOOOXXXXOOOXXXOXXXOOXOXXXOXOXOXXXXOXXOOXXOXOXOXOXOXXXOOOXXOOOXOOXOOOXXOOOXOOOXXOXXXXOOOXOOXOXXXXXOOOXOOOXOOXXXXXOXXOXOXXOOXOOOOXXOOOXOOOOXOXXXOOXXOXXXOOXOXOOOOOXOXXXXOXOOOOOXXXOOOOOOOXXOXXOXOXOOOXXOXOOXOOOOXXXOOXXXXOXXOOOOOOOXOXOXOXOXXXOXOOOXOXOXXXOXXXXXXXXXOXXOXOOOXXXXOOOOXXOOXXOOXOXXOXOXXXXOXOOXOXOOOXXXOOOXOXOXXXXOOOXXOXXOXXOXXOXXXOXXOXXOXXOXXOOOXOOXXXXOOOOOXOXXXXXOOOOXOXXXOXXOXOXXXOOXXOOXOOXOOXOOXOOOXOOXXOOOXXXXXOOOOXOOXOOXXOOXXXXXXOOXXOXOXOXXXOXOXOOOXOXXXOOXXOXXXOXXXOOOOOOOOXXOXXXOXOOXOOXOXXOXOXOOOOOOXOXOXXOOXOOOOXOOXXOXOOOXXXOOOOXOXXOXXOXOOXO';\r\ne=23;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\n%26\r\ni='OXXOOOOOOXOOOOOXOOXXXXXOXXOOOXOOXXXOOXOXOOXOXOOOXXXOXOXXOOOOXXXXOOXOOXXXXXXOXXXOXXOOXOOXXOXXOXXOXXOXOOOOXXXXXOOOOXXOXXOOOOOOOXXXOOXXOOOXXOOXXXOXOXOXXXOXOOOOXXOXOXXOXOOOXOXXXOOXXXOXXXOXXOOXOXOOOOXXXOXOOXOXXXXXOXXOOOOOOXXXXOOXOXXXXOXOOOOOXXOXXXXXOOXXXXOXOOXXXOOOXXXXOXOXXXOOXXOXOXOXXOOOXXOOXXXXOOXXOOXOXXXXXXOOXXOXOXOXXOOXOOXXOXOOOXOOXXOOXXOXXOOXOOOOOOOXOXOOXOOOOOOXOXXOXXXXOOOXXXXXXXXOXOOXXXOXOOOOOOXOOOOOOXXOOXOOXXOXXOXXOOXXXOXOOXOOXXXXXOOXXXOXOXOXXOXOXOXXXXOXXOOXOXXXOOXXXXOOOXXOXOXXOOXOXXXOXXXXOOXOXOOOXXXXXXOXOOOXOOXXXOXOOOOXXOOOOOOOXOOOXXOOXXOOXOOOOOXXXOXOXOXOOXOXOOXXOOOOOXOOOOOXOOOOXXOOOOOXXXOXXXXOOXXOXOOOXXOXXXXOOXXOOOOOXOOOXXOXOOOOXOOXOOXXOXOXXXXXXXXOOXXOXXOOOXOXXOOOOXOOXOOXOXOXOOOXXOXXXOOOOOXOXXXOXOOXXOXXXOOOXXXXOXXXOXXOOOOXOXXXOXXOOOOOOOXOXOXXXOOXOXXXOXOOOOXXXXOXXXXXXXOXXXXOXOXOXXOXOXOOXOXXXOXXOXXXOOXXXOXOOOXXXOXOOXXOXOOOOOOXXOXOXXXOXOXOOOOOOXOXXOOXOXXOOOOXOOOOXXOOXOOXXOXXOXOXXOOOOXXOXXOOXXXOOOXXXOOXXOOXXOOOXXOXXOXXXXOOXOOXOOXXOOOXXXOXXOXXOOXOXOOXXOOOOOOXXOXOOXXOOXXXXOOXOXXOXOXXOXX';\r\nd='XOOOOXXOXXXOOXXOOOXOXOXXXXOXOOXXXXXOXOXOXXXXOOOOXOOOOXOOXOXOXXXXOOOXOXXOXOOXXOOXOOXXOOXOXXOXXXOOOOXXXXOOXOXXOOOXXXXXOXXOXXOXOOXOOOXOOOXOOOOOXOXOOOXXOOXXXXXOOOOOOXXXXOOOXXXOOOXXXOXOOXXOXXOOOOOOXOXOOOXXXXOXXXXXXXXXOXXOXOXOXXOOXXXXXOOXOOOOXOOOOOXOOOOOXOXXOOOXXXXOOXXXOXXOOXXOOOOOOOOXXXXOXOOXXOXOXOOXOXOOXXOOOXOXXOXOXXOXOOOXOXOOOOOXOXXOOXXXOOXOXOOOOOXXXOXOXXXOOOOXXXXOXOOXXOXXXOOOXXOXXOOXXOOXOXXOXOXXXXXXOOXOXXOXOXOOOXXOXXOXOXOOOXOOXOOOOOOXOOOOOXXXXXXOOXXXOOXXOXXOOOOXXXOXXOXOXOXOOOOXXXOOXOXXOOOXOOXOXOOOXOXOXXOOXXOOOXOXOXOXXXXOXOXOOXXXXXXOOXOXXOXOXOOOXXXOOOOXXOXXXOXOXXOXXOOOXXXOOXOOXOXXXXOOXOOOOXOOOOOOXXOXXXXOOXOXXXXXXOXXOOXOOOOXXXXOXOOXOOOOOXXXXXOOOXXOXXOXXXXXXXXOOXOOOOOXXXXOOOOOXOXOXOOOXOOOOXOOOOOOXXXXXXOXOXOXXOOXXXOXXOXOOXOXXOOXXXXXOXOXXOXOOXXXXXOOOXOOOXXOOOXOXOXOOOOXOOXXXXOXOXOOXOXXXOOOOXXOXXXXXXOXXOXOXOXXXXXXXXOXOXXXOOXXOXXOOXXXXXXOXXXXXOXOOOOOXXOXOOXOXXXXXXXOXXOXOOOXXOOXXXOOXXOOOXXXXOOOOOOXOOXOOOOXOOOXOXOOXOOOXOXXXOOXOXOXXXXOXOXOOOXOOOXXXOOOXXOXXXXXOXOOOOXOOOOOXXXXOOOXXOXOXXXOOXOOOOXXOOX';\r\ne=38;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\n%27\r\ni='XOXOXOOXOXXOXXOOXXOOOXOOOXOOXOXXXXXXXXOXXOOOOOXOOXOXXOXOXXOOXXOOOOXXOXOXOOXOXOOXXOOOXOXOOXOOXOOOOOOOOXXXXOOOOXOXXXXXOOXOOOOXXOOOXXXOOOXXXXOOXOXOXXOOOXXOXXXOXOXOOOOXXXXXOXOOOXXXXXXXOOOOXXOXOOXXXOXXXOXXOXOOXXXOXOXXOOXOXXOXOXOXOOXOOOXXOXXXOXXXXOXXOOOOXOOOOXXXXXXXXOXXXOXXXOXOOOXXXXOXXXOXOXXXXOXOOXOOXOXXXXXXOOXOXOXXOOOOOXXOXOOXXOOOOXOXXOOOXOOOOXOXXOXOXOOOXXXOXOXOOXOOXOOXOXXXXXOOOXOOXXOOXOOXOOOXXXOOXXOXOOXXXXXOXXXXOXXOXXOOOOOXXXXOOOXOXXXOOOOXOXOOXXOXOXOXOXXOOXXOOXOXXOXXOXOOXOOXOXOXXOOXXXOXXXXXXXXXXOXOXXXOXOXXXOXXOXXXOOXOXOOXOXOOXXOOOXOXXOXOXXOOXXOXOXXOXXOXXXXOXOXOXXOOXOOOXXOXOOXOOXXXXXOXOOOXXOOOOOXXXXXOXOXXOXOOXOXOXXOXOOXXOOOOOXXOXXXXXOOOXOOXOOOXOXXXXOXXXXOOXXXXOXXOXXXXXOOXOOXOXXOXOOXXOOOOOXOOXOXOXXXOXXXOXOXXXOXOXXOXXOXOXOXXOXXXOXXXXOOXXXOXXOOXOOOXOXOOOXOOXXOXXXXOOOXOOXOOOOOOOOXXOOXXOXOOOOXXOOOXOXOOXOOXXXXOXOOXXXXXXXOXOXOXXOXOXXOOXOXOXOXXXOOXXOOOOXOOXOOXXXOXOXOOOXXOXOOXXXOXXOXOXOXOXXOXOOOOXXOOOOXXXXXOOXXXOOXXOXXXXXOXOOOXXOXOXOOXXOOOXXXOOOOXOXXXOXXXOXOXOXOOOOOXXXOXXXOOXOXOXXOXOOOXXXXOOXXXXOO';\r\nd='XXXXXOXOXXOOXXXOXOXOXXOXXOOXXXXOOXOXOOXXXXXXXXXOXOOXOXOOXXOXXXXXXOOXOOOOXXXXOXOOXOOOXOOXOXOOXOOOOOOXOXOXOXOOXXOXXXXXOOOXXXOOOXOXOOXOXXOOOOXXXXOOXOOXOOOXXXXOXOOOXOXXXOOXOXOXXOOOXXOXOXOXOOOXOOXOXOXOXXOOXXXOXOOOOXOXXOXXXXOOXXXOXOXOXOXOXXXOXXXXXXXXXXXOXXOXOOOOXXOOXOOXOXXXXXOOOXXOOXOOOOOOOOXOXXOOXOXOXOXOXOOXXXXOXXOOXXXXXXXXOOXXXOOOOOXOXXOXXOOOOXOXXXXOOXOXXXOOOOOXXXOOOOOXOXXXXOOXXXXXXOXXXXXXOXXOXXXOXXOXXXXXOXXOXXOOXOXOOOOOXXOOXXOOXXXXOOOOOOOOOXOOXXXXOOXXXXOXOOOOOOXXXOOOOXXOXOXXOOXOXOXOOOXXXOOOOOOOOOXXOXXOXOOXXXOOXXOOXXXOOOXOOOXXOOXOXOXXOXXXXOXXOXOXOXXXOOOXXOOXXXOOOXOOOOOOXOOOOXOXOXXXXOOXOXOXOXXOOXOXXOXOOXXOXOOXXOOXXXXXXOOOOOXOOXXOXXXXOOXOOXXXXXXXOXXOXXOOXOXOXXXXXOXOOXXOOOOXXOOXXXOOXXOXXOOXXXOXOOOXOXOXXOOXXXOXXXOXXXOXOXXOXOOXOOOXXOOXXXXXOOOXXOXXXXXXXXXOXOOXXXOOXXXXOOOXXOXXOXXOXOXOOXXXOOXXOOOXXOXXOXXXOOOOXOOOXOXOOXXOOOXOXOXXXXXXOXOOOOOOOOOXXOXXOOOOOOOXOXXXOXOXOXXOXXOOXXOOXOXOOOXOOOOOXXOXXXXXXOOOXXXXOXXXXXOXXXXXOXOXXXOOOXXOOOXXOXXXOOXOOOXXXOOOXXOOXOOXXOOXXXXOOOXOOXOXOOXOOXXOXOXXOOXXXXXXOOOOOOX';\r\ne=36;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\n%28\r\ni='XXXXOXOOXXOOXOXXOXOXOOXXXOXOXOXOOOOOXOOOXXOOXOOXOXOXOOXOOXXXXOOXXOOXXOOOOXOXOXOOOXOXXXOOXXXOXXOOXXXOXOOOOOOOOXXOXOXXOOOXOXOXXOOOXOXXOXXOOOOXOXXXXOXOOOXOXOOOXXOXXXOXXXOXOXOXXOOOOXXXXXXOXOOOOXOXOXXXXOXOXOOOOXOOOOOOOOOOOXOXXXOXOXOXXXOXOOOOOOXXXXOXOOOOOOXXXXOXXXXXOXOOOOOOOXXXOOOOOXOOXOXXOOXXOOOXOXXXOXOOXXOOXXOXXXOOOOXXXXXOOXXOOXOOOXOOOXXXXXOXOOXOOOXOXOOOXXOOOOXXXOXXOXOOOXOXOOOOOOOXXXOXXOXXOXXOXXXOXOXXOXOXOXXOXOOXOXXOXOOOXOOOOXOXOXOXOXXXXXOXXOXOOXXXXOXOOXOOXOOOOOXXXXXXXOXOOOXXOOOOOXXXXXOXXXXXOOOXXOXOXOOXXOOXOXOOXXOXOXOXXXXOXOXXOOOXOXOOOOOOXOXOXXXXOOXXOOOOXOXOXXOOXXXOOOXOXXXOXOXXXOXXOOXOXOOOOOXXXOOXOXOOXXXOOOOXOXXXXOOOXXOXOOXOOXXXXOXOOXXXXOOXOXXOOOXOOXXXOXOXXXXXOOOOOXXXOXOOOOXOXOOOOOXXXXXXOXOXOXXXOOXOOXOXXOXXXOXXOOOOOXXXOXOXOOOOOXXOXXXOOXXXXXOOXOOOOOOXXXOOOXXOXOOOOOXXOXOXOXXXOOXXOXXXOOOOXOOOXOXOXOXOXOXOXXOOOXXXOXOOOXXOOXXXXOOOOXXOOXOOOOXXXOXXXOXOOOOOOXXOOOOOXOXXXXOXOXXXOOXOOOOXXOXOOOOOXOXOXOXXOXXXXOOOXXXXOOOOXOXXXOOOXXXXOOOXOXXXXXOOXXXXOXXXXOXXOOXOXOOOXOOOOXOOXOXOOXXXXOOXOXOXXXXOXOOOXOOOOOO';\r\nd='XOOOXXXOXXOXXOOXOOXOXOXXOOOOOOXOXXXXOOOOXXOOXOOXXOOOOXXXOOOXXXXOOOOOOOOXOXXXOXOXXOXOOOOOXOXXXXXOOOOXXOOXXXXXOXXXXXOXXXOXOOOOOXOOOXOXXXXOXXXXXOOOXOOXOXXOOOXXOXOXOOOXXXOOOXOOXOOOXXOXOXXOOOXOXOXXXOXXXXXOOOOXXOXOOXOOOOXXXXXOOOXXOXXXXOXOXXXXOXOOOOOXOXOXXOXOXOOOXOXOXXOXXXXOOXXOOXOOOOOXOXOXXXOOXOXXOOOOXOXXXXOOXXOXOXOXXXOXOXXOXXXXXXOOXXOOOXXXOOXOXOXOOOOOXOXOXXOOOOXXXOOOXXOOOXOXOOXOOXOXOOXXOOOXXXXOOOOOOOXOOOXOOOOOXXXXOXOXOXXOXOOXXXXOOXOXOXXOXOOXOOOXOXOXOOXXXXXOXXXXXXOXOOOOXXXOOOOOXXOXXXXXOXXOXXXOOOXOOOXOOXOXXXXOOXXOXOOXOOOXOOOOXOXOXXXOXOOXOOXOXXOOXOXXXOXOOOOOOOOOOXOOOXOOXXOOXOOXOXOOOXXXOXXXXOOXOXOXOOXXXXOOOXOXXXOOXOXOXXXOOXXXXOXXXXXOXOXOXOXXOOXOXXOXXOOXXOOOOOXOXXXXXXXXOXXOOXXXOXXOOOXOOOOOOOOOXOXOOOXXXXXOXOOOOOOXOXOXOXOOOOXXOOOXOOOOOXXOXOOOXOOXXOXOXOOOXXXOOOXOOXOOOOXXXXXOOXXOOXXXXXOOOOOXOXOOXOXOOXOOOXOOOXXOOXOOOXOOXXOOXXXXXXOOXOXOOOOXXXOOXXOXOOOXXOXXOXOXXOXOXXXOOXOXXXOOXXXXOXXOOXOOOXXOXOOOXXXXXXOXXOOOXOOXOOOXXXOOOOOXOOXXXXXOOXXXOOXOOXXOOXOXOOOXOXOOOXOXXXOXOOXOOXXOOXOOOOOOXXXOXXOXOXOXOXOXXOXXOXX';\r\ne=32;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\n%29\r\ni='OXXOOOOXOOOOXXOOXXXOXOOOOOOOXOOOXOXXXOXOXOXOXXXOXXOOXOXOXXXOOOXOOXXXOXXXOXXOXXXOXXOXXOOXXXOXOOXOXOXXXXXOOOOXOOOOOOOOXXXXOXXOOOOXOOOXOOXXOXOOOOXOOOXXXXOXXXOXOXXXOXOOXOXOOXXOOOOXXOOXXOXOXXOXXXOXOXOXOXOOOOXOOOXOXOXOXXXXOXXOOXOOXOOXXXXXXOXXXOXXOOOXXOXXOXXOXXXXOOOXOXOOOXOOOOOOOXXOXOXXOXOOXXXXXXXOOXXXOOOXXOOOXOOOXXXOXXXXXOXXOXXXOXOOOXXXXOOXXXXOOOXOXOXXXOXOOXXOXXXXOXXXOXOOOXOXXXOOOOOOXOXXOXXOXXXOOOXOXXXOXOOOOOOOOOOXXOOXOOXOOXXOXXOXXXXOXOOXOXXXXOXOXXXOXXOXXXXOOOOXXOOXXXOXOXOXOXOOXXOXOOOOXXXXXXXXXOXXXXOOOOOOOOOOXOXXXXXOXOXXXOXXXXOXXOXXXXXXXXXXXOOXXXOOXOOXXXXOXXOXOOXOXXXOXXXOXXXOXXXOXOXOXXOOXOXOXXOOXOXOOOOOXOXXXXOXXXOXXOXOXXXOOOXOOOXXXOXOXXXXOOOXXXXXOOOOOOXOOXOXOXXOOOOOXXXOXOXOXOOOXOXOXXXXOXXOOXXXXOXXOOXXOXOXXXXXXOOOXXXXXXXXXOOOXOXXXXXXXXXXXXXOXOXXOOOXXOOXXOXXXOOOXOOXXOOXXOXOXOXXOOXXOXXXXOOOXOXXOXXOXOOOOXXXXXOOOXXOXOOOXOXOXXOXOOOXOXXOXOXOOXOOXOOOXOXXOOOXOXXOOOXXOOOXXXOOXOXOOXOOXOXXXOOOOXXOXXOOXXXXOOOOXXOXXOXXXOOXOOXXXXOOXOOXXXOXOXXXOOOOOOXOOXOOOOXXXOXOXOXOOXOXOOOXOXXOXXXOOXOXXOXOXOOXOXXOOXXXXXX';\r\nd='OXXXOXXOXOXXOOOOOXOOXXOXOXOOOOOXOXOOXXXOOXOOOXOXXOXXXOOXOXXXOOXOXXXXXOOOXXXOOOOXOOOOOOOOOXXOXXOXXOOXXOXOXXXOXXOXOOXXXOXXXOXXXXXXOOOOXOXXXXOOOXXOOOOXOOOXXXXOXXXXXXOXXOOOXXOXXXXOXOXXOXXXOOOOOXXXOOXXXXOXOOOXXOXXOOXXOOXOOXOXOOOOXXXOOXOOXOOOXXXXXOXOOXXXOOOXXOOOXXXXOOXOXXXOXOOOXXXXOOOXXOOOOXXXXOXXXXOXXOXOOXOXXOOXXXOOXOXXOXOOOXOXOXXXXOXXOXXXXXOOOXOOOXXOXOXOXOXOXOXXOXOOOOOXOOXXOOOXXXOXXXXOOXOOXOXOOXOXOXOOOOXXXXOXXOXXXXXXXOXXXOOXXOOXOXXXXOXOXOOXOOXOXXOOXXXXXXXXXOOOXOXXOXXOXXXOOOOOOOOOXOOOOOXXXOXXXOXXXOXOOOXXOXXOXOXOXXXXOXOXXXXOXOOOOXOXXOXXXXOXXOXXXXOOXXXXOOXOXOOOXXXXXXXXXOOXXOXOXXOXXXOXOOOXXOOXXXXXOXXOXOOXOXXXXOXOOXOOOOOXOXXXOXXXOXOXXOXXXXOOXXOXOOXXXOOXXOOXOXXOXOOOOXOOOXXXXXOXXXOXXOXXOOOXXOXXXXOXXOOXOXXOOOXOXOXOXOXOXOXOOOXOOXOOXXOOXOXOXXXXOXXOXOOOOOOOOOOOOOXXXOOOXXOXXXXOXXOXOXOOXOOXOOXOXOXXOOXOXXXXXOXXOOXOXXOXOXOXXOXOXOOXOXOXOXOOOOOOXOOXOXXXOOOOOOXXXXXXXXOXXXXOXXXXOXOOXXXOXXXOOOXXOXOXXOOOOOOOXOXXXOXXXXOXXXOOXOXOOOXXOXOXOOOXXXXXXOOOOXXOOXOXXXXXXXXXOOXXOXOOXXXOXOOOXXXOXXOXOOOOXXOOOXOOOOOOXXXXOXO';\r\ne=27;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\n%30\r\ni='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO';\r\nd='OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';\r\ne=999;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='OOOOXXOOOO'; %31\r\nd='XOOOOOOOOX';\r\ne=4;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));","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":8,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2013-04-21T20:43:53.000Z","updated_at":"2013-04-21T21:37:42.000Z","published_at":"2013-04-21T21:37:42.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis Challenge is to solve the\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://contest.usc.edu/index.php/Spring13/Home\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eUSC Spring 2013 ACM Contest\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e Problem F, Snow Cones.\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\u003eSummary of Challenge is to Swap the Snow Cones in the minimal number of swaps so the children all have their selected flavor. There are only two flavors, X and O. Input is the string of distributed Cone flavors and a string of desired Cone flavors. Adjacent children may exchange cones but in any one round a child may only swap with one other child.\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\u003eDetermine minimum number of Swap rounds to convert the Distributed to the Desired Cone flavor sequence.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e From XXO to OXX \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eOutput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e 2\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e From OXOX to XOXO \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eOutput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e 1\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eOnly two competitors solved this challenge.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eA little complex requiring a Matlab 3-Liner solution versus\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://contest.usc.edu/index.php/Spring13/Home?action=download\u0026amp;upname=cones.zhengcao.cpp.txt\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eCao's C solution\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":1173,"title":"Binpack Contest: Retro  - - Best Packing","description":"The \u003chttp://www.mathworks.com/matlabcentral/contest/contests/3/rules Full Binpack Rules and examples\u003e.\r\n\r\nThis Challenge is a partial replay of the First Matlab Contest, 1998 BinPack. The Twist is to Achieve the Best Packing, no time or code size penalty. The twelve songList sets will be scored once each.\r\n\r\nBrief Challenge statement: Pack a 45(mediaLength) minute CD as maximally as possible given a list of songs of varying lengths. No penalty for unused songs. No song duplication allowed. Return the indices of the songs used.\r\n\r\n*Input:* [songList, mediaLength]\r\n\r\n*Output:* indexList\r\n\r\n*Example:*\r\n\r\nInput:  [ 0.5 2 3 1.5 4], [5.6]\r\n\r\nOutput: [4 5]  as 1.5+4 is very near and below 5.6.\r\n\r\nThe answer of [1 2 3] is also valid and also gives 5.5.\r\n\r\n*Scoring:* 1000*(Known_Best_Possibles - sum(songList(indexList))\r\n\r\n*Initial Leader:*  Cases [2 3 4 6 8 11] have best possible scores of [44.9990 44.9971 44.8 44.6 44.584024853.. 44.25]\r\n\r\n\r\nFinal Score of 1 achieved in \u003c 6 Cody seconds for entry 10.\r\n\r\nFinal Score of 0, optimal, achieved using recursive searches with iter limits and thresholds.\r\n\r\n","description_html":"\u003cp\u003eThe \u003ca href=\"http://www.mathworks.com/matlabcentral/contest/contests/3/rules\"\u003eFull Binpack Rules and examples\u003c/a\u003e.\u003c/p\u003e\u003cp\u003eThis Challenge is a partial replay of the First Matlab Contest, 1998 BinPack. The Twist is to Achieve the Best Packing, no time or code size penalty. The twelve songList sets will be scored once each.\u003c/p\u003e\u003cp\u003eBrief Challenge statement: Pack a 45(mediaLength) minute CD as maximally as possible given a list of songs of varying lengths. No penalty for unused songs. No song duplication allowed. Return the indices of the songs used.\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e [songList, mediaLength]\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e indexList\u003c/p\u003e\u003cp\u003e\u003cb\u003eExample:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eInput:  [ 0.5 2 3 1.5 4], [5.6]\u003c/p\u003e\u003cp\u003eOutput: [4 5]  as 1.5+4 is very near and below 5.6.\u003c/p\u003e\u003cp\u003eThe answer of [1 2 3] is also valid and also gives 5.5.\u003c/p\u003e\u003cp\u003e\u003cb\u003eScoring:\u003c/b\u003e 1000*(Known_Best_Possibles - sum(songList(indexList))\u003c/p\u003e\u003cp\u003e\u003cb\u003eInitial Leader:\u003c/b\u003e  Cases [2 3 4 6 8 11] have best possible scores of [44.9990 44.9971 44.8 44.6 44.584024853.. 44.25]\u003c/p\u003e\u003cp\u003eFinal Score of 1 achieved in \u0026lt; 6 Cody seconds for entry 10.\u003c/p\u003e\u003cp\u003eFinal Score of 0, optimal, achieved using recursive searches with iter limits and thresholds.\u003c/p\u003e","function_template":"function indexList = binpack_scr(songList,mediaLength)\r\n  indexList=[1 2];\r\nend","test_suite":"%%\r\nfeval(@assignin,'caller','score',200);\r\n%%\r\nmediaLength=45;\r\nrng(0)\r\nsongList=floor(10000*rand(1,100))/10000;\r\nindexList = binpack_scr(songList,mediaLength) ;\r\nsum(songList(indexList))\r\n%[songList(indexList)' indexList']\r\nassert(sum(songList(indexList))\u003e44.8) % anti hardcode\r\n%%\r\na{1} = [4.3078    2.5481    1.4903    5.4302    3.4142    2.9736    3.3768 ...\r\n        2.1612    3.3024    0.3269    2.6761    4.2530    2.6648    1.9644 ...\r\n        3.3389    22.122    4.1015    3.2104    2.3945    4.7151];\r\na{2} = [1.2671    3.1377    4.0687    4.1459    3.6469    6.1881    8.2452 ...\r\n        7.3962    9.7071   10.4798   11.4082   12.2282   12.6320   13.9705 ...\r\n        13.8851   15.6195   17.0187   18.5778   18.4140   20.0473];\r\na{3} = [1.6283    6.0703    8.1323    2.6226    3.1230    3.0081    6.1405 ...\r\n        1.1896    4.2769    5.0951    6.4869    3.9215    2.5858    4.7130 ...\r\n        4.5529];\r\na{4} = [40:-1:1]+.1;\r\na{5} = [1.0979    3.5540    1.8627    0.0849    3.2110    3.6466    4.8065 ...\r\n        3.2717    0.1336    2.5008    0.4508    3.0700    3.1658    0.8683 ...\r\n        3.5533    3.7528    2.7802    4.2016    1.6372    9.6254    1.3264 ...\r\n        0.3160    4.3212    3.0192    0.7744    2.3970    1.7416    2.4751 ...\r\n        1.0470    1.9091];\r\na{6} = [1 1 2 3 5 8 13 21 34]+.1;\r\na{7} = [0.8651    3.3312    0.2507    0.5754    2.2929    2.3818    2.3783 ...\r\n        0.0753    0.6546    0.3493    0.3734    1.4516    1.1766    4.3664 ...\r\n        0.2728    20.279    2.1335    0.1186    0.1913    1.6647    0.5888 ...\r\n        2.6724    1.4286    3.2471    1.3836    1.7160    2.5080    3.1875 ...\r\n        2.8819    1.1423    0.7998    1.3800    1.6312    1.4238    2.5805 ...\r\n        1.3372    2.3817    2.4049    0.0396    0.3134];\r\na{8} = [pi*ones(1,10) exp(1)*ones(1,10)];\r\na{9} = [1.6041    0.2573    1.0565    1.4151    0.8051    0.5287    0.2193 ...\r\n        0.9219    2.1707    0.0592    1.0106    0.6145    0.5077    1.6924 ...\r\n        0.5913    0.6436    0.3803    1.0091    0.0195    0.0482    20.000 ...\r\n        0.3179    1.0950    1.8740    0.4282    0.8956    0.7310    0.5779 ...\r\n        0.0403    0.6771    0.5689    0.2556    0.3775    0.2959    1.4751 ...\r\n        0.2340    8.1184    0.3148    1.4435    0.3510    0.6232    0.7990 ...\r\n        0.9409    0.9921    0.2120    0.2379    1.0078    0.7420    1.0823 ...\r\n        0.1315];\r\na{10}= [1.6041    0.2573    1.0565    1.4151    0.8051    0.5287    0.2193 ...\r\n        0.9219    2.1707    0.0592    1.0106    0.6145    0.5077    1.6924 ...\r\n        0.5913    0.6436    0.3803    10.091    0.0195    0.0482    20.000 ...\r\n        0.3179    1.0950    1.8740    44.999    0.8956    0.7310    0.5779 ...\r\n        0.0403    0.6771    0.5689    0.2556    0.3775    0.2959    1.4751 ...\r\n        0.2340    0.1184    0.3148    1.4435    0.3510    0.6232    0.7990 ...\r\n        0.9409    0.9921    0.2120    0.2379    1.0078    0.7420    1.0823 ...\r\n        0.1315];\r\na{11}= [40*ones(1,50) ones(1,20)]+0.05;\r\na{12}= 4.3 + sin(1:100);\r\n\r\nmediaLength=45;\r\n\r\nnet_gap=0;\r\nt0=clock;\r\nfor j=1:1\r\nfor i=1:12\r\n   songList=a{i};\r\n   indexList = binpack_scr(songList,mediaLength) ;\r\n   indexList=unique(indexList); % No dupes\r\n   total(i)=sum(songList(indexList));\r\n   if total(i)\u003e45+1.5*eps(mediaLength) % Rqmt \u003c= 45\r\n    total(i)=-Inf;\r\n   end\r\n   net_gap=net_gap+45-total(i) ;\r\nend\r\nend\r\ntte=etime(clock,t0);\r\nfprintf('Total Time E %f\\n',tte)\r\nfprintf('Totals: ');fprintf('%.5f  ',total);fprintf('\\n')\r\nfprintf('Net Gap: %.2f\\n',net_gap)\r\n%format long\r\nfprintf('Performance: %.4f\\n',net_gap/(12*45))\r\nfprintf('Score=1000*(12*45-1.76987514-sum(total): %.3f\\n',1000*(12*45-1.76987514-sum(total)))\r\nfprintf('Final Score %i\\n',round(1000*(12*45-1.76987514-sum(total))))\r\n\r\nScore=round(1000*(12*45-1.76987514-sum(total)));\r\n\r\nassert(Score\u003e=0)\r\n\r\n\r\nfeval( @assignin,'caller','score',floor(min( 200,Score )) );\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":2,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":6,"test_suite_updated_at":"2013-01-06T00:41:02.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2013-01-04T16:28:33.000Z","updated_at":"2013-01-06T00:52:17.000Z","published_at":"2013-01-04T18:16:41.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/contest/contests/3/rules\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eFull Binpack Rules and examples\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis Challenge is a partial replay of the First Matlab Contest, 1998 BinPack. The Twist is to Achieve the Best Packing, no time or code size penalty. The twelve songList sets will be scored once each.\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\u003eBrief Challenge statement: Pack a 45(mediaLength) minute CD as maximally as possible given a list of songs of varying lengths. No penalty for unused songs. No song duplication allowed. Return the indices of the songs used.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e [songList, mediaLength]\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 indexList\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eExample:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eInput: [ 0.5 2 3 1.5 4], [5.6]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eOutput: [4 5] as 1.5+4 is very near and below 5.6.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe answer of [1 2 3] is also valid and also gives 5.5.\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 1000*(Known_Best_Possibles - sum(songList(indexList))\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\u003eInitial Leader:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Cases [2 3 4 6 8 11] have best possible scores of [44.9990 44.9971 44.8 44.6 44.584024853.. 44.25]\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\u003eFinal Score of 1 achieved in \u0026lt; 6 Cody seconds for entry 10.\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\u003eFinal Score of 0, optimal, achieved using recursive searches with iter limits and thresholds.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":2122,"title":"Simple Robotics 2 - End effector attitude","description":"Given a structure as input to your function with the following fields:\r\n* robot.links(L1,L2,L3)\r\n* robot.jointangles(alfa1,alfa2,alfa3)\r\n* robot.attitude(x,y,tht)\r\nReturn the same struct with the correct end effector position and orientation in \"robot.attitude\". In a stretched out posture, the end effector angle is 0.\r\nIn other words calculate the end effector x,y and alfa.\r\n\r\nWhen the robot arm is aligned with the positive x-axis of the robot's base coordinate system, the end-effector angle is defined to be zero.\r\n\r\nYou can easily modify this function to generate xdata and ydata for plotting the robot arm. Check the testcases for the requested accuracy.\r\n\r\nTip: calculate the x,y position of the heart of the orange end-effector as a function of the angles alfa1...3 and link lengths L1...3. L1 is the length of the first link (connected to the base of the robot). good luck.\r\n\r\nTip2: alfa1 in the picture is negative.\r\n\r\nTip3: make a little drawing on a piece of paper to see how the end effector coordinate system relates to the angles of the hinges (joints)/jointspace.\r\n\r\nAs a visual reference, check the picture below.\r\n\r\n\u003c\u003chttp://3.bp.blogspot.com/-Quk1HnM9BF4/UtU4GvT5NhI/AAAAAAAAAC4/wSltlKZRlok/s1600/ontrack.jpg\u003e\u003e","description_html":"\u003cp\u003eGiven a structure as input to your function with the following fields:\r\n* robot.links(L1,L2,L3)\r\n* robot.jointangles(alfa1,alfa2,alfa3)\r\n* robot.attitude(x,y,tht)\r\nReturn the same struct with the correct end effector position and orientation in \"robot.attitude\". In a stretched out posture, the end effector angle is 0.\r\nIn other words calculate the end effector x,y and alfa.\u003c/p\u003e\u003cp\u003eWhen the robot arm is aligned with the positive x-axis of the robot's base coordinate system, the end-effector angle is defined to be zero.\u003c/p\u003e\u003cp\u003eYou can easily modify this function to generate xdata and ydata for plotting the robot arm. Check the testcases for the requested accuracy.\u003c/p\u003e\u003cp\u003eTip: calculate the x,y position of the heart of the orange end-effector as a function of the angles alfa1...3 and link lengths L1...3. L1 is the length of the first link (connected to the base of the robot). good luck.\u003c/p\u003e\u003cp\u003eTip2: alfa1 in the picture is negative.\u003c/p\u003e\u003cp\u003eTip3: make a little drawing on a piece of paper to see how the end effector coordinate system relates to the angles of the hinges (joints)/jointspace.\u003c/p\u003e\u003cp\u003eAs a visual reference, check the picture below.\u003c/p\u003e\u003cimg src = \"http://3.bp.blogspot.com/-Quk1HnM9BF4/UtU4GvT5NhI/AAAAAAAAAC4/wSltlKZRlok/s1600/ontrack.jpg\"\u003e","function_template":"function newrobot = forwardkinematics(oldrobot)\r\n%   * robot.links(L1,L2,L3)\r\n% * robot.jointangles(alfa1,alfa2,alfa3)\r\n% * robot.attitude(x,y,tht)\r\nend","test_suite":"%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[0 0 0];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude;\r\ncorrect_attitude=[0 sum(robot.links) pi/2];\r\nassert(isequal(yc,correct_attitude))\r\n%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[pi/4 0  0];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude;\r\ncorrect_attitude=[-0.5*sqrt(2)*sum(robot.links) 0.5*sqrt(2)*sum(robot.links) 3*pi/4];\r\nassert(isequal(yc,correct_attitude))\r\n%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[pi/4 pi 3*pi/4];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude\r\ncorrect_attitude=[-0.5*sqrt(2)*(robot.links(1)-robot.links(2)) 0.5*sqrt(2)*(robot.links(1)-robot.links(2))+robot.links(3) pi/2]\r\nassert(all(abs(yc-correct_attitude)\u003c=eps))\r\n%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[-pi/4 pi/4 0];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude;\r\ncorrect_attitude=[0.5*sqrt(2)*robot.links(1) 0.5*sqrt(2)*robot.links(1)+sum(robot.links(2:3)) pi/2];\r\nassert(all(abs(yc-correct_attitude)\u003c=eps))\r\n%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[-2.1513    2.9568    2.8725];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude\r\ncorrect_attitude=[0.246878929631356  -0.220349832044192   5.248796326794897]\r\nassert(all(abs(yc-correct_attitude)\u003c=1e-8))\r\n%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[-0.0919    1.8867   -2.2501];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude\r\ncorrect_attitude=[-0.260952279814086   0.667368060676958   1.115496326794896];\r\nassert(all(abs(yc-correct_attitude)\u003c=1e-8))\r\n%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[-0.4916    2.6121    1.8360];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude\r\ncorrect_attitude=[0.070611406176580  -0.000086942065283   5.527296326794897];\r\nassert(all(abs(yc-correct_attitude)\u003c=1e-8))\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":20079,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":5,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2014-01-16T04:52:06.000Z","updated_at":"2014-01-25T01:02:46.000Z","published_at":"2014-01-24T01:47:31.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[{\"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\u003eGiven a structure as input to your function with the following fields: * robot.links(L1,L2,L3) * robot.jointangles(alfa1,alfa2,alfa3) * robot.attitude(x,y,tht) Return the same struct with the correct end effector position and orientation in \\\"robot.attitude\\\". In a stretched out posture, the end effector angle is 0. In other words calculate the end effector x,y and alfa.\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\u003eWhen the robot arm is aligned with the positive x-axis of the robot's base coordinate system, the end-effector angle is defined to be zero.\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\u003eYou can easily modify this function to generate xdata and ydata for plotting the robot arm. Check the testcases for the requested accuracy.\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\u003eTip: calculate the x,y position of the heart of the orange end-effector as a function of the angles alfa1...3 and link lengths L1...3. L1 is the length of the first link (connected to the base of the robot). good luck.\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\u003eTip2: alfa1 in the picture is negative.\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\u003eTip3: make a little drawing on a piece of paper to see how the end effector coordinate system relates to the angles of the hinges (joints)/jointspace.\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\u003eAs a visual reference, check the picture below.\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\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":2103,"title":"Simple Robotics 1: On track?","description":"As a small extension to problem:\r\n\u003chttp://www.mathworks.com/matlabcentral/cody/problems/2100-distance-to-a-straight-line-2d-given-any-2-distinct-points-on-this-straight-line\u003e,\r\nimagine that Pe represents the attitude of a robotic end effector with 3 degrees of freedom (x,y and tht).\r\n\r\n\u003c\u003chttp://3.bp.blogspot.com/-Quk1HnM9BF4/UtU4GvT5NhI/AAAAAAAAAC4/wSltlKZRlok/s1600/ontrack.jpg\u003e\u003e\r\n\r\nThe end-effector (kind of orange) has to stay parallel to the straight line within a distance indicated by \"errorlevel\". The error levels for the distance are 1 cm (ridiculous accuracy) and .5 degrees for the end effector angle.\r\n\r\nWrite a function which returns true if the end-effector is \"on track\" and false if the position of the origin of the coordinate frame which is considered to be attached to the centre of the end effector, falls outside the area indicated by the dash-dotted line. Also return false if the end effector orientation is too far off from the direction of the straight line.","description_html":"\u003cp\u003eAs a small extension to problem: \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/problems/2100-distance-to-a-straight-line-2d-given-any-2-distinct-points-on-this-straight-line\"\u003ehttp://www.mathworks.com/matlabcentral/cody/problems/2100-distance-to-a-straight-line-2d-given-any-2-distinct-points-on-this-straight-line\u003c/a\u003e,\r\nimagine that Pe represents the attitude of a robotic end effector with 3 degrees of freedom (x,y and tht).\u003c/p\u003e\u003cimg src = \"http://3.bp.blogspot.com/-Quk1HnM9BF4/UtU4GvT5NhI/AAAAAAAAAC4/wSltlKZRlok/s1600/ontrack.jpg\"\u003e\u003cp\u003eThe end-effector (kind of orange) has to stay parallel to the straight line within a distance indicated by \"errorlevel\". The error levels for the distance are 1 cm (ridiculous accuracy) and .5 degrees for the end effector angle.\u003c/p\u003e\u003cp\u003eWrite a function which returns true if the end-effector is \"on track\" and false if the position of the origin of the coordinate frame which is considered to be attached to the centre of the end effector, falls outside the area indicated by the dash-dotted line. Also return false if the end effector orientation is too far off from the direction of the straight line.\u003c/p\u003e","function_template":"function y = isontrack(p1,p2,pe)\r\n  true;\r\nend","test_suite":"%%\r\np1=[0.218246;0.224576];%meters\r\np2=[0.769657;0.602542];%meters\r\ndirection=34.428783;%degrees\r\n\r\npointsx=[   0.350085000000000\r\n   0.375000000000000\r\n   0.770085000000000\r\n   0.753475000000000\r\n   0.609915000000000\r\n   0.290763000000000\r\n   0.301441000000000\r\n   0.301441000000000];\r\n   \r\npointsy=[      0.285805000000000\r\n   0.400212000000000\r\n   0.602331000000000\r\n   0.585551000000000\r\n   0.497839000000000\r\n   0.259873000000000\r\n   0.275127000000000\r\n   0.275127000000000];\r\n\r\norientations=0*pointsx+direction;\r\norientations(end)=direction+0.6;\r\ncorrectanswers= [    0\r\n     0\r\n     1\r\n     1\r\n     1\r\n     0\r\n     1\r\n     0];\r\n\r\nfor j=1:length(pointsx)\r\n    y(j)=isontrack(p1,p2,[pointsx(j); pointsy(j); orientations(j)]);\r\n    assert(y(j)==correctanswers(j))\r\nend","published":true,"deleted":false,"likes_count":1,"comments_count":0,"created_by":20079,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":7,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2014-01-10T14:00:37.000Z","updated_at":"2014-01-15T07:35:45.000Z","published_at":"2014-01-15T07:35: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\u003eAs a small extension to problem:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/problems/2100-distance-to-a-straight-line-2d-given-any-2-distinct-points-on-this-straight-line\\\"\u003e\u003cw:r\u003e\u003cw:t\u003ehttp://www.mathworks.com/matlabcentral/cody/problems/2100-distance-to-a-straight-line-2d-given-any-2-distinct-points-on-this-straight-line\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e, imagine that Pe represents the attitude of a robotic end effector with 3 degrees of freedom (x,y and tht).\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\u003eThe end-effector (kind of orange) has to stay parallel to the straight line within a distance indicated by \\\"errorlevel\\\". The error levels for the distance are 1 cm (ridiculous accuracy) and .5 degrees for the end effector angle.\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\u003eWrite a function which returns true if the end-effector is \\\"on track\\\" and false if the position of the origin of the coordinate frame which is considered to be attached to the centre of the end effector, falls outside the area indicated by the dash-dotted line. Also return false if the end effector orientation is too far off from the direction of the straight line.\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":2226,"title":"Wayfinding 4 - Crossing, level 2","description":"This is the fourth part of a series of assignments about wayfinding. The final goal of this series is to be able to calculate the fastest route through a terrain of areas with different properties. The assignments will build on top of each other, gradually increasing the complexity, but guiding you stepwise towards the final goal. You can re-use code from preceding assignments to save some work. See \u003chttp://www.mathworks.com/matlabcentral/cody/problems/2218-wayfinding-1-crossing [1]\u003e\r\n\u003chttp://www.mathworks.nl/matlabcentral/cody/problems/2219-wayfinding-2-traversing [2]\u003e \u003chttp://www.mathworks.nl/matlabcentral/cody/problems/2220-wayfinding-3-passed-areas [3]\u003e. \r\n\r\n*Which areas are traversed?*\r\n\r\n\u003c\u003chttp://i62.tinypic.com/358qa1w.png\u003e\u003e\r\n\r\nFor this fourth assignment in this series you have to calculate which areas are traversed and in which order, while going from A to B. Our path from A to B is a straight line. And the area boundaries are closed polygons consisting of a finite number of straight segments. Quite similar to \u003chttp://www.mathworks.nl/matlabcentral/cody/problems/2220-wayfinding-3-passed-areas assignment 3\u003e.\r\n\r\nHowever, now the areas may overlap. If case of traversing overlapping areas, the area with the highest index in |F| is the one listed.\r\nIf an area is crossed twice, it is listed twice in the returned vector. And if |AB| crosses first for example area |F2|, then |F3|, and then |F2| again, the output vector should contain |[ ... 2 3 2 ... ]|. That would also be the case when |F3| is contained in |F2|. But when |F2| is contained in |F3|, then |F2| is never crossed, as it has a lower index in F than |F3|. Consider the areas non-transparent and stacked on top of each other.\r\n\r\nThe inputs of the function |WayfindingPassed(AB,F)| are a matrix |AB| of two columns, each with x-y coordinates, of our straight path from A (1st column) to B (2nd column), and a cell array |F| of 2-D matrices with columns with x- and y-coordinates, each column a subsequent node of the polygon boundary of the area. The last node is implicitly connected to the first. The index of each area, to be referred to in the output vector, is equal to its position in the cell array F. \r\n\r\n AB = [\r\n   xA xB\r\n   yA yB\r\n ]\r\n\r\n F = {\r\n  [ x11 x12 ... x1n ;\r\n    y11 y12 ... y1n ]\r\n  [ x21 x22 ... x2n ;\r\n    y21 y22 ... y2n ]\r\n }\r\n\r\n\r\nYour output |f| will contain the indices in |F| of the crossed areas, in the correct order. In the example above, the correct answer is |[ 3 1 4 1 4 1]|. Crossing means 'being present in that area', so if A, the start, is in area 3, it is considered as 'crossed'.","description_html":"\u003cp\u003eThis is the fourth part of a series of assignments about wayfinding. The final goal of this series is to be able to calculate the fastest route through a terrain of areas with different properties. The assignments will build on top of each other, gradually increasing the complexity, but guiding you stepwise towards the final goal. You can re-use code from preceding assignments to save some work. See \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/problems/2218-wayfinding-1-crossing\"\u003e[1]\u003c/a\u003e \u003ca href = \"http://www.mathworks.nl/matlabcentral/cody/problems/2219-wayfinding-2-traversing\"\u003e[2]\u003c/a\u003e \u003ca href = \"http://www.mathworks.nl/matlabcentral/cody/problems/2220-wayfinding-3-passed-areas\"\u003e[3]\u003c/a\u003e.\u003c/p\u003e\u003cp\u003e\u003cb\u003eWhich areas are traversed?\u003c/b\u003e\u003c/p\u003e\u003cimg src = \"http://i62.tinypic.com/358qa1w.png\"\u003e\u003cp\u003eFor this fourth assignment in this series you have to calculate which areas are traversed and in which order, while going from A to B. Our path from A to B is a straight line. And the area boundaries are closed polygons consisting of a finite number of straight segments. Quite similar to \u003ca href = \"http://www.mathworks.nl/matlabcentral/cody/problems/2220-wayfinding-3-passed-areas\"\u003eassignment 3\u003c/a\u003e.\u003c/p\u003e\u003cp\u003eHowever, now the areas may overlap. If case of traversing overlapping areas, the area with the highest index in \u003ctt\u003eF\u003c/tt\u003e is the one listed.\r\nIf an area is crossed twice, it is listed twice in the returned vector. And if \u003ctt\u003eAB\u003c/tt\u003e crosses first for example area \u003ctt\u003eF2\u003c/tt\u003e, then \u003ctt\u003eF3\u003c/tt\u003e, and then \u003ctt\u003eF2\u003c/tt\u003e again, the output vector should contain \u003ctt\u003e[ ... 2 3 2 ... ]\u003c/tt\u003e. That would also be the case when \u003ctt\u003eF3\u003c/tt\u003e is contained in \u003ctt\u003eF2\u003c/tt\u003e. But when \u003ctt\u003eF2\u003c/tt\u003e is contained in \u003ctt\u003eF3\u003c/tt\u003e, then \u003ctt\u003eF2\u003c/tt\u003e is never crossed, as it has a lower index in F than \u003ctt\u003eF3\u003c/tt\u003e. Consider the areas non-transparent and stacked on top of each other.\u003c/p\u003e\u003cp\u003eThe inputs of the function \u003ctt\u003eWayfindingPassed(AB,F)\u003c/tt\u003e are a matrix \u003ctt\u003eAB\u003c/tt\u003e of two columns, each with x-y coordinates, of our straight path from A (1st column) to B (2nd column), and a cell array \u003ctt\u003eF\u003c/tt\u003e of 2-D matrices with columns with x- and y-coordinates, each column a subsequent node of the polygon boundary of the area. The last node is implicitly connected to the first. The index of each area, to be referred to in the output vector, is equal to its position in the cell array F.\u003c/p\u003e\u003cpre\u003e AB = [\r\n   xA xB\r\n   yA yB\r\n ]\u003c/pre\u003e\u003cpre\u003e F = {\r\n  [ x11 x12 ... x1n ;\r\n    y11 y12 ... y1n ]\r\n  [ x21 x22 ... x2n ;\r\n    y21 y22 ... y2n ]\r\n }\u003c/pre\u003e\u003cp\u003eYour output \u003ctt\u003ef\u003c/tt\u003e will contain the indices in \u003ctt\u003eF\u003c/tt\u003e of the crossed areas, in the correct order. In the example above, the correct answer is \u003ctt\u003e[ 3 1 4 1 4 1]\u003c/tt\u003e. Crossing means 'being present in that area', so if A, the start, is in area 3, it is considered as 'crossed'.\u003c/p\u003e","function_template":"function f = WayfindingPassed(AB,F)\r\n  f = 1:length(F);\r\nend","test_suite":"%%\r\nAB = [ -10 10 ; -10 10 ];\r\nF{1} = [\r\n    -5    5   -8    0\r\n    -6    2    7    1\r\n    ];\r\nF{2} = [\r\n    4   -2    4    6\r\n    6   -7   -3   -2\r\n    ];\r\nF{3} = [\r\n    -5    6    3   -1\r\n    -6   -8    4   -2\r\n    ];\r\nf = WayfindingPassed(AB,F);\r\nf_correct = [ 1 3 2 ];\r\nassert(isequal(f,f_correct));\r\n\r\n%%\r\n\r\nAB = [ 0 21 ; 0 0 ];\r\nf_correct = randperm(20);\r\nF = arrayfun(@(n)[n+[0 1 1 0];-1 -1 1 1],f_correct,'uni',0);\r\nf = WayfindingPassed(AB,F);\r\nassert(isequal(f(f_correct),f_correct(f)));\r\n\r\n%%\r\nAB = [ -10 10 ; -10 10 ];\r\nF{1} = [\r\n    -5    9    0   -4    5\r\n    2    8   -1   -9   -8\r\n    ];\r\nF{2} = [\r\n    -2  -10   -4    0\r\n    8    7   -5    5\r\n    ];\r\nF{3} = [\r\n    -6    2   10\r\n    10   -4    8\r\n    ];\r\nF{4} = [\r\n    -10    8  -10\r\n    4   -8    2\r\n    ];\r\nF{5} = [\r\n    0    4    8   -3    1\r\n    -10    9   -8   -5    2\r\n    ];\r\nF{6} = [\r\n    6    6   -9   10\r\n    6   -3    4   -7\r\n    ];\r\nF{7} = [\r\n    9    7   -7\r\n    0    7   -5\r\n    ];\r\nF{8} = [\r\n    2    0   10\r\n    6  -10    0\r\n    ];\r\nF{9} = [\r\n    -7    2   -7   -7\r\n    3    5   -3    7\r\n    ];\r\nF{10} = [\r\n    -5    6    1    5\r\n    -10    0    8    4\r\n    ];\r\nf = WayfindingPassed(AB,F);\r\nf_correct = [ 2 7 8 10 7 3 ];\r\nassert(isequal(f,f_correct));\r\n\r\n%%\r\nAB = [ -10 10 ; -10 10 ];\r\nF{1} = [\r\n    2    5    8    5\r\n    2   -2    9   -5\r\n    ];\r\nF{2} = [\r\n    -8    2   -2    8   -8   -2\r\n    0    4    5   -9    8   -2\r\n    ];\r\nF{3} = [\r\n    5   -6   -2    1    0   10\r\n    10   -8    0   10   -2   -5\r\n    ];\r\nF{4} = [\r\n    10   -4  -10   -2    9\r\n    4    1    8   -4   -1\r\n    ];\r\nF{5} = [\r\n    -9   -7    2   -3\r\n    2   -9   -4    5\r\n    ];\r\nF{6} = [\r\n    -3   10    6    9    4   -2\r\n    10   -6    2    2    5   -5\r\n    ];\r\nF{7} = [\r\n    -1   -5   -5\r\n    3    0   -4\r\n    ];\r\nF{8} = [\r\n    8   -6    8   10   -7\r\n    8   -2   -5    3    7\r\n    ];\r\nF{9} = [\r\n    1  -10   -3   10    5\r\n    -5   -6    3   -6    8\r\n    ];\r\nF{10} = [\r\n    -7    0    8   -8\r\n    7   -8    3    9\r\n    ];\r\nf = WayfindingPassed(AB,F);\r\nf_correct = [ 5 9 10 9 3 1 8 ];\r\nassert(isequal(f,f_correct));\r\n\r\n%%\r\n\r\nAB = [ 4 -6 ; 0 0 ];\r\nF{1} = [\r\n    -4   -4    2    2   -2   -3   -3   -2    2    2   -4\r\n    2   -4   -4   -2    2    2   -2   -2    2    4    4\r\n    ];\r\nf = WayfindingPassed(AB,F);\r\nf_correct = [ 1 ];\r\nassert(isequal(f,f_correct));\r\n\r\n%%\r\n\r\nAB = [ 0 0 ; 15 -8 ];\r\nF{1} = [\r\n    -4    4    4   -4\r\n    6    2    6    2\r\n    ];\r\nF{2} = [\r\n    -2   -2    6    6   -2\r\n    -0   -4   -0   -4   -0\r\n    ];\r\nF{3} = [\r\n    -1   -1    2    2\r\n    -6   -4   -6   -4\r\n    ];\r\nF{4} = [\r\n    -1    1   -1    1\r\n    -7   -7   -9   -9\r\n    ];\r\nF{5} = [\r\n    -2     2    -1     2    -1     1\r\n    14    10     6     6    10    14\r\n    ];\r\nf = WayfindingPassed(AB,F);\r\nf_correct = [ 5 5 1 2 3 4 ];\r\nassert(isequal(f,f_correct));\r\n\r\n%%\r\n\r\nAB = [ 0 0 ; -6 6 ];\r\nF{1} = [\r\n    -5    7    7   -5\r\n    -9   -9    9    9\r\n    ];\r\nF{2} = [\r\n    -1    1    1   -1\r\n    -7   -7   -5   -5\r\n    ];\r\nF{3} = [\r\n    -2   -2    2    2\r\n    4    2    2    4\r\n    ];\r\nF{4} = [\r\n    2    2   -2   -2\r\n    4    2    2    4\r\n    ];\r\nF{5} = [\r\n    -1    1    1   -1\r\n    2    2   -2   -2\r\n    ];\r\nF{6} = [\r\n    -2    0   -2\r\n    -2   -3   -4\r\n    ];\r\nF{7} = [\r\n    0    2    2\r\n    -3   -4   -2\r\n    ];\r\nF{8} = [\r\n    -1    0    1\r\n    -8   -6   -8\r\n    ];\r\nf = WayfindingPassed(AB,F);\r\nf_correct = [8 2 1 7 1 5 4 1];\r\nassert(isequal(f,f_correct));\r\n\r\n%%\r\n\r\nAB = [ 2 -2 ; 8 -6 ];\r\nF{1} = [\r\n    -4   -4    4    4\r\n    -4   -0   -0   -4\r\n    ];\r\nF{2} = [\r\n    -4   -4    4    4\r\n    2    6    6    2\r\n    ];\r\nf = WayfindingPassed(AB,F);\r\nf_correct = [2 1];\r\nassert(isequal(f,f_correct));\r\n\r\n%%\r\n\r\nAB = [ 8 -4 ; 8 -8 ];\r\nF{1} = [\r\n    -6    2    2   -4   -4    8    8   -6\r\n    -6   -6   -4   -4    2    2    4    4\r\n    ];\r\nF{2} = [\r\n    -2   -2    4    4\r\n    -0   -2   -2   -0\r\n    ];\r\nf = WayfindingPassed(AB,F);\r\nf_correct = [ 1 2 1 ];\r\nassert(isequal(f,f_correct));\r\n\r\n%%\r\n\r\nAB = [ -8 8 ; 8 -8 ];\r\nF{1} = [\r\n    -2   -2    0    0\r\n    -0    2    2   -0\r\n    ];\r\nF{2} = [\r\n    2    4    4   -6   -6   -4    2    4    4    2    2   -4   -4    2\r\n    -0   -0   -6   -6    4    6    6    4    2    2    4    4   -4   -4\r\n    ];\r\nF{3} = [\r\n    -3   -3    1    0\r\n    -1   -3   -3   -1\r\n    ];\r\nF{4} = [\r\n    5    9    9    5\r\n    -3   -3   -9   -9\r\n    ];\r\nF{5} = [\r\n    -9  -10  -10   -9\r\n    9    9   10   10\r\n    ];\r\nf = WayfindingPassed(AB,F);\r\nf_correct = [ 2 1 2 4 ];\r\nassert(isequal(f,f_correct));\r\n\r\nAB = [ 0 0 ; -8 8 ];\r\nF{1} = [\r\n    -4   -2   -2   -4\r\n    8    8    4    4\r\n    ];\r\nF{2} = [\r\n    2    4    4    2\r\n    -0   -0   -6   -6\r\n    ];\r\nF{3} = [\r\n    -4   -2   -2   -6   -6\r\n    -4   -4   -6   -6   -4\r\n    ];\r\nf = WayfindingPassed(AB,F);\r\nassert(isempty(f));\r\n\r\n%%\r\n\r\nAB = [ 7 -8 ; 0 0 ];\r\nF{1} = [\r\n    8    9    9    8\r\n    3    3   -2   -2\r\n    ];\r\nF{2} = [\r\n    -9   -7   -7   -4   -4   -3   -3    0    0    1    1    4    4    5    5   -2   -8   -9\r\n    -2   -2    2    2   -2   -2    2    2   -2   -2    2    2   -2   -2    3    4    3    2\r\n    ];\r\nF{3} = [\r\n    -2   -1   -1   -2\r\n    1    1   -4   -4\r\n    ];\r\nF{4} = [\r\n    -6   -5   -5   -3    1    2    2    3    3    1   -4   -6\r\n    1    1   -3   -5   -5   -4    1    1   -5   -8   -7   -4\r\n    ];\r\nf = WayfindingPassed(AB,F);\r\nf_correct = [ 2 4 2 3 2 4 2 ];\r\nassert(isequal(f,f_correct));\r\n\r\n%%\r\n\r\nAB = [ 0 -2 ; 0 -4 ];\r\nF{1} = [\r\n    -3    3    3    2    2   -2   -2    2    2   -3\r\n    -5   -5    3    3   -3   -3    2    2    3    3\r\n    ];\r\nF{2} = [\r\n    -1    1    1   -1\r\n    1    1   -1   -1\r\n    ];\r\nF{3} = [\r\n    -4    4    4    5    5   -5   -5   -4\r\n    4    4   -7   -7    5    5   -1   -1\r\n    ];\r\nF{4} = [\r\n    -5   -4   -4    4    4   -5\r\n    -1   -1   -6   -6   -7   -7\r\n    ];\r\nf = WayfindingPassed(AB,F);\r\nf_correct = [ 2 1 ];\r\nassert(isequal(f,f_correct));\r\n\r\n%%\r\n\r\nAB = [ -2 0 ; 6 -6 ];\r\nF{1} = [\r\n    2   -4   -4    2    2   -2    0   -2    2\r\n    -4   -4    4    4    2    2   -0   -2   -2\r\n    ];\r\nf = WayfindingPassed(AB,F);\r\nf_correct = [ 1 1 1 ];\r\nassert(isequal(f,f_correct));","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":6556,"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":"2014-03-01T22:33:13.000Z","updated_at":"2014-03-06T07:49:23.000Z","published_at":"2014-03-06T07:49:23.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\u003eThis is the fourth part of a series of assignments about wayfinding. The final goal of this series is to be able to calculate the fastest route through a terrain of areas with different properties. The assignments will build on top of each other, gradually increasing the complexity, but guiding you stepwise towards the final goal. You can re-use code from preceding assignments to save some work. See\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/problems/2218-wayfinding-1-crossing\\\"\u003e\u003cw:r\u003e\u003cw:t\u003e[1]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.nl/matlabcentral/cody/problems/2219-wayfinding-2-traversing\\\"\u003e\u003cw:r\u003e\u003cw:t\u003e[2]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.nl/matlabcentral/cody/problems/2220-wayfinding-3-passed-areas\\\"\u003e\u003cw:r\u003e\u003cw:t\u003e[3]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eWhich areas are traversed?\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\u003eFor this fourth assignment in this series you have to calculate which areas are traversed and in which order, while going from A to B. Our path from A to B is a straight line. And the area boundaries are closed polygons consisting of a finite number of straight segments. Quite similar to\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.nl/matlabcentral/cody/problems/2220-wayfinding-3-passed-areas\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eassignment 3\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eHowever, now the areas may overlap. If case of traversing overlapping areas, the area with the highest index in\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e is the one listed. If an area is crossed twice, it is listed twice in the returned vector. And if\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eAB\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e crosses first for example area\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF2\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, then\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF3\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, and then\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF2\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e again, the output vector should contain\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003e[ ... 2 3 2 ... ]\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e. That would also be the case when\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF3\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e is contained in\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF2\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e. But when\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF2\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e is contained in\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF3\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, then\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF2\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e is never crossed, as it has a lower index in F than\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF3\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e. Consider the areas non-transparent and stacked on top of each other.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe inputs of the function\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eWayfindingPassed(AB,F)\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e are a matrix\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eAB\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e of two columns, each with x-y coordinates, of our straight path from A (1st column) to B (2nd column), and a cell array\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e of 2-D matrices with columns with x- and y-coordinates, each column a subsequent node of the polygon boundary of the area. The last node is implicitly connected to the first. The index of each area, to be referred to in the output vector, is equal to its position in the cell array F.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ AB = [\\n   xA xB\\n   yA yB\\n ]\\n\\n F = {\\n  [ x11 x12 ... x1n ;\\n    y11 y12 ... y1n ]\\n  [ x21 x22 ... x2n ;\\n    y21 y22 ... y2n ]\\n }]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eYour output\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ef\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e will contain the indices in\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e of the crossed areas, in the correct order. In the example above, the correct answer is\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003e[ 3 1 4 1 4 1]\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e. Crossing means 'being present in that area', so if A, the start, is in area 3, it is considered as 'crossed'.\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":2242,"title":"Wayfinding 5 - Travel contour","description":"This is the fifth part of a series of assignments about wayfinding. The final goal of this series is to be able to calculate the fastest route through a terrain of areas with different properties. The assignments will build on top of each other, gradually increasing the complexity, but guiding you stepwise towards the final goal. You can re-use code from preceding assignments to save some work. See \r\n\u003chttp://www.mathworks.nl/matlabcentral/cody/?term=tag%3Awayfinding search:tag=wayfinding\u003e for the other assignments.\r\n\r\nThis time, you will travel around a polygon, over its contour. You get the nodes of the polygon, in the correct order, as a |2xn| array |F|. The last node of |F| is connected to the first node.\r\n\r\n|a| is the index in |F| of the starting node, and |b| is the goal. \r\n\r\n\u003c\u003chttp://i61.tinypic.com/iq8p69.png\u003e\u003e\r\n\r\nCalculate the shortest distance from |a| to |b| over the contour of the polygon. \r\n\r\nThe distance is measured as the Euclidean distance between points. You can not enter the internal area of the polygon. The contour of the polygon does not self-intersect.","description_html":"\u003cp\u003eThis is the fifth part of a series of assignments about wayfinding. The final goal of this series is to be able to calculate the fastest route through a terrain of areas with different properties. The assignments will build on top of each other, gradually increasing the complexity, but guiding you stepwise towards the final goal. You can re-use code from preceding assignments to save some work. See  \u003ca href = \"http://www.mathworks.nl/matlabcentral/cody/?term=tag%3Awayfinding\"\u003esearch:tag=wayfinding\u003c/a\u003e for the other assignments.\u003c/p\u003e\u003cp\u003eThis time, you will travel around a polygon, over its contour. You get the nodes of the polygon, in the correct order, as a \u003ctt\u003e2xn\u003c/tt\u003e array \u003ctt\u003eF\u003c/tt\u003e. The last node of \u003ctt\u003eF\u003c/tt\u003e is connected to the first node.\u003c/p\u003e\u003cp\u003e\u003ctt\u003ea\u003c/tt\u003e is the index in \u003ctt\u003eF\u003c/tt\u003e of the starting node, and \u003ctt\u003eb\u003c/tt\u003e is the goal.\u003c/p\u003e\u003cimg src = \"http://i61.tinypic.com/iq8p69.png\"\u003e\u003cp\u003eCalculate the shortest distance from \u003ctt\u003ea\u003c/tt\u003e to \u003ctt\u003eb\u003c/tt\u003e over the contour of the polygon.\u003c/p\u003e\u003cp\u003eThe distance is measured as the Euclidean distance between points. You can not enter the internal area of the polygon. The contour of the polygon does not self-intersect.\u003c/p\u003e","function_template":"function d = polygon_distance(F,a,b)\r\n  d = 0;\r\nend","test_suite":"%%\r\nF = [0 0 1 1;0 1 1 0];\r\na = 1;\r\nb = 3;\r\nd = polygon_distance(F,a,b);\r\nd_correct = 2;\r\nassert(isequal(d,d_correct))\r\n\r\n%%\r\nF = [0 0 1 1;0 1 1 0];\r\na = 1;\r\nb = 2;\r\nd = polygon_distance(F,a,b);\r\nd_correct = 1;\r\nassert(isequal(d,d_correct))\r\n\r\n%%\r\nF = [0 0 1 1;0 1 1 0];\r\na = 4;\r\nb = 1;\r\nd = polygon_distance(F,a,b);\r\nd_correct = 1;\r\nassert(isequal(d,d_correct))\r\n\r\n%%\r\nF = [0 0 1 1;0 1 1 0];\r\na = 3;\r\nb = 3;\r\nd = polygon_distance(F,a,b);\r\nd_correct = 0;\r\nassert(isequal(d,d_correct))\r\n\r\n%%\r\nF = [zeros(1,101) ones(1,101);0:100 100:-1:0];\r\na = 1;\r\nfor b = randi(size(F,2)/2,1,100)\r\n  d = polygon_distance(F,a,b);\r\n  d_correct = b-1;\r\n  assert(isequal(d,d_correct));\r\nend\r\n\r\n%%\r\nF = [zeros(1,101) ones(1,101);0:100 100:-1:0];\r\na = 1;\r\nfor b = randi(size(F,2)/2,1,100)+size(F,2)/2\r\n  s = rand(1)+1;\r\n  d = polygon_distance(F*s,a,b);\r\n  d_correct = (size(F,2)-b+1)*s;\r\n  assert(abs(d-d_correct)\u003c1e-10);\r\nend\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":6556,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":5,"test_suite_updated_at":"2014-03-10T14:22:52.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2014-03-10T09:32:11.000Z","updated_at":"2014-03-10T14:22:52.000Z","published_at":"2014-03-10T13:43:07.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\u003eThis is the fifth part of a series of assignments about wayfinding. The final goal of this series is to be able to calculate the fastest route through a terrain of areas with different properties. The assignments will build on top of each other, gradually increasing the complexity, but guiding you stepwise towards the final goal. You can re-use code from preceding assignments to save some work. See \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.nl/matlabcentral/cody/?term=tag%3Awayfinding\\\"\u003e\u003cw:r\u003e\u003cw:t\u003esearch:tag=wayfinding\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e for the other assignments.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis time, you will travel around a polygon, over its contour. You get the nodes of the polygon, in the correct order, as a\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003e2xn\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e array\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e. The last node of\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e is connected to the first node.\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:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ea\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e is the index in\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e of the starting node, and\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eb\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e is the goal.\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\u003eCalculate the shortest distance from\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ea\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e to\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eb\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e over the contour of the polygon.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe distance is measured as the Euclidean distance between points. You can not enter the internal area of the polygon. The contour of the polygon does not self-intersect.\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":2291,"title":"GJam 2014 Qualifier: Deceitful War (Small)","description":"This Challenge is derived from \u003chttp://code.google.com/codejam/contest/2974486/dashboard#s=p3 GJam 2014 Qualifier Deceitful War\u003e.\r\n\r\nMy condensed summary of the problem statement.\r\n\r\nGiven two players, A and B, they are each given N masses. All masses are unique. Player A plays first on each comparison and states a Mass. Player B then plays a Mass. The player with the higher mass wins a point after they are compared on a scale. These masses then disappear. This repeats for all N masses. There are no constraints on the order of pieces played.\r\n\r\nUnsurprisingly when A truthfully states masses player B consistently wins.\r\n\r\nPlayer A, discouraged, decides to cheat. After the masses are provided player A asks B get A a drink and while B is away A looks at B's masses. Player A now plays pieces but does not necessarily honestly state the mass values. All scale comparisons must be valid based on B's strategy and A's stated mass. Player A now achieves more wins.\r\n\r\nPart one is determine the best possible score for A when playing deceitfully.\r\n\r\nPart two is determine the best possible score if player A did not look and is honest.\r\n\r\n*Examples:*\r\n\r\n  A: 0.5 0.1 0.9  B 0.6 0.4 0.3  Deceitful Wins 2, Optimal Honest 1\r\n  \r\n  A 0.186 0.389 0.907 0.832 0.959 0.557 0.300 0.992 0.899\r\n  B 0.916 0.728 0.271 0.520 0.700 0.521 0.215 0.341 0.458\r\n  Deceitful A Wins 8\r\n  Optimal Honest A Wins 4\r\n\r\n*Input:* A,B vectors of length N (Small has N\u003c=10, Large(future challenge N\u003c=1000)\r\n\r\n*Output:* Deceitful Wins, Optimal Honest Wins\r\n\r\n\r\n\r\n\r\n\r\n*Note:*\r\n\r\nIn the contest period there were 30 Matlab solutions, of which I was not one as I glitched on the easy Deceitful algorithm thinking my Honest algorithm was in error. \u003chttp://www.go-hero.net/jam/14/solutions/0/4/MATLAB GJam Deceitful Solutions\u003e. My post contest full GJam is in the test suite. About 11000 out of 28000 entrants solved this puzzle.","description_html":"\u003cp\u003eThis Challenge is derived from \u003ca href = \"http://code.google.com/codejam/contest/2974486/dashboard#s=p3\"\u003eGJam 2014 Qualifier Deceitful War\u003c/a\u003e.\u003c/p\u003e\u003cp\u003eMy condensed summary of the problem statement.\u003c/p\u003e\u003cp\u003eGiven two players, A and B, they are each given N masses. All masses are unique. Player A plays first on each comparison and states a Mass. Player B then plays a Mass. The player with the higher mass wins a point after they are compared on a scale. These masses then disappear. This repeats for all N masses. There are no constraints on the order of pieces played.\u003c/p\u003e\u003cp\u003eUnsurprisingly when A truthfully states masses player B consistently wins.\u003c/p\u003e\u003cp\u003ePlayer A, discouraged, decides to cheat. After the masses are provided player A asks B get A a drink and while B is away A looks at B's masses. Player A now plays pieces but does not necessarily honestly state the mass values. All scale comparisons must be valid based on B's strategy and A's stated mass. Player A now achieves more wins.\u003c/p\u003e\u003cp\u003ePart one is determine the best possible score for A when playing deceitfully.\u003c/p\u003e\u003cp\u003ePart two is determine the best possible score if player A did not look and is honest.\u003c/p\u003e\u003cp\u003e\u003cb\u003eExamples:\u003c/b\u003e\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003eA: 0.5 0.1 0.9  B 0.6 0.4 0.3  Deceitful Wins 2, Optimal Honest 1\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003eA 0.186 0.389 0.907 0.832 0.959 0.557 0.300 0.992 0.899\r\nB 0.916 0.728 0.271 0.520 0.700 0.521 0.215 0.341 0.458\r\nDeceitful A Wins 8\r\nOptimal Honest A Wins 4\r\n\u003c/pre\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e A,B vectors of length N (Small has N\u0026lt;=10, Large(future challenge N\u0026lt;=1000)\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e Deceitful Wins, Optimal Honest Wins\u003c/p\u003e\u003cp\u003e\u003cb\u003eNote:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eIn the contest period there were 30 Matlab solutions, of which I was not one as I glitched on the easy Deceitful algorithm thinking my Honest algorithm was in error. \u003ca href = \"http://www.go-hero.net/jam/14/solutions/0/4/MATLAB\"\u003eGJam Deceitful Solutions\u003c/a\u003e. My post contest full GJam is in the test suite. About 11000 out of 28000 entrants solved this puzzle.\u003c/p\u003e","function_template":"function W = War(m)\r\n% W=[Deceitful Wins, Optimal Honest Wins]\r\n  W=[0 0];\r\nend","test_suite":"%%\r\nm=[0.270000 0.550000 0.910000 0.330000 0.520000 0.300000 ;0.850000 0.450000 0.060000 0.240000 0.120000 0.880000 ];\r\nWexp=[5 3];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.164000 0.255000 0.009000 0.445000 0.209000 0.100000 0.391000 0.536000 0.027000 0.118000 ;0.673000 0.782000 0.582000 0.882000 0.591000 0.855000 0.745000 0.955000 0.991000 0.600000 ];\r\nWexp=[0 0];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.800000 0.480000 0.760000 0.680000 0.160000 0.640000 0.360000 ;0.200000 0.440000 0.960000 0.280000 0.880000 0.520000 0.120000 ];\r\nWexp=[5 2];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.170000 0.100000 0.120000 0.200000 0.540000 0.150000 ;0.490000 0.070000 0.240000 0.680000 0.610000 0.340000 ];\r\nWexp=[2 1];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.780000 0.770000 0.900000 0.810000 0.880000 0.840000 0.600000 0.730000 0.930000 0.990000 ;0.270000 0.150000 0.260000 0.510000 0.570000 0.310000 0.170000 0.140000 0.400000 0.040000 ];\r\nWexp=[10 10];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.320000 0.820000 0.350000 0.770000 0.020000 0.550000 0.040000 0.990000 0.610000 0.190000 ;0.730000 0.530000 0.750000 0.800000 0.670000 0.870000 0.330000 0.250000 0.080000 0.680000 ];\r\nWexp=[7 1];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.510000 0.100000 0.380000 0.050000 0.210000 0.130000 0.440000 0.180000 ;0.560000 0.920000 0.540000 0.900000 0.670000 0.790000 0.820000 0.970000 ];\r\nWexp=[0 0];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.420000 ;0.080000 ];\r\nWexp=[1 1];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.690000 0.310000 0.540000 0.230000 0.710000 0.030000 0.490000 0.600000 0.510000 0.860000 ;0.830000 0.340000 0.370000 0.740000 0.430000 0.200000 0.090000 0.170000 0.910000 0.400000 ];\r\nWexp=[8 4];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.300000 0.920000 0.710000 0.130000 0.230000 0.620000 0.140000 0.260000 0.360000 0.310000 ;0.440000 0.010000 0.640000 0.350000 0.820000 0.550000 0.780000 0.790000 0.060000 0.570000 ];\r\nWexp=[6 2];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.504000 0.218000 0.479000 0.101000 0.050000 0.445000 0.471000 0.084000 0.034000 0.008000 ;0.992000 0.546000 0.647000 0.849000 0.891000 0.739000 0.765000 0.555000 0.613000 0.748000 ];\r\nWexp=[0 0];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.570000 0.470000 0.640000 0.550000 0.060000 0.430000 0.040000 0.280000 0.130000 0.510000 ;0.700000 0.740000 0.770000 0.810000 0.870000 0.790000 0.940000 0.910000 0.850000 0.660000 ];\r\nWexp=[0 0];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.200000 0.020000 0.510000 0.120000 0.220000 0.250000 0.100000 0.490000 0.530000 0.350000 ;0.800000 0.960000 0.760000 0.820000 0.710000 0.570000 0.940000 0.690000 0.900000 0.550000 ];\r\nWexp=[0 0];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.260000 0.030000 0.360000 0.410000 0.330000 0.430000 0.540000 0.300000 0.280000 0.100000 ;0.770000 0.910000 0.700000 0.550000 0.590000 0.780000 0.650000 0.860000 0.750000 0.990000 ];\r\nWexp=[0 0];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.920000 0.370000 0.900000 0.200000 0.150000 0.020000 0.530000 0.860000 0.250000 0.190000 ;0.170000 0.980000 0.140000 0.680000 0.830000 0.470000 0.950000 0.340000 0.880000 0.540000 ];\r\nWexp=[7 0];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.510000 0.020000 0.490000 0.280000 0.080000 0.830000 0.170000 0.140000 0.850000 ;0.420000 0.650000 0.950000 0.890000 0.030000 0.580000 0.380000 0.060000 0.370000 ];\r\nWexp=[6 1];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.670000 0.050000 0.590000 0.330000 0.820000 0.030000 0.740000 0.560000 0.950000 0.620000 ;0.210000 0.380000 0.770000 0.080000 0.260000 0.640000 0.460000 0.790000 0.310000 0.410000 ];\r\nWexp=[8 4];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.840000 0.800000 0.420000 0.580000 0.670000 0.070000 0.360000 ;0.690000 0.870000 0.310000 0.600000 0.760000 0.200000 0.380000 ];\r\nWexp=[6 1];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.450000 0.380000 0.280000 0.590000 0.620000 0.230000 0.810000 ;0.320000 0.190000 0.680000 0.140000 0.090000 0.940000 0.170000 ];\r\nWexp=[6 4];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.207000 0.288000 0.180000 0.595000 0.748000 0.459000 0.802000 0.387000 0.027000 0.090000 ;0.450000 0.982000 0.694000 0.613000 0.486000 0.423000 0.685000 0.847000 0.432000 0.604000 ];\r\nWexp=[4 0];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.750000 0.970000 0.820000 0.840000 0.680000 0.780000 0.730000 0.270000 0.220000 0.150000 ;0.130000 0.920000 0.390000 0.320000 0.230000 0.080000 0.800000 0.330000 0.720000 0.590000 ];\r\nWexp=[10 4];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.260000 0.140000 0.600000 0.950000 0.160000 0.650000 0.580000 0.910000 0.230000 0.020000 ;0.120000 0.510000 0.530000 0.280000 0.350000 0.070000 0.400000 0.930000 0.490000 0.090000 ];\r\nWexp=[8 4];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.545000 0.527000 0.500000 0.727000 0.018000 0.400000 0.191000 0.982000 0.409000 0.591000 ;0.945000 0.745000 0.355000 0.673000 0.045000 0.118000 0.682000 0.827000 0.645000 0.482000 ];\r\nWexp=[6 1];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.930000 0.980000 0.470000 0.810000 0.830000 0.460000 0.510000 0.540000 ;0.490000 0.640000 0.170000 0.290000 0.140000 0.440000 0.590000 0.760000 ];\r\nWexp=[8 4];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.580000 ;0.330000 ];\r\nWexp=[1 1];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.640000 0.820000 0.700000 0.480000 0.520000 0.610000 0.060000 0.240000 0.300000 ;0.550000 0.450000 0.090000 0.030000 0.850000 0.670000 0.760000 0.360000 0.790000 ];\r\nWexp=[7 1];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.800000 ;0.900000 ];\r\nWexp=[0 0];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.340000 0.100000 0.040000 0.110000 0.650000 0.250000 0.570000 0.480000 0.150000 0.800000 ;0.550000 0.020000 0.920000 0.080000 0.700000 0.360000 0.910000 0.710000 0.820000 0.850000 ];\r\nWexp=[5 1];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.340000 0.890000 0.060000 0.090000 0.750000 0.730000 0.810000 0.950000 0.660000 0.390000 ;0.530000 0.970000 0.610000 0.670000 0.690000 0.380000 0.590000 0.300000 0.720000 0.110000 ];\r\nWexp=[8 4];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.870000 0.600000 0.860000 0.830000 0.680000 0.810000 0.700000 0.920000 0.760000 ;0.170000 0.510000 0.330000 0.050000 0.240000 0.030000 0.410000 0.480000 0.520000 ];\r\nWexp=[9 9];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.940000 0.720000 0.810000 0.220000 0.280000 0.530000 0.440000 0.160000 0.880000 0.970000 ;0.120000 0.030000 0.470000 0.560000 0.380000 0.340000 0.690000 0.090000 0.250000 0.750000 ];\r\nWexp=[10 4];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.410000 0.360000 0.230000 0.140000 0.180000 0.050000 0.500000 0.270000 0.090000 0.450000 ;0.680000 0.950000 0.910000 0.860000 0.730000 0.550000 0.590000 0.820000 0.640000 0.770000 ];\r\nWexp=[0 0];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.278000 0.852000 0.370000 0.824000 0.389000 0.704000 0.546000 0.204000 0.296000 0.056000 ;0.833000 0.315000 0.991000 0.028000 0.907000 0.630000 0.361000 0.037000 0.065000 0.954000 ];\r\nWexp=[7 2];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.713000 0.657000 0.778000 0.435000 0.565000 0.870000 0.963000 0.343000 0.481000 0.593000 ;0.287000 0.333000 0.454000 0.130000 0.370000 0.759000 0.176000 0.611000 0.231000 0.398000 ];\r\nWexp=[10 6];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.590000 0.750000 0.650000 0.900000 0.740000 0.880000 0.850000 ;0.400000 0.070000 0.540000 0.380000 0.570000 0.150000 0.490000 ];\r\nWexp=[7 7];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.110000 0.920000 0.540000 0.840000 0.380000 0.770000 0.900000 0.490000 0.870000 0.750000 ;0.620000 0.480000 0.330000 0.440000 0.890000 0.130000 0.430000 0.080000 0.340000 0.560000 ];\r\nWexp=[10 5];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.480000 0.650000 0.770000 0.690000 0.720000 0.560000 0.660000 0.550000 0.510000 0.730000 ;0.310000 0.440000 0.300000 0.060000 0.200000 0.420000 0.030000 0.070000 0.110000 0.140000 ];\r\nWexp=[10 10];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.900000 0.680000 0.600000 0.800000 ;0.350000 0.050000 0.170000 0.880000 ];\r\nWexp=[4 3];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.730000 0.910000 0.450000 0.640000 0.090000 ;0.550000 0.360000 0.270000 0.820000 0.180000 ];\r\nWexp=[4 2];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.530000 0.740000 0.410000 0.320000 0.820000 0.970000 0.620000 0.500000 0.710000 0.090000 ;0.180000 0.760000 0.380000 0.150000 0.470000 0.210000 0.560000 0.120000 0.590000 0.440000 ];\r\nWexp=[9 4];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.487000 0.092000 0.714000 0.160000 0.504000 0.277000 0.479000 0.605000 0.462000 0.832000 ;0.210000 0.824000 0.118000 0.387000 0.664000 0.874000 0.445000 0.739000 0.546000 0.017000 ];\r\nWexp=[8 2];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.100000 ;0.400000 ];\r\nWexp=[0 0];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.688000 0.872000 0.615000 0.477000 0.734000 0.624000 0.394000 0.532000 0.954000 0.817000 ;0.193000 0.119000 0.349000 0.073000 0.037000 0.009000 0.128000 0.303000 0.046000 0.064000 ];\r\nWexp=[10 10];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.910000 0.550000 0.300000 0.570000 0.920000 0.400000 0.450000 0.150000 0.110000 0.190000 ;0.090000 0.790000 0.890000 0.740000 0.850000 0.940000 0.340000 0.380000 0.720000 0.260000 ];\r\nWexp=[6 1];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.723000 0.639000 0.824000 0.697000 0.840000 0.882000 0.437000 0.782000 0.588000 0.218000 ;0.345000 0.151000 0.067000 0.849000 0.815000 0.235000 0.521000 0.765000 0.950000 0.681000 ];\r\nWexp=[9 3];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.200000 0.150000 0.350000 0.090000 0.110000 0.330000 0.220000 ;0.390000 0.460000 0.850000 0.700000 0.570000 0.610000 0.500000 ];\r\nWexp=[0 0];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.850000 0.790000 0.550000 0.380000 0.300000 0.400000 0.770000 0.740000 0.320000 0.570000 ;0.260000 0.210000 0.110000 0.130000 0.020000 0.040000 0.230000 0.190000 0.090000 0.060000 ];\r\nWexp=[10 10];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.961000 0.330000 0.010000 0.816000 0.583000 0.913000 0.893000 0.951000 0.126000 0.398000 ;0.767000 0.029000 0.262000 0.641000 0.175000 0.544000 0.359000 0.932000 0.680000 0.476000 ];\r\nWexp=[9 4];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.300000 ;0.700000 ];\r\nWexp=[0 0];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.240000 0.050000 0.190000 0.110000 0.920000 0.590000 0.730000 0.380000 0.780000 0.950000 ;0.860000 0.700000 0.430000 0.620000 0.220000 0.540000 0.410000 0.890000 0.680000 0.490000 ];\r\nWexp=[6 2];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\n% function GJam_Qual_2014d\r\n% % \r\n% %War\r\n% fn='D-small-attempt0.in';\r\n% %fn='D-large.in';\r\n% [data] = read_file(fn); % \r\n% \r\n% fidG = fopen('D-small-output.out', 'w');\r\n% %fidG = fopen('D-large-output001.out', 'w');\r\n% tic\r\n% \r\n% for i=1:size(data,2) % Cell array has N rows of cases\r\n% % m=sort(data{i},2);\r\n%  m=data{i};\r\n%  dw = dWar(m) ;% \r\n%  w = War(m) ;%  \r\n%  \r\n%    fprintf('Case #%i: %i %i\\n',i,dw,w);\r\n%    fprintf(fidG,'Case #%i: %i %i\\n',i,dw,w);\r\n%     \r\n% end\r\n% toc\r\n% \r\n% fclose(fidG);\r\n% \r\n% end\r\n% \r\n% function dw=dWar(m)\r\n% % Post contest\r\n% % Lie to burn opponent best pieces\r\n%  N=sort(m(1,:));\r\n%  K=sort(m(2,:));\r\n%  \r\n%  dw=0;\r\n%  for i=1:length(N)\r\n%   if N(i)\u003eK(1) % Lie to above to beat lowest\r\n%    dw=dw+1;\r\n%    K=K(2:end);\r\n%   else % Lie to just below best\r\n%    K=K(1:end-1);\r\n%   end\r\n%  end\r\n%  \r\n% end\r\n% \r\n% function w=War(m)\r\n% % Optimal truthful strategy\r\n% % Best lucky sequence\r\n%  w=0;\r\n% \r\n%  Nm=sort(m(1,:));\r\n%  Km=sort(m(2,:));\r\n%  \r\n%  Nmz=[Nm' ones(size(Nm,2),1)];\r\n%  Kmz=[Km' zeros(size(Km,2),1)];\r\n%  z=[Nmz;Kmz]; \r\n%  z=sortrows(z,-1);\r\n%  \r\n%  while ~isempty(z)\r\n%   ptr1=find(z(:,2)==1,1,'last');\r\n%   ptr0=find(z(1:ptr1,2)==0,1,'last');\r\n%   if isempty(ptr0)\r\n%    % score\r\n%    w=w+1;\r\n%    z(ptr1,:)=[];\r\n%    ptr0=find(z(:,2)==0,1,'last');\r\n%    z(ptr0,:)=[];  \r\n%   else\r\n%    z(ptr1,:)=[];\r\n%    z(ptr0,:)=[];  \r\n%   end\r\n%  end \r\n%  % Create worst Ken/B Scenario\r\n%  \r\n% end\r\n% \r\n% \r\n% function [d] = read_file(fn)\r\n% % Read whole array then parse\r\n% % dlmread valid for numeric arrays\r\n%  m=dlmread(fn);\r\n%  m(1,:)=[];\r\n%  for i=1:size(m,1)/3\r\n%   d{i}=m(3*i-1:3*i,1:m(3*i-2,1));\r\n%  end\r\n%  \r\n% end % read_file\r\n% Data Set file\r\n%4\r\n%1\r\n%0.5\r\n%0.6\r\n%2\r\n%0.7 0.2\r\n%0.8 0.3\r\n%3\r\n%0.5 0.1 0.9\r\n%0.6 0.4 0.3\r\n%9\r\n%0.186 0.389 0.907 0.832 0.959 0.557 0.300 0.992 0.899\r\n%0.916 0.728 0.271 0.520 0.700 0.521 0.215 0.341 0.458\r\n\r\n\r\n\r\n\r\n\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":1,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":8,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2014-04-19T14:08:56.000Z","updated_at":"2014-04-19T15:00:47.000Z","published_at":"2014-04-19T15:00:47.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis Challenge is derived from\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://code.google.com/codejam/contest/2974486/dashboard#s=p3\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eGJam 2014 Qualifier Deceitful War\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eMy condensed summary of the problem statement.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eGiven two players, A and B, they are each given N masses. All masses are unique. Player A plays first on each comparison and states a Mass. Player B then plays a Mass. The player with the higher mass wins a point after they are compared on a scale. These masses then disappear. This repeats for all N masses. There are no constraints on the order of pieces played.\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\u003eUnsurprisingly when A truthfully states masses player B consistently wins.\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\u003ePlayer A, discouraged, decides to cheat. After the masses are provided player A asks B get A a drink and while B is away A looks at B's masses. Player A now plays pieces but does not necessarily honestly state the mass values. All scale comparisons must be valid based on B's strategy and A's stated mass. Player A now achieves more wins.\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\u003ePart one is determine the best possible score for A when playing deceitfully.\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\u003ePart two is determine the best possible score if player A did not look and is honest.\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\u003eExamples:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[A: 0.5 0.1 0.9  B 0.6 0.4 0.3  Deceitful Wins 2, Optimal Honest 1\\n\\nA 0.186 0.389 0.907 0.832 0.959 0.557 0.300 0.992 0.899\\nB 0.916 0.728 0.271 0.520 0.700 0.521 0.215 0.341 0.458\\nDeceitful A Wins 8\\nOptimal Honest A Wins 4]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e A,B vectors of length N (Small has N\u0026lt;=10, Large(future challenge N\u0026lt;=1000)\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 Deceitful Wins, Optimal Honest Wins\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\u003eNote:\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\u003eIn the contest period there were 30 Matlab solutions, of which I was not one as I glitched on the easy Deceitful algorithm thinking my Honest algorithm was in error.\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.go-hero.net/jam/14/solutions/0/4/MATLAB\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eGJam Deceitful Solutions\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. My post contest full GJam is in the test suite. About 11000 out of 28000 entrants solved this puzzle.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":698,"title":"Knots Contest: Score  (TestSuite) ","description":"This Challenge is to Score well on the \u003chttp://www.mathworks.com/matlabcentral/contest/contests/38/rules Knots contest\u003e test suite.\r\n\r\n\r\nAll Cody ToolBoxes are available. (Neural, Parallel, Stats)\r\n\r\n*Input:* A, xyIn, wts\r\n\r\n*Output:* xyOut \r\n\r\nExamples and specifics are at \u003chttp://www.mathworks.com/matlabcentral/contest/contests/38/rules Knots contest\u003e .\r\n\r\n\r\n*Scoring:* Score is Knots+6.5 e^(Time/23). Code size and distance are ignored. All 50 sample boards are scored.\r\n\r\n  \r\n  The Champions are the first three scores.\r\n  Raphael Candelier's Cheeeese is followed by the creations of Per and Alfonso.\r\n  \r\n.\r\n\r\n*Future:*\r\n  \r\n  Additional Challenges using the Contest Suite will become available as will Scoring for Fewest Knots, no time penalty. Also puzzle subsets for Fewest Knots and Low Score will be created.\r\n\r\n","description_html":"\u003cp\u003eThis Challenge is to Score well on the \u003ca href=\"http://www.mathworks.com/matlabcentral/contest/contests/38/rules\"\u003eKnots contest\u003c/a\u003e test suite.\u003c/p\u003e\u003cp\u003eAll Cody ToolBoxes are available. (Neural, Parallel, Stats)\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e A, xyIn, wts\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e xyOut\u003c/p\u003e\u003cp\u003eExamples and specifics are at \u003ca href=\"http://www.mathworks.com/matlabcentral/contest/contests/38/rules\"\u003eKnots contest\u003c/a\u003e .\u003c/p\u003e\u003cp\u003e\u003cb\u003eScoring:\u003c/b\u003e Score is Knots+6.5 e^(Time/23). Code size and distance are ignored. All 50 sample boards are scored.\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003eThe Champions are the first three scores.\r\nRaphael Candelier's Cheeeese is followed by the creations of Per and Alfonso.\r\n\u003c/pre\u003e\u003cp\u003e.\u003c/p\u003e\u003cp\u003e\u003cb\u003eFuture:\u003c/b\u003e\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003eAdditional Challenges using the Contest Suite will become available as will Scoring for Fewest Knots, no time penalty. Also puzzle subsets for Fewest Knots and Low Score will be created.\r\n\u003c/pre\u003e","function_template":"function xyOut=solver(a,xyIn,wts);\r\n xyOut=xyIn;\r\nend\r\n","test_suite":"%%\r\nfeval(@assignin,'caller','score',2000);\r\n%%\r\ntic\r\n%urlwrite('http://tinyurl.com/matlab-Knots','Knots_sample.mat')\r\n%urlwrite('http://tinyurl.com/matlab-numKnots','numKnots.m') % Fast numKnots\r\n\r\nurlwrite('http://rmatlabtest.appspot.com/testsuite_sample_knots.mat','Knots_sample.mat')\r\ntoc\r\nurlwrite('http://rmatlabtest.appspot.com/numKnots.m','numKnots.m') % Fast numKnots\r\ntoc\r\n\r\n\r\nrehash path % Make numKnots.m available\r\ntoc\r\n%%\r\ncases=50; % Reduced to 40 from 50\r\nnKnots=zeros(cases,1);\r\nKnotTime=zeros(cases,1);\r\n\r\nload Knots_sample.mat\r\ntestsuite=suite;\r\nfor n=1:cases\r\n a=testsuite(n).a;\r\n xyIn=testsuite(n).xyIn;\r\n wts=testsuite(n).wts;\r\n rng(2,'twister')\r\n time0 = cputime;\r\n xyOut=solver(a,xyIn,wts);\r\n KnotTime(n) = cputime - time0;\r\n if size(unique(xyOut,'rows'),1)\u003clength(wts)\r\n  nKnots(n)=Inf; % Points must be unique\r\n else\r\n  nKnots(n)=numKnots(xyOut,a);\r\n end\r\nend\r\nfor n=1:cases\r\n fprintf('%2i KnotTime(msec) %5i  Knots %4i\\n',n,floor(KnotTime(n)*1000),nKnots(n))\r\nend\r\n\r\nTKnotTime=sum(KnotTime);\r\nfprintf('Sum KnotTime %5i  msec\\n',floor(TKnotTime*1000))\r\nT_score=6.5*exp(TKnotTime/23);\r\nTknots=sum(nKnots);;\r\nfprintf('Time Score %10.2f\\n',T_score)\r\nfprintf('Knot Score %10.2f\\n',Tknots)\r\nfprintf('Total Score %10.2f\\n',Tknots+T_score)\r\n\r\nfprintf('Cody Maximum allowed Elapsed time is approximately 53 seconds\\n')\r\ntoc\r\n\r\nfeval(  @assignin,'caller','score',min( 2000,Tknots+floor(T_score) )  );","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":6,"test_suite_updated_at":"2013-11-15T22:54:25.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2012-05-18T02:11:49.000Z","updated_at":"2013-11-15T23:06:17.000Z","published_at":"2012-11-10T20:11:06.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis Challenge is to Score well on the\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/contest/contests/38/rules\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eKnots contest\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e test suite.\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\u003eAll Cody ToolBoxes are available. (Neural, Parallel, Stats)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e A, xyIn, wts\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 xyOut\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eExamples and specifics are 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=\\\"http://www.mathworks.com/matlabcentral/contest/contests/38/rules\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eKnots contest\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e .\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\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 Score is Knots+6.5 e^(Time/23). Code size and distance are ignored. All 50 sample boards are scored.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[The Champions are the first three scores.\\nRaphael Candelier's Cheeeese is followed by the creations of Per and Alfonso.]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eFuture:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[Additional Challenges using the Contest Suite will become available as will Scoring for Fewest Knots, no time penalty. Also puzzle subsets for Fewest Knots and Low Score will be created.]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":811,"title":"Genome Sequence 004: Long 3rd Generation Segment Correction","description":"The Melopsittacus undulates genome, Parrot Budgerigar, was successfully sequenced in July 2012 using long 3rd Gen sequences provided by \u003chttp://www.pacificbiosciences.com/ PacBio\u003e. The \u003chttp://assemblathon.org/a-parrot-a-fish-and-a-snake-walk-into-a-bar Assemblathon Genome Contest\u003e led the team of Phillippy, Koren and Jarvis to successfully \u003chttp://www.sciencedaily.com/releases/2012/07/120702210229.htm Sequence Parrot DNA\u003e using the PacBio 3rd Generation data and Illumina 2nd Gen data.\r\n\r\nThe 3rd gen PacBio data is very long, 1K-20K, but has 15% error rate. The Illumina data is 100-500 long with \u003c1% error rate. Jarvis and his team combined this data to achieve \u003c 0.1% error rate.\r\n\r\nGenome Challenge 004 is the correction of simplified PacBio simulated reads with high error rate.\r\n\r\n*Input:* \r\n\r\nCall 1: empty array, segment Width, Flag=0\r\n\r\nCall 2: N PacBio DNA vectors (N x width), Segment Width, Flag=1\r\n\r\n*Output:* \r\n\r\nCall 1: empty vector, Number of Requested Vectors\r\n\r\nCall 2: Corrected DNA vector, Number of Requested Vectors\r\n\r\n*Score:* Number of N vectors used to produce correct vector for w=1024 case\r\n\r\nThe first call to the PacBio_fix routine returns the number of vectors requested to produce a final product. This may be a function of w.\r\n\r\nThe second call to PacBio_fix will have a DNA matix (N x width) and flag=1.\r\n\r\nThe response to the second call is the fixed DNA sequence, vector of width w.\r\n\r\n*example:*\r\nFirst call return : N=3\r\n\r\n  01230123111122223333 Truth\r\n  Input example\r\n  01232123112122221332 Injected errors\r\n  01130123111122123323\r\n  11230133121122223333\r\n\r\n  Output: \r\n  01230123111122223333 Truth, hopefully\r\n\r\n\r\nThis data is simplified by only having simple substitutions and the data sets are provided pre-aligned. \r\n\r\nThe real PacBio data is quite a bit more complicated. Values may be added, deleted, substituted, and are of varying lengths. This causes alignment issues.\r\n\r\nFollow-Up Challenges: Sample Data from the PacBio site for \u003chttp://www.cbcb.umd.edu/software/PBcR/ Lambda Phage\u003e will be molded into various Challenges. Possible challenges are correcting individual long segments and assembling multiple long segments into the full Lambda Phage genome. The Parrot genome is too big for Cody to solve in 50 seconds.\r\n","description_html":"\u003cp\u003eThe Melopsittacus undulates genome, Parrot Budgerigar, was successfully sequenced in July 2012 using long 3rd Gen sequences provided by \u003ca href=\"http://www.pacificbiosciences.com/\"\u003ePacBio\u003c/a\u003e. The \u003ca href=\"http://assemblathon.org/a-parrot-a-fish-and-a-snake-walk-into-a-bar\"\u003eAssemblathon Genome Contest\u003c/a\u003e led the team of Phillippy, Koren and Jarvis to successfully \u003ca href=\"http://www.sciencedaily.com/releases/2012/07/120702210229.htm\"\u003eSequence Parrot DNA\u003c/a\u003e using the PacBio 3rd Generation data and Illumina 2nd Gen data.\u003c/p\u003e\u003cp\u003eThe 3rd gen PacBio data is very long, 1K-20K, but has 15% error rate. The Illumina data is 100-500 long with \u0026lt;1% error rate. Jarvis and his team combined this data to achieve \u0026lt; 0.1% error rate.\u003c/p\u003e\u003cp\u003eGenome Challenge 004 is the correction of simplified PacBio simulated reads with high error rate.\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eCall 1: empty array, segment Width, Flag=0\u003c/p\u003e\u003cp\u003eCall 2: N PacBio DNA vectors (N x width), Segment Width, Flag=1\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eCall 1: empty vector, Number of Requested Vectors\u003c/p\u003e\u003cp\u003eCall 2: Corrected DNA vector, Number of Requested Vectors\u003c/p\u003e\u003cp\u003e\u003cb\u003eScore:\u003c/b\u003e Number of N vectors used to produce correct vector for w=1024 case\u003c/p\u003e\u003cp\u003eThe first call to the PacBio_fix routine returns the number of vectors requested to produce a final product. This may be a function of w.\u003c/p\u003e\u003cp\u003eThe second call to PacBio_fix will have a DNA matix (N x width) and flag=1.\u003c/p\u003e\u003cp\u003eThe response to the second call is the fixed DNA sequence, vector of width w.\u003c/p\u003e\u003cp\u003e\u003cb\u003eexample:\u003c/b\u003e\r\nFirst call return : N=3\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003e01230123111122223333 Truth\r\nInput example\r\n01232123112122221332 Injected errors\r\n01130123111122123323\r\n11230133121122223333\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003eOutput: \r\n01230123111122223333 Truth, hopefully\r\n\u003c/pre\u003e\u003cp\u003eThis data is simplified by only having simple substitutions and the data sets are provided pre-aligned.\u003c/p\u003e\u003cp\u003eThe real PacBio data is quite a bit more complicated. Values may be added, deleted, substituted, and are of varying lengths. This causes alignment issues.\u003c/p\u003e\u003cp\u003eFollow-Up Challenges: Sample Data from the PacBio site for \u003ca href=\"http://www.cbcb.umd.edu/software/PBcR/\"\u003eLambda Phage\u003c/a\u003e will be molded into various Challenges. Possible challenges are correcting individual long segments and assembling multiple long segments into the full Lambda Phage genome. The Parrot genome is too big for Cody to solve in 50 seconds.\u003c/p\u003e","function_template":"function [M_fix,N]=PacBio_fix(M,w,flag)\r\n% 1st Call\r\n% M is empty\r\n% w is width of segment\r\n% flag is 0\r\n% Ouput is N, the number of segments requested to fix the segment\r\n% 2nd Call\r\n% M is an Nxw array of values [0:3]\r\n\r\n M_fix=[];\r\n N=1; % needed for 2nd call with flag==1\r\n if flag==0 % Requested number of Segments\r\n  N=1;\r\n  return;\r\n end\r\n\r\nM_fix=M(1,:);\r\n\r\n\r\nend","test_suite":"%%\r\nfeval(@assignin,'caller','score',0);\r\n%%\r\nM=[];\r\nflag=0;\r\nw=100;\r\n[M_fix,N]=PacBio_fix(M,w,flag);\r\n\r\nM_truth=randi(4,1,w,'uint8')-1;\r\nM=repmat(M_truth,N,1);\r\n\r\n% Apply 15% substitution error\r\nqerr=floor(.15*N*w);\r\nerrvec=randi(N*w,qerr,1);\r\nerrval=randi(4,qerr,1)-1;\r\n\r\nM(errvec)=errval;\r\n\r\nflag=1;\r\ntic\r\n[M_fix,N]=PacBio_fix(M,w,flag);\r\ntoc\r\n\r\nassert(isequal(M_fix,M_truth),sprintf('Error Count=%i',sum(M_fix~=M_truth)))\r\n%%\r\nM=[];\r\nflag=0;\r\nw=6144;\r\n[M_fix,N]=PacBio_fix(M,w,flag);\r\n\r\nM_truth=randi(4,1,w,'uint8')-1;\r\nM=repmat(M_truth,N,1);\r\n\r\n% Apply 15% substitution error\r\nqerr=floor(.15*N*w);\r\nerrvec=randi(N*w,qerr,1);\r\nerrval=randi(4,qerr,1)-1;\r\n\r\nM(errvec)=errval;\r\n\r\nflag=1;\r\ntic\r\n[M_fix,N]=PacBio_fix(M,w,flag);\r\ntoc\r\n\r\nassert(isequal(M_fix,M_truth),sprintf('Error Count=%i',sum(M_fix~=M_truth)))\r\n\r\n%%\r\n% Size Performance is based on w=1024 case\r\nM=[];\r\nflag=0;\r\nw=1024;\r\n[M_fix,N]=PacBio_fix(M,w,flag);\r\n\r\nM_truth=randi(4,1,w,'uint8')-1;\r\nM=repmat(M_truth,N,1);\r\n\r\n% Apply 15% substitution error\r\nqerr=floor(.15*N*w);\r\nerrvec=randi(N*w,qerr,1);\r\nerrval=randi(4,qerr,1)-1;\r\n\r\nM(errvec)=errval;\r\n\r\nflag=1;\r\ntic\r\n[M_fix,not_N]=PacBio_fix(M,w,flag);\r\ntoc\r\n\r\nassert(isequal(M_fix,M_truth),sprintf('Error Count=%i',sum(M_fix~=M_truth)))\r\n\r\nfeval(@assignin,'caller','score',min(20,N));\r\n\r\n\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":2,"test_suite_updated_at":"2012-10-08T02:30:34.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2012-07-01T05:26:57.000Z","updated_at":"2012-10-08T02:40:09.000Z","published_at":"2012-10-08T02:29:50.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe Melopsittacus undulates genome, Parrot Budgerigar, was successfully sequenced in July 2012 using long 3rd Gen sequences provided by\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.pacificbiosciences.com/\\\"\u003e\u003cw:r\u003e\u003cw:t\u003ePacBio\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. The\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://assemblathon.org/a-parrot-a-fish-and-a-snake-walk-into-a-bar\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eAssemblathon Genome Contest\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e led the team of Phillippy, Koren and Jarvis to successfully\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.sciencedaily.com/releases/2012/07/120702210229.htm\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eSequence Parrot DNA\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e using the PacBio 3rd Generation data and Illumina 2nd Gen data.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe 3rd gen PacBio data is very long, 1K-20K, but has 15% error rate. The Illumina data is 100-500 long with \u0026lt;1% error rate. Jarvis and his team combined this data to achieve \u0026lt; 0.1% error rate.\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\u003eGenome Challenge 004 is the correction of simplified PacBio simulated reads with high error rate.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eCall 1: empty array, segment Width, Flag=0\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\u003eCall 2: N PacBio DNA vectors (N x width), Segment Width, Flag=1\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eOutput:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eCall 1: empty vector, Number of Requested Vectors\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\u003eCall 2: Corrected DNA vector, Number of Requested Vectors\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\u003eScore:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Number of N vectors used to produce correct vector for w=1024 case\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe first call to the PacBio_fix routine returns the number of vectors requested to produce a final product. This may be a function of w.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe second call to PacBio_fix will have a DNA matix (N x width) and flag=1.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe response to the second call is the fixed DNA sequence, vector of width w.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eexample:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e First call return : N=3\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[01230123111122223333 Truth\\nInput example\\n01232123112122221332 Injected errors\\n01130123111122123323\\n11230133121122223333\\n\\nOutput: \\n01230123111122223333 Truth, hopefully]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis data is simplified by only having simple substitutions and the data sets are provided pre-aligned.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe real PacBio data is quite a bit more complicated. Values may be added, deleted, substituted, and are of varying lengths. This causes alignment issues.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eFollow-Up Challenges: Sample Data from the PacBio site for\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.cbcb.umd.edu/software/PBcR/\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eLambda Phage\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e will be molded into various Challenges. Possible challenges are correcting individual long segments and assembling multiple long segments into the full Lambda Phage genome. The Parrot genome is too big for Cody to solve in 50 seconds.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":787,"title":"Path Optimization thru N words : Time Optimization","description":"This is an extension of\r\n\u003chttp://www.mathworks.com/matlabcentral/cody/problems/196-love-is-an-n-letter-word Cody 196 love\u003e with a more stressing test set and scoring based upon time.\r\n\r\nGreater than 10 words induces time issues with brute force combinatorics.\r\n\r\nDescription is copy of Alfonso Nieto-Castanon's problem statement for Cody 196.\r\n\r\nGiven a list of N words, return the N-letter word (choosing one letter from each word) with the property of having the least distance between each pair of two consecutive letters (if there are multiple optimal solutions return any one of them). Letters may repeat inside words.\r\n\r\nExample: s1 = {'abcd','bcde','cdef','defg'}; should return s2 = 'dddd'; (with total letter-distance = 0)\r\n\r\nExample: s1={'aldfejk','czoa','vwy','abcde'}; should return s2='love'; (with total letter-distance = 27: 'l'-'o'=3 + 'o'-'v'=7 + 'v'-'e'=17 ; compare for example to the possible word 'aave' which has a total letter-distance of 38)\r\n\r\n*Passing:* All problems correct and time \u003c 2 seconds\r\n\r\n*Output chart:* Time in milliseconds with a max of 100 ms.\r\n\r\nNote: Did consider logarithmic scale but keeping it simple for now.","description_html":"\u003cp\u003eThis is an extension of \u003ca href=\"http://www.mathworks.com/matlabcentral/cody/problems/196-love-is-an-n-letter-word\"\u003eCody 196 love\u003c/a\u003e with a more stressing test set and scoring based upon time.\u003c/p\u003e\u003cp\u003eGreater than 10 words induces time issues with brute force combinatorics.\u003c/p\u003e\u003cp\u003eDescription is copy of Alfonso Nieto-Castanon's problem statement for Cody 196.\u003c/p\u003e\u003cp\u003eGiven a list of N words, return the N-letter word (choosing one letter from each word) with the property of having the least distance between each pair of two consecutive letters (if there are multiple optimal solutions return any one of them). Letters may repeat inside words.\u003c/p\u003e\u003cp\u003eExample: s1 = {'abcd','bcde','cdef','defg'}; should return s2 = 'dddd'; (with total letter-distance = 0)\u003c/p\u003e\u003cp\u003eExample: s1={'aldfejk','czoa','vwy','abcde'}; should return s2='love'; (with total letter-distance = 27: 'l'-'o'=3 + 'o'-'v'=7 + 'v'-'e'=17 ; compare for example to the possible word 'aave' which has a total letter-distance of 38)\u003c/p\u003e\u003cp\u003e\u003cb\u003ePassing:\u003c/b\u003e All problems correct and time \u0026lt; 2 seconds\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput chart:\u003c/b\u003e Time in milliseconds with a max of 100 ms.\u003c/p\u003e\u003cp\u003eNote: Did consider logarithmic scale but keeping it simple for now.\u003c/p\u003e","function_template":"function y = min_path_cost(s1)\r\n  s2 = '';\r\nend","test_suite":"%%\r\nfeval(@assignin,'caller','score',100);\r\n%%\r\nformat short\r\nformat compact\r\nglobal net_time\r\ns1 = {'abcd','bcde','cdef','defg'};\r\n\r\ns2=min_path_cost(s1); % to get good time\r\nt0=clock;\r\ns2=min_path_cost(s1);\r\ndt=etime(clock,t0)*1e3;\r\n\r\nassert(isequal(s2,'dddd'))\r\n\r\nnet_time=dt\r\n%%\r\nglobal net_time\r\ntemp=net_time; % anti-cheat\r\ns1 = {'aldfejk','czoa','vwy','abcde'};\r\n\r\ns2=min_path_cost(s1);\r\nt0=clock;\r\ns2=min_path_cost(s1);\r\ndt=etime(clock,t0)*1e3\r\n\r\nassert(isequal(s2,'love'))\r\n\r\nnet_time=temp+dt\r\n%%\r\nglobal net_time\r\n% anti-cheat \r\ntemp=net_time;\r\n\r\ns1 = {'aldfejk','czoa','vwy','abcde'};\r\n\r\ns2=min_path_cost(s1);\r\nt0=clock;\r\npause(0.2);\r\ns2=min_path_cost(s1);\r\ndt=etime(clock,t0)*1e3\r\n\r\nassert(isequal(s2,'love'))\r\n\r\nif dt\u003c200\r\n net_time=2001 % cheat trap fail condition\r\nend\r\n%%\r\n% not part of the time trial\r\n% avoids look-up table hack - Castano\r\ns1 = cellfun(@(x)char('a'-1+randi(26,1,5)),cell(1,7),'uniformoutput',false);\r\nassert(all(any(bsxfun(@eq,min_path_cost(s1),cell2mat(cellfun(@(x)x',s1,'uniformoutput',false)))))\u0026all(sum(abs(diff(double(min_path_cost(s1)))))\u003c=sum(abs(diff(double(cell2mat(cellfun(@(x)x(randi(numel(x),1,1000))',s1,'uniformoutput',false))),1,2)),2)));\r\n%%\r\nglobal net_time\r\ntemp=net_time;\r\ns1 = {'lqjfac','deamv','fkazbw','idlw','ajmf','abcwz','wxyz'}; %lmklmww\r\n\r\ns2=min_path_cost(s1);\r\nt0=clock;\r\ns2=min_path_cost(s1);\r\ndt=etime(clock,t0)*1e3\r\n\r\nassert(isequal(s2,'lmklmww'))\r\nnet_time=temp+dt\r\n\r\n%%\r\nglobal net_time\r\ntemp=net_time;\r\ns1 = {'lwjac','demv','fkabw','idlw','pqmf','abcnq','fwxyz','mnop'};\r\n\r\ns2=min_path_cost(s1);\r\nt0=clock;\r\ns2=min_path_cost(s1);\r\ndt=etime(clock,t0)*1e3\r\n\r\nassert(isequal(s2,'cdfdfcfm')|isequal(s2,'cdbdfcfm'))\r\nnet_time=temp+dt\r\n%%\r\nglobal net_time\r\ntemp=net_time;\r\ns1 = {'ldjac','demv','fkabw','idlw','pqmf','abcnq','fwxyz','mnop','flap'};\r\n\r\ns2=min_path_cost(s1);\r\nt0=clock;\r\ns2=min_path_cost(s1);\r\ndt=etime(clock,t0)*1e3\r\n\r\nassert(isequal(s2,'ddfdfcfml')|isequal(s2,'ddbdfcfml'))\r\nnet_time=temp+dt\r\n%%\r\nglobal net_time\r\ntemp=net_time;\r\ns1 = {'the','goal','of','life','is','living','in','agreement','with','nature'};\r\n\r\ns2=min_path_cost(s1);\r\nt0=clock;\r\ns2=min_path_cost(s1);\r\ndt=etime(clock,t0)*1e3\r\n\r\nassert(isequal(s2,'hgfiiiighe')|isequal(s2,'hgffiiighe'))\r\nnet_time=temp+dt\r\n%%\r\nglobal net_time\r\ntemp=net_time;\r\ns1 = {'he' 'has','all','the','virtues','idislike','andnone','ofthe','vicesi','admire'};\r\n\r\ns2=min_path_cost(s1);\r\nt0=clock;\r\ns2=min_path_cost(s1);\r\ndt=etime(clock,t0)*1e3\r\n\r\nassert(isequal(s2,'eaaeeeeeee'))\r\nnet_time=temp+dt\r\n%%\r\nglobal net_time\r\ntemp=net_time;\r\n\r\ns1 = {'history' 'will','be','kind','to','me','for','i','intend','to','write','it'};\r\n\r\ns2=min_path_cost(s1);\r\nt0=clock;\r\ns2=min_path_cost(s1);\r\ndt=etime(clock,t0)*1e3\r\n\r\nassert(isequal(s2,'iiekomoiiort')|isequal(s2,'iieiomoiiort'))\r\nnet_time=temp+dt\r\n\r\n%%\r\nglobal net_time\r\n% Time performance rqmt\r\nassert(net_time\u003c2000,sprintf('Net time = %s',num2str(net_time))); \r\n%%\r\nglobal net_time\r\n% net_time in ms\r\n% Create graph data\r\nnet_time=min(100,net_time) % Limit graph y-axis\r\n\r\nfeval(@assignin,'caller','score',floor(net_time));\r\n\r\n%fh=fopen('min_path_cost.m','wt');\r\n%fprintf(fh,'%s\\n',repmat('1;',[1,round(net_time/2)]));\r\n%fclose(fh);","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":8,"test_suite_updated_at":"2012-11-22T12:11:45.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2012-06-24T20:34:17.000Z","updated_at":"2012-11-22T12:11:45.000Z","published_at":"2012-06-25T00:03:56.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis is an extension of\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/problems/196-love-is-an-n-letter-word\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eCody 196 love\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e with a more stressing test set and scoring based upon time.\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\u003eGreater than 10 words induces time issues with brute force combinatorics.\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\u003eDescription is copy of Alfonso Nieto-Castanon's problem statement for Cody 196.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eGiven a list of N words, return the N-letter word (choosing one letter from each word) with the property of having the least distance between each pair of two consecutive letters (if there are multiple optimal solutions return any one of them). Letters may repeat inside words.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eExample: s1 = {'abcd','bcde','cdef','defg'}; should return s2 = 'dddd'; (with total letter-distance = 0)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eExample: s1={'aldfejk','czoa','vwy','abcde'}; should return s2='love'; (with total letter-distance = 27: 'l'-'o'=3 + 'o'-'v'=7 + 'v'-'e'=17 ; compare for example to the possible word 'aave' which has a total letter-distance of 38)\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\u003ePassing:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e All problems correct and time \u0026lt; 2 seconds\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 chart:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Time in milliseconds with a max of 100 ms.\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\u003eNote: Did consider logarithmic scale but keeping it simple for now.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":988,"title":"Convert a substructure reference string into a valid definition structure for subsref and subsasgn","description":"You have a reference to an element in a data structure, which you want to pass to a function. Not the value itself, but the reference. And you don't like to use evil eval constructions. \r\nTherefore, you convert the reference into a structure, like liked by Matlab's built-in subsref and subsasgn functions.\r\n\r\nFor example, to reference the value a(12), you would have to convert '(12)' into \r\n\r\n  def = \r\n    type: '()'\r\n    subs: {[12]}\r\n\r\nAnd to reference a(12).field_b{1,3}{2}((3:4),:).c, you would need to convert '(12).field_b{1,3}{2}((3:4),:).c' into \r\n\r\n  def(1) = \r\n    type: '()'\r\n    subs: {[12]}\r\n\r\n  def(2) = \r\n    type: '.'\r\n    subs: {'field_b'}\r\n\r\n  def(3) = \r\n    type: '{}'\r\n    subs: {[1]  [3]}\r\n\r\n  def(4) = \r\n    type: '{}'\r\n    subs: {2}\r\n\r\n  def(5) = \r\n    type: '()'\r\n    subs: {[3 4]  ':'}\r\n\r\n  def(6) = \r\n    type: '.'\r\n    subs: {'c'}\r\n\r\nThe assignment is correct when any sub-structure reference that is accepted by subsref and subsasgn is correctly converted from a string to a valid structure.\r\n\r\nNote: Solutions wrapped in (f)eval(c), inline, str2func, regexprep (dynamic regular expressions), etc, are not appreciated.","description_html":"\u003cp\u003eYou have a reference to an element in a data structure, which you want to pass to a function. Not the value itself, but the reference. And you don't like to use evil eval constructions. \r\nTherefore, you convert the reference into a structure, like liked by Matlab's built-in subsref and subsasgn functions.\u003c/p\u003e\u003cp\u003eFor example, to reference the value a(12), you would have to convert '(12)' into\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003edef = \r\n  type: '()'\r\n  subs: {[12]}\r\n\u003c/pre\u003e\u003cp\u003eAnd to reference a(12).field_b{1,3}{2}((3:4),:).c, you would need to convert '(12).field_b{1,3}{2}((3:4),:).c' into\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003edef(1) = \r\n  type: '()'\r\n  subs: {[12]}\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003edef(2) = \r\n  type: '.'\r\n  subs: {'field_b'}\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003edef(3) = \r\n  type: '{}'\r\n  subs: {[1]  [3]}\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003edef(4) = \r\n  type: '{}'\r\n  subs: {2}\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003edef(5) = \r\n  type: '()'\r\n  subs: {[3 4]  ':'}\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003edef(6) = \r\n  type: '.'\r\n  subs: {'c'}\r\n\u003c/pre\u003e\u003cp\u003eThe assignment is correct when any sub-structure reference that is accepted by subsref and subsasgn is correctly converted from a string to a valid structure.\u003c/p\u003e\u003cp\u003eNote: Solutions wrapped in (f)eval(c), inline, str2func, regexprep (dynamic regular expressions), etc, are not appreciated.\u003c/p\u003e","function_template":"function def = subsdef(defstr)\r\n  def = substruct('()',{1});\r\nend","test_suite":"%%\r\nnocheat = isempty(regexp(evalc('type subsdef'),'(eval|regexprep|inline|str2func)'));\r\ny_correct = 1i;\r\nb(12) = y_correct;\r\ndefstr = '(12)';\r\nassert(isequal(subsref(b,subsdef(defstr)),y_correct) \u0026\u0026 nocheat)\r\n\r\n%%\r\nnocheat = isempty(regexp(evalc('type subsdef'),'(eval|regexprep|inline|str2func)'));\r\ny_correct = -4i;\r\nc{1,2,3,4,5}.field_b = y_correct;\r\ndefstr = '{1,2,3,4,5}.field_b';\r\nassert(isequal(subsref(c,subsdef(defstr)),y_correct) \u0026\u0026 nocheat)\r\n\r\n%%\r\nnocheat = isempty(regexp(evalc('type subsdef'),'(eval|regexprep|inline|str2func)'));\r\ny_correct = 3i;\r\na(12).field_b{1,3}{2}((3),1).c = y_correct;\r\ndefstr = '(12).field_b{1,3}{2}((3),1).c';\r\nassert(isequal(subsref(a,subsdef(defstr)),y_correct) \u0026\u0026 nocheat)\r\n\r\n%%\r\nnocheat = isempty(regexp(evalc('type subsdef'),'(eval|regexprep|inline|str2func)'));\r\ny_correct = repmat(2i,3,1);\r\nd{2}.a(1:3,:) = y_correct;\r\ndefstr = '{2}.a(1:3,:)';\r\nassert(isequal(subsref(d,subsdef(defstr)),y_correct) \u0026\u0026 nocheat)\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":6556,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":7,"test_suite_updated_at":"2012-10-11T14:58:11.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2012-10-11T14:55:15.000Z","updated_at":"2012-10-11T14:58:11.000Z","published_at":"2012-10-11T14:55:15.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eYou have a reference to an element in a data structure, which you want to pass to a function. Not the value itself, but the reference. And you don't like to use evil eval constructions. Therefore, you convert the reference into a structure, like liked by Matlab's built-in subsref and subsasgn functions.\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\u003eFor example, to reference the value a(12), you would have to convert '(12)' into\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[def = \\n  type: '()'\\n  subs: {[12]}]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eAnd to reference a(12).field_b{1,3}{2}((3:4),:).c, you would need to convert '(12).field_b{1,3}{2}((3:4),:).c' into\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[def(1) = \\n  type: '()'\\n  subs: {[12]}\\n\\ndef(2) = \\n  type: '.'\\n  subs: {'field_b'}\\n\\ndef(3) = \\n  type: '{}'\\n  subs: {[1]  [3]}\\n\\ndef(4) = \\n  type: '{}'\\n  subs: {2}\\n\\ndef(5) = \\n  type: '()'\\n  subs: {[3 4]  ':'}\\n\\ndef(6) = \\n  type: '.'\\n  subs: {'c'}]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe assignment is correct when any sub-structure reference that is accepted by subsref and subsasgn is correctly converted from a string to a valid structure.\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\u003eNote: Solutions wrapped in (f)eval(c), inline, str2func, regexprep (dynamic regular expressions), etc, are not appreciated.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":715,"title":"Chezz_015 : Simplified chess","description":"Chezz:...A simplified Chess game. Two game match with future multiple skill levels via evolutionary upgrades.\r\n\r\nSimplified the rules to implement rapid move check. Normal Chess moves like \"a4\", Castling, and En Passant are accepted. Moves are simple vectors [idx_from idx_to promo] where promo is for pawns reaching the 8th rank. Piece names are numeric 1-6 White (P,R,N,B,Q,K) and Black is 7-12. Board empty space is 0.\r\n\r\nChezz unique rules: 1) To Win must remove opponent's King.. 2) Lose Turn if try an impossible move.. 3) Checks are ignored - allow move into check, castle out of check, castle thru/into check.. 4) Pawn promote to any piece, including opponent and vacuum.. 5) Six position repetition is a Draw..6) 50 moves No captures is a Draw..\r\n\r\n\r\n*Inputs:* (b,pmv,castle)\r\n\r\nPlayer always appears to be White. However, Black may apparently move first.\r\n\r\nb (8x8) array with empty=0, White Pieces 1-6, Blk Pieces 7-12\r\n\r\npmv [from to promo] vector of both players moves (needed for en passant option). Illegal move creates a [0 0 0] pmv value. Size [2*moves,3]\r\n\r\ncastle: 6 pt logical vector to show castling options. 1 if piece is eligible. Positions are [8 40 64 1 33 57] for [WQR WK WKR BQR BK BKR]. . . eg castle mv [40 56 0]\r\n\r\n\r\n\r\n*Output:* mv  [from to pawn_new_type] where from/to are 1-64 and pawn_new is 0 thru 12 if pawn is on final row.\r\n\r\n\r\n\r\nThe Test Suite will oversee two games with the Player as Black(moving second) and then as White.\r\n\r\n*Passing:* Player must Win both games\r\n\r\n*Evolution:* Winning player algorithms will be hosted as Chezz_xyz based on their wins over other Chezz algorithms. Champions and the basis will be fully credited in Chezz updates. Champions must be able to play self and Not Cody timeout.\r\n\r\n\r\nChezz_015: Pawn Serial Attack - Will capture and Promote\r\n\r\nLink update 12/27/12","description_html":"\u003cp\u003eChezz:...A simplified Chess game. Two game match with future multiple skill levels via evolutionary upgrades.\u003c/p\u003e\u003cp\u003eSimplified the rules to implement rapid move check. Normal Chess moves like \"a4\", Castling, and En Passant are accepted. Moves are simple vectors [idx_from idx_to promo] where promo is for pawns reaching the 8th rank. Piece names are numeric 1-6 White (P,R,N,B,Q,K) and Black is 7-12. Board empty space is 0.\u003c/p\u003e\u003cp\u003eChezz unique rules: 1) To Win must remove opponent's King.. 2) Lose Turn if try an impossible move.. 3) Checks are ignored - allow move into check, castle out of check, castle thru/into check.. 4) Pawn promote to any piece, including opponent and vacuum.. 5) Six position repetition is a Draw..6) 50 moves No captures is a Draw..\u003c/p\u003e\u003cp\u003e\u003cb\u003eInputs:\u003c/b\u003e (b,pmv,castle)\u003c/p\u003e\u003cp\u003ePlayer always appears to be White. However, Black may apparently move first.\u003c/p\u003e\u003cp\u003eb (8x8) array with empty=0, White Pieces 1-6, Blk Pieces 7-12\u003c/p\u003e\u003cp\u003epmv [from to promo] vector of both players moves (needed for en passant option). Illegal move creates a [0 0 0] pmv value. Size [2*moves,3]\u003c/p\u003e\u003cp\u003ecastle: 6 pt logical vector to show castling options. 1 if piece is eligible. Positions are [8 40 64 1 33 57] for [WQR WK WKR BQR BK BKR]. . . eg castle mv [40 56 0]\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e mv  [from to pawn_new_type] where from/to are 1-64 and pawn_new is 0 thru 12 if pawn is on final row.\u003c/p\u003e\u003cp\u003eThe Test Suite will oversee two games with the Player as Black(moving second) and then as White.\u003c/p\u003e\u003cp\u003e\u003cb\u003ePassing:\u003c/b\u003e Player must Win both games\u003c/p\u003e\u003cp\u003e\u003cb\u003eEvolution:\u003c/b\u003e Winning player algorithms will be hosted as Chezz_xyz based on their wins over other Chezz algorithms. Champions and the basis will be fully credited in Chezz updates. Champions must be able to play self and Not Cody timeout.\u003c/p\u003e\u003cp\u003eChezz_015: Pawn Serial Attack - Will capture and Promote\u003c/p\u003e\u003cp\u003eLink update 12/27/12\u003c/p\u003e","function_template":"function mv=player_move(b,pmv,castle)\r\n% Author: Richard Z\r\n% Bot name: First Pawn Attack\r\n% Chezz_015\r\n% http://tinyurl.com/matlab-chezz-Cmove015\r\n%\r\n% 0-wht 1-Blk; board 8x8, opponents last move, \r\n% castle vector(8 40 64 1 33 57) 0=has moved, 1=eligible\r\n mv=zeros(1,3); % [from to promo] \r\n % mv =[39 37 0] is e4\r\n % pmv (opponents last move) is used for en passant\r\n % [0 0 0] is invalid move or first move of game\r\n % castle is used to castle yourself or see if opponent may castle\r\n \r\n pieces=1:6;\r\n enemy=7:12;\r\n\r\n pv=find(b==1);\r\n no_move=true;\r\n ptr=0;\r\n \r\n % loop thru pawns types; capture L/R or Move up\r\n \r\n while no_move\r\n  ptr=ptr+1;\r\n  if ptr\u003elength(pv),break;end\r\n  [r c]=ind2sub([8 8],pv(ptr));\r\n  if ismember(r,[1 8]),continue;end % end row for a P\r\n  if c==1\r\n   if ismember(b(pv(ptr)+7),enemy) % capture\r\n    mv=[pv(ptr) pv(ptr)+7 6];\r\n    return;\r\n   end\r\n  end\r\n  if c==8\r\n   if ismember(b(pv(ptr)-9),enemy) % capture\r\n    mv=[pv(ptr) pv(ptr)-9 6];\r\n    return;\r\n   end\r\n  end\r\n  if c\u003c8 \u0026\u0026 c\u003e1\r\n   if ismember(b(pv(ptr)+7),enemy) % capture\r\n    mv=[pv(ptr) pv(ptr)+7 6];\r\n    return;\r\n   end\r\n   if ismember(b(pv(ptr)-9),enemy) % capture\r\n    mv=[pv(ptr) pv(ptr)-9 6];\r\n    return;\r\n   end\r\n  end\r\n  \r\n  % Move fwd\r\n  if b(pv(ptr)-1)==0\r\n   mv=[pv(ptr) pv(ptr)-1 6];\r\n   return;\r\n  end\r\n  \r\n end % while no move\r\n\r\nend % End of Computer Champion Bot","test_suite":"%%\r\n% Load in the routines that play the game and check move validity\r\ntic\r\nurlwrite('http://rmatlabtest.appspot.com/Chezz_Shell.m','Chezz_Shell.m') ;\r\nurlwrite('http://rmatlabtest.appspot.com/ghost_white.m','ghost_white.m') \r\nurlwrite('http://rmatlabtest.appspot.com/computer_move015.m','computer_move.m') \r\nurlwrite('http://rmatlabtest.appspot.com/mov_chk.m','mov_chk.m') \r\nrehash path\r\ntoc\r\n%%\r\n% Play Two Chezz games\r\n% Player must win Twice to Pass\r\nglobal pmvout1 pmvout2\r\ntic\r\n wins=0; % player wins\r\n b=zeros(8);% P 1/7 R 2/8 N 3/9 B 4/10 Q 5/11 K 6/12 \r\n b(2,:)=7;\r\n b(1,:)=[8 9 10 11 12 10 9 8]; % Player 7:12\r\n b(7,:)=1;\r\n b(8,:)=b(1,:)-6; % Computer 1:6\r\n b_orig=b;\r\n \r\n %mv=zeros(1,3); % [from to promo)]  \r\n %computer_wht=0; % 0 Computer plays wht\r\n %computer_wht=1; % 1 Computer plays black\r\n \r\n pmv=zeros(1,3); % [from to promo)] Opponents last move\r\n castle=[1 1 1 1 1 1];\r\n % False move call to satisfy Cody Rqmt of TestSuite match Ref Solution\r\n mv=player_move(b,pmv,castle)\r\n  \r\n for computer_wht=0:1\r\n  pmvout1=pmv; % Store game 1 moves\r\n  \r\n  dbg=0;\r\n  game_over=false;\r\n  b=b_orig;\r\n  no_capture=0;\r\n  b_hist=zeros(102,8,8);\r\n  pmv=zeros(1,3); % [from to promo)] Opponents last move\r\n  castle=[1 1 1 1 1 1]; % History of if ever moved w/b Castles/kings\r\n %  idx 8 40 64  1 33 57\r\n \r\n while ~game_over\r\n  mvP=zeros(1,3); % [from to type/promote)] \r\n  % Shell 0=Blk,1=Wht;Board;move,prev move;\r\n  % function (1 Play Comp, 2 Player, 3 Check mv)\r\n  \r\n  % White move\r\n  if computer_wht==0\r\n   [mvP]=Chezz_Shell(0,b,mvP,pmv,castle,1); % 0 Wht,... 1 Computer\r\n  else\r\n   [mvP]=Chezz_Shell(0,b,mvP,pmv,castle,2); % 0 Wht  2 is player\r\n  end\r\n  \r\n  \r\n  [mv]=Chezz_Shell(0,b,mvP,pmv(end,:),castle,3); % 0 Wht,..., 3 Check\r\n  pmv=[pmv;mv(1:3)];\r\n  capture=false;\r\n  % Board changes only occur in Suite code\r\n  if mv(1)~=0 % Valid move determined by mv_chk\r\n   if mv(4)==0 % Normal moves and promotions\r\n    if b(mv(2))~=0,capture=true;end\r\n     b(mv(2))=b(mv(1)); % potential promotion\r\n     b(mv(1))=0;\r\n     if ismember(b(mv(2)),[1 7])\r\n      if ismember(mv(2),[1:8:57 8:8:64])\r\n       b(mv(2))=mv(3); % Place promoted selection\r\n      end\r\n     end\r\n     \r\n   else % ep or castle by White\r\n    if mv(4)==1 % castle 0-0 or 0-0-0\r\n      b(mv(1))=0;\r\n      b(mv(2))=6;\r\n      if mv(2)==24\r\n        b(8)=0;b(32)=2;  \r\n      else\r\n        b(64)=0;b(48)=2;\r\n      end    \r\n    end % castle\r\n    if mv(4)==2 % ep\r\n      capture=true;\r\n      b(mv(1))=0;\r\n      b(mv(2))=1; % White Pawn\r\n      b(mv(2)+1)=0; % Take pawn that passed\r\n    end % end ep\r\n   end % move implemented\r\n  end % end move\r\n  \r\n  %b % display board after move\r\n  \r\n  if isempty(find(b==12,1))\r\n   % Game over : Black King Captured\r\n   game_over=true; % change to if comp=wht or blk for win\r\n   if computer_wht==1 % Blk Computer King; Player is Wht captured Blk King \r\n    wins=wins+1;\r\n   end\r\n   continue;\r\n  end\r\n  \r\n  castle=castle.*logical([b(8)==2 b(40) b(64)==2 b(1)==8 b(33) b(57)==8]);\r\n  \r\n  if ~capture\r\n   no_capture=no_capture+1;\r\n   if no_capture\u003e100\r\n       fprintf('Draw 100 moves no capture\\n');\r\n       game_over=true;\r\n   end % move is b and w\r\n   b_hist(no_capture,:,:)=b;\r\n  else\r\n   no_capture=1;\r\n   b_hist=b_hist*0;\r\n   b_hist(no_capture,:,:)=b;\r\n  end\r\n   \r\n  % Black Move\r\n  mvP=zeros(1,4); % [from to type/promote specials(castle=1/ep=2)] \r\n if computer_wht==0\r\n   [mvP]=Chezz_Shell(1,b,mvP,pmv,castle,2); % 2 Blk,... 2 is player\r\n  else\r\n   [mvP]=Chezz_Shell(1,b,mvP,pmv,castle,1); % 2 Blk  1 is Computer\r\n end\r\n  \r\n  [mv]=Chezz_Shell(1,b,mvP,pmv(end,:),castle,3); % 2 Blk,..., 3 Check\r\n  \r\n pmv=[pmv;mv(1:3)];\r\n capture=false;\r\n  % Board changes only occur in Suite code\r\n  if mv(1)~=0 % Valid move determined by mv_chk\r\n   if mv(4)==0 % Normal moves and promotions\r\n    if b(mv(2))~=0,capture=true;end\r\n    b(mv(2))=b(mv(1)); % potential promotion\r\n    b(mv(1))=0;\r\n    if ismember(b(mv(2)),[1 7])\r\n     if ismember(mv(2),[1:8:57 8:8:64])\r\n      b(mv(2))=mv(3); % Place promoted selection\r\n     end\r\n    end\r\n   else % ep or castle by Black\r\n    if mv(4)==1 % castle 0-0 or 0-0-0\r\n      b(mv(1))=0;\r\n      b(mv(2))=12;\r\n      if mv(2)==49 % Blk 0-0\r\n        b(57)=0;b(41)=8;  \r\n      else % Blk 0-0-0\r\n        b(1)=0;b(25)=8;\r\n      end    \r\n    end % castle\r\n    if mv(4)==2 % ep by Black\r\n      capture=true;\r\n      b(mv(1))=0;\r\n      b(mv(2))=mv(3);\r\n    % White passed black on prior move\r\n      b(mv(2)-1)=0; \r\n    end % end ep\r\n   end % move implemented\r\n  end % end move\r\n  \r\n%   b\r\n%   figure(1);imagesc(b,[0 12]);axis equal;\r\n  \r\n  if isempty(find(b==6,1))\r\n   % Game over : Blk captured White King\r\n   game_over=true;\r\n   if computer_wht==0 % Wht Computer King; Player is Blk captured Wht King\r\n    wins=wins+1;\r\n   end\r\n   continue\r\n  end\r\n  \r\n  castle=castle.*logical([b(8)==2 b(40) b(64)==2 b(1)==8 b(33) b(57)==8]);\r\n  \r\n  if ~capture\r\n   no_capture=no_capture+1;\r\n   if no_capture\u003e100\r\n       fprintf('Draw 100 moves no capture\\n');\r\n       game_over=true;\r\n   end % move is b and w\r\n   b_hist(no_capture,:,:)=b;\r\n   % Check for 3 position repetition\r\n   for i=1:no_capture-1\r\n    cdelta=0;\r\n    for j=i+1:no_capture\r\n     delta=(b_hist(i,:,:)-b_hist(j,:,:));\r\n     if sum(abs(delta(:)))==0\r\n      cdelta=cdelta+1;\r\n     end\r\n    end\r\n    if cdelta\u003e=7 % repetitions 3 identical setups\r\n     fprintf('Game over due to repetition\\n');\r\n     game_over=true;\r\n    end\r\n   end % rep check loop \r\n  else\r\n   no_capture=1;\r\n   b_hist=b_hist*0;\r\n   b_hist(no_capture,:,:)=b;\r\n  end % ~capture\r\n  \r\n end % While ~game_over\r\n \r\n end % wht_blk\r\n\r\npmvout2=pmv;\r\nwins\r\n \r\n% Player must win Twice to Pass\r\ntoc\r\nassert(isequal(wins,2))\r\n\r\n%%\r\nglobal pmvout1 pmvout2\r\n% Output moves for games\r\n\r\n% Output game 2 moves\r\npmv=pmvout1;\r\n   for i=2:3:size(pmv,1)-3\r\n    fprintf('%2i %2i %2i %2i %2i %2i %2i %2i %2i \\n',pmv(i,1:3),pmv(i+1,1:3),pmv(i+2,1:3));\r\n   end\r\n   fprintf('%2i %2i %2i\\n',pmv(end-2,:));\r\n   fprintf('%2i %2i %2i\\n',pmv(end-1,:));\r\n   fprintf('%2i %2i %2i\\n',pmv(end,:));\r\n \r\n% Output game 2 moves\r\npmv=pmvout2;\r\n for i=2:3:size(pmv,1)-3\r\n  fprintf('%2i %2i %2i %2i %2i %2i %2i %2i %2i \\n',pmv(i,1:3),pmv(i+1,1:3),pmv(i+2,1:3));\r\n  end\r\n% repeat of moves\r\n fprintf('%2i %2i %2i\\n',pmv(end-2,:));\r\n fprintf('%2i %2i %2i\\n',pmv(end-1,:));\r\n fprintf('%2i %2i %2i\\n',pmv(end,:));","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":3,"test_suite_updated_at":"2012-12-27T22:40:04.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2012-05-24T04:58:57.000Z","updated_at":"2012-12-27T22:50:08.000Z","published_at":"2012-05-24T05:15:44.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eChezz:...A simplified Chess game. Two game match with future multiple skill levels via evolutionary upgrades.\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\u003eSimplified the rules to implement rapid move check. Normal Chess moves like \\\"a4\\\", Castling, and En Passant are accepted. Moves are simple vectors [idx_from idx_to promo] where promo is for pawns reaching the 8th rank. Piece names are numeric 1-6 White (P,R,N,B,Q,K) and Black is 7-12. Board empty space is 0.\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\u003eChezz unique rules: 1) To Win must remove opponent's King.. 2) Lose Turn if try an impossible move.. 3) Checks are ignored - allow move into check, castle out of check, castle thru/into check.. 4) Pawn promote to any piece, including opponent and vacuum.. 5) Six position repetition is a Draw..6) 50 moves No captures is a Draw..\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 (b,pmv,castle)\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\u003ePlayer always appears to be White. However, Black may apparently move first.\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\u003eb (8x8) array with empty=0, White Pieces 1-6, Blk Pieces 7-12\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\u003epmv [from to promo] vector of both players moves (needed for en passant option). Illegal move creates a [0 0 0] pmv value. Size [2*moves,3]\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\u003ecastle: 6 pt logical vector to show castling options. 1 if piece is eligible. Positions are [8 40 64 1 33 57] for [WQR WK WKR BQR BK BKR]. . . eg castle mv [40 56 0]\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 mv [from to pawn_new_type] where from/to are 1-64 and pawn_new is 0 thru 12 if pawn is on final row.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe Test Suite will oversee two games with the Player as Black(moving second) and then as White.\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\u003ePassing:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Player must Win both games\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\u003eEvolution:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Winning player algorithms will be hosted as Chezz_xyz based on their wins over other Chezz algorithms. Champions and the basis will be fully credited in Chezz updates. Champions must be able to play self and Not Cody timeout.\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\u003eChezz_015: Pawn Serial Attack - Will capture and Promote\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\u003eLink update 12/27/12\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":726,"title":"Chezz_020 Pawn Attack and Slaying King","description":"Chezz:...A simplified Chess game. Two game match with future multiple skill levels via evolutionary upgrades.\r\n\r\nSimplified the rules to implement rapid move check. Normal Chess moves like \"a4\", Castling, and En Passant are accepted. Moves are simple vectors [idx_from idx_to promo] where promo is for pawns reaching the 8th rank. Piece names are numeric 1-6 White (P,R,N,B,Q,K) and Black is 7-12. Board empty space is 0.\r\n\r\nChezz unique rules: 1) To Win must remove opponent's King.. 2) Lose Turn if try an impossible move.. 3) Checks are ignored - allow move into check, castle out of check, castle thru/into check.. 4) Pawn promote to any piece, including opponent and vacuum.. 5) Six position repetition is a Draw..6) 50 moves No captures is a Draw..\r\n\r\n\r\n*Inputs:* (b,pmv,castle)\r\n\r\nPlayer always appears to be White. However, Black may apparently move first.\r\n\r\nb (8x8) array with empty=0, White Pieces 1-6, Blk Pieces 7-12\r\n\r\npmv [from to promo] vector of both players moves (needed for en passant option). Illegal move creates a [0 0 0] pmv value. Size [2*moves,3]\r\n\r\ncastle: 6 pt logical vector to show castling options. 1 if piece is eligible. Positions are [8 40 64 1 33 57] for [WQR WK WKR BQR BK BKR]. . . eg castle mv [40 56 0]\r\n\r\n\r\n\r\n*Output:* mv  [from to pawn_new_type] where from/to are 1-64 and pawn_new is 0 thru 12 if pawn is on final row.\r\n\r\n\r\n\r\nThe Test Suite will oversee two games with the Player as Black(moving second) and then as White.\r\n\r\n*Passing:* Player must Win both games\r\n\r\n*Evolution:* Winning player algorithms will be hosted as Chezz_xyz based on their wins over other Chezz algorithms. Champions and the basis will be fully credited in Chezz updates. Champions must be able to play self and Not Cody timeout.\r\n\r\nChezz_020: Pawn Attack then Mad King Attack\r\n\r\nLink update 12/27/12","description_html":"\u003cp\u003eChezz:...A simplified Chess game. Two game match with future multiple skill levels via evolutionary upgrades.\u003c/p\u003e\u003cp\u003eSimplified the rules to implement rapid move check. Normal Chess moves like \"a4\", Castling, and En Passant are accepted. Moves are simple vectors [idx_from idx_to promo] where promo is for pawns reaching the 8th rank. Piece names are numeric 1-6 White (P,R,N,B,Q,K) and Black is 7-12. Board empty space is 0.\u003c/p\u003e\u003cp\u003eChezz unique rules: 1) To Win must remove opponent's King.. 2) Lose Turn if try an impossible move.. 3) Checks are ignored - allow move into check, castle out of check, castle thru/into check.. 4) Pawn promote to any piece, including opponent and vacuum.. 5) Six position repetition is a Draw..6) 50 moves No captures is a Draw..\u003c/p\u003e\u003cp\u003e\u003cb\u003eInputs:\u003c/b\u003e (b,pmv,castle)\u003c/p\u003e\u003cp\u003ePlayer always appears to be White. However, Black may apparently move first.\u003c/p\u003e\u003cp\u003eb (8x8) array with empty=0, White Pieces 1-6, Blk Pieces 7-12\u003c/p\u003e\u003cp\u003epmv [from to promo] vector of both players moves (needed for en passant option). Illegal move creates a [0 0 0] pmv value. Size [2*moves,3]\u003c/p\u003e\u003cp\u003ecastle: 6 pt logical vector to show castling options. 1 if piece is eligible. Positions are [8 40 64 1 33 57] for [WQR WK WKR BQR BK BKR]. . . eg castle mv [40 56 0]\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e mv  [from to pawn_new_type] where from/to are 1-64 and pawn_new is 0 thru 12 if pawn is on final row.\u003c/p\u003e\u003cp\u003eThe Test Suite will oversee two games with the Player as Black(moving second) and then as White.\u003c/p\u003e\u003cp\u003e\u003cb\u003ePassing:\u003c/b\u003e Player must Win both games\u003c/p\u003e\u003cp\u003e\u003cb\u003eEvolution:\u003c/b\u003e Winning player algorithms will be hosted as Chezz_xyz based on their wins over other Chezz algorithms. Champions and the basis will be fully credited in Chezz updates. Champions must be able to play self and Not Cody timeout.\u003c/p\u003e\u003cp\u003eChezz_020: Pawn Attack then Mad King Attack\u003c/p\u003e\u003cp\u003eLink update 12/27/12\u003c/p\u003e","function_template":"function mv=player_move(b,pmv,castle)\r\n% Author: Richard Z\r\n% Bot name: First Pawn then King Attack\r\n% Chezz_020\r\n% http://tinyurl.com/matlab-chezz-Cmove020\r\n mv=zeros(1,3); % [from to promo] \r\n% This is your opponent\r\n\r\n pieces=1:6;\r\n enemy=7:12;\r\n \r\n king_mv=[7 8 9 -1 1 -9 -8 -7]; %\r\n king_attack=[-9 -8 -7 -1 1 7 8 9]; %\r\n \r\n pv=find(b==1); % vector of Pawns\r\n no_move=true;\r\n ptr=0;\r\n \r\n % loop thru piece types\r\n \r\n while no_move % Pawn\r\n  ptr=ptr+1;\r\n  if ptr\u003elength(pv),break;end\r\n  [r c]=ind2sub([8 8],pv(ptr));\r\n  if ismember(r,[1 8]),continue;end % end row for a P\r\n  if c==1\r\n   if ismember(b(pv(ptr)+7),enemy) % capture\r\n    mv=[pv(ptr) pv(ptr)+7 6];\r\n    return;\r\n   end\r\n  end\r\n  if c==8\r\n   if ismember(b(pv(ptr)-9),enemy) % capture\r\n    mv=[pv(ptr) pv(ptr)-9 6];\r\n    return;\r\n   end\r\n  end\r\n  if c\u003c8 \u0026\u0026 c\u003e1\r\n   if ismember(b(pv(ptr)+7),enemy) % capture\r\n    mv=[pv(ptr) pv(ptr)+7 6];\r\n    return;\r\n   end\r\n   if ismember(b(pv(ptr)-9),enemy) % capture\r\n    mv=[pv(ptr) pv(ptr)-9 6];\r\n    return;\r\n   end\r\n  end\r\n  \r\n  % Move fwd\r\n  if b(pv(ptr)-1)==0\r\n   mv=[pv(ptr) pv(ptr)-1 6];\r\n   return;\r\n  end\r\n  \r\n end % while no move Pawn\r\n\r\n% No pawn move found; Move on to King\r\n\r\n% No pawn moves left: Attack with King\r\n\r\npv=find(b==6); % Find Kings\r\nno_move=true;\r\nptr=0;\r\n\r\nwhile no_move % King captures\r\n  ptr=ptr+1;\r\n  if ptr\u003elength(pv),break;end\r\n  [r c]=ind2sub([8 8],pv(ptr));\r\n  for i=1:8 % 8 King attacks\r\n   if (pv(ptr)+king_attack(i)\u003e64) || (pv(ptr)+king_attack(i)\u003c1),continue;end\r\n   if r==1 \u0026\u0026 ismember(i,[1 4 6]),continue;end % make ~ismem 1:64\r\n   if r==8 \u0026\u0026 ismember(i,[3 5 8]),continue;end\r\n   if c==1 \u0026\u0026 ismember(i,[1 2 3]),continue;end\r\n   if c==8 \u0026\u0026 ismember(i,[6 7 8]),continue;end\r\n   if ismember(b(pv(ptr)+king_attack(i)),enemy) % capture\r\n    mv=[pv(ptr) pv(ptr)+king_attack(i) 0]; % errant r1 attack idx 1 to idx 8\r\n    return; % Attack found\r\n   end\r\n  end % 8 King attacks\r\nend % while King capture search\r\n\r\n% No King capture move found\r\nmyk=pv(1); % First King\r\nek=find(b==max(enemy),1); %Find an enemy king\r\n[kr1 kc1]=ind2sub([8 8],myk);\r\n[er1 ec1]=ind2sub([8 8],ek);\r\nif er1\u003c=kr1 \u0026\u0026 ec1\u003e=kc1,king_mv=[7 8 -1 9 -9 -8 1 -7];end\r\nif er1\u003e=kr1 \u0026\u0026 ec1\u003e=kc1,king_mv=[9 8  1 -7 7 -8 -1 -9];end\r\nif er1\u003c=kr1 \u0026\u0026 ec1\u003c=kc1,king_mv=[-9 -1 -8 -7 7 8 1 9];end\r\nif er1\u003e=kr1 \u0026\u0026 ec1\u003c=kc1,king_mv=[-7 1 -8 9 -9 8 -1 7];end\r\nfor i=1:8\r\n if kr1==1 \u0026\u0026 ismember(king_mv(i),[-9 -1 7]),continue;end\r\n if kr1==8 \u0026\u0026 ismember(king_mv(i),[-7 1 9]),continue;end\r\n if kc1==1 \u0026\u0026 ismember(king_mv(i),[-9 -8 -7]),continue;end\r\n if kc1==8 \u0026\u0026 ismember(king_mv(i),[7 8 9]),continue;end\r\n if ismember(b(myk+king_mv(i)),0) % empty\r\n  mv=[myk myk+king_mv(i) 0];\r\n  return; % path found\r\n end\r\nend\r\n% Hopefully don't get here as mv=[0 0 0]\r\n\r\nend % End of Computer Champion Bot","test_suite":"%%\r\n% Load in the routines that play the game and check move validity\r\ntic\r\nurlwrite('http://rmatlabtest.appspot.com/Chezz_Shell.m','Chezz_Shell.m') ;\r\nurlwrite('http://rmatlabtest.appspot.com/ghost_white.m','ghost_white.m') \r\nurlwrite('http://rmatlabtest.appspot.com/computer_move020.m','computer_move.m') \r\nurlwrite('http://rmatlabtest.appspot.com/mov_chk.m','mov_chk.m') \r\nrehash path\r\ntoc\r\n%%\r\n% Play Two Chezz games\r\n% Player must win Twice to Pass\r\nglobal pmvout1 pmvout2\r\ntic\r\n wins=0; % player wins\r\n b=zeros(8);% P 1/7 R 2/8 N 3/9 B 4/10 Q 5/11 K 6/12 \r\n b(2,:)=7;\r\n b(1,:)=[8 9 10 11 12 10 9 8]; % Player 7:12\r\n b(7,:)=1;\r\n b(8,:)=b(1,:)-6; % Computer 1:6\r\n b_orig=b;\r\n \r\n %mv=zeros(1,3); % [from to promo)]  \r\n %computer_wht=0; % 0 Computer plays wht\r\n %computer_wht=1; % 1 Computer plays black\r\n \r\n pmv=zeros(1,3); % [from to promo)] Opponents last move\r\n castle=[1 1 1 1 1 1];\r\n % False move call to satisfy Cody Rqmt of TestSuite match Ref Solution\r\n mv=player_move(b,pmv,castle)\r\n  \r\n for computer_wht=0:1\r\n  pmvout1=pmv; % Store game 1 moves\r\n  \r\n  dbg=0;\r\n  game_over=false;\r\n  b=b_orig;\r\n  no_capture=0;\r\n  b_hist=zeros(102,8,8);\r\n  pmv=zeros(1,3); % [from to promo)] Opponents last move\r\n  castle=[1 1 1 1 1 1]; % History of if ever moved w/b Castles/kings\r\n %  idx 8 40 64  1 33 57\r\n \r\n while ~game_over\r\n  mvP=zeros(1,3); % [from to type/promote)] \r\n  % Shell 0=Blk,1=Wht;Board;move,prev move;\r\n  % function (1 Play Comp, 2 Player, 3 Check mv)\r\n  \r\n  % White move\r\n  if computer_wht==0\r\n   [mvP]=Chezz_Shell(0,b,mvP,pmv,castle,1); % 0 Wht,... 1 Computer\r\n  else\r\n   [mvP]=Chezz_Shell(0,b,mvP,pmv,castle,2); % 0 Wht  2 is player\r\n  end\r\n  \r\n  \r\n  [mv]=Chezz_Shell(0,b,mvP,pmv(end,:),castle,3); % 0 Wht,..., 3 Check\r\n  pmv=[pmv;mv(1:3)];\r\n  capture=false;\r\n  % Board changes only occur in Suite code\r\n  if mv(1)~=0 % Valid move determined by mv_chk\r\n   if mv(4)==0 % Normal moves and promotions\r\n    if b(mv(2))~=0,capture=true;end\r\n     b(mv(2))=b(mv(1)); % potential promotion\r\n     b(mv(1))=0;\r\n     if ismember(b(mv(2)),[1 7])\r\n      if ismember(mv(2),[1:8:57 8:8:64])\r\n       b(mv(2))=mv(3); % Place promoted selection\r\n      end\r\n     end\r\n     \r\n   else % ep or castle by White\r\n    if mv(4)==1 % castle 0-0 or 0-0-0\r\n      b(mv(1))=0;\r\n      b(mv(2))=6;\r\n      if mv(2)==24\r\n        b(8)=0;b(32)=2;  \r\n      else\r\n        b(64)=0;b(48)=2;\r\n      end    \r\n    end % castle\r\n    if mv(4)==2 % ep\r\n      capture=true;\r\n      b(mv(1))=0;\r\n      b(mv(2))=1; % White Pawn\r\n      b(mv(2)+1)=0; % Take pawn that passed\r\n    end % end ep\r\n   end % move implemented\r\n  end % end move\r\n  \r\n  %b % display board after move\r\n  \r\n  if isempty(find(b==12,1))\r\n   % Game over : Black King Captured\r\n   game_over=true; % change to if comp=wht or blk for win\r\n   if computer_wht==1 % Blk Computer King; Player is Wht captured Blk King \r\n    wins=wins+1;\r\n   end\r\n   continue;\r\n  end\r\n  \r\n  castle=castle.*logical([b(8)==2 b(40) b(64)==2 b(1)==8 b(33) b(57)==8]);\r\n  \r\n  if ~capture\r\n   no_capture=no_capture+1;\r\n   if no_capture\u003e100\r\n       fprintf('Draw 100 moves no capture\\n');\r\n       game_over=true;\r\n   end % move is b and w\r\n   b_hist(no_capture,:,:)=b;\r\n  else\r\n   no_capture=1;\r\n   b_hist=b_hist*0;\r\n   b_hist(no_capture,:,:)=b;\r\n  end\r\n   \r\n  % Black Move\r\n  mvP=zeros(1,4); % [from to type/promote specials(castle=1/ep=2)] \r\n if computer_wht==0\r\n   [mvP]=Chezz_Shell(1,b,mvP,pmv,castle,2); % 2 Blk,... 2 is player\r\n  else\r\n   [mvP]=Chezz_Shell(1,b,mvP,pmv,castle,1); % 2 Blk  1 is Computer\r\n end\r\n  \r\n  [mv]=Chezz_Shell(1,b,mvP,pmv(end,:),castle,3); % 2 Blk,..., 3 Check\r\n  \r\n pmv=[pmv;mv(1:3)];\r\n capture=false;\r\n  % Board changes only occur in Suite code\r\n  if mv(1)~=0 % Valid move determined by mv_chk\r\n   if mv(4)==0 % Normal moves and promotions\r\n    if b(mv(2))~=0,capture=true;end\r\n    b(mv(2))=b(mv(1)); % potential promotion\r\n    b(mv(1))=0;\r\n    if ismember(b(mv(2)),[1 7])\r\n     if ismember(mv(2),[1:8:57 8:8:64])\r\n      b(mv(2))=mv(3); % Place promoted selection\r\n     end\r\n    end\r\n   else % ep or castle by Black\r\n    if mv(4)==1 % castle 0-0 or 0-0-0\r\n      b(mv(1))=0;\r\n      b(mv(2))=12;\r\n      if mv(2)==49 % Blk 0-0\r\n        b(57)=0;b(41)=8;  \r\n      else % Blk 0-0-0\r\n        b(1)=0;b(25)=8;\r\n      end    \r\n    end % castle\r\n    if mv(4)==2 % ep by Black\r\n      capture=true;\r\n      b(mv(1))=0;\r\n      b(mv(2))=mv(3);\r\n    % White passed black on prior move\r\n      b(mv(2)-1)=0; \r\n    end % end ep\r\n   end % move implemented\r\n  end % end move\r\n  \r\n%   b\r\n%   figure(1);imagesc(b,[0 12]);axis equal;\r\n  \r\n  if isempty(find(b==6,1))\r\n   % Game over : Blk captured White King\r\n   game_over=true;\r\n   if computer_wht==0 % Wht Computer King; Player is Blk captured Wht King\r\n    wins=wins+1;\r\n   end\r\n   continue\r\n  end\r\n  \r\n  castle=castle.*logical([b(8)==2 b(40) b(64)==2 b(1)==8 b(33) b(57)==8]);\r\n  \r\n  if ~capture\r\n   no_capture=no_capture+1;\r\n   if no_capture\u003e100\r\n       fprintf('Draw 100 moves no capture\\n');\r\n       game_over=true;\r\n   end % move is b and w\r\n   b_hist(no_capture,:,:)=b;\r\n   % Check for 3 position repetition\r\n   for i=1:no_capture-1\r\n    cdelta=0;\r\n    for j=i+1:no_capture\r\n     delta=(b_hist(i,:,:)-b_hist(j,:,:));\r\n     if sum(abs(delta(:)))==0\r\n      cdelta=cdelta+1;\r\n     end\r\n    end\r\n    if cdelta\u003e=7 % repetitions 3 identical setups\r\n     fprintf('Game over due to repetition\\n');\r\n     game_over=true;\r\n    end\r\n   end % rep check loop \r\n  else\r\n   no_capture=1;\r\n   b_hist=b_hist*0;\r\n   b_hist(no_capture,:,:)=b;\r\n  end % ~capture\r\n  \r\n end % While ~game_over\r\n \r\n end % wht_blk\r\n\r\npmvout2=pmv;\r\nwins\r\n \r\n% Player must win Twice to Pass\r\ntoc\r\nassert(isequal(wins,2))\r\n\r\n%%\r\nglobal pmvout1 pmvout2\r\n% Output moves for games\r\n\r\n% Output game 2 moves\r\npmv=pmvout1;\r\n   for i=2:3:size(pmv,1)-3\r\n    fprintf('%2i %2i %2i %2i %2i %2i %2i %2i %2i \\n',pmv(i,1:3),pmv(i+1,1:3),pmv(i+2,1:3));\r\n   end\r\n   fprintf('%2i %2i %2i\\n',pmv(end-2,:));\r\n   fprintf('%2i %2i %2i\\n',pmv(end-1,:));\r\n   fprintf('%2i %2i %2i\\n',pmv(end,:));\r\n \r\n% Output game 2 moves\r\npmv=pmvout2;\r\n for i=2:3:size(pmv,1)-3\r\n  fprintf('%2i %2i %2i %2i %2i %2i %2i %2i %2i \\n',pmv(i,1:3),pmv(i+1,1:3),pmv(i+2,1:3));\r\n  end\r\n% repeat of moves\r\n fprintf('%2i %2i %2i\\n',pmv(end-2,:));\r\n fprintf('%2i %2i %2i\\n',pmv(end-1,:));\r\n fprintf('%2i %2i %2i\\n',pmv(end,:));","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":"2012-12-27T22:44:29.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2012-05-28T06:59:32.000Z","updated_at":"2012-12-27T22:44:29.000Z","published_at":"2012-05-28T07:41:09.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eChezz:...A simplified Chess game. Two game match with future multiple skill levels via evolutionary upgrades.\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\u003eSimplified the rules to implement rapid move check. Normal Chess moves like \\\"a4\\\", Castling, and En Passant are accepted. Moves are simple vectors [idx_from idx_to promo] where promo is for pawns reaching the 8th rank. Piece names are numeric 1-6 White (P,R,N,B,Q,K) and Black is 7-12. Board empty space is 0.\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\u003eChezz unique rules: 1) To Win must remove opponent's King.. 2) Lose Turn if try an impossible move.. 3) Checks are ignored - allow move into check, castle out of check, castle thru/into check.. 4) Pawn promote to any piece, including opponent and vacuum.. 5) Six position repetition is a Draw..6) 50 moves No captures is a Draw..\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 (b,pmv,castle)\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\u003ePlayer always appears to be White. However, Black may apparently move first.\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\u003eb (8x8) array with empty=0, White Pieces 1-6, Blk Pieces 7-12\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\u003epmv [from to promo] vector of both players moves (needed for en passant option). Illegal move creates a [0 0 0] pmv value. Size [2*moves,3]\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\u003ecastle: 6 pt logical vector to show castling options. 1 if piece is eligible. Positions are [8 40 64 1 33 57] for [WQR WK WKR BQR BK BKR]. . . eg castle mv [40 56 0]\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 mv [from to pawn_new_type] where from/to are 1-64 and pawn_new is 0 thru 12 if pawn is on final row.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe Test Suite will oversee two games with the Player as Black(moving second) and then as White.\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\u003ePassing:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Player must Win both games\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\u003eEvolution:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Winning player algorithms will be hosted as Chezz_xyz based on their wins over other Chezz algorithms. Champions and the basis will be fully credited in Chezz updates. Champions must be able to play self and Not Cody timeout.\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\u003eChezz_020: Pawn Attack then Mad King Attack\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\u003eLink update 12/27/12\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":727,"title":"Checkerz_000 Kamikazi Kings","description":"Checkerz: A simplified single jump checkers game between a computer bot and a player bot. Multiple jumps are not allowed.\r\n\r\nThe setup requires the player to copy the entire template into his solution.\r\n\r\nThe template includes a Shell routine that call the Player, Computer, and the Jump Check routines for move validation.\r\n\r\nThe player writes his Bot under the player_move routine.\r\n\r\nThe player will always appear to be playing as White.\r\nThe players pieces are 1-Pawn and 2-King.\r\n\r\nThe Computer pieces will appear as 3-Pawn and 4-King.\r\n\r\nThe board is a standard 8x8 with empty squares as 0.\r\n\r\nThe player move is an array index from-to. eg mv=[8 15].  Value range 1 to 64.\r\n\r\nThe routine find_jumps will provide all potential jumps.\r\n\r\nIf a jump(s) may occur then one must be used. eg mv=[8 22] which jumps a piece on 15.\r\n\r\nAn invalid move or a missed jump is a Loss.\r\n\r\n*Input:* Board  8x8 array \r\n\r\n*Output:* Move  [index_from  index_to]\r\n\r\nTo Pass requires Winning Twice. Once as first move and once as second move.\r\n\r\n100 No-capture move series is a Draw\r\n\r\nMoves will be displayed\r\n\r\nCheckerz_000 Kamikazi_Kings: Random Pawn moves and Kings will hunt the enemy.","description_html":"\u003cp\u003eCheckerz: A simplified single jump checkers game between a computer bot and a player bot. Multiple jumps are not allowed.\u003c/p\u003e\u003cp\u003eThe setup requires the player to copy the entire template into his solution.\u003c/p\u003e\u003cp\u003eThe template includes a Shell routine that call the Player, Computer, and the Jump Check routines for move validation.\u003c/p\u003e\u003cp\u003eThe player writes his Bot under the player_move routine.\u003c/p\u003e\u003cp\u003eThe player will always appear to be playing as White.\r\nThe players pieces are 1-Pawn and 2-King.\u003c/p\u003e\u003cp\u003eThe Computer pieces will appear as 3-Pawn and 4-King.\u003c/p\u003e\u003cp\u003eThe board is a standard 8x8 with empty squares as 0.\u003c/p\u003e\u003cp\u003eThe player move is an array index from-to. eg mv=[8 15].  Value range 1 to 64.\u003c/p\u003e\u003cp\u003eThe routine find_jumps will provide all potential jumps.\u003c/p\u003e\u003cp\u003eIf a jump(s) may occur then one must be used. eg mv=[8 22] which jumps a piece on 15.\u003c/p\u003e\u003cp\u003eAn invalid move or a missed jump is a Loss.\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e Board  8x8 array\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e Move  [index_from  index_to]\u003c/p\u003e\u003cp\u003eTo Pass requires Winning Twice. Once as first move and once as second move.\u003c/p\u003e\u003cp\u003e100 No-capture move series is a Draw\u003c/p\u003e\u003cp\u003eMoves will be displayed\u003c/p\u003e\u003cp\u003eCheckerz_000 Kamikazi_Kings: Random Pawn moves and Kings will hunt the enemy.\u003c/p\u003e","function_template":"function mv = Checkerz_Shell(wht_blk,b,mv,ptr)\r\n % Copy this into Players function entry\r\n %figure(1);imagesc(b,[-2 4]);axis equal\r\n %pause(0.1)\r\n \r\n % Remap routine so Engines always think they are White\r\n bv=zeros(8,8); % form of 8x8\r\n bv(1:64)=1:64;\r\n %pmap=(1:4); % [WP WK BP BK]\r\n if wht_blk==1 % Invert Player Perspective\r\n  [b,mv,bv]=ghost_white(b,mv,bv);\r\n end\r\n \r\n % Call Algorithm - White based\r\n % Un-Map to Black if required\r\n \r\n switch ptr\r\n     case {1}\r\n         mv=computer_move(b);\r\n% Self play\r\n% mv=player_move(b);\r\n     case {2}\r\n         mv=player_move(b);\r\n     case {3}\r\n         mv=mov_chk(b,mv);\r\n end % switch ptr\r\n \r\n %Remap mv to Black or leave unchanged if White\r\n if ismember(mv(1),1:64),mv(1)=bv(mv(1));end\r\n if ismember(mv(2),1:64),mv(2)=bv(mv(2));end\r\n \r\nend % Checkerz_Shell\r\n\r\nfunction [b,mv,bv]=ghost_white(b,mv,bv)\r\n% Map Blk to Wht to process \r\n  bv=rot90(rot90(bv)); % Board re-map\r\n  pmap=[3 4 1 2]; % Piece re-map to WP WK BP BK\r\n  \r\n  b=rot90(rot90(b));\r\n  v=find(b\u003e0);\r\n  b(v)=pmap(b(v));\r\n  \r\n  v=find(mv(1:2)\u003e0);\r\n  mv(v)=bv(mv(v));\r\n  \r\nend\r\n\r\nfunction [jv]=find_jumps(b)\r\n jv=[];\r\n P=find(b==1);\r\n K=find(b==2);\r\n \r\n Pjv=ones(64,2);\r\n Pjv = bsxfun(@times, Pjv, [-18 14]); % TL TR\r\n Pjv(1:18,:)=bsxfun(@times,Pjv(1:18,:),[0 1]);\r\n Pjv(2:8:58,:)=bsxfun(@times,Pjv(2:8:58,:),[0 0]);\r\n Pjv(50:64,:)=bsxfun(@times,Pjv(50:64,:),[1 0]);\r\n Pjv([1:2:7 10:2:16 17:2:23],:)=bsxfun(@times,Pjv([1:2:7 10:2:16 17:2:23],:),[0 0]);\r\n Pjv([26:2:32 33:2:39 42:2:48],:)=bsxfun(@times,Pjv([26:2:32 33:2:39 42:2:48],:),[0 0]);\r\n Pjv([49:2:55 58:2:64],:)=bsxfun(@times,Pjv([49:2:55 58:2:64],:),[0 0]);\r\n \r\n Kjv=ones(64,4);\r\n Kjv = bsxfun(@times, Kjv, [14 18 -14 -18]); % TR BR BL TL\r\n Kjv([2 9],:)=bsxfun(@times,Kjv([2 9],:),[0 1 0 0]);\r\n Kjv([4 6 11 13],:)=bsxfun(@times,Kjv([4 6 11 13],:),[1 1 0 0]);\r\n Kjv([8 15],:)=bsxfun(@times,Kjv([8 15],:),[1 0 0 0]);\r\n Kjv([18 25 34 41],:)=bsxfun(@times,Kjv([18 25 34 41],:),[0 1 1 0]);\r\n Kjv([24 31 40 47],:)=bsxfun(@times,Kjv([24 31 40 47],:),[1 0 0 1]);\r\n Kjv([50 57],:)=bsxfun(@times,Kjv([50 57],:),[0 0 1 0]);\r\n Kjv([52 54 59 61],:)=bsxfun(@times,Kjv([52 54 59 61],:),[0 0 1 1]);\r\n Kjv([56 63],:)=bsxfun(@times,Kjv([56 63],:),[0 0 0 1]);\r\n Kjv([1:2:7 10:2:16 17:2:23],:)=bsxfun(@times,Kjv([1:2:7 10:2:16 17:2:23],:),[0 0 0 0]);\r\n Kjv([26:2:32 33:2:39 42:2:48],:)=bsxfun(@times,Kjv([26:2:32 33:2:39 42:2:48],:),[0 0 0 0]);\r\n Kjv([49:2:55 58:2:64],:)=bsxfun(@times,Kjv([49:2:55 58:2:64],:),[0 0 0 0]);\r\n \r\n for i=1:length(P)\r\n  Pi=P(i);\r\n  for j=1:2\r\n   if Pjv(Pi,j)==0,continue;end\r\n   if b(Pi+Pjv(Pi,j))==0 \u0026\u0026 b(Pi+Pjv(Pi,j)/2)\u003e2\r\n    jv=[jv;Pi Pi+Pjv(Pi,j)];\r\n   end\r\n  end\r\n end\r\n \r\n \r\n \r\n for i=1:length(K)\r\n  Ki=K(i);\r\n  for j=1:4\r\n   if Kjv(Ki,j)==0,continue;end\r\n   if b(Ki+Kjv(Ki,j))==0 \u0026\u0026 b(Ki+Kjv(Ki,j)/2)\u003e2\r\n    jv=[jv;Ki K(i)+Kjv(Ki,j)];\r\n   end\r\n  end\r\n end\r\n\r\n \r\nend\r\n\r\n function mv=player_move(b)\r\n % Copy Checkerz_Shell, computer_move, and mov_chk functions into entry  \r\n % Create Player entry inside this function\r\n %\r\n % Author: Your Name\r\n % Bot name:  Your Bot's Nmae\r\n\r\n mv=[0 0]; % [from to] \r\n \r\n% Introduction function to avoid missing jumps\r\n% Player may modify. This is informational jumps only\r\n jv=find_jumps(b);\r\n if ~isempty(jv)\r\n  mv=jv(1,:); % Use the first jump\r\n  return\r\n end\r\n\r\n % End of Player entry\r\n end % End of Player Bot\r\n\r\nfunction mv=computer_move(b)\r\n% Author: Richard Z\r\n% Bot name: Kamikazi : Jump, Pmove, Kattack, Kmove \r\n% Checkerz_000\r\n mv=[0 0]; % [from to] \r\n \r\n jv=find_jumps(b);\r\n if ~isempty(jv)\r\n  mv=jv(1,:); % Use the first jump\r\n  return\r\n end\r\n\r\n % Pawn\r\n pv=find(b==1); % vector of Pawns\r\n %if ~isempty(pv),pv=pv(randperm(length(pv)));end\r\n ptr=0;\r\n while true % Pawn\r\n  pm=[-9 7];\r\n  ptr=ptr+1;\r\n  if ptr\u003elength(pv),break;end\r\n  [r c]=ind2sub([8 8],pv(ptr));\r\n  if c==1, pm=pm.*[0 1];end\r\n  if c==8,pm=pm.*[1 0];end\r\n  \r\n  for i=1:2\r\n   if b(pv(ptr)+pm(i))==0\r\n    mv=[pv(ptr) pv(ptr)+pm(i)];\r\n    return\r\n   end\r\n  end\r\n end % while no move Pawn\r\n \r\n \r\n % No King capture move found\r\nmyk=find(b==2,1); % First King\r\nep=find(b\u003e2,1); %Find an enemy piece, Pawns or Kings\r\n[kr1 kc1]=ind2sub([8 8],myk);\r\n[er1 ec1]=ind2sub([8 8],ep);\r\nif er1\u003c=kr1 \u0026\u0026 ec1\u003e=kc1,king_mv=[7 9 -9 -7];end\r\nif er1\u003e=kr1 \u0026\u0026 ec1\u003e=kc1,king_mv=[9 7 -7 -9];end\r\nif er1\u003c=kr1 \u0026\u0026 ec1\u003c=kc1,king_mv=[-9 7 -7 9];end\r\nif er1\u003e=kr1 \u0026\u0026 ec1\u003c=kc1,king_mv=[-7 9 -9 7];end\r\nfor i=1:4\r\n if kr1==1 \u0026\u0026 ismember(king_mv(i),[-9 7]),continue;end\r\n if kr1==8 \u0026\u0026 ismember(king_mv(i),[-7 9]),continue;end\r\n if kc1==1 \u0026\u0026 ismember(king_mv(i),[-9 -7]),continue;end\r\n if kc1==8 \u0026\u0026 ismember(king_mv(i),[7 9]),continue;end\r\n if b(myk+king_mv(i))==0 % empty square\r\n  mv=[myk myk+king_mv(i)];\r\n  return; % path found\r\n end\r\nend\r\n \r\n% Can I get here if I have a King?\r\n % King\r\n kv=find(b==2); % vector of Kings\r\n %if ~isempty(pv),pv=pv(randperm(length(pv)));end\r\n ptr=0;\r\n while true % King\r\n  km=[7 9 -7 -9];\r\n  ptr=ptr+1;\r\n  if ptr\u003elength(kv),break;end\r\n  [r c]=ind2sub([8 8],kv(ptr));\r\n  if c==1, km=km.*[1 1 0 0];end\r\n  if c==8, km=km.*[0 0 1 1];end\r\n  if r==1, km=km.*[0 1 1 0];end\r\n  if r==8, km=km.*[1 0 0 1];end\r\n  \r\n  \r\n  for i=1:4\r\n   if b(kv(ptr)+km(i))==0\r\n    mv=[kv(ptr) kv(ptr)+km(i)];\r\n    return\r\n   end\r\n  end\r\n end % while no move King\r\n \r\n \r\n% Hopefully don't get here as mv=[0 0] and we lose\r\n\r\nend % End of Computer Bot\r\n\r\nfunction mv_out=mov_chk(b,mv)\r\n % Improvement of mov_chk will be a separate Cody challenge\r\n % Must Copy into Solution Entry\r\n % Invalid move returns [0 0]\r\n mv_out=[0 0]; % default is Invalid\r\n \r\n % verify valid: Entry, Color, Possible capture\r\n if ~ismember(mv(1),1:64) || ~ismember(mv(2),1:64),return;end % Invalid mv\r\n if ~ismember(b(mv(1)),(1:2)),return;end % Moving Wrong team\r\n  % Must move to empty square\r\n if b(mv(2))~=0,return;end\r\n \r\n  \r\n delta=mv(2)-mv(1); % Movement vector\r\n if ~ismember(delta,[7 9 14 18 -7 -9 -14 -18]),return;end % Invalid mv\r\n \r\n msum=mv(1)+mv(2); % Jump midpoint if jump check\r\n \r\n  % use for move checks\r\n [r1 c1]=ind2sub([8 8],mv(1));\r\n [r2 c2]=ind2sub([8 8],mv(2));\r\n \r\n if abs(r1-r2)\u003e2,return;end % Invalid\r\n if abs(c1-c2)\u003e2,return;end % Invalid\r\n   \r\n jv=find_jumps(b);\r\n\r\n if ~isempty(jv)\r\n  if abs(delta)\u003c14,return;end % Jump not executed\r\n end\r\n \r\n \r\n if abs(delta)\u003e13 % Jump claimed\r\n  if b(msum/2)\u003c3,return;end % Invalid Jump -Own or Empty\r\n  \r\n  if b(mv(1))==1 \u0026\u0026 (delta==-18 ||delta==14)\r\n   mv_out=mv; % Valid move\r\n   return;\r\n  end % Legal P Jump\r\n  \r\n  if b(mv(1))==2 \u0026\u0026 (abs(delta)==18 || abs(delta)==14)\r\n   mv_out=mv; % Valid move\r\n   return;\r\n  end % Legal K Jump\r\n  \r\n  return; % Invalid Jump\r\n end % Jump\r\n \r\n % abs(delta)\u003c12 Regular move\r\n if b(mv(1))==1 \u0026\u0026 (delta==-9 ||delta==7)\r\n  mv_out=mv; % Valid move\r\n  return;\r\n end % Legal P mv\r\n \r\n if b(mv(1))==2 \u0026\u0026 (abs(delta)==9 || abs(delta) ==7)\r\n  mv_out=mv; % Valid move\r\n  return;\r\n end % Legal K mv\r\n \r\n mv_out=[0 0]; % Checks failed\r\nend\r\n","test_suite":"%%\r\n%Test Suite\r\ntic\r\n wins=0; % player wins\r\n b=zeros(8);% WP 1 BP 3  [WK 2 BK 4] \r\n b([2 9 11 18 25 27 34 41 43 50 57 59])=3;\r\n b([6 8 15 22 24 31 38 40 47 54 56 63])=1;\r\n b_orig=b;\r\n \r\n %mv=zeros(1,2); % [from to promo)]  \r\n %computer_wht=0; % 0 Computer plays wht\r\n %computer_wht=1; % 1 Computer plays black\r\n \r\n pmv=zeros(1,2); % Move History for record only\r\n  \r\n for computer_wht=0:1\r\n  if size(pmv,1)\u003e3\r\n   for i=1:4:size(pmv,1)-4\r\n    fprintf('%2i %2i %2i %2i %2i %2i %2i %2i\\n',pmv(i,1:2),pmv(i+1,1:2),pmv(i+2,1:2),pmv(i+3,1:2));\r\n   end\r\n   fprintf('%2i %2i\\n',pmv(end-3,:));\r\n   fprintf('%2i %2i\\n',pmv(end-2,:));\r\n   fprintf('%2i %2i\\n',pmv(end-1,:));\r\n   fprintf('%2i %2i\\n',pmv(end,:));\r\n % Output game 1 moves\r\n  end\r\n  %pmv % Output move history from Game 1\r\n  game_over=false;\r\n  b=b_orig; % Reset for second game\r\n  no_capture=0;\r\n  pmv=zeros(1,2); % [from to promo)] Opponents last move\r\n \r\n while ~game_over\r\n  mvP=zeros(1,2); % [from to] \r\n  % Shell 0=Blk,1=Wht;Board;move,prev move;\r\n  % function (1 Play Comp, 2 Player, 3 Check mv)\r\n  \r\n  % White move\r\n  if computer_wht==0\r\n   [mvP]=Checkerz_Shell(0,b,mvP,1); % 0 Wht,... 1 Computer\r\n  else\r\n   [mvP]=Checkerz_Shell(0,b,mvP,2); % 0 Wht  2 is player\r\n  end\r\n  \r\n  [mv]=Checkerz_Shell(0,b,mvP,3); % 0 Wht,..., 3 Check\r\n  \r\n  pmv=[pmv;mv(1:2)];\r\n  capture=false;\r\n  % Board changes only occur in Suite code\r\n  if mv(1)~=0 % Valid move determined by mv_chk \r\n    b(mv(2))=b(mv(1)); % potential promotion\r\n    b(mv(1))=0;\r\n    if ismember(mv(2),[9 25 41 57])\r\n     b(mv(2))=2; % Kinged\r\n    end\r\n    if abs(mv(1)-mv(2))\u003e9\r\n     % Piece jumped\r\n     capture=true;\r\n     b((mv(1)+mv(2))/2)=0;\r\n    end\r\n  end % end move\r\n  \r\n  if isempty(find(b\u003e2)) % White has captured All Blk Pieces\r\n   game_over=true; % change to if comp=wht or blk for win\r\n   if computer_wht==1 % Blk Computer Loses; Player is Wht \r\n    wins=wins+1;\r\n   end\r\n   continue;\r\n  end\r\n  \r\n  if mv(1)==0 % No legal move or missed jump\r\n   % Game over : White failed to move and Loses\r\n   game_over=true; % change to if comp=wht or blk for win\r\n   if computer_wht==0 % Wht Computer Loses; Player is Blk \r\n    wins=wins+1;\r\n   end\r\n   continue;\r\n  end\r\n    \r\n  if ~capture\r\n   no_capture=no_capture+1;\r\n   if no_capture\u003e100\r\n       fprintf('Draw 100 moves no capture\\n');\r\n       game_over=true;\r\n   end %\r\n  else\r\n   no_capture=1;\r\n  end\r\n   \r\n  % Black Move\r\n  mvP=[0 0]; % [from to type/promote specials(castle=1/ep=2)] \r\n if computer_wht==0\r\n   [mvP]=Checkerz_Shell(1,b,mvP,2); % 2 Blk,... 2 is player\r\n  else\r\n   [mvP]=Checkerz_Shell(1,b,mvP,1); % 2 Blk  1 is Computer\r\n end\r\n  \r\n  [mv]=Checkerz_Shell(1,b,mvP,3); % 2 Blk,..., 3 Check\r\n  \r\n pmv=[pmv;mv(1:2)];\r\n \r\n capture=false;\r\n  % Board changes only occur in Suite code\r\n  if mv(1)~=0 % Valid move determined by mv_chk \r\n    b(mv(2))=b(mv(1)); % potential promotion\r\n    b(mv(1))=0;\r\n    if ismember(mv(2),[8 24 40 56])\r\n     b(mv(2))=4; % Kinged\r\n    end\r\n    if abs(mv(1)-mv(2))\u003e9\r\n     % Piece jumped\r\n     capture=true;\r\n     b((mv(1)+mv(2))/2)=0;\r\n    end\r\n  end % end move\r\n  \r\n  if isempty([find(b==1)' find(b==2)']) % Black has captured All Wht Pieces\r\n   game_over=true; % change to if comp=wht or blk for win\r\n   if computer_wht==0 % Wht Computer Loses; Player is Blk \r\n    wins=wins+1;\r\n   end\r\n   continue;\r\n  end\r\n  \r\n  if mv(1)==0 % No legal move or missed jump by Black\r\n   % Game over : Black failed to move correctly and Loses\r\n   game_over=true; % change to if comp=wht or blk for win\r\n   if computer_wht==1 % Blk Computer Loses; Player is Wht \r\n    wins=wins+1;\r\n   end\r\n   continue;\r\n  end\r\n  \r\n  if ~capture\r\n   no_capture=no_capture+1;\r\n   if no_capture\u003e100\r\n       fprintf('Draw 100 moves no capture\\n');\r\n       game_over=true;\r\n   end % move is b and w\r\n  else\r\n   no_capture=1;\r\n  end % ~capture\r\n  \r\n end % While ~game_over\r\n \r\n end % wht_blk\r\n \r\n wins\r\n   if size(pmv,1)\u003e3\r\n    for i=1:4:size(pmv,1)-4\r\n     fprintf('%2i %2i %2i %2i %2i %2i %2i %2i\\n',pmv(i,1:2),pmv(i+1,1:2),pmv(i+2,1:2),pmv(i+3,1:2));\r\n    end\r\n    fprintf('%2i %2i\\n',pmv(end-3,:));\r\n    fprintf('%2i %2i\\n',pmv(end-2,:));\r\n    fprintf('%2i %2i\\n',pmv(end-1,:));\r\n    fprintf('%2i %2i\\n',pmv(end,:));\r\n % Output game 2 moves?\r\n  end\r\n \r\nwins\r\ntoc\r\n\r\n % Player must beat computer twice\r\n %assert(isequal(wins,2))\r\n \r\nPass=1;\r\nassert(isequal(Pass,1))","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":3,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2012-05-30T03:08:30.000Z","updated_at":"2012-05-30T03:20:09.000Z","published_at":"2012-05-30T03:17:56.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eCheckerz: A simplified single jump checkers game between a computer bot and a player bot. Multiple jumps are not allowed.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe setup requires the player to copy the entire template into his solution.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe template includes a Shell routine that call the Player, Computer, and the Jump Check routines for move validation.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe player writes his Bot under the player_move routine.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe player will always appear to be playing as White. The players pieces are 1-Pawn and 2-King.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe Computer pieces will appear as 3-Pawn and 4-King.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe board is a standard 8x8 with empty squares as 0.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe player move is an array index from-to. eg mv=[8 15]. Value range 1 to 64.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe routine find_jumps will provide all potential jumps.\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\u003eIf a jump(s) may occur then one must be used. eg mv=[8 22] which jumps a piece on 15.\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\u003eAn invalid move or a missed jump is a Loss.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Board 8x8 array\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 Move [index_from index_to]\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\u003eTo Pass requires Winning Twice. Once as first move and once as second 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:t\u003e100 No-capture move series is a Draw\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\u003eMoves will be displayed\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\u003eCheckerz_000 Kamikazi_Kings: Random Pawn moves and Kings will hunt the enemy.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":2646,"title":"Determine the number of maximal cliques in an undirected graph","description":"In an undirected graph, a clique is a subset of vertices that are fully connected, i.e. there is an edge between all pairs of vertices in the subset. A _maximal_ clique is one in which the subset of vertices is not part of a larger clique. So, for instance, a fully connected graph has many cliques, but only one maximal clique.\r\n\r\nGiven an NxN adjacency matrix (A) for an undirected graph with N vertices, return the number (num) of maximal cliques.\r\n\r\n*Example*\r\n\r\nConsider the graph shown below,\r\n\r\n\u003c\u003chttps://dl.dropboxusercontent.com/u/13345152/examplegraph.png\u003e\u003e\r\n\r\nwhich has the following adjacency matrix:\r\n\r\n  A = [ 0 1 0 0 0\r\n        1 0 1 1 0\r\n        0 1 0 1 0\r\n        0 1 1 0 1\r\n        0 0 0 1 0 ]\r\n\r\nThe number of maximal cliques is 3. The maximal cliques are {1,2}, {2,3,4}, and {4,5}.\r\n\r\nNOTE: You may assume the data type of the adjacency matrix is double.","description_html":"\u003cp\u003eIn an undirected graph, a clique is a subset of vertices that are fully connected, i.e. there is an edge between all pairs of vertices in the subset. A \u003ci\u003emaximal\u003c/i\u003e clique is one in which the subset of vertices is not part of a larger clique. So, for instance, a fully connected graph has many cliques, but only one maximal clique.\u003c/p\u003e\u003cp\u003eGiven an NxN adjacency matrix (A) for an undirected graph with N vertices, return the number (num) of maximal cliques.\u003c/p\u003e\u003cp\u003e\u003cb\u003eExample\u003c/b\u003e\u003c/p\u003e\u003cp\u003eConsider the graph shown below,\u003c/p\u003e\u003cimg src = \"https://dl.dropboxusercontent.com/u/13345152/examplegraph.png\"\u003e\u003cp\u003ewhich has the following adjacency matrix:\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003eA = [ 0 1 0 0 0\r\n      1 0 1 1 0\r\n      0 1 0 1 0\r\n      0 1 1 0 1\r\n      0 0 0 1 0 ]\r\n\u003c/pre\u003e\u003cp\u003eThe number of maximal cliques is 3. The maximal cliques are {1,2}, {2,3,4}, and {4,5}.\u003c/p\u003e\u003cp\u003eNOTE: You may assume the data type of the adjacency matrix is double.\u003c/p\u003e","function_template":"function num = maximalcliques(A)\r\n  num = 0;\r\nend","test_suite":"%%\r\nA = 0;\r\nassert(isequal(maximalcliques(A),1))\r\n\r\n%%\r\nfor ii=1:10\r\n  N = randi(100);\r\n  A = ones(N)-eye(N);\r\n  assert(isequal(maximalcliques(A),1))\r\nend\r\n\r\n%%\r\nfor ii=1:10\r\n  N = randi(100);\r\n  A = zeros(N);\r\n  assert(isequal(maximalcliques(A),N))\r\nend\r\n\r\n%%\r\nA = [ 0 0 0 0\r\n      0 0 0 1\r\n      0 0 0 0\r\n      0 1 0 0 ];\r\nassert(isequal(maximalcliques(A),3))\r\n\r\n%%\r\nA = [ 0 1 0 0 0\r\n      1 0 1 1 0\r\n      0 1 0 1 0\r\n      0 1 1 0 1\r\n      0 0 0 1 0 ];\r\nassert(isequal(maximalcliques(A),3))\r\n\r\n%%\r\nA = [ 0 1 1 0 0 0\r\n      1 0 1 1 0 0\r\n      1 1 0 0 1 0\r\n      0 1 0 0 1 0\r\n      0 0 1 1 0 1\r\n      0 0 0 0 1 0 ];\r\nassert(isequal(maximalcliques(A),5))\r\n","published":true,"deleted":false,"likes_count":3,"comments_count":0,"created_by":4793,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":6,"test_suite_updated_at":"2014-10-28T21:35:49.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2014-10-28T21:07:46.000Z","updated_at":"2014-10-28T22:05:37.000Z","published_at":"2014-10-28T21:35:49.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/media/image1.png\"}],\"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\u003eIn an undirected graph, a clique is a subset of vertices that are fully connected, i.e. there is an edge between all pairs of vertices in the subset. A\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003emaximal\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e clique is one in which the subset of vertices is not part of a larger clique. So, for instance, a fully connected graph has many cliques, but only one maximal clique.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eGiven an NxN adjacency matrix (A) for an undirected graph with N vertices, return the number (num) of maximal cliques.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eExample\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eConsider the graph shown below,\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\u003ewhich has the following adjacency matrix:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[A = [ 0 1 0 0 0\\n      1 0 1 1 0\\n      0 1 0 1 0\\n      0 1 1 0 1\\n      0 0 0 1 0 ]]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe number of maximal cliques is 3. The maximal cliques are {1,2}, {2,3,4}, and {4,5}.\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\u003eNOTE: You may assume the data type of the adjacency matrix is double.\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.png\",\"contentType\":\"image/png\",\"content\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAADAFBMVEV4eHiTk5P29vaBgYGcnJzAwMC3t7eKiorS0tLt7e3b29vk5OTJycn///9vb28AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD61b95AAAAyklEQVR42q2SSQ6FIAxAWzQxkcj976lEE5R+hojQOmw+Cxa8RwcoGnhf6oNDD0AvGL8j/E2wC+JiXwSaAKbbatGkLjBrX13szynmtPXnKc2eCRiMGQtXxrq2hmZRuuXx6SVdPlPpopeC387sFMMIwdsyAMFAEcHuptW5oIaKYgjHBBoZ512snMeJ8g7o0DmA5jwKXRdqy9W6gfMzhd7iMOySlxq0qn/z4leR43HNQ8WrLtYi1Dz+pnjsmt/8ZsulwLgQOOeC4EyQHH5z1GUZiLNTtwAAAABJRU5ErkJggg==\"}]}"},{"id":2647,"title":"Find the maximal cliques in an undirected graph","description":"This is a variant of a \u003chttp://www.mathworks.com/matlabcentral/cody/problems/2646-determine-the-number-of-maximal-cliques-in-an-undirected-graph previous problem\u003e on maximal cliques. Instead of simply computing the number of maximal cliques in an undirected graph, now you must return the cliques themselves.\r\n\r\nGiven an NxN adjacency matrix (A) for an undirected graph with N vertices, return an array (C) in which each column encodes one of the maximal cliques in the graph. If C(i,j) = 1, then the ith vertex in the graph is included in the jth clique. The order of columns does not matter, but all maximal cliques must be given - that is, size(C,2) should equal the number of maximal cliques.\r\n\r\n*Example*\r\n\r\nConsider the graph shown below,\r\n\r\n\u003c\u003chttps://dl.dropboxusercontent.com/u/13345152/examplegraph.png\u003e\u003e\r\n\r\nwhich has the following adjacency matrix:\r\n\r\n  A = [ 0 1 0 0 0\r\n        1 0 1 1 0\r\n        0 1 0 1 0\r\n        0 1 1 0 1\r\n        0 0 0 1 0 ]\r\n\r\nThe maximal cliques are {1,2}, {2,3,4}, and {4,5}. Therefore, one (of three) valid outputs is:\r\n\r\n  C = [ 1 0 0\r\n        1 1 0\r\n        0 1 0\r\n        0 1 1\r\n        0 0 1 ]\r\n\r\nNOTE: You may assume the data type of the adjacency matrix (A) is double.","description_html":"\u003cp\u003eThis is a variant of a \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/problems/2646-determine-the-number-of-maximal-cliques-in-an-undirected-graph\"\u003eprevious problem\u003c/a\u003e on maximal cliques. Instead of simply computing the number of maximal cliques in an undirected graph, now you must return the cliques themselves.\u003c/p\u003e\u003cp\u003eGiven an NxN adjacency matrix (A) for an undirected graph with N vertices, return an array (C) in which each column encodes one of the maximal cliques in the graph. If C(i,j) = 1, then the ith vertex in the graph is included in the jth clique. The order of columns does not matter, but all maximal cliques must be given - that is, size(C,2) should equal the number of maximal cliques.\u003c/p\u003e\u003cp\u003e\u003cb\u003eExample\u003c/b\u003e\u003c/p\u003e\u003cp\u003eConsider the graph shown below,\u003c/p\u003e\u003cimg src = \"https://dl.dropboxusercontent.com/u/13345152/examplegraph.png\"\u003e\u003cp\u003ewhich has the following adjacency matrix:\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003eA = [ 0 1 0 0 0\r\n      1 0 1 1 0\r\n      0 1 0 1 0\r\n      0 1 1 0 1\r\n      0 0 0 1 0 ]\r\n\u003c/pre\u003e\u003cp\u003eThe maximal cliques are {1,2}, {2,3,4}, and {4,5}. Therefore, one (of three) valid outputs is:\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003eC = [ 1 0 0\r\n      1 1 0\r\n      0 1 0\r\n      0 1 1\r\n      0 0 1 ]\r\n\u003c/pre\u003e\u003cp\u003eNOTE: You may assume the data type of the adjacency matrix (A) is double.\u003c/p\u003e","function_template":"function C = maximalcliques(A)\r\n  C = [];\r\nend","test_suite":"%%\r\nA = 0;\r\nassert(isequal(maximalcliques(A),1))\r\n\r\n%%\r\nfor ii=1:10\r\n  N = randi(100);\r\n  A = ones(N)-eye(N);\r\n  assert(isequal(maximalcliques(A),ones(N,1)))\r\nend\r\n\r\n%%\r\nfor ii=1:10\r\n  N = randi(100);\r\n  A = zeros(N);\r\n  C = maximalcliques(A);\r\n  assert(isequal(fliplr(sortrows(C')'),eye(N)))\r\nend\r\n\r\n%%\r\nA = [ 0 0 0 0\r\n      0 0 0 1\r\n      0 0 0 0\r\n      0 1 0 0 ];\r\nC = maximalcliques(A);\r\nC = fliplr(sortrows(C')');\r\nC_correct = [ 1 0 0\r\n              0 1 0\r\n              0 0 1\r\n              0 1 0 ];\r\nassert(isequal(C,C_correct))\r\n\r\n%%\r\nA = [ 0 1 0 0 0\r\n      1 0 1 1 0\r\n      0 1 0 1 0\r\n      0 1 1 0 1\r\n      0 0 0 1 0 ];\r\nC = maximalcliques(A);\r\nC = fliplr(sortrows(C')');\r\nC_correct = [ 1 0 0\r\n              1 1 0\r\n              0 1 0\r\n              0 1 1\r\n              0 0 1 ];\r\nassert(isequal(C,C_correct))\r\n\r\n%%\r\nA = [ 0 1 1 0 0 0\r\n      1 0 1 1 0 0\r\n      1 1 0 0 1 0\r\n      0 1 0 0 1 0\r\n      0 0 1 1 0 1\r\n      0 0 0 0 1 0 ];\r\nC = maximalcliques(A);\r\nC = fliplr(sortrows(C')');\r\nC_correct = [ 1 0 0 0 0\r\n              1 1 0 0 0\r\n              1 0 1 0 0\r\n              0 1 0 1 0\r\n              0 0 1 1 1\r\n              0 0 0 0 1 ];\r\nassert(isequal(C,C_correct))\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":1,"created_by":4793,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":5,"test_suite_updated_at":"2014-10-28T22:05:02.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2014-10-28T21:53:54.000Z","updated_at":"2014-10-28T22:05:02.000Z","published_at":"2014-10-28T22:05:02.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.png\"}],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis is a variant of a\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/problems/2646-determine-the-number-of-maximal-cliques-in-an-undirected-graph\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eprevious problem\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e on maximal cliques. Instead of simply computing the number of maximal cliques in an undirected graph, now you must return the cliques themselves.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eGiven an NxN adjacency matrix (A) for an undirected graph with N vertices, return an array (C) in which each column encodes one of the maximal cliques in the graph. If C(i,j) = 1, then the ith vertex in the graph is included in the jth clique. The order of columns does not matter, but all maximal cliques must be given - that is, size(C,2) should equal the number of maximal cliques.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eExample\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eConsider the graph shown below,\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\u003ewhich has the following adjacency matrix:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[A = [ 0 1 0 0 0\\n      1 0 1 1 0\\n      0 1 0 1 0\\n      0 1 1 0 1\\n      0 0 0 1 0 ]]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe maximal cliques are {1,2}, {2,3,4}, and {4,5}. Therefore, one (of three) valid outputs is:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[C = [ 1 0 0\\n      1 1 0\\n      0 1 0\\n      0 1 1\\n      0 0 1 ]]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eNOTE: You may assume the data type of the adjacency matrix (A) is double.\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.png\",\"contentType\":\"image/png\",\"content\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAADAFBMVEV4eHiTk5P29vaBgYGcnJzAwMC3t7eKiorS0tLt7e3b29vk5OTJycn///9vb28AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD61b95AAAAyklEQVR42q2SSQ6FIAxAWzQxkcj976lEE5R+hojQOmw+Cxa8RwcoGnhf6oNDD0AvGL8j/E2wC+JiXwSaAKbbatGkLjBrX13szynmtPXnKc2eCRiMGQtXxrq2hmZRuuXx6SVdPlPpopeC387sFMMIwdsyAMFAEcHuptW5oIaKYgjHBBoZ512snMeJ8g7o0DmA5jwKXRdqy9W6gfMzhd7iMOySlxq0qn/z4leR43HNQ8WrLtYi1Dz+pnjsmt/8ZsulwLgQOOeC4EyQHH5z1GUZiLNTtwAAAABJRU5ErkJggg==\"}]}"},{"id":2697,"title":"Probability of winning single-elimination tournament","description":"Find the probability that the p^{th} player will win a single-elimination tournament with 2^n players where M(i,j)=probability that player i will beat player j in a head-to-head matchup.  In the first round player 1 plays player 2, player 3 plays player 4 and so on.  (In each round each surviving competitor plays his surviving \"next door neighbor\" in the bracket.)\r\n\r\nSee also problem \u003c2254\u003e.\r\n\r\nTrivial example :\r\n\r\nif \r\n\r\n   \r\n\r\n  M = [ NaN 0.7 ; 0.3 NaN ]\r\n\r\nthen \r\n\r\n  winprob(M,1)=0.7 \r\n\r\nand \r\n\r\n  winprob(M,2)=0.3","description_html":"\u003cp\u003eFind the probability that the p^{th} player will win a single-elimination tournament with 2^n players where M(i,j)=probability that player i will beat player j in a head-to-head matchup.  In the first round player 1 plays player 2, player 3 plays player 4 and so on.  (In each round each surviving competitor plays his surviving \"next door neighbor\" in the bracket.)\u003c/p\u003e\u003cp\u003eSee also problem \u003ca href = \"2254\"\u003e2254\u003c/a\u003e.\u003c/p\u003e\u003cp\u003eTrivial example :\u003c/p\u003e\u003cp\u003eif\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003eM = [ NaN 0.7 ; 0.3 NaN ]\r\n\u003c/pre\u003e\u003cp\u003ethen\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003ewinprob(M,1)=0.7 \r\n\u003c/pre\u003e\u003cp\u003eand\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003ewinprob(M,2)=0.3\r\n\u003c/pre\u003e","function_template":"function prob = winprob(M,p)\r\n  prob = 1;\r\nend","test_suite":"1\r\n%%\r\nM = [ NaN 1 ; 0 NaN ];\r\nassert(isequal(winprob(M,1),1));\r\nassert(isequal(winprob(M,2),0));\r\n\r\n2\r\n%%\r\nM = [ NaN 0.7 ; 0.3 NaN ];\r\nassert(isequal(winprob(M,1),0.7));\r\nassert(isequal(winprob(M,2),0.3));\r\n\r\n3\r\n%%\r\nM = zeros(8)+NaN;\r\nfor i=1:7\r\n    for j=i+1:8\r\n        r=rand();\r\n        M(i,j)=r;\r\n        M(j,i)=1-r;\r\n    end\r\nend\r\n\r\nepsilon=1e-8;\r\ntotprob=0;\r\nfor i=1:8\r\n    totprob=totprob+winprob(M,i);\r\nend\r\nassert(abs(totprob-1)\u003cepsilon);\r\n","published":true,"deleted":false,"likes_count":1,"comments_count":2,"created_by":4567,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":6,"test_suite_updated_at":"2014-12-02T02:09:00.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2014-11-30T16:23:41.000Z","updated_at":"2014-12-02T02:09:00.000Z","published_at":"2014-11-30T16:23:41.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eFind the probability that the p^{th} player will win a single-elimination tournament with 2^n players where M(i,j)=probability that player i will beat player j in a head-to-head matchup. In the first round player 1 plays player 2, player 3 plays player 4 and so on. (In each round each surviving competitor plays his surviving \\\"next door neighbor\\\" in the bracket.)\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\u003eSee also problem\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=\\\"2254\\\"\u003e\u003cw:r\u003e\u003cw:t\u003e2254\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eTrivial example :\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\u003eif\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[M = [ NaN 0.7 ; 0.3 NaN ]]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003ethen\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[winprob(M,1)=0.7]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eand\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[winprob(M,2)=0.3]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":2737,"title":"Prouhet–Tarry–Escott (basic)","description":"Inspired by \u003chttp://www.mathworks.com/matlabcentral/cody/problems/660-find-a-subset-that-divides-the-vector-into-equal-halves problem 660.\u003e\r\n\r\nGiven n return two disjoint sets of integers _A_ and _B_ with same cardinality having following property:\r\n\r\n\u003c\u003chttps://i.imgur.com/gSW7nWy.png\u003e\u003e\r\n\r\nfor i = 1:n\r\n\r\nTry to minimize sets cardinality. ","description_html":"\u003cp\u003eInspired by \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/problems/660-find-a-subset-that-divides-the-vector-into-equal-halves\"\u003eproblem 660.\u003c/a\u003e\u003c/p\u003e\u003cp\u003eGiven n return two disjoint sets of integers \u003ci\u003eA\u003c/i\u003e and \u003ci\u003eB\u003c/i\u003e with same cardinality having following property:\u003c/p\u003e\u003cimg src = \"https://i.imgur.com/gSW7nWy.png\"\u003e\u003cp\u003efor i = 1:n\u003c/p\u003e\u003cp\u003eTry to minimize sets cardinality.\u003c/p\u003e","function_template":"function [A, B] = prouhet(n)\r\n  A = 1:n;\r\n  B = -A;\r\nend","test_suite":"%%\r\nn = 1;\r\n[A, B] = prouhet(n);\r\nassert(isequal(A, round(A)) \u0026\u0026 isequal(B, round(B)))\r\nassert(isempty(intersect(A, B)));\r\nassert(isequal(numel(A), numel(B), numel(unique(A)), numel(unique(B))));\r\nassert(isequal(sum(A(:).^(1:n),1), sum(B(:).^(1:n),1)));\r\ndisp(sprintf('Each set has %i elements.', numel(A)))\r\n%%\r\nn = 2;\r\n[A, B] = prouhet(n);\r\nassert(isequal(A, round(A)) \u0026\u0026 isequal(B, round(B)))\r\nassert(isempty(intersect(A, B)));\r\nassert(isequal(numel(A), numel(B), numel(unique(A)), numel(unique(B))));\r\nassert(isequal(sum(A(:).^(1:n),1), sum(B(:).^(1:n),1)));\r\ndisp(sprintf('Each set has %i elements.', numel(A)))\r\n%%\r\nn = 5;\r\n[A, B] = prouhet(n);\r\nassert(isequal(A, round(A)) \u0026\u0026 isequal(B, round(B)))\r\nassert(isempty(intersect(A, B)));\r\nassert(isequal(numel(A), numel(B), numel(unique(A)), numel(unique(B))));\r\nassert(isequal(sum(A(:).^(1:n),1), sum(B(:).^(1:n),1)));\r\ndisp(sprintf('Each set has %i elements.', numel(A)))\r\n%%\r\nn = 7;\r\n[A, B] = prouhet(n);\r\nassert(isequal(A, round(A)) \u0026\u0026 isequal(B, round(B)))\r\nassert(isempty(intersect(A, B)));\r\nassert(isequal(numel(A), numel(B), numel(unique(A)), numel(unique(B))));\r\nassert(isequal(sum(A(:).^(1:n),1), sum(B(:).^(1:n),1)));\r\ndisp(sprintf('Each set has %i elements.', numel(A)))\r\n%%\r\n%n = 9;\r\n%[A, B] = prouhet(n);\r\n%assert(isequal(A, round(A)) \u0026\u0026 isequal(B, round(B)))\r\n%assert(isempty(intersect(A, B)));\r\n%assert(isequal(numel(A), numel(B), numel(unique(A)), numel(unique(B))));\r\n%assert(isequal(sum(uint64(A(:)).^uint64(1:n)), sum(uint64(A(:)).^uint64(1:n))));\r\n%disp(sprintf('Each set has %i elements.', numel(A)))\r\n%if numel(A) \u003c=20\r\n%    disp('A:')\r\n%    disp(A)\r\n%    disp('B:')\r\n%    disp(B)\r\n%end\r\n%%\r\n% test info\r\n%\r\n% larger n will be added later\r\n%\r\n% scoring function will be added later as well\r\n% scoring will be entirely based on size of output: smaller output == better score\r\n% something like this:\r\n%\r\n% score = 0;\r\n% for n = 1:25\r\n%   [A, B] = prouhet(n)\r\n%   assert(...);\r\n%   score = score + numel(A);\r\n% end\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":2,"created_by":14358,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":7,"test_suite_updated_at":"2016-10-08T00:11:00.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2014-12-08T09:56:20.000Z","updated_at":"2020-07-22T23:41:27.000Z","published_at":"2016-10-07T08:07:12.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\u003eInspired by\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/problems/660-find-a-subset-that-divides-the-vector-into-equal-halves\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eproblem 660.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eGiven n return two disjoint sets of integers\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eA\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e and\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eB\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e with same cardinality having following property:\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\u003efor i = 1:n\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\u003eTry to minimize sets cardinality.\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/wAALCAAiAFYBAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/AOyutU1rQfiN/ZWu63eDRdXOdKuo1iURS55gc7Pf5T9OuTjsp9CvJYisfiPVoWPR0EBI/OIipdAt9Vs9Pa11e8F9PFKwS72KhmjPKllXgEZ2nHXbnvVjV9RXSdIur90kZYIy5Eabm/AZGfpkVbTPlruIZsDJAwCafWX4htNSvtBu7fR9QNhqLJm3uNisFccgEMCMHoeOhrkfAerXfifS5odQ1bUrXXNOk+z6jafuhskH8QGz7rYyPxHOM1tajoevRtHd6X4lvmkhdXazuY4WiuFByUJCBlJGRuzx6Vsahq0Gm3FhDMkpa+uBbxFFBAfaW554GFY/gaLPURd6nfWyhwtrsRgyY+Ygk4OeeCvGBjryCMZPjzSdK1vwld2Oqh/LkwIDEuZRP/AYx3bPbvk54zWh4attVtPDWnW+t3KXOpxwqtxKg4Zv6nGMnucnjNS69PfWvh7UrjTIfOv47aR7aPGd8gUlRjvzjiuZ0OCW58QXlndrqlzp/wBhgVXvFlEcswZmkk+fG058sAKBjaSABXYyIVtXSAbWCFYwuFwccY4IH5Vg+Rr/APeuf/AqH/4zXRLnaM9cVw2qaAZfihpusaHcfZ76OPZrAC5jltyPkDf9NCQNvsMngAHu647xfbzTa1pUxtrya3tbe6mjFrvDNclUSNdycrlXl5JA65OK2/D+nS2GlWxvdkmqPbwi+uFHM0qoFLE9+lYN4ni7/hI5b5ND0y8ghJSxEmptF5SkYZyvlMN7c854HA6sWln1Px60ZFv4a0WN+xk1Z3A/AQj+dafha31iHSTLr1xBLqlxM8k4tyTFHztVEzzgKo/HJrcoorP1qa/g0e6l0xLZr1UPk/apCkQb1YgHgdffpx1rmNMbxjplp5MXhnS5WYmSWZ9aYvM56ux8jkn8gMAYAAqC/uvHepXMGnvBomk2s0ircyR37S3AiJ+YR/IoDEZAPbPHrXfUVycd/wCIZr26Q28yIEl2r5QCribam1iOW8td3cEuMDAIq8Lu5h011trec3Usgji3+e4Un+Ji65Cjr0xxUPgyCez0a4tLiCWFor66ZRIG+ZXmZwQzAFh8/XFdJRRWR4mtZr7w5e2UKs32lBDJtGWEbMFcgdyELED2rNt/7YJibUWlAIYxqiyZAMj7Q/lYG4J5YORjIOO9ZetaZd6xq2rhbKdhcfZrFVeHakkCsWlbeeV/1jjIO75AQDxXe0UUUUUUUUUUUV//2Q==\"}]}"},{"id":1688,"title":"Prime Sequences: AP-k Minimum Final Value","description":"Welcome to Fun with Primes. Today we will find the Minimum Final Value AP-k sequences for n_max=3:12 given the primorial and knowledge that the solution is of the form a + b * k# * n.\r\n\r\nThe AP-k of n sequence is n_max+1 primes of the form a + b * k# * n where n=0:n_max. The value of \"a\" is a prime and k# is the primorial.\r\n\r\nThe primorial k# is the product of all primes ≤ k, e.g. 10# = 2 · 3 · 5 · 7.\r\n\r\n*Input:* (k, n_max) \r\n\r\n*Output:* [a, b] for the equation Prime = a + b * k# * n,  n=0:n_max; Prime(n_max) must be the optimum minimum.\r\n\r\n*Value Range Limits:* [a\u003c150,000 , b\u003c8 ]\r\n\r\n*Example:* \r\n\r\n(13, 13) yields [31385539,14 ]; 31385539 + 14·13#·n (End Prime 36850999) \r\n\r\n*Commentary:*\r\n\r\n(13, 16) has a non-minimal end [17, 11387819007325752 ] to give Primes=17 + 11387819007325752·13#·n\r\n\r\nThe current June 2013 record for n is 25 via PrimeGrid:  43142746595714191 + 23681770·23#·n\r\n\r\n\r\n\r\n","description_html":"\u003cp\u003eWelcome to Fun with Primes. Today we will find the Minimum Final Value AP-k sequences for n_max=3:12 given the primorial and knowledge that the solution is of the form a + b * k# * n.\u003c/p\u003e\u003cp\u003eThe AP-k of n sequence is n_max+1 primes of the form a + b * k# * n where n=0:n_max. The value of \"a\" is a prime and k# is the primorial.\u003c/p\u003e\u003cp\u003eThe primorial k# is the product of all primes ≤ k, e.g. 10# = 2 · 3 · 5 · 7.\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e (k, n_max)\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e [a, b] for the equation Prime = a + b * k# * n,  n=0:n_max; Prime(n_max) must be the optimum minimum.\u003c/p\u003e\u003cp\u003e\u003cb\u003eValue Range Limits:\u003c/b\u003e [a\u0026lt;150,000 , b\u0026lt;8 ]\u003c/p\u003e\u003cp\u003e\u003cb\u003eExample:\u003c/b\u003e\u003c/p\u003e\u003cp\u003e(13, 13) yields [31385539,14 ]; 31385539 + 14·13#·n (End Prime 36850999)\u003c/p\u003e\u003cp\u003e\u003cb\u003eCommentary:\u003c/b\u003e\u003c/p\u003e\u003cp\u003e(13, 16) has a non-minimal end [17, 11387819007325752 ] to give Primes=17 + 11387819007325752·13#·n\u003c/p\u003e\u003cp\u003eThe current June 2013 record for n is 25 via PrimeGrid:  43142746595714191 + 23681770·23#·n\u003c/p\u003e","function_template":"function [a,b]=APk_min_end(k,n)\r\n% a+b*k#*(0:n) are all primes\r\n a=0;\r\n b=0;\r\nend\r\n","test_suite":"tic\r\nn=3; p=3;\r\n[a,b]=APk_min_end(p,n);\r\ntoc\r\nassert(isequal(a+b*prod(primes(p))*n,23))\r\n%%\r\nn=4; p=3;\r\n[a,b]=APk_min_end(p,n);\r\ntoc\r\nassert(isequal(a+b*prod(primes(p))*n,29))\r\n%%\r\nn=5; p=5;\r\n[a,b]=APk_min_end(p,n);\r\ntoc\r\nassert(isequal(a+b*prod(primes(p))*n,157))\r\n%%\r\nn=6; k=5;\r\n[a,b]=APk_min_end(k,n);\r\ntoc\r\nassert(isequal(a+b*prod(primes(k))*n,907))\r\n%%\r\nn=7; k=7;\r\n[a,b]=APk_min_end(k,n);\r\ntoc\r\nassert(isequal(a+b*prod(primes(k))*n,1669))\r\n%%\r\nn=8; k=7;\r\n[a,b]=APk_min_end(k,n);\r\ntoc\r\nassert(isequal(a+b*prod(primes(k))*n,1879))\r\n%%\r\nn=9; k=7;\r\n[a,b]=APk_min_end(k,n);\r\ntoc\r\nassert(isequal(a+b*prod(primes(k))*n,2089))\r\n%%\r\nn=10; k=11;\r\n[a,b]=APk_min_end(k,n);\r\ntoc\r\nassert(isequal(a+b*prod(primes(k))*n,249037))\r\n%%\r\nn=11; k=11;\r\n[a,b]=APk_min_end(k,n);\r\ntoc\r\nassert(isequal(a+b*prod(primes(k))*n,262897))\r\n%%\r\nn=12; k=13;\r\n[a,b]=APk_min_end(k,n);\r\ntoc\r\nassert(isequal(a+b*prod(primes(k))*n,725663))","published":true,"deleted":false,"likes_count":0,"comments_count":1,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":4,"test_suite_updated_at":"2013-06-30T03:36:26.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2013-06-30T03:04:32.000Z","updated_at":"2013-06-30T04:28:44.000Z","published_at":"2013-06-30T03:36:26.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eWelcome to Fun with Primes. Today we will find the Minimum Final Value AP-k sequences for n_max=3:12 given the primorial and knowledge that the solution is of the form a + b * k# * n.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe AP-k of n sequence is n_max+1 primes of the form a + b * k# * n where n=0:n_max. The value of \\\"a\\\" is a prime and k# is the primorial.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe primorial k# is the product of all primes ≤ k, e.g. 10# = 2 · 3 · 5 · 7.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e (k, n_max)\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 [a, b] for the equation Prime = a + b * k# * n, n=0:n_max; Prime(n_max) must be the optimum minimum.\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\u003eValue Range Limits:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e [a\u0026lt;150,000 , b\u0026lt;8 ]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eExample:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e(13, 13) yields [31385539,14 ]; 31385539 + 14·13#·n (End Prime 36850999)\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\u003eCommentary:\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\u003e(13, 16) has a non-minimal end [17, 11387819007325752 ] to give Primes=17 + 11387819007325752·13#·n\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe current June 2013 record for n is 25 via PrimeGrid: 43142746595714191 + 23681770·23#·n\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":1631,"title":"Criss-Cross: NHL - Optimize Matrix Size","description":"Given the List of NHL Teams, fit all in a minimum area Criss-Cross with no invalid words, no duplications, and all connected.\r\n\r\n*Input:* Dictionary (cell array)\r\n\r\n*Output:* Array of Char  (spaces indicated by char(96))\r\n\r\n*Score:* Numer of Elements in Array (including unused)\r\n\r\nExample: \r\n\r\ndict={'abc' 'cat'}\r\n\r\nOutput: \r\n['abc';'``a';'``t']\r\n\r\n  abc\r\n  ``a\r\n  ``t\r\n\r\nScore: 9\r\n\r\nRelated Challenges:\r\n\r\n1) \u003chttp://www.mathworks.com/matlabcentral/cody/problems/1533-criss-cross-verification-nhl Verify Criss-Cross\u003e\r\n\r\n2) Create Criss-Cross dictionary from a matrix\r\n\r\n3) Games Magazine Contest 8/31/2013","description_html":"\u003cp\u003eGiven the List of NHL Teams, fit all in a minimum area Criss-Cross with no invalid words, no duplications, and all connected.\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e Dictionary (cell array)\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e Array of Char  (spaces indicated by char(96))\u003c/p\u003e\u003cp\u003e\u003cb\u003eScore:\u003c/b\u003e Numer of Elements in Array (including unused)\u003c/p\u003e\u003cp\u003eExample:\u003c/p\u003e\u003cp\u003edict={'abc' 'cat'}\u003c/p\u003e\u003cp\u003eOutput: \r\n['abc';'``a';'``t']\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003eabc\r\n``a\r\n``t\r\n\u003c/pre\u003e\u003cp\u003eScore: 9\u003c/p\u003e\u003cp\u003eRelated Challenges:\u003c/p\u003e\u003cp\u003e1) \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/problems/1533-criss-cross-verification-nhl\"\u003eVerify Criss-Cross\u003c/a\u003e\u003c/p\u003e\u003cp\u003e2) Create Criss-Cross dictionary from a matrix\u003c/p\u003e\u003cp\u003e3) Games Magazine Contest 8/31/2013\u003c/p\u003e","function_template":"function H=criss_cross(dict)\r\n H=[''];\r\nend","test_suite":"%%\r\nfeval(@assignin,'caller','score',625);\r\n%%\r\ndict={'avalanche'\r\n'bluejackets'\r\n'blackhawks'\r\n'blues'\r\n'bruins'\r\n'canadiens'\r\n'canucks'\r\n'capitals'\r\n'coyotes'\r\n'devils'\r\n'ducks'\r\n'flames'\r\n'flyers'\r\n'hurricanes'\r\n'islanders'\r\n'jets'\r\n'kings'\r\n'lightning'\r\n'mapleleafs'\r\n'oilers'\r\n'panthers'\r\n'penguins'\r\n'predators'\r\n'rangers'\r\n'redwings'\r\n'sabres'\r\n'senators'\r\n'sharks'\r\n'stars'\r\n'wild'};\r\n\r\nt1 = cputime;\r\nH=criss_cross(dict)\r\nfprintf('Elapsed Time %.2f\\n',cputime-t1)\r\nfprintf('size of H %i %i\\n',size(H));\r\nscore=prod(size(H)); % if valid\r\n\r\n% Perform Validation : words\r\n a=H;\r\n% Ned's\r\n    gridWords = {};\r\n    for i = 1:2\r\n        a = a';\r\n        for j = 1:size(a,1)\r\n            tk = regexp(a(j,:),'(\\w\\w+)','tokens');\r\n            gridWords = [gridWords tk];\r\n        end\r\n    end\r\n    dictFound = cell(length(gridWords),1);\r\n    for i = 1:length(gridWords)\r\n        dictFound{i} = gridWords{i}{1};\r\n    end\r\n    dictFound = sort(dictFound);\r\n    dictGiven = sort(dict);\r\nassert(isequal(dictGiven,dictFound),sprintf('Invalid/Missing words'))\r\n\r\n% Perform Validation: Connected\r\nAchar=H;\r\n m= (Achar-96);\r\n m(m\u003e0)=Inf;\r\n% expand m and encircle with 0\r\n [nr, nc]=size(m);\r\n m=[zeros(nr,1) m zeros(nr,1)];\r\n m=[zeros(1,nc+2); m; zeros(1,nc+2)];\r\n nr=size(m,1);\r\n off_vec=[-1 1 -nr nr];\r\n % Initialize start location\r\n ptr=find(m==Inf,1,'first');\r\n curval=1;\r\n m(ptr)=curval;\r\n \r\n while ~isempty(ptr) % adjacent expansion search sequence\r\n  curval=curval+1;\r\n  Moff_vec=repmat(ptr,1,4)+repmat(off_vec,size(ptr,1),1);\r\n  m(Moff_vec)=min(curval*ones(size(Moff_vec)), m(Moff_vec));\r\n  ptr=find(m==curval);\r\n end\r\n\r\ninvalid=any(m(:)==Inf); % Any unconnected from start point will be Inf\r\n\r\nassert(~invalid,sprintf('Not fully connected'))\r\n\r\nHscore=numel(H);\r\n\r\nfeval(@assignin,'caller','score',Hscore);","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":3,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2013-06-08T22:55:40.000Z","updated_at":"2013-06-09T01:03:27.000Z","published_at":"2013-06-09T01:03:27.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eGiven the List of NHL Teams, fit all in a minimum area Criss-Cross with no invalid words, no duplications, and all connected.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Dictionary (cell array)\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 Array of Char (spaces indicated by char(96))\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\u003eScore:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Numer of Elements in Array (including unused)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eExample:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003edict={'abc' 'cat'}\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\u003eOutput: ['abc';'``a';'``t']\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[abc\\n``a\\n``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\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eScore: 9\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eRelated Challenges:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e1)\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/problems/1533-criss-cross-verification-nhl\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eVerify Criss-Cross\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e2) Create Criss-Cross dictionary from a matrix\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e3) Games Magazine Contest 8/31/2013\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":2191,"title":"Order of things - 3","description":"This problem is closely related to \u003chttp://www.mathworks.nl/matlabcentral/cody/problems/2189-order-of-things-1 Problem 2189, Order of things - 1\u003e and \u003chttp://www.mathworks.nl/matlabcentral/cody/problems/2190-order-of-things-2 Problem 2190, Order of things - 2\u003e. For the details, see the description for those problems. Basically, we have to find the order in which to execute tasks of which the results and prerequisites depend on each other. \r\n\r\n* However, this time the tasks are grouped, and groups of tasks should be executed at once.\r\n* It may (still) be impossible to find a solution, since dependencies may be cyclic. But this may now also be due to the grouping of tasks. In any case, return an empty vector if no order is found.\r\n* There are still multiple orders possible, return them as multiple rows of the output vector.\r\n* The tasks within a group should of course be specified in the right order, when interdependent.\r\n\r\nThe dependencies of the tasks on each other is expressed in a matrix, where each row corresponds to the execution of a task, and each column to the dependency. \r\n\r\n   A  B  C  D  E\r\nA  0  0  0  0  0\r\nB  0  0  0  0  0\r\nC  0  1  0  0  0\r\nD  0  1  1  0  0\r\nE  1  0  0  0  0\r\n\r\nThe |1| on row |C|, column |B|, indicates that task |C| depends on task |B|. \r\n\r\nThe grouping of tasks is expressed as an input vector with groups assigned an integer value \u003e 0, e.g.\r\n\r\n [ 1 1 2 3 3 ] \r\n\r\nReturn the new row/column order as a numeric row-vector, referring to the rows/columns of the input matrix. If multiple orders exist, return them all as rows of a matrix. In this example:\r\n\r\n [ \r\n   1 2 3 4 5\r\n   1 2 3 5 4\r\n   2 1 3 4 5\r\n   2 1 3 5 4\r\n ]\r\n\r\nIf no order fulfilling the dependencies exists, return an empty vector.","description_html":"\u003cp\u003eThis problem is closely related to \u003ca href = \"http://www.mathworks.nl/matlabcentral/cody/problems/2189-order-of-things-1\"\u003eProblem 2189, Order of things - 1\u003c/a\u003e and \u003ca href = \"http://www.mathworks.nl/matlabcentral/cody/problems/2190-order-of-things-2\"\u003eProblem 2190, Order of things - 2\u003c/a\u003e. For the details, see the description for those problems. Basically, we have to find the order in which to execute tasks of which the results and prerequisites depend on each other.\u003c/p\u003e\u003cul\u003e\u003cli\u003eHowever, this time the tasks are grouped, and groups of tasks should be executed at once.\u003c/li\u003e\u003cli\u003eIt may (still) be impossible to find a solution, since dependencies may be cyclic. But this may now also be due to the grouping of tasks. In any case, return an empty vector if no order is found.\u003c/li\u003e\u003cli\u003eThere are still multiple orders possible, return them as multiple rows of the output vector.\u003c/li\u003e\u003cli\u003eThe tasks within a group should of course be specified in the right order, when interdependent.\u003c/li\u003e\u003c/ul\u003e\u003cp\u003eThe dependencies of the tasks on each other is expressed in a matrix, where each row corresponds to the execution of a task, and each column to the dependency.\u003c/p\u003e\u003cpre\u003e   A  B  C  D  E\r\nA  0  0  0  0  0\r\nB  0  0  0  0  0\r\nC  0  1  0  0  0\r\nD  0  1  1  0  0\r\nE  1  0  0  0  0\u003c/pre\u003e\u003cp\u003eThe \u003ctt\u003e1\u003c/tt\u003e on row \u003ctt\u003eC\u003c/tt\u003e, column \u003ctt\u003eB\u003c/tt\u003e, indicates that task \u003ctt\u003eC\u003c/tt\u003e depends on task \u003ctt\u003eB\u003c/tt\u003e.\u003c/p\u003e\u003cp\u003eThe grouping of tasks is expressed as an input vector with groups assigned an integer value \u0026gt; 0, e.g.\u003c/p\u003e\u003cpre\u003e [ 1 1 2 3 3 ] \u003c/pre\u003e\u003cp\u003eReturn the new row/column order as a numeric row-vector, referring to the rows/columns of the input matrix. If multiple orders exist, return them all as rows of a matrix. In this example:\u003c/p\u003e\u003cpre\u003e [ \r\n   1 2 3 4 5\r\n   1 2 3 5 4\r\n   2 1 3 4 5\r\n   2 1 3 5 4\r\n ]\u003c/pre\u003e\u003cp\u003eIf no order fulfilling the dependencies exists, return an empty vector.\u003c/p\u003e","function_template":"function order = calculation_order(dependencies,groups)\r\n  order  = 1:size(dependencies,1);\r\nend","test_suite":"%%\r\ndependencies = [\r\n0  0  0  0  1\r\n0  0  1  1  0\r\n0  0  0  0  0\r\n0  0  1  0  0\r\n0  0  0  0  0\r\n];\r\ngroups = [ 3  3  1  2  1 ];\r\norder = calculation_order(dependencies,groups);\r\norder_correct = [\r\n5  3  4  2  1\r\n5  3  4  1  2\r\n4  3  5  2  1\r\n4  3  5  1  2\r\n];\r\nassert(isequal(sortrows(order_correct),sortrows(order)));\r\n\r\n%%\r\ndependencies = [\r\n0  1  0  0  0\r\n0  0  1  0  0\r\n0  0  0  0  0\r\n0  0  0  0  0\r\n1  0  0  1  0\r\n];\r\ngroups = [ 2  2  2  1  2 ];\r\norder = calculation_order(dependencies,groups);\r\norder_correct = [\r\n4  3  2  1  5\r\n];\r\nassert(isequal(sortrows(order_correct),sortrows(order)));\r\n\r\n%%\r\ndependencies = [\r\n0  1  0  0  0\r\n0  0  0  0  0\r\n0  0  0  0  0\r\n1  0  0  0  1\r\n0  0  1  0  0\r\n];\r\ngroups = [ 1  1  2  3  2 ];\r\norder = calculation_order(dependencies,groups);\r\norder_correct = [\r\n2  1  3  5  4\r\n4  3  1  5  2\r\n];\r\nassert(isequal(sortrows(order_correct),sortrows(order)));\r\n\r\n%%\r\ndependencies = [\r\n0  0  0  0  0\r\n0  0  1  0  0\r\n0  1  0  0  0\r\n0  0  0  0  0\r\n0  0  0  0  0\r\n];\r\ngroups = [ 5  1  2  3  4 ];\r\norder = calculation_order(dependencies,groups);\r\nassert(isempty(order));\r\n\r\n%%\r\ndependencies = [\r\n0  0  0  0  0\r\n1  0  0  0  0\r\n0  0  0  1  0\r\n0  1  0  0  0\r\n0  0  1  0  0\r\n];\r\ngroups = [ 1  1  2  3  2 ];\r\norder = calculation_order(dependencies,groups);\r\nassert(isempty(order));\r\n\r\n%%\r\ndependencies = [\r\n0  0  0  0  1\r\n0  0  0  0  0\r\n0  0  0  0  0\r\n0  0  0  0  0\r\n1  0  0  0  0\r\n];\r\ngroups = [ 2  2  3  1  1 ];\r\norder = calculation_order(dependencies,groups);\r\nassert(isempty(order));\r\n\r\n%%\r\ndependencies_ = ones(10+randi(10));\r\ndependencies_ = dependencies_-triu(dependencies_);\r\norder_ = randperm(size(dependencies_,1));\r\ndependencies = dependencies_(order_,order_);\r\norder_ = 0;\r\norder = calculation_order(dependencies,1:size(dependencies_,1));\r\nordered = dependencies(order,order);\r\nassert(~nnz(triu(ordered-diag(diag(ordered)))));\r\norder = calculation_order(dependencies,ones(1,size(dependencies_,1)));\r\nordered = dependencies(order,order);\r\nassert(~nnz(triu(ordered-diag(diag(ordered)))));\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":2,"created_by":6556,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":1,"test_suite_updated_at":"2014-02-21T15:59:05.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2014-02-18T08:50:55.000Z","updated_at":"2014-02-21T15:59:05.000Z","published_at":"2014-02-21T09:38:58.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis problem is closely related to\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.nl/matlabcentral/cody/problems/2189-order-of-things-1\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eProblem 2189, Order of things - 1\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e and\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.nl/matlabcentral/cody/problems/2190-order-of-things-2\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eProblem 2190, Order of things - 2\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. For the details, see the description for those problems. Basically, we have to find the order in which to execute tasks of which the results and prerequisites depend on each other.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eHowever, this time the tasks are grouped, and groups of tasks should be executed at once.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eIt may (still) be impossible to find a solution, since dependencies may be cyclic. But this may now also be due to the grouping of tasks. In any case, return an empty vector if no order is found.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThere are still multiple orders possible, return them as multiple rows of the output vector.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe tasks within a group should of course be specified in the right order, when interdependent.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe dependencies of the tasks on each other is expressed in a matrix, where each row corresponds to the execution of a task, and each column to the dependency.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[   A  B  C  D  E\\nA  0  0  0  0  0\\nB  0  0  0  0  0\\nC  0  1  0  0  0\\nD  0  1  1  0  0\\nE  1  0  0  0  0]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003e1\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e on row\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eC\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, column\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eB\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, indicates that task\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eC\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e depends on task\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eB\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe grouping of tasks is expressed as an input vector with groups assigned an integer value \u0026gt; 0, e.g.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ [ 1 1 2 3 3 ]]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eReturn the new row/column order as a numeric row-vector, referring to the rows/columns of the input matrix. If multiple orders exist, return them all as rows of a matrix. In this example:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ [ \\n   1 2 3 4 5\\n   1 2 3 5 4\\n   2 1 3 4 5\\n   2 1 3 5 4\\n ]]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eIf no order fulfilling the dependencies exists, return an empty vector.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":2192,"title":"Order of things - 4","description":"*This is the last assignment in the _Order of Things_-series. If that past incompleteness kept you from solving it, you may start now.* Open that bottle of wine, and spend an entertaining evening coding.\r\n\r\nThis problem is closely related to \u003chttp://www.mathworks.nl/matlabcentral/cody/problems/2189-order-of-things-1 Problem 2189, Order of things - 1\u003e, \u003chttp://www.mathworks.nl/matlabcentral/cody/problems/2190-order-of-things-2 Problem 2190, Order of things - 2\u003e, and \u003chttp://www.mathworks.nl/matlabcentral/cody/problems/2191-order-of-things-3 Problem 2191, Order of things - 3\u003e. For the details, see the description for those problems. Basically, we have to find the order in which to execute tasks of which the results and prerequisites depend on each other. \r\n\r\nHowever, this is the most complex case, as \r\n* Calculations are preferably grouped, but may, due to their dependencies, not all be clustered. So groups of events may be split over different clusters. The number of clusters per group should be kept to a minimum. \r\n\r\nThe same complications as in problem 3 may apply:\r\n* It may (still) be impossible to find a solution, since dependencies may be cyclic. But this is now no longer due to the grouping of tasks, as you may, if necessary, break the rule of grouping. In any case, return an empty vector if no order is found.\r\n* There are still multiple orders possible, return them as multiple rows of the output vector.\r\n* The tasks within a group should of course be specified in the right order, when interdependent.\r\n\r\nThe dependencies of the tasks on each other is expressed in a matrix, where each row corresponds to the execution of a task, and each column to the dependency. \r\n\r\n   A  B  C  D  E\r\nA  0  0  0  0  0\r\nB  0  0  1  0  0\r\nC  1  0  0  0  0\r\nD  0  0  1  0  0\r\nE  1  0  0  0  0\r\n\r\nThe |1| on row |C|, column |B|, indicates that task |C| depends on task |B|. \r\n\r\nThe grouping of tasks is expressed as an input vector with groups assigned an integer value \u003e 0, for every task, e.g. \r\n\r\n [ 1 1 2 2 3 ] \r\n\r\nReturn the new row/column order as a numeric row-vector, referring to the rows/columns of the input matrix. If multiple orders exist, return them all as rows of a matrix. In this example:\r\n\r\n [ \r\n   1 3 4 2 5\r\n   1 3 4 5 2\r\n   1 5 3 4 2\r\n ]\r\n\r\nIf no order fulfilling the dependencies exists, return an empty vector.","description_html":"\u003cp\u003e\u003cb\u003eThis is the last assignment in the \u003ci\u003eOrder of Things\u003c/i\u003e-series. If that past incompleteness kept you from solving it, you may start now.\u003c/b\u003e Open that bottle of wine, and spend an entertaining evening coding.\u003c/p\u003e\u003cp\u003eThis problem is closely related to \u003ca href = \"http://www.mathworks.nl/matlabcentral/cody/problems/2189-order-of-things-1\"\u003eProblem 2189, Order of things - 1\u003c/a\u003e, \u003ca href = \"http://www.mathworks.nl/matlabcentral/cody/problems/2190-order-of-things-2\"\u003eProblem 2190, Order of things - 2\u003c/a\u003e, and \u003ca href = \"http://www.mathworks.nl/matlabcentral/cody/problems/2191-order-of-things-3\"\u003eProblem 2191, Order of things - 3\u003c/a\u003e. For the details, see the description for those problems. Basically, we have to find the order in which to execute tasks of which the results and prerequisites depend on each other.\u003c/p\u003e\u003cp\u003eHowever, this is the most complex case, as \r\n* Calculations are preferably grouped, but may, due to their dependencies, not all be clustered. So groups of events may be split over different clusters. The number of clusters per group should be kept to a minimum.\u003c/p\u003e\u003cp\u003eThe same complications as in problem 3 may apply:\r\n* It may (still) be impossible to find a solution, since dependencies may be cyclic. But this is now no longer due to the grouping of tasks, as you may, if necessary, break the rule of grouping. In any case, return an empty vector if no order is found.\r\n* There are still multiple orders possible, return them as multiple rows of the output vector.\r\n* The tasks within a group should of course be specified in the right order, when interdependent.\u003c/p\u003e\u003cp\u003eThe dependencies of the tasks on each other is expressed in a matrix, where each row corresponds to the execution of a task, and each column to the dependency.\u003c/p\u003e\u003cpre\u003e   A  B  C  D  E\r\nA  0  0  0  0  0\r\nB  0  0  1  0  0\r\nC  1  0  0  0  0\r\nD  0  0  1  0  0\r\nE  1  0  0  0  0\u003c/pre\u003e\u003cp\u003eThe \u003ctt\u003e1\u003c/tt\u003e on row \u003ctt\u003eC\u003c/tt\u003e, column \u003ctt\u003eB\u003c/tt\u003e, indicates that task \u003ctt\u003eC\u003c/tt\u003e depends on task \u003ctt\u003eB\u003c/tt\u003e.\u003c/p\u003e\u003cp\u003eThe grouping of tasks is expressed as an input vector with groups assigned an integer value \u0026gt; 0, for every task, e.g.\u003c/p\u003e\u003cpre\u003e [ 1 1 2 2 3 ] \u003c/pre\u003e\u003cp\u003eReturn the new row/column order as a numeric row-vector, referring to the rows/columns of the input matrix. If multiple orders exist, return them all as rows of a matrix. In this example:\u003c/p\u003e\u003cpre\u003e [ \r\n   1 3 4 2 5\r\n   1 3 4 5 2\r\n   1 5 3 4 2\r\n ]\u003c/pre\u003e\u003cp\u003eIf no order fulfilling the dependencies exists, return an empty vector.\u003c/p\u003e","function_template":"function order = calculation_order(dependencies,groups)\r\n  order  = 1:size(dependencies,1);\r\nend","test_suite":"dependencies = [\r\n0  1  0  0  0\r\n0  0  0  0  0\r\n0  0  0  0  1\r\n0  0  0  0  1\r\n0  1  0  0  0\r\n];\r\ngroups = [ 3  1  2  1  2 ];\r\norder = calculation_order(dependencies,groups);\r\norder_correct = [\r\n3  2  5  4  1\r\n3  5  2  4  1\r\n5  4  2  3  1\r\n];\r\nassert(isequal(sortrows(order_correct),sortrows(order)));\r\n\r\n%%\r\ndependencies = [\r\n0  1  0  0  0\r\n0  0  0  0  0\r\n0  0  0  1  0\r\n0  1  0  0  0\r\n0  0  0  1  0\r\n];\r\ngroups = [ 3  1  1  2  2 ];\r\norder = calculation_order(dependencies,groups);\r\norder_correct = [\r\n3  4  2  5  1\r\n3  4  5  2  1\r\n5  3  4  2  1\r\n];\r\nassert(isequal(sortrows(order_correct),sortrows(order)));\r\n\r\n%%\r\ndependencies = [\r\n0  0  1  0  0\r\n0  0  0  1  0\r\n0  0  0  1  0\r\n0  0  0  0  0\r\n0  0  1  0  0\r\n];\r\ngroups = [ 1  3  2  1  2 ];\r\norder = calculation_order(dependencies,groups);\r\norder_correct = [\r\n2  1  4  5  3\r\n5  1  4  2  3\r\n4  1  3  2  5\r\n];\r\nassert(isequal(sortrows(order_correct),sortrows(order)));\r\n\r\n%%\r\ndependencies = [\r\n    0 0 0 0 0\r\n    0 0 0 0 0\r\n    0 1 0 0 0\r\n    0 0 1 0 0\r\n    1 0 0 1 0\r\n    ];\r\ngroups = [1 2 2 2 2];\r\norder = calculation_order(dependencies,groups);\r\norder_correct = [\r\n    1 2 3 4 5\r\n];\r\nassert(isequal(sortrows(order_correct),sortrows(order)));\r\n\r\n%%\r\ndependencies = [\r\n0  0  0  1  0\r\n0  0  0  0  0\r\n0  0  0  0  0\r\n1  0  0  0  0\r\n0  0  0  0  0\r\n];\r\ngroups = [ 1  3  4  2  5 ];\r\norder = calculation_order(dependencies,groups);\r\nassert(isempty(order));\r\n\r\n%%\r\ndependencies = [\r\n0  0  0  0  0\r\n0  0  0  0  0\r\n0  0  0  1  0\r\n0  0  1  0  0\r\n0  0  0  0  0\r\n];\r\ngroups = [ 1  3  2  1  2 ];\r\norder = calculation_order(dependencies,groups);\r\norder_correct = [\r\n1  2  4  5  3\r\n1  2  3  5  4\r\n1  5  4  2  3\r\n1  5  3  2  4\r\n1  4  3  2  5\r\n1  3  4  2  5\r\n5  4  3  2  1\r\n5  3  4  2  1\r\n];\r\nassert(isequal(sortrows(order_correct),sortrows(order)));\r\n\r\n%%\r\ndependencies_ = ones(randi(10));\r\ndependencies_ = dependencies_-triu(dependencies_);\r\norder_ = randperm(size(dependencies_,1));\r\ndependencies = dependencies_(order_,order_);\r\norder_ = 0;\r\norder = calculation_order(dependencies,1:size(dependencies_,1));\r\nordered = dependencies(order,order);\r\nassert(~nnz(triu(ordered-diag(diag(ordered)))));\r\norder = calculation_order(dependencies,ones(1,size(dependencies_,1)));\r\nordered = dependencies(order,order);\r\nassert(~nnz(triu(ordered-diag(diag(ordered)))));\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":6556,"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":"2014-02-18T08:57:21.000Z","updated_at":"2014-03-04T07:49:56.000Z","published_at":"2014-03-04T07:49:56.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eThis is the last assignment in the\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eOrder of Things\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003e-series. If that past incompleteness kept you from solving it, you may start now.\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Open that bottle of wine, and spend an entertaining evening coding.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis problem is closely related to\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.nl/matlabcentral/cody/problems/2189-order-of-things-1\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eProblem 2189, Order of things - 1\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e,\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.nl/matlabcentral/cody/problems/2190-order-of-things-2\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eProblem 2190, Order of things - 2\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e, and\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.nl/matlabcentral/cody/problems/2191-order-of-things-3\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eProblem 2191, Order of things - 3\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. For the details, see the description for those problems. Basically, we have to find the order in which to execute tasks of which the results and prerequisites depend on each other.\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\u003eHowever, this is the most complex case, as * Calculations are preferably grouped, but may, due to their dependencies, not all be clustered. So groups of events may be split over different clusters. The number of clusters per group should be kept to a minimum.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe same complications as in problem 3 may apply: * It may (still) be impossible to find a solution, since dependencies may be cyclic. But this is now no longer due to the grouping of tasks, as you may, if necessary, break the rule of grouping. In any case, return an empty vector if no order is found. * There are still multiple orders possible, return them as multiple rows of the output vector. * The tasks within a group should of course be specified in the right order, when interdependent.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe dependencies of the tasks on each other is expressed in a matrix, where each row corresponds to the execution of a task, and each column to the dependency.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[   A  B  C  D  E\\nA  0  0  0  0  0\\nB  0  0  1  0  0\\nC  1  0  0  0  0\\nD  0  0  1  0  0\\nE  1  0  0  0  0]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003e1\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e on row\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eC\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, column\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eB\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, indicates that task\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eC\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e depends on task\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eB\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe grouping of tasks is expressed as an input vector with groups assigned an integer value \u0026gt; 0, for every task, e.g.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ [ 1 1 2 2 3 ]]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eReturn the new row/column order as a numeric row-vector, referring to the rows/columns of the input matrix. If multiple orders exist, return them all as rows of a matrix. In this example:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ [ \\n   1 3 4 2 5\\n   1 3 4 5 2\\n   1 5 3 4 2\\n ]]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eIf no order fulfilling the dependencies exists, return an empty vector.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":1900,"title":"GJam 2014 China Rd A: Rational Number Tree (Large Values)","description":"This Challenge is derived from \u003chttp://code.google.com/codejam/contest/2924486/dashboard#s=p1 GJam 2014 China Rational Number Tree\u003e.\r\n\r\nThe Goal is to determine the tree node if given [P,Q] or provide the [P,Q] if given a node. This is the Large Challenge with a Max of 64 Tree levels. Processing of uint64 size data requires extra care.\r\n\r\nConsider an infinite complete binary tree where the root node is 1/1 and the left and right children of node P/Q are P/(P+Q) and (P+Q)/Q, respectively. \r\n\r\nThe Tree looks like:\r\n\r\n         1/1\r\n    ______|______\r\n    |           |\r\n   1/2         2/1\r\n ___|___     ___|___\r\n |     |     |     |\r\n1/3   3/2   2/3   3/1\r\n\r\n\r\nThe nodes are 1/1, 1/2, 2/1, 1/3, 3/2, 2/3, 3/1,...\r\n\r\n\r\n*Input:* [N] or [P,Q] where N is a uint64 integer node or [P,Q] (double) are terms of a Node\r\n\r\n*Output:* [P,Q](double) or [N](uint64) depends on Input type\r\n\r\n*Examples:*\r\n\r\n  [Input]  [Output]\r\n    [2] [1 2]\r\n    [1 2] [2]\r\n    [5] [3 2]\r\n    [3 2] [5]\r\n\r\n*Contest Performance:* Best Delta Time of 14 minutes with only 368 able to process the large data set in less than 3 hours.\r\n\r\n*Notes:*\r\n\r\n1) Matlab has issues with uint64 for dec2bin and matrix multiplies.\r\n\r\n2) Example of uint64 read is provided in test suite comments\r\n\r\n3) Bitshift and bitget work on uint64","description_html":"\u003cp\u003eThis Challenge is derived from \u003ca href = \"http://code.google.com/codejam/contest/2924486/dashboard#s=p1\"\u003eGJam 2014 China Rational Number Tree\u003c/a\u003e.\u003c/p\u003e\u003cp\u003eThe Goal is to determine the tree node if given [P,Q] or provide the [P,Q] if given a node. This is the Large Challenge with a Max of 64 Tree levels. Processing of uint64 size data requires extra care.\u003c/p\u003e\u003cp\u003eConsider an infinite complete binary tree where the root node is 1/1 and the left and right children of node P/Q are P/(P+Q) and (P+Q)/Q, respectively.\u003c/p\u003e\u003cp\u003eThe Tree looks like:\u003c/p\u003e\u003cpre\u003e         1/1\r\n    ______|______\r\n    |           |\r\n   1/2         2/1\r\n ___|___     ___|___\r\n |     |     |     |\r\n1/3   3/2   2/3   3/1\u003c/pre\u003e\u003cp\u003eThe nodes are 1/1, 1/2, 2/1, 1/3, 3/2, 2/3, 3/1,...\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e [N] or [P,Q] where N is a uint64 integer node or [P,Q] (double) are terms of a Node\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e [P,Q](double) or [N](uint64) depends on Input type\u003c/p\u003e\u003cp\u003e\u003cb\u003eExamples:\u003c/b\u003e\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003e[Input]  [Output]\r\n  [2] [1 2]\r\n  [1 2] [2]\r\n  [5] [3 2]\r\n  [3 2] [5]\r\n\u003c/pre\u003e\u003cp\u003e\u003cb\u003eContest Performance:\u003c/b\u003e Best Delta Time of 14 minutes with only 368 able to process the large data set in less than 3 hours.\u003c/p\u003e\u003cp\u003e\u003cb\u003eNotes:\u003c/b\u003e\u003c/p\u003e\u003cp\u003e1) Matlab has issues with uint64 for dec2bin and matrix multiplies.\u003c/p\u003e\u003cp\u003e2) Example of uint64 read is provided in test suite comments\u003c/p\u003e\u003cp\u003e3) Bitshift and bitget work on uint64\u003c/p\u003e","function_template":"function vout=Tree_CH(v);\r\n  vout=0;\r\nend","test_suite":"%%\r\ntic\r\nv=[          2081355757           4898583766 ];\r\nvexp=[uint64(11412103587704585708) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        385960903003         298051413714 ];\r\nvexp=[uint64(13079621846505187505) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(15477096172227810860) ];\r\nvexp=[        188445238409         450375998772 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 6473043965665514375) ];\r\nvexp=[        109230282567          33788952110 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(11270280438309969755) ];\r\nvexp=[         23328302733           8557676614 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[          6893018069           8719066441 ];\r\nvexp=[uint64( 1875942192845872366) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 6566840053865194126) ];\r\nvexp=[         65441249939          85425641391 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         21562167101          16520535073 ];\r\nvexp=[uint64(  956959952027690353) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[          1684200303           7336396097 ];\r\nvexp=[uint64(  871479491406563248) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 2524835851416755114) ];\r\nvexp=[         28589000023          46221104912 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        154908421282         199691474905 ];\r\nvexp=[uint64( 7885684695614904270) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 8176570117722182781) ];\r\nvexp=[         40721598494          22123450931 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 9379940828518631730) ];\r\nvexp=[         37341631466          63773070917 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        232141051889         328442531011 ];\r\nvexp=[uint64( 9972945692012784742) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 9539984397959825908) ];\r\nvexp=[         70384313011         178968141063 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        421484284721         599703187188 ];\r\nvexp=[uint64(17162693345262485798) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        127506314007          35528864794 ];\r\nvexp=[uint64( 4167185002280551319) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         11313093168          21049073135 ];\r\nvexp=[uint64(16014443480831614722) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 7450646608300783266) ];\r\nvexp=[         83429116694         148768825269 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(13305041571212833467) ];\r\nvexp=[         77301627056          27774083789 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(13635447149676152154) ];\r\nvexp=[         90797761304         143479563807 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(11002893257806672560) ];\r\nvexp=[         44637053272         195624712811 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(11051724027090761936) ];\r\nvexp=[         41361095819         189799709732 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(16687200783289968235) ];\r\nvexp=[        552258283575         209936061221 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         54164851566         156315474505 ];\r\nvexp=[uint64(13714337615447966724) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 7329431770178715643) ];\r\nvexp=[         13299036287           4535592331 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(16479631524350748877) ];\r\nvexp=[        165234451641          96812407705 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 6965988866158891263) ];\r\nvexp=[         21216614218           2585039947 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 2910455928437551420) ];\r\nvexp=[          6642417815          14808129701 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         13173276049          27570716815 ];\r\nvexp=[uint64( 4977980945016614908) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(16721022657493559975) ];\r\nvexp=[         65473107451          19359384006 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         16946040975          10725070912 ];\r\nvexp=[uint64( 6003309882203701925) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 2198342485367409266) ];\r\nvexp=[         23006488657          39032588924 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        120013217139          50302005308 ];\r\nvexp=[uint64(14344732783514005715) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         57191814347          77886936688 ];\r\nvexp=[uint64( 8056110860202858614) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(  971778736353519486) ];\r\nvexp=[         17760921544          20384041659 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        129560016431         165770554719 ];\r\nvexp=[uint64(15111464173338859822) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(17855284157674478998) ];\r\nvexp=[        215281025997         298483051015 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[          8822618162           5678585885 ];\r\nvexp=[uint64( 4934822377188433797) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(  632138406214928188) ];\r\nvexp=[          1835073727           4084131059 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(17330627945660580534) ];\r\nvexp=[         41195382388          56325602793 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[          6130953526          13549540271 ];\r\nvexp=[uint64( 1896894898836571068) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         25774822611          36694510870 ];\r\nvexp=[uint64(15996304402734859814) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 9847540446768144862) ];\r\nvexp=[         31041969169          37560295989 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(16612432143632526945) ];\r\nvexp=[         74531365158          60753898717 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(18413647273680019461) ];\r\nvexp=[         10651217970           6995653927 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         62279662838          47373225825 ];\r\nvexp=[uint64( 9640047776936252913) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(16583979163800903818) ];\r\nvexp=[        114249431453         187605944484 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[          9050571726           1557293089 ];\r\nvexp=[uint64( 9060257062169994207) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(12613321696385576431) ];\r\nvexp=[        125835757545          26079146381 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         35625689704          19896848117 ];\r\nvexp=[uint64( 4411487194398480861) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 3484689439967270015) ];\r\nvexp=[         38461243033           5285269728 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         16085645428          43823408873 ];\r\nvexp=[uint64(  894482490922679460) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(12060487473657709988) ];\r\nvexp=[        250877787515         682594856898 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        143931327293          76531069545 ];\r\nvexp=[uint64(12786697318005254653) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(14215963369683634045) ];\r\nvexp=[        100316121935          54160354223 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[          6557653153          12053301655 ];\r\nvexp=[uint64(  343376420813762434) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         47494216762         112901758075 ];\r\nvexp=[uint64( 3772080181899583404) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 6766488059228584288) ];\r\nvexp=[          8189923863          44106320581 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         41526542352          17027036567 ];\r\nvexp=[uint64(17583140790467836275) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[          7196361275           6496875429 ];\r\nvexp=[uint64( 6443574928762444801) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(17365843048376429107) ];\r\nvexp=[         18457341831           7658711707 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         78140576077          33767545674 ];\r\nvexp=[uint64( 6098897546038113251) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[          6734445697          12144787423 ];\r\nvexp=[uint64( 4770215408132554690) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        426726665699         126968827572 ];\r\nvexp=[uint64(12995540462042527271) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 5523416580603863552) ];\r\nvexp=[          4255700693          41585972826 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 3928457774057619184) ];\r\nvexp=[          3877602413          16306596859 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        136097916108          28801327007 ];\r\nvexp=[uint64( 5984770176263773551) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(16263054952801281548) ];\r\nvexp=[         14189368539          34874268638 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        662028875555         839442017139 ];\r\nvexp=[uint64(11859750004469197678) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         61393402621         332298132605 ];\r\nvexp=[uint64( 7879625004656522848) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[          1998630709           8715852076 ];\r\nvexp=[uint64(  429234479783941040) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         46021740257          21715449429 ];\r\nvexp=[uint64(14347105153381215235) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(  498971859648614985) ];\r\nvexp=[         30472124134          22307121041 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 6396162213707057064) ];\r\nvexp=[         26683188512          96283024611 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         46925294325          33937979441 ];\r\nvexp=[uint64( 1189627028589296041) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         76315837293          99424320902 ];\r\nvexp=[uint64(11656949174638158734) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         81880058662          38464981613 ];\r\nvexp=[uint64( 7071867154613101059) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(10763027175299443277) ];\r\nvexp=[        330973468653         194345162402 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         79087591419          23535674032 ];\r\nvexp=[uint64(15017024826981320231) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        241564818347         155909390759 ];\r\nvexp=[uint64(15575297637481852549) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         45079186819         295776092742 ];\r\nvexp=[uint64(16532545499676710720) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         22268771423          34477255167 ];\r\nvexp=[uint64(11007510539515659130) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 5666822869473456046) ];\r\nvexp=[         28640204779          36488487629 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(14041232599151835393) ];\r\nvexp=[         28442192536          25169506635 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 9611808239041397120) ];\r\nvexp=[          1055826287           7876555270 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        358405360794         498368744795 ];\r\nvexp=[uint64( 4955841772239017238) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 3979638765694296062) ];\r\nvexp=[          6903410593           7465748396 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        151761015812         211325030677 ];\r\nvexp=[uint64( 7987025462351843862) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        325266071703          87446899892 ];\r\nvexp=[uint64(16944641327505127607) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 3273057505586617135) ];\r\nvexp=[        124425395619          27124979723 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        142722642746          60293518411 ];\r\nvexp=[uint64(10857549622062058131) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        379488415355         462240655923 ];\r\nvexp=[uint64(16693497308621268574) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 5336487237226370963) ];\r\nvexp=[         76728175571          32349586492 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        366909173981         111494050923 ];\r\nvexp=[uint64(11044880014193584327) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 2767480983943234275) ];\r\nvexp=[        155407720950          67429662431 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[          4375152441          11923449250 ];\r\nvexp=[uint64(14458798758395123876) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        107946470399          33010545783 ];\r\nvexp=[uint64(13708745226178508359) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(  546205200272961984) ];\r\nvexp=[          1773793574          11180737745 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 6791165959744564855) ];\r\nvexp=[        125726750555          33307435529 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\ntoc\r\n%%\r\n% Read of GJam 64 bit data\r\n% function z = read_input64(fn)\r\n%  fid=fopen(fn);\r\n%  u=textscan(fid,'%u64');\r\n%  fclose(fid);\r\n%  vptr=2; % skip Test case count \r\n%  dptr=1;\r\n%  while vptr\u003csize(u{1},1)\r\n%   if u{1}(vptr)==1 % single N\r\n%    z{dptr}=u{1}(vptr+1);\r\n%    vptr=vptr+2;\r\n%   else % Pair for p/q\r\n%    z{dptr}=[u{1}(vptr+1) u{1}(vptr+2)];\r\n%    vptr=vptr+3;\r\n%   end\r\n%   dptr=dptr+1;\r\n%  end\r\n% end\r\n%Typical GJam 64 bit data\r\n% 100\r\n% 2 2081355757 4898583766\r\n% 2 385960903003 298051413714\r\n% 1 15477096172227810860\r\n% 1 6473043965665514375\r\n% 1 11270280438309969755\r\n% 2 6893018069 8719066441\r\n% 1 6566840053865194126\r\n% 2 21562167101 16520535073\r\n% 2 1684200303 7336396097\r\n% 1 2524835851416755114\r\n% 2 154908421282 199691474905\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":5,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2013-09-29T03:53:20.000Z","updated_at":"2013-09-29T21:22:24.000Z","published_at":"2013-09-29T04:19:40.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis Challenge is derived from\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://code.google.com/codejam/contest/2924486/dashboard#s=p1\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eGJam 2014 China Rational Number Tree\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe Goal is to determine the tree node if given [P,Q] or provide the [P,Q] if given a node. This is the Large Challenge with a Max of 64 Tree levels. Processing of uint64 size data requires extra care.\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\u003eConsider an infinite complete binary tree where the root node is 1/1 and the left and right children of node P/Q are P/(P+Q) and (P+Q)/Q, respectively.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe Tree looks like:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[         1/1\\n    ______|______\\n    |           |\\n   1/2         2/1\\n ___|___     ___|___\\n |     |     |     |\\n1/3   3/2   2/3   3/1]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe nodes are 1/1, 1/2, 2/1, 1/3, 3/2, 2/3, 3/1,...\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e [N] or [P,Q] where N is a uint64 integer node or [P,Q] (double) are terms of a Node\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 [P,Q](double) or [N](uint64) depends on Input type\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\u003eExamples:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[[Input]  [Output]\\n  [2] [1 2]\\n  [1 2] [2]\\n  [5] [3 2]\\n  [3 2] [5]]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eContest Performance:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Best Delta Time of 14 minutes with only 368 able to process the large data set in less than 3 hours.\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\u003eNotes:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e1) Matlab has issues with uint64 for dec2bin and matrix multiplies.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e2) Example of uint64 read is provided in test suite comments\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e3) Bitshift and bitget work on uint64\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":1908,"title":"Equilibrium","description":"Is this tower of blocks going to fall?\r\n\r\n\u003c\u003chttp://www.alfnie.com/software/equilibrium02.jpg\u003e\u003e\r\n\r\n*Description*\r\n\r\nGiven a stacking configuration for a series of square blocks, your function should return _true_ if they are at equilibrium and _false_ otherwise. \r\n\r\nThe block configuration for N blocks is provided as a input vector *x* with N elements listing the _x-coordinates_ of the left-side of each block. The blocks are square with side equal to 1 (so the i-th block left side is at x(i) and its right side is at x(i)+1). The _y-coordinates_ of each block are determined implicitly by the order of the blocks, which are dropped \"tetris-style\" until they hit the floor or another block. \r\n\r\nAll blocks are identical (same dimensions and mass) and perfectly smooth (friction is to be disregarded).\r\n \r\nIntermediate positions may be unstable. You are only required to determine whether the final configuration is stable.\r\n\r\n*Examples*:\r\n\r\nExample (1) \r\n \r\n x = [0 0.4];\r\n\r\n\u003c\u003chttp://www.alfnie.com/software/equilibrium01a.jpg\u003e\u003e\r\n\r\nThe first block bottom-left corner is at (0,0) and the second block falls on top of it, with its bottom-left corner at (0.4 1). This configuration is stable so your function should return _true_.\r\n\r\nExample (2) \r\n\r\n x = [0 0.6];\r\n\r\n\u003c\u003chttp://www.alfnie.com/software/equilibrium01b.jpg\u003e\u003e\r\n\r\nThe first block bottom-left corner is at (0,0) and the second block falls on top of it, with its bottom-left corner at (0.6 1). This configuration is unstable (the second block will fall) so your function should return _false_.\r\n\r\nExample (3) \r\n\r\n x = [0 1.5 0.6];\r\n\r\n\u003c\u003chttp://www.alfnie.com/software/equilibrium01c.jpg\u003e\u003e\r\n\r\nThe three block bottom-left corner coordinates are (0,0) (1.5,0) and (0.6,1). This configuration is stable so your function should return _true_.\r\n\r\nExample (4) \r\n\r\n x = [0 .9 -.9 zeros(1,5)];\r\n\r\n\u003c\u003chttp://www.alfnie.com/software/equilibrium01d.jpg\u003e\u003e\r\n\r\nThis configuration is unstable, but note that if instead of five we add a few more blocks on top of this at the 0 position that will keep the tower from falling!\r\n\r\nExample (5) \r\n\r\nx = cumsum(fliplr(1./(1:8))/2);\r\n\r\n\u003c\u003chttp://www.alfnie.com/software/equilibrium01e.jpg\u003e\u003e\r\n\r\nThis configuration is stable (see the \u003chttp://en.wikipedia.org/wiki/Block-stacking_problem classic optimal stacking solution\u003e) so your function should return _true_.\r\n\r\n*Display*\r\n\r\nIf you wish, you may display any given block configuration *x* using the code below:\r\n\r\n clf;\r\n y=[];\r\n for n=1:numel(x), y(n)=max([0 y(abs(x(1:n-1)-x(n))\u003c1)+1]); end\r\n h=arrayfun(@(x,y)patch(x+[0,1,1,0],y+[0,0,1,1],rand(1,3)),x,y);\r\n text(x+.5,y+.5,arrayfun(@num2str,1:numel(x),'uni',0),...\r\n 'horizontalalignment','center');\r\n\r\nVisit \u003chttp://www.mathworks.com/matlabcentral/cody/problems/1910-block-canvas Block canvas\u003e for a related Cody problem.","description_html":"\u003cp\u003eIs this tower of blocks going to fall?\u003c/p\u003e\u003cimg src = \"http://www.alfnie.com/software/equilibrium02.jpg\"\u003e\u003cp\u003e\u003cb\u003eDescription\u003c/b\u003e\u003c/p\u003e\u003cp\u003eGiven a stacking configuration for a series of square blocks, your function should return \u003ci\u003etrue\u003c/i\u003e if they are at equilibrium and \u003ci\u003efalse\u003c/i\u003e otherwise.\u003c/p\u003e\u003cp\u003eThe block configuration for N blocks is provided as a input vector \u003cb\u003ex\u003c/b\u003e with N elements listing the \u003ci\u003ex-coordinates\u003c/i\u003e of the left-side of each block. The blocks are square with side equal to 1 (so the i-th block left side is at x(i) and its right side is at x(i)+1). The \u003ci\u003ey-coordinates\u003c/i\u003e of each block are determined implicitly by the order of the blocks, which are dropped \"tetris-style\" until they hit the floor or another block.\u003c/p\u003e\u003cp\u003eAll blocks are identical (same dimensions and mass) and perfectly smooth (friction is to be disregarded).\u003c/p\u003e\u003cp\u003eIntermediate positions may be unstable. You are only required to determine whether the final configuration is stable.\u003c/p\u003e\u003cp\u003e\u003cb\u003eExamples\u003c/b\u003e:\u003c/p\u003e\u003cp\u003eExample (1)\u003c/p\u003e\u003cpre\u003e x = [0 0.4];\u003c/pre\u003e\u003cimg src = \"http://www.alfnie.com/software/equilibrium01a.jpg\"\u003e\u003cp\u003eThe first block bottom-left corner is at (0,0) and the second block falls on top of it, with its bottom-left corner at (0.4 1). This configuration is stable so your function should return \u003ci\u003etrue\u003c/i\u003e.\u003c/p\u003e\u003cp\u003eExample (2)\u003c/p\u003e\u003cpre\u003e x = [0 0.6];\u003c/pre\u003e\u003cimg src = \"http://www.alfnie.com/software/equilibrium01b.jpg\"\u003e\u003cp\u003eThe first block bottom-left corner is at (0,0) and the second block falls on top of it, with its bottom-left corner at (0.6 1). This configuration is unstable (the second block will fall) so your function should return \u003ci\u003efalse\u003c/i\u003e.\u003c/p\u003e\u003cp\u003eExample (3)\u003c/p\u003e\u003cpre\u003e x = [0 1.5 0.6];\u003c/pre\u003e\u003cimg src = \"http://www.alfnie.com/software/equilibrium01c.jpg\"\u003e\u003cp\u003eThe three block bottom-left corner coordinates are (0,0) (1.5,0) and (0.6,1). This configuration is stable so your function should return \u003ci\u003etrue\u003c/i\u003e.\u003c/p\u003e\u003cp\u003eExample (4)\u003c/p\u003e\u003cpre\u003e x = [0 .9 -.9 zeros(1,5)];\u003c/pre\u003e\u003cimg src = \"http://www.alfnie.com/software/equilibrium01d.jpg\"\u003e\u003cp\u003eThis configuration is unstable, but note that if instead of five we add a few more blocks on top of this at the 0 position that will keep the tower from falling!\u003c/p\u003e\u003cp\u003eExample (5)\u003c/p\u003e\u003cp\u003ex = cumsum(fliplr(1./(1:8))/2);\u003c/p\u003e\u003cimg src = \"http://www.alfnie.com/software/equilibrium01e.jpg\"\u003e\u003cp\u003eThis configuration is stable (see the \u003ca href = \"http://en.wikipedia.org/wiki/Block-stacking_problem\"\u003eclassic optimal stacking solution\u003c/a\u003e) so your function should return \u003ci\u003etrue\u003c/i\u003e.\u003c/p\u003e\u003cp\u003e\u003cb\u003eDisplay\u003c/b\u003e\u003c/p\u003e\u003cp\u003eIf you wish, you may display any given block configuration \u003cb\u003ex\u003c/b\u003e using the code below:\u003c/p\u003e\u003cpre\u003e clf;\r\n y=[];\r\n for n=1:numel(x), y(n)=max([0 y(abs(x(1:n-1)-x(n))\u0026lt;1)+1]); end\r\n h=arrayfun(@(x,y)patch(x+[0,1,1,0],y+[0,0,1,1],rand(1,3)),x,y);\r\n text(x+.5,y+.5,arrayfun(@num2str,1:numel(x),'uni',0),...\r\n 'horizontalalignment','center');\u003c/pre\u003e\u003cp\u003eVisit \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/problems/1910-block-canvas\"\u003eBlock canvas\u003c/a\u003e for a related Cody problem.\u003c/p\u003e","function_template":"function y = equilibrium(x)\r\n  y = true;\r\nend","test_suite":"%%\r\nx = [0 0.6];\r\nassert(isequal(equilibrium(x),false))\r\n\r\n%%\r\nx = [0 0.4];\r\nassert(isequal(equilibrium(x),true))\r\n\r\n%%\r\nx = [0 1.5 0.6];\r\nassert(isequal(equilibrium(x),true))\r\n\r\n%%\r\nx = cumsum(fliplr(1./(1:16))/2);\r\nassert(isequal(equilibrium(x),true))\r\n\r\n%%\r\nx = [1.5 2.5 1 0.25 5.5 3.5 -1.5 -0.25 -4 -1.75 6.25 -1.25 0.5 1 -0.5 4.75 -1.25 -1.5 0.5 1.5];\r\nassert(isequal(equilibrium(x),false))\r\n\r\n%%\r\nx = [-1.5 -0.25 -0.25 -1.75 1.75 -2 -5.25 2.25 0.75 -0 0.25 0 -1 -1.5 4.75 -1 4.75 -2.5 3.25 -1];\r\nassert(isequal(equilibrium(x),true))\r\n\r\n%%\r\nx = [1.25 -1.75 -0.75 2.75 -1.5 3.75 1.75 1.5 -0.25 -4 -0.5 -2 1.75 -3.5 -2 -3.75 0 -1.75 1.75 3.25 -1.5 -0.5 1.25 -2 1.5 3 -0.25 1.75 -0.5 2.75 0.5 -4.25 1.5 5.5 3 4.25 2.75 -0.75 0.5 3 3.5 3.25 1.75 1.5 3.25 2.5 5.5 -2 -3.75 -1 5 0.25 -3.75 5.5 1.75 2 1.75 0.5 -3.75 1.5 -0 2 0.5 0 -0.25 0.25 -9 1.75 -3.75 1.25 -3.75 -0 1.75 3.5 -3.75 3.75 -5.75 1.25 3.5 1.5 -2 2 -2.5 -1.5 3 1.75 -1.5 3.25 1.75 -1.5 1.25 -2.5 1.25 -4.25 3.25 -2.5 1.75 1.75 7.25 3.5];\r\nassert(isequal(equilibrium(x),true))\r\n\r\n%%\r\nx = [-0.5 1.5 3.5 0.5 -5.75 2 -1.5 0.25 -0.25 -3 -0.25 3 -3.5 -4.5 1.75 -0.25 0.75 3 0.25 -2.5 2.25 -0.25 1.75 -1.5 -5 -0 -0.5 -2 -0 4.75 -0 2 3.5 1.5 -2.25 3.5 -0.5 4.5 2.5 0.5 1.75 3.5 -0 -2.25 -0.25 -4.75 -2.5 -0.75 -6 2.75 -5 2.25 1 -2.25 -0.75 -0.25 -3.5 0.75 -0 -0.5 -0.5 -1.75 -2 -0.25 -0.25 5 -0.25 -0.75 -0.25 -5 -2 -0.25 -5.5 -5 -0.5 -2 1 -0.75 2 3.25 4.5 2.25 1.25 -0.25 -0.5 -0.25 -2.5 -5 2.25 -2 7.5 6.5 2.25 -0.25 -0.5 7.25 -2.5 1 -2.5 -4.75];\r\nassert(isequal(equilibrium(x),false))\r\n\r\n%%\r\nx = [0.1 0.1 -4.6 -0.4 -1.5 1.6 3 2.7 2.3 -2.7 0.1 -1.7 0 4.4 3.8 -0.4 -2 -0.6 3.3 2.5 -3 -1.7 3.1 2.7 2.7 3.1 -0.4 1.1 -0.2 -0.1 -0.3 2.7];\r\nassert(isequal(equilibrium(x),true))\r\n\r\n%%\r\nx = [0.1 0.1 -4.6 -0.4 -1.5 1.6 3 2.7 2.3 -2.7 0.1 -1.7 0 4.4 3.8 -0.4 -2 -0.6 3.3 2.5 -3 -1.7 3.1 2.7 2.7 3.1 -0.4 1.1 -0.2 -0.1 -0.3 2.7 -1.8 2.3];\r\nassert(isequal(equilibrium(x),false))\r\n\r\n%%\r\nx = [-3.5 2.6 -0.7 -1.1 -2.6 -2 0.8 -0.7 2.7 0.4 -5 3.7 -1.2 -1.3 2.8 0.8 -1.5 -1.8 0 -0 4.8 -1.4 -1.2 -1.5 1 0.2 2.6 1.7 1.6 -1.3 2.1 -1.5 -1.4 2 0.1 -0.1 -0.1 4.6 -3 -0.3 0.2 -1.9 -0 0.1 0 2.1 -1.7 -3.1 -0 0.2 -0.1 -0.5 4.7 -1.8 -0.1 -2.2];\r\nassert(isequal(equilibrium(x),false));\r\n\r\n%%\r\nx = [-2.5 2.6 -0.7 -1.1 -2.6 -2 0.8 -0.7 2.7 0.4 -5 3.7 -1.2 -1.3 2.8 0.8 -1.5 -1.8 0 -0 4.8 -1.4 -1.2 -1.5 1 0.2 2.6 1.7 1.6 -1.3 2.1 -1.5 -1.4 2 0.1 -0.1 -0.1 4.6 -3 -0.3 0.2 -1.9 -0 0.1 0 2.1 -1.7 -3.1 -0 0.2 -0.1 -0.5 4.7 -1.8 -0.1 -2.2];\r\nassert(isequal(equilibrium(x),true));\r\n\r\n%%\r\nx =[0 .9 -.9 zeros(1,8)];\r\nassert(isequal(equilibrium(x),true))\r\n\r\n%%\r\nx =[0 .9 -.9 zeros(1,6)];\r\nassert(isequal(equilibrium(x),false))\r\n\r\n%%\r\nx = repmat([0 .7 -.7 0],1,2);\r\nassert(isequal(equilibrium(x),false))\r\n\r\n%%\r\nx = repmat([0 .6 -.6 0],1,2);\r\nassert(isequal(equilibrium(x),true))\r\n","published":true,"deleted":false,"likes_count":2,"comments_count":0,"created_by":43,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":3,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2013-10-02T08:49:59.000Z","updated_at":"2013-10-08T00:22:34.000Z","published_at":"2013-10-02T09:44:07.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\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/media/image2.JPEG\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"targetMode\":\"\",\"relationshipId\":\"rId3\",\"target\":\"/media/image3.JPEG\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"targetMode\":\"\",\"relationshipId\":\"rId4\",\"target\":\"/media/image4.JPEG\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"targetMode\":\"\",\"relationshipId\":\"rId5\",\"target\":\"/media/image5.JPEG\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"targetMode\":\"\",\"relationshipId\":\"rId6\",\"target\":\"/media/image6.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\u003eIs this tower of blocks going to fall?\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:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eDescription\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eGiven a stacking configuration for a series of square blocks, your function should return\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003etrue\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e if they are at equilibrium and\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003efalse\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e otherwise.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe block configuration for N blocks is provided as a input vector\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ex\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e with N elements listing the\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ex-coordinates\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e of the left-side of each block. The blocks are square with side equal to 1 (so the i-th block left side is at x(i) and its right side is at x(i)+1). The\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ey-coordinates\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e of each block are determined implicitly by the order of the blocks, which are dropped \\\"tetris-style\\\" until they hit the floor or another block.\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\u003eAll blocks are identical (same dimensions and mass) and perfectly smooth (friction is to be disregarded).\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\u003eIntermediate positions may be unstable. You are only required to determine whether the final configuration is stable.\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\u003eExamples\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eExample (1)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ x = [0 0.4];]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw: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=\\\"rId2\\\"/\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\u003eThe first block bottom-left corner is at (0,0) and the second block falls on top of it, with its bottom-left corner at (0.4 1). This configuration is stable so your function should return\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003etrue\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eExample (2)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ x = [0 0.6];]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw: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=\\\"rId3\\\"/\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\u003eThe first block bottom-left corner is at (0,0) and the second block falls on top of it, with its bottom-left corner at (0.6 1). This configuration is unstable (the second block will fall) so your function should return\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003efalse\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eExample (3)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ x = [0 1.5 0.6];]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw: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=\\\"rId4\\\"/\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\u003eThe three block bottom-left corner coordinates are (0,0) (1.5,0) and (0.6,1). This configuration is stable so your function should return\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003etrue\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eExample (4)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ x = [0 .9 -.9 zeros(1,5)];]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw: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=\\\"rId5\\\"/\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\u003eThis configuration is unstable, but note that if instead of five we add a few more blocks on top of this at the 0 position that will keep the tower from falling!\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eExample (5)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003ex = cumsum(fliplr(1./(1:8))/2);\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw: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=\\\"rId6\\\"/\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\u003eThis configuration is stable (see the\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://en.wikipedia.org/wiki/Block-stacking_problem\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eclassic optimal stacking solution\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e) so your function should return\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003etrue\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eDisplay\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\u003eIf you wish, you may display any given block configuration\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ex\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e using the code below:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ clf;\\n y=[];\\n for n=1:numel(x), y(n)=max([0 y(abs(x(1:n-1)-x(n))\u003c1)+1]); end\\n h=arrayfun(@(x,y)patch(x+[0,1,1,0],y+[0,0,1,1],rand(1,3)),x,y);\\n text(x+.5,y+.5,arrayfun(@num2str,1:numel(x),'uni',0),...\\n 'horizontalalignment','center');]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eVisit\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/problems/1910-block-canvas\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eBlock canvas\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e for a related Cody problem.\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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\"},{\"partUri\":\"/media/image2.JPEG\",\"contentType\":\"image/JPEG\",\"content\":\"data:image/JPEG;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCACvAOkDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACmtTqa1RU+EaEopKK5LjFopKKLgLRSUUXAWikoouAtFJRRcBaKSii4C0L1pKVetXB+8gH0UUV1khRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB3pj0+mOelZVfgY0JmjNNzRmuG5Q7NGabmjNFwHZozTc0ZouA7NGabmjNFwHZozTc0ZouA7NGabmjNFwFpy9aZmnL1rSm/eQiSiiiu8kKKKKACiiigAooooAKKKKACiiigAooooAKgnbaVzU9Ur99vl/jWdVe6xPRC7x60u8etUfO/wA5o87/ADmuHlI5mXt49aN49ao+d/nNHnf5zRyhzMvbx60bx61R87/OaPO/zmjlDmZe3j1o3j1qj53+c0ed/nNHKHMy9vHrRvHrVHzv85o87/OaOUOZl7ePWjePWqPnf5zR53+c0coczL28etOhYF8e1Z/nf5zViyfdOR/s1dONpIad2aNFFFd5YUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVl6u+ww84zu/pWoKxPED7Tb4/2v6VMloTLYp+b70eb71Q84/wCTR5x/yaw5DC5f833o833qh5x/yaPOP+TRyBcv+b70eb71Q84/5NHnH/Jo5AuX/N96PN96oecf8mjzj/k0cgXL/m+9Hm+9UPOP+TR5x/yaOQLl/wA33o833qh5x/yaPOP+TRyBcv8Am+9XdLk3XRGf4TWH5x/ya09DfdfMP+mZ/mKcY2ZUXqdHRRRXQbhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXOeKW2m0/4H/7LXR1yvjJtpsv+B/+y0WuRU+ExfOo86qPm0ebS5Ecty951HnVR82jzaORBcvedR51UfNrPlv7kXMqIYgiMANykn7oPr71dOi5uyMqteNKPNLY3vOo86ue+33n96D/AL9n/wCKo+33n96D/v2f/iq3+oVexyf2ph+50PnUedXPf2hef3oP+/Z/+KqzaXc0pcSmPjGNqkf1NTPCTgryRpSx9GrLli9TY86jzqo+bR5tc/IjsuXvOrY8NybtSYf9Mj/MVzPm1ueE5N2rOP8Apif5ijlsVB+8jtqKKKZ1hRRRQAUUUUAFFFFABRRRQAUUUUAFFFFACVx/jttv2D/tp/7LXYVw/wAQ32/2d7+Z/wCy1UdzOr8DOX82jzao+b70eb71tyHDcvebR5tUfN96PN96OQLl7zaoht1zcn/bH/oC0eb71FbHdLcn/poP/QFrpwsbVDgzJ/uGWKKKjTf50hO7ZxtBI/HHH869U+bSuSVLA20tUVNZtrVz4rWmzty7+Oi75tHm1R833o833ryeQ+muXvNrovBb7tacf9MG/mtcf5vvXT+A5N2vSD/p3b/0JaUo2RdN+8j0iigUVgd4UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAlcB8S32HS/8Atr/7JXf15z8VG2nSf+23/slaUvjRlW+BnE+dR51Z/nUedXbynnXNDzqPOrP86liMtxd29rCFMs7FV3tgAhWbng/3aibjTi5yeiDmL/nVLYNu+0n/AKa/+yLR/wAI/q3pZf8Af5//AIirFlo2p2yyh1tG3vu4mb0A/ue1cdHOsDGV3URwY2SqUnGL1JKKl/s/Uf8Anna/9/2/+IqG7hvrO1e4kityqYyFmOeuP7ld0M8wE5KMaiuzxVhqj6C1Wu32Mn0qn/bD/wDPsn/f3/7GoJ75rgrujVNvo+c/pXbVqRlGyO7B4WrTqqUloW/Oo86s/wA6jzq4+U9u5oedXWfDyTd4ikH/AE7N/wChLXB+dXZfDSTd4mlH/Tq//oS1FSPusuk/fR63RQKK4T0wooooAKKKKACiiigAooooAKKKKACiiigA7V5h8XX2nR/fzv8A2nXp9eU/GZtp0X/tv/7Tragv3iMcQ/3bPOfN9xR5vuKo+aaPNNenyHlXL3m+4q7or7vEuljj/Wuf/IUlYnmmtLw6+7xTpg/6aSf+ipK4M1jbB1H5MUn7r9D02iioJ5ZY5rZY49ySSFZDg/KNjHP5gD8a/I4xcnZHmJXJ6zPEHGhXP0X/ANCFadZfiM48P3Z/2R/MV0YH/eYeqKp/GjgvN9xR5vuKo+aaPNNfsUY6HpXL3m+4o833FUfNNHmmnyBcveb7iu4+Fkm7xVMP+nR+n+8lec+aa7z4SPu8XTD/AKc3/wDQ0rKtG0Ga0X76PbqKKK8s9YKKKKACiiigAooooAKKKKACiiigAooooASvI/je+06F/wBvH/tOvXa8V+P15Danw/5r7d32nGQT/wA8v8a2w7SqJsxrpum0jzHzv85o87/OaxP7Ys/+e4/75P8AhR/bFn/z3H/fJ/wr1/aU/wCZHl+yqdjb87/Oa1/Cr7vFmmj/AG5P/RT1xv8AbFn/AM9x/wB8n/CtXw14j0yw8SWV3c3OyCJnLsEY4zGyjgD1IrhzNxng6kYO7aYexqWejPc6K5L/AIWZ4S/6Cn/kCT/Cj/hZnhL/AKCn/kCT/Cvyr+zcX/z7f3HD9Wrfys62sjxOceG74/7H9RWT/wALM8Jf9BT/AMgSf4Vm6/8AEHwze6FeW1vqO+aRMIPJfk591rpweX4mOIhKUGlddCoYaqpJ8rOR87/OaPO/zmsT+2LP/nuP++T/AIUf2xZ/89x/3yf8K/WYzp2+JHZ7Kp2Nvzv85o87/OaxP7Ys/wDnuP8Avk/4Uf2xZ/8APcf98n/Cn7Sn/Mg9lU7G353+c16D8HX3eMpx/wBOT/8AoaV5H/bFn/z3H/fJ/wAK9L+B9/b3Xjm4SKQMwsHOMH++lZV5wdN2ZpRpzU02j6Iooorxz1gooooAKKKKACiiigAooooAKKKKACiiigArwD9pn/mV/wDt7/8AaNe/18//ALTXTwv/ANvf/tGgDwCiiigAooooAKKKKACiiigAooooAKKKKACvXP2df+SjXX/YMl/9GR15HXrn7On/ACUW7/7Bkn/oyOgD6jooooAKKKKACiiigAooooAKKKKACiiigAooooAK+f8A9prp4X/7e/8A2jX0BXz/APtNdPC//b3/AO0aAPAKKKKACiiigAooooAKKKKACiiigAooooAK9c/Z0/5KLd/9gyT/ANGR15HXrn7On/JRbv8A7Bkn/oyOgD6jooooAKKKKACiiigAooooA//Z\"},{\"partUri\":\"/media/image3.JPEG\",\"contentType\":\"image/JPEG\",\"content\":\"data:image/JPEG;base64,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\"},{\"partUri\":\"/media/image4.JPEG\",\"contentType\":\"image/JPEG\",\"content\":\"data:image/JPEG;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCACvAOkDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACmHrT6jPWsaz0GhaKSiue4xaKSii4C0UlFFwFopKKLgLRSUUXAWikoouAtFJRQmBJRRRXciQooooAKKKKACiiigAooooAKKKKACiiigAqM9TUlRE/NXPiHohoXNGaTNGa5LlC5ozSZozRcBc0ZpM0ZouAuaM0maM0XAXNGaTNGaLgLmjNJmjNFwFzRmkzRmmnqBLRRRXpIgKKKKACiiigAooooAKKKKACiiigAooooAKrO2HPNWazJpMTOPeufEK6Qm7Fnd70bveqfm+9Hm+9cnKTzFzd70bveqfm+9Hm+9HKHMXN3vRu96p+b70eb70cocxc3e9G73qn5vvR5vvRyhzFzd70bveqfm+9Hm+9HKHMXN3vRu96p+b70eb70cocxc3e9G/3FU/N96PN96ajqHMa3aijtRXpIsKKKKACiiigAooooAKKKKACiiigAooooASsK5kxcyD/ardrlr2TF9MP9s1nUV0RPYn833o833qj5v1o8361hymVy95vvR5vvVHzfrR5v1o5QuXvN96PN96o+b9aPN+tHKFy95vvR5vvVHzfrR5v1o5QuXvN96PN96o+b9aPN+tHKFy95vvR5vvVHzfrR5v1o5QuXvN96PNqj5v1o8360cgXOxHSikHQUtdZ0BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFACVxeoy7dRuB/00NdpXAatJjVrof9NDSauZVdh3nUedVHzf85o83/OankMLl7zqPOqj5v8AnNHm/wCc0cgXL3nUedVHzf8AOaPN/wA5o5AuXvOo86qPm/5zR5v+c0cgXL3nUedVHzf85o83/OaOQLl7zqPOqj5v+c0eb/nNHIFy951HnVR83/OaPN/zmjkC56WOlLSDpS1Z2BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXmetS7davBn/lq1emV5RrsgGvXw/6bNVQV2YV/hGed70ed71R82jza05DluXvO96PO96o+bR5tHIFy953vR53vVHzfejzh61NorcpKT2Re873o873qj5w9aPN9DRaPcOWXYved70ed71R82jzarkJuXvO96PO96o+bR5tHIFy953vR53vVHzaPNpcg0z2cdKWgdKKyPQQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAGvHPEMmPEV+P+mzfzr2M14j4lkx4m1If9N2/nW1FXZz4l+6iDzfcUeb7iqPm0ebXRynFcveb7ijzfcVR82jzaOULjC27Wrn/r3i/9CkqxVGBt2r3X/XvF/wChSVdckIcEA44JGQK+OzOTWKkkz9AyeMXg4NoWnIdrg1FEWaNS+N3fAwDSudq596wwjl9Yir9Tox0I/VZtLoy35vuKPN9xVHzaPNr7jlPze5e833FHm+4qj5tHm0coXL3m+4o833FUfNpPNocRp6n0GOlLSDoKWuE9NBRRRQMKKKKACiiigAooooAKKKKACiiigANeC+KZMeKtTGf+Xh/5170a+ePFsmPFuqj/AKeX/nXThleTOXFP3UVfOo86qHm0ebXbynBcv+dR51Rabbi+uZ0eSRVjRCNmOpLeo9hWj/Y0X/PxP/47/wDE1yVMVThJxZyVsdSpT5JblOwbdqt3/wBcIv8A0KStOoY9ISGV5I7m4VnUKx+TkDOP4fc0y+t5bezklS9n3LjqI/X/AHa+axeFlicQ5Qe59RlfFmCpUY0ZJ3LNRXLbYGNYn2u7/wCf2X/viP8A+JrMv9T1Bbkwi9k8vy1bBROuT/s+1bUcmr0akakmrJnq4nP8NWoypxTu0dB51HnVyn269/5+n/75T/Cj7de/8/Tf98p/hX0ftYnx1zq/Oo86ubs7y6e7jWS4Z1OcqVXnj2Favm1rC0loF7F/zqPOqh5tHm1TjoCep9PjpS0g6ClryT11sFFFFAwooooAKKKKACiiigAooooAKKKKAEr5u8YygeMtXH/T0/8AOvpE18xeNZceNtZH/T0/867MErzOPGP3UZ/m/SjzfpVHzh/k0ecP8mvT5TzrnT+Gm33N6f8AYiH6vXQkgDPYelcz4SbdPfH/AGYv5vXT18zjP40j53Mf94fy/IbFIJYkkXIV1DAH3qnrLbdJmP8Au/8AoQq6FCqFUAKBgAdqztfO3RLg/wC7/wChCow/8WJhh7e3jbuct5vuKzrtt98x/wCmS/zan+cP8mq7tuu3P+wv82r6HERtA+ri73FJwCQM+1IrblBHf1pSARgj8KK4B9CW2O24Q+/9K0PN+lZiNtdT71L5w/ya7sMrxFJl7zfpR5v0qj5w/wAmjzh/k10OOhKep9dj7opRSD7opRXgnuLYKKKKBhRRRQAUUUUAFFFFABRRRQAUUUUAJXyT4+1mCDx9rsTLJuS8kBwB2P1r63r4q+JX/JS/Ef8A1/y/zrSlVlTd4mdSnGorSIv7ftv7sv8A3yP8aP7ftv7sv/fI/wAa5qit/rtUy+qUux3Wh+NbTSmuC9tLIJQmOQCMZ/xrY/4WfYf8+E//AH2K8uorjqRU5OUtzCpleGqS5pR1PUf+Fn2H/PhN/wB9iqmp/EOyv9Oltls5kL45LA4wQf6V5zS9KUIKDUkTDKMLBqSjqdH/AG/bekv5D/Gmf29AsrMI3YFQOcA8Z/xrns0CuqeJqTVmdSwtNdDof+Eih/54P+dH/CRQ/wDPB/zFc9RWPMx/V6fY6MeIISeYZB7gil/t+29Jf++R/jXN0lbQxE4KyE8LTfQ6X+37b+7L/wB8j/Gj+37b+7L/AN8j/Guapav65VF9Vpdj79HAFLRRXIdIUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV8VfEr/kpfiP/r/l/nX2rXxV8Sv+Sl+I/wDr/l/nQBytFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH3/RRRQAUUUUAFFFFABRRRQB/9k=\"},{\"partUri\":\"/media/image5.JPEG\",\"contentType\":\"image/JPEG\",\"content\":\"data:image/JPEG;base64,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\"},{\"partUri\":\"/media/image6.JPEG\",\"contentType\":\"image/JPEG\",\"content\":\"data:image/JPEG;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCACvAOkDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACiiigAooooAYfvUlK3Wkrjm9WUhaKSipuAtFJRRcBaKSii4CjrT6jHWpK6KOwmFFFFbCCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAIz96ihutJXBN+8yxaKSiouAtFJmm70/vD86OYV0Popm9ezD86dRcLijrUlRDrUvauqg7piYUUUV0CCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAIXOHNN3VFNJtmYVH5vvXnTXvMnmsWd1G6q3m+9Hm+9RYOcg1xs6Df8A/XvJ/wCgmvN7i5htY/MnYoucZwT2z2+n9K9B1mTOh3wz/wAu8n/oJrz25tYbuPy503LnOM47Y/kSPxrysxfvR7Hh5tJuUS3bYF1Ccfxj+demhuBXmNvxcxH/AGx/OvRvN96vLU+R37muUuShK/cshuRU4qgsmXUZ71fr3cPsz2E7i0UUV0jCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAMi8fbdOPp/KofNpmoybb+UfT+Qqr5tcko+8zFvUu+bWfrkmfD+pD/AKdZf/QDT/NqlrMmdD1Af9O0v/oBqJQ91ku7TsecMwQZPA45qxZH/Trc/wDTRf51AQGGCM8jr61Na8XkJ/6aL/OvAjGXOro87klzK6PWfMFL5tUvNo82vfUD0VZbF+KTM0f+8K2xXM28mbmIf7Y/nXSiuikrI1gxaKKK2LCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAOV1d9uqTD/AHf/AEEVS8z3qTXH26xcD/d/9BFZ3m+9ZuOpyyepd80VxPi1t2uIf+nZP/QnrqfN965HxKS2sKf+ndP/AEJ61oR989TJpRWKXNsYkU0UxcRuGKMVbHY5x/Suz8INts7kf9NB/KuMjgjid3RMM5y3+fxP511fhd9ttOP9sfyravGPJse5nLpvC6WvfodX5nvR5nvVLzfejzfeuPlPjrmnayZvIf8Arov867AVwdlL/p1uM/8ALVf513oq4qxtSCiiiqNQooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDgvET7dduR/u/+giszzKs+KHx4iuh/uf+gLWR5vvVKNzim/eZe8yqumyxQeH7KWZ1jjW2jLMxwANoqvNdxW0TSzypHGvV3baBn3NM03VNLOiWcL6jbKfsyKwFwqkHaO4OQauKseJm7laPLf5G0pV1DIQysMgg8Gs7SZMaNYj/AKd4/wD0EU5NX0iCJY11KzCIoUZuFPA/Gs/SpR/ZFlz/AMu8ff8A2RRJXJyZ1Fz897abm15lHmVR833o833qeU9u5rWEmdStf+uqfzr0evK9Mlzqtpz/AMt0/wDQhXqnapasdFF3QtFFFI3CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPLvFsm3xPeD/c/wDQFrF833/WtHxlJt8V3o/3P/QFrC873/WumMdDzqj95liWTLW4/wCnmH/0YtdJcXUdqsbSZw8ixLgd2OBXGz3tvbyWzXE8USm5i5kcKOHU9/8APFdHLrOgTlDLqWmyGNg6Fp4ztYdCOetbQskeLmMJSmrLQd4gONIY/wDTeD/0atZnm+/60/XNa0u50ow2+pWk0rTQ7UjnVmP71OwNUPO9/wBaU0m9Doy6LjSfMrFzzff9aPN9/wBap+d7/rR53v8ArUcp6FzX0qTOr2XP/LxH/wChCvXx0rxXSJc61YjP/LxH/wChCvah0rGqrHVh3dMWiiisjpCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPG/HEm3xhfj/rn/wCi1rnvN962PHsm3xrqA/65/wDota5vzfevQpxvFHl1X77Mjxc+61th/tn+Vcln5gCPxro/FNxH5VujSIG3E4Lc4rmvOiP/AC0T/vqolCV9DSCujf8ACjbdZc5/5d2/9CSuz833rhfDMq/2s5Vwf3DZwf8AaWuu833q4RdjOpoy55vvR5vvVPzfejzfer5SLm1osmdd0/n/AJeY/wD0IV7sOlfP2hy58QaaM/8AL1F/6GK+gR0rkxCs0dmFd0xaKKK5zrCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPCPiG+3x1qQ/65/wDopa5fzff9a3viRJt8famP+uX/AKKSuV833r1qMfcR5FV++yeBt2pTnP8Ayxi/m9WVl3TPGUIK4OSRyD+v51mWt1Cl/ceZNGn7qMDcwHQv/iKui8sgSRcwZbriQV62HqUlTSbVzppyXKiPds1Sbn/ljF/6E9Teb7/rWfJcxSalK0UiOvkxglGzzl6k833rirJOo3HY56z95lzzff8AWjzff9ap+b70eb71lymVzd0CT/iotL5/5e4v/QxX0aK+Z/D0ufEulD/p8h/9DFfTA6VwYtWaO/CO6YtFFFch2BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAHzp8Tn2/EPVR/1y/wDRSVyPm+/610HxVuoY/iTq6PMisPJyCwH/ACxSuO+3W/8Az3j/AO+xXtUHH2auzx6sZObsj0fwec6TMf8Apuf/AEFa3wc9vzrkfB+r6bDo7rNqFrG5mJ2vMqnGF9T0roP7c0j/AKCtj/4EJ/jXxmMU/byte1z53FUqzqysmcX4ifb4ivR/tJ/6LWszzff9af4k1Gzk8RXjxXUDoSmGWQEH5FrL+3W//PeP/vsV9dgmvq8bvWx7dKE+SN10Ro+b7/rR5vv+tZ3263/57x/99ij7db/894/++xXVePcvkn2Ok8OSZ8UaR/1+w/8AoYr6lHSvkvwxewN4s0YCaMk30GBvH99a+tB0rzcbbmVjvwaaTuhaKKK4jtCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPkD42n/i72u/8Abv8A+k8def5PrXoHxt/5K9rv/bv/AOk8def0XAXcR3NG9v7x/OkooCwpJJ60mT60UUXAMn1oyfWiindgbng0/wDFceH/APsJW3/o1a+46+G/Bv8AyPHh/wD7CVv/AOjVr7kpAFFFFABRRRQAUUUUAFFFFABRRRQB/9k=\"}]}"},{"id":1942,"title":"GJam 2014 China Rd B: Party","description":"This Challenge is derived from \u003chttp://code.google.com/codejam/contest/2929486/dashboard#s=p1 GJam 2014 China Party\u003e. Small Case.\r\n\r\nThe Goal is determine the optimal Party House. Given a set of people to attend a party, select the home from this set that minimizes the total travel of people. People travel only NSEW, no diagonals, to reach the host's home. If multiple homes have equal distance then select the home with minimum X. If there are more than one with Min distance and equal Min X then choose the house with Min Y.\r\n\r\nThe input is an array that defines rectangles of partiers. One line of the array is [xmin,ymin,xmax,ymax]. Blocks do not overlap.\r\n\r\n\r\n*Input:* [M], Bx4 matrix (B\u003c=100). Total B area of \u003c=1000\r\n\r\n*Output:* [x,y,d] where [x,y] is Party House and d is everyone's total distance\r\n\r\n*Examples:*\r\n\r\n  M   [x y d]\r\n  [0 0 2 2] [1 1 12]\r\n  [-1 2 -1 2;0 0 0 0;1 3 1 3] [-1 2 6]\r\n\r\n \r\n*Contest Performance:* Best Delta Time of 16 minutes with 496 of 2010 able to process the small data set. The large data set was only achieved by 47 in the 3 hrs of contest duration.\r\n\r\n\r\n*Commentary:*\r\n\r\n  1) The small can be solved by brute force since fewer than 1000 points require evaluation.\r\n  2) The large case, which is giving me fits, has up to 1,000,000 points to evaluate.\r\n  3) Graphing the small case with surf gives some unexpected asymmetric results relative to the simple centroid.","description_html":"\u003cp\u003eThis Challenge is derived from \u003ca href = \"http://code.google.com/codejam/contest/2929486/dashboard#s=p1\"\u003eGJam 2014 China Party\u003c/a\u003e. Small Case.\u003c/p\u003e\u003cp\u003eThe Goal is determine the optimal Party House. Given a set of people to attend a party, select the home from this set that minimizes the total travel of people. People travel only NSEW, no diagonals, to reach the host's home. If multiple homes have equal distance then select the home with minimum X. If there are more than one with Min distance and equal Min X then choose the house with Min Y.\u003c/p\u003e\u003cp\u003eThe input is an array that defines rectangles of partiers. One line of the array is [xmin,ymin,xmax,ymax]. Blocks do not overlap.\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e [M], Bx4 matrix (B\u0026lt;=100). Total B area of \u0026lt;=1000\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e [x,y,d] where [x,y] is Party House and d is everyone's total distance\u003c/p\u003e\u003cp\u003e\u003cb\u003eExamples:\u003c/b\u003e\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003eM   [x y d]\r\n[0 0 2 2] [1 1 12]\r\n[-1 2 -1 2;0 0 0 0;1 3 1 3] [-1 2 6]\r\n\u003c/pre\u003e\u003cp\u003e\u003cb\u003eContest Performance:\u003c/b\u003e Best Delta Time of 16 minutes with 496 of 2010 able to process the small data set. The large data set was only achieved by 47 in the 3 hrs of contest duration.\u003c/p\u003e\u003cp\u003e\u003cb\u003eCommentary:\u003c/b\u003e\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003e1) The small can be solved by brute force since fewer than 1000 points require evaluation.\r\n2) The large case, which is giving me fits, has up to 1,000,000 points to evaluate.\r\n3) Graphing the small case with surf gives some unexpected asymmetric results relative to the simple centroid.\r\n\u003c/pre\u003e","function_template":"function [x,y,d]=Party_CH(p)\r\n x=0;\r\n y=0;\r\n d=0;\r\nend","test_suite":"%%\r\ntic\r\nzm=[0 0 30 30 ];\r\nvexp=[15 15 14880];\r\n[x y d]=Party_CH(zm);\r\nv=[x y d];\r\nassert(isequal(v,vexp))\r\n%%\r\nzm=[0 0 29 29 ];\r\nvexp=[14 14 13500];\r\n[x y d]=Party_CH(zm);\r\nv=[x y d];\r\nassert(isequal(v,vexp))\r\n%%\r\nzm=[0 1 0 100 ;0 -100 0 -1 ;-100 0 -1 0 ;1 0 100 0 ];\r\nvexp=[-1 0 20400];\r\n[x y d]=Party_CH(zm);\r\nv=[x y d];\r\nassert(isequal(v,vexp))\r\n%%\r\nzm=[616 34 616 34 ;78 -828 78 -828 ;-762 -671 -762 -671 ;-199 -960 -199 -960 ;427 -575 427 -575 ;448 798 448 798 ;-819 -939 -819 -939 ;852 -564 852 -564 ;-145 281 -145 281 ;694 828 694 828 ;-278 963 -278 963 ;47 813 47 813 ;-393 24 -393 24 ;198 -257 198 -257 ;-393 -177 -393 -177 ;596 237 596 237 ;-678 760 -678 760 ;-180 92 -180 92 ;-590 995 -590 995 ;27 -946 27 -946 ;459 799 459 799 ;-491 -739 -491 -739 ;-691 -922 -691 -922 ;-38 185 -38 185 ;495 -471 495 -471 ;-850 532 -850 532 ;-360 798 -360 798 ;589 -104 589 -104 ;-492 -364 -492 -364 ;-797 415 -797 415 ;105 319 105 319 ;-879 -347 -879 -347 ;-795 172 -795 172 ;529 831 529 831 ;357 -199 357 -199 ;621 959 621 959 ;-475 125 -475 125 ;769 884 769 884 ;172 -706 172 -706 ;618 222 618 222 ;989 734 989 734 ;-273 478 -273 478 ;-548 930 -548 930 ;-634 889 -634 889 ;599 879 599 879 ;836 834 836 834 ;463 901 463 901 ;972 -903 972 -903 ;-319 495 -319 495 ;-727 -368 -727 -368 ;-685 -487 -685 -487 ;834 902 834 902 ;-114 -961 -114 -961 ;-984 193 -984 193 ;-388 867 -388 867 ;712 232 712 232 ;-750 19 -750 19 ;855 -455 855 -455 ;857 996 857 996 ;493 -722 493 -722 ;-582 426 -582 426 ;-824 848 -824 848 ;479 -993 479 -993 ;-976 -820 -976 -820 ;208 443 208 443 ;919 745 919 745 ;-460 -548 -460 -548 ;375 556 375 556 ;-572 980 -572 980 ;345 -411 345 -411 ;-275 613 -275 613 ;718 -895 718 -895 ;-838 -892 -838 -892 ;-241 836 -241 836 ;336 -878 336 -878 ;891 -355 891 -355 ;-986 989 -986 989 ;629 856 629 856 ;-779 787 -779 787 ;970 711 970 711 ;-578 -163 -578 -163 ;779 735 779 735 ;572 -203 572 -203 ;237 192 237 192 ;-427 -213 -427 -213 ;-338 9 -338 9 ;-905 45 -905 45 ;64 -35 64 -35 ;476 -560 476 -560 ;-370 24 -370 24 ;-836 487 -836 487 ;53 50 53 50 ;540 -897 540 -897 ;-179 -8 -179 -8 ;-979 227 -979 227 ;528 257 528 257 ;-876 615 -876 615 ;-342 -895 -342 -895 ;802 -744 802 -744 ;-458 -395 -458 -395 ];\r\nvexp=[-38 185 110298];\r\n[x y d]=Party_CH(zm);\r\nv=[x y d];\r\nassert(isequal(v,vexp))\r\n%%\r\nzm=[241 -635 241 -635 ;75 -432 75 -432 ;-522 -517 -522 -517 ;-589 -931 -589 -931 ;-903 447 -903 447 ;-555 757 -555 757 ;-584 19 -584 19 ;420 -458 420 -458 ;-127 517 -127 517 ;-417 158 -417 158 ;542 703 542 703 ;865 -531 865 -531 ;-592 -191 -591 -190 ;570 467 570 467 ;-326 -668 -325 -668 ;197 516 197 516 ;238 -442 239 -441 ;-339 -71 -338 -70 ;255 -450 256 -450 ;408 -232 409 -231 ;302 -765 303 -764 ;-575 687 -575 688 ;-352 -651 -351 -650 ;-483 -96 -483 -95 ;285 170 286 170 ;-349 -660 -348 -659 ;518 -419 518 -418 ;555 -506 556 -506 ;900 97 901 98 ;-969 -258 -969 -257 ;-514 -199 -513 -198 ;-422 -197 -422 -197 ;-852 -115 -852 -114 ;166 -651 166 -650 ;628 -930 629 -930 ;-53 853 -52 853 ;484 503 484 504 ;-912 -976 -911 -975 ;-386 -562 -386 -561 ;521 946 521 947 ;717 -799 718 -797 ;-463 -348 -461 -348 ;-14 167 -13 169 ;-346 -677 -344 -675 ;-675 176 -673 179 ;894 807 896 811 ];\r\nvexp=[-338 -71 136630];\r\n[x y d]=Party_CH(zm);\r\nv=[x y d];\r\nassert(isequal(v,vexp))\r\n%%\r\nzm=[468 377 468 377 ;839 -105 839 -105 ;-871 487 -871 487 ;-307 651 -307 651 ;135 -929 135 -929 ;-411 -829 -411 -829 ;745 -64 745 -64 ;336 784 336 784 ;-875 -84 -875 -84 ;-723 -736 -723 -736 ;701 -818 701 -818 ;-239 210 -239 210 ;-15 614 -15 614 ;362 225 362 225 ;894 443 894 443 ;-352 -303 -352 -303 ;-287 254 -287 255 ;-739 -960 -739 -960 ;110 28 110 28 ;540 434 541 435 ;-103 -962 -102 -962 ;913 -274 913 -273 ;835 -730 836 -730 ;544 866 545 867 ;-97 -358 -96 -358 ;-490 -319 -490 -319 ;-122 700 -122 702 ;37 902 39 902 ;103 266 104 266 ;-581 -714 -579 -710 ];\r\nvexp=[-97 -358 62565];\r\n[x y d]=Party_CH(zm);\r\nv=[x y d];\r\nassert(isequal(v,vexp))\r\n%%\r\nzm=[28 122 30 124 ;-85 -609 -83 -607 ;763 19 764 20 ;612 -204 613 -203 ;-521 792 -520 794 ;-782 193 -781 195 ;-662 149 -661 151 ;-561 -568 -559 -567 ;-190 -897 -189 -896 ;-725 -317 -723 -315 ;704 -957 706 -956 ;-329 -967 -328 -966 ;-564 -639 -563 -637 ;-603 -86 -601 -84 ;-165 548 -164 550 ;-197 -150 -195 -148 ;-379 -581 -377 -579 ;401 -684 403 -683 ;546 -194 548 -192 ;267 573 268 574 ;-634 288 -632 290 ;593 857 595 858 ;78 -240 80 -238 ;800 981 801 982 ;473 472 474 473 ;-894 469 -893 471 ;582 347 583 349 ;516 189 518 190 ;333 -865 335 -864 ;-192 507 -191 508 ;-310 534 -309 536 ;-783 -487 -781 -486 ;-915 -696 -914 -695 ;-57 872 -56 874 ;717 -423 718 -422 ;509 -810 510 -809 ;-186 -335 -184 -333 ;-403 629 -401 631 ;-598 104 -596 106 ;-149 -210 -147 -208 ;920 911 922 913 ;819 -934 821 -932 ;518 -328 520 -326 ;-630 429 -628 431 ;348 -766 350 -764 ;242 -300 244 -298 ;387 -191 389 -189 ;-19 -871 -17 -869 ;383 723 385 725 ;-742 -327 -740 -325 ;-181 -43 -179 -41 ;799 -46 801 -44 ;729 -373 731 -371 ;-863 -16 -861 -14 ;998 -444 1000 -442 ;242 962 244 964 ;-249 -412 -247 -410 ;116 -14 118 -12 ;871 -455 873 -453 ;669 492 671 494 ;877 -447 879 -445 ;990 -938 992 -936 ;43 522 45 524 ;-70 45 -68 47 ;808 8 810 10 ;-879 -310 -877 -308 ;979 79 981 81 ;-695 202 -693 204 ;-650 469 -648 471 ;690 -624 692 -622 ;-169 -43 -167 -41 ;-81 723 -78 726 ;-789 968 -787 970 ;-913 698 -912 701 ;-597 -970 -595 -968 ;693 -79 694 -77 ;41 847 43 849 ;39 -728 41 -725 ;422 470 425 473 ;-518 -883 -517 -880 ;-858 784 -855 786 ;-246 311 -245 312 ;194 -715 197 -712 ;-370 -868 -369 -865 ;377 174 380 176 ;-697 223 -694 225 ;-489 -957 -486 -955 ;-585 -164 -583 -162 ;-283 -880 -281 -878 ;-141 -729 -140 -728 ;835 447 838 450 ;-424 -612 -423 -610 ;-280 376 -276 377 ;-351 -393 -350 -392 ;-793 -436 -788 -434 ;-548 -180 -547 -175 ;826 775 831 778 ;-664 -604 -658 -602 ;987 -65 988 -57 ;-540 -796 -533 -795 ];\r\nvexp=[-167 -43 874364];\r\n[x y d]=Party_CH(zm);\r\nv=[x y d];\r\nassert(isequal(v,vexp))\r\n%%\r\nzm=[-291 955 -289 956 ;276 -710 278 -708 ;-724 283 -722 285 ;-850 588 -848 589 ;625 -511 627 -509 ;-530 -994 -529 -993 ;-312 -655 -311 -654 ;86 -269 87 -267 ;565 -521 566 -520 ;438 320 440 321 ;-330 985 -328 986 ;-408 -942 -407 -940 ;755 792 756 794 ;847 -794 848 -793 ;436 -1 438 0 ;206 -637 208 -635 ;516 544 518 546 ;77 -200 78 -199 ;-618 276 -616 277 ;380 868 382 870 ;-664 284 -663 286 ;-526 929 -524 931 ;743 -555 745 -553 ;331 145 333 146 ;98 124 99 126 ;220 -661 222 -660 ;-92 498 -90 500 ;646 -552 647 -550 ;-531 -850 -529 -849 ;573 -80 574 -79 ;-317 299 -315 300 ;-963 713 -962 714 ;411 818 412 819 ;-99 -503 -97 -501 ;279 599 280 601 ;793 -237 794 -235 ;-41 -876 -39 -875 ;-550 -478 -549 -477 ;-107 820 -105 822 ;657 886 659 888 ;-460 684 -458 686 ;-80 455 -78 457 ;-779 -528 -777 -526 ;-829 719 -827 721 ;-760 -716 -758 -714 ;39 342 41 344 ;254 447 256 449 ;-272 -705 -270 -703 ;-900 507 -898 509 ;498 327 500 329 ;-669 168 -667 170 ;519 -367 521 -365 ;-674 323 -672 325 ;-724 519 -722 521 ;52 -596 54 -594 ;897 -724 899 -722 ;6 -387 8 -385 ;62 808 64 810 ;-84 -749 -82 -747 ;-475 -379 -473 -377 ;-467 -819 -465 -817 ;-130 232 -128 234 ;218 862 220 864 ;-206 339 -204 341 ;821 658 823 660 ;261 61 263 63 ;-704 869 -702 871 ;788 -490 790 -488 ;482 67 484 69 ;-328 -781 -326 -779 ;150 -117 152 -115 ;946 -90 948 -88 ;-68 477 -65 479 ;-704 915 -701 918 ;979 -761 980 -759 ;328 705 331 708 ;969 951 971 953 ;-638 991 -637 993 ;-621 120 -619 121 ;-546 651 -545 654 ;217 550 218 551 ;-743 196 -740 199 ;-591 847 -588 849 ;-48 -769 -46 -766 ;678 424 680 425 ;-250 268 -248 270 ;964 -389 966 -386 ;193 -818 195 -815 ;-803 107 -801 109 ;16 -725 19 -722 ;-721 -274 -720 -273 ;14 666 17 668 ;-822 933 -820 936 ;-895 -416 -894 -412 ;821 -329 824 -326 ;382 68 387 68 ;590 282 595 284 ;97 -310 103 -307 ;147 933 150 933 ;-772 -42 -765 -33 ];\r\nvexp=[-128 232 914624];\r\n[x y d]=Party_CH(zm);\r\nv=[x y d];\r\nassert(isequal(v,vexp))\r\n%%\r\nzm=[-987 -105 -985 -103 ;-22 -655 -20 -653 ;-622 412 -621 414 ;-526 641 -524 642 ;-694 573 -692 575 ;268 -697 269 -695 ;366 544 368 545 ;648 218 649 220 ;314 443 316 445 ;-589 354 -588 355 ;60 544 62 546 ;21 -444 23 -442 ;175 -224 176 -223 ;-915 -696 -914 -695 ;-417 766 -415 767 ;-874 -599 -873 -598 ;606 921 607 922 ;-672 562 -671 564 ;-17 39 -16 40 ;-708 632 -707 633 ;823 -170 825 -168 ;996 -372 997 -371 ;961 -169 962 -167 ;572 577 573 579 ;53 345 55 347 ;569 453 570 454 ;716 753 718 754 ;-803 -873 -802 -872 ;-110 940 -108 942 ;-943 841 -941 842 ;186 997 187 999 ;-107 388 -105 390 ;193 -54 195 -52 ;-231 -916 -230 -914 ;-962 749 -960 750 ;794 -458 796 -457 ;259 -909 261 -908 ;-719 65 -718 67 ;242 -481 244 -479 ;-528 -223 -526 -221 ;283 955 285 957 ;-888 946 -886 948 ;847 -707 849 -705 ;757 -814 759 -812 ;-940 -941 -938 -939 ;2 -176 4 -174 ;665 -708 667 -706 ;656 170 658 172 ;494 949 496 951 ;994 802 996 804 ;-65 785 -63 787 ;147 684 149 686 ;-488 807 -486 809 ;-875 462 -873 464 ;-152 253 -150 255 ;114 247 116 249 ;760 -206 762 -204 ;-204 569 -202 571 ;89 -752 91 -750 ;-464 -975 -462 -973 ;-783 -545 -781 -543 ;75 -251 77 -249 ;471 -462 473 -460 ;-126 -169 -124 -167 ;-311 615 -309 617 ;-398 -727 -396 -725 ;834 -915 836 -913 ;-87 -21 -85 -19 ;-301 918 -299 920 ;-740 -366 -738 -364 ;24 47 26 49 ;-929 -761 -927 -759 ;-863 -36 -861 -33 ;541 604 543 606 ;-279 -423 -276 -422 ;-620 -116 -619 -114 ;-145 571 -143 573 ;-638 133 -636 136 ;-885 546 -882 549 ;-625 -11 -622 -8 ;-610 -369 -609 -367 ;80 -655 83 -652 ;-398 -183 -395 -182 ;-71 -953 -69 -951 ;-767 939 -766 942 ;-763 -362 -760 -360 ;46 -897 47 -895 ;23 -437 25 -436 ;550 -440 553 -439 ;-660 178 -658 182 ;851 -919 853 -917 ;124 437 125 438 ;-414 -524 -411 -520 ;881 797 884 799 ;-73 -303 -68 -301 ;-373 -585 -369 -584 ;-239 963 -237 968 ;453 965 456 968 ;-742 875 -738 877 ;-894 -954 -884 -944 ];\r\nvexp=[-126 -168 1055075];\r\n[x y d]=Party_CH(zm);\r\nv=[x y d];\r\nassert(isequal(v,vexp))\r\n%%\r\nzm=[-648 -872 -646 -871 ;739 270 741 272 ;-847 -333 -845 -331 ;-510 -174 -508 -173 ;182 -353 183 -352 ;-573 277 -571 278 ;297 245 299 247 ;-223 818 -221 819 ;886 57 887 58 ;888 -773 889 -772 ;-593 513 -591 514 ;-587 -107 -585 -106 ;-564 40 -563 41 ;234 -624 236 -622 ;-82 902 -81 903 ;222 851 223 852 ;-726 476 -724 478 ;-392 -160 -390 -158 ;-153 -484 -152 -483 ;-522 -962 -520 -960 ;66 -926 68 -925 ;-535 28 -534 29 ;-603 -292 -602 -291 ;-981 -471 -980 -469 ;-367 865 -365 867 ;-445 -75 -443 -73 ;300 -40 301 -38 ;-329 -287 -328 -286 ;554 935 556 936 ;593 -932 594 -930 ;206 873 208 875 ;335 574 336 575 ;296 154 298 155 ;323 -423 325 -422 ;-144 472 -143 474 ;-284 211 -282 213 ;-289 -996 -287 -994 ;167 574 168 575 ;65 803 67 805 ;264 173 266 175 ;-820 -637 -818 -635 ;-897 813 -895 815 ;60 -524 62 -522 ;652 850 654 852 ;-837 57 -835 59 ;31 -96 33 -94 ;-607 540 -605 542 ;-240 794 -238 796 ;386 453 388 455 ;-421 -468 -419 -466 ;-838 -196 -836 -194 ;248 -366 250 -364 ;7 -933 9 -931 ;578 742 580 744 ;-634 -828 -632 -826 ;678 16 680 18 ;706 -163 708 -161 ;228 771 230 773 ;-440 -564 -438 -562 ;228 -606 230 -604 ;-361 652 -359 654 ;-608 -741 -606 -739 ;-926 42 -924 44 ;984 147 986 149 ;-132 -334 -130 -332 ;492 870 494 872 ;-470 523 -468 525 ;440 983 442 985 ;-68 -14 -66 -12 ;652 970 654 972 ;-591 -410 -589 -408 ;-252 -573 -250 -571 ;-639 -424 -637 -421 ;-306 -234 -303 -231 ;-720 81 -718 83 ;-645 845 -642 846 ;-938 507 -936 508 ;646 122 648 125 ;-76 864 -73 867 ;777 -142 778 -141 ;267 -756 269 -755 ;-151 -11 -150 -10 ;-568 -929 -567 -926 ;753 -830 756 -828 ;-205 -663 -202 -661 ;329 368 330 369 ;-402 -682 -399 -679 ;-649 463 -647 465 ;995 538 999 539 ;107 817 111 818 ;-546 -441 -544 -437 ;-856 920 -854 921 ;-587 -483 -584 -479 ;717 -641 719 -639 ;-892 -134 -890 -132 ;-300 -887 -296 -883 ;605 -228 607 -224 ;-93 -994 -90 -994 ;-421 -56 -414 -50 ;76 -592 80 -583 ];\r\nvexp=[-303 -231 855861];\r\n[x y d]=Party_CH(zm);\r\nv=[x y d];\r\nassert(isequal(v,vexp))\r\ntoc\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":5,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2013-10-18T01:44:26.000Z","updated_at":"2013-10-18T02:33:24.000Z","published_at":"2013-10-18T02:33:24.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis Challenge is derived from\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://code.google.com/codejam/contest/2929486/dashboard#s=p1\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eGJam 2014 China Party\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. Small Case.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe Goal is determine the optimal Party House. Given a set of people to attend a party, select the home from this set that minimizes the total travel of people. People travel only NSEW, no diagonals, to reach the host's home. If multiple homes have equal distance then select the home with minimum X. If there are more than one with Min distance and equal Min X then choose the house with Min Y.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe input is an array that defines rectangles of partiers. One line of the array is [xmin,ymin,xmax,ymax]. Blocks do not overlap.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e [M], Bx4 matrix (B\u0026lt;=100). Total B area of \u0026lt;=1000\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 [x,y,d] where [x,y] is Party House and d is everyone's total distance\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\u003eExamples:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[M   [x y d]\\n[0 0 2 2] [1 1 12]\\n[-1 2 -1 2;0 0 0 0;1 3 1 3] [-1 2 6]]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eContest Performance:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Best Delta Time of 16 minutes with 496 of 2010 able to process the small data set. The large data set was only achieved by 47 in the 3 hrs of contest duration.\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\u003eCommentary:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[1) The small can be solved by brute force since fewer than 1000 points require evaluation.\\n2) The large case, which is giving me fits, has up to 1,000,000 points to evaluate.\\n3) Graphing the small case with surf gives some unexpected asymmetric results relative to the simple centroid.]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":1983,"title":"Big data","description":"Optimize this line of code:\r\n\r\n B = sum(gradient(corrcoef(A)).^2);\r\n \r\nfor a matrix A with size(A,2)\u003e\u003esize(A,1)\r\n\r\n*Description:*\r\n\r\nAnalyses of large datasets often require some level of optimization for speed and/or memory usage. This is an example problem where both the initial data A and final measure of interest B fit perfectly well in memory, but the intermediate variables (in this case an impossibly large correlation matrix) required to compute the final measure of interest do not. \r\n\r\nWe have a large 2-dimensional matrix A (with dimensions 100 x 100,000).\r\n\r\nWe need to compute the following row vector B (with dimensions 1 x 100,000):\r\n\r\n B = sum(gradient(corrcoef(A)).^2);\r\n \r\nThis computes first the matrix of correlation coefficients for each pair of columns in A:\r\n\r\n a = corrcoef(A)\r\n\r\n(a 100,000 by 100,000 matrix), then computes the spatial derivative of the resulting correlation matrix along the second dimension:\r\n\r\n b = gradient(a)\r\n\r\n(another 100,000 by 100,000 matrix), and finally computes the squared norm of each column in the resulting matrix:\r\n\r\n B = sum(b.^2,1) \r\n\r\n(a 100,000 element vector)\r\n\r\nThis straight-forward \"vectorized\" approach, nevertheless, fails because it requires too much memory (enough to store a 100,000 x 100,000 correlation matrix, around 80Gb). \r\n\r\nWe clearly need some form of simplification/optimization. Can you compute the measure B within the time-limit of a Cody solution? (typically about 30 seconds)\r\n\r\nSolutions will be scored based on computation time (score equal to total time in seconds). \r\n\r\n*Context:* (not relevant to solving this problem)\r\n\r\nThis problem arises in the analyses of fMRI datasets. A typical result from a fMRI scanner session is a 4-dimensional matrix A(x,y,z,t), where the first three dimensions are spatial dimensions (a scanner of the subject's head/brain) and the fourth dimension is temporal (sequential scans obtained during a typical fMRI session). Think of these as time-varying three-dimensional pictures of your brain activation. A lot of research in the past few years has focused on functional connectivity, a measure of the temporal correlation between the \"activation\" of any pair of brain areas. Several recent papers have investigated the possibility to obtain entirely data-driven parcellations of the brain (partitioning the brain into functionally-homogeneous areas) based on these spatial patterns of functional connectivity. The measure _B_ above represents one of the measures that have been suggested as a way to drive these data-driven parcellations (borders between two adjacent but functionally distinct brain areas are expected to show higher spatial gradients in functional connectivity profiles). For simplicity I have collapsed the three spatial dimensions into one for this problem, but the computational complexity of the original computation is approximately the same (a typical scanner session results in something of the order of several hundred thousands \"voxels\" -three dimensional \"pixels\"- within the brain, and a few hundred time-points; this makes computing the entire \"voxel-to-voxel\" correlation matrix, or measures derived from it, rather challenging).\r\n\r\n","description_html":"\u003cp\u003eOptimize this line of code:\u003c/p\u003e\u003cpre\u003e B = sum(gradient(corrcoef(A)).^2);\u003c/pre\u003e\u003cp\u003efor a matrix A with size(A,2)\u0026gt;\u0026gt;size(A,1)\u003c/p\u003e\u003cp\u003e\u003cb\u003eDescription:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eAnalyses of large datasets often require some level of optimization for speed and/or memory usage. This is an example problem where both the initial data A and final measure of interest B fit perfectly well in memory, but the intermediate variables (in this case an impossibly large correlation matrix) required to compute the final measure of interest do not.\u003c/p\u003e\u003cp\u003eWe have a large 2-dimensional matrix A (with dimensions 100 x 100,000).\u003c/p\u003e\u003cp\u003eWe need to compute the following row vector B (with dimensions 1 x 100,000):\u003c/p\u003e\u003cpre\u003e B = sum(gradient(corrcoef(A)).^2);\u003c/pre\u003e\u003cp\u003eThis computes first the matrix of correlation coefficients for each pair of columns in A:\u003c/p\u003e\u003cpre\u003e a = corrcoef(A)\u003c/pre\u003e\u003cp\u003e(a 100,000 by 100,000 matrix), then computes the spatial derivative of the resulting correlation matrix along the second dimension:\u003c/p\u003e\u003cpre\u003e b = gradient(a)\u003c/pre\u003e\u003cp\u003e(another 100,000 by 100,000 matrix), and finally computes the squared norm of each column in the resulting matrix:\u003c/p\u003e\u003cpre\u003e B = sum(b.^2,1) \u003c/pre\u003e\u003cp\u003e(a 100,000 element vector)\u003c/p\u003e\u003cp\u003eThis straight-forward \"vectorized\" approach, nevertheless, fails because it requires too much memory (enough to store a 100,000 x 100,000 correlation matrix, around 80Gb).\u003c/p\u003e\u003cp\u003eWe clearly need some form of simplification/optimization. Can you compute the measure B within the time-limit of a Cody solution? (typically about 30 seconds)\u003c/p\u003e\u003cp\u003eSolutions will be scored based on computation time (score equal to total time in seconds).\u003c/p\u003e\u003cp\u003e\u003cb\u003eContext:\u003c/b\u003e (not relevant to solving this problem)\u003c/p\u003e\u003cp\u003eThis problem arises in the analyses of fMRI datasets. A typical result from a fMRI scanner session is a 4-dimensional matrix A(x,y,z,t), where the first three dimensions are spatial dimensions (a scanner of the subject's head/brain) and the fourth dimension is temporal (sequential scans obtained during a typical fMRI session). Think of these as time-varying three-dimensional pictures of your brain activation. A lot of research in the past few years has focused on functional connectivity, a measure of the temporal correlation between the \"activation\" of any pair of brain areas. Several recent papers have investigated the possibility to obtain entirely data-driven parcellations of the brain (partitioning the brain into functionally-homogeneous areas) based on these spatial patterns of functional connectivity. The measure \u003ci\u003eB\u003c/i\u003e above represents one of the measures that have been suggested as a way to drive these data-driven parcellations (borders between two adjacent but functionally distinct brain areas are expected to show higher spatial gradients in functional connectivity profiles). For simplicity I have collapsed the three spatial dimensions into one for this problem, but the computational complexity of the original computation is approximately the same (a typical scanner session results in something of the order of several hundred thousands \"voxels\" -three dimensional \"pixels\"- within the brain, and a few hundred time-points; this makes computing the entire \"voxel-to-voxel\" correlation matrix, or measures derived from it, rather challenging).\u003c/p\u003e","function_template":"function B = bigdata(A)\r\nB=zeros(1,size(A,2));\r\nend","test_suite":"%%\r\nglobal score time_count;\r\nscore=60; time_count=[];\r\nassessFunctionAbsence({'global'},'FileName','bigdata.m');\r\n\r\n%%\r\n% test small matrices first\r\nA=randn(100,100);\r\nB=bigdata(A);\r\nB0=sum(gradient(corrcoef(A)).^2);\r\nassert(all(abs(B-B0)\u003c1e-4));\r\n\r\n%%\r\n% test small matrices first\r\nA=randn(100,1000);\r\nt0=clock;\r\nB=bigdata(A);\r\nt1=etime(clock,t0);\r\nB0=sum(gradient(corrcoef(A)).^2);\r\nassert(all(abs(B-B0)\u003c1e-4));\r\nfprintf('Test 1 (1000 columns). Ellapsed time %f\\n',t1);\r\n\r\n%%\r\n% test small matrices first\r\nglobal time_count;\r\nA=randn(100,2000);\r\nt0=clock;\r\nB=bigdata(A);\r\nt1=etime(clock,t0);\r\nB0=sum(gradient(corrcoef(A)).^2);\r\nassert(all(abs(B-B0)\u003c1e-4));\r\nfprintf('Test 2 (2000 columns). Ellapsed time %f\\n',t1);\r\ntime_count=t1;\r\n\r\n%%\r\n% test small matrices first\r\nglobal time_count;\r\nA=randn(100,3000);\r\nt0=clock;\r\nB=bigdata(A);\r\nt1=etime(clock,t0);\r\nB0=sum(gradient(corrcoef(A)).^2);\r\nassert(all(abs(B-B0)\u003c1e-4));\r\nfprintf('Test 3 (3000 columns). Ellapsed time %f\\n',t1);\r\ntime_count=[time_count t1];\r\n\r\n%%\r\n% test small matrices first\r\nglobal time_count;\r\nA=randn(100,4000);\r\nt0=clock;\r\nB=bigdata(A);\r\nt1=etime(clock,t0);\r\nB0=sum(gradient(corrcoef(A)).^2);\r\nassert(all(abs(B-B0)\u003c1e-4));\r\nfprintf('Test 4 (4000 columns). Ellapsed time %f\\n',t1);\r\ntime_count=[time_count t1];\r\n\r\n%%\r\n% test big matrix\r\nglobal score time_count;\r\nassert(sum(time_count)\u003c2,'small matrices take too long; skipping big matrix computation to avoid time-out');\r\n\r\nrandn('seed',0);\r\nA=randn(100,100000);\r\nt0=clock;\r\nB=bigdata(A);\r\nt1=etime(clock,t0);\r\n\r\nassert(all(abs(B([81473 90580 12699 91338 63236 9755 27850 54689 95751 96489 15762 97060 95717 48538 80029 14189 42177 91574 79221 95950 65575 3572 84913 93400 67874])-[446.969229611013 529.483918542325 492.884459351883 506.453343056463 557.687700571202 570.008636747334 546.678181864512 445.139644002495 459.617263841976 565.276303202775 481.70081228927 505.718997924023 515.061623552965 363.542792068668 482.02142593325 578.480557740742 553.42526785998 470.314702013725 604.606838616675 539.148055906616 450.528222494512 491.803528433601 547.232718164205 561.773622227699 520.453638191039])\u003c1e-4));\r\nfprintf('Test 5 (100000 columns). Ellapsed time %f\\n',t1);\r\ntime_count=[time_count t1];\r\nscore=min(60,round(sum(time_count)));\r\n\r\n%%\r\nglobal score;\r\nurlwrite('https://sites.google.com/a/alfnie.com/alfnie/software/SetSolutionScore.p?attredirects=0\u0026amp;d=1','SetSolutionScore.p');\r\nrehash path;\r\nSetSolutionScore(score);\r\n\r\n","published":true,"deleted":false,"likes_count":2,"comments_count":3,"created_by":43,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":4,"test_suite_updated_at":"2017-10-27T00:44:32.000Z","rescore_all_solutions":true,"group_id":1,"created_at":"2013-11-12T05:45:56.000Z","updated_at":"2017-10-27T00:44:32.000Z","published_at":"2013-11-13T03:31:33.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eOptimize this line of code:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ B = sum(gradient(corrcoef(A)).^2);]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003efor a matrix A with size(A,2)\u0026gt;\u0026gt;size(A,1)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eDescription:\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\u003eAnalyses of large datasets often require some level of optimization for speed and/or memory usage. This is an example problem where both the initial data A and final measure of interest B fit perfectly well in memory, but the intermediate variables (in this case an impossibly large correlation matrix) required to compute the final measure of interest do not.\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\u003eWe have a large 2-dimensional matrix A (with dimensions 100 x 100,000).\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\u003eWe need to compute the following row vector B (with dimensions 1 x 100,000):\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ B = sum(gradient(corrcoef(A)).^2);]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis computes first the matrix of correlation coefficients for each pair of columns in A:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ a = corrcoef(A)]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e(a 100,000 by 100,000 matrix), then computes the spatial derivative of the resulting correlation matrix along the second dimension:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ b = gradient(a)]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e(another 100,000 by 100,000 matrix), and finally computes the squared norm of each column in the resulting matrix:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ B = sum(b.^2,1)]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e(a 100,000 element vector)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis straight-forward \\\"vectorized\\\" approach, nevertheless, fails because it requires too much memory (enough to store a 100,000 x 100,000 correlation matrix, around 80Gb).\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\u003eWe clearly need some form of simplification/optimization. Can you compute the measure B within the time-limit of a Cody solution? (typically about 30 seconds)\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\u003eSolutions will be scored based on computation time (score equal to total time in seconds).\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\u003eContext:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e (not relevant to solving this problem)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis problem arises in the analyses of fMRI datasets. A typical result from a fMRI scanner session is a 4-dimensional matrix A(x,y,z,t), where the first three dimensions are spatial dimensions (a scanner of the subject's head/brain) and the fourth dimension is temporal (sequential scans obtained during a typical fMRI session). Think of these as time-varying three-dimensional pictures of your brain activation. A lot of research in the past few years has focused on functional connectivity, a measure of the temporal correlation between the \\\"activation\\\" of any pair of brain areas. Several recent papers have investigated the possibility to obtain entirely data-driven parcellations of the brain (partitioning the brain into functionally-homogeneous areas) based on these spatial patterns of functional connectivity. The measure\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eB\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e above represents one of the measures that have been suggested as a way to drive these data-driven parcellations (borders between two adjacent but functionally distinct brain areas are expected to show higher spatial gradients in functional connectivity profiles). For simplicity I have collapsed the three spatial dimensions into one for this problem, but the computational complexity of the original computation is approximately the same (a typical scanner session results in something of the order of several hundred thousands \\\"voxels\\\" -three dimensional \\\"pixels\\\"- within the brain, and a few hundred time-points; this makes computing the entire \\\"voxel-to-voxel\\\" correlation matrix, or measures derived from it, rather challenging).\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":1254,"title":"PACMAT 06 - Optimized Ghosts, Equal Speed, Inf Lives; Interactive Download","description":"The Classic PACMAN game brought to Cody.\r\n\r\nPACMAT requires clearing all the Yellow Dots. Inf lives are available. Adjacent Ghosts will capture PACMAT.  Ghosts do not use the tunnel. On Ghost capture everyone gets reset. These trained ghosts take the minimum path 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_006c.m PACMAT_Interactive.m\u003e. (Right click, 'save link as'). The routine creates a PACMAT_solver.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/PACMAT_G004_video_14_764.mp4 14 Lives Interactive\u003e (MP4)  Best Score seen is 9 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 + 500 * Lives\r\n\r\n\r\n*Near Future:* Randomized Awesome 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. Inf lives are available. Adjacent Ghosts will capture PACMAT.  Ghosts do not use the tunnel. On Ghost capture everyone gets reset. These trained ghosts take the minimum path 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_006c.m\"\u003ePACMAT_Interactive.m\u003c/a\u003e. (Right click, 'save link as'). The routine creates a PACMAT_solver.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/PACMAT_G004_video_14_764.mp4\"\u003e14 Lives Interactive\u003c/a\u003e (MP4)  Best Score seen is 9 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 + 500 * Lives\u003c/p\u003e\u003cp\u003e\u003cb\u003eNear Future:\u003c/b\u003e Randomized Awesome Ghosts to make them non-deterministic\u003c/p\u003e","function_template":"function  [newdir]=PACMAT_solver(map)\r\n% 314 move solver if Ghosts do not move\r\n persistent ptr\r\n if isempty(ptr)\r\n  ptr=['bbbbbbbcccbbbbbcccdddddddddddddddddddddddddaaa'...\r\n      'bbbbbaaaaaaaaaaaaaaaaaaaaaaaaadddddcccccccbbbbddddaaabbbbbbbb'...\r\n      'cccbbbdddaaabbbaaaadddddbbbbbccccbbbbbbbbbbbbbbaaaaddddddddddd'...\r\n      'ccccbbbcccdddbbbaaabbbaaaccccccbbbbbaaccdddddccccccccccccccaabbbbbcccddccc'...\r\n      'dddaaaaaaddddddcccbbbcccdddcccdddaaadddaaaddbbbbbaaadddddddddddcccbbccc'];\r\n  ptr=(ptr-'a')+1;\r\n end\r\n  \r\n newdir=ptr(1);\r\n ptr(1)=[];\r\n\r\nend","test_suite":"%%\r\nfeval(@assignin,'caller','score',10000);\r\n%%\r\nmax_moves=4000; % Interactive approx 1000 moves\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  gmap=map; % Map used by ghosts to simplify PAC Capture\r\n  gmap(15,6)=Inf; %No tunnel ghosts\r\n  gmap(15,26)=Inf;\r\n  gmap(map==-1)=Inf; % walls to Inf\r\n  gmap(map\u003e2)=Inf; % Elim start points as viable moves, quicker box exit\r\n\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];% use deal?\r\n  [gstartx, gstarty]=find(map\u003e2);\r\n  \r\n  lives=0; % Lives\r\n  movepac=0;\r\n\r\nwhile any(mod(map(:),10)==1) \u0026\u0026 movepac\u003cmax_moves\r\n movepac=movepac+1;\r\n\r\n [curdir]=PACMAT_solver(map);\r\n [pmr, pmc]=find(map==2);\r\nif 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;\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\nend % curdir \u003e0\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 ~isempty(gmov) % PAC adjacent\r\n   lives=lives+1;\r\n   %if lives==0,break;end\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 no tunnel usage, Walls\r\n \r\n   gmap=map; gmap(15,1)=-1;gmap(15,28)=-1;\r\n       \r\n   ptctr=0;\r\n   gmap(gmap\u003e=0)=Inf;\r\n   \r\n% Ghost algor change   \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     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     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     else\r\n      gmov=[];\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    map(gidx+mapdelta(gmov))=map(gidx+mapdelta(gmov))+10*i;     \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\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 + 500*lives; % All dots must be removed\r\n\r\nfeval( @assignin,'caller','score',floor(min( 10000,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":3,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2013-02-08T04:11:21.000Z","updated_at":"2025-12-03T08:52:46.000Z","published_at":"2013-02-08T04:48:28.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. Inf lives are available. Adjacent Ghosts will capture PACMAT. Ghosts do not use the tunnel. On Ghost capture everyone gets reset. These trained ghosts take the minimum path 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_006c.m\\\"\u003e\u003cw:r\u003e\u003cw:t\u003ePACMAT_Interactive.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 PACMAT_solver.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/PACMAT_G004_video_14_764.mp4\\\"\u003e\u003cw:r\u003e\u003cw:t\u003e14 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 9 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 + 500 * 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 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":1255,"title":"PACMAT 07 - Optimized Ghosts, PAC 2X Ghost Speed, 4 Lives; Interactive 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, Four lives are available. Adjacent Ghosts will capture PACMAT.  Ghosts do not use the tunnel. On Ghost capture everyone gets reset. These trained ghosts take the minimum path 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_Interactive2X.m file that creates a solver script and video has been posted at \u003chttps://sites.google.com/site/razapor/matlab_cody/PACMAT_Interactive_007a.m PACMAT_Interactive2X.m\u003e. (Right click, 'save link as'). The routine creates a PACMAT_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/PACMAT_G004_2Xvideo_1_548.mp4 PAC2X 1 Life Interactive\u003e (MP4)\r\n\r\n\u003chttps://sites.google.com/site/razapor/matlab_cody/PACMAT_G004_2Xvideo_0_398.mp4 Alfonso 398\u003e (MP4)\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 and 4 Lives\r\n\r\n*Scoring:* Moves + 1000 * Lives\r\n\r\n\r\n*Near Future:* Tunneling Ghosts and then Randomized Awesome 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. PACMAT moves at 2X Ghost Speed, Four lives are available. Adjacent Ghosts will capture PACMAT.  Ghosts do not use the tunnel. On Ghost capture everyone gets reset. These trained ghosts take the minimum path 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_Interactive2X.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_007a.m\"\u003ePACMAT_Interactive2X.m\u003c/a\u003e. (Right click, 'save link as'). The routine creates a PACMAT_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/PACMAT_G004_2Xvideo_1_548.mp4\"\u003ePAC2X 1 Life Interactive\u003c/a\u003e (MP4)\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://sites.google.com/site/razapor/matlab_cody/PACMAT_G004_2Xvideo_0_398.mp4\"\u003eAlfonso 398\u003c/a\u003e (MP4)\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 and 4 Lives\u003c/p\u003e\u003cp\u003e\u003cb\u003eScoring:\u003c/b\u003e Moves + 1000 * Lives\u003c/p\u003e\u003cp\u003e\u003cb\u003eNear Future:\u003c/b\u003e Tunneling Ghosts and then Randomized Awesome Ghosts to make them non-deterministic\u003c/p\u003e","function_template":"function ans = PACMAT_2Xsolver(map)\r\npersistent mv\r\nif isempty(mv)\r\nmv=[2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 4 4 4 4 4 4 4 4 1 1 1 1 ];\r\nend\r\nmv(1);\r\nmv(1)=[];\r\nend","test_suite":"%%\r\nfeval(@assignin,'caller','score',5000);\r\n%%\r\nmax_moves=4000; % Interactive approx 1000 moves\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  gmap=map; % Map used by ghosts to simplify PAC Capture\r\n  gmap(15,6)=Inf; %No tunnel ghosts\r\n  gmap(15,26)=Inf;\r\n  gmap(map==-1)=Inf; % walls to Inf\r\n  gmap(map\u003e2)=Inf; % Elim start points as viable moves, quicker box exit\r\n\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\u003c4 \u0026\u0026 any(mod(map(:),10)==1) \u0026\u0026 movepac\u003cmax_moves\r\n for pac2x=1:2 % PAC Speed Multiplier\r\n  if lives\u003e3 || ~any(mod(map(:),10)==1),break;end % Died or Completed\r\n movepac=movepac+1;\r\n [curdir]=PACMAT_2Xsolver(map);\r\n [pmr, pmc]=find(map==2);\r\nif 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  % 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;\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\nend % curdir \u003e0\r\nend % pac2x\r\nif lives\u003e3 || ~any(mod(map(:),10)==1),break;end % Completed\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 ~isempty(gmov) % PAC adjacent\r\n   lives=lives+1;\r\n   %if lives==0,break;end\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 no tunnel usage, Walls\r\n \r\n   gmap=map; gmap(15,1)=-1;gmap(15,28)=-1;\r\n       \r\n   ptctr=0;\r\n   gmap(gmap\u003e=0)=Inf;\r\n   \r\n% Ghost algor change   \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     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     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     else\r\n      gmov=[];\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    map(gidx+mapdelta(gmov))=map(gidx+mapdelta(gmov))+10*i;     \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 and lives\u003c4\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( 5000,score )) );\r\n","published":true,"deleted":false,"likes_count":2,"comments_count":1,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":3,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2013-02-09T03:33:37.000Z","updated_at":"2025-12-03T15:28:58.000Z","published_at":"2013-02-09T04:11:24.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, Four lives are available. Adjacent Ghosts will capture PACMAT. Ghosts do not use the tunnel. On Ghost capture everyone gets reset. These trained ghosts take the minimum path 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_Interactive2X.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_007a.m\\\"\u003e\u003cw:r\u003e\u003cw:t\u003ePACMAT_Interactive2X.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 PACMAT_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/PACMAT_G004_2Xvideo_1_548.mp4\\\"\u003e\u003cw:r\u003e\u003cw:t\u003ePAC2X 1 Life Interactive\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e (MP4)\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/PACMAT_G004_2Xvideo_0_398.mp4\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eAlfonso 398\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e (MP4)\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 and 4 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\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 Tunneling Ghosts and then Randomized Awesome 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":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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\"}]}"},{"id":737,"title":"Criss_Cross_000 : Unique elements in a Square array","description":"Criss Cross matrix puzzle - Easy: Square matrix, Unique elements\r\n\r\nArrange the \"words\" into a solid square such that all words are used.\r\n\r\nGiven an array of row words and an array of column words make the unique Square.\r\n\r\nThere is no flipping or rotating in this simplest case.\r\n\r\nexample:\r\n\r\nM_orig =[1 2 3; 4 5 6; 7 8 9]\r\n\r\n*Inputs:*\r\n\r\nvr = [1 2 3; 4 5 6; 7 8 9]\r\n\r\nscramled gives vr =[7 8 9; 1 2 3; 4 5 6]\r\n\r\nvc =[1 2 3; 4 5 6; 7 8 9]\r\n\r\nscrambled gives vc =[3 1 2;6 4 5; 9 7 8]\r\n\r\n*Output:*\r\n\r\nM_out=[1 2 3; 4 5 6; 7 8 9]\r\n\r\nMax size : 4096\r\n\r\n\r\nThis is the first in a series of Criss Cross puzzles.\r\n\r\nFollow up puzzles will have non-unique values, non-identified row or col, and there are quite a few other variations.","description_html":"\u003cp\u003eCriss Cross matrix puzzle - Easy: Square matrix, Unique elements\u003c/p\u003e\u003cp\u003eArrange the \"words\" into a solid square such that all words are used.\u003c/p\u003e\u003cp\u003eGiven an array of row words and an array of column words make the unique Square.\u003c/p\u003e\u003cp\u003eThere is no flipping or rotating in this simplest case.\u003c/p\u003e\u003cp\u003eexample:\u003c/p\u003e\u003cp\u003eM_orig =[1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003e\u003cb\u003eInputs:\u003c/b\u003e\u003c/p\u003e\u003cp\u003evr = [1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003escramled gives vr =[7 8 9; 1 2 3; 4 5 6]\u003c/p\u003e\u003cp\u003evc =[1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003escrambled gives vc =[3 1 2;6 4 5; 9 7 8]\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eM_out=[1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003eMax size : 4096\u003c/p\u003e\u003cp\u003eThis is the first in a series of Criss Cross puzzles.\u003c/p\u003e\u003cp\u003eFollow up puzzles will have non-unique values, non-identified row or col, and there are quite a few other variations.\u003c/p\u003e","function_template":"function M_out = Criss_Cross(vr,vc)\r\n\r\n M_out=vr*0;\r\n \r\nend","test_suite":"%%\r\nformat long\r\nformat compact\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed)\r\n\r\nn=4;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n)\r\n\r\nvr=M(1:n,:);\r\nvr=sortrows(vr);\r\n\r\nvc=M(:,1:n);\r\nvc=sortrows(vc')';\r\n\r\ntic\r\nM_out=Criss_Cross(vr,vc);\r\ntoc\r\nM_out\r\n\r\nassert(isequal(M,M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed)\r\n\r\nn=8;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n)\r\n\r\nvr=M(1:n,:);\r\nvr=sortrows(vr);\r\n\r\nvc=M(:,1:n);\r\nvc=sortrows(vc')';\r\n\r\ntic\r\nM_out=Criss_Cross(vr,vc);\r\ntoc\r\nM_out\r\n\r\nassert(isequal(M,M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed)\r\n\r\nn=128;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n);\r\n\r\nvr=M(1:n,:);\r\nvr=sortrows(vr);\r\n\r\nvc=M(:,1:n);\r\nvc=sortrows(vc')';\r\n\r\ntic\r\nM_out=Criss_Cross(vr,vc);\r\ntoc\r\n\r\nassert(isequal(M,M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed)\r\n\r\nn=1024;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n);\r\n\r\nvr=M(1:n,:);\r\nvr=sortrows(vr);\r\n\r\nvc=M(:,1:n);\r\nvc=sortrows(vc')';\r\n\r\ntic\r\nM_out=Criss_Cross(vr,vc);\r\ntoc\r\n\r\nassert(isequal(M,M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed)\r\n\r\nn=4096;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n);\r\n\r\nvr=M(1:n,:);\r\nvr=sortrows(vr);\r\n\r\nvc=M(:,1:n);\r\nvc=sortrows(vc')';\r\n\r\ntic\r\nM_out=Criss_Cross(vr,vc);\r\ntoc\r\n\r\nassert(isequal(M,M_out));","published":true,"deleted":false,"likes_count":1,"comments_count":0,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":8,"test_suite_updated_at":"2012-06-03T20:42:28.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2012-06-03T18:05:05.000Z","updated_at":"2012-06-04T02:25:58.000Z","published_at":"2012-06-03T19:37:49.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eCriss Cross matrix puzzle - Easy: Square matrix, Unique elements\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eArrange the \\\"words\\\" into a solid square such that all words are used.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eGiven an array of row words and an array of column words make the unique Square.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThere is no flipping or rotating in this simplest case.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eexample:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eM_orig =[1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInputs:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003evr = [1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003escramled gives vr =[7 8 9; 1 2 3; 4 5 6]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003evc =[1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003escrambled gives vc =[3 1 2;6 4 5; 9 7 8]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eOutput:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eM_out=[1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eMax size : 4096\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis is the first in a series of Criss Cross puzzles.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eFollow up puzzles will have non-unique values, non-identified row or col, and there are quite a few other variations.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":738,"title":"Criss_Cross_010 : Unique elements, Square array, Words in one array","description":"Criss Cross matrix puzzle - Square matrix, Unique elements, Single Word List\r\n\r\nArrange the \"words\" into a solid square such that all words are used.\r\n\r\nGiven an array of words make the original Square or Square Transpose.\r\n\r\nWords are left to Right or Top to Bottom. No fliplr or flipud.\r\n\r\n*Example:*\r\n\r\nM_orig = [1 2 3; 4 5 6; 7 8 9]\r\n\r\nvr = [1 2 3; 4 5 6; 7 8 9]\r\n\r\nvc = [1 2 3; 4 5 6; 7 8 9]\r\n\r\n*Inputs:*\r\n\r\nw = [1 2 3; 4 5 6; 7 8 9;1 4 7; 2 5 8; 3 6 9]\r\n\r\nsorted w gives\r\n\r\nw = [1 2 3; 1 4 7; 2 5 8; 3 6 9; 4 5 6; 7 8 9]\r\n\r\n\r\n*Output:*\r\n\r\nM_out = [1 2 3; 4 5 6; 7 8 9] or\r\n\r\nM_out=[1 4 7; 2 5 8; 3 6 9]\r\n\r\n\r\nMax size : 256\r\n\r\nThis is the second in the Criss Cross puzzles series.\r\n\r\nFollow up puzzles will have non-unique values and quite a few other variations.\r\n","description_html":"\u003cp\u003eCriss Cross matrix puzzle - Square matrix, Unique elements, Single Word List\u003c/p\u003e\u003cp\u003eArrange the \"words\" into a solid square such that all words are used.\u003c/p\u003e\u003cp\u003eGiven an array of words make the original Square or Square Transpose.\u003c/p\u003e\u003cp\u003eWords are left to Right or Top to Bottom. No fliplr or flipud.\u003c/p\u003e\u003cp\u003e\u003cb\u003eExample:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eM_orig = [1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003evr = [1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003evc = [1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003e\u003cb\u003eInputs:\u003c/b\u003e\u003c/p\u003e\u003cp\u003ew = [1 2 3; 4 5 6; 7 8 9;1 4 7; 2 5 8; 3 6 9]\u003c/p\u003e\u003cp\u003esorted w gives\u003c/p\u003e\u003cp\u003ew = [1 2 3; 1 4 7; 2 5 8; 3 6 9; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eM_out = [1 2 3; 4 5 6; 7 8 9] or\u003c/p\u003e\u003cp\u003eM_out=[1 4 7; 2 5 8; 3 6 9]\u003c/p\u003e\u003cp\u003eMax size : 256\u003c/p\u003e\u003cp\u003eThis is the second in the Criss Cross puzzles series.\u003c/p\u003e\u003cp\u003eFollow up puzzles will have non-unique values and quite a few other variations.\u003c/p\u003e","function_template":"function M_out = Criss_Cross(w)\r\n\r\n M_out=zeros(size(w,2));\r\n \r\nend","test_suite":"%%\r\nformat long\r\nformat compact\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed);\r\n\r\nn=4;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n)\r\n\r\nvr=M(1:n,:);\r\nvc=M(:,1:n);\r\n\r\nw=[vr;vc'];\r\nw=sortrows(w);\r\n\r\nM_out=Criss_Cross(w)\r\n\r\nassert(isequal(M,M_out)||isequal(M',M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed);\r\n\r\nn=8;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n)\r\n\r\nvr=M(1:n,:);\r\nvc=M(:,1:n);\r\n\r\nw=[vr;vc'];\r\nw=sortrows(w);\r\n\r\nM_out=Criss_Cross(w)\r\n\r\nassert(isequal(M,M_out)||isequal(M',M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed);\r\n\r\nn=16;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n);\r\n\r\nvr=M(1:n,:);\r\nvc=M(:,1:n);\r\n\r\nw=[vr;vc'];\r\nw=sortrows(w);\r\n\r\ntic\r\nM_out=Criss_Cross(w);\r\ntoc\r\n\r\nassert(isequal(M,M_out)||isequal(M',M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed);\r\n\r\nn=16;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n);\r\n\r\nvr=M(1:n,:);\r\nvc=M(:,1:n);\r\n\r\nw=[vr;vc'];\r\nw=sortrows(w);\r\n\r\ntic\r\nM_out=Criss_Cross(w);\r\ntoc\r\n\r\nassert(isequal(M,M_out)||isequal(M',M_out));\r\n%%\r\nn=256;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n);\r\n\r\nvr=M(1:n,:);\r\nvc=M(:,1:n);\r\n\r\nw=[vr;vc'];\r\nw=sortrows(w);\r\n\r\ntic\r\nM_out=Criss_Cross(w);\r\ntoc\r\n\r\nassert(isequal(M,M_out)||isequal(M',M_out));","published":true,"deleted":false,"likes_count":1,"comments_count":0,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":8,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2012-06-03T20:11:23.000Z","updated_at":"2012-06-04T02:27:22.000Z","published_at":"2012-06-03T21:38:39.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eCriss Cross matrix puzzle - Square matrix, Unique elements, Single Word List\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eArrange the \\\"words\\\" into a solid square such that all words are used.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eGiven an array of words make the original Square or Square Transpose.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eWords are left to Right or Top to Bottom. No fliplr or flipud.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eExample:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eM_orig = [1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003evr = [1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003evc = [1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInputs:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003ew = [1 2 3; 4 5 6; 7 8 9;1 4 7; 2 5 8; 3 6 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003esorted w gives\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003ew = [1 2 3; 1 4 7; 2 5 8; 3 6 9; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eOutput:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eM_out = [1 2 3; 4 5 6; 7 8 9] or\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eM_out=[1 4 7; 2 5 8; 3 6 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eMax size : 256\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis is the second in the Criss Cross puzzles series.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eFollow up puzzles will have non-unique values and quite a few other variations.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":740,"title":"Battleship_010 : (TM)  Classic Game - Methodical Bot (100 move max)","description":"The Classic Battleship(TM) game implemented between a computer bot and a player's bot.\r\n\r\n\u003chttp://en.wikipedia.org/wiki/Battleship_%28game%29 Battleship\u003e\r\n\r\nYou and your opponent have 9 ships of various sizes.\r\n\r\nThese Ships/Sizes/Qty are Carrier-5, Battleship-4, Submarine-3(qty 2), Cruiser-3(qty 2), Destroyer-2(qty-3).\r\n\r\nThe board is 10x10. (index 1-100)\r\nUnknown=0, Miss=1, Hit=2\r\n\r\n*The Play:*\r\n\r\nPlayer places his ships on the board. Ships may not overlap but may touch.\r\n\r\nShips array is [9,2] where 1 is the Carrier and 9 is a Destroyer. \r\n\r\n[start_idx, orientation; start_idx, orientation...]. An orientation of 0 is Down and a 1 is Right. \r\n\r\nShips[1 1;...] places the Carrier in cells [1 11 22 33 44]\r\n\r\nPlayer takes a shot on the board - idx 1:100.\r\n\r\nThe computer bot will take a shot if he has any ships remaining.\r\n\r\nThe player will see an updated board for his next shot if he has any ships remaining.\r\n\r\n*Pass: Win*\r\n\r\nBattleship_bot_010 randomly picks from Zero sectors. \r\n","description_html":"\u003cp\u003eThe Classic Battleship™ game implemented between a computer bot and a player's bot.\u003c/p\u003e\u003cp\u003e\u003ca href=\"http://en.wikipedia.org/wiki/Battleship_%28game%29\"\u003eBattleship\u003c/a\u003e\u003c/p\u003e\u003cp\u003eYou and your opponent have 9 ships of various sizes.\u003c/p\u003e\u003cp\u003eThese Ships/Sizes/Qty are Carrier-5, Battleship-4, Submarine-3(qty 2), Cruiser-3(qty 2), Destroyer-2(qty-3).\u003c/p\u003e\u003cp\u003eThe board is 10x10. (index 1-100)\r\nUnknown=0, Miss=1, Hit=2\u003c/p\u003e\u003cp\u003e\u003cb\u003eThe Play:\u003c/b\u003e\u003c/p\u003e\u003cp\u003ePlayer places his ships on the board. Ships may not overlap but may touch.\u003c/p\u003e\u003cp\u003eShips array is [9,2] where 1 is the Carrier and 9 is a Destroyer.\u003c/p\u003e\u003cp\u003e[start_idx, orientation; start_idx, orientation...]. An orientation of 0 is Down and a 1 is Right.\u003c/p\u003e\u003cp\u003eShips[1 1;...] places the Carrier in cells [1 11 22 33 44]\u003c/p\u003e\u003cp\u003ePlayer takes a shot on the board - idx 1:100.\u003c/p\u003e\u003cp\u003eThe computer bot will take a shot if he has any ships remaining.\u003c/p\u003e\u003cp\u003eThe player will see an updated board for his next shot if he has any ships remaining.\u003c/p\u003e\u003cp\u003e\u003cb\u003ePass: Win\u003c/b\u003e\u003c/p\u003e\u003cp\u003eBattleship_bot_010 randomly picks from Zero sectors.\u003c/p\u003e","function_template":"function [mv,ships] = Battleship(b)\r\n % b is 10x10; idx 1:100\r\n % output mv is idx 1 thru 100\r\n % b: 0-open ocean; 1-miss shot, 2-Hit\r\n % ships: Placement of player ships\r\n % ships are initialized on first turn sum(b(:))==0\r\n % Place 9 ships [idx1 0/1;idx2 0/1;...idx9 0/1]\r\n % Ship lengths : 5/4/3/3/3/3/2/2/2\r\n % Ship orientation : 0-Vert Down; 1-Horiz Right \r\n % ships=[1 1;2 1;...8 1;99 0] \r\n % Places 8 ships on Left edge, one down in bottom rt corner\r\n % ships may not overlap - Loss\r\n \r\n% Need ships each call or will Lose; Ships placed only on first move\r\n  ships=[1 1;2 1;3 1;4 1;5 1;6 1;7 1;8 1;99 0]; \r\n \r\n % randomly pick an open spot (same as Battleship_bot_000)\r\n mv=randi(100);\r\n \r\nend % Battleship\r\n","test_suite":"%%\r\n%Test Suite\r\n%Battleship_000\r\n% Carrier/Battleship/Sub/Cruiser/Destroyer\r\n% 5/4/3/3/2  Qty 1/1/2/2/3\r\n% b 0-Unknown 1-Miss 2-Hit\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed);\r\ngame_over=false;\r\nwins=0; % player wins\r\nbp=zeros(10);\r\nbc=zeros(10);\r\nships_p=ones(10);\r\nships_c=ones(10);\r\nship_vec=[5 4 3 3 3 3 2 2 2]; % Length of ships\r\n\r\ntic\r\n% initialize Computer Ships\r\nfor ship=1:9\r\n placed=false;\r\n while~placed\r\n  idx=randi(100);\r\n  [r c]=ind2sub([10 10],idx);\r\n  dwn_rt=randi(2)-1; % 0-down, 1-right\r\n  try % may go beyond board size\r\n   if dwn_rt==0 % down\r\n    blocked=any(ships_c(r:r+ship_vec(ship)-1,c)==2);\r\n   else % right\r\n    blocked=any(ships_c(r,c:c+ship_vec(ship)-1)==2);\r\n   end\r\n  catch\r\n   blocked=true; % invalid placement\r\n  end\r\n  if ~blocked % No ship conflict\r\n   if dwn_rt==0 % down\r\n    ships_c(r:r+ship_vec(ship)-1,c)=2;\r\n   else % right\r\n    ships_c(r,c:c+ship_vec(ship)-1)=2;\r\n   end\r\n   placed=true;\r\n  end \r\n end % placed\r\nend % ship\r\n \r\n% Initialize Player's ships and first move\r\n  try % for invalid mvP values\r\n   [mvP,ships]=Battleship(bp); % \r\n   bp(mvP(1))=ships_c(mvP(1));\r\n   \r\n    for ship=1:9\r\n      [r c]=ind2sub([10 10],ships(ship,1));\r\n      dwn_rt=ships(ship,2); \r\n      try % may go beyond board size\r\n       if dwn_rt==0 % down\r\n        blocked=any(ships_p(r:r+ship_vec(ship)-1,c)==2);\r\n       else % right\r\n        blocked=any(ships_p(r,c:c+ship_vec(ship)-1)==2);\r\n       end\r\n      catch\r\n       blocked=true; % invalid placement\r\n      end\r\n      if ~blocked % No ship conflict\r\n       if dwn_rt==0 % down\r\n        ships_p(r:r+ship_vec(ship)-1,c)=2;\r\n       else % right\r\n        ships_p(r,c:c+ship_vec(ship)-1)=2;\r\n       end\r\n      end \r\n    end % ship\r\n   \r\n   if sum(ships_p(:))~=127 % Expect 127 board if all placed\r\n    fprintf('Invalid Ship placement - Game over\\n');\r\n    ships\r\n    ships_p\r\n    game_over=true;\r\n   end\r\n   \r\n  catch\r\n   fprintf('Invalid first respone - Game over\\n');\r\n   mvP\r\n   ships\r\n   game_over=true;\r\n  end\r\n\r\n% Main Game Loop\r\n\r\n while ~game_over \r\n  % Computer move\r\n  % Author: Richard Z\r\n  % Date: 2012/06/03\r\n  % Battleship_010 bot: Random of Zeros\r\n  \r\n   avail=find(bc==0);\r\n   mvC=avail(randi(length(avail))); \r\n  %End Battleship bot: Random of Zeros\r\n  \r\n  bc(mvC)=ships_p(mvC); % Hit=2, Miss=1\r\n\r\n  if length(find(bc==2))\u003e=27 % Computer Wins\r\n   break;\r\n  end\r\n  \r\n  % Player's Second move and thereafter\r\n  try % for invalid mvP values\r\n   [mvP,ships]=Battleship(bp); % \r\n   bp(mvP(1))=ships_c(mvP(1)); % Hit=2, Miss=1\r\n  catch\r\n   fprintf('Ignoring Illegal move %i \\n',mvP(1));\r\n  end\r\n  \r\n  if length(find(bp==2))\u003e=27 % All ships sunk\r\n   wins=1;\r\n   break;\r\n  end\r\n  \r\n end % While ~game_over\r\n\r\ntoc\r\n \r\n % Player must win to Pass\r\n assert(isequal(wins,1))\r\n%Pass=1;\r\n%assert(isequal(Pass,1));\r\n\r\n bc\r\n bp\r\n wins","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":4,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2012-06-04T04:28:43.000Z","updated_at":"2012-06-04T04:57:27.000Z","published_at":"2012-06-04T04:56:04.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe Classic Battleship™ game implemented between a computer bot and a player's bot.\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=\\\"http://en.wikipedia.org/wiki/Battleship_%28game%29\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eBattleship\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eYou and your opponent have 9 ships of various sizes.\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\u003eThese Ships/Sizes/Qty are Carrier-5, Battleship-4, Submarine-3(qty 2), Cruiser-3(qty 2), Destroyer-2(qty-3).\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe board is 10x10. (index 1-100) Unknown=0, Miss=1, Hit=2\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eThe Play:\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\u003ePlayer places his ships on the board. Ships may not overlap but may touch.\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\u003eShips array is [9,2] where 1 is the Carrier and 9 is a Destroyer.\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\u003e[start_idx, orientation; start_idx, orientation...]. An orientation of 0 is Down and a 1 is Right.\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\u003eShips[1 1;...] places the Carrier in cells [1 11 22 33 44]\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\u003ePlayer takes a shot on the board - idx 1:100.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe computer bot will take a shot if he has any ships remaining.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe player will see an updated board for his next shot if he has any ships remaining.\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: Win\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\u003eBattleship_bot_010 randomly picks from Zero sectors.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":908,"title":"AVIRIS Inscribed Rectangle Bit Mask - Speed Test","description":"The AVIRIS data sometimes is provided uncropped. This creates edge regions with values of \"-50\". Shown is AVIRIS Moffett Field image Layer 1 (400nm) and a zoom of the top-right corner. The dark blue on the edges is non-imaged ground.\r\n\r\nTo expedite compression the unused mask can be created with an interior excluded rectangle of no Zeros and maximum pixels. The challenge is to quickly and accurately determine the maximum non-zero inscribed rectangle for this image and some other test cases.\r\n\r\n\u003c\u003chttps://sites.google.com/site/razapor/matlab_cody/AVIRIS_L001.jpg\u003e\u003e \r\n\r\n\r\n\u003c\u003chttps://sites.google.com/site/razapor/matlab_cody/AVIRIS_L001_TR.jpg\u003e\u003e\r\n\r\n\r\n*Input:* m ( 2-D array with zero and non-zero values )\r\n\r\n*Output:* [idxtlc rmnr rmnc]\r\n\r\n* idxtlc : array index of top left corner\r\n* rmnr : numer of rows of the non-zero rectangle mask\r\n* rmnc : number of columns of the non-zero rectangle mask\r\n\r\n*Score:* Time ( msec ) Based upon time to process the 1924x753 AVIRIS image.\r\n\r\n(If time-out occurs I suggest downloading the mat file using the test suite code and then optimize with profiler.)\r\n\r\n*Passing:* Minimum number of pixels in rectangle\r\n\r\n\r\n\r\n*Example:* \r\n\r\n* m=[ 1 1 0 1 1......idxtlc = 3  ( index of TLC row 3, col 1) \r\n* ........1 0 1 1 1......rmnr = 3 ( rectangle mask number rows )\r\n* ........1 1 1 1 1......rmnc = 5 ( rectangle mask number columns )\r\n* ........1 1 1 1 1......Maximum rectangle pixels of 15\r\n* ........1 1 1 1 1 ]\r\n \r\n \r\nFor the AVIRIS image the zero edge bit mask encoding can be reduced 89% using an inscribed rectangle.\r\n\r\nNote: Additional test cases may be invoked if hard coded solution achieves best score. ","description_html":"\u003cp\u003eThe AVIRIS data sometimes is provided uncropped. This creates edge regions with values of \"-50\". Shown is AVIRIS Moffett Field image Layer 1 (400nm) and a zoom of the top-right corner. The dark blue on the edges is non-imaged ground.\u003c/p\u003e\u003cp\u003eTo expedite compression the unused mask can be created with an interior excluded rectangle of no Zeros and maximum pixels. The challenge is to quickly and accurately determine the maximum non-zero inscribed rectangle for this image and some other test cases.\u003c/p\u003e\u003cimg src=\"https://sites.google.com/site/razapor/matlab_cody/AVIRIS_L001.jpg\"\u003e\u003cimg src=\"https://sites.google.com/site/razapor/matlab_cody/AVIRIS_L001_TR.jpg\"\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e m ( 2-D array with zero and non-zero values )\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e [idxtlc rmnr rmnc]\u003c/p\u003e\u003cul\u003e\u003cli\u003eidxtlc : array index of top left corner\u003c/li\u003e\u003cli\u003ermnr : numer of rows of the non-zero rectangle mask\u003c/li\u003e\u003cli\u003ermnc : number of columns of the non-zero rectangle mask\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cb\u003eScore:\u003c/b\u003e Time ( msec ) Based upon time to process the 1924x753 AVIRIS image.\u003c/p\u003e\u003cp\u003e(If time-out occurs I suggest downloading the mat file using the test suite code and then optimize with profiler.)\u003c/p\u003e\u003cp\u003e\u003cb\u003ePassing:\u003c/b\u003e Minimum number of pixels in rectangle\u003c/p\u003e\u003cp\u003e\u003cb\u003eExample:\u003c/b\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003em=[ 1 1 0 1 1......idxtlc = 3  ( index of TLC row 3, col 1)\u003c/li\u003e\u003cli\u003e........1 0 1 1 1......rmnr = 3 ( rectangle mask number rows )\u003c/li\u003e\u003cli\u003e........1 1 1 1 1......rmnc = 5 ( rectangle mask number columns )\u003c/li\u003e\u003cli\u003e........1 1 1 1 1......Maximum rectangle pixels of 15\u003c/li\u003e\u003cli\u003e........1 1 1 1 1 ]\u003c/li\u003e\u003c/ul\u003e\u003cp\u003eFor the AVIRIS image the zero edge bit mask encoding can be reduced 89% using an inscribed rectangle.\u003c/p\u003e\u003cp\u003eNote: Additional test cases may be invoked if hard coded solution achieves best score.\u003c/p\u003e","function_template":"function [idxtlc rmnr rmnc]=rect_mask(m)\r\n  idxtlc=1; rmnr=0; rmnc=0;\r\nend","test_suite":"global dt\r\ndt=0;\r\nm=ones(5); m(7)=0;\r\nt0=clock;\r\n[idxtlc rmnr rmnc]=rect_mask(m);\r\ndt=etime(clock,t0)*1000; % ms\r\ndt\r\n\r\n[x y]=ind2sub(size(m),idxtlc);\r\npass=~any(any(m(x:x+rmnr-1,y:y+rmnc-1)==0));\r\n\r\nassert(rmnr*rmnc\u003e=15,sprintf('Expected 15 pixels, only have %i\\n',rmnr*rmnc))\r\nassert(isequal(pass,1),sprintf('Not all non-zero [%i,%i] [%i,%i]\\n',x,y,x+rmnr-1,y+rmnc-1))\r\n\r\nfprintf('Time to process %.0f msec\\n',dt);\r\nfprintf('idx=%i x=%i y=%i  rect_nr=%i  rect_nc=%i\\n',idxtlc,x,y,rmnr,rmnc)\r\n%%\r\nm=ones(5); m(7)=0; m(11)=0;\r\nt0=clock;\r\n[idxtlc rmnr rmnc]=rect_mask(m);\r\ndt=etime(clock,t0)*1000; % ms\r\ndt\r\n\r\n[x y]=ind2sub(size(m),idxtlc);\r\npass=~any(any(m(x:x+rmnr-1,y:y+rmnc-1)==0));\r\n\r\nassert(rmnr*rmnc\u003e=15,sprintf('Expected 15 pixels, only have %i\\n',rmnr*rmnc))\r\nassert(isequal(pass,1),sprintf('Not all non-zero [%i,%i] [%i,%i]\\n',x,y,x+rmnr-1,y+rmnc-1))\r\n\r\nfprintf('Time to process %.0f msec\\n',dt);\r\nfprintf('idx=%i x=%i y=%i  rect_nr=%i  rect_nc=%i\\n',idxtlc,x,y,rmnr,rmnc)\r\n%%\r\n m=zeros(6);m(15)=1;\r\nt0=clock;\r\n[idxtlc rmnr rmnc]=rect_mask(m);\r\ndt=etime(clock,t0)*1000; % ms\r\ndt\r\n\r\n[x y]=ind2sub(size(m),idxtlc);\r\npass=~any(any(m(x:x+rmnr-1,y:y+rmnc-1)==0));\r\n\r\nassert(rmnr*rmnc\u003e=1,sprintf('Expected 1 pixel, only have %i\\n',rmnr*rmnc))\r\nassert(isequal(pass,1),sprintf('Not all non-zero [%i,%i] [%i,%i]\\n',x,y,x+rmnr-1,y+rmnc-1))\r\n\r\nfprintf('Time to process %.0f msec\\n',dt);\r\nfprintf('idx=%i x=%i y=%i  rect_nr=%i  rect_nc=%i\\n',idxtlc,x,y,rmnr,rmnc)\r\n%%\r\nm=ones(8); m(2,:)=0;  m(7,:)=0;  m(4,2)=0;  m(5,7)=0;\r\nt0=clock;\r\n[idxtlc rmnr rmnc]=rect_mask(m);\r\ndt=etime(clock,t0)*1000; % ms\r\ndt\r\n\r\n[x y]=ind2sub(size(m),idxtlc);\r\npass=~any(any(m(x:x+rmnr-1,y:y+rmnc-1)==0));\r\n\r\nassert(rmnr*rmnc\u003e=16,sprintf('Expected 16 pixels, only have %i\\n',rmnr*rmnc))\r\nassert(isequal(pass,1),sprintf('Not all non-zero [%i,%i] [%i,%i]\\n',x,y,x+rmnr-1,y+rmnc-1))\r\n\r\nfprintf('Time to process %.0f msec\\n',dt);\r\nfprintf('idx=%i x=%i y=%i  rect_nr=%i  rect_nc=%i\\n',idxtlc,x,y,rmnr,rmnc)\r\n%%\r\n% Load aviris file Layer 1 ; 1.8MB mat file\r\nglobal dt\r\ntic % approx 2.5 sec to write and load\r\nurlwrite('http://tinyurl.com/matlab-avmofL001','aviris_moffett_L001.mat');\r\ntoc\r\nload('aviris_moffett_L001.mat');\r\ntoc\r\n\r\n% Array variable is L001\r\n%Files also posted are L010,L023,L157, and L158 with same tinyurl format\r\n% L010 and L023 have high contrast L157 and L158 are in atmospheric notch\r\n\r\n% Time Trial File 1924 x 753\r\nt0=clock;\r\n[idxtlc rmnr rmnc]=rect_mask(L001);\r\ndt=etime(clock,t0)*1000; % ms\r\n\r\n[x y]=ind2sub(size(L001),idxtlc);\r\npass=~any(any(L001(x:x+rmnr-1,y:y+rmnc-1)==0));\r\n\r\nassert(rmnr*rmnc\u003e=1282281,sprintf('Expected 1282281 pixels, only have %i\\n',rmnr*rmnc))\r\nassert(isequal(pass,1),sprintf('Not all non-zero [%i,%i] [%i,%i]\\n',x,y,x+rmnr-1,y+rmnc-1))\r\n\r\nfprintf('Time to process %.0f msec\\n',dt);\r\nfprintf('idx=%i x=%i y=%i  rect_nr=%i  rect_nc=%i\\n',idxtlc,x,y,rmnr,rmnc)\r\n\r\n%%\r\nglobal dt\r\n%Write file based on time in test 1\r\nnet_time=uint32(dt);\r\n% net_time in ms\r\n% Create graph data\r\nnet_time=min(4000,net_time); % Limit graph y-axis\r\nfh=fopen('rect_mask.m','wt');\r\nfeval(@assignin,'caller','score',net_time)\r\nfprintf(fh,'%s\\n',repmat('1;',[1,round(net_time/2)]));\r\nfclose(fh);","published":true,"deleted":false,"likes_count":0,"comments_count":1,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":4,"test_suite_updated_at":"2012-08-15T00:11:30.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2012-08-13T00:01:09.000Z","updated_at":"2012-08-15T00:22:27.000Z","published_at":"2012-08-13T05:16:56.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\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/media/image2.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 AVIRIS data sometimes is provided uncropped. This creates edge regions with values of \\\"-50\\\". Shown is AVIRIS Moffett Field image Layer 1 (400nm) and a zoom of the top-right corner. The dark blue on the edges is non-imaged ground.\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\u003eTo expedite compression the unused mask can be created with an interior excluded rectangle of no Zeros and maximum pixels. The challenge is to quickly and accurately determine the maximum non-zero inscribed rectangle for this image and some other test cases.\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: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=\\\"rId2\\\"/\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:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e m ( 2-D array with zero and non-zero values )\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 [idxtlc rmnr rmnc]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eidxtlc : array index of top left corner\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003ermnr : numer of rows of the non-zero rectangle mask\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003ermnc : number of columns of the non-zero rectangle mask\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\u003eScore:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Time ( msec ) Based upon time to process the 1924x753 AVIRIS image.\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\u003e(If time-out occurs I suggest downloading the mat file using the test suite code and then optimize with profiler.)\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\u003ePassing:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Minimum number of pixels in rectangle\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eExample:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003em=[ 1 1 0 1 1......idxtlc = 3 ( index of TLC row 3, col 1)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e........1 0 1 1 1......rmnr = 3 ( rectangle mask number rows )\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e........1 1 1 1 1......rmnc = 5 ( rectangle mask number columns )\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e........1 1 1 1 1......Maximum rectangle pixels of 15\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e........1 1 1 1 1 ]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eFor the AVIRIS image the zero edge bit mask encoding can be reduced 89% using an inscribed rectangle.\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\u003eNote: Additional test cases may be invoked if hard coded solution achieves best score.\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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\"},{\"partUri\":\"/media/image2.JPEG\",\"contentType\":\"image/JPEG\",\"content\":\"data:image/JPEG;base64,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\"}]}"},{"id":916,"title":"Rubik's Cube : Solve Ten Face Move - Speed Scoring","description":"A set of cubes will be scrambled with 10 Face moves.\r\nThe Challenge is to Solve all Cubes in 10 Moves or Less.\r\nScore will be by cumulative time of cubes 2 thru 11. The first cube may be used to load arrays but is still required to solve the cube.\r\nTen moves relates to worst case 18^10 configs - 3.6e12. In actuality there are only 2.4e11 cubes at 10 turns. Brute force might not work.\r\n\r\n\r\n\u003c\u003chttps://sites.google.com/site/razapor/matlab_cody/cube_small.gif\u003e\u003e\r\n\r\n\u003c\u003chttps://sites.google.com/site/razapor/matlab_cody/Cube_Map48_200.png\u003e\u003e\r\n\r\n\u003c\u003chttp://mathworks.com/matlabcentral/images/surf.gif\u003e\u003e\r\n\r\n\r\n.\r\n\r\n*Input:* Cube vector (1x48](see Figure) with values 0:5, eight of each\r\n\r\n*Output:* Rotation Vector of 10 or less values. Values range from 1:18\r\n\r\nValues 1:18 represent the standard cube moves:ufdlbru'f'd'l'b'r'u2f2d2l2b2r2\r\n\r\n*Example:* Move of FL[2 4]  requires L'F' solv_vec=[10 8] at a minimum to solve\r\n\r\nCube=[00303003 44410110 11022222 22253533 53344444 11155555] as integer array\r\n\r\nsolv_vec=[10 8]\r\n\r\nActual solutions will be 8 to 10 values.\r\n\r\n\r\nThe Cube sites claim a capability of solving 10 moves in only 40 hrs.\r\nNot sure if they have Matlab, which can achieve 10 moves in \u003c0.15 sec. Matlab with a 16GB/i5 can solve 12 moves in \u003c 1.8 seconds. Unfortunately, Cody appears to have a memory/processing speed issue which makes the 11 and 12 move Challenges impossible.\r\n\r\n\u003chttp://kociemba.org/cube.htm Cube Org\u003e  and \u003chttp://www.speedcubing.com/CubeSolver/CubeSolver.html Speed Cubing\u003e\r\n\r\nThe next Cube Challenge will be to solve a fully randomized cube in as few moves as possible. With this next challenge I'll post my 3D-Cube Viewer Tool used for algorithm development.\r\n ","description_html":"\u003cp\u003eA set of cubes will be scrambled with 10 Face moves.\r\nThe Challenge is to Solve all Cubes in 10 Moves or Less.\r\nScore will be by cumulative time of cubes 2 thru 11. The first cube may be used to load arrays but is still required to solve the cube.\r\nTen moves relates to worst case 18^10 configs - 3.6e12. In actuality there are only 2.4e11 cubes at 10 turns. Brute force might not work.\u003c/p\u003e\u003cimg src=\"https://sites.google.com/site/razapor/matlab_cody/cube_small.gif\"\u003e\u003cimg src=\"https://sites.google.com/site/razapor/matlab_cody/Cube_Map48_200.png\"\u003e\u003cimg src=\"http://mathworks.com/matlabcentral/images/surf.gif\"\u003e\u003cp\u003e.\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e Cube vector (1x48](see Figure) with values 0:5, eight of each\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e Rotation Vector of 10 or less values. Values range from 1:18\u003c/p\u003e\u003cp\u003eValues 1:18 represent the standard cube moves:ufdlbru'f'd'l'b'r'u2f2d2l2b2r2\u003c/p\u003e\u003cp\u003e\u003cb\u003eExample:\u003c/b\u003e Move of FL[2 4]  requires L'F' solv_vec=[10 8] at a minimum to solve\u003c/p\u003e\u003cp\u003eCube=[00303003 44410110 11022222 22253533 53344444 11155555] as integer array\u003c/p\u003e\u003cp\u003esolv_vec=[10 8]\u003c/p\u003e\u003cp\u003eActual solutions will be 8 to 10 values.\u003c/p\u003e\u003cp\u003eThe Cube sites claim a capability of solving 10 moves in only 40 hrs.\r\nNot sure if they have Matlab, which can achieve 10 moves in \u0026lt;0.15 sec. Matlab with a 16GB/i5 can solve 12 moves in \u0026lt; 1.8 seconds. Unfortunately, Cody appears to have a memory/processing speed issue which makes the 11 and 12 move Challenges impossible.\u003c/p\u003e\u003cp\u003e\u003ca href=\"http://kociemba.org/cube.htm\"\u003eCube Org\u003c/a\u003e  and \u003ca href=\"http://www.speedcubing.com/CubeSolver/CubeSolver.html\"\u003eSpeed Cubing\u003c/a\u003e\u003c/p\u003e\u003cp\u003eThe next Cube Challenge will be to solve a fully randomized cube in as few moves as possible. With this next challenge I'll post my 3D-Cube Viewer Tool used for algorithm development.\u003c/p\u003e","function_template":"function solv_vec = Rubik_Solve_10(cube)\r\n  solv_vec=[1 2 3 4 5 6 7 8 9 10 11];\r\n\r\nvf=[ 17 2 3 20 5 22 7 8 11 13 16 10 15 9 12 14 41 18 19 44 21 46 23 24 25 26 27 28 29 30 31 32 33 34 6 36 4 38 39 1 40 42 43 37 45 35 47 48; \r\n  1 2 3 4 5 25 28 30 9 10 8 12 7 14 15 6 19 21 24 18 23 17 20 22 43 26 27 42 29 41 31 32 33 34 35 36 37 38 39 40 11 13 16 44 45 46 47 48 ;\r\n  1 2 38 4 36 6 7 33 9 10 11 12 13 14 15 16 17 18 3 20 5 22 23 8 27 29 32 26 31 25 28 30 48 34 35 45 37 43 39 40 41 42 19 44 21 46 47 24 ;\r\n  3 5 8 2 7 1 4 6 33 34 35 12 13 14 15 16 9 10 11 20 21 22 23 24 17 18 19 28 29 30 31 32 25 26 27 36 37 38 39 40 41 42 43 44 45 46 47 48 ;\r\n  14 12 9 4 5 6 7 8 46 10 11 47 13 48 15 16 17 18 19 20 21 22 23 24 25 26 1 28 2 30 31 3 35 37 40 34 39 33 36 38 41 42 43 44 45 32 29 27 ;\r\n  1 2 3 4 5 6 7 8 9 10 11 12 13 22 23 24 17 18 19 20 21 30 31 32 25 26 27 28 29 38 39 40 33 34 35 36 37 14 15 16 43 45 48 42 47 41 44 46 ;\r\n  40 2 3 37 5 35 7 8 14 12 9 15 10 16 13 11 1 18 19 4 21 6 23 24 25 26 27 28 29 30 31 32 33 34 46 36 44 38 39 41 17 42 43 20 45 22 47 48 ;\r\n  1 2 3 4 5 16 13 11 9 10 41 12 42 14 15 43 22 20 17 23 18 24 21 19 6 26 27 7 29 8 31 32 33 34 35 36 37 38 39 40 30 28 25 44 45 46 47 48 ;\r\n  1 2 19 4 21 6 7 24 9 10 11 12 13 14 15 16 17 18 43 20 45 22 23 48 30 28 25 31 26 32 29 27 8 34 35 5 37 3 39 40 41 42 38 44 36 46 47 33 ;\r\n  6 4 1 7 2 8 5 3 17 18 19 12 13 14 15 16 25 26 27 20 21 22 23 24 33 34 35 28 29 30 31 32 9 10 11 36 37 38 39 40 41 42 43 44 45 46 47 48 ;\r\n  27 29 32 4 5 6 7 8 3 10 11 2 13 1 15 16 17 18 19 20 21 22 23 24 25 26 48 28 47 30 31 46 38 36 33 39 34 40 37 35 41 42 43 44 45 9 12 14 ;\r\n  1 2 3 4 5 6 7 8 9 10 11 12 13 38 39 40 17 18 19 20 21 14 15 16 25 26 27 28 29 22 23 24 33 34 35 36 37 30 31 32 46 44 41 47 42 48 45 43 ;\r\n  41 2 3 44 5 46 7 8 16 15 14 13 12 11 10 9 40 18 19 37 21 35 23 24 25 26 27 28 29 30 31 32 33 34 22 36 20 38 39 17 1 42 43 4 45 6 47 48 ;\r\n  1 2 3 4 5 43 42 41 9 10 30 12 28 14 15 25 24 23 22 21 20 19 18 17 16 26 27 13 29 11 31 32 33 34 35 36 37 38 39 40 8 7 6 44 45 46 47 48 ;\r\n  1 2 43 4 45 6 7 48 9 10 11 12 13 14 15 16 17 18 38 20 36 22 23 33 32 31 30 29 28 27 26 25 24 34 35 21 37 19 39 40 41 42 3 44 5 46 47 8 ;\r\n  8 7 6 5 4 3 2 1 25 26 27 12 13 14 15 16 33 34 35 20 21 22 23 24 9 10 11 28 29 30 31 32 17 18 19 36 37 38 39 40 41 42 43 44 45 46 47 48 ;\r\n  48 47 46 4 5 6 7 8 32 10 11 29 13 27 15 16 17 18 19 20 21 22 23 24 25 26 14 28 12 30 31 9 40 39 38 37 36 35 34 33 41 42 43 44 45 3 2 1 ; \r\n  1 2 3 4 5 6 7 8 9 10 11 12 13 30 31 32 17 18 19 20 21 38 39 40 25 26 27 28 29 14 15 16 33 34 35 36 37 22 23 24 48 47 46 45 44 43 42 41 ];\r\n\r\n% Basic move is implemented using the rot table\r\n% cube=cube(vf(mov,:)); % mov is 1:18 represents  ufdlbru'f'd'l'b'r'u2f2d2l2b2r2\r\n% Note: only the 48 moving cube tiles are mapped\r\n% a solved cube displays as [000000001111111122222222333333334444444455555555]\r\n\r\nend","test_suite":"%%\r\n% Load max score of 50 seconds\r\nfeval(@assignin,'caller','score',50)\r\n%%\r\nglobal vf gPass\r\nPass=1;\r\n% Load rot map 18 moves : ufdlbru'f'd'l'b'r'u2f2d2l2b2r2\r\n vf=[ 17 2 3 20 5 22 7 8 11 13 16 10 15 9 12 14 41 18 19 44 21 46 23 24 25 26 27 28 29 30 31 32 33 34 6 36 4 38 39 1 40 42 43 37 45 35 47 48; \r\n  1 2 3 4 5 25 28 30 9 10 8 12 7 14 15 6 19 21 24 18 23 17 20 22 43 26 27 42 29 41 31 32 33 34 35 36 37 38 39 40 11 13 16 44 45 46 47 48 ;\r\n  1 2 38 4 36 6 7 33 9 10 11 12 13 14 15 16 17 18 3 20 5 22 23 8 27 29 32 26 31 25 28 30 48 34 35 45 37 43 39 40 41 42 19 44 21 46 47 24 ;\r\n  3 5 8 2 7 1 4 6 33 34 35 12 13 14 15 16 9 10 11 20 21 22 23 24 17 18 19 28 29 30 31 32 25 26 27 36 37 38 39 40 41 42 43 44 45 46 47 48 ;\r\n  14 12 9 4 5 6 7 8 46 10 11 47 13 48 15 16 17 18 19 20 21 22 23 24 25 26 1 28 2 30 31 3 35 37 40 34 39 33 36 38 41 42 43 44 45 32 29 27 ;\r\n  1 2 3 4 5 6 7 8 9 10 11 12 13 22 23 24 17 18 19 20 21 30 31 32 25 26 27 28 29 38 39 40 33 34 35 36 37 14 15 16 43 45 48 42 47 41 44 46 ;\r\n  40 2 3 37 5 35 7 8 14 12 9 15 10 16 13 11 1 18 19 4 21 6 23 24 25 26 27 28 29 30 31 32 33 34 46 36 44 38 39 41 17 42 43 20 45 22 47 48 ;\r\n  1 2 3 4 5 16 13 11 9 10 41 12 42 14 15 43 22 20 17 23 18 24 21 19 6 26 27 7 29 8 31 32 33 34 35 36 37 38 39 40 30 28 25 44 45 46 47 48 ;\r\n  1 2 19 4 21 6 7 24 9 10 11 12 13 14 15 16 17 18 43 20 45 22 23 48 30 28 25 31 26 32 29 27 8 34 35 5 37 3 39 40 41 42 38 44 36 46 47 33 ;\r\n  6 4 1 7 2 8 5 3 17 18 19 12 13 14 15 16 25 26 27 20 21 22 23 24 33 34 35 28 29 30 31 32 9 10 11 36 37 38 39 40 41 42 43 44 45 46 47 48 ;\r\n  27 29 32 4 5 6 7 8 3 10 11 2 13 1 15 16 17 18 19 20 21 22 23 24 25 26 48 28 47 30 31 46 38 36 33 39 34 40 37 35 41 42 43 44 45 9 12 14 ;\r\n  1 2 3 4 5 6 7 8 9 10 11 12 13 38 39 40 17 18 19 20 21 14 15 16 25 26 27 28 29 22 23 24 33 34 35 36 37 30 31 32 46 44 41 47 42 48 45 43 ;\r\n  41 2 3 44 5 46 7 8 16 15 14 13 12 11 10 9 40 18 19 37 21 35 23 24 25 26 27 28 29 30 31 32 33 34 22 36 20 38 39 17 1 42 43 4 45 6 47 48 ;\r\n  1 2 3 4 5 43 42 41 9 10 30 12 28 14 15 25 24 23 22 21 20 19 18 17 16 26 27 13 29 11 31 32 33 34 35 36 37 38 39 40 8 7 6 44 45 46 47 48 ;\r\n  1 2 43 4 45 6 7 48 9 10 11 12 13 14 15 16 17 18 38 20 36 22 23 33 32 31 30 29 28 27 26 25 24 34 35 21 37 19 39 40 41 42 3 44 5 46 47 8 ;\r\n  8 7 6 5 4 3 2 1 25 26 27 12 13 14 15 16 33 34 35 20 21 22 23 24 9 10 11 28 29 30 31 32 17 18 19 36 37 38 39 40 41 42 43 44 45 46 47 48 ;\r\n  48 47 46 4 5 6 7 8 32 10 11 29 13 27 15 16 17 18 19 20 21 22 23 24 25 26 14 28 12 30 31 9 40 39 38 37 36 35 34 33 41 42 43 44 45 3 2 1 ; \r\n  1 2 3 4 5 6 7 8 9 10 11 12 13 30 31 32 17 18 19 20 21 38 39 40 25 26 27 28 29 14 15 16 33 34 35 36 37 22 23 24 48 47 46 45 44 43 42 41 ];\r\n\r\nr=ones(1,48,'uint8'); \r\n r(1:8)=0; %5;     %Left % straight numeric mapping\r\n r(9:16)=1; %2;   %Up\r\n r(17:24)=2; %3;   %Front\r\n r(25:32)=3; %4;   %Down\r\n r(33:40)=4; %6;   %Back\r\n r(41:48)=5; %7; %Right\r\n \r\nmix=10;\r\nrmov=randi(18,[mix,1]);\r\n for i=1:length(rmov) \r\n  if i\u003e1 % Eliminate move undos\r\n  % f2 f2 or f f'  or f' f\r\n   if (rmov(i)\u003e12 \u0026\u0026 rmov(i-1)==rmov(i))||(rmov(i-1)\u003c7 \u0026\u0026 rmov(i)==rmov(i-1)+6)||...\r\n       (rmov(i-1)\u003e6  \u0026\u0026 rmov(i)==rmov(i-1)-6)    \r\n    rmov(i)=rmov(i)+1;   % 1:17 map to 2:18  18 map to 1\r\n    if rmov(i)==19,rmov(i)=1;end\r\n   end\r\n  end\r\n  r=r(vf(rmov(i),:));\r\n end\r\n\r\n\r\n%assert(isequal(your_fcn_name(x),y_correct))\r\n\r\nt0=clock;\r\nsolv_vec=Rubik_Solve_10(r)\r\ndt=etime(clock,t0)\r\n% Dubious Code Check\r\nif all(r(1:8)==r(1)) \u0026\u0026 all(r(9:16)==r(9))  \u0026\u0026 all(r(17:24)==r(17)) \u0026\u0026 ...\r\n     all(r(25:32)==r(25))  \u0026\u0026 all(r(33:40)==r(33)) \u0026\u0026 all(r(41:48)==r(41))\r\n Pass=0;\r\nend\r\n\r\nPass=Pass \u0026\u0026 length(solv_vec\u003c11);\r\n\r\nlength(solv_vec)\r\nrt=r;\r\nfor i=1:length(solv_vec)\r\n   rt=rt(vf(solv_vec(i),:));\r\n end\r\n if all(rt(1:8)==rt(1)) \u0026\u0026 all(rt(9:16)==rt(9))  \u0026\u0026 all(rt(17:24)==rt(17)) \u0026\u0026 ...\r\n     all(rt(25:32)==rt(25))  \u0026\u0026 all(rt(33:40)==rt(33)) \u0026\u0026 all(rt(41:48)==rt(41))\r\n   fprintf('Cube Solved\\n')\r\n  Pass=Pass; % No change to Pass status\r\n else\r\n  fprintf('Cube Solve Failure\\n')\r\n  Pass=0;\r\n end\r\n\r\nassert(isequal(Pass,1))\r\n\r\ngPass=Pass;\r\n\r\n%%\r\n\r\nglobal gPass vf\r\nPass1=gPass;\r\n\r\n\r\nr=ones(1,48,'uint8'); \r\n r(1:8)=0; %5;     %Left % straight numeric mapping\r\n r(9:16)=1; %2;   %Up\r\n r(17:24)=2; %3;   %Front\r\n r(25:32)=3; %4;   %Down\r\n r(33:40)=4; %6;   %Back\r\n r(41:48)=5; %7; %Right\r\nrbase=r;\r\n\r\nsum_dt=0;\r\nfor cases=1:10 \r\n r=rbase;\r\n mix=10;\r\n rmov=randi(18,[mix,1]);\r\n  for i=1:length(rmov) \r\n   if i\u003e1 % Eliminate move undos\r\n   % f2 f2 or f f'  or f' f\r\n    if (rmov(i)\u003e12 \u0026\u0026 rmov(i-1)==rmov(i))||(rmov(i-1)\u003c7 \u0026\u0026 rmov(i)==rmov(i- 1)+6)||...\r\n       (rmov(i-1)\u003e6  \u0026\u0026 rmov(i)==rmov(i-1)-6)    \r\n     rmov(i)=rmov(i)+1;   % 1:17 map to 2:18  18 map to 1\r\n     if rmov(i)==19,rmov(i)=1;end\r\n    end\r\n   end\r\n   r=r(vf(rmov(i),:));\r\n  end\r\n\r\n\r\nt0=clock;\r\nsolv_vec=Rubik_Solve_10(r)\r\ndt=etime(clock,t0)\r\nsum_dt=sum_dt+dt;\r\n\r\nPass1=Pass1 \u0026\u0026 length(solv_vec\u003c11);\r\n\r\nrt=r;\r\nfor i=1:length(solv_vec)\r\n   rt=rt(vf(solv_vec(i),:));\r\n end\r\n if all(rt(1:8)==rt(1)) \u0026\u0026 all(rt(9:16)==rt(9))  \u0026\u0026 all(rt(17:24)==rt(17)) \u0026\u0026 ...\r\n     all(rt(25:32)==rt(25))  \u0026\u0026 all(rt(33:40)==rt(33)) \u0026\u0026 all(rt(41:48)==rt(41))\r\n   fprintf('Cube Solved\\n')\r\n  Pass1=Pass1; % No change to Pass1 status\r\n else\r\n  fprintf('Cube Solve Failure\\n')\r\n  Pass1=0;\r\n end\r\n\r\nend\r\n\r\n\r\n\r\nassert(isequal(Pass1,1))\r\n\r\nif Pass1\r\n feval(@assignin,'caller','score',floor(sum_dt))\r\nend\r\n","published":true,"deleted":false,"likes_count":1,"comments_count":0,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":2,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2012-08-19T03:27:10.000Z","updated_at":"2012-08-26T03:40:30.000Z","published_at":"2012-08-19T07:18:19.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.gif\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/media/image1.png\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"targetMode\":\"\",\"relationshipId\":\"rId3\",\"target\":\"/media/image2.gif\"}],\"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\u003eA set of cubes will be scrambled with 10 Face moves. The Challenge is to Solve all Cubes in 10 Moves or Less. Score will be by cumulative time of cubes 2 thru 11. The first cube may be used to load arrays but is still required to solve the cube. Ten moves relates to worst case 18^10 configs - 3.6e12. In actuality there are only 2.4e11 cubes at 10 turns. Brute force might not work.\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: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=\\\"rId2\\\"/\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: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=\\\"rId3\\\"/\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\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Cube vector (1x48](see Figure) with values 0:5, eight of each\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 Rotation Vector of 10 or less values. Values range from 1:18\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\u003eValues 1:18 represent the standard cube moves:ufdlbru'f'd'l'b'r'u2f2d2l2b2r2\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eExample:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Move of FL[2 4] requires L'F' solv_vec=[10 8] at a minimum to solve\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\u003eCube=[00303003 44410110 11022222 22253533 53344444 11155555] as integer array\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\u003esolv_vec=[10 8]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eActual solutions will be 8 to 10 values.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe Cube sites claim a capability of solving 10 moves in only 40 hrs. Not sure if they have Matlab, which can achieve 10 moves in \u0026lt;0.15 sec. Matlab with a 16GB/i5 can solve 12 moves in \u0026lt; 1.8 seconds. Unfortunately, Cody appears to have a memory/processing speed issue which makes the 11 and 12 move Challenges impossible.\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=\\\"http://kociemba.org/cube.htm\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eCube Org\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e and\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.speedcubing.com/CubeSolver/CubeSolver.html\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eSpeed Cubing\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe next Cube Challenge will be to solve a fully randomized cube in as few moves as possible. With this next challenge I'll post my 3D-Cube Viewer Tool used for algorithm development.\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.gif\",\"contentType\":\"image/gif\",\"content\":\"data:image/gif;base64,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\"},{\"partUri\":\"/media/image1.png\",\"contentType\":\"image/png\",\"content\":\"data:image/png;base64,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\"},{\"partUri\":\"/media/image2.gif\",\"contentType\":\"image/gif\",\"content\":\"data:image/gif;base64,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\"}]}"}],"problem_search":{"errors":[],"problems":[{"id":58842,"title":"ICFP 2023 Orchestra:  Score Optimization of Puzzle-17 Second point","description":"The ICFP 2023 Competition in July was to place musicians on a stage to maximize the attendees net Joy.  The ICFP 2023 Orchestra Spec shows details of the contest. The musicians played various instruments with attendees having preference values for each instrument type. Musicians could block attendees from seeing musicians behind them. Blocking occurs if a_i to m_j vector touched within 5 of m_k. No musicians allowed within 10 of one another. \r\nThis Challenge is to place a second musician onto the stage, mxy, to increase Joy by at least 23400.  The Joy table am is Joy co-factor of each attendee for each musician type. Joy is scaled by 1/distance-squared between Musician and Attendee. Joy(j,i)=1000000*am(i,mu(j))/d2(i,j).\r\nThe Joy here is to brute force a solution.\r\nThe scoring of a placed musician is a discontinuous non-linear function due to vignetting and the 1/distance-squared scaling. There appears to be a grumpy audience cluster at the top left such that vignetting them and their negative Joy raises the Joy of a musician's placement on the xmax stage edge.\r\nGiven all the contest parameters and an initial musician placed at Top-Left of stage (xmax,ymax) return a muscian position (x,y) and type to raise total Joy by at least 23400. A non-integer solution exists with x=xmax.\r\n\r\nThe scoring and blocking functions are provided in the template.\r\n \r\nProblem 17: Stage in Pink and 5000 audience as black dots in top right corner of arena. The first musician is placed at (xmax,ymax)\r\n\r\nThis plot shows the scoring of a second point placed at (xmax, y) where y is the y-axis of the graph and the x-axis is the additive score created by this second point. The first point is placed at (xmax,1220) thus no points allowed (1210:1220]. Down to 1202.6 the entire audience is blocked from viewing. Different samplings are shown: */1, Green/0.1, Black/.01, and Red/.001  To achieve the \u003e23400 requires a resolution of 0.001.  This graph gives clues for limiting the search range.","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: 1608px; display: block; min-width: 0px; padding-block-start: 0px; padding-top: 0px; perspective-origin: 407px 804px; transform-origin: 407px 804px; vertical-align: baseline; \"\u003e\u003cdiv style=\"block-size: 84px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 42px; text-align: left; transform-origin: 384px 42px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 346.5px 8px; transform-origin: 346.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe ICFP 2023 Competition in July was to place musicians on a stage to maximize the attendees net Joy.  The \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://drive.google.com/file/d/16GFrZMudBrNwjMi3tOaP_iiSHh5pUtXL/view?usp=sharing\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eICFP 2023 Orchestra Spec\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: 334px 8px; transform-origin: 334px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e shows details of the contest. The musicians played various instruments with attendees having preference values for each instrument type. Musicians could block attendees from seeing musicians behind them. Blocking occurs if a_i to m_j vector touched within 5 of m_k. No musicians allowed within 10 of one another. \u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 63px; 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 31.5px; text-align: left; transform-origin: 384px 31.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: 382px 8px; transform-origin: 382px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThis Challenge is to place a second musician onto the stage, mxy, to increase Joy by at least 23400.  The Joy table am is Joy co-factor of each attendee for each musician type. Joy is scaled by 1/distance-squared between Musician and Attendee. Joy(j,i)=1000000*am(i,mu(j))/d2(i,j).\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: 127.5px 8px; transform-origin: 127.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe Joy here is to brute force a solution.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 63px; 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 31.5px; text-align: left; transform-origin: 384px 31.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: 369px 8px; transform-origin: 369px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe scoring of a placed musician is a discontinuous non-linear function due to vignetting and the 1/distance-squared scaling. There appears to be a grumpy audience cluster at the top left such that vignetting them and their negative Joy raises the Joy of a musician's placement on the xmax stage edge.\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: 384px 8px; transform-origin: 384px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eGiven all the contest parameters and an initial musician placed at Top-Left of stage (xmax,ymax) return a muscian position (x,y) and type to raise total Joy by at least 23400. A non-integer solution exists with x=xmax.\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: 202.5px 8px; transform-origin: 202.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe scoring and blocking functions are provided in the template.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 425.5px; 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 212.75px; text-align: left; transform-origin: 384px 212.75px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cimg class=\"imageNode\" style=\"vertical-align: baseline\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjAAAAGkCAIAAACgjIjwAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wgJDTImvUjHDgAAACR0RVh0U29mdHdhcmUATUFUTEFCLCBUaGUgTWF0aFdvcmtzLCBJbmMuPFjdGAAAACJ0RVh0Q3JlYXRpb24gVGltZQAwOS1BdWctMjAyMyAwNjo1MDozOKla/X0AABafSURBVHic7dxhaNT3/cDx7+WsbqRISqaCAUvQNKGlSEwrU1oftORBoa4FKXWTdtQOqk5oSx4IfdAIWkYqWxsfFGYZg6GTUkFIYQNlrsb/tWUse9Cm1RiqkUBnNpPek45qcrn/g2yn07vpMvU+8V6vR7lPvuon11/zNveLyRSLxQQA1VZX7QUAICVBAiAIQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiCEedVeAJjbMpnMDZ4sFou3dBPmOkHiFrrxT1UAgsStNVf+Utza2jo0NFTtLa4v4J7+2sHN4h5STRsaGjp69OjZs2evHI6Ojh49evTaz3pl55UOA/y3BKl2/eIXv9i+ffsf/vCHn/zkJ7/85S9nhn19fRs3bjxy5MjWrVt7e3tLh8vOKx2ei+ZKU+fKnjAbRWrS6dOnH3jggYmJiWKx+Le//a2tre3ChQtTU1Pt7e2nT58uFosXLlxYuXLlmTNnisVi2Xmlw1dygdUCn224WdxDqlHLly8/fPjwPffck1KaN2/e9PT01NRUf39/Q0NDS0tLSqmxsXHdunW5XK65ubnsfGRkpOzhq/6g1tbWmTf81R74zwSpRtXV1bW0tBQKhUOHDh04cOCnP/3pkiVLPvroo7a2ttKZ+vr6mYrk8/lr5/X19WUPX0WHgBvkHlJNm5iY+Pbbb5csWfJ///d/X3/9daFQuPI7prLZbLFYTCmVnVc6DDA7glTTFi1a9OMf//jdd9/97ne/+5vf/Gb+/PnT09Ol9xYKhWw2m1IqO690GGB2BKlGffnll/v37y89XLJkyV//+tfFixcPDg6Whvl8vqOjI6VUdl7pMMDsCFKNmp6e/tnPfvbll1+mlP7+97/ncrnOzs7Vq1enlI4fP55SGh4ezuVya9asSSmVnVc6DDA7Ga/716yDBw/29PSsWrXqL3/5y9atW1966aWU0ieffNLV1bVixYrBwcHdu3c/8cQTM4fLzisdLslkXGB3Pj/LjpvF5wtuIUGqBYLEzeLbvoH/yQ1mxo+847rcQwIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIIR51V6AahoeHh4ZGWlsbFy1atXMZHx8/OzZs6UD991338KFC2feHh0dPXXq1LJly1pbW0sHyg4BZkGQateuXbv++Mc/dnR0DA0N3X333b/+9a8XLFhw+PDht956a8GCBTNnent7H3300ZRSX19fT0/P2rVrBwYGnnrqqZdffrnSEGCWitSkzz///IEHHpiYmJh5+OSTT77//vvFYvGVV17Zv3//VYenpqba29tPnz5dLBYvXLiwcuXKM2fOlB1e9QtdYJS4GLguXyHVqIaGhn379t1zzz0zD5ubm7/66quU0smTJ5999tnx8fGFCxfeddddM+/t7+9vaGhoaWlJKTU2Nq5bty6Xy42MjFw7bG5uvuoPKr2UNzQ0dHs+NELxWi43TpBq1NKlS5cuXTrz9sjIyLFjx7Zs2VIoFM6dO7dr166JiYl8Pr9hw4bdu3enlPL5fFtbW+nX1tfXDw0N1dfXXzu89g/SoRpXugAymUx1NyE+32VX68bGxl544YVt27bdf//958+f7+zs3Ldv38cff/zhhx/29/cfPHgwpVQoFK78bJLNZovFYtlhFT4A4E4hSDXt008/ffrpp5977rlt27allJqamvbu3dvU1JRSWrJkSWdn58DAQEpp/vz509PTpV9VKBSy2WzZ4W3/CIA7hyDVro8++ujFF1/cuXPn5s2bZyYjIyOHDh0qHbh06VJdXV1KafHixYODg6V5Pp/v6OgoO7xduwN3IEGqUaOjo9u3b3/zzTcfe+yxycnJycnJQqFw8eLF7u7u4eHhlNLY2NixY8fWr1+fUlq9enVK6fjx4yml4eHhXC63Zs2assNqfkjAHOebGmrUgQMHvvnmmy1btpQmmzZtev3111977bVnn332wQcf/Oyzz7Zv3z7zj5Dq6ur27NnT1dW1YsWKwcHBnp6eRYsWpZTKDgFmJ+NGNLdOJuMC459cDFyXl+wACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIYV61F6CahoeHR0ZGGhsbV61aVRqOjo6eOnVq2bJlra2tVx4uO690GOC/5Suk2rVr166XXnrpyJEjO3fu/NGPfnTx4sWUUl9f38aNG48cObJ169be3t7S4bLzSocBZqNITfr8888feOCBiYmJmYdPPvnk+++/PzU11d7efvr06WKxeOHChZUrV545c6ZYLJadVzp8JRcYJS4GrstXSDWqoaFh375999xzz8zD5ubmr776qr+/v6GhoaWlJaXU2Ni4bt26XC6XUio7r3QYYHbcQ6pRS5cuXbp06czbIyMjx44d27Jly9DQUFtbW+lMfX390NBQSimfz187r6+vL3v4KqV7S2Xfyx3PzUVunCDVurGxsRdeeGHbtm3333//F198kclkSu/KZrPFYjGlVCgUrp2XHV77++tQjStdAFdeLVCWl+xq2qeffvr0008/99xz27ZtSynNnz9/enq69N5CoZDNZivNKx0GmB1Bql0fffTRiy++uHPnzs2bN89MFi9ePDg4WDqQz+c7OjoqzSsdBpgdQapRo6Oj27dvf/PNNx977LHJycnJyclCobB69eqU0vHjx1NKw8PDuVxuzZo1KaWy80qHAWbHPaQadeDAgW+++WbLli2lyaZNm15//fU9e/Z0dXWtWLFicHCwp6dn0aJFKaW6urqy87JDgNnJlL0RDTdFJuMC459cDFyXl+wACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQ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B++6664rP5Vks9mZF14KhULZOcDseMmOy5qamvbu3dvU1JRSWrJkSWdn58DAwPz586enp0tnCoVCNptNKVWaA8yOIHHZyMjIoUOHSg8vXbpUV1e3ePHiwcHB0jCfz3d0dKSUKs0BZkeQuOzixYvd3d3Dw8MppbGxsWPHjq1fv3716tUppePHj6eUhoeHc7ncmjVrUkqV5gCz4xsx+TcHDhz4+c9//uCDD3722Wfbt2/fvHlzSumTTz7p6upasWLF4ODg7t27n3jiiZnDleYlvtOXEhcD1+US4RbyOYgSFwPX5SU7AEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAk/iejo6NHjx4dGhqq9iLAnCdIzF5fX9/GjRuPHDmydevW3t7eaq/zP2ltba32CjfEntzB5lV7AeaqQqGwc+fO9957r6WlZXx8/PHHH//BD37Q3Nxc7b2AuUqQmKX+/v6GhoaWlpaUUmNj47p163K53LVBymQy1dhuNubKqvbkTiVIzFI+n29rays9rK+vv/ZOUrFYvL1LAXOYe0jMUqFQuPKvwNlsVn6A/4UgMUvz58+fnp4uPSwUCtlstor7AHOdIDFLixcvHhwcLD3M5/MdHR1V3AeY6wSJWVq9enVK6fjx4yml4eHhXC63Zs2aai8FzGEZr/sza5988klXV9eKFSsGBwd37979xBNPVHsjYA4TJABC8JIdACEIEgAhZHfu3FntHbgzjY6O/ulPf5qamvre975X7V1SSml8fPyLL7746l/uvvvuBQsWpAp7Vmv5EydO3HvvvdddI8LOV65a6bkNsipzhSBxS/T19b366quXLl1699138/n897///WpvlH7729/u2LHj97///QcffPDBBx+0t7ffe++9Zfes1vLvvPNOb2/v5s2bZx5WWiPCzletWva5DbIqc0kRbrapqan29vbTp08Xi8ULFy6sXLnyzJkz1V6q+Morr+zfv//KSdk9q7L8xMTEjh072tvbH3nkkf+wW4Sdr121WO65jbAqc457SNx8ZX/uarWXSidPnly+fPn4+Pjk5OTMpOyeVVn+7bffbmxsfOONN0qTSmtUfedrV03lntsIqzLn+OGq3Hw38nNXb7NCoXDu3Lldu3ZNTEzk8/kNGzbs3r277J719fW3f/nu7u66urqZf2U8o9JzWPWdr1217HMbYVXmHF8hcfMF/Lmr58+f7+zs3Ldv38cff/zhhx/29/cfPHiw7J5VWb6u7ur/EyutUfWdr1217HMbYVXmHEHi5gv4c1ebmpr27t3b1NSUUlqyZElnZ+fAwEDZPYMsX2mNgDuXfW5jrkpwgsTNF/Dnro6MjBw6dKj08NKlS3V1dWX3DLJ8pTUC7lz2uY25KsEJEjdfwJ+7evHixe7u7uHh4ZTS2NjYsWPH1q9fX3bPIMtXWiPgzmWf25irEl31vsGPO9nHH3+8du3a559/ftWqVb/73e+qvU6xWCzu37+/vb39+eefb29v/9WvfjUzLLtntZb/8MMPr/xe6kprRNj5qlXLPrdBVmUO8cNVuYX+8Y9/fOc737n2Nni1TE9Pf/vtt9euVHbPIMtXWiPazpWe20pbBXl6CUWQAAjBX08ACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACOH/ASvjkMvaesP1AAAAAElFTkSuQmCC\" data-image-state=\"image-loaded\"\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 \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: 374px 8px; transform-origin: 374px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eProblem 17: Stage in Pink and 5000 audience as black dots in top right corner of arena. The first musician is placed at (xmax,ymax)\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 651.5px; 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 325.75px; text-align: left; transform-origin: 384px 325.75px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cimg class=\"imageNode\" style=\"vertical-align: baseline;width: 882px;height: 646px\" src=\"data:image/png;base64,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\" data-image-state=\"image-loaded\" width=\"882\" height=\"646\"\u003e\u003c/div\u003e\u003cdiv style=\"block-size: 84px; font-family: Helvetica, Arial, sans-serif; line-height: 21px; margin-block-end: 9px; margin-block-start: 2px; margin-bottom: 9px; margin-inline-end: 10px; margin-inline-start: 4px; margin-left: 4px; margin-right: 10px; margin-top: 2px; perspective-origin: 384px 42px; text-align: left; transform-origin: 384px 42px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 375.5px 8px; transform-origin: 375.5px 8px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThis plot shows the scoring of a second point placed at (xmax, y) where y is the y-axis of the graph and the x-axis is the additive score created by this second point. The first point is placed at (xmax,1220) thus no points allowed (1210:1220]. Down to 1202.6 the entire audience is blocked from viewing. Different samplings are shown: */1, Green/0.1, Black/.01, and Red/.001  To achieve the \u0026gt;23400 requires a resolution of 0.001.  This graph gives clues for limiting the search range.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e","function_template":"function pxyt = find_pxyt(mxy,mu,am,axy,xmin,xmax,ymin,ymax,min_score)\r\n% pxyt  [x,y,musician]; mxy(musician,:)=[x,y] where x is expected to be xmax\r\n%mxy(3,:)=[1022 1220];\r\n \r\n y=1200; %Solve for y such that mpscr \u003e min_score\r\n % Resolution of .001 required to achieve min_score\r\n % Brute force works with bounds from Performance graph\r\n \r\n %The scoring function is discontinuous and non-linear due to vignetting and 1/distance^2 scale\r\n pxy=[xmax y];\r\n [Totscr,muscr,mpscr]=Calc_scoreP(pxy,mxy,mu,am,axy); %Calc scores for pxy placement \r\n % mpscr is pxy score vec of musician types\r\n \r\n pxyt=[xmax y find(mpscr==max(mpscr),1,'first')];\r\n\r\nend % find_pxyt\r\n\r\nfunction [Totscr,muscr,mpscr]=Calc_scoreP(pxy,mxy,mu,am,axy)\r\n%Evaluate pxy for all musician types, only process non [0 0] mxy values\r\n% mpscr is vector of score for all musician types if placed at pxy\r\n%No error checking,volume,pillars\r\n Lmu=length(mu)+1;\r\n mxy=[mxy;pxy]; % augment mxy\r\n na=size(axy,1);\r\n nmut=max(mu);\r\n  \r\n%Calc each mu score\r\n d2am=zeros(na,Lmu);\r\n for j=1:Lmu\r\n  d2am(:,j)=sum((axy-mxy(j,:)).^2,2);\r\n end\r\n \r\n muscr=zeros(Lmu-1,1);\r\n mpscr=zeros(nmut,1);\r\n dmax=25; % square of the distance 5 vignetting rule\r\n for j=1:Lmu\r\n  if mxy(j,1)==0,continue;end % Unfilled mxy\r\n  for i=1:na\r\n   bflag=0;\r\n   for k=1:Lmu %search for any blockng musician \r\n    if mxy(k,1)==0,continue;end % Unfilled mxy\r\n    if k==j,continue;end\r\n    dv2=distP2S2Z(mxy(k,1),mxy(k,2),mxy(j,1),mxy(j,2),axy(i,1),axy(i,2)); %Intra Seg dist\r\n    if min(dv2)\u003c=dmax\r\n     bflag=1;\r\n     break;\r\n    end\r\n   end\r\n   \r\n   if bflag\r\n    continue;\r\n   end\r\n   \r\n   if j==Lmu % Special End Point being evaluated for all types\r\n    for t=1:nmut\r\n     mpscr(t)=mpscr(t)+1000000*am(i,t)/d2am(i,j);\r\n    end\r\n   else % Standard scoring\r\n     muscr(j)=muscr(j)+1000000*am(i,mu(j))/d2am(i,j);\r\n   end\r\n  end\r\n end\r\n Totscr=sum(muscr);\r\nend %Calc_scoreP\r\n\r\nfunction d2=distP2S2Z(px,py,vx,vy,wx,wy)\r\n% Distance Squared from segment only if intra-segment\r\n% reduce to 0\u003c=t\u003c=1\r\n%The point is (px,py) and the segment is [(vx,vy) to (wx,wy)].\r\n% [px py vx vy wx wy]\r\n\r\n d2=Inf;\r\n sL2=(vx-wx)^2+(vy-wy)^2;\r\n t=( (px-vx)*(wx-vx)+(py-vy)*(wy-vy) )/sL2;\r\n if t\u003c0 % Pt beyond normal of segment\r\n  return\r\n elseif t\u003e1 % Pt beyond normal of segment\r\n  return\r\n else\r\n  sx=vx+t*(wx-vx);\r\n  sy=vy+t*(wy-vy);\r\n  d2=(px-sx)^2+(py-sy)^2;\r\n end\r\nend %distP2S2Z\r\n\r\n","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 fname='orc_d_mu_axy_am_pxyr.mat';\r\n %orc is a cell array orc{90} for the 90 Problems in ICFP 2023 Orchestra Competition\r\n \r\n % fn.mat  https://drive.google.com/file/d/10GsOZTIjzMIuO7xAYIqLT1zIq9Cyubl-/view?usp=drive_link\r\n % Google Gives warning thus aborts urlwrite\r\n %\r\n %fname='orc_d_mu_axy_am_pxyr.pdf'\r\n %Fake name of .pdf on GoogleDrive,  write as a mat\r\n \r\n url='https://drive.google.com/file/d/1mgxzsmVQNXgqHEdd61QR2r0STm3N9lgG/view?usp=drive_link';\r\n ptr=strfind(url,'/view'); % Tweaking the url\r\n url(ptr:end)=[];\r\n url=strrep(url,'file/d/','uc?export=download\u0026id=');\r\n \r\n tic\r\n urlwrite(url,fname); %Writing GoogleDrive orc.pdf into orc.mat\r\n fprintf('Download 14MB Time: %.1f  sec\\n\\n',toc); %14MB download Time, about 1-3 sec\r\n \r\n%dir_struct=dir;\r\n%for i=1:size(dir_struct,1)\r\n% fprintf('%i %s %i\\n',i,dir_struct(i).name,dir_struct(i).bytes)\r\n%end\r\n\r\nload(fname);\r\nfprintf('\\n\\nmat Load Time: %.1f\\n\\n',toc); %Load Time of orc from .mat, 0.1 sec\r\n\r\ntic\r\npid=17;\r\nd=orc{pid}.d; %[1000 1000 10 990 10 10] room_width room_h xmin xmax ymin ymax\r\nmu=orc{pid}.mu; %[1 2 3 4 5 6 7 8 9 3 4 7 2 1 2 4]\r\naxy=orc{pid}.axy; %[400,2]\r\nam=orc{pid}.am;  %[400,9]  there are 9 musician types 1:9 seen in mu\r\npxyr=orc{pid}.pxyr; %[0,3] Pillars that do not exist in pid 22\r\nrw=d(1);rh=d(2);xmin=d(3);xmax=d(4);ymin=d(5);ymax=d(6);\r\nfprintf('xmin:%i xmax:%i ymin:%i ymax:%i\\n\\n',d(3:6));\r\n\r\nLmu=length(mu); % number of musicians\r\nmxy=zeros(Lmu,2);\r\nnmut=max(mu); % number of musician types\r\nna=size(axy,1); % number of attendees\r\n\r\nmxy(3,:)=[xmax ymax]; %Placed best scoring musician at Corner nearest Audience\r\n \r\nmin_score=23400;\r\nztic=tic;\r\npxyt = find_pxyt(mxy,mu,am,axy,xmin,xmax,ymin,ymax,min_score);\r\nfprintf('x:%.0f y:%.4f t:%.0f  Time:%.3f\\n',pxyt,toc(ztic));\r\n\r\n[bTotscr,muscr]=Calc_score(mxy,mu,am,axy); % Base score prior to adding pxyt\r\nfprintf('Base Score: %.2f\\n',bTotscr);\r\n\r\nif pxyt(3)~=3\r\n mxy(pxyt(3),:)=pxyt(1:2);\r\nelse % should not have a 23400 score\r\n tptr=find(mu==3);\r\n mxy(tptr(end),:)=pxyt(1:2);\r\nend\r\n[Totscr,muscr]=Calc_score(mxy,mu,am,axy); % Base score prior to adding pxyt\r\nfprintf('Total Score: %.2f\\n',Totscr);\r\n\r\n\r\nvalid=Totscr\u003ebTotscr+min_score;\r\nassert(valid)\r\n\r\nfunction [Totscr,muscr]=Calc_score(mxy,mu,am,axy)\r\n%No error checking,volume,pillars\r\n Lmu=length(mu);\r\n na=size(axy,1);\r\n  \r\n%Calc each mu score\r\n d2am=zeros(na,Lmu);\r\n for j=1:Lmu\r\n  d2am(:,j)=sum((axy-mxy(j,:)).^2,2);\r\n end\r\n \r\n muscr=zeros(Lmu,1);\r\n dmax=25;\r\n for j=1:Lmu\r\n  if mxy(j,1)==0,continue;end % Unfilled mxy\r\n  for i=1:na\r\n   bflag=0;\r\n   for k=1:Lmu %search for any blockng musician \r\n    if mxy(k,1)==0,continue;end % Unfilled mxy\r\n    if k==j,continue;end\r\n    dv2=distP2S2Z(mxy(k,1),mxy(k,2),mxy(j,1),mxy(j,2),axy(i,1),axy(i,2)); %Intra Seg dist\r\n    if min(dv2)\u003c=dmax\r\n     bflag=1;\r\n     break;\r\n    end\r\n   end\r\n   \r\n   if bflag\r\n     continue;\r\n   end\r\n   \r\n   muscr(j)=muscr(j)+1000000*am(i,mu(j))/d2am(i,j);\r\n  end\r\n end\r\n Totscr=sum(muscr);\r\nend %Calc_score\r\n\r\nfunction d2=distP2S2Z(px,py,vx,vy,wx,wy)\r\n% Distance from segment only if intra-segment\r\n% reduce to 0\u003c=t\u003c=1\r\n%The point is (px,py) and the segment is [(vx,vy) to (wx,wy)].\r\n% [px py vx vy wx wy]\r\n\r\n d2=Inf;\r\n sL2=(vx-wx)^2+(vy-wy)^2;\r\n %if sL2==0 % Segment is a point  %Error check removed\r\n % d2=(px-vx)^2+(py-vy)^2;\r\n %else % non-point segment\r\n  t=( (px-vx)*(wx-vx)+(py-vy)*(wy-vy) )/sL2;\r\n  if t\u003c0 % Pt beyond normal of segment\r\n   return\r\n   %d2=(px-vx)^2+(py-vy)^2;\r\n  elseif t\u003e1 % Pt beyond normal of segment\r\n    return\r\n   %d2=(px-wx)^2+(py-wy)^2;\r\n  else\r\n   sx=vx+t*(wx-vx);\r\n   sy=vy+t*(wy-vy);\r\n   d2=(px-sx)^2+(py-sy)^2;\r\n  end\r\n %end\r\n %d=sqrt(d2);\r\nend %distP2S2Z\r\n\r\n\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":3097,"edited_by":3097,"edited_at":"2023-08-09T18:47:46.000Z","deleted_by":null,"deleted_at":null,"solvers_count":1,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2023-08-09T13:28:37.000Z","updated_at":"2023-08-09T18:47:47.000Z","published_at":"2023-08-09T18:47:47.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\u003eThe ICFP 2023 Competition in July was to place musicians on a stage to maximize the attendees net Joy.  The \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://drive.google.com/file/d/16GFrZMudBrNwjMi3tOaP_iiSHh5pUtXL/view?usp=sharing\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eICFP 2023 Orchestra Spec\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e shows details of the contest. The musicians played various instruments with attendees having preference values for each instrument type. Musicians could block attendees from seeing musicians behind them. Blocking occurs if a_i to m_j vector touched within 5 of m_k. No musicians allowed within 10 of one another. \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 place a second musician onto the stage, mxy, to increase Joy by at least 23400.  The Joy table am is Joy co-factor of each attendee for each musician type. Joy is scaled by 1/distance-squared between Musician and Attendee. Joy(j,i)=1000000*am(i,mu(j))/d2(i,j).\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 Joy here is to brute force a solution.\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 scoring of a placed musician is a discontinuous non-linear function due to vignetting and the 1/distance-squared scaling. There appears to be a grumpy audience cluster at the top left such that vignetting them and their negative Joy raises the Joy of a musician's placement on the xmax stage edge.\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 all the contest parameters and an initial musician placed at Top-Left of stage (xmax,ymax) return a muscian position (x,y) and type to raise total Joy by at least 23400. A non-integer solution exists with x=xmax.\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\u003eThe scoring and blocking functions are provided in the template.\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:customXml w:element=\\\"image\\\"\u003e\u003cw:customXmlPr\u003e\u003cw:attr w:name=\\\"height\\\" w:val=\\\"420\\\"/\u003e\u003cw:attr w:name=\\\"width\\\" w:val=\\\"560\\\"/\u003e\u003cw:attr w:name=\\\"verticalAlign\\\" w:val=\\\"baseline\\\"/\u003e\u003cw:attr w:name=\\\"altText\\\" w:val=\\\"\\\"/\u003e\u003cw:attr w:name=\\\"relationshipId\\\" w:val=\\\"rId1\\\"/\u003e\u003c/w:customXmlPr\u003e\u003c/w:customXml\u003e\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\u003eProblem 17: Stage in Pink and 5000 audience as black dots in top right corner of arena. The first musician is placed at (xmax,ymax)\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:customXml w:element=\\\"image\\\"\u003e\u003cw:customXmlPr\u003e\u003cw:attr w:name=\\\"height\\\" w:val=\\\"646\\\"/\u003e\u003cw:attr w:name=\\\"width\\\" w:val=\\\"882\\\"/\u003e\u003cw:attr w:name=\\\"verticalAlign\\\" w:val=\\\"baseline\\\"/\u003e\u003cw:attr w:name=\\\"altText\\\" w:val=\\\"\\\"/\u003e\u003cw:attr w:name=\\\"relationshipId\\\" w:val=\\\"rId2\\\"/\u003e\u003c/w:customXmlPr\u003e\u003c/w:customXml\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis plot shows the scoring of a second point placed at (xmax, y) where y is the y-axis of the graph and the x-axis is the additive score created by this second point. The first point is placed at (xmax,1220) thus no points allowed (1210:1220]. Down to 1202.6 the entire audience is blocked from viewing. Different samplings are shown: */1, Green/0.1, Black/.01, and Red/.001  To achieve the \u0026gt;23400 requires a resolution of 0.001.  This graph gives clues for limiting the search range.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\",\"relationship\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"target\":\"/media/image1.png\",\"relationshipId\":\"rId1\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"target\":\"/media/image2.png\",\"relationshipId\":\"rId2\"}]},{\"partUri\":\"/media/image1.png\",\"contentType\":\"image/png\",\"content\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjAAAAGkCAIAAACgjIjwAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wgJDTImvUjHDgAAACR0RVh0U29mdHdhcmUATUFUTEFCLCBUaGUgTWF0aFdvcmtzLCBJbmMuPFjdGAAAACJ0RVh0Q3JlYXRpb24gVGltZQAwOS1BdWctMjAyMyAwNjo1MDozOKla/X0AABafSURBVHic7dxhaNT3/cDx7+WsbqRISqaCAUvQNKGlSEwrU1oftORBoa4FKXWTdtQOqk5oSx4IfdAIWkYqWxsfFGYZg6GTUkFIYQNlrsb/tWUse9Cm1RiqkUBnNpPek45qcrn/g2yn07vpMvU+8V6vR7lPvuon11/zNveLyRSLxQQA1VZX7QUAICVBAiAIQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiCEedVeAJjbMpnMDZ4sFou3dBPmOkHiFrrxT1UAgsStNVf+Utza2jo0NFTtLa4v4J7+2sHN4h5STRsaGjp69OjZs2evHI6Ojh49evTaz3pl55UOA/y3BKl2/eIXv9i+ffsf/vCHn/zkJ7/85S9nhn19fRs3bjxy5MjWrVt7e3tLh8vOKx2ei+ZKU+fKnjAbRWrS6dOnH3jggYmJiWKx+Le//a2tre3ChQtTU1Pt7e2nT58uFosXLlxYuXLlmTNnisVi2Xmlw1dygdUCn224WdxDqlHLly8/fPjwPffck1KaN2/e9PT01NRUf39/Q0NDS0tLSqmxsXHdunW5XK65ubnsfGRkpOzhq/6g1tbWmTf81R74zwSpRtXV1bW0tBQKhUOHDh04cOCnP/3pkiVLPvroo7a2ttKZ+vr6mYrk8/lr5/X19WUPX0WHgBvkHlJNm5iY+Pbbb5csWfJ///d/X3/9daFQuPI7prLZbLFYTCmVnVc6DDA7glTTFi1a9OMf//jdd9/97ne/+5vf/Gb+/PnT09Ol9xYKhWw2m1IqO690GGB2BKlGffnll/v37y89XLJkyV//+tfFixcPDg6Whvl8vqOjI6VUdl7pMMDsCFKNmp6e/tnPfvbll1+mlP7+97/ncrnOzs7Vq1enlI4fP55SGh4ezuVya9asSSmVnVc6DDA7Ga/716yDBw/29PSsWrXqL3/5y9atW1966aWU0ieffNLV1bVixYrBwcHdu3c/8cQTM4fLzisdLslkXGB3Pj/LjpvF5wtuIUGqBYLEzeLbvoH/yQ1mxo+847rcQwIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIARBAiAEQQIgBEECIIR51V6AahoeHh4ZGWlsbFy1atXMZHx8/OzZs6UD991338KFC2feHh0dPXXq1LJly1pbW0sHyg4BZkGQateuXbv++Mc/dnR0DA0N3X333b/+9a8XLFhw+PDht956a8GCBTNnent7H3300ZRSX19fT0/P2rVrBwYGnnrqqZdffrnSEGCWitSkzz///IEHHpiYmJh5+OSTT77//vvFYvGVV17Zv3//VYenpqba29tPnz5dLBYvXLiwcuXKM2fOlB1e9QtdYJS4GLguXyHVqIaGhn379t1zzz0zD5ubm7/66quU0smTJ5999tnx8fGFCxfeddddM+/t7+9vaGhoaWlJKTU2Nq5bty6Xy42MjFw7bG5uvuoPKr2UNzQ0dHs+NELxWi43TpBq1NKlS5cuXTrz9sjIyLFjx7Zs2VIoFM6dO7dr166JiYl8Pr9hw4bdu3enlPL5fFtbW+nX1tfXDw0N1dfXXzu89g/SoRpXugAymUx1NyE+32VX68bGxl544YVt27bdf//958+f7+zs3Ldv38cff/zhhx/29/cfPHgwpVQoFK78bJLNZovFYtlhFT4A4E4hSDXt008/ffrpp5977rlt27allJqamvbu3dvU1JRSWrJkSWdn58DAQEpp/vz509PTpV9VKBSy2WzZ4W3/CIA7hyDVro8++ujFF1/cuXPn5s2bZyYjIyOHDh0qHbh06VJdXV1KafHixYODg6V5Pp/v6OgoO7xduwN3IEGqUaOjo9u3b3/zzTcfe+yxycnJycnJQqFw8eLF7u7u4eHhlNLY2NixY8fWr1+fUlq9enVK6fjx4yml4eHhXC63Zs2assNqfkjAHOebGmrUgQMHvvnmmy1btpQmmzZtev3111977bVnn332wQcf/Oyzz7Zv3z7zj5Dq6ur27NnT1dW1YsWKwcHBnp6eRYsWpZTKDgFmJ+NGNLdOJuMC459cDFyXl+wACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIYV61F6CahoeHR0ZGGhsbV61aVRqOjo6eOnVq2bJlra2tVx4uO690GOC/5Suk2rVr166XXnrpyJEjO3fu/NGPfnTx4sWUUl9f38aNG48cObJ169be3t7S4bLzSocBZqNITfr8888feOCBiYmJmYdPPvnk+++/PzU11d7efvr06WKxeOHChZUrV545c6ZYLJadVzp8JRcYJS4GrstXSDWqoaFh375999xzz8zD5ubmr776qr+/v6GhoaWlJaXU2Ni4bt26XC6XUio7r3QYYHbcQ6pRS5cuXbp06czbIyMjx44d27Jly9DQUFtbW+lMfX390NBQSimfz187r6+vL3v4KqV7S2Xfyx3PzUVunCDVurGxsRdeeGHbtm3333//F198kclkSu/KZrPFYjGlVCgUrp2XHV77++tQjStdAFdeLVCWl+xq2qeffvr0008/99xz27ZtSynNnz9/enq69N5CoZDNZivNKx0GmB1Bql0fffTRiy++uHPnzs2bN89MFi9ePDg4WDqQz+c7OjoqzSsdBpgdQapRo6Oj27dvf/PNNx977LHJycnJyclCobB69eqU0vHjx1NKw8PDuVxuzZo1KaWy80qHAWbHPaQadeDAgW+++WbLli2lyaZNm15//fU9e/Z0dXWtWLFicHCwp6dn0aJFKaW6urqy87JDgNnJlL0RDTdFJuMC459cDFyXl+wACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIYV61F6D6Tpw48eijj868PT4+fvbs2dK77rvvvoULF868PTo6eurUqWXLlrW2tpYOlB0CzIIg1bp33nnn4MGDJ06cmHl4+PDht956a8GCBTMPe3t7Z1rV19fX09Ozdu3agYGBp5566uWXX640BJidTLFYrPYOVMfXX3/d09Nz5MiR+vr6UpBeffXVhx56aNOmTVeeLBQKDz/88HvvvdfS0jI+Pv74448fPnx42bJl1w6bm5uv/IWZjAuMf3IxcF3uIdWut99+u7Gx8Y033rhyePLkyeXLl4+Pj09OTpaG/f39DQ0NLS0tKaXGxsZ169blcrmyw9v8IQB3Ei/Z1a7u7u66urrjx4+XJoVC4dy5c7t27ZqYmMjn8xs2bNi9e3dKKZ/Pt7W1lY7V19cPDQ3V19dfO7z2TyndWyr7Xu54bi5y4wSpdtXVXf318fnz5zs7O3fs2NHU1DQ2NvbMM88cPHjwhz/8YaFQyGQypWPZbLZYLJYdXvun6FCNK10AV14tUJaX7Lisqalp7969TU1NKaUlS5Z0dnYODAyklObPnz89PV06VigUstls2eHt3xm4YwgSl42MjBw6dKj08NKlSzNfRS1evHhwcLA0z+fzHR0dZYe3c1vgDiNIXHbx4sXu7u7h4eGU0tjY2LFjx9avX59SWr16dUpp5m7T8PBwLpdbs2ZN2WE1twfmOPeQuKy1tfW111579tlnH3zwwc8++2z79u0z/wiprq5uz549XV1dK1asGBwc7OnpWbRoUUqp7BBgdvzLAG4h//SEEhcD1+UlOwBCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQphX7QWA/04m8883isWq7gE3myDBLTGQGbhlv3fHLfudoZoECW6VjuKtKUfm+kdgLnIPCeaYYjH9OQ14vY47jyABEIIgARCCIAEQgiABEIIgARCCIAEQgiABEIIgARCCIAEQgiABEIIgARCCIAEQgiABEIIgARCCIAEQgiABEIIgARCCIAEQgiABEIIgkU6cOHHlw9HR0aNHjw4NDV11rOy80mGA/5Yg1bp33nnntddeKz3s6+vbuHHjkSNHtm7d2tvb+5/nlQ4DzEaRWjUxMbFjx4729vZHHnlkZjI1NdXe3n769OlisXjhwoWVK1eeOXOm0rzS4SvV8gX25/TnOfqb3yK1fDFwg3yFVLvefvvtxsbGN954ozTp7+9vaGhoaWlJKTU2Nq5bty6Xy1WaVzp8ldZ/uU0fFcG4ALhx86q9AFXT3d1dV1d3/Pjx0iSfz7e1tZUe1tfXz9wcKjuvr68ve/gqbi/VuNIFkMlkqrsJ8fkKqXbV1V39X79QKFz5WSObzRaLxUrzSocBZkeQuGz+/PnT09Olh4VCIZvNVppXOgwwO4LEZYsXLx4cHCw9zOfzHR0dleaVDgPMjiBx2erVq1NKM3eVhoeHc7ncmjVrKs0rHQaYHd/UwGV1dXV79uzp6upasWLF4OBgT0/PokWL/sO87BBgdjJuRHPrZDK1e4ENZAY6irfqNcxb+pvfIrV8MXCDvGQHQAiCBEAIggRACIIEQAiCBEAIggRACIIEQAiCBEAIggRACIIEQAiCBEAIggRACIIEQAiCBEAIggRACIIEQAiCBEAIggRACIIEQAiCBEAIggRACIIEQAiCBEAIggRACIIEQAiCBEAIggRACIIEQAiCBEAIggRACIIEQAiCBEAIggRACIIEQAiCBEAIggRACIIEQAiCBEAIggRACIIEQAiCBEAIggRACIIEQAiCBEAIggRACPOqvQCxjI+Pnz17tvTwvvvuW7hwYUppdHT01KlTy5Yta21tvfJ8pTnAf0uQ+DeHDx9+6623FixYMPOwt7f30Ucf7evr6+npWbt27cDAwFNPPfXyyy/PvLfSnJRSR7FjIDNQ7S1gLskUi8Vq70Agr7766kMPPbRp06bSpFAoPPzww++9915LS8v4+Pjjjz9++PDh5ubmSvMrf7dMxgXGP7kYuC73kPg3J0+eXL58+fj4+OTk5Mykv7+/oaGhpaUlpdTY2Lhu3bpcLvcf5ldp/Zfb+EEQiAuAG+clOy4rFArnzp3btWvXxMREPp/fsGHD7t278/l8W1tb6Ux9ff3Q0FBKqdL8KmWH1I7SBZDJZKq7CfEJEpedP3++s7Nzx44dTU1NY2NjzzzzzMGDB++6664rP5Vks9mZF14KhULZOcDseMmOy5qamvbu3dvU1JRSWrJkSWdn58DAwPz586enp0tnCoVCNptNKVWaA8yOIHHZyMjIoUOHSg8vXbpUV1e3ePHiwcHB0jCfz3d0dKSUKs0BZkeQuOzixYvd3d3Dw8MppbGxsWPHjq1fv3716tUppePHj6eUhoeHc7ncmjVrUkqV5gCz4xsx+TcHDhz4+c9//uCDD3722Wfbt2/fvHlzSumTTz7p6upasWLF4ODg7t27n3jiiZnDleYlvtOXEhcD1+US4RbyOYgSFwPX5SU7AEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAkAEIQJABCECQAQhAk/iejo6NHjx4dGhqq9iLAnCdIzF5fX9/GjRuPHDmydevW3t7eaq/zP2ltba32CjfEntzB5lV7AeaqQqGwc+fO9957r6WlZXx8/PHHH//BD37Q3Nxc7b2AuUqQmKX+/v6GhoaWlpaUUmNj47p163K53LVBymQy1dhuNubKqvbkTiVIzFI+n29rays9rK+vv/ZOUrFYvL1LAXOYe0jMUqFQuPKvwNlsVn6A/4UgMUvz58+fnp4uPSwUCtlstor7AHOdIDFLixcvHhwcLD3M5/MdHR1V3AeY6wSJWVq9enVK6fjx4yml4eHhXC63Zs2aai8FzGEZr/sza5988klXV9eKFSsGBwd37979xBNPVHsjYA4TJABC8JIdACEIEgAhZHfu3FntHbgzjY6O/ulPf5qamvre975X7V1SSml8fPyLL7746l/uvvvuBQsWpAp7Vmv5EydO3HvvvdddI8LOV65a6bkNsipzhSBxS/T19b366quXLl1699138/n897///WpvlH7729/u2LHj97///QcffPDBBx+0t7ffe++9Zfes1vLvvPNOb2/v5s2bZx5WWiPCzletWva5DbIqc0kRbrapqan29vbTp08Xi8ULFy6sXLnyzJkz1V6q+Morr+zfv//KSdk9q7L8xMTEjh072tvbH3nkkf+wW4Sdr121WO65jbAqc457SNx8ZX/uarWXSidPnly+fPn4+Pjk5OTMpOyeVVn+7bffbmxsfOONN0qTSmtUfedrV03lntsIqzLn+OGq3Hw38nNXb7NCoXDu3Lldu3ZNTEzk8/kNGzbs3r277J719fW3f/nu7u66urqZf2U8o9JzWPWdr1217HMbYVXmHF8hcfMF/Lmr58+f7+zs3Ldv38cff/zhhx/29/cfPHiw7J5VWb6u7ur/EyutUfWdr1217HMbYVXmHEHi5gv4c1ebmpr27t3b1NSUUlqyZElnZ+fAwEDZPYMsX2mNgDuXfW5jrkpwgsTNF/Dnro6MjBw6dKj08NKlS3V1dWX3DLJ8pTUC7lz2uY25KsEJEjdfwJ+7evHixe7u7uHh4ZTS2NjYsWPH1q9fX3bPIMtXWiPgzmWf25irEl31vsGPO9nHH3+8du3a559/ftWqVb/73e+qvU6xWCzu37+/vb39+eefb29v/9WvfjUzLLtntZb/8MMPr/xe6kprRNj5qlXLPrdBVmUO8cNVuYX+8Y9/fOc737n2Nni1TE9Pf/vtt9euVHbPIMtXWiPazpWe20pbBXl6CUWQAAjBX08ACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACEGQAAhBkAAIQZAACOH/ASvjkMvaesP1AAAAAElFTkSuQmCC\",\"relationship\":null},{\"partUri\":\"/media/image2.png\",\"contentType\":\"image/png\",\"content\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbkAAAFDCAIAAAAoP+cAAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wgJDR4sZKxFvgAAACR0RVh0U29mdHdhcmUATUFUTEFCLCBUaGUgTWF0aFdvcmtzLCBJbmMuPFjdGAAAACJ0RVh0Q3JlYXRpb24gVGltZQAwOS1BdWctMjAyMyAwNjozMDo0NGDt0jEAACAASURBVHic7d1/TNN3/gfwd9vv0bl6XEmHJiW3HSdtHc5zyJ0LRFmCkoWcTBLMXMa5Rc0l2OPCcuTmhRnLHXBL5RaBZfzRxBGjpjF6x8KSJVcyFLpiloBbsOhKT6npNHaxpdPDHNT28/3jgx9qf30K+/Tz6bs+HyFLP28+bV9d7ZP35/1+9/ORMQxDAAAgJbnUBQAAUABZCQDAD1kJAMAPWQkAwA9ZCQDAD1kJAMAPWQkAwA9ZCQDAD1kJAMAPWQkAwA9ZCQDAD1kJAMAPWQkAwA9ZCQDAD1kJAMAPWQkAwA9ZCQDAD1kJAMAPWQkAwE/grLTb7dGbbrd7eHj4ypUrMbslbPd6vcPDwy6XK/ZBZbKkNwAARPF/Aj5Wf3+/1Wrl4rKjo+PixYvl5eUul2vt2rUDAwNKpTJZ+9DQkNlsrqysnJyc3LNnT0tLy/LjMgyRyQh3DbXo2wAA4mCEEAgEjhw5UlZWtn37drZlenp606ZNgUCA3dy9e/f58+eTtT969KisrGxmZoZhmHv37m3ZsuXmzZuxz0HI0g8AgOiEOQbv6enRaDRdXV1ci1qttlgsBQUF7GZxcfGdO3eStY+NjanVap1ORwjRaDRVVVUOh2PpgWSypR9OfAsAQIYJcwxuMpnkcvno6CjXotVqtVote9vj8YyMjDQ1NSVrd7lcGzdu5O6rUqmWRy2jD70JIYQY9PqlFoNBkOIBgAoJJjNEJExWyuVJ+6c+n+/AgQNGo7G0tDRZ+7Vr12RR/USFQsHEjEiyY5QyGWEYV06MVxoMBmnfeAHl0mshufVycuy1SFtAZtcMTU1N1dfX79+/32g0pmjPy8uLRCLcb8PhsEKhWN47JhzZ0AQAEJGQ8+AxxsfHW1paOjs7X3vttdTt69atczqd3A7BYLC2tnb5DvG9SPr7lTnz157k1mshufVycum1SC5T/Uqv19vc3Hz8+PHq6upQKBQKhcLhcLL2bdu2EULY4U632+1wOCoqKjJUGADAKmSqX3n27Nn5+Xl2PofV2Nh47NixZO3d3d2tra0lJSVOp9NsNhcWFsY/pkGvx19JAJCELHYWJYvl0kA1AKyI5B9/fB8cAIAfshIAgB+yEgCAH7ISAIAfshIAgB+yEgCAH7ISAIAfshIAgB+yEgCAH7ISAIAfshIAgB+yEgCAH7ISAIAfshIAgB+yEgCAH7ISAIAfshIAgB+yEgCAH7ISAIAfshIAgB+yEgCAn8DXvLXb7Tt27OA23W63x+PRaDRbt25NvbPf75+dneV+pdfr8/Pzha0NAGDVhMzK/v5+q9Vqt9vZzY6OjosXL5aXl7tcrrVr1w4MDCiVymQ7Dw4Onjhxgtuht7c3OnMBAKQlTFbOzc2ZzWabzaZSqdiWa9eunTt3zm63FxQUEELq6uo+++yzvXv3JtyZEDI9Pd3W1tbY2ChIPQAAwhJmvLKnp0ej0XR1dXEtarXaYrGwQUkIKS4uvnPnTrKdCSHXr1/fsGGD3+8PhUKClAQAICBh+pUmk0kul4+OjnItWq1Wq9Wytz0ez8jISFNTU7Kdw+HwrVu3Ojo6AoFAMBhsaGjo7OxM+EQGg4EQ4nK5BCkbALIf+6mXnDD9Srk86eP4fL4DBw4YjcbS0tJkO9+9e7empsZisVy+fPnSpUtjY2NWqzXho7lcLgQlwFMlSz71mV0zNDU1VV9fv3//fqPRmGK3oqKivr6+oqIiQsj69etramomJyczWhgAwIpkMCvHx8cPHTrU3t5+8ODB1Ht6PJ4LFy5wm4uLiyk6qgAA4stUJHm93ubm5uPHj1dXV4dCoVAoFA6Hk+28sLBgMpncbjchxOfzjYyM1NXVZagwAIBVEHgtOufs2bPz8/PcfA4hpLGx8dixYwl3NhgMbW1t+/bt27x589WrV5ubm7G4EgCyioxhGKlrSJfBYMiGIV4AEJ/kH38MCwIA8ENWAgDwQ1YCAPBDVgIA8ENWAgDwQ1YCAPBDVgIA8ENWAgDwQ1YCAPBDVgIA8ENWAgDwQ1YCAPBDVgIA8ENWAgDwQ1YCAPBDVgIA8ENWAgDwQ1YCAPBDVgIA8ENWAgDwoykrZ2ZmpC4BAJ5SAmel3W6P3nS73cPDw1euXElnZ6/XOzw8HH+pNplMxtsCAJBRQl4fvL+/32q1cgnY0dFx8eLF8vJyl8u1du3agYEBpVKZbOehoSGz2VxZWTk5Oblnz56WlhZuT4ZhZLLla/NG3wYAEIcwWTk3N2c2m202m0qlYluuXbt27tw5u91eUFBACKmrq/vss8/27t2bcOdwONze3n7u3DmdTuf3+3fu3Pn6668XFxdzj8/GJUFQAoBEhDkG7+np0Wg0XV1dXItarbZYLGxQEkKKi4vv3LmTbOexsTG1Wq3T6QghGo2mqqrK4XCwv5I9xu0c3wIAkGnC9CtNJpNcLh8dHeVatFqtVqtlb3s8npGRkaampmQ7B4PBjRs3cpsqlYobtYw+9GZv6PX6+DFNAMhVBoNB6hIIESor5fKk/VOfz3fgwAGj0VhaWpps53A4HN1PVCgUMQfa7KE3919BagYAKrB9I8kTM7Nrhqampurr6/fv3280GlPslpeXF4lEuM1wOKxQKLjNmDFKxCUAiC+DWTk+Pn7o0KH29vaDBw+m3nPdunVOp5PbDAaD5eXlmSsMAGClMpWVXq+3ubn5+PHj1dXVoVAoFAqFw+FkO2/bto0Qwo5gut1uh8NRUVHB/TamI4mpcAAQn5DrK6OdPXt2fn6em88hhDQ2Nh47dizhznK5vLu7u7W1taSkxOl0ms3mwsLC6B2wZggApJXt0ZNiaDLLKwcAARkMBmkXwGSqXymU+DVDiEgAEB8d587gDr0xCQ4AkqAgK7FmCAAkR0FWYh4cACRHQVYSzIMDgNSyfW4nxckrEZoAIJpsz0rMgwNANqDjGBzz4AAgLQqyEvPgACA5CrISAEByFGQl1gwBgOQoyErCxiWREYbIsv4L7ACQk7J9Hny5R8nEtiA0AUA02Z6Vy2uGCCISACRDxzF4zHilhJUAwNOJgqzEmiEAkBwFWYl5cACQHAVZSZ4co0RQAoD4sn1uB/PgAJANsj0rMQ8OANmAjmNwzIMDgLQE7lfa7fYdO3Zwm2632+PxaDSarVu3Ru/m9Xq//fbb559/3mAwsC1+v392dpbbQa/X5+fns7fZyZzofiWmdwBAZEJmZX9/v9Vqtdvt7GZHR8fFixfLy8tdLtfatWsHBgaUSiUhZGhoyGw2V1ZWTk5O7tmzp6WlhRAyODh44sQJdgdCSG9vL5e5S/PgUeOVCEoAEBsjhEAgcOTIkbKysu3bt7Mt09PTmzZtCgQC7Obu3bvPnz/PMMyjR4/KyspmZmYYhrl3796WLVtu3rzJMMy777575syZFE9BGML+CFIwANBFr9dLW4Aw45U9PT0ajaarq4trUavVFouloKCA3SwuLr5z5w4hZGxsTK1W63Q6QohGo6mqqnI4HISQ69evb9iwwe/3h0Kh6EeWPZaiBQAg04Q5BjeZTHK5fHR0lGvRarVarZa97fF4RkZGmpqaCCHBYHDjxo3cbiqVyuVyhcPhW7dudXR0BAKBYDDY0NDQ2dnJ7sDEzYPr9XqXyyVI2QCQ/bhZDWkJ06+Uy5M+js/nO3DggNFoLC0tJYSEw+HoLqFCoWAY5u7duzU1NRaL5fLly5cuXRobG7NardEPEn2XmZkZQWoGACq4XK5s6B5lds3Q1NRUfX39/v37jUYj25KXlxeJRLgdwuGwQqEoKirq6+srKioihKxfv76mpmZycpLbB98HBwDJZTArx8fHDx061N7efvDgQa5x3bp1TqeT2wwGg+Xl5R6P58KFC1zj4uJiio4qAID4MhVJXq+3ubn5+PHj1dXVoVAoFAqFw2FCyLZt2wgh7Mim2+12OBwVFRULCwsmk8ntdhNCfD7fyMhIXV0d91AMzp0BAFLL1Hccz549Oz8/z87nsBobG48dOyaXy7u7u1tbW0tKSpxOp9lsLiwsLCwsbGtr27dv3+bNm69evdrc3By9oJ1w15B4fDtDNQMAJJPtfbT4c2cQriG7KwcAARkMBmlneHDuDAAAfnRMoeDcGQAgLQqyEmuGAEByFGQl5sEBQHIUZCXBNSQAQGrZPreDa0gAQDbI9qzEPDgAZAM6jsExDw4A0qIgK9OfB5cRGfuzol8BAPCiICvjD7rFPwyPiVphk5eL/vgbAJAlKMhKFkMYvUHPEDoGK1cUplgUBZD9sn1uZ0VSJGmWh+zSyUEYIiOy6OhkQzNhNzN2LALflwfIpJzKysyJiVoBkzfFoiiyuoNx9nFkS/dFYgIIAlmZEemHacJFUQKMVzJLHcyYh4rpqCJJAdKErMwKT/QlVzdlxN5phdEX3/dMFqMp4jVhHCd7rvh9Uqd51C+4OyDiQQLISulxkznxN1KL7yTSsigq/eRNmP7xAxdsR16Q/vKq3w7IbchK6f3IRVFPLD6Njpbkj5FiykhwqZ8l9fQUj6gXGBNnPybd2DGQ5bERBCUQQpCVT7OEEZAsF1LkRYaiZCnQueAULtiTxTdDCHk8WMwtS0i2f8LXzO3HMEz83ZhkewINkJVZ5Gn+2CQdQIhaApW0i5rOPunJaF879qEZtlEW/coZ3j8K3LCDjJCn+B+M+JCVkFnp/wFgokYfE9496UMl2X8VJDmTtCzJ7TTuKVu6CwI085CV8NRJnadL45VkadRStpLr9z25CpdhuC+trq5QPrLUE18xovM0rqTHq3Lj7oTkfUzg7zja7fboTbfbPTw8fOXKlZjdvF7v8PBwzFXZEjYCiCzZuVp+zNf2mcc/Tz7T45+V1UeIbCnvBJT08WQyIltGZDLu+7tPNCZH4n/oJGS/sr+/32q1cnHZ0dFx8eLF8vJyl8u1du3agYEBpVJJCBkaGjKbzZWVlZOTk3v27GlpaUnWCCC+ZMsSfsz8ePRwZIrfkrj+HRPdeUweMlxX8fGaqVR3oTWrJMcIIRAIHDlypKysbPv27WzL9PT0pk2bAoEAu7l79+7z588zDPPo0aOysrKZmRmGYe7du7dly5abN28mbIx/Fr1eL0i1AKkk6gMm6BWm8atUd2ASdDYTtsS3Mkl+Uj1QGqX+mHpSSFDqqkj+8RfmGLynp0ej0XR1dXEtarXaYrEUFBSwm8XFxXfu3CGEjI2NqdVqnU5HCNFoNFVVVQ6HI2GjIIUBrIhMJuM5Mo5LChlDZCvOy5Q1CPZI6WLzizz+4SRsiW9NHX4k/odOwhyDm0wmuVw+OjrKtWi1Wq1Wy972eDwjIyNNTU2EkGAwuHHjRm43lUrlcrlUKlV8Y8InMhgMhBCMaUKOYIMjagqIYZjlET1m+YSp5MnBAf4JHPZWolyiLqvYT73khMlKuTxp/9Tn8x04cMBoNJaWlhJCwuFw9NusUCgYhknYmPDRkJKQOfEBxDz+glN6JyJdXvaU6h7Ri+upnegQE/uplzwxM3uu36mpqfr6+v379xuNRrYlLy8vEolwO4TDYYVCkbAxo4UBpLB08EiWJnijfvH4RpIlkdFfSOceJNETJB075M5mkvS+IJEMrq8cHx9vaWnp7Ox87bXXuMZ169Y5nU5uMxgM1tbWJmzMXGGQkxL2Cle2sPzJL5gLUdSPknBx/lIDklR0mepXer3e5ubm48ePV1dXh0KhUCgUDocJIdu2bSOEsCObbrfb4XBUVFQkbMxQYZAzYpbwxQdKqrxL3rNLsG/qTiIbaknmg3jvC7TIVL/y7Nmz8/Pz7HwOq7Gx8dixY3K5vLu7u7W1taSkxOl0ms3mwsJCQkjCRgBJLCdv1PmS2Tld8uSBdswy9eidY04QlzguEaH0oOl8UwaDAXM7wIk/i2Wy5Tbc4GNUU8q7JPot90mJz8qEz5i4vCcfOfUjxD9dwj2fEpJ//PF9cKBVguxIGSZPpA8XVdn6NRauf/pES/wLjDkzchqnuIfVQVbCUyc6O+JzhPfEGanvLq2E195Y+nuQvCeLPmw6kJUAyxKeOGN1wZGi27t89o0nB0ZJXJZFX8diJc/N3X8lFUNKyEqAZal7kSJYysSosHsiJZF90kFWAmSxmPMOJfxtih3I8qH38mLN5Nc9xqF3CshKgAQymhrLB9qyRI0J7vD4Rpr9ykTT9/E1pPdYsARZCSCB1FG1tJBzRYfcGKPMMGQlQLaIDVA29VKEavLFoQyWuQsts+fOAIBVi/1yZNyZ2UBM6FcCZLX4M2jELDjn5mpiltaverUTJIR+JUAuSLYwE4SCrASgWLIVPwhKweEYHIB6sSvY8W3FDEBWAlBvacgyarASESk4HIMD5BxZVpzXPccgKwGoF3NdoNWcbgP4ICsBqBdzxM1OguMwXFjISoBcgEnwTMPcDgDd4i9WgUnwTEBWAtBt+azmBBGZQTgGB8gF8deSBGEJ3K+02+07duzgbXS73R6PR6fT/eIXv2Bb/H7/7Owst4Ner8/Pzxe2NoBcFfNl8B9z6QtIRsis7O/vt1qtdrs9dWN3d/e//vWv7du3f/jhh7/97W//+Mc/EkIGBwdPnDihVCrZfXp7e+MzFwASWvoyeNR4JYJScMJk5dzcnNlsttlsKpUqdePU1NSpU6dsNptWq11YWKitrX311Vd/9atfTU9Pt7W1NTY2ClIPwNMmpl8pbTE5SZjxyp6eHo1G09XVxdt448aNqqoqrVZLCFEqleXl5TabjRBy/fr1DRs2+P3+UCgkSEkATwnZYyla4McTpl9pMpnkcvno6ChvY15e3nfffcdt/vDDDzKZLBwO37p1q6OjIxAIBIPBhoaGzs7OhE9kMBgIIS6XS5CyAXJAzs+Ds596yQnTr5TLEzxOwsbKysrvv/++u7v7q6++OnXq1PT0NMMwd+/erampsVgsly9fvnTp0tjYmNVqTfhELpcLQQkQL4fnwbPkUy/2mqGCgoLTp097PJ6+vr779+/X1dUplcqioqK+vr6ioiJCyPr162tqaiYnJ0UuDIBeS19qJAyREYYwqS4JCasl9lr0Bw8ezM/Pf/zxx+zm4cOHd+3a5fF4JiYm9u7dyzYuLi4m7JMCAEhF7Eh68OBBY2Ojz+cjhHz99dcTExM1NTULCwsmk8ntdhNCfD7fyMhIXV2dyIUB0AsXkBCB2P1KrVb73nvv1dbWlpaW3r59+6OPPsrPz8/Pz29ra9u3b9/mzZuvXr3a3NyMxZUAK8LFJYIyQ2j632owGLJhiBcgq6QYmqTo081L8o8/zp0BQLflNUM4vVAmYQoFIBdwh96YBM8QZCUA3div6MRP70hYUk5CVgLQDReQEAeyEoB60Z1KpGSGYG4HgGLxx9oIzQxBVgJQDJPgosExOAD1MAkuAmQlAN1ivqiDuMwQZCUAAD9kJQDdcOIMcSArAaiHE2eIAPPgABTDmiHRICsBKIY1Q6LBMTgA9bBmSATISgC6Yc2QOJCVAHTDPLg4kJUA1MM8uAgwtwNAMcyDiwZZCUAxzIOLBsfgANTDPLgIBM5Ku92eTqPb7R4eHvZ4PNGNXq93eHgYV2oEWBHMg4tDyKzs7+9va2vjbezu7n777bdtNltTU9NHH33ENg4NDb355ps2m+3w4cO9vb0CVgWQ2zAPLg5hxivn5ubMZrPNZlOpVKkbp6amTp06ZbPZtFrtwsJCbW3tq6++umnTpvb29nPnzul0Or/fv3Pnztdff724uFiQ2gByHubBRSBMv7Knp0ej0XR1dfE23rhxo6qqSqvVEkKUSmV5ebnNZhsbG1Or1TqdjhCi0WiqqqocDocghQHkNtljKVpAEML0K00mk1wuHx0d5W3My8v77rvvuM0ffvhBJpMFg8GNGzdyjSqVKtmopcFgIIRgTBOA9TTMg7OfeskJ06+UyxM8TsLGysrK77//vru7+6uvvjp16tT09DTDMOFwOPrPoEKhSPZ+u1wuBCVAjNyeB8+ST73Ya4YKCgpOnz7t8Xj6+vru379fV1enVCrz8vIikQi3TzgcVigUIhcGQCnMg4tD7LXoDx48mJ+f//jjj9nNw4cP79q1a926dU6nk9snGAzW1taKXBgAjbig5PIR0zsZIna/8sGDB42NjT6fjxDy9ddfT0xM1NTUbNu2jRDCjmy63W6Hw1FRUSFyYQA0woIh0Yjdr9Rqte+9915tbW1paent27c/+uij/Px8Qkh3d3dra2tJSYnT6TSbzYWFhSIXBkCp6LhEUGYOTX+FDAZDNgzxAmSJFOOSFH2u0yT5xx/nzgCg1dOwYCh74NwZAHTL7QVD2QNZCUAxLBgSDbISgGKYBxcNshKAbjhxhjgwtwNAK1xAQkzISgBaYR5cTDgGB6Ab5sHFgawEoBjmwUWDrAQA4IesBKAY1gyJBlkJQDesGRIH5sEBaIU1Q2JCVgLQCmuGxIRjcAC6Yc2QOJCVALRir20bP70jYUk5DFkJQKuYI242N3EYniHISgCK4QISosHcDgCVMAkuMmQlAJUwCS4yHIMDUAyT4KIRuF9pt9t37NjB2zg7O/uf//ynqKiotLSUbfH7/bOzs9wOer2evRYuACST8MQZ6F1miJBZ2d/fb7Va7XZ76sZPPvnk5MmTlZWVV69e/fWvf93Z2UkIGRwcPHHihFKpZPfp7e2Nz1wAiBYTjgjKjBImK+fm5sxms81mU6lUqRsjkciHH3746aef6nS6+/fvV1RUvPXWW6WlpdPT021tbY2NjYLUA/CUwJfBRSPMeGVPT49Go+nq6uJtJIREIpFnnnmGELJmzRqZTLa4uEgIuX79+oYNG/x+fygUSvFEBoPBYDAIUjMA1WSPpWjJDVnyqRemX2kymeRy+ejoKG+jXC5vb283Go27du1yOBz79u17+eWXw+HwrVu3Ojo6AoFAMBhsaGhgD8zjuVwuQQoGoN3TMw/Ofuolj0th+pVyeYLHSdhICJmYmFizZs1zzz2nVqtv3Ljx8OHDu3fv1tTUWCyWy5cvX7p0aWxszGq1ClIYQG7DPLhoxF4z9MUXX1y5csVqtTY2NlosFkLIyZMni4qK+vr6ioqKCCHr16+vqamZnJwUuTAA6uACEmISOyuDwaDBYFAoFOzmCy+84PV6PR7PhQsXuH0WFxeT9UkBACQhdiS9+OKLX3755Y0bNwgh9+/fn5iYeOWVVxYWFkwmk9vtJoT4fL6RkZG6ujqRCwOgDi4gISaxv+NYWlr6/vvvv/HGGy+99JLT6dy7d29DQwMhpK2tbd++fZs3b7569WpzczMWVwKkA2uGREPT/1+DwYB5cABWiqFJij7U6ZP8449zZwBQ6elZM5QlMIUCQDGsGRINshKAVlgzJCZkJQCtMA8uJmQlAMUwDy4azO0AUAnXkBAZshKASpgHFxmOwQEohnlw0SArAWjFBmV0vxJxmTnISgAqxU/mYHono5CVAFSK71EiKDMKWQlAKywYEhPmwQHogwVD4kNWAtAHC4bEh2NwAFphwZCYkJUAVMKJM0SGrASgEk6cITJkJQCtMA8uJsztANAH8+DiQ1YC0Afz4OLDMTgArTAPLiaBs9Jut6fTODs7Ozw8fO3atehGr9c7PDyMKzUCpAPz4CITMiv7+/vb2tp4Gz/55JPf/e53NpvtT3/609GjR9nGoaGhN99802azHT58uLe3V8CqspPBYJC6BMHk0msh9LycdObBaXktVBBmvHJubs5sNttsNpVKlboxEol8+OGHn376qU6nu3//fkVFxVtvvWUwGNrb28+dO6fT6fx+/86dO19//fXi4mJBagPIVZgHF5MwWdnT06PRaLq6uv7+97+nbiSERCKRZ555hhCyZs0amUy2uLg4NjamVqt1Oh0hRKPRVFVVORyOhFmZS38n8VqyVva/nJmZmZgWro+p1+uj27P/tdBCmKw0mUxyuXx0dJS3US6Xt7e3G43GXbt2ORyOffv2vfzyy4ODgxs3buT2UalUCUctMZQJEAPz4KIRZrxSLk/wOAkbCSETExNr1qx57rnn1Gr1jRs3Hj58GA6Ho0deFAoF3ngAXpgHF5PYa4a++OKLK1euWK3WxsZGi8VCCDl58mReXl4kEuH2CYfDCoVC5MIA6IJ5cJGJnZXBYNBgMHBR+MILL3i93nXr1jmdzuh9ysvLRS4MgC7xx144GssosbPyxRdf/PLLL2/cuEEIuX///sTExCuvvLJt2zZCCDuy6Xa7HQ5HRUWFyIUBUAoRKQ6xv+NYWlr6/vvvv/HGGy+99JLT6dy7d29DQwMhpLu7u7W1taSkxOl0ms3mwsJCkQsDAEgBy7IAAPjh++AAAPyQlQAA/Og4J5vX6/3222+ff/55Gr+EkLp4v98/OzvLber1+vz8fBGrE4bdbt+xY4fUVaxSsuJpf2vcbrfH49FoNFu3bpW6lhVLXbwkbw0FWTk0NGQ2mysrKycnJ/fs2dPS0iJ1RSvAW/zg4OCJEyeUSiW72dvbS13o9Pf3W63WhKeYyn4piqf6reno6Lh48WJ5ebnL5Vq7du3AwAD3QrIfb/HSvDVMdnv06FFZWdnMzAzDMPfu3duyZcvNmzelLipd6RT/7rvvnjlzRorqBBAIBI4cOVJWVrZ9+3apa1kx3uLpfWump6c3bdoUCATYzd27d58/f17aktKXTvGSvDXZPl6Z8LQaUheVrnSKv379+oYNG/x+fygUkqLGH4U7PYrUhawGb/H0vjVqtdpisRQUFLCbxcXFd+7ckbak9KVTvCRvTbYfgweDwXROq5GdeIsPh8O3bt3q6OgIBALBYLChoaGzs1P0Mlcv4elRaJG6eKrfGq1Wq9Vq2dsej2dkZKSpqUnaktLHW7xUb0229yupPq0Gb/F3796tqamxWCyXL1++dOnS2NiY1WoVvczVS3Z6FCqkLp72t4bl8/kOHDhgNBpLS0ulrmXFkhUv1VuT7f/WqT6tBm/xRUVFfX19RUVFhJD169fXidNjJQAAAyBJREFU1NRMTk6KXSUkkgNvzdTUVH19/f79+41Go9S1rFiK4qV6a7I9K6k+rQZv8R6P58KFC9zm4uIi1T21XEL7WzM+Pn7o0KH29vaDBw9KXcuKpS5eqrcm299+qk+rkaz4b775hh2uXlhYMJlMbrebEOLz+UZGRurq6iQt+WmXG2+N1+ttbm4+fvx4dXV1KBQKhULhcFjqotKVrHjp3xqR591X4fLly5WVlW+//fbWrVs///xzqctZmYTFv/POO9wyiDNnzpSVlb399ttlZWUnT56UrtLVu3TpEo1rhlgxxefGW/PBBx/on/TXv/5V6qLSlax4yd8aas6d8fDhw2eeeYau4yBO6uIjkcj//vc/el9dDsNbk7XEf2uoyUoAAAnhryUAAD9kJQAAP2QlAAA/ZCUAAD9kJQAAP2QlAGS1/v7+f/zjH1JXgawEgCz29ddfDwwMPHz4UOpCkJUAkK0ePnxoNpubm5ulLoQQZCUAZK2//e1vf/jDH372s59JXQghyEoAkETMNY68Xu/w8HD0ybD//e9/P/vss9lzjSN8xxEAxBZzSbiEl/Crrq7++c9/rlQq7969+9///vedd9555513JKwZWQkA4pmbmzObzTabTaVSsVkZDod/85vfnDt3TqfT+f3+nTt3Dg4OFhcXc/M5n332mdPpPHr0qLSXosQxOAAIJhKJsGeW5Ny+ffvBgwfcZvwl4ZJdwu/Zx5RK5U9+8hPJr9mLrAQAwcjl8s8///ybb75hN2/fvn369Omf/vSn3A4mk+nPf/7zs88+y7XwXsKvvr7+2LFjGS6cX7ZfxxEA6NLS0tLb20sIKSwsPH369F/+8pfo38afbpKW6w8iKwFAYC0tLR988MH8/Hw6V6ONv4RfXl5eJqtbJRyDA4DAZmdnw+HwCy+8wB2Mp0DL9QeRlQAgpNnZ2bNnzx49evT3v//9+Pg4b1zScv1BHIMDgGAikcg///nPo0ePsptGo7G/v/+Xv/xlfn5+srvI5fLu7u7W1taSkhKn02k2mwsLC8WqdwWwvhIAskKWX38QWQkAwC9LIxwAIKv8P8Wiu5Lf8+ZaAAAAAElFTkSuQmCC\",\"relationship\":null}],\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"target\":\"/matlab/document.xml\",\"relationshipId\":\"rId1\"}]}"},{"id":42355,"title":"Minimum Set (A+A)U(A*A) OEIS A263996","description":"This Challenge is to find an integer vector A that creates the minimum set size for (A+A) U (A*A) for a given vector length, \u003chttps://oeis.org/A263996 OEIS A263996\u003e. The length, best value, Prime_max, and Value_max will be provided. \r\n\r\nThe \u003chttps://oeis.org/A263996 OEIS A263996\u003e gives the minimum set sizes thru length 50. Length 7 has best value 26 with Prime_max 5 and Value_max 8. A=[1 2 3 4 5 6 8] yields [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 20 24 25 30 32 36 40 48 64].\r\nThe \u003chttp://68.173.157.131/Contest/SumsAndProducts1/FinalReport Al Zimmermann Sums Contest Final Report\u003e extends A263996 for lengths 40:40:1000 with complete vector solutions. The contest winner, Rokicki, noted his method used P-smooth sets, hill climbing, and random swaps. The contest was a little tougher with only L given.\r\n\r\nExample Input/Output:\r\nL=9;Best=36;pmax=5;vmax=12;\r\nv = SP(L,Best,pmax,vmax); Yields v=[1 2 3 4 5 6 8 10 12]\r\n\r\nTheory/Hints: The V superset is found using \u003chttp://www.mathworks.com/matlabcentral/cody/problems/1298-p-smooth-numbers psmooth(pmax,vmax)\u003e . One observation is that for every v element the set v contains prod of all v element factor permutations. The time eater will be score evaluation. Residual evaluation suggested. A history screen, prior to score evaluation, of prior processed vectors is essential. A quick history pre-screen is vector sum. Replace testing of only values that are not factors of other numbers (eg 2,3 no replace) enables a reasonable time rolling score solution without random for the small test case values. ","description_html":"\u003cp\u003eThis Challenge is to find an integer vector A that creates the minimum set size for (A+A) U (A*A) for a given vector length, \u003ca href = \"https://oeis.org/A263996\"\u003eOEIS A263996\u003c/a\u003e. The length, best value, Prime_max, and Value_max will be provided.\u003c/p\u003e\u003cp\u003eThe \u003ca href = \"https://oeis.org/A263996\"\u003eOEIS A263996\u003c/a\u003e gives the minimum set sizes thru length 50. Length 7 has best value 26 with Prime_max 5 and Value_max 8. A=[1 2 3 4 5 6 8] yields [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 20 24 25 30 32 36 40 48 64].\r\nThe \u003ca href = \"http://68.173.157.131/Contest/SumsAndProducts1/FinalReport\"\u003eAl Zimmermann Sums Contest Final Report\u003c/a\u003e extends A263996 for lengths 40:40:1000 with complete vector solutions. The contest winner, Rokicki, noted his method used P-smooth sets, hill climbing, and random swaps. The contest was a little tougher with only L given.\u003c/p\u003e\u003cp\u003eExample Input/Output:\r\nL=9;Best=36;pmax=5;vmax=12;\r\nv = SP(L,Best,pmax,vmax); Yields v=[1 2 3 4 5 6 8 10 12]\u003c/p\u003e\u003cp\u003eTheory/Hints: The V superset is found using \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/problems/1298-p-smooth-numbers\"\u003epsmooth(pmax,vmax)\u003c/a\u003e . One observation is that for every v element the set v contains prod of all v element factor permutations. The time eater will be score evaluation. Residual evaluation suggested. A history screen, prior to score evaluation, of prior processed vectors is essential. A quick history pre-screen is vector sum. Replace testing of only values that are not factors of other numbers (eg 2,3 no replace) enables a reasonable time rolling score solution without random for the small test case values.\u003c/p\u003e","function_template":"function v = SP(L,Best,pmax,vmax)\r\n% Only L and \u003c=Best need to be satisfied\r\n% pmax and vmax are suggestions when using psmooth numbers\r\n  v=[1:L-1 vmax];\r\nend","test_suite":"%%\r\ntic\r\npass=true;\r\nL=8;Best=30;pmax=5;vmax=10;\r\nv = SP(L,Best,pmax,vmax);\r\nv=unique(floor(v));\r\nv(v\u003c1)=[];\r\nif length(v)~=L,pass=false;end\r\nvm2=zeros(1,v(end)*v(end));\r\nLv=length(v);\r\nvr=repmat(v,Lv,1);vrp=vr';\r\nvp=vr+vrp;\r\n%vp=repmat(v,Lv,1)+repmat(v',1,Lv);\r\nvm2(vp(:))=1;\r\nvm=vr.*vrp;\r\n%vm=repmat(v,Lv,1).*repmat(v',1,Lv);\r\nvm2(vm(:))=1;\r\nscr=nnz(vm2);\r\nif scr\u003eBest,pass=false;end\r\ntoc\r\nassert(pass)\r\n%%\r\ntic\r\npass=true;\r\nL=39;Best=335;pmax=7;vmax=100;\r\nv = SP(L,Best,pmax,vmax);\r\nv=unique(floor(v));\r\nv(v\u003c1)=[];\r\nif length(v)~=L,pass=false;end\r\nvm2=zeros(1,v(end)*v(end));\r\nLv=length(v);\r\nvr=repmat(v,Lv,1);vrp=vr';\r\nvp=vr+vrp;\r\n%vp=repmat(v,Lv,1)+repmat(v',1,Lv);\r\nvm2(vp(:))=1;\r\nvm=vr.*vrp;\r\n%vm=repmat(v,Lv,1).*repmat(v',1,Lv);\r\nvm2(vm(:))=1;\r\nscr=nnz(vm2);\r\nif scr\u003eBest,pass=false;end\r\ntoc\r\nassert(pass)\r\n%%\r\ntic\r\npass=true;\r\nL=50;Best=486;pmax=7;vmax=144;\r\nv = SP(L,Best,pmax,vmax);\r\nv=unique(floor(v));\r\nv(v\u003c1)=[];\r\nif length(v)~=L,pass=false;end\r\nvm2=zeros(1,v(end)*v(end));\r\nLv=length(v);\r\nvr=repmat(v,Lv,1);vrp=vr';\r\nvp=vr+vrp;\r\n%vp=repmat(v,Lv,1)+repmat(v',1,Lv);\r\nvm2(vp(:))=1;\r\nvm=vr.*vrp;\r\n%vm=repmat(v,Lv,1).*repmat(v',1,Lv);\r\nvm2(vm(:))=1;\r\nscr=nnz(vm2);\r\nif scr\u003eBest,pass=false;end\r\ntoc\r\nassert(pass)\r\n%%\r\ntic\r\npass=true;\r\nL=40;Best=348;pmax=7;vmax=120;\r\nv = SP(L,Best,pmax,vmax);\r\nv=unique(floor(v));\r\nv(v\u003c1)=[];\r\nif length(v)~=L,pass=false;end\r\nvm2=zeros(1,v(end)*v(end));\r\nLv=length(v);\r\nvr=repmat(v,Lv,1);vrp=vr';\r\nvp=vr+vrp;\r\n%vp=repmat(v,Lv,1)+repmat(v',1,Lv);\r\nvm2(vp(:))=1;\r\nvm=vr.*vrp;\r\n%vm=repmat(v,Lv,1).*repmat(v',1,Lv);\r\nvm2(vm(:))=1;\r\nscr=nnz(vm2);\r\nif scr\u003eBest,pass=false;end\r\ntoc\r\nassert(pass)\r\n%%\r\ntic\r\npass=true;\r\nL=80;Best=1001;pmax=11;vmax=300;\r\nv = SP(L,Best,pmax,vmax);\r\nv=unique(floor(v));\r\nv(v\u003c1)=[];\r\nif length(v)~=L,pass=false;end\r\nvm2=zeros(1,v(end)*v(end));\r\nLv=length(v);\r\nvr=repmat(v,Lv,1);vrp=vr';\r\nvp=vr+vrp;\r\n%vp=repmat(v,Lv,1)+repmat(v',1,Lv);\r\nvm2(vp(:))=1;\r\nvm=vr.*vrp;\r\n%vm=repmat(v,Lv,1).*repmat(v',1,Lv);\r\nvm2(vm(:))=1;\r\nscr=nnz(vm2);\r\nif scr\u003eBest,pass=false;end\r\ntoc\r\nassert(pass)\r\n%%\r\ntic\r\npass=true;\r\nL=120;Best=1847;pmax=11;vmax=480;\r\nv = SP(L,Best,pmax,vmax);\r\nv=unique(floor(v));\r\nv(v\u003c1)=[];\r\nif length(v)~=L,pass=false;end\r\nvm2=zeros(1,v(end)*v(end));\r\nLv=length(v);\r\nvr=repmat(v,Lv,1);vrp=vr';\r\nvp=vr+vrp;\r\n%vp=repmat(v,Lv,1)+repmat(v',1,Lv);\r\nvm2(vp(:))=1;\r\nvm=vr.*vrp;\r\n%vm=repmat(v,Lv,1).*repmat(v',1,Lv);\r\nvm2(vm(:))=1;\r\nscr=nnz(vm2);\r\nif scr\u003eBest,pass=false;end\r\ntoc\r\nassert(pass)\r\n%%\r\ntic\r\npass=true;\r\nL=160;Best=2864;pmax=11;vmax=840;\r\nv = SP(L,Best,pmax,vmax);\r\nv=unique(floor(v));\r\nv(v\u003c1)=[];\r\nif length(v)~=L,pass=false;end\r\nvm2=zeros(1,v(end)*v(end));\r\nLv=length(v);\r\nvr=repmat(v,Lv,1);vrp=vr';\r\nvp=vr+vrp;\r\n%vp=repmat(v,Lv,1)+repmat(v',1,Lv);\r\nvm2(vp(:))=1;\r\nvm=vr.*vrp;\r\n%vm=repmat(v,Lv,1).*repmat(v',1,Lv);\r\nvm2(vm(:))=1;\r\nscr=nnz(vm2);\r\nif scr\u003eBest,pass=false;end\r\ntoc\r\nassert(pass)\r\n%%\r\ntic\r\npass=true;\r\nL=200;Best=4000;pmax=13;vmax=900;\r\nv = SP(L,Best,pmax,vmax);\r\nv=unique(floor(v));\r\nv(v\u003c1)=[];\r\nif length(v)~=L,pass=false;end\r\nvm2=zeros(1,v(end)*v(end));\r\nLv=length(v);\r\nvr=repmat(v,Lv,1);vrp=vr';\r\nvp=vr+vrp;\r\n%vp=repmat(v,Lv,1)+repmat(v',1,Lv);\r\nvm2(vp(:))=1;\r\nvm=vr.*vrp;\r\n%vm=repmat(v,Lv,1).*repmat(v',1,Lv);\r\nvm2(vm(:))=1;\r\nscr=nnz(vm2);\r\nif scr\u003eBest,pass=false;end\r\ntoc\r\nassert(pass)\r\n%%\r\ntic\r\npass=true;\r\nL=280;Best=6632;pmax=13;vmax=1800;\r\nv = SP(L,Best,pmax,vmax);\r\nv=unique(floor(v));\r\nv(v\u003c1)=[];\r\nif length(v)~=L,pass=false;end\r\nvm2=zeros(1,v(end)*v(end));\r\nLv=length(v);\r\nvr=repmat(v,Lv,1);vrp=vr';\r\nvp=vr+vrp;\r\n%vp=repmat(v,Lv,1)+repmat(v',1,Lv);\r\nvm2(vp(:))=1;\r\nvm=vr.*vrp;\r\n%vm=repmat(v,Lv,1).*repmat(v',1,Lv);\r\nvm2(vm(:))=1;\r\nscr=nnz(vm2);\r\nif scr\u003eBest,pass=false;end\r\ntoc\r\nassert(pass)\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":2,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2015-06-04T19:18:55.000Z","updated_at":"2016-02-22T02:59:36.000Z","published_at":"2016-02-22T02:59:36.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis Challenge is to find an integer vector A that creates the minimum set size for (A+A) U (A*A) for a given vector length,\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://oeis.org/A263996\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eOEIS A263996\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. The length, best value, Prime_max, and Value_max will be provided.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe\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://oeis.org/A263996\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eOEIS A263996\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e gives the minimum set sizes thru length 50. Length 7 has best value 26 with Prime_max 5 and Value_max 8. A=[1 2 3 4 5 6 8] yields [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 20 24 25 30 32 36 40 48 64]. The\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://68.173.157.131/Contest/SumsAndProducts1/FinalReport\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eAl Zimmermann Sums Contest Final Report\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e extends A263996 for lengths 40:40:1000 with complete vector solutions. The contest winner, Rokicki, noted his method used P-smooth sets, hill climbing, and random swaps. The contest was a little tougher with only L given.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eExample Input/Output: L=9;Best=36;pmax=5;vmax=12; v = SP(L,Best,pmax,vmax); Yields v=[1 2 3 4 5 6 8 10 12]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eTheory/Hints: The V superset is found using\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/problems/1298-p-smooth-numbers\\\"\u003e\u003cw:r\u003e\u003cw:t\u003epsmooth(pmax,vmax)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e . One observation is that for every v element the set v contains prod of all v element factor permutations. The time eater will be score evaluation. Residual evaluation suggested. A history screen, prior to score evaluation, of prior processed vectors is essential. A quick history pre-screen is vector sum. Replace testing of only values that are not factors of other numbers (eg 2,3 no replace) enables a reasonable time rolling score solution without random for the small test case values.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":527,"title":"Augmented Lagrange Multiplier (ALM) Method","description":"Write a function to find the values of a design variable vector, _x_, that minimizes a scalar objective function, _f_ ( _x_ ), given a function handle to _f_, and a starting guess, _x0_, subject to inequality and equality constraints with function handles _g_\u003c=0 and _h_=0, respectively. Use the Augmented Lagrangian Multiplier Method (a.k.a., the Method of Multipliers) and return the estimate of Lagrange multipliers _u_ for inequalities, and _v_ for equality constraints.","description_html":"\u003cp\u003eWrite a function to find the values of a design variable vector, \u003ci\u003ex\u003c/i\u003e, that minimizes a scalar objective function, \u003ci\u003ef\u003c/i\u003e ( \u003ci\u003ex\u003c/i\u003e ), given a function handle to \u003ci\u003ef\u003c/i\u003e, and a starting guess, \u003ci\u003ex0\u003c/i\u003e, subject to inequality and equality constraints with function handles \u003ci\u003eg\u003c/i\u003e\u0026lt;=0 and \u003ci\u003eh\u003c/i\u003e=0, respectively. Use the Augmented Lagrangian Multiplier Method (a.k.a., the Method of Multipliers) and return the estimate of Lagrange multipliers \u003ci\u003eu\u003c/i\u003e for inequalities, and \u003ci\u003ev\u003c/i\u003e for equality constraints.\u003c/p\u003e","function_template":"function [x,fmin,u,v]=alm(f,g,h,x0,MaxIter)\r\nif isempty(g), g=@(x)0; end\r\nif isempty(h), h=@(x)0; end\r\nif nargin\u003c5, MaxIter=20; end","test_suite":"%% Haftka \u0026 Gurdal, Figure 5.7.1 example\r\nf = @(x) 0.5*x;\r\ng = @(x) 2-x;\r\nx0 = 0;\r\n[xmin,fmin,u]=alm(f,g,[],x0) %#ok\u003c*NOPTS\u003e\r\nxcorrect=2;\r\nucorrect=0.5;\r\nassert(norm(xmin-xcorrect)\u003c1e-3)\r\nassert(abs(fmin-f(xcorrect))\u003c1e-3)\r\nassert(abs(u-ucorrect)\u003c1e-3)\r\n\r\n%% Haftka \u0026 Gurdal, Example 5.7.1\r\nf = @(x) x(1).^2 + 10*x(2).^2;\r\nh = @(x) sum(x)-4;\r\nx0 = [0; 0];\r\n[xmin,fmin,~,v]=alm(f,[],h,x0)\r\nxcorrect=[40; 4]/11;\r\nvcorrect=-7.2727;\r\nassert(norm(xmin-xcorrect)\u003c1e-3)\r\nassert(abs(fmin-f(xcorrect))\u003c1e-4)\r\nassert(abs(v-vcorrect)\u003c1e-2)\r\n\r\n%% Vanderplaats, Figure 5-4 example\r\nf = @(x) sum(x);\r\ng = @(x) [x(1) - 2*x(2) - 2\r\n          8 - 6*x(1) + x(1).^2 - x(2)];\r\nx0 = [0; 0];\r\n[xmin,fmin,u]=alm(f,g,[],x0)\r\nxcorrect=[2; 0];\r\nucorrect=[0.2; 0.6];\r\nassert(norm(xmin-xcorrect)\u003c1e-4)\r\nassert(abs(fmin-f(xcorrect))\u003c1e-4)\r\nassert(norm(u-ucorrect)\u003c1e-2)","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":279,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":6,"test_suite_updated_at":"2012-03-25T02:49:42.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2012-03-25T02:46:55.000Z","updated_at":"2025-09-01T07:55:40.000Z","published_at":"2012-03-25T02:49:42.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eWrite a function to find the values of a design variable vector,\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ex\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, that minimizes a scalar objective function,\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ef\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e (\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ex\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e ), given a function handle to\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ef\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, and a starting guess,\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ex0\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, subject to inequality and equality constraints with function handles\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eg\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e\u0026lt;=0 and\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eh\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e=0, respectively. Use the Augmented Lagrangian Multiplier Method (a.k.a., the Method of Multipliers) and return the estimate of Lagrange multipliers\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eu\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e for inequalities, and\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ev\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e for equality constraints.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":42774,"title":"GJam March 2016 IOW: Clock Dance","description":"This Challenge is derived from \u003chttp://code.google.com/codejam/contest/8274486/dashboard#s=p1 GJam March 2016 Annual I/O for Women Dance Around the Clock\u003e. This is a mix of the small and large data sets.\r\n\r\nThe GJam story goes that D even dancers are arranged clockwise 1:D. Who is adjacent to dancer K after N pair swaps. The odd move swaps positions 1/2,3/4,..D-1/D. The even move swaps positions D/1, 2/3,...D-2/D-1. D=8 [1:8] becomes [2 1 4 3 6 5 8 7] after the first swap. After second swap we see [7 4 1 6 3 8 5 2].  \r\n\r\n\u003c\u003chttp://code.google.com/codejam/contest/images/?image=dance_around_the_clock.png\u0026p=5733344260128768\u0026c=8274486\u003e\u003e\r\n\r\n*Input:* [D K N] , 4\u003c=D\u003c=1E8, 1\u003c=K\u003c=D, 1\u003c=N\u003c=1E8\r\n\r\n*Output:* [KCW KCCW] , KCW is dancer to left of Kth dancer after N moves\r\n\r\n*Examples:* [m] [v]\r\n\r\n  [8 3 1] creates v=[6 4]\r\n  [8 4 2] creates v=[1 7]\r\n  [6 6 1] creates v=[5 3]\r\n \r\n\r\n*\u003chttp://code.google.com/codejam Google Code Jam 2016 Open Qualifier: April 8, 2016\u003e*\r\n\r\n*Contest Theory:* The small case was D\u003c10 and N\u003c10. This could be done brute force in the 5 minutes of entry submission allowed. However, this is clearly a case of modulo math so might as well solve the unbounded case of D/N \u003c1E8. The number being assigned as 1:D leads to confusion as mod maps to 0:D-1. Suggest offset the K dancer number by 1 for processing and then correct for the final answer. Mod is fun as mod(-1,8) yields a useful 7. Quick observation is for offsetted K vector [0:D-1] the Evens move CW and the Odds move CCW. One method used 5 mod calls to solve.","description_html":"\u003cp\u003eThis Challenge is derived from \u003ca href = \"http://code.google.com/codejam/contest/8274486/dashboard#s=p1\"\u003eGJam March 2016 Annual I/O for Women Dance Around the Clock\u003c/a\u003e. This is a mix of the small and large data sets.\u003c/p\u003e\u003cp\u003eThe GJam story goes that D even dancers are arranged clockwise 1:D. Who is adjacent to dancer K after N pair swaps. The odd move swaps positions 1/2,3/4,..D-1/D. The even move swaps positions D/1, 2/3,...D-2/D-1. D=8 [1:8] becomes [2 1 4 3 6 5 8 7] after the first swap. After second swap we see [7 4 1 6 3 8 5 2].\u003c/p\u003e\u003cimg src = \"http://code.google.com/codejam/contest/images/?image=dance_around_the_clock.png\u0026p=5733344260128768\u0026c=8274486\"\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e [D K N] , 4\u0026lt;=D\u0026lt;=1E8, 1\u0026lt;=K\u0026lt;=D, 1\u0026lt;=N\u0026lt;=1E8\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e [KCW KCCW] , KCW is dancer to left of Kth dancer after N moves\u003c/p\u003e\u003cp\u003e\u003cb\u003eExamples:\u003c/b\u003e [m] [v]\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003e[8 3 1] creates v=[6 4]\r\n[8 4 2] creates v=[1 7]\r\n[6 6 1] creates v=[5 3]\r\n\u003c/pre\u003e\u003cp\u003e\u003cb\u003e\u003ca href = \"http://code.google.com/codejam\"\u003eGoogle Code Jam 2016 Open Qualifier: April 8, 2016\u003c/a\u003e\u003c/b\u003e\u003c/p\u003e\u003cp\u003e\u003cb\u003eContest Theory:\u003c/b\u003e The small case was D\u0026lt;10 and N\u0026lt;10. This could be done brute force in the 5 minutes of entry submission allowed. However, this is clearly a case of modulo math so might as well solve the unbounded case of D/N \u0026lt;1E8. The number being assigned as 1:D leads to confusion as mod maps to 0:D-1. Suggest offset the K dancer number by 1 for processing and then correct for the final answer. Mod is fun as mod(-1,8) yields a useful 7. Quick observation is for offsetted K vector [0:D-1] the Evens move CW and the Odds move CCW. One method used 5 mod calls to solve.\u003c/p\u003e","function_template":"function v=ClockDance(m)\r\n% m [D K N] % Num Dancers, K dancernumber, N swaps\r\n% v=[CW_dancenumber CCW_dancenumber]  [pos+1, pos-1]\r\n v=[0 0];\r\n% This is a mod mod mod type contest question\r\n% Note mod(-1,8)=7\r\n% Note changing dancers from 1:D to 0:D-1 helps mod normalcy and brain function\r\n% At the end add 1 back to the v vector\r\n\r\nend","test_suite":"%%\r\nm=[8 3 1 ];\r\nv=ClockDance(m);\r\nvexp=[6 4 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[8 4 2 ];\r\nv=ClockDance(m);\r\nvexp=[1 7 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[4 1 8 ];\r\nv=ClockDance(m);\r\nvexp=[2 4 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[10 9 6 ];\r\nv=ClockDance(m);\r\nvexp=[2 10 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[4 2 9 ];\r\nv=ClockDance(m);\r\nvexp=[1 3 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[8 2 10 ];\r\nv=ClockDance(m);\r\nvexp=[7 5 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[8 8 7 ];\r\nv=ClockDance(m);\r\nvexp=[3 1 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[4 4 3 ];\r\nv=ClockDance(m);\r\nvexp=[3 1 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[6 6 1 ];\r\nv=ClockDance(m);\r\nvexp=[5 3 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[4 4 6 ];\r\nv=ClockDance(m);\r\nvexp=[1 3 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[4 2 5 ];\r\nv=ClockDance(m);\r\nvexp=[1 3 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[4 4 1 ];\r\nv=ClockDance(m);\r\nvexp=[3 1 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[4 1 1 ];\r\nv=ClockDance(m);\r\nvexp=[4 2 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[6 2 2 ];\r\nv=ClockDance(m);\r\nvexp=[5 3 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[6 1 10 ];\r\nv=ClockDance(m);\r\nvexp=[4 2 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[8 3 1 ];\r\nv=ClockDance(m);\r\nvexp=[6 4 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[8 4 2 ];\r\nv=ClockDance(m);\r\nvexp=[1 7 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[4 1 8 ];\r\nv=ClockDance(m);\r\nvexp=[2 4 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[72137284 16112525 91351141 ];\r\nv=ClockDance(m);\r\nvexp=[54540240 54540238 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[155546 123001 56937611 ];\r\nv=ClockDance(m);\r\nvexp=[138552 138550 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[78548986 44806245 20024652 ];\r\nv=ClockDance(m);\r\nvexp=[6306564 6306562 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[4 2 5 ];\r\nv=ClockDance(m);\r\nvexp=[1 3 ];\r\nassert(isequal(vexp,v))\r\n%%\r\nm=[61256952 31789482 70629381 ];\r\nv=ClockDance(m);\r\nvexp=[13044625 13044623 ];\r\nassert(isequal(vexp,v))\r\n\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":10,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2016-03-16T04:41:57.000Z","updated_at":"2016-03-16T05:17:21.000Z","published_at":"2016-03-16T05:10: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\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis Challenge is derived from\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://code.google.com/codejam/contest/8274486/dashboard#s=p1\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eGJam March 2016 Annual I/O for Women Dance Around the Clock\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. This is a mix of the small and large data sets.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe GJam story goes that D even dancers are arranged clockwise 1:D. Who is adjacent to dancer K after N pair swaps. The odd move swaps positions 1/2,3/4,..D-1/D. The even move swaps positions D/1, 2/3,...D-2/D-1. D=8 [1:8] becomes [2 1 4 3 6 5 8 7] after the first swap. After second swap we see [7 4 1 6 3 8 5 2].\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e [D K N] , 4\u0026lt;=D\u0026lt;=1E8, 1\u0026lt;=K\u0026lt;=D, 1\u0026lt;=N\u0026lt;=1E8\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 [KCW KCCW] , KCW is dancer to left of Kth dancer after N 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\u003eExamples:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e [m] [v]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[[8 3 1] creates v=[6 4]\\n[8 4 2] creates v=[1 7]\\n[6 6 1] creates v=[5 3]]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://code.google.com/codejam\\\"\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eGoogle Code Jam 2016 Open Qualifier: April 8, 2016\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eContest Theory:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e The small case was D\u0026lt;10 and N\u0026lt;10. This could be done brute force in the 5 minutes of entry submission allowed. However, this is clearly a case of modulo math so might as well solve the unbounded case of D/N \u0026lt;1E8. The number being assigned as 1:D leads to confusion as mod maps to 0:D-1. Suggest offset the K dancer number by 1 for processing and then correct for the final answer. Mod is fun as mod(-1,8) yields a useful 7. Quick observation is for offsetted K vector [0:D-1] the Evens move CW and the Odds move CCW. One method used 5 mod calls to solve.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":42765,"title":"Maximize Non-Co-Planar Points in an N-Cube","description":"This Challenge is to find a set with the maximum number of integer points that create planar surfaces with a maximum of three points from the set. No four points may be co-planar.\r\nGiven the size N and the number of expected points Q find a set of Q points. Only N=2/Q=5 and N=3/Q=8 will be tested. N=4/Q=10 or N=5/Q=13 are too large to process.\r\n\r\n  N=2 contains 8 points [0,0,0;0,1,0;1,0,0;1,1,0;0,0,1;0,1,1;1,0,1;1,1,1]\r\n  N=3 contains 27 points [0,0,0;0,0,1;0,0,2;...2,2,2]\r\n\r\nOutput is a Qx3 matrix of the non-co-planar points.\r\n\r\nReference: The \u003chttp://68.173.157.131/Contest/Tetrahedra March 2016 Al Zimmermann Non-Coplanar contest\u003e is N=primes less than 100. Maximize the number of points in an NxNxN cube with no 4 points in a common plane.\r\n\r\nTheory: The N=2 and N=3 cases can be processed by brute force if care is taken. Assumption of [0,0,0] greatly reduces number of cases. Solving \u003chttp://www.mathworks.com/matlabcentral/cody/problems/42762-is-3d-point-set-co-planar Cody Co-Planar Check\u003e may improve speed. ","description_html":"\u003cp\u003eThis Challenge is to find a set with the maximum number of integer points that create planar surfaces with a maximum of three points from the set. No four points may be co-planar.\r\nGiven the size N and the number of expected points Q find a set of Q points. Only N=2/Q=5 and N=3/Q=8 will be tested. N=4/Q=10 or N=5/Q=13 are too large to process.\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003eN=2 contains 8 points [0,0,0;0,1,0;1,0,0;1,1,0;0,0,1;0,1,1;1,0,1;1,1,1]\r\nN=3 contains 27 points [0,0,0;0,0,1;0,0,2;...2,2,2]\r\n\u003c/pre\u003e\u003cp\u003eOutput is a Qx3 matrix of the non-co-planar points.\u003c/p\u003e\u003cp\u003eReference: The \u003ca href = \"http://68.173.157.131/Contest/Tetrahedra\"\u003eMarch 2016 Al Zimmermann Non-Coplanar contest\u003c/a\u003e is N=primes less than 100. Maximize the number of points in an NxNxN cube with no 4 points in a common plane.\u003c/p\u003e\u003cp\u003eTheory: The N=2 and N=3 cases can be processed by brute force if care is taken. Assumption of [0,0,0] greatly reduces number of cases. Solving \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/problems/42762-is-3d-point-set-co-planar\"\u003eCody Co-Planar Check\u003c/a\u003e may improve speed.\u003c/p\u003e","function_template":"function m=MaxNonCoplanarPts(N,Q);\r\n% Place Q or more points in an 0:N-1 #D grid such that each plane created uses only 3 points from the set provided\r\n% N is Cube size\r\n% Q is expected number of points in solution\r\n% Hint: Point [0,0,0] can be assumed to be in the solution for N=2 and N=3\r\n% N=3 is the 27 points [0,0,0;0,0,1;0,0,2;...2,2,2]\r\n  m=[];\r\nend","test_suite":"%%\r\nN=2;\r\nQ=5;\r\nm=MaxNonCoplanarPts(N,Q);\r\nm=floor(abs(m))\r\n% Perform m check\r\nvalid=1;\r\nif size(m,1)\u003cQ,valid=0;end % Must be Q pts or more\r\nif max(m(:))\u003eN-1,valid=0;end\r\npset=nchoosek(1:size(m,1),4);\r\nfor i=1:length(pset)\r\n m4=m(pset(i,:),:);\r\n% Coplanar check method courtesy of Tim\r\n if ~det([m4 ones(4,1)]) % coplanar det=0\r\n  valid=0;\r\n  break\r\n end\r\nend\r\nassert(isequal(1,valid))\r\n%%\r\nN=3;\r\nQ=8;\r\nm=MaxNonCoplanarPts(N,Q);\r\nm=floor(abs(m))\r\n% Perform m check\r\nvalid=1;\r\nif size(m,1)\u003cQ,valid=0;end % Must be Q pts or more\r\nif max(m(:))\u003eN-1,valid=0;end\r\npset=nchoosek(1:size(m,1),4);\r\nfor i=1:length(pset)\r\n m4=m(pset(i,:),:);\r\n% Coplanar check method courtesy of Tim\r\n if ~det([m4 ones(4,1)]) % coplanar det=0\r\n  valid=0;\r\n  break\r\n end\r\nend\r\nassert(isequal(1,valid))\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":6,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2016-03-07T00:22:02.000Z","updated_at":"2016-03-07T01:01:33.000Z","published_at":"2016-03-07T01:01:33.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis Challenge is to find a set with the maximum number of integer points that create planar surfaces with a maximum of three points from the set. No four points may be co-planar. Given the size N and the number of expected points Q find a set of Q points. Only N=2/Q=5 and N=3/Q=8 will be tested. N=4/Q=10 or N=5/Q=13 are too large to process.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[N=2 contains 8 points [0,0,0;0,1,0;1,0,0;1,1,0;0,0,1;0,1,1;1,0,1;1,1,1]\\nN=3 contains 27 points [0,0,0;0,0,1;0,0,2;...2,2,2]]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eOutput is a Qx3 matrix of the non-co-planar points.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eReference: The\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://68.173.157.131/Contest/Tetrahedra\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eMarch 2016 Al Zimmermann Non-Coplanar contest\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e is N=primes less than 100. Maximize the number of points in an NxNxN cube with no 4 points in a common plane.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eTheory: The N=2 and N=3 cases can be processed by brute force if care is taken. Assumption of [0,0,0] greatly reduces number of cases. Solving\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/problems/42762-is-3d-point-set-co-planar\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eCody Co-Planar Check\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e may improve speed.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":42341,"title":"LMI Twins : Fuzzy Image matching","description":"The image below from \u003chttp://logicmastersindia.com/2016/04P/ Logic Masters India Marathon 2016\u003e is puzzle \"Twins Co-Ordinates\" with PDF password of \"TCO_cLiEsh\".\r\n\r\nThe challenge is to find the six matching image squares given a [612,1078,3] PNG file screen captured using Snipping Tool. The matching squares may be rotated but are not reflected. The cells will not match perfectly and the PNG file is oversize into the white around the whole black frame. The image grid is 10x18. Return a 6x4 array of [r1,c1,r2,c2;...] where cell [r1,c1] is a match for [r2,c2] with r(1:10) and c(1:18).\r\nA pscript to obfuscate the solution is implemented. The method for creating a Cody pscript is included in the Test Suite.\r\n\r\n\u003c\u003chttps://sites.google.com/site/razapor/matlab_cody/Twins.PNG\u003e\u003e\r\n\r\nMethod Hints:\r\nMerge into a BW 612x1078 image;Trim outer white space;Locate Top Left corner of each cell;create cell array of 180  squares;grab only 55x55 squares to enable rotation check;Problem size is only  4*180*179/2;Filter positive and negative deltas separately with a + convolution; check residual delta \u003c threshold.","description_html":"\u003cp\u003eThe image below from \u003ca href = \"http://logicmastersindia.com/2016/04P/\"\u003eLogic Masters India Marathon 2016\u003c/a\u003e is puzzle \"Twins Co-Ordinates\" with PDF password of \"TCO_cLiEsh\".\u003c/p\u003e\u003cp\u003eThe challenge is to find the six matching image squares given a [612,1078,3] PNG file screen captured using Snipping Tool. The matching squares may be rotated but are not reflected. The cells will not match perfectly and the PNG file is oversize into the white around the whole black frame. The image grid is 10x18. Return a 6x4 array of [r1,c1,r2,c2;...] where cell [r1,c1] is a match for [r2,c2] with r(1:10) and c(1:18).\r\nA pscript to obfuscate the solution is implemented. The method for creating a Cody pscript is included in the Test Suite.\u003c/p\u003e\u003cimg src = \"https://sites.google.com/site/razapor/matlab_cody/Twins.PNG\"\u003e\u003cp\u003eMethod Hints:\r\nMerge into a BW 612x1078 image;Trim outer white space;Locate Top Left corner of each cell;create cell array of 180  squares;grab only 55x55 squares to enable rotation check;Problem size is only  4*180*179/2;Filter positive and negative deltas separately with a + convolution; check residual delta \u0026lt; threshold.\u003c/p\u003e","function_template":"function m=LMI_Twins(fn)\r\n% Grab png \r\nm=[];\r\npict=imread(fn); % [612,1078,3] size png,  sum(pict,3) may be useful\r\n% useful sub_pict size of 55x55\r\n\r\nend\r\n","test_suite":"%%\r\n% obfuscated check function\r\ntic\r\nfh = fopen('Eval_Twins.p','wb');\r\nfwrite(fh, hex2dec(reshape('7630312E30307630302E30300002901CC14FDFB100000081000000D80000012A48DF9D54B1FA232306002212C284B03C55EA944CADBBEC102FFDF678B732282B51740342451D4E91F086ABE90CD97AEA717741F995FCF6ED6A372B6C44524D61F2179DA76458DBA2B9AA01529272E90AD613EA63642EEECCDE54CD649A84090DE86A418D761593CBABBD4B17018634CA5451EA6A6F4386B000CBE73A136AFE2CE5946FD8FD16225562B3414B8C6268F085E3E3E8F1CFCFBBA469FCC5E0343472A562EAD16FFC1B7D27730414ECC1D42F6EB98289E998DA2EA3F4F820A10F9B23E296CDE97331C46563B702180857770F7A14412389BC1BA2',2,[]).'));\r\nfclose(fh);\r\nrehash path;\r\ntoc\r\n%%\r\ntic\r\nurl='https://sites.google.com/site/razapor/matlab_cody/Twins.PNG?attredirects=0\u0026d=1';\r\nurlwrite(url,'Twins.PNG');\r\nfprintf('url write complete %.1f\\n',toc)\r\n\r\nfn='Twins.PNG';\r\nm=LMI_Twins(fn);\r\nassert(Eval_Twins(m));\r\nfprintf('Process Complete %.1f\\n',toc)\r\n%%\r\n% Creation Process for a Cody p file\r\n% Create function  func_name.m\r\n% pcode func_name\r\n% fn='func_name.p';\r\n% fr=fopen(fn,'r');\r\n% m=fread(fr);\r\n% fclose(fr);\r\n% fw=fopen([fn(1:end-1) 'txt'],'w');\r\n% fprintf(fw,'%s',dec2hex(m)');\r\n% fclose(fw);\r\n% use wordpad to open func_name.txt\r\n% In cody in first block write:\r\n% fh = fopen('func_name.p','wb');\r\n% fwrite(fh, hex2dec(reshape('INSERT WORDPAD TEXT HERE',2,[]).'));\r\n% fclose(fh);\r\n% rehash path;","published":true,"deleted":false,"likes_count":1,"comments_count":0,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":3,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2015-05-28T19:12:46.000Z","updated_at":"2016-05-12T01:56:20.000Z","published_at":"2016-05-12T01:56:20.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.png\"}],\"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 image below from\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://logicmastersindia.com/2016/04P/\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eLogic Masters India Marathon 2016\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e is puzzle \\\"Twins Co-Ordinates\\\" with PDF password of \\\"TCO_cLiEsh\\\".\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe challenge is to find the six matching image squares given a [612,1078,3] PNG file screen captured using Snipping Tool. The matching squares may be rotated but are not reflected. The cells will not match perfectly and the PNG file is oversize into the white around the whole black frame. The image grid is 10x18. Return a 6x4 array of [r1,c1,r2,c2;...] where cell [r1,c1] is a match for [r2,c2] with r(1:10) and c(1:18). A pscript to obfuscate the solution is implemented. The method for creating a Cody pscript is included in the Test Suite.\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\u003eMethod Hints: Merge into a BW 612x1078 image;Trim outer white space;Locate Top Left corner of each cell;create cell array of 180 squares;grab only 55x55 squares to enable rotation check;Problem size is only 4*180*179/2;Filter positive and negative deltas separately with a + convolution; check residual delta \u0026lt; threshold.\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.png\",\"contentType\":\"image/png\",\"content\":\"data:image/png;base64,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\"}]}"},{"id":44784,"title":"Project Euler: Problem 14 Longest Collatz sequence(harder version)","description":"This problem is a harder version of \"Problem 44448. Project Euler: Problem 14 Longest Collatz sequence\", because of time limits. \u003chttps://ww2.mathworks.cn/matlabcentral/cody/problems/44448\u003e \r\n\r\nThe following iterative sequence is defined for the set of positive integers:\r\nn → n/2 (n is even) n → 3n + 1 (n is odd)\r\nUsing the rule above and starting with 13, we generate the following sequence:\r\n13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1 It can be seen that this sequence (starting at 13 and finishing at 1) contains 10 terms. Although it has not been proved yet (Collatz Problem), it is thought that all starting numbers finish at 1.\r\nWhich starting number, no more than N, produces the longest chain, and how long? Don't cheat!","description_html":"\u003cp\u003eThis problem is a harder version of \"Problem 44448. Project Euler: Problem 14 Longest Collatz sequence\", because of time limits. \u003ca href = \"https://ww2.mathworks.cn/matlabcentral/cody/problems/44448\"\u003ehttps://ww2.mathworks.cn/matlabcentral/cody/problems/44448\u003c/a\u003e\u003c/p\u003e\u003cp\u003eThe following iterative sequence is defined for the set of positive integers:\r\nn → n/2 (n is even) n → 3n + 1 (n is odd)\r\nUsing the rule above and starting with 13, we generate the following sequence:\r\n13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1 It can be seen that this sequence (starting at 13 and finishing at 1) contains 10 terms. Although it has not been proved yet (Collatz Problem), it is thought that all starting numbers finish at 1.\r\nWhich starting number, no more than N, produces the longest chain, and how long? Don't cheat!\u003c/p\u003e","function_template":"function y = euler014_v2(x)\r\n  y = x;\r\nend","test_suite":"1\r\n%%\r\nassessFunctionAbsence({'tic','toc','pause','etime','clock','now','str2num','timer'},'FileName','euler014_v2.m')\r\n\r\n2\r\n%%\r\nN = 2e8;\r\nnum_correct = 169941673;\r\nlen_correct = 954;\r\ntic\r\n[num, len] = euler014_v2(N);\r\nt=toc\r\nassert(t\u003e1);\r\nassert(isequal(num, num_correct));\r\nassert(isequal(len, len_correct));\r\n\r\n3\r\n%%\r\nN = 4e8;\r\nnum_correct = 268549803;\r\nlen_correct = 965;\r\ntic\r\n[num, len] = euler014_v2(N);\r\nt=toc\r\nassert(t\u003e1);\r\nassert(isequal(num, num_correct));\r\nassert(isequal(len, len_correct));\r\n\r\n\r\n","published":true,"deleted":false,"likes_count":1,"comments_count":4,"created_by":3668,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":3,"test_suite_updated_at":"2018-11-11T06:11:05.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2018-11-09T16:59:43.000Z","updated_at":"2018-11-11T06:11:05.000Z","published_at":"2018-11-09T16:59:43.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis problem is a harder version of \\\"Problem 44448. Project Euler: Problem 14 Longest Collatz sequence\\\", because of time limits.\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://ww2.mathworks.cn/matlabcentral/cody/problems/44448\\\"\u003e\u003cw:r\u003e\u003cw:t\u003e\u0026lt;https://ww2.mathworks.cn/matlabcentral/cody/problems/44448\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e\u0026gt;\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe following iterative sequence is defined for the set of positive integers: n → n/2 (n is even) n → 3n + 1 (n is odd) Using the rule above and starting with 13, we generate the following sequence: 13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1 It can be seen that this sequence (starting at 13 and finishing at 1) contains 10 terms. Although it has not been proved yet (Collatz Problem), it is thought that all starting numbers finish at 1. Which starting number, no more than N, produces the longest chain, and how long? Don't cheat!\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":44832,"title":"Generate Convolution Matrix of 2D Kernel with Different Convolution Shapes (Full, Same, Valid)","description":"In this problem the challenge is to build the Matrix Form equivalent of the function `conv2()` of MATLAB.\r\n\r\nThe function to be built will generate a sparse matrix `mK` which is the convolution matrix of the 2D Kernel 'mH' (Which is an input to the function).  \r\nThe input to the function is the 2D Kernel and dimensions of the image to apply the convolution upon and the shape of the convolution ('full', 'same', 'valid' as in 'conv2()').\r\n\r\nThe output sparse matrix should match the output of using 'conv2()' on the same image using the same convolution shape.\r\n\r\nFor instance:\r\n\r\n  CONVOLUTION_SHAPE_FULL  = 1;\r\n  CONVOLUTION_SHAPE_SAME  = 2;\r\n  CONVOLUTION_SHAPE_VALID = 3;\r\n  \r\n  numRowsImage = 100;\r\n  numColsImage = 80;\r\n  \r\n  numRowsKernel = 7;\r\n  numColsKernel = 5;\r\n  \r\n  mI = rand(numRowsImage, numColsImage);\r\n  mH = rand(numRowsKernel, numColsKernel);\r\n  \r\n  maxThr = 1e-9;\r\n  \r\n  \r\n  %% Full Convolution\r\n  \r\n  convShape       = CONVOLUTION_SHAPE_FULL;\r\n  \r\n  numRowsOut = numRowsImage + numRowsKernel - 1;\r\n  numColsOut = numColsImage + numColsKernel - 1;\r\n  \r\n  mORef   = conv2(mI, mH, 'full');\r\n  mK      = CreateImageConvMtx(mH, numRowsImage, numColsImage, convShape);\r\n  mO      = reshape(mK * mI(:), numRowsOut, numColsOut);\r\n  \r\n  mE = mO - mORef;\r\n  assert(max(abs(mE(:))) \u003c maxThr);\r\n\r\nThe test case will examine all 3 modes.\r\nTry to solve it once with very clear code (No vectorization tricks) and then optimize.\r\n\r\nA good way to build the output sparse function is using:\r\n\r\n  mK = sparse(vRows, vCols, vVals, numElementsOutputImage, numElementsInputImage);\r\n\r\nLook for the documentation of `sparse()` function for more details.","description_html":"\u003cp\u003eIn this problem the challenge is to build the Matrix Form equivalent of the function `conv2()` of MATLAB.\u003c/p\u003e\u003cp\u003eThe function to be built will generate a sparse matrix `mK` which is the convolution matrix of the 2D Kernel 'mH' (Which is an input to the function).  \r\nThe input to the function is the 2D Kernel and dimensions of the image to apply the convolution upon and the shape of the convolution ('full', 'same', 'valid' as in 'conv2()').\u003c/p\u003e\u003cp\u003eThe output sparse matrix should match the output of using 'conv2()' on the same image using the same convolution shape.\u003c/p\u003e\u003cp\u003eFor instance:\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003eCONVOLUTION_SHAPE_FULL  = 1;\r\nCONVOLUTION_SHAPE_SAME  = 2;\r\nCONVOLUTION_SHAPE_VALID = 3;\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003enumRowsImage = 100;\r\nnumColsImage = 80;\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003enumRowsKernel = 7;\r\nnumColsKernel = 5;\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003emI = rand(numRowsImage, numColsImage);\r\nmH = rand(numRowsKernel, numColsKernel);\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003emaxThr = 1e-9;\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003e%% Full Convolution\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003econvShape       = CONVOLUTION_SHAPE_FULL;\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003enumRowsOut = numRowsImage + numRowsKernel - 1;\r\nnumColsOut = numColsImage + numColsKernel - 1;\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003emORef   = conv2(mI, mH, 'full');\r\nmK      = CreateImageConvMtx(mH, numRowsImage, numColsImage, convShape);\r\nmO      = reshape(mK * mI(:), numRowsOut, numColsOut);\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003emE = mO - mORef;\r\nassert(max(abs(mE(:))) \u0026lt; maxThr);\r\n\u003c/pre\u003e\u003cp\u003eThe test case will examine all 3 modes.\r\nTry to solve it once with very clear code (No vectorization tricks) and then optimize.\u003c/p\u003e\u003cp\u003eA good way to build the output sparse function is using:\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003emK = sparse(vRows, vCols, vVals, numElementsOutputImage, numElementsInputImage);\r\n\u003c/pre\u003e\u003cp\u003eLook for the documentation of `sparse()` function for more details.\u003c/p\u003e","function_template":"function [ mK ] = CreateImageConvMtx( mH, numRows, numCols, convShape )\r\n%Generates a Convolution Matrix for the 2D Kernel (The Matrix mH) with\r\n%support for different convolution shapes (Full / Same / Valid).\r\n% Input:\r\n%   - mH                -   Input 2D Convolution Kernel.\r\n%                           Structure: Matrix.\r\n%                           Type: 'Single' / 'Double'.\r\n%                           Range: (-inf, inf).\r\n%   - numRows           -   Number of Rows.\r\n%                           Number of rows in the output convolution\r\n%                           matrix.\r\n%                           Structure: Scalar.\r\n%                           Type: 'Single' / 'Double'.\r\n%                           Range: {1, 2, 3, ...}.\r\n%   - numCols           -   Number of Columns.\r\n%                           Number of columns in the output convolution\r\n%                           matrix.\r\n%                           Structure: Scalar.\r\n%                           Type: 'Single' / 'Double'.\r\n%                           Range: {1, 2, 3, ...}.\r\n%   - convShape         -   Convolution Shape.\r\n%                           The shape of the convolution which the output\r\n%                           convolution matrix should represent. The\r\n%                           options should match MATLAB's conv2() function\r\n%                           - Full / Same / Valid.\r\n%                           Structure: Scalar.\r\n%                           Type: 'Single' / 'Double'.\r\n%                           Range: {1, 2, 3}.\r\n% Output:\r\n%   - mK                -   Convolution Matrix.\r\n%                           The output convolution matrix. Multiplying in\r\n%                           the column stack form on an image should be\r\n%                           equivalent to applying convolution on the\r\n%                           image.\r\n%                           Structure: Matrix (Sparse).\r\n%                           Type: 'Single' / 'Double'.\r\n%                           Range: (-inf, inf).\r\n% References:\r\n%   1.  MATLAB's 'convmtx2()' - https://www.mathworks.com/help/images/ref/convmtx2.html.\r\n% Remarks:\r\n%   1.  gf\r\n% TODO:\r\n%   1.  \r\n%   Release Notes:\r\n%   -   1.0.000     dd/mm/yyyy  firstName lastName\r\n%       *   First release version.\r\n% ----------------------------------------------------------------------------------------------- %\r\n\r\nCONVOLUTION_SHAPE_FULL  = 1;\r\nCONVOLUTION_SHAPE_SAME  = 2;\r\nCONVOLUTION_SHAPE_VALID = 3;\r\n\r\nswitch(convShape)\r\n    case(CONVOLUTION_SHAPE_FULL)\r\n        % Code for the 'full' case\r\n    case(CONVOLUTION_SHAPE_SAME)\r\n        % Code for the 'same' case\r\n    case(CONVOLUTION_SHAPE_VALID)\r\n        % Code for the 'valid' case\r\nend\r\n\r\n\r\nend\r\n\r\n","test_suite":"%% Testing\r\n\r\n\r\nCONVOLUTION_SHAPE_FULL  = 1;\r\nCONVOLUTION_SHAPE_SAME  = 2;\r\nCONVOLUTION_SHAPE_VALID = 3;\r\n\r\nmaxThr = 1e-9;\r\n\r\n\r\nfor numRowsImage = 28:32\r\n    for numColsImage = 28:32\r\n        \r\n        mI = rand(numRowsImage, numColsImage);\r\n        \r\n        for numRowsKernel = 3:7\r\n            for numColsKernel = 3:7\r\n                \r\n                mH = rand(numRowsKernel, numColsKernel);\r\n                \r\n                for convShape = 1:3\r\n                    \r\n                    switch(convShape)\r\n                        case(CONVOLUTION_SHAPE_FULL)\r\n                            numRowsOut = numRowsImage + numRowsKernel - 1;\r\n                            numColsOut = numColsImage + numColsKernel - 1;\r\n                            \r\n                            convShapeString = 'full';\r\n                        case(CONVOLUTION_SHAPE_SAME)\r\n                            numRowsOut = numRowsImage;\r\n                            numColsOut = numColsImage;\r\n                            \r\n                            convShapeString = 'same';\r\n                        case(CONVOLUTION_SHAPE_VALID)\r\n                            numRowsOut = numRowsImage - numRowsKernel + 1;\r\n                            numColsOut = numColsImage - numColsKernel + 1;\r\n                            \r\n                            convShapeString = 'valid';\r\n                    end\r\n                    \r\n                    mORef   = conv2(mI, mH, convShapeString);\r\n                    mK      = CreateImageConvMtx(mH, numRowsImage, numColsImage, convShape);\r\n                    mO      = reshape(mK * mI(:), numRowsOut, numColsOut);\r\n                    \r\n                    disp([' ']);\r\n                    disp(['Validating solution for the following parameters:']);\r\n                    disp(['Image Size - [', num2str(numRowsImage), ' x ', num2str(numColsImage), ']']);\r\n                    disp(['Kernel Size - [', num2str(numRowsKernel), ' x ', num2str(numColsKernel), ']']);\r\n                    disp(['Convolution Shape - ', convShapeString]);\r\n                    \r\n                    mE = mO - mORef;\r\n                    maxAbsDev = max(abs(mE(:)));\r\n                    if(maxAbsDev \u003e= maxThr)\r\n                        disp([' ']);\r\n                        disp(['Validation Failed']);\r\n                        disp([' ']);\r\n                    end\r\n                    assert(maxAbsDev \u003c maxThr);\r\n                    \r\n                end\r\n            end\r\n        end\r\n    end\r\nend\r\n            \r\n\r\n\r\n\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":6204,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":3,"test_suite_updated_at":"2019-01-15T23:13:37.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2019-01-15T21:20:18.000Z","updated_at":"2019-01-15T23:13:37.000Z","published_at":"2019-01-15T21:20:18.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eIn this problem the challenge is to build the Matrix Form equivalent of the function `conv2()` of MATLAB.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe function to be built will generate a sparse matrix `mK` which is the convolution matrix of the 2D Kernel 'mH' (Which is an input to the function). The input to the function is the 2D Kernel and dimensions of the image to apply the convolution upon and the shape of the convolution ('full', 'same', 'valid' as in 'conv2()').\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe output sparse matrix should match the output of using 'conv2()' on the same image using the same convolution shape.\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\u003eFor instance:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[CONVOLUTION_SHAPE_FULL  = 1;\\nCONVOLUTION_SHAPE_SAME  = 2;\\nCONVOLUTION_SHAPE_VALID = 3;\\n\\nnumRowsImage = 100;\\nnumColsImage = 80;\\n\\nnumRowsKernel = 7;\\nnumColsKernel = 5;\\n\\nmI = rand(numRowsImage, numColsImage);\\nmH = rand(numRowsKernel, numColsKernel);\\n\\nmaxThr = 1e-9;\\n\\n%%Full Convolution\\n\\nconvShape       = CONVOLUTION_SHAPE_FULL;\\n\\nnumRowsOut = numRowsImage + numRowsKernel - 1;\\nnumColsOut = numColsImage + numColsKernel - 1;\\n\\nmORef   = conv2(mI, mH, 'full');\\nmK      = CreateImageConvMtx(mH, numRowsImage, numColsImage, convShape);\\nmO      = reshape(mK * mI(:), numRowsOut, numColsOut);\\n\\nmE = mO - mORef;\\nassert(max(abs(mE(:))) \u003c maxThr);]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe test case will examine all 3 modes. Try to solve it once with very clear code (No vectorization tricks) and then optimize.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eA good way to build the output sparse function is using:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[mK = sparse(vRows, vCols, vVals, numElementsOutputImage, numElementsInputImage);]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eLook for the documentation of `sparse()` function for more details.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":44545,"title":"\"Percentages may not total 100 due to rounding\"","description":"*Percentages* are commonly *rounded* when presented in tables.  As a result, the sum of the individual numbers does not always add up to 100%.  A warning is therefore sometimes appended to such tables, along the lines: _\"Percentages may not total 100 due to rounding\"_.\r\n\r\nEXAMPLE 1:\r\nA survey of eleven people for their opinion on a new policy found five to be in favour, five opposed, and one undecided/neutral.  Percentage-wise this becomes\r\n\r\n  In favour:          45% (5 of 11)\r\n  Undecided/neutral:   9% (1 of 11)  \r\n  Opposed:            45% (5 of 11)  \r\n\r\nThe total of these is 99%, rather than the expected 100%.  Despite this conflict, in this example *all of the individual numbers have been correctly entered*.  \r\n\r\nEXAMPLE 2:\r\nIn the same report, a survey of a further ten people on a different policy found four to be in favour, four opposed, and two undecided/neutral.  Suppose the data were presented in the following table\r\n\r\n  In favour:          45%\r\n  Undecided/neutral:  20%\r\n  Opposed:            45%\r\n\r\nGiven the background information, we would quickly recognise this as inconsistent, with a spurious total of 110%, rather than the expected 100%.  In fact, we would probably guess that a copy-and-paste mistake had occurred.  However, it is important to realise that even if we looked at this table alone, in isolation, without any background knowledge of the survey size or the true number of responses in any category, just by knowing that there are only three categories we can firmly conclude that in this example *one or more of the individual numbers must have been entered incorrectly*.  \r\n\r\nYOUR JOB:  \r\nGiven a list (vector) of integer percentages, determine whether among the individual values at least one of them _must_ have been incorrectly entered (return |true|), as in Example 2, or whether there might not be any incorrect entries (return |false|), as in Example 1.","description_html":"\u003cp\u003e\u003cb\u003ePercentages\u003c/b\u003e are commonly \u003cb\u003erounded\u003c/b\u003e when presented in tables.  As a result, the sum of the individual numbers does not always add up to 100%.  A warning is therefore sometimes appended to such tables, along the lines: \u003ci\u003e\"Percentages may not total 100 due to rounding\"\u003c/i\u003e.\u003c/p\u003e\u003cp\u003eEXAMPLE 1:\r\nA survey of eleven people for their opinion on a new policy found five to be in favour, five opposed, and one undecided/neutral.  Percentage-wise this becomes\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003eIn favour:          45% (5 of 11)\r\nUndecided/neutral:   9% (1 of 11)  \r\nOpposed:            45% (5 of 11)  \r\n\u003c/pre\u003e\u003cp\u003eThe total of these is 99%, rather than the expected 100%.  Despite this conflict, in this example \u003cb\u003eall of the individual numbers have been correctly entered\u003c/b\u003e.\u003c/p\u003e\u003cp\u003eEXAMPLE 2:\r\nIn the same report, a survey of a further ten people on a different policy found four to be in favour, four opposed, and two undecided/neutral.  Suppose the data were presented in the following table\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003eIn favour:          45%\r\nUndecided/neutral:  20%\r\nOpposed:            45%\r\n\u003c/pre\u003e\u003cp\u003eGiven the background information, we would quickly recognise this as inconsistent, with a spurious total of 110%, rather than the expected 100%.  In fact, we would probably guess that a copy-and-paste mistake had occurred.  However, it is important to realise that even if we looked at this table alone, in isolation, without any background knowledge of the survey size or the true number of responses in any category, just by knowing that there are only three categories we can firmly conclude that in this example \u003cb\u003eone or more of the individual numbers must have been entered incorrectly\u003c/b\u003e.\u003c/p\u003e\u003cp\u003eYOUR JOB:  \r\nGiven a list (vector) of integer percentages, determine whether among the individual values at least one of them \u003ci\u003emust\u003c/i\u003e have been incorrectly entered (return \u003ctt\u003etrue\u003c/tt\u003e), as in Example 2, or whether there might not be any incorrect entries (return \u003ctt\u003efalse\u003c/tt\u003e), as in Example 1.\u003c/p\u003e","function_template":"% \"May not sum to total due to rounding: the probability of rounding errors\"\r\n% Henry Bottomley, 03 June 2008\r\n% http://www.se16.info/hgb/rounding.pdf\r\n\r\n% \"How to make rounded percentages add up to 100%\"\r\n% https://stackoverflow.com/questions/13483430/how-to-make-rounded-percentages-add-up-to-100\r\n% cf. https://stackoverflow.com/questions/5227215/how-to-deal-with-the-sum-of-rounded-percentage-not-being-100\r\nfunction containsMistake = checkForMistake(z)\r\n    containsMistake = true * + false,\r\nend","test_suite":"%% Basics\r\nassessFunctionAbsence({'regexp', 'regexpi'}, 'FileName','checkForMistake.m')\r\n\r\n%% Example 1 (Row vector)\r\nxVec = round( 100*[5 1 5]/11 );\r\ncontainsMistake = false;\r\nassert( isequal(checkForMistake(xVec), containsMistake) )\r\n\r\n%% Example 1 (Column vector)\r\nxVec = round( 100*[5 1 5]/11 )';\r\ncontainsMistake = false;\r\nassert( isequal(checkForMistake(xVec), containsMistake) )\r\n\r\n%% Example 2 (Row vector)\r\nxVec = [42 20 45];\r\ncontainsMistake = true;\r\nassert( isequal(checkForMistake(xVec), containsMistake) )\r\n\r\n%% One percentage, over and under\r\nxVec = [100];\r\ncontainsMistake = false;\r\nassert( isequal(checkForMistake(xVec), containsMistake) , 'Failed test a')\r\nxVec = round([100.5]);\r\ncontainsMistake = true;\r\nassert( isequal(checkForMistake(xVec), containsMistake) , 'Failed test b')\r\nxVec = round([99.49]);\r\ncontainsMistake = true;\r\nassert( isequal(checkForMistake(xVec), containsMistake) , 'Failed test c')\r\n\r\n%% Two percentages, over and under\r\nxVec = [50 50];\r\ncontainsMistake = false;\r\nassert( isequal(checkForMistake(xVec), containsMistake) , 'Failed test a')\r\nxVec = round([49.5 50.5]);\r\ncontainsMistake = false;\r\nassert( isequal(checkForMistake(xVec), containsMistake) , 'Failed test b')\r\nxVec = round([50.5 50.5]);\r\ncontainsMistake = true;\r\nassert( isequal(checkForMistake(xVec), containsMistake) , 'Failed test c')\r\nxVec = round([49.49 50.49]);\r\ncontainsMistake = true;\r\nassert( isequal(checkForMistake(xVec), containsMistake) , 'Failed test d')\r\n\r\n%% Equal percentages\r\nfor j = [2:250 1000:1000:10000]\r\n    xVec = round( repelem(100/j, j) );\r\n    containsMistake = false;\r\n    assert( isequal(checkForMistake(xVec), containsMistake) )\r\nend;\r\n\r\n%% Geometric series (from Bottomley, §5)\r\nfor j = 10:30\r\n    xVec = round( 10 * (9/10).^[0:j] );\r\n    containsMistake = j \u003c 21;\r\n    assert( isequal(checkForMistake(xVec), containsMistake) )\r\nend;\r\n\r\n%% Geometric series (from Bottomley, §5), permuted\r\nfor j = 2:40\r\n    xVec = round( 10 * (9/10).^[0:j] );\r\n    xVec = xVec( randperm(j+1) );\r\n    containsMistake = j \u003c 21;\r\n    assert( isequal(checkForMistake(xVec), containsMistake) )\r\nend;\r\n\r\n%% Other geometric series (permuted) I\r\nfor j = 2:100\r\n    xVec = round( (99/100).^[0:j] );\r\n    xVec = xVec( randperm(j+1) );\r\n    containsMistake = j \u003c 66;\r\n    assert( isequal(checkForMistake(xVec), containsMistake) )\r\nend;\r\n\r\n%% Other geometric series (permuted) II\r\nfor j = 2:30\r\n    xVec = round( 20 * (4/5).^[0:j] );\r\n    xVec = xVec( randperm(j+1) );\r\n    containsMistake = j \u003c 12;\r\n    assert( isequal(checkForMistake(xVec), containsMistake) )\r\nend;\r\n\r\n%% Other geometric series (permuted) III\r\nfor j = 2:20\r\n    xVec = round( 25 * (3/4).^[0:j] );\r\n    xVec = xVec( randperm(j+1) );\r\n    containsMistake = j \u003c 10;\r\n    assert( isequal(checkForMistake(xVec), containsMistake) )\r\nend;\r\n\r\n%% Other geometric series (permuted) IV\r\nfor j = 2:20\r\n    xVec = round( 50 * (1/2).^[0:j] );\r\n    xVec = xVec( randperm(j+1) );\r\n    containsMistake = j \u003c 5;\r\n    assert( isequal(checkForMistake(xVec), containsMistake) )\r\nend;\r\n\r\n%% Systematic overestimation\r\nfor j = 2:100\r\n    num = randi(round(100/j)+1) - 1;\r\n    xRaw = repelem(num+0.5, j);   % cf. https://oletus.github.io/float16-simulator.js/\r\n    sm = sum(xRaw);\r\n    xRaw = [xRaw max(100-sm, 0)];\r\n    if sm \u003e 100.5,                % Not sm\u003e100, because need to account for extra zero added.\r\n        containsMistake = true;\r\n    else\r\n        containsMistake = false;\r\n    end;\r\n    xVec = round( xRaw );\r\n    xVec = xVec( randperm(j+1) );\r\n    assert( isequal(checkForMistake(xVec), containsMistake) , ['Failed with xRaw = ' num2str(xRaw)] )\r\nend;\r\n\r\n%% Systematic underestimation\r\nfor j = 2:100\r\n    num = randi(round(100/j)+1) - 1;\r\n    xRaw = repelem(num+0.499755859375, j);   % cf. https://oletus.github.io/float16-simulator.js/ \u0026 https://au.mathworks.com/help/matlab/matlab_prog/floating-point-numbers.html\r\n    cs = cumsum(xRaw);\r\n    if cs(end) \u003e 100,\r\n        xRaw( cs \u003e 100 ) = [];\r\n        containsMistake = true;\r\n    else\r\n        xRaw = [xRaw (100-cs(end))];\r\n        containsMistake = false;\r\n    end;\r\n    xVec = round( xRaw );\r\n    assert( isequal(checkForMistake(xVec), containsMistake) , ['Failed with xRaw = ' num2str(xRaw)] )\r\nend;","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":64439,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":3,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2018-03-23T08:02:20.000Z","updated_at":"2018-03-24T13:53:40.000Z","published_at":"2018-03-24T13:53:40.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ePercentages\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e are commonly\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003erounded\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e when presented in tables. As a result, the sum of the individual numbers does not always add up to 100%. A warning is therefore sometimes appended to such tables, along the lines:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003e\\\"Percentages may not total 100 due to rounding\\\"\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eEXAMPLE 1: A survey of eleven people for their opinion on a new policy found five to be in favour, five opposed, and one undecided/neutral. Percentage-wise this becomes\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[In favour:          45% (5 of 11)\\nUndecided/neutral:   9% (1 of 11)  \\nOpposed:            45% (5 of 11)]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe total of these is 99%, rather than the expected 100%. Despite this conflict, in this example\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eall of the individual numbers have been correctly entered\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eEXAMPLE 2: In the same report, a survey of a further ten people on a different policy found four to be in favour, four opposed, and two undecided/neutral. Suppose the data were presented in the following table\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[In favour:          45%\\nUndecided/neutral:  20%\\nOpposed:            45%]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eGiven the background information, we would quickly recognise this as inconsistent, with a spurious total of 110%, rather than the expected 100%. In fact, we would probably guess that a copy-and-paste mistake had occurred. However, it is important to realise that even if we looked at this table alone, in isolation, without any background knowledge of the survey size or the true number of responses in any category, just by knowing that there are only three categories we can firmly conclude that in this example\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eone or more of the individual numbers must have been entered incorrectly\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eYOUR JOB: Given a list (vector) of integer percentages, determine whether among the individual values at least one of them\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003emust\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e have been incorrectly entered (return\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003etrue\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e), as in Example 2, or whether there might not be any incorrect entries (return\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003efalse\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e), as in Example 1.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":44655,"title":"Computational power of Cody servers","description":"It has been \u003chttps://en.wikipedia.org/wiki/Moore%27s_law#History predicted\u003e that the performance of integrated circuits would _double_ every 18 months.  That suggests the time to perform a given computation should _halve_ roughly every 18 months.  \r\n\r\nWhat about on Cody?  Observational data is available from the final test case of \u003chttps://www.mathworks.com/matlabcentral/cody/problems/963-we-love-vectorized-solutions-problem-1-remove-the-row-average Problem 963\u003e to help us quantify the improvement in performance!  And thereby even make predictions for future computations.\r\n\r\n Solution    Date\t   Runtime [s]\r\n ...\r\n 144393\t     04-Oct-12\t   4.230\r\n ...\r\n 654812\t     17-Apr-15\t   3.099\r\n ...\r\n 1272817     20-Sep-17\t   2.0402\r\n ...\r\n\r\nThe complete data set will be provided to you as input.  You should assume the general trend can be described by the following law:\r\n\r\n runtime = r0 - δ [1 - exp(-t/k)]\r\n runtime = r∞ + δ exp(-t/k)\r\n\r\nwhere |r0| is the runtime at the start of the period in seconds, |r∞| is the predicted runtime (in seconds) that will be approached far in the future, |δ = r0 - r∞|, and |t| is the time in nominal years since the start of the period, and |k| is a kinetic parameter (in nominal years).  \r\n\r\nThe start of the period is defined by the earliest date in the series.  Compute the number of days exactly, and assume that a nominal year comprises 365.24 days.\r\n\r\nYour task is to \u003chttps://au.mathworks.com/help/matlab/math/example-curve-fitting-via-optimization.html fit the curve\u003e and thereby predict the runtime for various future dates.  Your output should be rounded to four decimal places.  \r\n\r\nMETHOD:  You _must_ use \u003chttps://au.mathworks.com/help/matlab/ref/fminsearch.html |fminsearch|\u003e to perform the non-linear regression, and you _must_ set the options using \u003chttps://au.mathworks.com/help/matlab/ref/optimset.html |optimset|\u003e to ensure sufficient accuracy.  The 'best' fit is defined — _for this problem, as in the common convention_ — as that which minimises the sum of the squares of the residuals.  \r\n\r\nEXAMPLE:\r\n\r\n % Input\r\n futureDate = '21-Nov-2023';\r\n data.solutionNumber = [1036949, ..., 1272817];\r\n data.date = ['29-Oct-2016'; ...; '20-Sep-2017'];\r\n data.runtime = [1.2630, ..., 2.0402];\r\n % Output\r\n predictedRuntime = 0.3619;  % seconds\r\n\r\n","description_html":"\u003cp\u003eIt has been \u003ca href = \"https://en.wikipedia.org/wiki/Moore%27s_law#History\"\u003epredicted\u003c/a\u003e that the performance of integrated circuits would \u003ci\u003edouble\u003c/i\u003e every 18 months.  That suggests the time to perform a given computation should \u003ci\u003ehalve\u003c/i\u003e roughly every 18 months.\u003c/p\u003e\u003cp\u003eWhat about on Cody?  Observational data is available from the final test case of \u003ca href = \"https://www.mathworks.com/matlabcentral/cody/problems/963-we-love-vectorized-solutions-problem-1-remove-the-row-average\"\u003eProblem 963\u003c/a\u003e to help us quantify the improvement in performance!  And thereby even make predictions for future computations.\u003c/p\u003e\u003cpre\u003e Solution    Date\t   Runtime [s]\r\n ...\r\n 144393\t     04-Oct-12\t   4.230\r\n ...\r\n 654812\t     17-Apr-15\t   3.099\r\n ...\r\n 1272817     20-Sep-17\t   2.0402\r\n ...\u003c/pre\u003e\u003cp\u003eThe complete data set will be provided to you as input.  You should assume the general trend can be described by the following law:\u003c/p\u003e\u003cpre\u003e runtime = r0 - δ [1 - exp(-t/k)]\r\n runtime = r∞ + δ exp(-t/k)\u003c/pre\u003e\u003cp\u003ewhere \u003ctt\u003er0\u003c/tt\u003e is the runtime at the start of the period in seconds, \u003ctt\u003er∞\u003c/tt\u003e is the predicted runtime (in seconds) that will be approached far in the future, \u003ctt\u003eδ = r0 - r∞\u003c/tt\u003e, and \u003ctt\u003et\u003c/tt\u003e is the time in nominal years since the start of the period, and \u003ctt\u003ek\u003c/tt\u003e is a kinetic parameter (in nominal years).\u003c/p\u003e\u003cp\u003eThe start of the period is defined by the earliest date in the series.  Compute the number of days exactly, and assume that a nominal year comprises 365.24 days.\u003c/p\u003e\u003cp\u003eYour task is to \u003ca href = \"https://au.mathworks.com/help/matlab/math/example-curve-fitting-via-optimization.html\"\u003efit the curve\u003c/a\u003e and thereby predict the runtime for various future dates.  Your output should be rounded to four decimal places.\u003c/p\u003e\u003cp\u003eMETHOD:  You \u003ci\u003emust\u003c/i\u003e use \u003ca href = \"https://au.mathworks.com/help/matlab/ref/fminsearch.html\"\u003e\u003ctt\u003efminsearch\u003c/tt\u003e\u003c/a\u003e to perform the non-linear regression, and you \u003ci\u003emust\u003c/i\u003e set the options using \u003ca href = \"https://au.mathworks.com/help/matlab/ref/optimset.html\"\u003e\u003ctt\u003eoptimset\u003c/tt\u003e\u003c/a\u003e to ensure sufficient accuracy.  The 'best' fit is defined — \u003ci\u003efor this problem, as in the common convention\u003c/i\u003e — as that which minimises the sum of the squares of the residuals.\u003c/p\u003e\u003cp\u003eEXAMPLE:\u003c/p\u003e\u003cpre\u003e % Input\r\n futureDate = '21-Nov-2023';\r\n data.solutionNumber = [1036949, ..., 1272817];\r\n data.date = ['29-Oct-2016'; ...; '20-Sep-2017'];\r\n data.runtime = [1.2630, ..., 2.0402];\r\n % Output\r\n predictedRuntime = 0.3619;  % seconds\u003c/pre\u003e","function_template":"function predictedRuntime = predictor(futureDate, data)\r\n    % Preliminaries:\r\n    ...\r\n    \r\n    \r\n    % Use fminsearch to find the parameters that minimize the objective function.\r\n    myObjectiveFun = ...\r\n    myOptions = ...\r\n    ... = fminsearch\r\n\r\n    % Report your prediction of the runtime at the specified future date.\r\n    predictedRuntime = ...\r\nend\r\n\r\n% Function that accepts a trial set of parameters and the observed data, \r\n% and returns the sum of squared errors for the model . \r\n% https://au.mathworks.com/help/matlab/math/example-curve-fitting-via-optimization.html\r\nfunction SSE = sseVal(...)\r\n    % runtime = r0 - δ [1 - exp(-t/k)]\r\n    % runtime = r∞ + δ exp(-t/k)\r\n    \r\n    ...\r\n    \r\n    SSE = ...\r\nend\r\n","test_suite":"data.solutionNumber = [1036949\t1048171\t1051202\t1078061\t1078699\t1081561\t886761\t1165117\t1202850\t1211446\t1241478\t1241530\t1329044\t1323931\t1382633\t1345204\t1281524\t1272814\t1272815\t1272823\t1272845\t1287012\t1287386\t1262442\t1262445\t1251993\t1252843\t1407137\t1412687\t1448359\t1448368\t1410187\t1465616\t1472214\t1472225\t1490596\t1490602\t1541085\t1541132\t860114\t143879\t144156\t144393\t202249\t210894\t539555\t182974\t276887\t1133109\t654812\t1272817];\r\ndata.date = ['29-Oct-2016';\t'08-Nov-2016';\t'12-Nov-2016';\t'09-Dec-2016';\t'10-Dec-2016';\t'14-Dec-2016';\t'06-May-2016';\t'18-Apr-2017';\t'02-Jun-2017';\t'13-Jun-2017';\t'28-Jul-2017';\t'28-Jul-2017';\t'06-Nov-2017';\t'01-Nov-2017';\t'16-Dec-2017';\t'15-Nov-2017';\t'05-Oct-2017';\t'20-Sep-2017';\t'20-Sep-2017';\t'20-Sep-2017';\t'20-Sep-2017';\t'15-Oct-2017';\t'15-Oct-2017';\t'05-Sep-2017';\t'05-Sep-2017';\t'16-Aug-2017';\t'17-Aug-2017';\t'06-Jan-2018';\t'10-Jan-2018';\t'24-Feb-2018';\t'24-Feb-2018';\t'08-Jan-2018';\t'18-Mar-2018';\t'27-Mar-2018';\t'27-Mar-2018';\t'13-Apr-2018';\t'13-Apr-2018';\t'26-May-2018';\t'26-May-2018';\t'31-Mar-2016';\t'02-Oct-2012';\t'03-Oct-2012';\t'04-Oct-2012';\t'08-Feb-2013';\t'01-Mar-2013';\t'03-Dec-2014';\t'29-Dec-2012';\t'09-Jul-2013';\t'03-Mar-2017';\t'17-Apr-2015';\t'20-Sep-2017'];\r\ndata.runtime = [1.2630\t0.624\t1.3326\t1.2939\t0.5995\t1.1307\t1.3505\t1.2613\t1.2737\t1.3081\t1.2774\t1.252\t1.2179\t1.4431\t1.2637\t1.1614\t1.2542\t1.9135\t1.2996\t1.2595\t1.2664\t1.1858\t1.1501\t1.2516\t1.2786\t1.9461\t1.2492\t1.3654\t1.3263\t1.1484\t1.1728\t1.6177\t1.0538\t1.0571\t1.0454\t1.3873\t1.0600\t1.1154\t1.0635\t1.4359\t4.498\t4.198\t4.230\t5.264\t4.022\t3.153\t4.740\t4.112\t2.3409\t3.099\t2.0402];\r\n\r\n%% Anti-hacking provision\r\n% ADDED 2019-06-29.  \r\n% Ensure only builtin functions will be called.  \r\n! rm -v fileread.m\r\n! rm -v assert.m\r\n\r\n%% Required methodology\r\nassessFunctionPresence({'fminsearch', 'optimset'}, 'FileName','predictor.m', 'Feedback','You must use the specified methodology')\r\n\r\n%% Anti-hardcoding test\r\n% Adapted from a comment at https://www.mathworks.com/matlabcentral/cody/problems/44343 .\r\nassert(~any(cellfun(@(x)ismember(max([0,str2num(x)]),[2012,2019:2023,3000]),regexp(fileread('predictor.m'),'[\\d\\.\\+\\-\\*\\/\\(\\) \\[\\]\\,\\;]+','match'))), 'Please don''t hard-code your ''solution''.') \r\nassert(~any(cellfun(@(x)ismember(max([0,str2num(x)]),[2012,2019:2023,3000]),regexp(fileread('predictor.m'),'\\d+','match'))), 'Please do not hard-code your ''solution''.') \r\n\r\n%% January 2019\r\nfutureDate = '22-Jan-2019';\r\npredictedRuntime_correct = round(0.935043294718475, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\nfutureDate = '23-Jan-2019';\r\npredictedRuntime_correct = round(0.934448955935569, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\nfutureDate = '24-Jan-2019';\r\npredictedRuntime_correct = round(0.933855075296061, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\n%% January 2020\r\nfutureDate = '09-Jan-2020';\r\npredictedRuntime_correct = round(0.751755426901932, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\nfutureDate = '13-Jan-2020';\r\npredictedRuntime_correct = round(0.749945312632780, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\n%% January 2021\r\nfutureDate = '06-Jan-2021';\r\npredictedRuntime_correct = round(0.608254613313523, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\nfutureDate = '11-Jan-2021';\r\npredictedRuntime_correct = round(0.606545074994730, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\n%% February 2022\r\nfutureDate = '06-Feb-2022';\r\npredictedRuntime_correct = round(0.491354117473879, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\nfutureDate = '10-Feb-2022';\r\npredictedRuntime_correct = round(0.490345992043568, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\n%% November 2023\r\nfutureDate = '06-Nov-2023';\r\npredictedRuntime_correct = round(0.364155581026111, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\nfutureDate = '21-Nov-2023';\r\npredictedRuntime_correct = round(0.361853937995679, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\nfutureDate = '25-Nov-2023';\r\npredictedRuntime_correct = round(0.361244649648014, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\nfutureDate = '27-Nov-2023';\r\npredictedRuntime_correct = round(0.360940709522436, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\n%% Let's all meet up in the year 3000\r\nfutureDate = '01-Jan-3000';\r\npredictedRuntime_correct = round(0.164021404839, 4);\r\nassert(isequal(predictor(futureDate, data), predictedRuntime_correct))\r\n\r\n%% Enforce antihacking\r\n% Assure no 'workarounds' that avoid appropriate use of optimset.\r\n% (Added 29 May 2018.)\r\nfutureDate = {'19-Dec-2019';\t'04-Oct-2020';\t'06-Nov-2020';\t'20-Nov-2020';\t'07-Dec-2020';\t'09-Dec-2020';\t'11-Dec-2020';\t'25-Feb-2021';\t'04-Mar-2021';\t'18-Apr-2021';\t'19-May-2021';\t'23-Jul-2021'};\r\npRuntime_c_unrounded = {0.761350673860113\t0.641651747331991\t0.629650497697623\t0.624650604424140\t0.618651428148657\t0.617950799242008\t0.617251250072375\t0.591452258418511\t0.589151203003048\t0.574651625923890\t0.564951737257372\t0.545350739105932};\r\nfor j = 1 : length(futureDate)\r\n    assert(isequal(predictor(futureDate{j}, data), round(pRuntime_c_unrounded{j}, 4)))\r\nend;\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":64439,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":2,"test_suite_updated_at":"2019-06-29T12:58:19.000Z","rescore_all_solutions":true,"group_id":1,"created_at":"2018-05-27T08:32:09.000Z","updated_at":"2019-06-29T12:58:19.000Z","published_at":"2018-05-27T12:35:16.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eIt has been\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://en.wikipedia.org/wiki/Moore%27s_law#History\\\"\u003e\u003cw:r\u003e\u003cw:t\u003epredicted\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e that the performance of integrated circuits would\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003edouble\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e every 18 months. That suggests the time to perform a given computation should\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ehalve\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e roughly every 18 months.\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\u003eWhat about on Cody? Observational data is available from the final test case of\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://www.mathworks.com/matlabcentral/cody/problems/963-we-love-vectorized-solutions-problem-1-remove-the-row-average\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eProblem 963\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e to help us quantify the improvement in performance! And thereby even make predictions for future computations.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ Solution    Date     Runtime [s]\\n ...\\n 144393       04-Oct-12     4.230\\n ...\\n 654812       17-Apr-15     3.099\\n ...\\n 1272817     20-Sep-17     2.0402\\n ...]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe complete data set will be provided to you as input. You should assume the general trend can be described by the following law:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ runtime = r0 - δ [1 - exp(-t/k)]\\n runtime = r∞ + δ exp(-t/k)]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003ewhere\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003er0\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e is the runtime at the start of the period in seconds,\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003er∞\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e is the predicted runtime (in seconds) that will be approached far in the future,\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eδ = r0 - r∞\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, and\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003et\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e is the time in nominal years since the start of the period, and\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ek\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e is a kinetic parameter (in nominal years).\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe start of the period is defined by the earliest date in the series. Compute the number of days exactly, and assume that a nominal year comprises 365.24 days.\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\u003eYour task is to\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://au.mathworks.com/help/matlab/math/example-curve-fitting-via-optimization.html\\\"\u003e\u003cw:r\u003e\u003cw:t\u003efit the curve\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e and thereby predict the runtime for various future dates. Your output should be rounded to four decimal places.\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\u003eMETHOD: You\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003emust\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e use\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://au.mathworks.com/help/matlab/ref/fminsearch.html\\\"\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003efminsearch\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e to perform the non-linear regression, and you\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003emust\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e set the options using\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://au.mathworks.com/help/matlab/ref/optimset.html\\\"\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eoptimset\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e to ensure sufficient accuracy. The 'best' fit is defined —\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003efor this problem, as in the common convention\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e — as that which minimises the sum of the squares of the residuals.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eEXAMPLE:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ % Input\\n futureDate = '21-Nov-2023';\\n data.solutionNumber = [1036949, ..., 1272817];\\n data.date = ['29-Oct-2016'; ...; '20-Sep-2017'];\\n data.runtime = [1.2630, ..., 2.0402];\\n % Output\\n predictedRuntime = 0.3619;  % seconds]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":1022,"title":"Knot Count - Speed","description":"\r\nThe Matlab Semi-Annual Contest Grand Finale is Knots.\r\nThis Challenge is to Speed up the Scoring routine that counts the number of Knots.\r\nDetails and examples are at Knots Rules.\r\nInput: [adjacency xy]\r\nadjacency is an NxN matrix of topologically adjacent(connected) points\r\n\r\nxy is an Nx2 matrix giving the X and Y coordinates for the N points\r\nOutput: nKnots; Number of Knots\r\nScoring: Speed; Based on cumulative time of Knots [ 3 6 15 18 24 30 37 42 46 49]; Nominal Time 9.7 sec\r\nBaseline Knot Contest Knot scoring for all 50 test cases is 63 seconds on Cody.","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: 329.817px; display: block; min-width: 0px; padding-block-start: 0px; padding-top: 0px; perspective-origin: 407px 164.917px; transform-origin: 407px 164.917px; vertical-align: baseline; \"\u003e\u003cdiv style=\"block-size: 37.5167px; 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 18.7667px; text-align: center; transform-origin: 384px 18.7667px; white-space: pre-wrap; margin-left: 4px; margin-top: 2px; margin-bottom: 9px; margin-right: 10px; \"\u003e\u003cimg class=\"imageNode\" style=\"vertical-align: baseline\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAADAFBMVEV4eHiTk5P29vaBgYGcnJzAwMC3t7eKiorS0tLt7e3b29vk5OTJycn///9vb28AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD61b95AAAAyklEQVR42q2SSQ6FIAxAWzQxkcj976lEE5R+hojQOmw+Cxa8RwcoGnhf6oNDD0AvGL8j/E2wC+JiXwSaAKbbatGkLjBrX13szynmtPXnKc2eCRiMGQtXxrq2hmZRuuXx6SVdPlPpopeC387sFMMIwdsyAMFAEcHuptW5oIaKYgjHBBoZ512snMeJ8g7o0DmA5jwKXRdqy9W6gfMzhd7iMOySlxq0qn/z4leR43HNQ8WrLtYi1Dz+pnjsmt/8ZsulwLgQOOeC4EyQHH5z1GUZiLNTtwAAAABJRU5ErkJggg==\" data-image-state=\"image-loaded\"\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.433px 8.05px; transform-origin: 154.433px 8.05px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThe Matlab Semi-Annual Contest Grand Finale is \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://web.archive.org/web/20150303060336/http://www.mathworks.com/matlabcentral/contest/contests/38/rules\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eKnots\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 1.95px 8.05px; transform-origin: 1.95px 8.05px; 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: 257.117px 8.05px; transform-origin: 257.117px 8.05px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eThis Challenge is to Speed up the Scoring routine that counts the number of Knots.\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: 88.7px 8.05px; transform-origin: 88.7px 8.05px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eDetails and examples are at \u003c/span\u003e\u003c/span\u003e\u003ca target='_blank' href = \"https://web.archive.org/web/20150303060336/http://www.mathworks.com/matlabcentral/contest/contests/38/rules\"\u003e\u003cspan style=\"\"\u003e\u003cspan style=\"\"\u003eKnots Rules\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 1.95px 8.05px; transform-origin: 1.95px 8.05px; 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: 19.4333px 8.05px; transform-origin: 19.4333px 8.05px; unicode-bidi: normal; \"\u003e\u003cspan style=\"font-weight: 700; \"\u003eInput:\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 46.2833px 8.05px; transform-origin: 46.2833px 8.05px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e [adjacency xy]\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cul style=\"block-size: 61.3px; counter-reset: list-item 0; font-family: Helvetica, Arial, sans-serif; list-style-type: square; margin-block-end: 20px; margin-block-start: 10px; margin-bottom: 20px; margin-top: 10px; perspective-origin: 391px 30.65px; transform-origin: 391px 30.65px; margin-top: 10px; margin-bottom: 20px; \"\u003e\u003cli style=\"block-size: 20.4333px; counter-reset: none; display: list-item; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-start: 56px; margin-left: 56px; margin-top: 0px; perspective-origin: 363px 10.2167px; text-align: left; transform-origin: 363px 10.2167px; white-space: pre-wrap; margin-left: 56px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-inline-start: 0px; margin-left: 0px; perspective-origin: 219.017px 8.05px; transform-origin: 219.017px 8.05px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eadjacency is an NxN matrix of topologically adjacent(connected) points\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style=\"block-size: 20.4333px; counter-reset: none; display: list-item; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-start: 56px; margin-left: 56px; margin-top: 0px; perspective-origin: 363px 10.2167px; text-align: left; transform-origin: 363px 10.2167px; white-space: pre-wrap; margin-left: 56px; \"\u003e\u003c/li\u003e\u003cli style=\"block-size: 20.4333px; counter-reset: none; display: list-item; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-start: 56px; margin-left: 56px; margin-top: 0px; perspective-origin: 363px 10.2167px; text-align: left; transform-origin: 363px 10.2167px; white-space: pre-wrap; margin-left: 56px; \"\u003e\u003cspan style=\"block-size: auto; display: inline; margin-inline-start: 0px; margin-left: 0px; perspective-origin: 205.367px 8.05px; transform-origin: 205.367px 8.05px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003exy is an Nx2 matrix giving the X and Y coordinates for the N points\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\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: 25.2667px 8.05px; transform-origin: 25.2667px 8.05px; unicode-bidi: normal; \"\u003e\u003cspan style=\"font-weight: 700; \"\u003eOutput:\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 80.1167px 8.05px; transform-origin: 80.1167px 8.05px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e nKnots; Number of Knots\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: 28.3833px 8.05px; transform-origin: 28.3833px 8.05px; unicode-bidi: normal; \"\u003e\u003cspan style=\"font-weight: 700; \"\u003eScoring:\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"block-size: auto; display: inline; margin-block-end: 0px; margin-block-start: 0px; margin-bottom: 0px; margin-inline-end: 0px; margin-inline-start: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; perspective-origin: 300.4px 8.05px; transform-origin: 300.4px 8.05px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003e Speed; Based on cumulative time of Knots [ 3 6 15 18 24 30 37 42 46 49]; Nominal Time 9.7 sec\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: 246.483px 8.05px; transform-origin: 246.483px 8.05px; unicode-bidi: normal; \"\u003e\u003cspan style=\"\"\u003eBaseline Knot Contest Knot scoring for all 50 test cases is 63 seconds on Cody.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e","function_template":"function nKnots = Knots(adjacency,xy)\r\n nKnots=0;\r\nend","test_suite":"%%\r\nfeval(@assignin,'caller','score',0);\r\n%%\r\n%urlwrite('http://tinyurl.com/matlab-Knots','Knots_sample.mat')\r\nurlwrite('http://rmatlabtest.appspot.com/testsuite_sample_knots.mat','Knots_sample.mat');\r\n%%\r\neKnots=[94 50 1719 11390 18 3446 7402 669 2558 13557 5376 25025 122 11566 2560 15726 7569 11728 35178 1872 972 29917 7433 2013 3 3081 1381 1424 1102 3534 2849 14520 16892 16553 18887 245 5729 3256 400 24811 290 15081 5679 12310 262 16317 1614 249 8782 192];\r\n\r\ncases=4;\r\nnKnots=zeros(cases,1);\r\nKnotTime=zeros(cases,1);\r\n\r\nrclock=clock;\r\nrng(floor(rclock(6)*1000),'twister'); % Seed the random function\r\ntKnots=randi(50,cases,1); % anti-code answer\r\n\r\nload Knots_sample.mat\r\ntestsuite=suite; % update\r\n\r\nfor n=1:cases\r\n a=testsuite(tKnots(n)).a;\r\n xy=testsuite(tKnots(n)).xyIn;\r\n time0 = cputime;\r\n  nKnots(n)=Knots(a,xy);\r\n KnotTime(n) = cputime - time0;\r\nend\r\n\r\nfor n=1:cases\r\n assert(isequal(nKnots(n),eKnots(tKnots(n))),sprintf('Knot %i Was %i Expected %i',tKnots(n),nKnots(n),eKnots(tKnots(n))));\r\nend\r\n\r\n% Success: Report Times\r\nP=[tKnots nKnots KnotTime]';\r\nfprintf('Knot %i  Knots %i  Time %10.6f\\n',P); \r\n\r\n%%\r\n% Run for Time Score uses Knots [3 6 15 18 24 30 37 42 46 49]\r\n\r\neKnots=[94 50 1719 11390 18 3446 7402 669 2558 13557 5376 25025 122 11566 2560 15726 7569 11728 35178 1872 972 29917 7433 2013 3 3081 1381 1424 1102 3534 2849 14520 16892 16553 18887 245 5729 3256 400 24811 290 15081 5679 12310 262 16317 1614 249 8782 192];\r\n\r\ncases=10;\r\nnKnots=zeros(cases,1);\r\nKnotTime=zeros(cases,1);\r\n\r\nrclock=clock;\r\nrng(floor(rclock(6)*1000),'twister'); % Seed the random function\r\n%tKnots=randi(50,cases,1);\r\n\r\n\r\nload Knots_sample.mat\r\ntestsuite=suite; % update\r\n\r\ntKnots=[3 6 15 18 24 30 37 42 46 49]';\r\n\r\n\r\nfor n=1:cases\r\n a=testsuite(tKnots(n)).a;\r\n xy=testsuite(tKnots(n)).xyIn;\r\n time0 = cputime;\r\n  nKnots(n)=Knots(a,xy);\r\n KnotTime(n) = cputime - time0;\r\nend\r\n\r\nfor n=1:cases\r\n assert(isequal(nKnots(n),eKnots(tKnots(n))),sprintf('Knot %i Was %i Expected %i',tKnots(n),nKnots(n),eKnots(tKnots(n))));\r\nend\r\n\r\n% Success: Report Times\r\nP=[tKnots nKnots KnotTime]';\r\nfprintf('Knot %i  Knots %i  Time %10.6f\\n',P); \r\n\r\n% Score in msec\r\nfeval(@assignin,'caller','score',min(10000,floor(1000*sum(KnotTime))));","published":true,"deleted":false,"likes_count":0,"comments_count":2,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":2,"test_suite_updated_at":"2013-11-15T22:18:08.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2012-11-02T12:41:38.000Z","updated_at":"2021-07-24T16:42:30.000Z","published_at":"2012-11-02T14:35:08.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"center\\\"/\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=\\\"verticalAlign\\\" w:val=\\\"baseline\\\"/\u003e\u003cw:attr w:name=\\\"altText\\\" w:val=\\\"\\\"/\u003e\u003cw:attr w:name=\\\"relationshipId\\\" w:val=\\\"rId1\\\"/\u003e\u003c/w:customXmlPr\u003e\u003c/w:customXml\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe Matlab Semi-Annual Contest Grand Finale is \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://web.archive.org/web/20150303060336/http://www.mathworks.com/matlabcentral/contest/contests/38/rules\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eKnots\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis Challenge is to Speed up the Scoring routine that counts the number of Knots.\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\u003eDetails and examples are at \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"https://web.archive.org/web/20150303060336/http://www.mathworks.com/matlabcentral/contest/contests/38/rules\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eKnots Rules\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e [adjacency xy]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eadjacency is an NxN matrix of topologically adjacent(connected) points\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003exy is an Nx2 matrix giving the X and Y coordinates for the N points\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eOutput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e nKnots; Number of Knots\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003cw:jc w:val=\\\"left\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eScoring:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Speed; Based on cumulative time of Knots [ 3 6 15 18 24 30 37 42 46 49]; Nominal Time 9.7 sec\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\u003eBaseline Knot Contest Knot scoring for all 50 test cases is 63 seconds on Cody.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\",\"relationship\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"target\":\"/media/image1.png\",\"relationshipId\":\"rId1\"}]},{\"partUri\":\"/media/image1.png\",\"contentType\":\"image/png\",\"content\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAADAFBMVEV4eHiTk5P29vaBgYGcnJzAwMC3t7eKiorS0tLt7e3b29vk5OTJycn///9vb28AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD61b95AAAAyklEQVR42q2SSQ6FIAxAWzQxkcj976lEE5R+hojQOmw+Cxa8RwcoGnhf6oNDD0AvGL8j/E2wC+JiXwSaAKbbatGkLjBrX13szynmtPXnKc2eCRiMGQtXxrq2hmZRuuXx6SVdPlPpopeC387sFMMIwdsyAMFAEcHuptW5oIaKYgjHBBoZ512snMeJ8g7o0DmA5jwKXRdqy9W6gfMzhd7iMOySlxq0qn/z4leR43HNQ8WrLtYi1Dz+pnjsmt/8ZsulwLgQOOeC4EyQHH5z1GUZiLNTtwAAAABJRU5ErkJggg==\",\"relationship\":null}],\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"target\":\"/matlab/document.xml\",\"relationshipId\":\"rId1\"}]}"},{"id":3074,"title":"Compute the cokurtosis of a given portfolio.","description":"As input data, you are given a nObs-by-nAssets matrix _portRet_ of return series for assets in a portfolio along with an nAssets-by-1 vector _portWeights_ of portfolio weights. Example: \r\n\r\n \u003e\u003e nObs = 504; % Number of observations\r\n\r\n \u003e\u003e nAssets = 5; % Number of assets in the portfolio\r\n\r\n \u003e\u003e portRet = randn(nObs, nAssets); % Sample portfolio return series\r\n\r\n \u003e\u003e portWeights = rand(nAssets, 1); \r\n\r\n \u003e\u003e portWeights = portWeights/sum(portWeights); % Portfolio weights are \u003e=0 and sum to 1.\r\n\r\nThe task is to compute the *portfolio cokurtosis* , which is a scalar statistic associated with the portfolio. A full description of this statistic, along with sample MATLAB code for computing it, can be found here:\r\n\r\nhttp://www.quantatrisk.com/2013/01/20/coskewness-and-cokurtosis/\r\n\r\nWrite a function that accepts _portRet_ and _portWeights_ as input arguments and returns the scalar statistic _portCokurt_ as its output. You can use the code at the website above as a starting point, but try to simplify and shorten it in the spirit of Cody.\r\n\r\n\r\n\r\n","description_html":"\u003cp\u003eAs input data, you are given a nObs-by-nAssets matrix \u003ci\u003eportRet\u003c/i\u003e of return series for assets in a portfolio along with an nAssets-by-1 vector \u003ci\u003eportWeights\u003c/i\u003e of portfolio weights. Example:\u003c/p\u003e\u003cpre\u003e \u0026gt;\u0026gt; nObs = 504; % Number of observations\u003c/pre\u003e\u003cpre\u003e \u0026gt;\u0026gt; nAssets = 5; % Number of assets in the portfolio\u003c/pre\u003e\u003cpre\u003e \u0026gt;\u0026gt; portRet = randn(nObs, nAssets); % Sample portfolio return series\u003c/pre\u003e\u003cpre\u003e \u0026gt;\u0026gt; portWeights = rand(nAssets, 1); \u003c/pre\u003e\u003cpre\u003e \u0026gt;\u0026gt; portWeights = portWeights/sum(portWeights); % Portfolio weights are \u0026gt;=0 and sum to 1.\u003c/pre\u003e\u003cp\u003eThe task is to compute the \u003cb\u003eportfolio cokurtosis\u003c/b\u003e , which is a scalar statistic associated with the portfolio. A full description of this statistic, along with sample MATLAB code for computing it, can be found here:\u003c/p\u003e\u003cp\u003e\u003ca href = \"http://www.quantatrisk.com/2013/01/20/coskewness-and-cokurtosis/\"\u003ehttp://www.quantatrisk.com/2013/01/20/coskewness-and-cokurtosis/\u003c/a\u003e\u003c/p\u003e\u003cp\u003eWrite a function that accepts \u003ci\u003eportRet\u003c/i\u003e and \u003ci\u003eportWeights\u003c/i\u003e as input arguments and returns the scalar statistic \u003ci\u003eportCokurt\u003c/i\u003e as its output. You can use the code at the website above as a starting point, but try to simplify and shorten it in the spirit of Cody.\u003c/p\u003e","function_template":"function portCokurt = computePortCokurt(portRet, portWeights)\r\n\r\n\r\nend","test_suite":"%%\r\nrng('default')\r\nR = randn(504, 5);\r\nw = ones(5, 1)/5;\r\nassert(abs(computePortCokurt(R, w)-0.119749008958925)\u003c1e-3)\r\n\r\n%%\r\nrng('default')\r\nR = randn(252, 15);\r\nw = ones(15, 1)/15;\r\nassert(abs(computePortCokurt(R, w)-0.013012357540290)\u003c1e-3)\r\n\r\n%% \r\nrng('default')\r\nR = randn(100, 1);\r\nw = 1;\r\nassert(abs(computePortCokurt(R, w)-6.280759230562035)\u003c1e-3)\r\n\r\n%%\r\nrng('default')\r\nR = randn(5, 10);\r\nw = [0.1*ones(5, 1); 0.5; zeros(4, 1)];\r\nassert(abs(computePortCokurt(R, w)-0.169198885214440)\u003c1e-3)","published":true,"deleted":false,"likes_count":0,"comments_count":2,"created_by":2328,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":5,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2015-03-10T11:04:22.000Z","updated_at":"2015-03-11T18:00:35.000Z","published_at":"2015-03-10T11:25:35.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eAs input data, you are given a nObs-by-nAssets matrix\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eportRet\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e of return series for assets in a portfolio along with an nAssets-by-1 vector\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eportWeights\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e of portfolio weights. Example:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ \u003e\u003e nObs = 504; % Number of observations\\n\\n \u003e\u003e nAssets = 5; % Number of assets in the portfolio\\n\\n \u003e\u003e portRet = randn(nObs, nAssets); % Sample portfolio return series\\n\\n \u003e\u003e portWeights = rand(nAssets, 1); \\n\\n \u003e\u003e portWeights = portWeights/sum(portWeights); % Portfolio weights are \u003e=0 and sum to 1.]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe task is to compute the\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eportfolio cokurtosis\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e , which is a scalar statistic associated with the portfolio. A full description of this statistic, along with sample MATLAB code for computing it, can be found here:\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=\\\"http://www.quantatrisk.com/2013/01/20/coskewness-and-cokurtosis/\\\"\u003e\u003cw:r\u003e\u003cw:t\u003ehttp://www.quantatrisk.com/2013/01/20/coskewness-and-cokurtosis/\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eWrite a function that accepts\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eportRet\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e and\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eportWeights\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e as input arguments and returns the scalar statistic\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eportCokurt\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e as its output. You can use the code at the website above as a starting point, but try to simplify and shorten it in the spirit of Cody.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":1440,"title":"USC Spring 2013 ACM: Snow Cones","description":"This Challenge is to solve the \u003chttp://contest.usc.edu/index.php/Spring13/Home USC Spring 2013 ACM Contest\u003e Problem F, Snow Cones.\r\n\r\nSummary of Challenge is to Swap the Snow Cones in the minimal number of swaps so the children all have their selected flavor. There are only two flavors, X and O.\r\nInput is the string of distributed Cone flavors and a string of desired Cone flavors. Adjacent children may exchange cones but in any one round a child may only swap with one other child. \r\n\r\nDetermine minimum number of Swap rounds to convert the Distributed to the Desired Cone flavor sequence.\r\n\r\n\r\n*Input:* From XXO to  OXX   *Output:* 2\r\n\r\n*Input:* From OXOX to XOXO  *Output:* 1\r\n\r\nOnly two competitors solved this challenge.\r\n\r\nA little complex requiring a Matlab 3-Liner solution versus \u003chttp://contest.usc.edu/index.php/Spring13/Home?action=download\u0026upname=cones.zhengcao.cpp.txt Cao's C solution\u003e ","description_html":"\u003cp\u003eThis Challenge is to solve the \u003ca href = \"http://contest.usc.edu/index.php/Spring13/Home\"\u003eUSC Spring 2013 ACM Contest\u003c/a\u003e Problem F, Snow Cones.\u003c/p\u003e\u003cp\u003eSummary of Challenge is to Swap the Snow Cones in the minimal number of swaps so the children all have their selected flavor. There are only two flavors, X and O.\r\nInput is the string of distributed Cone flavors and a string of desired Cone flavors. Adjacent children may exchange cones but in any one round a child may only swap with one other child.\u003c/p\u003e\u003cp\u003eDetermine minimum number of Swap rounds to convert the Distributed to the Desired Cone flavor sequence.\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e From XXO to  OXX   \u003cb\u003eOutput:\u003c/b\u003e 2\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e From OXOX to XOXO  \u003cb\u003eOutput:\u003c/b\u003e 1\u003c/p\u003e\u003cp\u003eOnly two competitors solved this challenge.\u003c/p\u003e\u003cp\u003eA little complex requiring a Matlab 3-Liner solution versus \u003ca href = \"http://contest.usc.edu/index.php/Spring13/Home?action=download\u0026upname=cones.zhengcao.cpp.txt\"\u003eCao's C solution\u003c/a\u003e\u003c/p\u003e","function_template":"function swaps=snowcones(v1,v2)\r\n% v1 is a string of Xs and Os (not zeros)\r\n% v2 is string of desired sequence\r\n swaps=0;\r\nend","test_suite":"i='X'; %1\r\nd='X';\r\ne=0;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='XO'; %2\r\nd='XO';\r\ne=0;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='XO'; %3\r\nd='OX';\r\ne=1;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='XX'; %4\r\nd='XX';\r\ne=0;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='XXO'; %5\r\nd='XOX';\r\ne=1;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='XXO'; %6\r\nd='OXX';\r\ne=2;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='XOX'; %7\r\nd='OXX';\r\ne=1;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='XXXXOOOO'; %8\r\nd='OOOOXXXX';\r\ne=7;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='XOXOXOXO'; %9\r\nd='OXOXOXOX';\r\ne=1;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='OXXOXXO'; %10\r\nd='XXOXXOO';\r\ne=2;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='XXOOOOXX'; %11\r\nd='OOXXXXOO';\r\ne=3;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='OXXOXOXOXOXOX'; %12\r\nd='XXOOXXOXXOXOO';\r\ne=2;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='XXXOOXOXOXXXO'; %13\r\nd='OXOOXXOXXOXXX';\r\ne=4;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='OXOOXXOXXOXXX'; %14\r\nd='XXXOOXOXOXXXO';\r\ne=4;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='OXOOOOOXOXOXXXXXOOXX'; %15\r\nd='OXOOXXOXXOOXOXOOXOXX';\r\ne=5;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='XXOXXXXOXXOXXXXXXXXX'; %16\r\nd='XXXXXXXOOXXXXXOXXXXX';\r\ne=5;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='OXOXOOXXOOXOXXOXOXOO'; %17\r\nd='XOXOXXOXOXOOOXOXOOOX';\r\ne=3;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='OXXOOXXXOOXXXXXXOXXX'; %18\r\nd='OXOOXOXXXXXXXXXXOOXX';\r\ne=7;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='XXOXXXXXXXOXXXOOXXOO'; %19\r\nd='XXOXXOXOXXXXOOXXXXXO';\r\ne=7;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\n%20\r\ni='XOOXXXXXOXXOXOXXXOOOXXOOXXOOOXXXXOXXXXOOOOXOXXXXXOXOOOOXXOOOXOXOOXOXOOOOOOXOOOXOOXXXXXXXOXXOXXXOXXOXOOOOXOOXXXXOXXXXXXXXOOOOOXOXOXXXOXXOOOXOXXOOOOOXOXXXOXXOXOXOOOOXXOOXXOXOOOOXOOXOOXXOOXXOOOXOXOXXXXOOXXXXXOOXOOXOXXXXXXOOOOOXOXXXOOOXOOOOOOXXOXOOXXOOOOXXXOXOXOXXXOXOOXXOXXOXOXOXXOXOXOOOOXXOXXOXXXXOXOXXOXOOOOOXOXXOOXOOXXXOXOXXOXXOXXXXXOXXOOOOOOXOOOOXOOOOXOXOXXOXOXXXOXOOOOXXOXXXOXXXOXXOOXXXOOXOXXOOXOOXOXOOOOXOOOOXXOXXOOXXXOXXOOXXOXOXXXOXOOOXXOXOOXXOOXOOOXXOOXXOXOXOXOOOOOOXXXXOXXOXOOXOXXOOOOXXXOOOOOOOOXOOOOOOXXOXXOXOOOOOOXOOOOOXOOXXOOXXOXXXOXOXOXXXOOOOOOXXOOOOXOXOXOOXXOOXOXXXOXOOXXOXOXOOXOXOXOXOXOOOXOOXXXOOOXXXOXOOOXOXXOXXOXXOXXXXOXOOXXOXOXXOOOXXXXXOXXXXOOOOOOOOXXOOXOOOXXXXXOOOXOOXOOOOOXXOOXXOOXXOXXXOXOXOXOOOXOXXOXXOOOOOXOOOOXXXOOXXXOOXOXOXXXXXOOXXOXOOOXOOOXXXOXXOXOXXOXOXOOXOOXXXOOXOOXOXOOXOOOOOOOXXOOOOOOXOOOOOOXOXXXXOOXOXOOXXXOXOXXOXOOOXOOOOOOXOOXOXOOXXOOXOOXXOXOXOOOOOOOOXOXXOXXXXOXXXOOXXOXOOXXXOXOXOOOOXXOXXOXOXXOXOXOOXXXOXXXOOXOOOXOOOXXOXXOOXXXXOXOOXOXOXXOOXXOXXXXXXXXXXOXXOOOOXXXOOXXOOXOOX';\r\nd='OXXXXOOOOXXOOOOXOXXOXOXXXOXXOOOXXOOOXXOXOOXXXOOOOOXOOXOOXXOOXOOOXXOXOOXXXOXOXOXOOOOOOOXOXXXOOXOOXOXXOXXXOXXXXOXXXOOXXXXOXXXOOXOXXXOOXOXXOXXOXOOOXXOOXXXOOXXXXXXOOXXXOXOXXOOOOOXOXOOXOOOOXXXOOOXXXXXOOXOXXXOOOOOXOOOOXXXOOOXXOOOOOOOXOOXXOOOOXOXXXXXOOXOXOXOXOOOXOXOOXOOXOOXXXOOXXXXOOOXXOXXOOXOOOOXOOOXOXOOXOXOXOXXOXXOOOOOOOXOXXOXXOOXOXOXOXXOXXOOOXOOOOOOOOOXOOXXOXOXXOOOOOOXOXOOOOOXXOXOXOXXOXOXXXOOOXXOOXXOXXOXOXXOXXXOOOOOXOOOOOXXXXXOXXOXOOXXOXXXXXOOOOOXOXOXOOXXOXOOXXOXOXXOOXOOXOXOXXOXOOOXXXOXXOXXOOXXXXXXOXOXOXOXXXOXXXOOOOOXXXXOXXXOXOXOOXOXOOXOOOXOOOOXOOOXXOXXXXOXXXXOOOOOXOOOOOOXXOOXOOXXXOXOXOXOXOXOOOOOXOOXXXXOOXOXXOXOOXOOXOXXXXOOOOXXOOXOXOOXOOXOOOOXXXOOOOOOOOXOOXXOOXXOOOXOOXXXXXXOOOOXOOOOXXOXXXXXXOXXXOXOXXXOXXXOXOOOXXOOXOOOOXOOOXOXOXOOOXXXOXOOXOXOOOXXXOOOXXXOXXOOOOOOXOXXOXXOOXXOOXOXOOOXXXOOOOOXXOOXXOXOXXXOXXOXOOXXOXOOOXXXOXXOOXOXXXOXXOXXOXXOOXXXXXOXXOXOOOOOXOXXOOOXOXOOOOXXXXXOOXOOXXOXXXXOXOOXXOXXXOOXXOXOXXOOXOXOOOOXXXXXXXOXOXXOXXXXXOOOOXOOXOXOXOOOXXOXOXOOOOXOXOOOXXOOOXXXOXXOXOXXXXXXOXOXOOOOXOOXX';\r\ne=47;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\n%21\r\ni='XOXXOXXXOXOOXXOOOXXXOOXXOOOXXOOXXOOXXOXOXXOOXOXXXOOOXOXXXXOOOXXOOXOXOXXOOOOXXOOOOXOXXOXOXOXOXXOXXXOXXXOOXOOOXXXOXOXXOOOOOXOXXOXXXXXOXOXXXXXOXXOOXXOXXXOOOOXOOOOOOXXXXXXXXOXXXOOXXOOOXXXXXOOXXXOXXOOXXXXXOXOXOOXOXOOXOOOOXOOXXOXXOOXXOOXXOXXXXXXOOXOOXOXOOOXXOOXXOOOOOOXXXXOOXOXXOXOOXXOOXXXOXXXOOOXXOOXOXXXOOXXOOOOOOXOXXXOXOOOXOOXOOXOXOXXOXOOXXOOXXOXXXOXOOXOXXOOOXXXXOXXOOXOOXXXOXXXXXOXOOOXOOOXXOXOXXXXOOOXXXXOXOOXOXOOXOXOXXXOXXXXXXOXOOXOOXOOXXXOXOOOOXXXXXOXXXXOXOXXOOOXOOOOOOOOXXXOXXOOXXXXOXXOOXOXXXOOOXOOXOXXXOXOXXXXXXXOOOXOOXOXXXXOXXOOOOOXOOXOXOOXXXOXXOXXOXXXXXOOXOOOOOXOOOXXOXOXXOOOOXXOXXXXOOOOXOOXOXOOOOXXXOXXXXXXXOXOOXOXOOXOOXOOXXXXOXOOOXXXOXXXXOOOOOOXXOXOXXOXOXXXXOXXOXXXOXOOXXOXXXXOXXXOXOOOXOOOXXOXOXOOOXXOOOOOOXOXOXOXXXXOXOOOXXOOXOOXXXOXXOXXXOXOXXOOOXXXOOXOOXXOOOOOOOOOXXOOXOXXOOOXOXOXOXXXOXXXOOOXOXOOXOOXOXXXOOOOOXOOOXXXOXOXOXOOOOOXXOXXXXXOXXOXXXXXXXOOOOOXXXOXXOOXOXOXXOXOXOOXOOXXXOOXXXXOOOOXXOOOOOOXOOOXXOOXOXOOOOOOXXXOXXOXXOOXXOXXXXXOOOOXOXOOXOOXXOOXXXOXXXXXOXOXOXOOOOOXXOXXXOOOOOOXXXOXOXXOOXXOO';\r\nd='XXXXOXOXOOXXXOOOXXXOXXXOXXXXXOOOXOOOXXOOOOXOOOOOOOOOXXXOOXOOXXXXOXXOXOXXXOXOXOXOOXOOOXXOXXOXOXOXXXXOOOOXXOXXXOOOXOXXXOXOOOOXOXOOOXOOOOXXXOOOOXOOOOXOOXOXXOXXOOXXOXOXXXOOXOXOOOOXOOXXXOXOOOOOOXOXOXXXXOOXXXOXXOXOXXOXOOOXOXXOOXXOXXOXXOXXXXOOOXXXXXOOOOXOXXXXOOOOOXOOOXOOXXXOOOOOOOOOOOXOOOOOOOXOXXOXOOXOOXXXOXXOXXOOOOOXOOOXXOXXXOXOOXOOOOOOOXXOXXOXOXOOXXXOOOXOOXXOOXXXXXOOOOOXXOOOOOXXOXXOXXXXOXXXXXOXXXXOOXXXOXXXXXOXOOXOOOOXXXOOOOXXXOXOOOXOXOXOXOOXOXXXXXOXXXOXOOXOXOXXXXOXOOXOOOXXOOXXOXXXXXXXOXXXXXXXOOXXXXXXOXXOXXXOOXOOOOXXOOOOXOXXXXXOOOXOXXOOXOXOXXXXOOXOOXOOOXXOOOOOXOOXOOXXXXOOXXXOOOXOOXOXXXOXOOXXXXOXXXOXOXXOXXXXOXXXXOOOXXXOOXXXXOOXXOXOOOOXXOXXXXOOXOXXXXXOOXXXXOOXXXXXOXXXOXXOXOOXOXXXOXOXXOOXOXXXOXOOOOXXOXOOXXOOOXOXXOXXOOXXXOOXOOOOXOOOXXOXOXOXOXOXOOXXOOXXXXXXXOOOOOXXXXOOXOXXXXXOXOXOXXXOOXOOXXXXOOXXOXXOXXXXOOXOXXOOXXXXOOXOOXOOXXXOXOOOXOOXOXXXXXOOOOXOOOXOOXOXXOOOXOXOXOOXOXXXOXOOXXXXXXXXXOOXOOXOOOXXOXXOOOXXXOXXOXXOOOXXOXOXOXOXXXOOXOOXXOOXXOOXOXOOOXXXOXOOXOXXOXOOXXOOOOXOXXOXOOOXXOOXOOOOXXXOOXXOXOXOOXOX';\r\ne=60;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\n%22\r\ni='XXXXOOOXXOXXOXXOOXOXXOXOOOXOXOOXXXOOOOOXXOOXXOXOOOXXOOOOXOOOOXXXXOXOOOOXOXXOOOOXOOXOXXXXOXOXXOXOOOOXXXOXXOOOOXOOXOOXXOOOOOXOXOOXXXXXOXXXOXXXOOXOOOOXOXXOOOXXXXOOXOOOOOXXOXOXOOXOOOXOXOXXXXXOOOXXXOXOOXXOOXXXXXOXXXXOOXOXXXXOXOXXOOOOOXOXXXXXXOXXOOOXOOXXXOOOXXOOXOOXXOOOOXOXOOXOOXXXOXXXXXOOXOXOXXXXXXXXOOXOXXOOOXOXOOXXOOOOXOOOOOXOOXXOOXOOXXXOXXOOXXOXOXOXOXXOXXOXXOOOXXOOOXOXOOOOXOOOOXOXXXOXOOOOXXXXXXXXOOXXOOOXXOOXXXOOXXXXXOXXOXOXXXOOOXOOXXOXXOXOXXOXXOOOXOXXOOOXOXXXOXXXOOXXOXXXXXXOOXXXXXOOOOXOXOXOXOOOXOOOXXXOXOOXXXOOXXXOOOOOXXOXXOXXOOXOXXXOOOXXXOXXXOOOXXXXXXXOOOXOOOXXXXXXOXXOXOXXOOOXXOOXOOOXOXOOOXOXXOXXOXOOXOOXOOOXOOOOXOXOXXOOOXOXOXOXXXOOOXOOOXOOXXXOOXOXOXXOOXXXOOOOOOXXXXXXXOOOXXOXOXXOOOXOXOXXOOOOOOXXXXXXOOXOOXXXXOOOOOOOXOOOOXXXXOXOXOOXOXOOOOXOXXXOOOOXXOXOXOXOOXXOOOOOOXXOOOOOXXXXXXOOXOOOOOOXXXOOXXOXXOXXOOOOOXOXOXXOXXOXOXOOXXXOOOOOXOOXXXOXOXOOOXXOXOOOOOXXOXOOOXOXXOOXOXXXOOXXOXXXXXOXOOOXXOXXOOOOOXXXOXXOOOXOOOXOOXOOXXOXXXOXXXOOXXXXOOXXXOOXXXXOXXXXOXXXOOXXOXOOXXOOXOXOXXOXXOXOOXOOOXOXXOOOOOOOXOOOOXOX';\r\nd='OXOXOXXOXXXXOOXOOXOOXXOXXOOXOXXXXXOOOXXOXOOXOXXOXXOXXOOXXOXXOXOOOXOOOOOOXXOOOOXOXXOOXOXOXXOXXXXOXOXOOXOXXXOXOOOXOXOXOOOOOOXOXOOOOXXOOOOXOXOOOOXXOOOXXOXOXOOXXOOXOOOOXXOOXXOXXOOXXOOOOXOXXXOXXXXOOXXOXXOOOXOXXXOOXXXOOXOXOOOXXOOXOOXXXXOOXXOOOOOXOOXOXXXXXOOOXOOXXOOOOOXXXXOXOXXXXOXXOOXOOOOXOOOOOXXOOXOXOOOOOXOOXXXOOXXOOOOOXXXXOXXXOOXXXXOXOXOOXXXOXOXOXOOXOOXOXXOOXOOOOOOOXXXOOXOXOXOOOOOOXOXXOOXXOXXXXOXOXOOOXOXOXOOOXOXOXOXXXXXOOOXXXOXOXOOXXXOXOXOOOOOOOXOOXXXOOXXXOOOOXOOXXXOXOOOOXOOOXXOXOOXXXXXXOXOOXXOOXXXXXOXXXXXXOOOXOXOOOXOXOXXXXXXXOXOOXXOOXXOXXOXOOXXXXOOXOXOOOOOOXOXXOOOXOXXXXOXOXXOOXOOXXXOOOOXOXOXOXXXOOXOOOXXOOOXXOXXXXXOXOXOOXOXOOOXOXXXOOOXOXOOOXXXOXOXOXOOXOOXOOXXOOXXXOOXOOOOXXOOOXXXXOOXOOXXXXOOXXOOXOOXXOOXXOOXOOXXOXXOXXXOXXOOXXXOOOXXOOOOXOXOXXOXOXOXXXOOXXXXOXOXXXOOOXXXOOXOOXOOXXXXOOOXXOOOOOOXXXOOOXOXXXOOOXOOXXXXOOXOXXOXXOOXOOXXXXXOXXXXXOOXOXXOXXOXOXOXOXXXOOXOXOXXOOOOXXOOOOOOOOOOXOOXOOOXXXOXXXXXOXOXXXOOXOOOOOOXXXXXXXOXOOOXXOOOOXXXXOXOXOXXOOXXOOXXOXXOXOXXOXXXXXOXXOXOXXXOOOOXXXOXOXOXOOOOXXOXOOXXO';\r\ne=47;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\n%23\r\ni='OXXXXOOXXXOOOOOOXXXOOXXXOOOOOXOOOOXOOXXOXOOXOOXOXOOOOOOXXXOOXOOXXXOOXXOXOOOXXOXOOOOOOOOXXOOXOXOXXXOXOOOOOXOOXXOOOOXXOXOXXOXOXOXXOXXXXOXXXOXOXXXXXXXOXXOXXXOXXXOOOOXOXOXXOOOXXXXXOOOXXXOXXOXOOXXOXXXOXOXOOOOXXXOOXXOOOOOOXOXOOOXXXXOXOXOXXXOOOOXOOOXOXOXOOOXOOXOXOOOXOOOXXXOOOXXXXXXOXXXOXOXOXOOOOXXOXOOOXXOXXOOOXOOOXOOXOOOXXOOXXXXXOOXOXXXOOOXXXOOXXXXXXOXXOOOOXXOOXXXXXOOXXXOXXXXXXXXOOOOOOXOXXOOOOOXXXOXXOOOOXOOOXXOXOXXOXOOOOXXOOXOXOOXXOXOXOXOOXOOXXXXXOOXXOXXXXXOOXXXXOXOOOOXXXXOOXXXXOOOOXOOOOOOOOXXXOXXXXOOXXXOXXXOOXOXXOXOXXXXOXXOOOOOXOOOOXXOOOXOOXXXOXOXXOOXOOXXOOXXOXOXXXXOXOXXXXOXXOXXXOXOOOOOOOOOXOOOOOOXOXXXOXOXOXXXXXOXOXOXOOOXOOXXOXXOXXOXXXOOOXXOOOOXOXOXXOXOOOXXOXXXOOXXOOXOXXXXOXXXOXXXXOXXXXXXOOXOXOXXXOOOXXXOXOOXXOOOOOXOXOOXOXOXXXOOOXXXOXOXXOOOXOOXXOOXOOXOXOXXOXXOOOXXOXOXXXXXXXXOOXXOOOXXOXOOOOXOOOOXOOOXXXXOOOOXOOXXOXXOXOOOXOXXOOOOXXOOOOXOOXXXXXOOXOOXXOXOXOOXXXOOXXOOXXOXXOXXOOOXXXOXOOOXOXOXXOXXXXXXOXOOXXOXXOOXXOOXOXXXOXOOOOXOXOOXXOXXOXXOOXOXXXXOXOXOOOOXOOOOXXXOOOOXXXXXXXXOXXOXXOXXXXXOXXXOXXOOXXXXO';\r\nd='XXOOXXOXOOXOOOOOXOXXXXXXXOOOXXXOOXOXOXOOOXXOOXXXOOXXXXOOOOXOOOOXOOOXOOXOXXOOOOOXXXOXOOXOXOOOOXOOOXXOOXXOXOXOXOXXOOOXXOOXOXOXOXXXOXXXXOOXXXXOXXXOXXOXXXOOXXXOXOXXOOXXOXXOXOOOOOXXXOOOXOXOOXXXXOXXOXXOXOXXOOXXOOXXXXXOXXXOXXXXXXOOXOOOOXOXOOXOOOXOXXXOXOXOOXOOXXXOXXXXXXXXOXXXOOOXXXXXXOXOOXXXOXXXOOXOXXOOXXOOOOXOXXXOOOXOOXOXOOOXXXOOXXXOOOOOXOOXXOXXOOXXXXXXXOOXOOOXXXOXXXOOXOOOOOOXOXXOOXOOOOOXOXXXOXOXOOOOXXOXXXXOOOXOXXOOXXXOXOXXOOOXXXOXXXXOXOOOOXOXXXOXOXOOXOOXOXXXOXOXXOXOXXXXXOXOOOXOXOOXXXXXOOOXOXXOXXXXOOXOXOXOXXOOOXXXXOOOOOOOOOOOXOOXXOOOOOXXOXXOXXOOOOOXXOXXXXOOXOOXXOXOXOXXXXXOOXOOOOOXOXXOXXXXXOXXOXOXXOOXOOXXXXXOOOOOXOOOOXOXOOOXOXXXOOOOXXOOXOOOOOOXXOXXOXOOOOXOOOXXXXOXXXOXOXXOXXOXXOOXOOOXXXXXXXOXOXXXOOOOOXOOOXXOXXOOOXXOOXXXOXXOXOXXXOOOOOOXXOXOOXXOXXXOXOXXOXOOOXOOXXOXXOXXXOXXOOOOOXOOXOXXXXXOXOXOXOOOXXXOXOXOXXOOXOOOXXOOOXXXOOOOOOOOOOOOXXOOOOXXOOXOOOXXOXOXXOXOXXOXXXOOOXXXOXOOXOOOXXOOXXXOOOOOXXXXOXXOXXXOXOXXXOXXXOXOOOOOXOXXXXXXXOXOOXOXOXXXOXXXXOOXOOXOOXOOOXXOOXXOXOXOOXOXXXOOXXOXXXXOXXXOOXXOOXOXXOXOOXOX';\r\ne=42;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\n%24\r\ni='XOOXXOOXOOOXOOOOOXOOOXXOXXOOOXOXXOOOOXXXOXOOOXXXOXOOXXXOOXOOXOXXXOOOOXOXXOOOXOXXOXXXOXXXXXOOOOXXXOXOOOXOXXXOXOXXOOOOOOOOOOOOOXOXOXXOOXXOXXOXXOOXXOXXXOXOXOXXXXXXOXXOOXXXOXOXXOXXXXOOXXXXOXOXXOOOXOXXOXOOOXXOXOXXXXXOOOOXXOOXOXOOXXXOOOXOOXOOXOXXOOOOOOXXXOOOOOOXXOOXOXXOOXXXXOXXXOOXXOOOOXXOXXXOOXXXOXXOXOOXXXOXXXXOXXXOXXOOXXOXXOXXXXXOXXOXXOOXOXOXXOXOXXOOOXOXXOXXOOOOOOOOOOOXXOOOXOXXOXXXXXOXOOXXXOOOOXOXOXOOXOOOOOOXOXOOOXOXXOXOXXOOXOOOXXOXOOXOXXXXXXOOXOXOOOXXOOOOXOXOXXOXXXOOOXOOXOOXOOXXXXOXOXOOOXXXOOXOOXOXXOOOXXXXXXOXOXOXXOOOXXXOOXXOXOXOOOOOXOOXOXXOXOXXXOXXOXXOXOOOOXOXXOXOXXOOXXXOOXXXXXXOXXXXXXOXOOXXXXOXXOXXXOOOXOXOXXOOOOOOXOOOXXXOOXOOXOOOOOOXXXXXOXXXXXXXXXXXOOOXXOOXXXOOXXOOOXOOXOOXOXOXOOOOXOOXOOXXXXOOOXOXXXOOOOOXXOXXXXOXXOXOOXOXXXXOOXXOXOOOXXOOOOXXOXXXOOOXXOXXXOOOOOOXOOXOOXOXXXOOXXXXOOXXOOXXOOOXOOOOOXOXXOOOXOXXXXXOOOOOXXXXOXOOXXOXOXOOXXXXOOXOXXXXXXXOXXOXOOXXXXXXXOOXXXXOOOXOXOOOXXXXOXXXXXXXOXOXXXXXXOXXXOOXOOXXXOXOXXXXOOXXXXXOXOXXOOOOXXOOOXXOXOOXOXXXOXOOOXXOXXXXOOXXOXOOXOXXXXXOXOXXXXXOXOXOXOXXXOXO';\r\nd='OOXOXXXXOOOOOXXXOXXXOXOXOOOOOOXXXOOOXOOXXXOOOXOXOOOXOOXXXXXXXXXXXXOXXXOXXOOXOOXOOXOXXXXXXXXXOXOOXXOXXOOOOOOOXXXOXOOXXXOXXXOOOXXOOOXXOOXOOXOOOXOOXOOOOOXXXXXXOXXXOOXXXXXXXOXOOXXOOOXOXOXOOXXXXOXOOXXOOOOOXXOOXOXOXXXOOXOXOOOOOOOXXXOOXOOXXOXOOXOOOOXXOOXOXOOOXOXXOOXOXXOXXXOXOXOXXOOXOOXXOXOOXXOXXOOXXOOOXXOXXOXOXXXXXXOXXOOXOOXOXOXXXXXOXXOXOXXOOOXXOXOXOXOOXXXOOXOOXOOXXXOXXXOOOOXOXOOXOOOOOOOXXXXXXOOXOOOOOOXXOXXOXXXXXXXXXOXXXXOOXOXXOXXOOOXXOOXXXXXXOOXXOOXXXOOOOXXOOXXXOOXXOXXXOOOOOXOOOXXXOXOOXOXXOOXXXXOOOXXXXXXXXXOXXXXOXXOOOXOOXXOXXXXOOXXOXOXXOXOOXOXXXOXXXXXXXOXOXXOXOXOXOXOXXXXXOXOOOOXXXXOXOOOXXXOXOXOXOOXXOXXXOXOXXXOOXOXXOXOOOXOXOOXXOXXOOOXOOXXOOXOOXOOXXXXXOXOOXXOXOXXXOXOOOXXXOXXOXOOOXOXXOXXXXOOXOOXOXOOOXXOXOXXOXXOXXOOXXOXOOOOOOOXXXXOOOXXOXOOOXOOOOXXXXOXXXOXOOOOXOXXXOOXOXOOOXXOXXOOOXOXXXXOOXXOOXXXOOOXXXOOXOXXXXOOXXXXXXXXOXOXXXOOXOOOXXXXXXOOXOOXXOOXOXOOXOOOXOXXXXOOXXXXXXOXXOXXXOXXOXXXOOOOOOXXOXOXXOOOXXXOXOOOXXOXOOOXOXOOOOXOOXOXOOXXXOOXOOXXXOOXOXOOOOOOOOOOOXXOXOOXOOXXOXOXOOXXOOXXXOXOXXOXXOXXOXOOXOOXO';\r\ne=64;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\n%25\r\ni='XXXOOOOOOOXXOOXXXXOOOXOOOXXXOOXOOXXXXXOOXXXXXOXOOXXXXXOXXOOOXXOXXXOXXOXOOOXXXXXXOXXXOOXXXOXOXXOXOOOXXOOOOXXOOOXXXXXXXXXOXOOOOOXXOOOXOOXOXOXOOXXXOXXOXOXOOOXXOOOXXOXXXOOOXXOOOXOOOXOOXOXXOOXOXOXOOOXOOXXOXOOXXOOOOOOOXOXOXOXOOOOXOXOXOXOXOXXOOOOOOOXOOOOXOOXXXOOOXXOOXOOXXOOOXXOOOXOXXOOOOXXOOOXXOOXXOOOOXXOOOXOOOXXXOOXXXXXXOOXXOOXXOXXOOXXXOOXXOOOOOOOXOXOOXXXOXXOOXXXOOOXOOOXOOOXOOXXOOOXOOOOXOXXXOXOXOXXOXOOXOXXOOOOXOOOOOXOXOOXOXXXOXXXXXOXXOOXOXXOOOXXXXXXXXXXXXOOOXOXOOXOOOXXOOXOOOXOOOOXOOOXOXXXXXOXOOOXXXOXXXOOOXOOXOOOXOXOXXOXXOOOOXXXOOXOXOOOXOXXOOXXXXOOXOXOXOOXXXOXOOOOXOXOOOXXXOXXXXXXXXXXXXXOOOXXOXXXOOXOOXOXXOOOXXOOOOXOOOXXOOOXXXOOXXXOOOXXXXOOOOXXOOXXXOXOXXOXOXXXXXXOOOOOOOOXXOOOOOOXXOXOOOXXXOOOOOOXXXXXXXOOXOOXXOOOXXXXOOXXXOOOXOXOOXOXOXXOXXXXOOXOXXXXOOOXOOXXXXOOOXOOXXOXOOXXOXXOOOOXXOOOXXXXXXXXOOXOXXOXXXOXXOOXOXOOOOXXOXOXXOOXXOOXOOOOOOOXOOOXOXOOOXXXOXOOXOXXOOXOXXOXOXXXXOXOOOXXOOOOOOXOXXXOOXXOXOXOXOXOOOXOXXXOXOOXOOXXXOXXOXOOXOOXOXXOOOXXOXOXXXOOXOXOOOXOOXOOOOXXXXOXXXXOXOOOXOOXXXXXOOOXXOXXXOXXOXOOXOOO';\r\nd='XXOXXXXOXOOOXOOOXOXOOOOXOOOOOXXXXOXXXXOOOXXOOXOXXOOOXOXXOXXOXXXOOXOOXOOOXXXXOOOOOOOOXXXXOOXXXXXXOXOXOOOOOXXXOXOOXXOXXXOXXOXOXOXXOOOXXXXOOXOXXXOXOOXOXOOXOXXOXOOXXOOXXXXOOOXXOXOXOOOOOOXXXXOXXXXXOXXOOOXOXXOOOOOOOOXOOOOOOXXXOXOOOOOOOXOOOXXXXOOXOXXXOOOOOOOOOXXXXOOOOXXOOOOOOXOOOXOXXXOOOXXXOOOXXOOXXOOOOXXXOXOOXOXXOXXOXXOOXXOXOOXOXOXOOXXOOOXXXXOXXOXOXXXOXXOXOOXXXOXOXXOXOXXOXOOOXXXOOOOXXXXOXOOOXOXXOOOOOOOOOOOXOOXOXOOXXOXOXXOOOOOXXXOXOXXXOXXXOOXXOOOOXOOOOOXXXXOOOXXXOXXXOOXOXXXOXOXOXXXXOXXOOXXOXOXOXOXOXXXOOOXXOOOXOOXOOOXXOOOXOOOXXOXXXXOOOXOOXOXXXXXOOOXOOOXOOXXXXXOXXOXOXXOOXOOOOXXOOOXOOOOXOXXXOOXXOXXXOOXOXOOOOOXOXXXXOXOOOOOXXXOOOOOOOXXOXXOXOXOOOXXOXOOXOOOOXXXOOXXXXOXXOOOOOOOXOXOXOXOXXXOXOOOXOXOXXXOXXXXXXXXXOXXOXOOOXXXXOOOOXXOOXXOOXOXXOXOXXXXOXOOXOXOOOXXXOOOXOXOXXXXOOOXXOXXOXXOXXOXXXOXXOXXOXXOXXOOOXOOXXXXOOOOOXOXXXXXOOOOXOXXXOXXOXOXXXOOXXOOXOOXOOXOOXOOOXOOXXOOOXXXXXOOOOXOOXOOXXOOXXXXXXOOXXOXOXOXXXOXOXOOOXOXXXOOXXOXXXOXXXOOOOOOOOXXOXXXOXOOXOOXOXXOXOXOOOOOOXOXOXXOOXOOOOXOOXXOXOOOXXXOOOOXOXXOXXOXOOXO';\r\ne=23;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\n%26\r\ni='OXXOOOOOOXOOOOOXOOXXXXXOXXOOOXOOXXXOOXOXOOXOXOOOXXXOXOXXOOOOXXXXOOXOOXXXXXXOXXXOXXOOXOOXXOXXOXXOXXOXOOOOXXXXXOOOOXXOXXOOOOOOOXXXOOXXOOOXXOOXXXOXOXOXXXOXOOOOXXOXOXXOXOOOXOXXXOOXXXOXXXOXXOOXOXOOOOXXXOXOOXOXXXXXOXXOOOOOOXXXXOOXOXXXXOXOOOOOXXOXXXXXOOXXXXOXOOXXXOOOXXXXOXOXXXOOXXOXOXOXXOOOXXOOXXXXOOXXOOXOXXXXXXOOXXOXOXOXXOOXOOXXOXOOOXOOXXOOXXOXXOOXOOOOOOOXOXOOXOOOOOOXOXXOXXXXOOOXXXXXXXXOXOOXXXOXOOOOOOXOOOOOOXXOOXOOXXOXXOXXOOXXXOXOOXOOXXXXXOOXXXOXOXOXXOXOXOXXXXOXXOOXOXXXOOXXXXOOOXXOXOXXOOXOXXXOXXXXOOXOXOOOXXXXXXOXOOOXOOXXXOXOOOOXXOOOOOOOXOOOXXOOXXOOXOOOOOXXXOXOXOXOOXOXOOXXOOOOOXOOOOOXOOOOXXOOOOOXXXOXXXXOOXXOXOOOXXOXXXXOOXXOOOOOXOOOXXOXOOOOXOOXOOXXOXOXXXXXXXXOOXXOXXOOOXOXXOOOOXOOXOOXOXOXOOOXXOXXXOOOOOXOXXXOXOOXXOXXXOOOXXXXOXXXOXXOOOOXOXXXOXXOOOOOOOXOXOXXXOOXOXXXOXOOOOXXXXOXXXXXXXOXXXXOXOXOXXOXOXOOXOXXXOXXOXXXOOXXXOXOOOXXXOXOOXXOXOOOOOOXXOXOXXXOXOXOOOOOOXOXXOOXOXXOOOOXOOOOXXOOXOOXXOXXOXOXXOOOOXXOXXOOXXXOOOXXXOOXXOOXXOOOXXOXXOXXXXOOXOOXOOXXOOOXXXOXXOXXOOXOXOOXXOOOOOOXXOXOOXXOOXXXXOOXOXXOXOXXOXX';\r\nd='XOOOOXXOXXXOOXXOOOXOXOXXXXOXOOXXXXXOXOXOXXXXOOOOXOOOOXOOXOXOXXXXOOOXOXXOXOOXXOOXOOXXOOXOXXOXXXOOOOXXXXOOXOXXOOOXXXXXOXXOXXOXOOXOOOXOOOXOOOOOXOXOOOXXOOXXXXXOOOOOOXXXXOOOXXXOOOXXXOXOOXXOXXOOOOOOXOXOOOXXXXOXXXXXXXXXOXXOXOXOXXOOXXXXXOOXOOOOXOOOOOXOOOOOXOXXOOOXXXXOOXXXOXXOOXXOOOOOOOOXXXXOXOOXXOXOXOOXOXOOXXOOOXOXXOXOXXOXOOOXOXOOOOOXOXXOOXXXOOXOXOOOOOXXXOXOXXXOOOOXXXXOXOOXXOXXXOOOXXOXXOOXXOOXOXXOXOXXXXXXOOXOXXOXOXOOOXXOXXOXOXOOOXOOXOOOOOOXOOOOOXXXXXXOOXXXOOXXOXXOOOOXXXOXXOXOXOXOOOOXXXOOXOXXOOOXOOXOXOOOXOXOXXOOXXOOOXOXOXOXXXXOXOXOOXXXXXXOOXOXXOXOXOOOXXXOOOOXXOXXXOXOXXOXXOOOXXXOOXOOXOXXXXOOXOOOOXOOOOOOXXOXXXXOOXOXXXXXXOXXOOXOOOOXXXXOXOOXOOOOOXXXXXOOOXXOXXOXXXXXXXXOOXOOOOOXXXXOOOOOXOXOXOOOXOOOOXOOOOOOXXXXXXOXOXOXXOOXXXOXXOXOOXOXXOOXXXXXOXOXXOXOOXXXXXOOOXOOOXXOOOXOXOXOOOOXOOXXXXOXOXOOXOXXXOOOOXXOXXXXXXOXXOXOXOXXXXXXXXOXOXXXOOXXOXXOOXXXXXXOXXXXXOXOOOOOXXOXOOXOXXXXXXXOXXOXOOOXXOOXXXOOXXOOOXXXXOOOOOOXOOXOOOOXOOOXOXOOXOOOXOXXXOOXOXOXXXXOXOXOOOXOOOXXXOOOXXOXXXXXOXOOOOXOOOOOXXXXOOOXXOXOXXXOOXOOOOXXOOX';\r\ne=38;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\n%27\r\ni='XOXOXOOXOXXOXXOOXXOOOXOOOXOOXOXXXXXXXXOXXOOOOOXOOXOXXOXOXXOOXXOOOOXXOXOXOOXOXOOXXOOOXOXOOXOOXOOOOOOOOXXXXOOOOXOXXXXXOOXOOOOXXOOOXXXOOOXXXXOOXOXOXXOOOXXOXXXOXOXOOOOXXXXXOXOOOXXXXXXXOOOOXXOXOOXXXOXXXOXXOXOOXXXOXOXXOOXOXXOXOXOXOOXOOOXXOXXXOXXXXOXXOOOOXOOOOXXXXXXXXOXXXOXXXOXOOOXXXXOXXXOXOXXXXOXOOXOOXOXXXXXXOOXOXOXXOOOOOXXOXOOXXOOOOXOXXOOOXOOOOXOXXOXOXOOOXXXOXOXOOXOOXOOXOXXXXXOOOXOOXXOOXOOXOOOXXXOOXXOXOOXXXXXOXXXXOXXOXXOOOOOXXXXOOOXOXXXOOOOXOXOOXXOXOXOXOXXOOXXOOXOXXOXXOXOOXOOXOXOXXOOXXXOXXXXXXXXXXOXOXXXOXOXXXOXXOXXXOOXOXOOXOXOOXXOOOXOXXOXOXXOOXXOXOXXOXXOXXXXOXOXOXXOOXOOOXXOXOOXOOXXXXXOXOOOXXOOOOOXXXXXOXOXXOXOOXOXOXXOXOOXXOOOOOXXOXXXXXOOOXOOXOOOXOXXXXOXXXXOOXXXXOXXOXXXXXOOXOOXOXXOXOOXXOOOOOXOOXOXOXXXOXXXOXOXXXOXOXXOXXOXOXOXXOXXXOXXXXOOXXXOXXOOXOOOXOXOOOXOOXXOXXXXOOOXOOXOOOOOOOOXXOOXXOXOOOOXXOOOXOXOOXOOXXXXOXOOXXXXXXXOXOXOXXOXOXXOOXOXOXOXXXOOXXOOOOXOOXOOXXXOXOXOOOXXOXOOXXXOXXOXOXOXOXXOXOOOOXXOOOOXXXXXOOXXXOOXXOXXXXXOXOOOXXOXOXOOXXOOOXXXOOOOXOXXXOXXXOXOXOXOOOOOXXXOXXXOOXOXOXXOXOOOXXXXOOXXXXOO';\r\nd='XXXXXOXOXXOOXXXOXOXOXXOXXOOXXXXOOXOXOOXXXXXXXXXOXOOXOXOOXXOXXXXXXOOXOOOOXXXXOXOOXOOOXOOXOXOOXOOOOOOXOXOXOXOOXXOXXXXXOOOXXXOOOXOXOOXOXXOOOOXXXXOOXOOXOOOXXXXOXOOOXOXXXOOXOXOXXOOOXXOXOXOXOOOXOOXOXOXOXXOOXXXOXOOOOXOXXOXXXXOOXXXOXOXOXOXOXXXOXXXXXXXXXXXOXXOXOOOOXXOOXOOXOXXXXXOOOXXOOXOOOOOOOOXOXXOOXOXOXOXOXOOXXXXOXXOOXXXXXXXXOOXXXOOOOOXOXXOXXOOOOXOXXXXOOXOXXXOOOOOXXXOOOOOXOXXXXOOXXXXXXOXXXXXXOXXOXXXOXXOXXXXXOXXOXXOOXOXOOOOOXXOOXXOOXXXXOOOOOOOOOXOOXXXXOOXXXXOXOOOOOOXXXOOOOXXOXOXXOOXOXOXOOOXXXOOOOOOOOOXXOXXOXOOXXXOOXXOOXXXOOOXOOOXXOOXOXOXXOXXXXOXXOXOXOXXXOOOXXOOXXXOOOXOOOOOOXOOOOXOXOXXXXOOXOXOXOXXOOXOXXOXOOXXOXOOXXOOXXXXXXOOOOOXOOXXOXXXXOOXOOXXXXXXXOXXOXXOOXOXOXXXXXOXOOXXOOOOXXOOXXXOOXXOXXOOXXXOXOOOXOXOXXOOXXXOXXXOXXXOXOXXOXOOXOOOXXOOXXXXXOOOXXOXXXXXXXXXOXOOXXXOOXXXXOOOXXOXXOXXOXOXOOXXXOOXXOOOXXOXXOXXXOOOOXOOOXOXOOXXOOOXOXOXXXXXXOXOOOOOOOOOXXOXXOOOOOOOXOXXXOXOXOXXOXXOOXXOOXOXOOOXOOOOOXXOXXXXXXOOOXXXXOXXXXXOXXXXXOXOXXXOOOXXOOOXXOXXXOOXOOOXXXOOOXXOOXOOXXOOXXXXOOOXOOXOXOOXOOXXOXOXXOOXXXXXXOOOOOOX';\r\ne=36;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\n%28\r\ni='XXXXOXOOXXOOXOXXOXOXOOXXXOXOXOXOOOOOXOOOXXOOXOOXOXOXOOXOOXXXXOOXXOOXXOOOOXOXOXOOOXOXXXOOXXXOXXOOXXXOXOOOOOOOOXXOXOXXOOOXOXOXXOOOXOXXOXXOOOOXOXXXXOXOOOXOXOOOXXOXXXOXXXOXOXOXXOOOOXXXXXXOXOOOOXOXOXXXXOXOXOOOOXOOOOOOOOOOOXOXXXOXOXOXXXOXOOOOOOXXXXOXOOOOOOXXXXOXXXXXOXOOOOOOOXXXOOOOOXOOXOXXOOXXOOOXOXXXOXOOXXOOXXOXXXOOOOXXXXXOOXXOOXOOOXOOOXXXXXOXOOXOOOXOXOOOXXOOOOXXXOXXOXOOOXOXOOOOOOOXXXOXXOXXOXXOXXXOXOXXOXOXOXXOXOOXOXXOXOOOXOOOOXOXOXOXOXXXXXOXXOXOOXXXXOXOOXOOXOOOOOXXXXXXXOXOOOXXOOOOOXXXXXOXXXXXOOOXXOXOXOOXXOOXOXOOXXOXOXOXXXXOXOXXOOOXOXOOOOOOXOXOXXXXOOXXOOOOXOXOXXOOXXXOOOXOXXXOXOXXXOXXOOXOXOOOOOXXXOOXOXOOXXXOOOOXOXXXXOOOXXOXOOXOOXXXXOXOOXXXXOOXOXXOOOXOOXXXOXOXXXXXOOOOOXXXOXOOOOXOXOOOOOXXXXXXOXOXOXXXOOXOOXOXXOXXXOXXOOOOOXXXOXOXOOOOOXXOXXXOOXXXXXOOXOOOOOOXXXOOOXXOXOOOOOXXOXOXOXXXOOXXOXXXOOOOXOOOXOXOXOXOXOXOXXOOOXXXOXOOOXXOOXXXXOOOOXXOOXOOOOXXXOXXXOXOOOOOOXXOOOOOXOXXXXOXOXXXOOXOOOOXXOXOOOOOXOXOXOXXOXXXXOOOXXXXOOOOXOXXXOOOXXXXOOOXOXXXXXOOXXXXOXXXXOXXOOXOXOOOXOOOOXOOXOXOOXXXXOOXOXOXXXXOXOOOXOOOOOO';\r\nd='XOOOXXXOXXOXXOOXOOXOXOXXOOOOOOXOXXXXOOOOXXOOXOOXXOOOOXXXOOOXXXXOOOOOOOOXOXXXOXOXXOXOOOOOXOXXXXXOOOOXXOOXXXXXOXXXXXOXXXOXOOOOOXOOOXOXXXXOXXXXXOOOXOOXOXXOOOXXOXOXOOOXXXOOOXOOXOOOXXOXOXXOOOXOXOXXXOXXXXXOOOOXXOXOOXOOOOXXXXXOOOXXOXXXXOXOXXXXOXOOOOOXOXOXXOXOXOOOXOXOXXOXXXXOOXXOOXOOOOOXOXOXXXOOXOXXOOOOXOXXXXOOXXOXOXOXXXOXOXXOXXXXXXOOXXOOOXXXOOXOXOXOOOOOXOXOXXOOOOXXXOOOXXOOOXOXOOXOOXOXOOXXOOOXXXXOOOOOOOXOOOXOOOOOXXXXOXOXOXXOXOOXXXXOOXOXOXXOXOOXOOOXOXOXOOXXXXXOXXXXXXOXOOOOXXXOOOOOXXOXXXXXOXXOXXXOOOXOOOXOOXOXXXXOOXXOXOOXOOOXOOOOXOXOXXXOXOOXOOXOXXOOXOXXXOXOOOOOOOOOOXOOOXOOXXOOXOOXOXOOOXXXOXXXXOOXOXOXOOXXXXOOOXOXXXOOXOXOXXXOOXXXXOXXXXXOXOXOXOXXOOXOXXOXXOOXXOOOOOXOXXXXXXXXOXXOOXXXOXXOOOXOOOOOOOOOXOXOOOXXXXXOXOOOOOOXOXOXOXOOOOXXOOOXOOOOOXXOXOOOXOOXXOXOXOOOXXXOOOXOOXOOOOXXXXXOOXXOOXXXXXOOOOOXOXOOXOXOOXOOOXOOOXXOOXOOOXOOXXOOXXXXXXOOXOXOOOOXXXOOXXOXOOOXXOXXOXOXXOXOXXXOOXOXXXOOXXXXOXXOOXOOOXXOXOOOXXXXXXOXXOOOXOOXOOOXXXOOOOOXOOXXXXXOOXXXOOXOOXXOOXOXOOOXOXOOOXOXXXOXOOXOOXXOOXOOOOOOXXXOXXOXOXOXOXOXXOXXOXX';\r\ne=32;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\n%29\r\ni='OXXOOOOXOOOOXXOOXXXOXOOOOOOOXOOOXOXXXOXOXOXOXXXOXXOOXOXOXXXOOOXOOXXXOXXXOXXOXXXOXXOXXOOXXXOXOOXOXOXXXXXOOOOXOOOOOOOOXXXXOXXOOOOXOOOXOOXXOXOOOOXOOOXXXXOXXXOXOXXXOXOOXOXOOXXOOOOXXOOXXOXOXXOXXXOXOXOXOXOOOOXOOOXOXOXOXXXXOXXOOXOOXOOXXXXXXOXXXOXXOOOXXOXXOXXOXXXXOOOXOXOOOXOOOOOOOXXOXOXXOXOOXXXXXXXOOXXXOOOXXOOOXOOOXXXOXXXXXOXXOXXXOXOOOXXXXOOXXXXOOOXOXOXXXOXOOXXOXXXXOXXXOXOOOXOXXXOOOOOOXOXXOXXOXXXOOOXOXXXOXOOOOOOOOOOXXOOXOOXOOXXOXXOXXXXOXOOXOXXXXOXOXXXOXXOXXXXOOOOXXOOXXXOXOXOXOXOOXXOXOOOOXXXXXXXXXOXXXXOOOOOOOOOOXOXXXXXOXOXXXOXXXXOXXOXXXXXXXXXXXOOXXXOOXOOXXXXOXXOXOOXOXXXOXXXOXXXOXXXOXOXOXXOOXOXOXXOOXOXOOOOOXOXXXXOXXXOXXOXOXXXOOOXOOOXXXOXOXXXXOOOXXXXXOOOOOOXOOXOXOXXOOOOOXXXOXOXOXOOOXOXOXXXXOXXOOXXXXOXXOOXXOXOXXXXXXOOOXXXXXXXXXOOOXOXXXXXXXXXXXXXOXOXXOOOXXOOXXOXXXOOOXOOXXOOXXOXOXOXXOOXXOXXXXOOOXOXXOXXOXOOOOXXXXXOOOXXOXOOOXOXOXXOXOOOXOXXOXOXOOXOOXOOOXOXXOOOXOXXOOOXXOOOXXXOOXOXOOXOOXOXXXOOOOXXOXXOOXXXXOOOOXXOXXOXXXOOXOOXXXXOOXOOXXXOXOXXXOOOOOOXOOXOOOOXXXOXOXOXOOXOXOOOXOXXOXXXOOXOXXOXOXOOXOXXOOXXXXXX';\r\nd='OXXXOXXOXOXXOOOOOXOOXXOXOXOOOOOXOXOOXXXOOXOOOXOXXOXXXOOXOXXXOOXOXXXXXOOOXXXOOOOXOOOOOOOOOXXOXXOXXOOXXOXOXXXOXXOXOOXXXOXXXOXXXXXXOOOOXOXXXXOOOXXOOOOXOOOXXXXOXXXXXXOXXOOOXXOXXXXOXOXXOXXXOOOOOXXXOOXXXXOXOOOXXOXXOOXXOOXOOXOXOOOOXXXOOXOOXOOOXXXXXOXOOXXXOOOXXOOOXXXXOOXOXXXOXOOOXXXXOOOXXOOOOXXXXOXXXXOXXOXOOXOXXOOXXXOOXOXXOXOOOXOXOXXXXOXXOXXXXXOOOXOOOXXOXOXOXOXOXOXXOXOOOOOXOOXXOOOXXXOXXXXOOXOOXOXOOXOXOXOOOOXXXXOXXOXXXXXXXOXXXOOXXOOXOXXXXOXOXOOXOOXOXXOOXXXXXXXXXOOOXOXXOXXOXXXOOOOOOOOOXOOOOOXXXOXXXOXXXOXOOOXXOXXOXOXOXXXXOXOXXXXOXOOOOXOXXOXXXXOXXOXXXXOOXXXXOOXOXOOOXXXXXXXXXOOXXOXOXXOXXXOXOOOXXOOXXXXXOXXOXOOXOXXXXOXOOXOOOOOXOXXXOXXXOXOXXOXXXXOOXXOXOOXXXOOXXOOXOXXOXOOOOXOOOXXXXXOXXXOXXOXXOOOXXOXXXXOXXOOXOXXOOOXOXOXOXOXOXOXOOOXOOXOOXXOOXOXOXXXXOXXOXOOOOOOOOOOOOOXXXOOOXXOXXXXOXXOXOXOOXOOXOOXOXOXXOOXOXXXXXOXXOOXOXXOXOXOXXOXOXOOXOXOXOXOOOOOOXOOXOXXXOOOOOOXXXXXXXXOXXXXOXXXXOXOOXXXOXXXOOOXXOXOXXOOOOOOOXOXXXOXXXXOXXXOOXOXOOOXXOXOXOOOXXXXXXOOOOXXOOXOXXXXXXXXXOOXXOXOOXXXOXOOOXXXOXXOXOOOOXXOOOXOOOOOOXXXXOXO';\r\ne=27;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\n%30\r\ni='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO';\r\nd='OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';\r\ne=999;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));\r\n%%\r\ni='OOOOXXOOOO'; %31\r\nd='XOOOOOOOOX';\r\ne=4;\r\nswaps=snowcones(i,d);\r\nassert(isequal(swaps,e));","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":8,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2013-04-21T20:43:53.000Z","updated_at":"2013-04-21T21:37:42.000Z","published_at":"2013-04-21T21:37:42.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis Challenge is to solve the\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://contest.usc.edu/index.php/Spring13/Home\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eUSC Spring 2013 ACM Contest\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e Problem F, Snow Cones.\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\u003eSummary of Challenge is to Swap the Snow Cones in the minimal number of swaps so the children all have their selected flavor. There are only two flavors, X and O. Input is the string of distributed Cone flavors and a string of desired Cone flavors. Adjacent children may exchange cones but in any one round a child may only swap with one other child.\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\u003eDetermine minimum number of Swap rounds to convert the Distributed to the Desired Cone flavor sequence.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e From XXO to OXX \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eOutput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e 2\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e From OXOX to XOXO \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eOutput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e 1\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eOnly two competitors solved this challenge.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eA little complex requiring a Matlab 3-Liner solution versus\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://contest.usc.edu/index.php/Spring13/Home?action=download\u0026amp;upname=cones.zhengcao.cpp.txt\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eCao's C solution\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":1173,"title":"Binpack Contest: Retro  - - Best Packing","description":"The \u003chttp://www.mathworks.com/matlabcentral/contest/contests/3/rules Full Binpack Rules and examples\u003e.\r\n\r\nThis Challenge is a partial replay of the First Matlab Contest, 1998 BinPack. The Twist is to Achieve the Best Packing, no time or code size penalty. The twelve songList sets will be scored once each.\r\n\r\nBrief Challenge statement: Pack a 45(mediaLength) minute CD as maximally as possible given a list of songs of varying lengths. No penalty for unused songs. No song duplication allowed. Return the indices of the songs used.\r\n\r\n*Input:* [songList, mediaLength]\r\n\r\n*Output:* indexList\r\n\r\n*Example:*\r\n\r\nInput:  [ 0.5 2 3 1.5 4], [5.6]\r\n\r\nOutput: [4 5]  as 1.5+4 is very near and below 5.6.\r\n\r\nThe answer of [1 2 3] is also valid and also gives 5.5.\r\n\r\n*Scoring:* 1000*(Known_Best_Possibles - sum(songList(indexList))\r\n\r\n*Initial Leader:*  Cases [2 3 4 6 8 11] have best possible scores of [44.9990 44.9971 44.8 44.6 44.584024853.. 44.25]\r\n\r\n\r\nFinal Score of 1 achieved in \u003c 6 Cody seconds for entry 10.\r\n\r\nFinal Score of 0, optimal, achieved using recursive searches with iter limits and thresholds.\r\n\r\n","description_html":"\u003cp\u003eThe \u003ca href=\"http://www.mathworks.com/matlabcentral/contest/contests/3/rules\"\u003eFull Binpack Rules and examples\u003c/a\u003e.\u003c/p\u003e\u003cp\u003eThis Challenge is a partial replay of the First Matlab Contest, 1998 BinPack. The Twist is to Achieve the Best Packing, no time or code size penalty. The twelve songList sets will be scored once each.\u003c/p\u003e\u003cp\u003eBrief Challenge statement: Pack a 45(mediaLength) minute CD as maximally as possible given a list of songs of varying lengths. No penalty for unused songs. No song duplication allowed. Return the indices of the songs used.\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e [songList, mediaLength]\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e indexList\u003c/p\u003e\u003cp\u003e\u003cb\u003eExample:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eInput:  [ 0.5 2 3 1.5 4], [5.6]\u003c/p\u003e\u003cp\u003eOutput: [4 5]  as 1.5+4 is very near and below 5.6.\u003c/p\u003e\u003cp\u003eThe answer of [1 2 3] is also valid and also gives 5.5.\u003c/p\u003e\u003cp\u003e\u003cb\u003eScoring:\u003c/b\u003e 1000*(Known_Best_Possibles - sum(songList(indexList))\u003c/p\u003e\u003cp\u003e\u003cb\u003eInitial Leader:\u003c/b\u003e  Cases [2 3 4 6 8 11] have best possible scores of [44.9990 44.9971 44.8 44.6 44.584024853.. 44.25]\u003c/p\u003e\u003cp\u003eFinal Score of 1 achieved in \u0026lt; 6 Cody seconds for entry 10.\u003c/p\u003e\u003cp\u003eFinal Score of 0, optimal, achieved using recursive searches with iter limits and thresholds.\u003c/p\u003e","function_template":"function indexList = binpack_scr(songList,mediaLength)\r\n  indexList=[1 2];\r\nend","test_suite":"%%\r\nfeval(@assignin,'caller','score',200);\r\n%%\r\nmediaLength=45;\r\nrng(0)\r\nsongList=floor(10000*rand(1,100))/10000;\r\nindexList = binpack_scr(songList,mediaLength) ;\r\nsum(songList(indexList))\r\n%[songList(indexList)' indexList']\r\nassert(sum(songList(indexList))\u003e44.8) % anti hardcode\r\n%%\r\na{1} = [4.3078    2.5481    1.4903    5.4302    3.4142    2.9736    3.3768 ...\r\n        2.1612    3.3024    0.3269    2.6761    4.2530    2.6648    1.9644 ...\r\n        3.3389    22.122    4.1015    3.2104    2.3945    4.7151];\r\na{2} = [1.2671    3.1377    4.0687    4.1459    3.6469    6.1881    8.2452 ...\r\n        7.3962    9.7071   10.4798   11.4082   12.2282   12.6320   13.9705 ...\r\n        13.8851   15.6195   17.0187   18.5778   18.4140   20.0473];\r\na{3} = [1.6283    6.0703    8.1323    2.6226    3.1230    3.0081    6.1405 ...\r\n        1.1896    4.2769    5.0951    6.4869    3.9215    2.5858    4.7130 ...\r\n        4.5529];\r\na{4} = [40:-1:1]+.1;\r\na{5} = [1.0979    3.5540    1.8627    0.0849    3.2110    3.6466    4.8065 ...\r\n        3.2717    0.1336    2.5008    0.4508    3.0700    3.1658    0.8683 ...\r\n        3.5533    3.7528    2.7802    4.2016    1.6372    9.6254    1.3264 ...\r\n        0.3160    4.3212    3.0192    0.7744    2.3970    1.7416    2.4751 ...\r\n        1.0470    1.9091];\r\na{6} = [1 1 2 3 5 8 13 21 34]+.1;\r\na{7} = [0.8651    3.3312    0.2507    0.5754    2.2929    2.3818    2.3783 ...\r\n        0.0753    0.6546    0.3493    0.3734    1.4516    1.1766    4.3664 ...\r\n        0.2728    20.279    2.1335    0.1186    0.1913    1.6647    0.5888 ...\r\n        2.6724    1.4286    3.2471    1.3836    1.7160    2.5080    3.1875 ...\r\n        2.8819    1.1423    0.7998    1.3800    1.6312    1.4238    2.5805 ...\r\n        1.3372    2.3817    2.4049    0.0396    0.3134];\r\na{8} = [pi*ones(1,10) exp(1)*ones(1,10)];\r\na{9} = [1.6041    0.2573    1.0565    1.4151    0.8051    0.5287    0.2193 ...\r\n        0.9219    2.1707    0.0592    1.0106    0.6145    0.5077    1.6924 ...\r\n        0.5913    0.6436    0.3803    1.0091    0.0195    0.0482    20.000 ...\r\n        0.3179    1.0950    1.8740    0.4282    0.8956    0.7310    0.5779 ...\r\n        0.0403    0.6771    0.5689    0.2556    0.3775    0.2959    1.4751 ...\r\n        0.2340    8.1184    0.3148    1.4435    0.3510    0.6232    0.7990 ...\r\n        0.9409    0.9921    0.2120    0.2379    1.0078    0.7420    1.0823 ...\r\n        0.1315];\r\na{10}= [1.6041    0.2573    1.0565    1.4151    0.8051    0.5287    0.2193 ...\r\n        0.9219    2.1707    0.0592    1.0106    0.6145    0.5077    1.6924 ...\r\n        0.5913    0.6436    0.3803    10.091    0.0195    0.0482    20.000 ...\r\n        0.3179    1.0950    1.8740    44.999    0.8956    0.7310    0.5779 ...\r\n        0.0403    0.6771    0.5689    0.2556    0.3775    0.2959    1.4751 ...\r\n        0.2340    0.1184    0.3148    1.4435    0.3510    0.6232    0.7990 ...\r\n        0.9409    0.9921    0.2120    0.2379    1.0078    0.7420    1.0823 ...\r\n        0.1315];\r\na{11}= [40*ones(1,50) ones(1,20)]+0.05;\r\na{12}= 4.3 + sin(1:100);\r\n\r\nmediaLength=45;\r\n\r\nnet_gap=0;\r\nt0=clock;\r\nfor j=1:1\r\nfor i=1:12\r\n   songList=a{i};\r\n   indexList = binpack_scr(songList,mediaLength) ;\r\n   indexList=unique(indexList); % No dupes\r\n   total(i)=sum(songList(indexList));\r\n   if total(i)\u003e45+1.5*eps(mediaLength) % Rqmt \u003c= 45\r\n    total(i)=-Inf;\r\n   end\r\n   net_gap=net_gap+45-total(i) ;\r\nend\r\nend\r\ntte=etime(clock,t0);\r\nfprintf('Total Time E %f\\n',tte)\r\nfprintf('Totals: ');fprintf('%.5f  ',total);fprintf('\\n')\r\nfprintf('Net Gap: %.2f\\n',net_gap)\r\n%format long\r\nfprintf('Performance: %.4f\\n',net_gap/(12*45))\r\nfprintf('Score=1000*(12*45-1.76987514-sum(total): %.3f\\n',1000*(12*45-1.76987514-sum(total)))\r\nfprintf('Final Score %i\\n',round(1000*(12*45-1.76987514-sum(total))))\r\n\r\nScore=round(1000*(12*45-1.76987514-sum(total)));\r\n\r\nassert(Score\u003e=0)\r\n\r\n\r\nfeval( @assignin,'caller','score',floor(min( 200,Score )) );\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":2,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":6,"test_suite_updated_at":"2013-01-06T00:41:02.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2013-01-04T16:28:33.000Z","updated_at":"2013-01-06T00:52:17.000Z","published_at":"2013-01-04T18:16:41.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/contest/contests/3/rules\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eFull Binpack Rules and examples\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis Challenge is a partial replay of the First Matlab Contest, 1998 BinPack. The Twist is to Achieve the Best Packing, no time or code size penalty. The twelve songList sets will be scored once each.\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\u003eBrief Challenge statement: Pack a 45(mediaLength) minute CD as maximally as possible given a list of songs of varying lengths. No penalty for unused songs. No song duplication allowed. Return the indices of the songs used.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e [songList, mediaLength]\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 indexList\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eExample:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eInput: [ 0.5 2 3 1.5 4], [5.6]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eOutput: [4 5] as 1.5+4 is very near and below 5.6.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe answer of [1 2 3] is also valid and also gives 5.5.\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 1000*(Known_Best_Possibles - sum(songList(indexList))\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\u003eInitial Leader:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Cases [2 3 4 6 8 11] have best possible scores of [44.9990 44.9971 44.8 44.6 44.584024853.. 44.25]\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\u003eFinal Score of 1 achieved in \u0026lt; 6 Cody seconds for entry 10.\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\u003eFinal Score of 0, optimal, achieved using recursive searches with iter limits and thresholds.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":2122,"title":"Simple Robotics 2 - End effector attitude","description":"Given a structure as input to your function with the following fields:\r\n* robot.links(L1,L2,L3)\r\n* robot.jointangles(alfa1,alfa2,alfa3)\r\n* robot.attitude(x,y,tht)\r\nReturn the same struct with the correct end effector position and orientation in \"robot.attitude\". In a stretched out posture, the end effector angle is 0.\r\nIn other words calculate the end effector x,y and alfa.\r\n\r\nWhen the robot arm is aligned with the positive x-axis of the robot's base coordinate system, the end-effector angle is defined to be zero.\r\n\r\nYou can easily modify this function to generate xdata and ydata for plotting the robot arm. Check the testcases for the requested accuracy.\r\n\r\nTip: calculate the x,y position of the heart of the orange end-effector as a function of the angles alfa1...3 and link lengths L1...3. L1 is the length of the first link (connected to the base of the robot). good luck.\r\n\r\nTip2: alfa1 in the picture is negative.\r\n\r\nTip3: make a little drawing on a piece of paper to see how the end effector coordinate system relates to the angles of the hinges (joints)/jointspace.\r\n\r\nAs a visual reference, check the picture below.\r\n\r\n\u003c\u003chttp://3.bp.blogspot.com/-Quk1HnM9BF4/UtU4GvT5NhI/AAAAAAAAAC4/wSltlKZRlok/s1600/ontrack.jpg\u003e\u003e","description_html":"\u003cp\u003eGiven a structure as input to your function with the following fields:\r\n* robot.links(L1,L2,L3)\r\n* robot.jointangles(alfa1,alfa2,alfa3)\r\n* robot.attitude(x,y,tht)\r\nReturn the same struct with the correct end effector position and orientation in \"robot.attitude\". In a stretched out posture, the end effector angle is 0.\r\nIn other words calculate the end effector x,y and alfa.\u003c/p\u003e\u003cp\u003eWhen the robot arm is aligned with the positive x-axis of the robot's base coordinate system, the end-effector angle is defined to be zero.\u003c/p\u003e\u003cp\u003eYou can easily modify this function to generate xdata and ydata for plotting the robot arm. Check the testcases for the requested accuracy.\u003c/p\u003e\u003cp\u003eTip: calculate the x,y position of the heart of the orange end-effector as a function of the angles alfa1...3 and link lengths L1...3. L1 is the length of the first link (connected to the base of the robot). good luck.\u003c/p\u003e\u003cp\u003eTip2: alfa1 in the picture is negative.\u003c/p\u003e\u003cp\u003eTip3: make a little drawing on a piece of paper to see how the end effector coordinate system relates to the angles of the hinges (joints)/jointspace.\u003c/p\u003e\u003cp\u003eAs a visual reference, check the picture below.\u003c/p\u003e\u003cimg src = \"http://3.bp.blogspot.com/-Quk1HnM9BF4/UtU4GvT5NhI/AAAAAAAAAC4/wSltlKZRlok/s1600/ontrack.jpg\"\u003e","function_template":"function newrobot = forwardkinematics(oldrobot)\r\n%   * robot.links(L1,L2,L3)\r\n% * robot.jointangles(alfa1,alfa2,alfa3)\r\n% * robot.attitude(x,y,tht)\r\nend","test_suite":"%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[0 0 0];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude;\r\ncorrect_attitude=[0 sum(robot.links) pi/2];\r\nassert(isequal(yc,correct_attitude))\r\n%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[pi/4 0  0];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude;\r\ncorrect_attitude=[-0.5*sqrt(2)*sum(robot.links) 0.5*sqrt(2)*sum(robot.links) 3*pi/4];\r\nassert(isequal(yc,correct_attitude))\r\n%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[pi/4 pi 3*pi/4];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude\r\ncorrect_attitude=[-0.5*sqrt(2)*(robot.links(1)-robot.links(2)) 0.5*sqrt(2)*(robot.links(1)-robot.links(2))+robot.links(3) pi/2]\r\nassert(all(abs(yc-correct_attitude)\u003c=eps))\r\n%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[-pi/4 pi/4 0];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude;\r\ncorrect_attitude=[0.5*sqrt(2)*robot.links(1) 0.5*sqrt(2)*robot.links(1)+sum(robot.links(2:3)) pi/2];\r\nassert(all(abs(yc-correct_attitude)\u003c=eps))\r\n%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[-2.1513    2.9568    2.8725];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude\r\ncorrect_attitude=[0.246878929631356  -0.220349832044192   5.248796326794897]\r\nassert(all(abs(yc-correct_attitude)\u003c=1e-8))\r\n%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[-0.0919    1.8867   -2.2501];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude\r\ncorrect_attitude=[-0.260952279814086   0.667368060676958   1.115496326794896];\r\nassert(all(abs(yc-correct_attitude)\u003c=1e-8))\r\n%%\r\nrobot.links=[0.5 0.45 0.3];\r\nrobot.jointangles=[-0.4916    2.6121    1.8360];\r\nrobot = forwardkinematics(robot);\r\nyc=robot.attitude\r\ncorrect_attitude=[0.070611406176580  -0.000086942065283   5.527296326794897];\r\nassert(all(abs(yc-correct_attitude)\u003c=1e-8))\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":20079,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":5,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2014-01-16T04:52:06.000Z","updated_at":"2014-01-25T01:02:46.000Z","published_at":"2014-01-24T01:47:31.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[{\"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\u003eGiven a structure as input to your function with the following fields: * robot.links(L1,L2,L3) * robot.jointangles(alfa1,alfa2,alfa3) * robot.attitude(x,y,tht) Return the same struct with the correct end effector position and orientation in \\\"robot.attitude\\\". In a stretched out posture, the end effector angle is 0. In other words calculate the end effector x,y and alfa.\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\u003eWhen the robot arm is aligned with the positive x-axis of the robot's base coordinate system, the end-effector angle is defined to be zero.\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\u003eYou can easily modify this function to generate xdata and ydata for plotting the robot arm. Check the testcases for the requested accuracy.\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\u003eTip: calculate the x,y position of the heart of the orange end-effector as a function of the angles alfa1...3 and link lengths L1...3. L1 is the length of the first link (connected to the base of the robot). good luck.\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\u003eTip2: alfa1 in the picture is negative.\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\u003eTip3: make a little drawing on a piece of paper to see how the end effector coordinate system relates to the angles of the hinges (joints)/jointspace.\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\u003eAs a visual reference, check the picture below.\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\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/wAARCAHgAhsDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1+iiipKCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKUUAFFFFABS0lLQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAn4VXkmMbIPKd9zbcgfdyOp6cVXvXuRCyWKRyXG4L8zAKmR95h345wOTxRp+niyRizvNcSndLM/wB526Z9h6DoKdhE8NvsZZXEclwF2NKE2lhkn3x6+mTVvFIAKWkAUlFUb7UYbBY/NLF5W2RRoMu7ewHt/wDroAluJvs1u83lySBRnZGu5j7ADk1US1F79lvr228u5i3FY9+4Rk8ew3Ad/c49akgsmjvprqW4kkdvlRCcJGvBwB0JOOT3q9TEPooopFDahlkSJQzuiLkDLEDJJAHJ/wAnNE0qRJudgi5A3E9yQB/Ss1NOmn1Jru+dJBE5NtCmdiejHPV/rwO3rTsJl5Y5XcO5aPaWXywQQ4JGCfy4HbNW6KKAG0UUUhhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFLRRQAUUUCgBaKM0ZoAKKrzzw2lrLczuscMKF3c9AoBJJ9On6VyPhL7V4ln/wCEu1BpUikLLplmW+SGHkbyO7uM8noDgUAdofpQKzk1jTpJbtE1C0ZrTm5UTLmHry4z8vQ9fSqF14qtI7q0trCC41We7jaaJbAoymMHly7MqYzgfeyc9KVwOjxSVyMj2vjzw6LnT7i7sLy2nYQyH5JbW4XgqyjIPU5HIINWPBviGXX9HY3cKwanZzNa30I/hkXOcd8Hg/jTA6ailooASilpKAGkis9r1Zb17CFnMwQl3UZEWem7PAJ7DqQPxqV5DK3lQnKksjyI4zGwHHHPPT6elJYWMGnw+Tbg4JySSSzMerMT1J75poWpPDAsXICtIwAd9uC5xjnFWKSlzSGApM+1FUNQup7a3BtrZp5nbaiDgAnnLHsOue/50biJJ7hY28pTGbhkZo4y4BfH+RTLKGdIUa9aOW5BJyiYCZ/hXPbH596WKyhju5bvygJ5gods5OB0Az0H8/SrmaYDqKKKQxDVDUNQh0+LfLuLs21I0GXkbsoHrx+FTyzrEyAlgZH2KNucnB9vbr0qslmr3Ed9cRR/a1j8ssCWC567c/57c0/UTJbZZXVZ5leOZkAaLzNyoRk8EYHfk/4VbxSiikAuaM0lFAxtFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUooAKKKKAG1y/i/xRN4Xt7FrXTf7Rub25W2jg88RZYgkfMQR2H59a6kD5q85+Kf2of8ACN/YPK+1/wBrR+T5+dm/DY3Y5xn0qX0GjS0bxldz+IItE1/w/Po97cRtJbf6SlwkoH3huUAAj0549OM1dU8ca7p63V7F4MvX0m2ZhLcy3KRSBVOGYRHLEcEg55HPAp+meGPEF74ottf8U3WnNLYxMlpbaej+WCwwXJfnPbH0pfGOpz6w0ng7RdsmoXSbbybGUs4T1Zz/AHiOi9T147tu3qJfgV/iDr0V38L2udOYldW8qCFm4wshGcj/AHciuygjt9G0WKHOy2srcKSR0RFAzj6CuB+ImnwaR4R8MafBxaWurWsZyTkoqsPx969OKfLTl5CW2p5Xd3ej/wDCbaVqyxxx+HrmBoBOo2xTyKRKg2Y5GScY+8wIxxz0HiXxTZ6BFZaTYTWVneXifuGumWGK2jHV2DY6dAvUnjsa7Pkdfwpf696m2lir9TmPBkWj2+iG30W9W+ijlbz7kHd5kxwzNuHBySOnA6dqxtOY6V8ZtXsBxDq2nxXoUHo8bbD+eGNeg49/0rzzUx/xfbRduf8AkESF/wDd3Pj9aolHotFFFAxh/Osaa7ubu6a0sCUWIgT3JXO3/YUHq3TnoAfWrjP9rTbC+YHU4nik5DA9BjPoefbFXselPYncQKE6ADJycDqadRRSKE/hpelLWbeTzSJNBp8sJu1Kglzny938RA9snBxnFMQr30KXyWKl5Lhl3kKM+Wo6Mx7DsPX8zTrGz+xxMGmkllkbfLI55djgZAHQDjgcDj61LFEY0XzH3yhQrSMAC2B1OPx+mas4oCwtFFFIY3NUdQuJba33QW0lxKx2pGvcnoSewGM5omvEFwLSKVPtTRl0QgnA6ZOOgyRz+FSww7N7n/WyYZyCcEgAcA54piINPtrm3iLXU7TXEp3ORwi9MKoPQfzPer+PWlHNBFIBaM0lFAxc0ZpKKAEooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAClpKWgAoooNADM/41i634ftddm06W5lmQ2NytzEIyBuZem7g8c9sfWtr/8AUKMdMelIOg7HT2rz+H4VWVtLczWniTxNaG5kaWUW18IwzE9ThOfxr0AmlH3aA2R51498Oy2nwvnt4b28vJtOZbxJryTzJH2tuO5sDopb8hXd2N4moabbXsH3J4lmTnqGXI/nUk8UVzbyQTKskcisjqRwynIIP+e9cZ4bln8HNJ4c1NZmsIBJLp1+VLI0IBYxuR91kGcZ6jp0xQwSJIPEmp22sazpurGwje2sBfW80aPtVfmBDhm+baQORtz6DtFDFf6joVhrnifVZNOgjtmmubWzkktkDN90s6vv4XqucZPtVeTTrbxn4wtdWsrgS6PHaeVcSJ9y6y6usYPcAjLf98/3gNnxF4cvtd1Kxnj1K2jtrRt/2O5tGmjkk7M2JEzjsOmefotbDe/kM8A/2m/hxH1N7hw80jW32k5l8gtmPeTyTj156Vl6Wp1f4x61qI5g0mwisFI7u53n8vmHtWvfahq3h/SnacnWdTupvLtILW1MSBiowp+ZtqjBYszevpUnhPQP+EY0Jlu51lvrh3ur+5PR5W5Y5/ujoM/pmqJWx0vWsm6hfVVjWKcJp7ZEuzIeTBxtB7Lwc96fZ3Z1NHlEUkdsHBgk3FTJg5Jx2U4A561p9aewbkMUUUUSwxKqRqNoVQAFxxj8KsUUUrjG5paTNZjXK6i11Z2000bRnY9xGBhWJ5UE/wAQx+GfwosK4+a5uRew28FsXVvmlmY4VF9Ae7e3apbO0gs0ZYIwgZiz9SWY9STznPue3tTrW3SztY4IgQkYwASST+JqzjrzTAdRRRSGNHaqsrsMRJuV3DbZNm5UI9eff8cHmqVxqLve/YrBVknUgzSEHZCpOecYyx7LnvnpWjDDFFv8pVUu5ZsdyepNPYVypp+nrZKx3NJNKd0szj5pGx146D0HQVo0GkJoAdSUUUhhRRSUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFLSUooAKKKKAFFFJS0AFLSUtABRRRQAUUUxm2IW5IAzwOaABjgZOcDngVReFNRi/fqklowR0BBye/zA49uMfhVa0S9vLpb24MlvEuRDbA84I+9Jjvz93tn16bA709hbjqMUUGkMxtd17T/D1j9r1CZo1JwiDlnPoo7/AI9K4pfi/Zed8+kXSwH/AJaBxu/Lj+dc/wDEa4lvPHTW0xYw20K+Wp6HIBJ/X9KwCAeD0xg8da7KWGUo3ZzTqtM9vtdSHiC1tbnSL2P7Gz5lkxlxjB2AEYHvnt065raVAn3QAM5wB3NeRfCm5lg8RalYKT9naDzsZ4Vgyj8OG/SvX65qkeV8ptB3Vx1FFFQWMz+FVJ2mfMMW6NiNwlwCq4I4x649se9Vbz7Ve+XBZSrHA4JluVcFgM42p6E889BirdpbRWlrHBAuyNBgLnp9e57/AJ+tOwr6ksUMUW8xRKm5tzYGMk9+OuamNANLSYwpKKKACiikoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKXFFACUuKKKADFGKKKAExRS0UAJRS0UAFFFFABRRRQAtFFFAC0lANQTOY4mcK0hUZCoOWxzwDjk/WgCG7vYLC3M877UBwOMkk8AADknrx1Jpwi3y75trbXJiIGNoK459TyfaoP7OWTUjezuZHXiBCPliyBnA9T6/hWhx+VAle4+iiigYzn0qN5BGhZiqqoyWJwAPr7etNuLiK2hkmndY4kXczscADrzmvPr/UtS8aanJpmju0WlJ8s04GA3rk/ngdx19rhDm1exEp20MXxVGvjHxF53h+1lkuLeIh5QQFkAPHB/H659q50aL4lklMK6BeiXpuMTBfzxj9a9w0bRrXRLEWtkm0DlnP3nPqT/n+lama2+sOKtHYj2V9WcV4C8Hy+HLWe4vir6hckb9pyEXsvpnua7age9MLAKWbAUDJJPSudvmd2apJIcThazobxdTV/srukcUgHnBBtkx1A65Hbdjr06UXUQ1OJ4WLi2IUh45BiUHkj1x0HXnNWo40giVEUIqjAUDAUdP0oDUdFEsSbUUIoJIAA7nJ4+pNTUUUhhSUUUAFJRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABS0UUAFFFFABS4oooAMUYrJk1i1GuxaMGaS8eJpzHGufLQdGcjpk9O5/DNa1ABikpay9Y1e10SxN9dmRLdXUSSIpbYCQNzAc7Rxk9hQBp0VDG6yxK6MHVhlWBBDDr9OanxQAlFLikxQAUUYpcUAJRS0UAFFFV5JSijCO7ZUFVIyMkDPOB6+/FAFW/1FNPiX5Wlmc7YoV+/I3oPTHUnoKdZRyukU16kP2xQwJiBwoJB2gnr0A9yKmjgw25yJJQWAkKjKgnoD7cfXFWfpT6CHUUUUhjc/NUFzcQ2lu888ojijGXdjwAKh1DULbSrKW7upVjhTkn19h61wCxX3xD1NZ38210OA4AJ5kbvjHU+/atIQvq9iJSttuLNc6j8Q702tsjWuiwyZeQjlvr6n0HbPNd7pum2ukWkdraQiOJe3cn1PqfXNJFYJaaetpYbbNVACFUztwRnI759/X8asxLKEQOVdlGGIG3Jxycc9frxROd1ZbCjHq9xzssaM7kKijJJPT8aym8R6Ql1DarexyTTSiNBF8+WPbI4GOp9KfrD2iWsaXNsl27P+4tyoYu/PIznpk89qyPsQt9aspr54lkiR7mV/uxRKAFVF9Blyfcrn0qYpdRybvodUzCNSxIAUZJrKtLm61C7W5TMNgudgK/PPkY3EH7q+nc1e2PLKC6tGInJQK/DgjGT0x1P5VZxSKAAJgAAAcAAdKdRRSGFJRRQAUlLSUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUCilFABRRRQAg9KXiuc8TeKbXwta2s9zbXl0biYQRRWkYkkZiCehIz0/Wquh+O9P1vVjpcljqel6gU8xLfUbbynkTn5l65x7+/oaFqD0OvrO1bUYdH0m81K4/1NrE8rgHrgZwPfj8zWhmuB+Lk8o8GJYRMVOo3sNmxHYMxP8A7L+tAF7wHYXEeif2zfgNqesH7XcOT0VhmNB7KmOO3Nb0er6bJLdomoWrPaDNyonXMPXlxn5enfsKmZrfTLEsf3dvbxcnH3VA/wABXmt3d6R/wm2lasqJH4euoGgEwGyKeRSJUGzHIyTjH3mBGOOVfWw+h6K+p6eNNGom+tfsON/2kyr5W3sd2cY9/ekt7vT9Ysme1uLa9tJAULQusiN2IJGQe9cJ4omWLxlokEt5p2l6XbWj3FqdQtz9nMwIAG3egDKpyOcjPSuo8Jafb2WlSTQTXM8l3O0889xAYWlkJALBCBtU44GOmDk9aFqhPRmZ4JnbS9T1bwjMWI02QS2RY9baTlV9yp+X8hXcV57rDHTvjN4duV+VdTsZ7OXA+9sy4+vJUZ9K9DxTASiiigAooooAQCigVnPqkSalHYojyzMNziPH7tefmbsM9MdaBD7uWWOJ1tVjlutoIjZwMZOAT6Dg9ucVFpum/Y9800rTXc2DNMR164UDso7DtVuKExooZ2kkAAMhABb64+pOPerAp3AdRRRSGMxWdqmrWWjWrXV7MI4wcAd2PoB3/Co9d1u10LT3urlvZIwfmdvQA/zrjtL0e/8AGeoR6zryeXYr/qLYcBhnP5fzx6VpCF1zS2M5T1stxlnY6l48vxf6kZINGR8wwA43jP8AnLfl7ehwW0NpCkEESxwoMKijgCnRxrGgVVVVUYAAwAPp7VKR8tKc+bRbDjC2rOfv/Ea2fiay0VbZpZbpdxYP9zr1H4E1o3+oJZQr8rSzynbFCv3nb0Gf1PauEtL4XfxG1S/EZmeAfZraKPq78Dv0HDkntXWqsWlxSajqUokvGAUlVJxnpHGOv9T1NVKCViYybJrW0Np5moX8ivdsmXcA7Y0HOxB6cc8ZOPydJpr3l9512wkt4SDBAuduRg72z1bPTsPrzU9oZp4ori4haGcqwMQckKCcjOOM8DJA4JNXTnn9Ki5dh9JRRUlBSUUUAFFJRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUopKKAFooooA84+Kcs8H/AAjUlpb/AGq5TVozHBvCeY2Dhdx4GfU0/T9M8R6/4ysNf1zTI9HttMikWC2W6E8kruMEll4C47deK6DxJ4bPiC40l/tQg+wXqXWNm7zNv8PUYznrz9K6EEcjvjBqVogk9Twn+3dT8RG81GY+OhMZZEthokH+iRqpIQHn5zxyeD2rY8QX2pap4c8AtrkEtvcTa1ALpZYvLbcrFclT0yMnpXRDwJrOnXdyfDfiybSrG4kaY2kllHcKjkknYXIwD6fzrP8AiVZtpHgXRC91Pdf2bqdvLJcTvudsbgWY9+tUtge56aePeuWtfFFzLqeqabd6ZHaXVnardxA3O5ZI23feIX5SCMHG4A5wTiukllRImlZ1WNRuLE8Adc1weraS+v8Aj6M2k6tYSad5OoyRnIMbMrogI7uM59FJPcGp62H0NO28Zz3Ok6Q/9k7dW1VTJBYC54SMcl3kK/KoBBPyk5IABrQ8MeID4jtLm4a3jiaC5eAmGbzopNv8SPtG4c+g5GKyfEPhOW/8S2uqpp2lalBFaG2NnqPyonzAqykI/PUYwPrXTaVbXFpp8VvcG33xgqBbQeVGq5OFVcnAA469u3Smu5L8jjfHxx4+8AsuC/2yYAexCA16JXnfiYi9+L3gyy6i1iubpx6ArgE/ileiUxhRRRQA2lorEvru6ubptP0/MbgDz7kjiIHnC+renYdT6UJCuaDzEuEh2SFXxKA4ygIyCRz14/OmWNhBp6MsKsWdi0kjnLyN6k9/5VZjXYgUlmYAAscZb3OKkNFwHUUUooGNFYXiLxJaeG7ISzkySucRxA8t/wDW5HJqDxJ4ottAtyN3mXrj9zbgck9iR2H61jeHvC9ze3o1vxGzS3TENFA44T0yPb0xx9emsIJLmnsZyk9okOi+HLvxBqA17xCCVY5t7Vjwq54yD256d+9egAAKAAABwAO1LwKDjb24qJzcioxsLz+lZWs6vDo2nyTvlpArFIweWwCT+A7ntU1/frZoqqrS3Ep2xQr952+vYDue36Vj6roj3Oi3v2gyzX9yioWhH3QSPkQHovqfqT0pwSvdik3ayMr4d2qW+jzatcIWmu5yPMCEnG4AYA9Wzn6e2a69bVHmimuI0eeIvsYA/KDxwOecY/UVn+HNFl0bTI4JrhpZQioQD8iY7Afieep/IDcx39sU6krybQQWg8UlFFZlhSUUUAFFFJQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABS0lFAC0UUUALWH4r0NfEfhXUdJbG65iIQkdJBgqfzArcooA5XwZqS654MtftMSmeKP7JeQSDOJE+R1YH1xnHoa0pG0nwvoskuy103ToPnYIgjRc8nAHck9B1Jqvb6E1l4jn1OymWO3vlze2pBw8gHyyKezY4PqAD1rK+IVjfXuk2ktpbSXSWd9Bcy28Q3O6I2WAX+I98d6l6D0NKLxjoU91Fbi6kS4mmWFIJbWWOQsV3DKMoIGATuPGB1rf8AU4rzuRmf4kWXiF9GvTZPZvawTfYpPMEgZTuZNuUBDEAsB0PY5rs9Ys73UNMktLK9FnJKdjThcsiE/Nt/2sZwexPSq6COW8Lxf278QNc8UY3W0C/2ZZNnO7YcyMPbdwD7n3rv6z9L0220fTLbT7GIR20CBUTHT3JPU9ea0KAG5pM4p1ZN7bzaiggguXig3ss7AMHYDjap4x6E/l60ITLHnreKy27o8Lbo3kjlO5GHHGM89ee3HWrSKEQAEkAYyTk/nTLa3htLdIIEWOJBtVFGAMVPTYIWiilzSGRjHHp2rl/FHipNDRba1H2jUpSAkXXHuQP5dzUXibxb/Z0w0zTIjcapKNqqoyIyehI7n2/Ojwv4SGlv/aOpN9o1OX5mZju8snrg9z6n/wDXWsYqPvTMnK+kSHw14Vljum1vWz52pSneFbkRfh6/TpXaCkI/TpmlX61E5c7uy4x5RpxtHFUtQvls0CqjS3Ex2wwKfmdh1+gHc9v0ov8AUBZqiIpluZciKBer/UnoBnk+lQ2Vm1s/2m4zcXsx2ySKPljAydo9FGPqT160ku4NkNqIrK+QXswm1S6ByVUnao5woH3UHHJ6k88mqtzry2Hiay0k2wmvLqIGWWM4CgbsfKc8cMevStWx09LNpZndprqY/vJ2HzN7D0UdhXIaJ/xN/iVq1/8Aejsk8lCOgPC9fwf860ik7shtrQ9BoNFJWRqFJS0lABRRSUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABS0lKKAAUtJS0ALRQKKADFFFFACZzUbusalmIVVGSSenuak4qg8Y1CJkmjV7SRcNG6MrEg989sDpj8eaEIr2d4dVaUxRMtjwEn3lWlYHOVx/D79/pWvTFRUUKuFVRgADoKfjC02CQ6g0UE4pDGE1xXiTxTKLj+xtCzPqUh2MyDIi9efX+VRa/wCJ7u9vhonh395ctxLOp4j7HB9vXt9au6fpuk+BtFlvbyZfMC/vpyOXPXao/p1zW0YqCvIycnJ2WxDpulaf4L0ybV9WuBJdsMyzsdxyf4VzySf1rT8OeK9P8UWjy2TFJUOHglxuXPQ47g+teZ319d+M9SW+vlaLTYj/AKNa56+59f61DerLo10utaZMttcw/fB4WQf3SK5J4unKr7N7nbHBVFR9qtj3PHyiqd7NLaWpaGCSeUnaiAdSTxk9h7+gqn4c1j+39BttRNu8BmGSjdiDjg9xwcfWr8rGT91FuBZWAmABEZHAzn3PTnpW2zOYwgZra6aC323WtTjMspB8uBe3HZR2Xq361vRwqjOQqB3IMhVcb2Axn9PXtSxxLHuYAbmwWbHLY45x1qehu4kirf3S2VjcXLY2wxNIc+gGa5L4bWrDQri/lyZLudmJI6gcfz3V0us6eNV0m4sDK0XnjaXA6dCfr0o0jTl0jSrawRt6wpt3YxuPUn86tSSg0Jp8xpmkoorMsSiikoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigApRSUooAKWkpaAFFFAooASg4qpdXcNlC1xO4jjXqSe/QcdSfbvTQoudksyhoyVkijdCGRhk5Pvz09qBFGGO91G9E9z5ltawv+6gBw0hB+8+O3oPxPpW3SCnZptgkLQaSoZJFiiZ3YIijJYkAL3+lJajJCccnivPdc8SXGv339g6C4Cu2ya7JwD3IB9ODz37Ck1PWL/xnfHSNEZksFP+kXWCNw9Pp7d8elbzadonhbw1ItxtjtVG6WVvvu46EHruz0x+FbqKh8W5i25bbCWdho/gjQpbiZ1RVUGadh80jegH8lrzm+vb3xnqS318rRabEf8ARrXPX/aPr7nvTbi8v/F91Fc6izjToTi2gPBf/abHf+fbirtxPDZ27SysEjUfl+FeTjMY0/Z09ZM9jA4FW9rV+FBcTw2duZZWCRqOfapvC/he48WXSarqqNHpMbZggPWY+p9qPC/he48WXSarqqNHpMZzBAesxz1PtXpFtdxXjS21l5kcUOFE8YXZuHVV45x0PH61phMJ7Fc8viM8bjvbPkh8Il2txPCltprRxx5MckykfuVHGFX+929B+lWbKzh0+1W3t12IoySTksT1JPcn1qO/1PTdHiV9QvrSyidtqtcSrGGbrwSRz1pYdU064lgihvraSSeLzokSVWMkfTcoBOV9xxzXZc4LI0aKKKQzndQ8RLZ+I7HRVtmllul3Fw33OT2/4CfyrdP3q4TR/wDia/E3VL7rHZJ5KY7Hhev4PXeVpOKjYiDbuOoNFJWZYUlLSUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUYoAKKMUuKAEopcUYoASloooABS0UUAJUUjhEJAJbGQB1Jx0HbNVNQ1CHTolZ9zO52xxIPmdv7qj8PpSWaXEsSy38UJnDlkCL/qgeNoPUnHU+9OwrjTp63OoRX1wZDtCmKB8YiY9WwM5btntjitMCl/nS5pMA/hpKP4ap315BYWklxcSiKKIZZien/6/60JXC6RJPPFbW7zTuscaDLOxwFArgLm91Dx5fPYaeWttGjYCacj/AFnP9ew/E0hbUPiBfBVElpoUL4Jz80p/qf0HvXYyS6Z4W0QuxS2s7de3c+nuTWytTXmZazfkREaV4Q0JmJW3tIVyxPVyfXuWPpXl+oX934z1Bb29VodLhP8Ao1sT97/ab1/z+JqGoXfjTUlvb1Wi0yI/6NbE/e/2m9f8/januIbO3MspVI1H5V5WMxjT9nT1kz2cDgU17WrpFBPPDZ25llYIij0rJ0uax1fxFbNrrPHp6tlYR93PbefT1/8A11seGvDNx4tuhqeoiSHSYz+4hBw0x6Z9h7/lWPrmhTaVM0sayPYPIywTuuN+PUdvr3xkV1ZbgIQ96p8RzZjj5VHyU/h/M9neNL21+zw4WyeMASQS44zggY6DA7euKuQQQ28KQwRCOJBtRVGAAK8s8G+NW0xk07UX3WbHEch6xegP+z/KvU0dZEDKwKsAQR3z0+tdVWm4OzOGnJSPOWstP1z4wanba1bQ3S2thEbK3uUDoVbl2CngkHjp/Ks74bWWnnx14lm0+ZXtbDFtZxq2VjV2Z32+28HH867nxB4N0DxQ8T6xpkd1JCMI4d43x1xlSCR14Pr71FB4C8LW2o2l7Bo8MVzaR+VC6FlAXkcqDhjyeSCTmsY6GktSnoV7q8XiZrDVbm7KS2zSRpeRQr5jqwDNF5WcIARkOxbke5rqb25FlY3F0/3YY2kIz6AmqGmeGtN0iZZ7SGXzFj8lDPcSTeWn91N7HavA4GBwPQVPq+nDVdKuLHzWiWYbS6jOOh7/AEP51UWrq5Mupzfw4tiNFub+XmS7nZicdQOP5lq7TjcfaqGk6cukaVbWCsXWFdu7H3u5OO3NXsfMfenOXNJsIKyJKSlpKkoKSloNACUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUuKKKACiijFABRS4ooASilooASilzRmgAxRRRQA0YqvJMY921DJJtJWMEZb8/r9OaZczNEjpBskudhZIi4G7HHJx05HNV9P04wO1zdOJr2UYkkxwo7Ko7L/M9aaQi2kXzs7sZPmJTcB8mRjAPHoeevPWrdFFK4xvG2jPtRWVq+r2miWT3V3KFHRFHVjjOAPX9BQk27ITdibUdTtdKtHuruURwqPxJ7Aep9K4aG11Hx7qAu7vzLbRIm/dRA/wCs/wA+vboPWn6dpmoeNb5NV1gNFpiHNvag/f8Af6ep79sCu/iiiihSKJVRFG0IBgAdMVtpTWm5nrN+RWc2mj6VI4QR2lrEzFUXoqgk4FeQ3upXPjXUPtt1+70yFyLe1DdT/eb3/wAfz9pZQ6kMAykYIPevK/FXhW48NXUms6NEX09jm5tVH+r9x7fy+lc1ZTlTag/eOmg4RqJ1FoVp54LO3aWVgkaijw94efxPMNY1j9xokB3RRMcebjufRffv0p3hvw1P4ruBq2qo8ejw/NFAes2O/wBPp9BXo7aat5cQs7IdPiVTDaohUE9i4PYcYXpXPhMIqPvT+I6sbjXW9yHwlyJFkWMRKqWyhWgMTEZAHQgdvbuPpS31lb6jayW9zCJYpBgqR/n/AB4q4BRiuy7TujgsrWPEvFHhW48P3Rdd0ljIcRykfd/2W9D/ADrR8H+Mm0opYagzPYk4Ryf9V/8AY/yr1C7tYL21e2uEWSKQEMpHBB/z9c15D4r8Jz+H7gyxBpLFz8kh6oT/AAt/j3rtp1I1Y8k9zmnBwfNE9kjdZEDoysjDIIOQR/8AXpZJFjQs7KqrySTgD3OeleQeGPGN3o6Cxdke2Y4VpcnyvfA6jnpXpMOkwXqx3N/Kt87YdM/6pe42rkj8Tkn1rnq0XB67GsanMtB3/CQ6UOt2qqejOjKp9wSMEe+aoyeLbM69ZaZaeXeC5HMsEysE+uM9gT9K6Ufe57e3WuE0f/ia/ErU73rHZJ5KY7Hhev4PUwUWmxybR3vaiiiszQKSloNACUUUUAJRS0lABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUtJS0AFFFLQAUUUUAFFFVL++t9M0+4vrpxHBbxtI5PYAZOKALVLiuL8IW95rLL4r1YyrNdKfsVoX+S1gJ446FmGCWPYjFby69pEllPeJqlk1rA+2WcXK+XGwIGGOcDqOD60rhY1Nv8qQL8v4Vz2u+MdI0KJGuJpJ3YxgR2y+YwDsArEjhQexYjODjJ4qXxFo02q2iTWN1JZ6nakyWk6no+PusOhVsAEHIoA3+KzbjUEiuorRUeW4kOTGmDsTOCzHsPT1rL8K+Jv+El0RLkQpHqEL+Te2xfBhkDYb16YJAPXjnvWxbWNvZ+cYVO+Z/MdycsxPqeenaqQiaOIopzKznJILAZGSTjjAxyPwqziiikMbRRisDxJ4mtfD1rlz5ly/EUCnlu3PoB604xbdkS3bUm17X7Pw/Ym4uTlycRRKfmkPoPT61y+k6Fe+KNQXW/EAIg621oegX3Hp0+v0qTQPDd7qt8Ne8R5kmY5gtm+6gzxke3p+fNd6Pr0NatqCtHchJzd3sIiKiBVUAKMAAdB6VJSUViagao3t5DZQtcXDhI1HcHn0AHc89P0qeSXyInch2CjJCKWY/QDr+VQNarPKstykbtE+6AhT8uRj8+vP6UxMjsfNuIUmuLc220kxRBz8q9BuAwM+3OP1rRNApaACiiikMM1WubWG9tXgnRZInGHVh1FWaShNp3Qml1PGPFnhKbQLgzwb5LBzhXPVD/AHT/AI96k8JeL5dDlFrdFpLBj07xH1Ht7V65cW8VzA8E6LJE4wysMgjp3rxzxr4cHhh/tMTb7OZsRgn5g3933+vp+vdTqxqR5JnNODg+aJ65NfQJpT36uskCxNIGB4IAJ/pXL/Dm3YaPc37/AOsu52Yn1A4/mWryyLU9beyFsb547Qgj7MpwpB6ggdfx5rtvh/4vcXUXh7UYkQEH7LInfqdp/Xms50XCDsUp80kep0UUVynQFFFFACUUtJQAUUUZoASilNJQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAClpBS0AFLSUtAHG+KPFt9oerabpWmaL/al5fLIyR/a1g27AD1YEHqfSn+HvGEuq6rdaRqujzaTq1sgmMDSrMjxnA3K68H34/Pmue8df2r/wsXwv/Yv2P7f5Vx5f23f5X3RnO3npmtrw54Y1aDxFdeIvEV1aS6nPCLZIrNGEMMYOeC3JJIB56epqYvS4SDTvH8Oq+K7XS7XTbj7FdRSPDfynyxLswSUQjJXkfMcd8VW+K9xJ/wAIlDpsLbX1W/gsic9AxLHH/fOPxp+qj/i7vh0f9Od1/JarfErI1jwWXP7n+3Yd/wDvZGP601qkw6nY39xp+kaLJJemOLT4IwrlhlVXgAEenQVwFo+lxfEG6a9tRFpmpW0clhC6ZSdl/dEiPGSSpGBg/Kc8Z49R524o4/xpJah0sedfFfUtPtPDkdlLd28c/wBot5FgMgDlRIpLBeuBg847V1L6uNTSNNEnhuPOUsbyNhJFGuSCcjIZsgjA9Oa0FuVuJSLZo5BFJ5c+GPy8Zx7np9KmjiEcQiBYhQACzFicccknmqj7onrscH4VJ0f4oeJ9FDNJDcQw36Fzk7toVyT0ySeeO1ei153Du/4X3ceV0/sECX/v6uP6fhXohoGN+lBoH1rlfE/ikaRt0+wX7Rqk3CRqM7M9Cf8ADvTjFydkTKViXxP4pg0KEQxAT6hKMRQAZ69z6fTvWf4c8LTvdf25r7GbUXO5I25EXp+P8qk8NeEmspv7V1aQXOpyncS3Ij+nqff8B612NaSkoLliQouTux2BRRRmsjUbn5ar3Mz29vLKsMkzKMiOPG5vQDNRXF7DbSwwsxMsz7UjAyT6nHXA6k+lPihw6zS+W0+CocJt+UnOOfw79s0CKmnWtyJmvL5ybmQYEStmOJeu0epzjLevoK1c0GjpTuCQtFFFIYUUUUALRSUtADcdq80+LtvMdN026AYwwzkOAOBuAwT+RH416X171R1K2tbzT54L1EltmQ+ardCo69Pp/KqhK0rkyV0eBq4fBUghhkEd6taDE95420eK3DF451kcgdFBDH6cA/nWdNbod8VqXjjaQlB1IGTge/X9K9m8I+DrDw1biVQ0l9KgEsznkZ6qAOgz/KvQxFTljZnLSheR1n8NFLRXmnYJRRRQAUGio3dY1LMQqqMkk4wPU0AH8q5SzvtbvfFs8XkfZdMtcq4kTJk9CCO59u3vV/SPEllrd3dwWiyMLY483b8jj2P9Patw4qvh0aI+IfSUopKksKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooABS0CigApaQUtAGHe+HrS/17TtamlmFxYCRYlUjY28YORjP0wRWywypGSM96UGlFK2lg6nnz/Cy2lu0vX8U+KjdRBgkx1AF0U9QpK5Gfr2o+Juny2/gS2uoWmmfRrq3uw0h3O4Q7SWPc/MST3xXoNVry0gv7G4srlA9vOjRyKe6kYP6U0HW4xrgz2P2iy8uUvFvh3sQrEjK5IBwOecDpXDXviTXv7E8R20k1nFqWmzKiPDGwEyuoMahSxIZmOOvfjtTPD2sjw9pr6JrM+/SbOORYNTKybZoQQqruAwGXJU89hj1q7puhpq/jW88RI5k0lhD5Az8txNGGAlB7qoOAehI3dACSzTDdFDxgNa0fwhZyxaiLEq9skkFinlhnaRQ+XJLEZ6YweuS2cV6SvOD7Vy/jHwzf+KLJLGDU4LK2V0kbdaGVyytuGD5gGOBxg/XmpdW1XVdI0eO3ihXUtbui0dsLa3aOLP8AeYFm2qvGSW5PTrQutxW2MTwvGdT+KXivWR/qLVItOjOerABn/IgfnXf9F+lc/wCE/DyeGtBisPOM07M01zOes0rcsx/l9AKyfEHie4uLsaJ4fzNfSHbJMvSId8H19+g+vSoQcmKUkiXxN4qe2uP7I0ZPP1SU7SUGRFx+p/l3qx4Y8Kpo6m9u2+0anNzJKTnbnkgf496n8OeGLbQLcu2Jr2TmWc9TnsPb9TXQ4q5TSXLEmMbu8h9FFGayNDPTU7SXUpdOW4Q3cS7niB+ZQcHP05H51K8uMbUZySoIUjjJxk57evtXBRy3MfxT1YWkPmTvbKi7jhV+WPLN7DFd3BD5aiSXY85RVeUJtL49vz496uceWxnGVyGz05ba4luWd5biU4Msg5C54UAcAD2+vetHNAFGKkuwtFFJSGFFFFABRRRQAtFFFACCud8a3wsPCl44JDyoIU/4EcH9M10Rrzf4pX3/AB46eD13TuM/8BH/ALNWlGPNNIzqO0TkfCtj/aPiawgIyglEjj2X5j/LH417t6V5d8MLHfe3t+w4iQRIT3J5OPwH616eT0rXFSvO3YiirK48UtJS1zG4UUUZFAEZPzelcD4g1a58R6h/wjuiEmIf8fdwPugZ5X6fz6Vf8YalqTvBoulQy+feA5nAwqr3wfUd/T8a1vD2g2/h/TVt4gGkbDTSkcu3+HYD/Gto2iuZ7mUryfKiXRtJttG0+OytlIC9WI++e5PqePwFalL/ACpONtYt3dzRKysOpKWkoGFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUALRRRQAoooooAKKUU0theaADiqbj7YrIVxAd8ckckZy3OMg8cdfqD7VSltrrVL3/SN8FjC/yRg/NOw/iJHReOnU9T6VsAY/+vT2FcZHGkUQRFVEUYCqAAo6duOKnooNIZi65r2n+H7H7XqEzRqThEXlnPoo7/j0rjF+L1l5vz6TdLAf+WgcZ/Lj+dc98RbiW78dNbzFjDbQqI1J45AJP6/pWDgHg9CMHI612UcMpxuzmnVaZ6TqXii58SyppnhrzD5ygy3JBXYp7e3Xk/lXR+HfDtp4fstkK+ZOw/ezEcv/AID2FeffCu4lj8R6lYLuNuYPMxnhSGAGP++j+VevDjFZVXy+4jSGvvMdRRRWBqNP3arNL8wWJSx3YYgj5PlJGf07d81XvZLiVPIsHjWUuElkYg+UCM5x3OMYB9RT7OyisIRFCDjO5mPLOx6sT3Pr+XtTtoLU47SVKfFXVVdzIVs1Bc4y2Fi54/pXen+lZcWh2kGuz6wiuLqdPLclvlIwo6dvuitMmnOXM0TBWJKKQH5aKksKKKKACjNJRQAtFAooAUUGgUUAMxla8S8bX32/xXekfchPkrz/AHeD+ufzr2TULtbDT7m6fhYY2kPPoM/rXgEaTX96qfemuJQM+rMf/r12YRWbkc9d9D2D4f2H2LwpA7DD3DNMeOx4H6AV1NQWsCWlpDbJwkSKij2AAFcDqi3/AIr8fXuhprOoaXp2mW8cj/YJfKllkcZGX5+UDtiuSpK8rm8VaJ6LQP0rzDwRLrk/jjU7G91a4u7TRIPsqs0h/fs7FlZx0LhRtJPNdhpuuX1xrUum3+nR2kogW4j8u5835SxGHG0bW4HA3DrgnFSvzD9DewN3XtWPPr+n2+tW+ku5+1TDKqBnb6A46Zql4r8SrodqsNuBJqNxxDGBnHbcR/nNQ+FPDTacj6lqJMuqXPzOzHJQHkgfXvWsYJR5pEOWtkdbgelLRRWZoFJRRQAUlLSUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUtFFABS0lLQAUUUx5FTG5gNxwMnqfSgCG5uYbO3ee4dY4kGXJPSq8WL+JJnUm2kVWEE0XzA5zk5/Dj2zTZLFb26guLlZAIRuS2cgqr5+8cZBOOnPFaWPlp6C1HUUUUhiE0x3VELMQABkknp7073NZXljWIriK5tZI7QOAoclWlwcnK8EL0wD1HamJnG+OfCd34guotX0gRPIkI5En+vHJAHbj1zg5HPFcGNF8SPKYV0C8EnTJiYL+eMfrX0AiBECqoCqMAAfpTzj61rCvKCsjOVJM4rwF4Ql8PWs9xfFXv7kjftOQi9l9z3NdrRzRn5TmspScndmiSSDPy5rNF6t5cXFpB5m1EZZJ0IwjdNo9W6n2xzUrt9sRoomDQMHjeRJCGRumB9Oec8Y96da20NpCkMCLHGgwAB0/wA9/wA6ELUtKML6nufWnUUGkUc1aa/LceMr3RDAgit4RKsgOWbhOP8Ax410PG6uH03/AJK1q/8A16L/AOgxV3BI6Vc1ZqxEHcfRQKKgsKSlNJQAUUUUAApaBRQAtFFFAHHfES/+x+GWgU4e6kWMe4+8T+n61594MhD+JbeZoZpUtwZisSbiMcA4+pFbXxOv/N1a1sQflt4i5H+0x7/gB+dafwt0/Frfagw++4iQn0Ayf5j8q7o/u6Gpyv3qh18OsWNxOsHmvDMx4jnjaNj7AMBn8Kwdc8HXd54iGuaHr0mj6g8XkTkWyzrKoxjKsQMj19AK6m4tYbuFopolkRjyGA5/z+YNZ7Nc6OjMS9xp6jJLkmWEDvn+NR+f1riaT2Om7RzegfD++8Oa0b+x8R3DR3ADahDcW6yG7lG75t2coMt0Hp1p7f2j4MtLvUdQv7fU5bk4LJZPHLJJ/CC/mMAijI2hR+ZOep1HWLHSrVLi8uVjidlVWHOc+nrx1qziK4hHCSRthhyGB7g/4U1o7sTs1ocn4X8PTyXDa/rP7zUJjuRGH+qHbjsfT0FdkD+B6/SnGm7RyMfWicnJ3CMbElJRRUlBRRSUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRS0AFFFFABRS0UAFFFQSzrEuCQ0jAlI9wBcjnA5oAr3t7Bp9r50xYKDhVAJZ2JwFUdz6VFYLdXAM2opGpZw0UAXPlY4GT3b37frVmNWPzvvBbaRG2CIzjkA9T7/pirQxinpYQ6iiipGJUFzcw2lu887rHCgyzk4wPUmkuZ4reIPNKkaEhQWPGSQByarRQ3Ut1O1yY/s5+WKFRuwAfvMfU8cdh3zVIVyNYv7Ue0u/MuI4FHmCBhs3N2Z+/wBF6c5PpWqKKKQBRRUMkixoWchVUZJPQdzkntQMkLfrWO0l1qF75UO+3tIXxJIRhpWHVVB/h7Fu/QetW4phqCK6MGtHVWR0YhiQc+3B4+uferv8qexO44UUUUigooooA4TTv+Stav8A9eq/yirtyRWLb6BFb+JrrWxM7SXEflmPHA+6M/8Ajv61slaubTsRFWJBRQKKgsDSUtGKAEooxS0AFFFFACcUtNH9Ky/EN+dM8O3t0DhkiIQ+jHgfqRTiruwm7K54z4jvv7R8RX90CSrSsEJ/uj5R+gr1/wAIWH9neF7CErtdk8xx6lvm/rXjOk2R1HVrSyAyJpVU+wyM/pmvoBAqKAAAAMAAdK7MU7RUDnoq8nIefaqOp6ha6XYy3V2yrCg5B53egHqanubmGztZbiZwkca72Y9gK8/ghufHutfaZ1ki0O2fCR/89D/ie/p0965oQvq9jacrbbjfD+izeJb2PU9QV00qAkWds5yCueB/ujp74HYV6MABwOmKjjjjgiWJFCKowoA6CpeO/NKc+Z+QRjyj6KKSoLCiikoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiloAKKKKACloooATNLmkrN1DU1tJYrdImnupj8kCkZIHVif4VHrRZiuizNMsbBQyecwYIhbG4jkgcHj1PaqNhprR3H26+cS3rjGQPkiXj5Ez29+p/LGhHEU3ku77nLYY528DgcdP8asU07ALRRRSGJn9KrzTCKKSXa7hVLERgljjsAKgvtQg0+JGlLF5G2RxINzux6BR9OvakisyNQku3lkd2ULGhPyxrwSAB3JHJ607CuRQW5v1t7q/tFjuISzJGX3bM9DxgbgMZ9DnBrVpaMUmAlJS1Uu7mKzt3nmYRxIMszHp/n2+lCQMtVkXFn/arxNKzfYQNxtyhUyN2357dDjv3p9lJNfr59zbPEgkDQIzEPtxjLjPHfj0960yMrT2FuIqhFAAAA4AA6U+iikUFFFGaACikzRQBhW+vxXHia60TyXWS3j8wyZ4P3Tj/AMe/StomuI07/krWrf8AXqv8oq7cqKuaSsRB3HiigUVBYUUUUAFFFFABRRS0ANH3vwrhPidfeVpNrYqfmnl3H/dX/wCuR+Vd30avH/iHf/a/EzQKcpaxrGAP7x+Y/wAx+Vb4aPNUMqztEk+G9ibjxG90R8trEWBx/E3A/wDZvyr1aWVI0Z5WCKo3FicACuP+G1j9n8Py3p4NxLkEjqq8D9d1U9X1G58Yav8A2FpMmywjObm4A4b/AOt/M+wq6y9pUfZEwfJE7azurTUbRZrZ0nhcYDA5z7H/AOvU1vbw2lusMESRxqMKiDAH4VX0zTbbSLGO0tUCRJ+Z9z71d43VzPey2Nl5j6KKSkMKKKKACkoooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAopcUYoASlxRRQAUUUtACUtFFABRRWVqV3dI8dtYwFriXJEjg+XEvQsx79R8vc/nRqJswfEEOoJ4giewup1ZrZmNvHLjeVYZwDld2GB5HQfjWpoMGWlv1uo7tbjBMjRbZQw42sc44/u7Rg1di05USz86eSWa1csJmPzMSCDn/vo8ew9Kq3lnPZXT6lpybmbm4thwJh0yPRx+vQ9jWnMmrEcrTublLVKyvIdQtUuLd9yN68YI6gjsR6e1Xazs0WmFVJblEdId8fnSA7Iy2C2Offj37ZqO+uZre3JtrZ7idjsRAcAH1YnoPf8AxpYbREma6aJftToqvICTwOdoz0H5Uw1G2EVyluPtzxyXBbcdi4WPIxtXjnHqfU/Sr5pRRSYWCiiq8rmNGIBkOM7R1OPyH6igYSyCOJ2wWCgnCjJOB0A7moPJW52vOiSIHWSJWjw0bY6nryM/UZ/GqljZ3M92NQ1AlZgCIrdWykKnrkjq3HJ6dh77GKewtxaKKKQwpKKKACiiigAoNFFAHC6b/wAlY1b/AK9F/wDQYq7cgVz1poMtv4yvdaMyGK4hEaxgfMvCc/8AjproeN1XN3tYiCaH0uKM0VBYYoxRRmgBMUuKKKACiimMwRSzEBQMkk4xQBHJKkcTOxAVRuJPYDmvAb+6e/1K4umyXnlZsfUkgf59K9K8V+NtFTRb61tNShlupE8oCM56nBwRx0zXCeFbEan4lsIMBo/MEjEHgqvzH+WPxruwy5YubOWq7ySOsuby5uLe08IaL/rEiVLucHhP7wyPfOfyrs9D0a10PTVtbZeeryEfM7ep/wAKsW+n2lpcTzwW8ccsxDSsowW9M/rVzPtXNOpzaLY2hC24+iiisjQSiiigApKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAFopaKADFFFFABRS0UAMox6UAdTntWOt7FrMV7babdvHJby+RNKIj8jA/Mq7uCQO/I5FJMTLQuluJpILV43lhdRMDn5Qe2fXGcenFWYI1iQKu4DJIyxYnJJPJ59f8iorKzh0+1W3tkCIvXuST1JPcn196udKoEh2KMVQn1C1tr6zsZptk92X8hNpO/Yu5ueQOPXrV/NIZhXdnPZXT6jpqFmbm4th0mA4yPRx+vQ9jUy6zaGa0hXzGkuVDhSuCqnPzNu6dMetS3Vw8qT29jPCbxApIcnCAngkD2BOO/FJLpsVzp62t2zTHaA0pwHLDowI6HPPFX01J66D7CxFkshMsk00r7pZJDy3px0A9h0q9WJY3c1tdLp2ouXlP8Ax7XBGBOB2Pow7jv1HetupkhoWkIpc1Wnm8vIRTJIBkRqRkjIBPPpnvSsMr3uoQ2CxmUszzOFjjQZd2PYD+fapUhO8vNskkVmMZ2DKKRjA79uT39Kgi06KLUJb1meW4b5VaTH7tePlX0H6mtE0xai0UUUhhSUUUAFFFFABRRRQAUUUCgDJi1u0m12fSELm6gTzHBX5QMKevf7wrTNcRpv/JWNX/69F/lFXcZz+VVONrEQdzn/ABZ4hHhrQXvxbm4nZ1ht4gceZIxwATXHav4y8beF7dF1nTtJkuL0Klg1n5hVZtwBSQMcnIJIwcZXvXTeO9AvfEGgpFpzRrf2s8d1bCQ/IzocgE+4z+P51yWuWnjzxJNpuoyeHLWzGkXEdwli16kj3cm4AkMPlUAZ6n86zje5o7Hoc+tWNldWlje3EaXl1gJEASWOPQZwuQcE8Z4zmtQKNox6VyGsTaxe2+iS/wDCPXbTxTpc3EUM8DCLAYFNzOu48jkDGO9dZGS6jIZCRkg44+uMj8jTRJPRRS4pjIwa8y+KetXCPZ6JbStGlyDJOQeWXOAvHbg/XFehX95Bp1pJdXMvlxRjJJP6fjXiPinVpvEOtpf4WOOEbUUjouc8+p/xrooU3KV+hjVmkrGV9itkTb5QJxjJ6n8a6n4eXwtvGqWjxxkTwMsbY5UgE8fgD+VcoNRthklzuzjGOv0rs/hrod1ea6dfnieK2hQrAWX77EY49gCenrXXXlFQsjGmm3c9gooorzDsCkoooAKSg0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAD8UUUUARMfl64J9q881DW/Et3r2s2+lQ32/T2jSCG3Fr5UhKbv3xlYPhs4+TAABwSa9DOegNcjqug3Op3pmu9I0a+aLKxG5t1dpFJJHJB24z0Gc89M1LdmaQjzaXMy+1bXXbxZdrqclqmkwhoLZIYmAc24ch2KkkBuRjHuSMCp4rvWH1PRtKm1y4RtQtpLx7lYIQxZQn7mIFCAvzFjuDNhever76bq6JcKbXTJVlG2cGLaLsEbcv1xtGBg7sgY4pl5pWqahCtpe2Gl3lvauAkNxBlJflwGAIITbnHfPPSkpPsX7Fd0YOmeItd13VdM0ldSkhiY3kc9/BBHm6ETKEZMqygkYyQCvzHA6YrwalfaJaXdpponDXXiOS1MkQjMqqEU4XzCE3HAHzcc9M4rrI9N1i0a3MFrpbGyQxwFYvLyrYztxnywMDgZzjtxhkmkaq9rcWz2OlXEDvumjeEBbpjg73GCARx65x24pc2oexVt0Zrar4m0u3hvdR+0xWNvqCxytdJb+bLbyALufyiVUo56rjI6iqQ8R+ILy40tUa8EOrSXNzCLJLfzVhTaI0UzYTkHec5bnjFbcGg31lYzWNvpuii0Y4lt47YRx3WRgllAwMcDHOcdqfc6PqV3aR2N1YaRd2lrgJBNB+7k4wCFIITaOwznB6U+bUPY+aM2KXVpfEHhD+2oHjvElvlJcpvkQRkKxCEqGK4yAcZziuzuLi5F1BBb2+9WOZZXOFRRjI9ye1cnbWN8jfYdPtNMjGnBljkt7cRqrP97YQD5bYPIAOec4zXW6fa/YrKG34bYmCQDyepPJPUnPXvVpmU4cvW5Jb20Fsr+TEE3uXcjqzE5JJPX8at0ZozRqQUNRtra7sniudvlj5txbbsIPDA9iOxrAvNSurCCKK6nPmwypKk6nC3UIPzA9twUkkd8ZHt1EkayoUdVdWGCCMg/XNc9qPhjSLyJ7eK3KFmXfHbS+XsBP3ioOPXtk1cGupMvI0NR1I2zJBbxedfTZ8qEHA/3mPZR696sWsEscUTXLpLdBdrShAucnOB7dPyp9tb/ZreOIyySFBgPIRuI9yP8APFWqm5Sv1FooopDCkoooAKKKSgAzS0lFAC0UUUAFLSUpoA4XTf8AkrWrf9eq/wAoq7cfeNctZaPdQePdQ1d1T7JNbhEIbknCdv8AgJrqhV1HexENLjsUtJS1BYUlLRQAwnpx1qtd3MNnbvcXDrHEgyzk8DH+fxp000dvA08rqkaDc7E4x7815D4t8Vy67dGCAtHYRn5VH/LQj+I/0HataVF1H5GdSagiPxV4om8QXu1N0dlEf3UZP3uvzH3/AJVqeDPCJv3TUtQQi0U5ijI/1h7E+386h8GeETq8q398pFih+VD/AMtT/hXqyIsSBVAVVAAAHA7cCumtWUFyQMacHL3pFF9A0eSb7Q+k2TzDnzGtkLfmR7nvWgkaxoFUAKAAAB0x04qSkz9a4rt7nSkkOpKKKQwoopKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAfRRRQA0CmuyohZmChRkknoPWopZ4reF5pXWOOMZdmOAB171XhkXUYUm2uLZ0ZTHLEBvyQA2D2xkge/TjFAiteWl1ql61vOGh05D8wDDdcHg4yOifqcfnsAYXA4GKXilzQ2CQtFFFAxvRay5JJdTWM6feRpbiVhNIgy3ynlVzxyeCfansZ7m7mtng2WQTazufmkYjomOigHr3Jx71biiighSKFFjjUYVQOFFPYROBilNGaDSGJSZozWX/aYn1JrG2V5Co/fzA/LFxwPdvbtnnsKEhXH3kk8kUkFhLF9qXaD5hJ8tWJ+bA6nGeCecUafp0VhCVQtJI53yzSctI3ck/h+FWoovLiRNzPtGMsck44yfXPepjTuA6koopDCkoooAKKKSgAooooAKKKKAFFFAooAKWkpaAMK41vZqrafawrdzxRh5Y1lCuvTs2B3Xv36VastUtr9Sqkxzj78EuFkTtyuf16Vy+mj/i7Wr55zaD+UVdbd2FrfrturaOTbypYcr9D2/OtJJKxnFtlzP40orFGn3Nl82n3UjqvP2e4cujewY5Zf1HtVqwv2vPPSWB4Z4XCyRlgcZGQQe45/OosVc0ageQRoWZlRVGSScAAe/tT3ZUUsSAoGSSeleUeNPGB1F307T3Is1OJJAf9afTP93+dXSpObsiZzUUReM/Fx1mY2VkxWwQ8sM/vT6/7tQeEPCcuu3AuLgMlhGfmb/nof7o/qai8KeFpvEF1vl3R2MZAeQdW/wBkf54r2O2toLO1S3t41jhjG1FA4Arqq1FSjyQ3MYQc3zSFhhigiSGFFREG1VAwBxjFTkUAigmuFtvVnVsLSUUUAFFFJQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAvpUMsqQJud1QAgZJxjpj88/rUV9dxWVrJcTEqijJIBzzjAA7np+dVrA3dyslxeqI43IMVsQCUwcgsf7xOOOgx+NOwr6jriwTUXie6WQJDIx8gsCjkH5WIHXpkAnjPqK0ulLmikAoFGKM1XmnitoXmndY44xl2JGAOv4UDJGZY13EgKoyST0rJ/d+IbIE/aI7PzM4xt+0KBx77T+Gceh5nVLi5vY7lbkJZBAUjUcyEjq2R056f4Vo09hbigBFAA4HQCnGiikMjI9v1o5/wqOaURxM7dFGT+ArxqXxT4x1Pw7qPiqPVYbHSkDGCzaFQrgMFC+Z94sec4I5IAPUBLVg9rnsO8yuUhKkKxSUknK/LkYx35Hf9abaWcNlbrb28QjjU/dz1z3JPU+9M0u4mu9KtrmeIwyyxK7xk/cYqCR+H9Kuk/wAqpslaq4+koopFBSUUUAFFFIaACiiigAooooAKKKKAFFFAooAKWkFLQBwum/8AJWtX/wCvUfyiruM9q5Cw066j+JGpXz27ray2yqkh6McR8fofyrrx6VdR7GcOoH3rOudKtbybz5VkSYLtEkMrRtgHuVIJxmtHjB/WvNvG3jHHmaTpkpyPlnnB6dtq/wBadOEpuyHOSitSh4s8WXBSXRrS7M0CHa9yPvOP7pI4PfJHWsPw34dufEN95KZjt0OZpcfdB7D3NVtE0S613UFtbYcdZJCPlRfU/wCFe16Tpdvo2nx2dqmI1GST1du7GuupNUY8sdznhB1Hd7E1lZQadaRWlumyGIBQB296uUtHtXA227s6kklZC0lLSUDCiiigBKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAK0IlLLNLuRmQAw7gVQgkk5457GrlGKKYgpKWqd3dxWVq9zNnYgycAknsABzknI+tICyeMcfrXNHUjKzDXtNa1gEgaLchkTjuWGQOexArTjtVvZba+uUmRlXclvIwxGx7kDq2OB6Vp7fy9Ka0FZshililiWWJ1dGGQ4OQe+c9OanFYq/wDEnu1i62V1LhB3hkbnH+6xGR6E+/GyDmhjTDOFpGcIpZsBQMkk9KdWTe2R1fy1llkjtAzCWAoVMuDgAn+6cE4xyCO3UQMS5uE1DSpXt3WS0eGQFhkE44G0+nB5+mK8v8M+G9E1P4W2Os3pkgvrGCYRX0Vy8bW+JHORhgMgnuO9et3MP+gyQwqBlCqqABjjAArznwj8KdFXw/YS+IdBQ6tGSZd07EHDnbkK2w8Y9c96i12x9Dp/h7qN7qvgXSr3UWL3LxfM7DlwGIDH6gD866g8rVeGJLeFIoUWONAFRUGAoGAAAOg+nHFWOrA1TElYfRRSUDCiiigApKWigBKKXFJQAUUUUAFFLiigAooooAUUUUUAVhPCZjCJYzMoyUDfMPfGen+NT4Az71w+nf8AJWtWP/Tqv8oqTxn4wGmI2nWDA3rDDyA/6kf/ABX8q1VJtqKM/aJK7IfG/jAWaPpWnP8A6QciaUf8swf4R7nv6fXpweh6Jda/qC21sDjrJIRwi+p/wpmk6Td67qS2tsCzscvI3RR3Lfn+te06JolroWnpbWw56vIR80jep/w9K6pSjQjyrcwSdV3ewzQ9DtdAsVtrZSSxy8h+87epxWzRSEjbXC227s6kraIdRRRSGJRRRQAUGiigBKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAJKQ0E1VuZnihdkiMsqqSkakAtjsM/55oQhtxcwW3l+fKEMjhEHdyTwB3/Lp+Gaitbe5S4nmubjzN5xHGvCIoPH1J7mktbd5EguL6GE3qBhmMcJkg4BPXtz3I9DWhnOcU9gQ+g0UGkMzdXtWvNKuIYjibG6I+jqQyn/AL6Aot9Qgl0pNQZxFCYvMYufuDHIP0/nV/Fc7YIP7SvLGeP/AEWVUuooJUHykklvycbsdi1UtUS3qXbGebU1eWa38u0YqYQ+RI2DkOR26DAxnjn0rV6UmMf0oNS2NDqKKKBhRSUUAFFFFABRRRQAUUZozQAUUUUAFFFFABRRQKACloooAQ4rnfFPiyx8L2iy3IaS4kOIoEPzP6n2HPWuixXiPxAZ5fiA6z/cjgQRA9xjPTtyT+VaUo88rEVJWRA/jPUI9WvNchtFS5uovKKA/wCqGFG7nqfkH51naXBc+IL1YbYNLPK2WLH7vqzHtTB98/Suo+FW5PFupRIP3Bttx9m3Lj+bflXoVP3Sujlj77sei+HtBtvD+nrbwDdK3MsmOWb/AA9PatyikrzJNt3Z2JWVkOooopDCkoooAKKKKACiijNABSUUUAGKKWigBKKWigBKXFFFABRRilxQAlFFFABRiiigAxRiiigBMUUtFACUUtBoASjFLRQAYoxRRQAYoxRmjNAGDceKLW3QbbXUJpW+5GLKUFunTKjp+dMi1GxivZbpbfVJppOCzWUo2LxhV3KABwT6+9adhbS21uEnuHnmYlnkbpk9gOw9B2xV3HpVXSISbMr/AISGL/nw1L/wEf8Awo/4SCH/AJ8NS/8AAR/8K16KV0VZmQfEEX/PhqX/AICP/hUZ8QwDANjqIycAG0fnvgce36Vdvr2DT4fNmLFmO1I1GXkbsqjuf5CnLEZG3y4cZDIrKP3XGCM/n3709BanOW+oPcXovr+x1AFDmC3S1crF23Hjl8fgO3rUkmrq/iK0lSwv8LaTqR9nZSfmix1x05/Ouoz834dKP4v6U+YXKzL/ALd/6huo/wDfj/69H9u/9Q3Uf+/H/wBetTFJipuh6mZ/bv8A1DdR/wC/H/16P7d/6huo/wDfj/69aeKMUXQamX/bv/UO1H/vx/8AXpv9uNu40rUWPceSB+pP9a1sUYo0DUyTrc3/AEBdS/74T/4qk/tub/oDal/37T/4qtf8KPwouOzMj+25v+gNqX/ftP8A4ql/tub/AKA2pf8AftP/AIqtb8KPwougsZH9szf9AbUf+/a//FULrFwWAXRtRY+hVBn8S4x+JrYz/nNGf85o0FYy/wC077/oBX//AH8g/wDjlJ/ad9/0A7//AL+Qf/HK1s+9JketAWMr+077/oBX/wD39g/+OUf2nff9AK//AO/sH/xytXI9aMj1oHYy/wC077/oBX//AH9g/wDjlN/tK+/6AV76jMkOP/Rh/lWtketLn3oFYyf7U1L/AKAkv/f+P/Gj+1NS/wCgJL/3/j/xrV49aOPWnfyC3mZX9p6j/wBASb/v/H/jXJeMvDl74o8q5g0yS1v4RtSQyxkOOyn5vfr2ya9BAp38R9aanZ3QON0eF/8ACEeMz+6/s2Nf+mnnx/8AxVdz4P0G68LWUinSZbi7mO6WbzYx06KPm6D+dS6dNIfihqsRdzGtsCEz8vSLt2rtCa1qVZbMzhBdDN+36qf+YP8A+TK0fb9W/wCgP/5MrWpn3oz71jfyNLGV9v1X/oDj/wACVo+36t/0B/8AyZWtXPvRn3ov5DsZX2/Vv+gP/wCTK0fbtW/6A/8A5MpWpketGR60X8gsZH2zWv8AoEQ4/wCvz/7Gj7brX/QHh/8AAwf/ABNa+R60ZHrRfyCxk/bda/6A8P8A4Fj/AOJpPtmtf9AiH/wLH/xNbGfejPvRfyFYyPtet/8AQIh/8Cx/8TSfatb/AOgRD/4Fj/4mtjPvRu96L+QW8zHE+tn/AJh1kB0wb58/pGad5+t/9A6w/wDA1v8A41WtketJketK4W8zK8/W/wDoHWH/AIGt/wDGqPP1v/oHWH/ga3/xqtXI9aMj1ouFjK8/W/8AoHWH/ga//wAao8/W/wDoHWH/AIGv/wDGq1cj1oyPWi47GQbjX/8An105R6ee5/XaM/lR53iH/n307/v6/wD8TWxijFFxWZkeZ4h/599N/wC/r/8AxNJv8Q/8++m/9/X/APia1sn1oyfWi4WMnf4h/wCffTf+/r//ABNG/wAQ/wDPvpv/AH+f/wCJrWyfWjJ9aLhYyd2v9SunL7Zc/rgfypc696af+T1rYFGBRcLGT/xPv+of/wCP0uNe/wCof/4/Wpkf3R+dGR/k0XHYysa9/wBQ/wD8foxr/wD1D/8Ax+tXI/yaM07isZG3xAcnzdPT2KO2fxyP5Uu3xD/z8ab/AN+pP/iq2MUlK4cpj7fEP/PfTf8Av1J/8VS7PEP/AD8ab/36f/4qtiii4cpj7PEP/Pxpv/fp/wD4qjZ4h/576b/36f8A+KrX/wA9KWi4co+iiikUJVWWby1IXDylWZI8gFiPT/PGar6jqP2NURInmuZjiKEH7xA5yewHc+lOs4p0hBu3WW4ySWVAAuf4V9hxjPXFOwr6iJp0P9oNfPvaYoFQSHIiHGQvYZ7mtGkpaVwCkNLSUDCg0UUAJRRRQAUUUUAFFFFABS5pKKAFopKKAFzRmkooAXNGaSigBaKSloAKKKKAAUtJRQBw+nf8lY1b/r1X+UVdv/hXD6d/yVjVv+vZf5RV2/8AhWlTdGdPqOooorM0CiikoAXNJRRQAUUUUAFGaKKAFzRmkooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA/9k=\"}]}"},{"id":2103,"title":"Simple Robotics 1: On track?","description":"As a small extension to problem:\r\n\u003chttp://www.mathworks.com/matlabcentral/cody/problems/2100-distance-to-a-straight-line-2d-given-any-2-distinct-points-on-this-straight-line\u003e,\r\nimagine that Pe represents the attitude of a robotic end effector with 3 degrees of freedom (x,y and tht).\r\n\r\n\u003c\u003chttp://3.bp.blogspot.com/-Quk1HnM9BF4/UtU4GvT5NhI/AAAAAAAAAC4/wSltlKZRlok/s1600/ontrack.jpg\u003e\u003e\r\n\r\nThe end-effector (kind of orange) has to stay parallel to the straight line within a distance indicated by \"errorlevel\". The error levels for the distance are 1 cm (ridiculous accuracy) and .5 degrees for the end effector angle.\r\n\r\nWrite a function which returns true if the end-effector is \"on track\" and false if the position of the origin of the coordinate frame which is considered to be attached to the centre of the end effector, falls outside the area indicated by the dash-dotted line. Also return false if the end effector orientation is too far off from the direction of the straight line.","description_html":"\u003cp\u003eAs a small extension to problem: \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/problems/2100-distance-to-a-straight-line-2d-given-any-2-distinct-points-on-this-straight-line\"\u003ehttp://www.mathworks.com/matlabcentral/cody/problems/2100-distance-to-a-straight-line-2d-given-any-2-distinct-points-on-this-straight-line\u003c/a\u003e,\r\nimagine that Pe represents the attitude of a robotic end effector with 3 degrees of freedom (x,y and tht).\u003c/p\u003e\u003cimg src = \"http://3.bp.blogspot.com/-Quk1HnM9BF4/UtU4GvT5NhI/AAAAAAAAAC4/wSltlKZRlok/s1600/ontrack.jpg\"\u003e\u003cp\u003eThe end-effector (kind of orange) has to stay parallel to the straight line within a distance indicated by \"errorlevel\". The error levels for the distance are 1 cm (ridiculous accuracy) and .5 degrees for the end effector angle.\u003c/p\u003e\u003cp\u003eWrite a function which returns true if the end-effector is \"on track\" and false if the position of the origin of the coordinate frame which is considered to be attached to the centre of the end effector, falls outside the area indicated by the dash-dotted line. Also return false if the end effector orientation is too far off from the direction of the straight line.\u003c/p\u003e","function_template":"function y = isontrack(p1,p2,pe)\r\n  true;\r\nend","test_suite":"%%\r\np1=[0.218246;0.224576];%meters\r\np2=[0.769657;0.602542];%meters\r\ndirection=34.428783;%degrees\r\n\r\npointsx=[   0.350085000000000\r\n   0.375000000000000\r\n   0.770085000000000\r\n   0.753475000000000\r\n   0.609915000000000\r\n   0.290763000000000\r\n   0.301441000000000\r\n   0.301441000000000];\r\n   \r\npointsy=[      0.285805000000000\r\n   0.400212000000000\r\n   0.602331000000000\r\n   0.585551000000000\r\n   0.497839000000000\r\n   0.259873000000000\r\n   0.275127000000000\r\n   0.275127000000000];\r\n\r\norientations=0*pointsx+direction;\r\norientations(end)=direction+0.6;\r\ncorrectanswers= [    0\r\n     0\r\n     1\r\n     1\r\n     1\r\n     0\r\n     1\r\n     0];\r\n\r\nfor j=1:length(pointsx)\r\n    y(j)=isontrack(p1,p2,[pointsx(j); pointsy(j); orientations(j)]);\r\n    assert(y(j)==correctanswers(j))\r\nend","published":true,"deleted":false,"likes_count":1,"comments_count":0,"created_by":20079,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":7,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2014-01-10T14:00:37.000Z","updated_at":"2014-01-15T07:35:45.000Z","published_at":"2014-01-15T07:35: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\u003eAs a small extension to problem:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/problems/2100-distance-to-a-straight-line-2d-given-any-2-distinct-points-on-this-straight-line\\\"\u003e\u003cw:r\u003e\u003cw:t\u003ehttp://www.mathworks.com/matlabcentral/cody/problems/2100-distance-to-a-straight-line-2d-given-any-2-distinct-points-on-this-straight-line\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e, imagine that Pe represents the attitude of a robotic end effector with 3 degrees of freedom (x,y and tht).\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\u003eThe end-effector (kind of orange) has to stay parallel to the straight line within a distance indicated by \\\"errorlevel\\\". The error levels for the distance are 1 cm (ridiculous accuracy) and .5 degrees for the end effector angle.\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\u003eWrite a function which returns true if the end-effector is \\\"on track\\\" and false if the position of the origin of the coordinate frame which is considered to be attached to the centre of the end effector, falls outside the area indicated by the dash-dotted line. Also return false if the end effector orientation is too far off from the direction of the straight line.\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":2226,"title":"Wayfinding 4 - Crossing, level 2","description":"This is the fourth part of a series of assignments about wayfinding. The final goal of this series is to be able to calculate the fastest route through a terrain of areas with different properties. The assignments will build on top of each other, gradually increasing the complexity, but guiding you stepwise towards the final goal. You can re-use code from preceding assignments to save some work. See \u003chttp://www.mathworks.com/matlabcentral/cody/problems/2218-wayfinding-1-crossing [1]\u003e\r\n\u003chttp://www.mathworks.nl/matlabcentral/cody/problems/2219-wayfinding-2-traversing [2]\u003e \u003chttp://www.mathworks.nl/matlabcentral/cody/problems/2220-wayfinding-3-passed-areas [3]\u003e. \r\n\r\n*Which areas are traversed?*\r\n\r\n\u003c\u003chttp://i62.tinypic.com/358qa1w.png\u003e\u003e\r\n\r\nFor this fourth assignment in this series you have to calculate which areas are traversed and in which order, while going from A to B. Our path from A to B is a straight line. And the area boundaries are closed polygons consisting of a finite number of straight segments. Quite similar to \u003chttp://www.mathworks.nl/matlabcentral/cody/problems/2220-wayfinding-3-passed-areas assignment 3\u003e.\r\n\r\nHowever, now the areas may overlap. If case of traversing overlapping areas, the area with the highest index in |F| is the one listed.\r\nIf an area is crossed twice, it is listed twice in the returned vector. And if |AB| crosses first for example area |F2|, then |F3|, and then |F2| again, the output vector should contain |[ ... 2 3 2 ... ]|. That would also be the case when |F3| is contained in |F2|. But when |F2| is contained in |F3|, then |F2| is never crossed, as it has a lower index in F than |F3|. Consider the areas non-transparent and stacked on top of each other.\r\n\r\nThe inputs of the function |WayfindingPassed(AB,F)| are a matrix |AB| of two columns, each with x-y coordinates, of our straight path from A (1st column) to B (2nd column), and a cell array |F| of 2-D matrices with columns with x- and y-coordinates, each column a subsequent node of the polygon boundary of the area. The last node is implicitly connected to the first. The index of each area, to be referred to in the output vector, is equal to its position in the cell array F. \r\n\r\n AB = [\r\n   xA xB\r\n   yA yB\r\n ]\r\n\r\n F = {\r\n  [ x11 x12 ... x1n ;\r\n    y11 y12 ... y1n ]\r\n  [ x21 x22 ... x2n ;\r\n    y21 y22 ... y2n ]\r\n }\r\n\r\n\r\nYour output |f| will contain the indices in |F| of the crossed areas, in the correct order. In the example above, the correct answer is |[ 3 1 4 1 4 1]|. Crossing means 'being present in that area', so if A, the start, is in area 3, it is considered as 'crossed'.","description_html":"\u003cp\u003eThis is the fourth part of a series of assignments about wayfinding. The final goal of this series is to be able to calculate the fastest route through a terrain of areas with different properties. The assignments will build on top of each other, gradually increasing the complexity, but guiding you stepwise towards the final goal. You can re-use code from preceding assignments to save some work. See \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/problems/2218-wayfinding-1-crossing\"\u003e[1]\u003c/a\u003e \u003ca href = \"http://www.mathworks.nl/matlabcentral/cody/problems/2219-wayfinding-2-traversing\"\u003e[2]\u003c/a\u003e \u003ca href = \"http://www.mathworks.nl/matlabcentral/cody/problems/2220-wayfinding-3-passed-areas\"\u003e[3]\u003c/a\u003e.\u003c/p\u003e\u003cp\u003e\u003cb\u003eWhich areas are traversed?\u003c/b\u003e\u003c/p\u003e\u003cimg src = \"http://i62.tinypic.com/358qa1w.png\"\u003e\u003cp\u003eFor this fourth assignment in this series you have to calculate which areas are traversed and in which order, while going from A to B. Our path from A to B is a straight line. And the area boundaries are closed polygons consisting of a finite number of straight segments. Quite similar to \u003ca href = \"http://www.mathworks.nl/matlabcentral/cody/problems/2220-wayfinding-3-passed-areas\"\u003eassignment 3\u003c/a\u003e.\u003c/p\u003e\u003cp\u003eHowever, now the areas may overlap. If case of traversing overlapping areas, the area with the highest index in \u003ctt\u003eF\u003c/tt\u003e is the one listed.\r\nIf an area is crossed twice, it is listed twice in the returned vector. And if \u003ctt\u003eAB\u003c/tt\u003e crosses first for example area \u003ctt\u003eF2\u003c/tt\u003e, then \u003ctt\u003eF3\u003c/tt\u003e, and then \u003ctt\u003eF2\u003c/tt\u003e again, the output vector should contain \u003ctt\u003e[ ... 2 3 2 ... ]\u003c/tt\u003e. That would also be the case when \u003ctt\u003eF3\u003c/tt\u003e is contained in \u003ctt\u003eF2\u003c/tt\u003e. But when \u003ctt\u003eF2\u003c/tt\u003e is contained in \u003ctt\u003eF3\u003c/tt\u003e, then \u003ctt\u003eF2\u003c/tt\u003e is never crossed, as it has a lower index in F than \u003ctt\u003eF3\u003c/tt\u003e. Consider the areas non-transparent and stacked on top of each other.\u003c/p\u003e\u003cp\u003eThe inputs of the function \u003ctt\u003eWayfindingPassed(AB,F)\u003c/tt\u003e are a matrix \u003ctt\u003eAB\u003c/tt\u003e of two columns, each with x-y coordinates, of our straight path from A (1st column) to B (2nd column), and a cell array \u003ctt\u003eF\u003c/tt\u003e of 2-D matrices with columns with x- and y-coordinates, each column a subsequent node of the polygon boundary of the area. The last node is implicitly connected to the first. The index of each area, to be referred to in the output vector, is equal to its position in the cell array F.\u003c/p\u003e\u003cpre\u003e AB = [\r\n   xA xB\r\n   yA yB\r\n ]\u003c/pre\u003e\u003cpre\u003e F = {\r\n  [ x11 x12 ... x1n ;\r\n    y11 y12 ... y1n ]\r\n  [ x21 x22 ... x2n ;\r\n    y21 y22 ... y2n ]\r\n }\u003c/pre\u003e\u003cp\u003eYour output \u003ctt\u003ef\u003c/tt\u003e will contain the indices in \u003ctt\u003eF\u003c/tt\u003e of the crossed areas, in the correct order. In the example above, the correct answer is \u003ctt\u003e[ 3 1 4 1 4 1]\u003c/tt\u003e. Crossing means 'being present in that area', so if A, the start, is in area 3, it is considered as 'crossed'.\u003c/p\u003e","function_template":"function f = WayfindingPassed(AB,F)\r\n  f = 1:length(F);\r\nend","test_suite":"%%\r\nAB = [ -10 10 ; -10 10 ];\r\nF{1} = [\r\n    -5    5   -8    0\r\n    -6    2    7    1\r\n    ];\r\nF{2} = [\r\n    4   -2    4    6\r\n    6   -7   -3   -2\r\n    ];\r\nF{3} = [\r\n    -5    6    3   -1\r\n    -6   -8    4   -2\r\n    ];\r\nf = WayfindingPassed(AB,F);\r\nf_correct = [ 1 3 2 ];\r\nassert(isequal(f,f_correct));\r\n\r\n%%\r\n\r\nAB = [ 0 21 ; 0 0 ];\r\nf_correct = randperm(20);\r\nF = arrayfun(@(n)[n+[0 1 1 0];-1 -1 1 1],f_correct,'uni',0);\r\nf = WayfindingPassed(AB,F);\r\nassert(isequal(f(f_correct),f_correct(f)));\r\n\r\n%%\r\nAB = [ -10 10 ; -10 10 ];\r\nF{1} = [\r\n    -5    9    0   -4    5\r\n    2    8   -1   -9   -8\r\n    ];\r\nF{2} = [\r\n    -2  -10   -4    0\r\n    8    7   -5    5\r\n    ];\r\nF{3} = [\r\n    -6    2   10\r\n    10   -4    8\r\n    ];\r\nF{4} = [\r\n    -10    8  -10\r\n    4   -8    2\r\n    ];\r\nF{5} = [\r\n    0    4    8   -3    1\r\n    -10    9   -8   -5    2\r\n    ];\r\nF{6} = [\r\n    6    6   -9   10\r\n    6   -3    4   -7\r\n    ];\r\nF{7} = [\r\n    9    7   -7\r\n    0    7   -5\r\n    ];\r\nF{8} = [\r\n    2    0   10\r\n    6  -10    0\r\n    ];\r\nF{9} = [\r\n    -7    2   -7   -7\r\n    3    5   -3    7\r\n    ];\r\nF{10} = [\r\n    -5    6    1    5\r\n    -10    0    8    4\r\n    ];\r\nf = WayfindingPassed(AB,F);\r\nf_correct = [ 2 7 8 10 7 3 ];\r\nassert(isequal(f,f_correct));\r\n\r\n%%\r\nAB = [ -10 10 ; -10 10 ];\r\nF{1} = [\r\n    2    5    8    5\r\n    2   -2    9   -5\r\n    ];\r\nF{2} = [\r\n    -8    2   -2    8   -8   -2\r\n    0    4    5   -9    8   -2\r\n    ];\r\nF{3} = [\r\n    5   -6   -2    1    0   10\r\n    10   -8    0   10   -2   -5\r\n    ];\r\nF{4} = [\r\n    10   -4  -10   -2    9\r\n    4    1    8   -4   -1\r\n    ];\r\nF{5} = [\r\n    -9   -7    2   -3\r\n    2   -9   -4    5\r\n    ];\r\nF{6} = [\r\n    -3   10    6    9    4   -2\r\n    10   -6    2    2    5   -5\r\n    ];\r\nF{7} = [\r\n    -1   -5   -5\r\n    3    0   -4\r\n    ];\r\nF{8} = [\r\n    8   -6    8   10   -7\r\n    8   -2   -5    3    7\r\n    ];\r\nF{9} = [\r\n    1  -10   -3   10    5\r\n    -5   -6    3   -6    8\r\n    ];\r\nF{10} = [\r\n    -7    0    8   -8\r\n    7   -8    3    9\r\n    ];\r\nf = WayfindingPassed(AB,F);\r\nf_correct = [ 5 9 10 9 3 1 8 ];\r\nassert(isequal(f,f_correct));\r\n\r\n%%\r\n\r\nAB = [ 4 -6 ; 0 0 ];\r\nF{1} = [\r\n    -4   -4    2    2   -2   -3   -3   -2    2    2   -4\r\n    2   -4   -4   -2    2    2   -2   -2    2    4    4\r\n    ];\r\nf = WayfindingPassed(AB,F);\r\nf_correct = [ 1 ];\r\nassert(isequal(f,f_correct));\r\n\r\n%%\r\n\r\nAB = [ 0 0 ; 15 -8 ];\r\nF{1} = [\r\n    -4    4    4   -4\r\n    6    2    6    2\r\n    ];\r\nF{2} = [\r\n    -2   -2    6    6   -2\r\n    -0   -4   -0   -4   -0\r\n    ];\r\nF{3} = [\r\n    -1   -1    2    2\r\n    -6   -4   -6   -4\r\n    ];\r\nF{4} = [\r\n    -1    1   -1    1\r\n    -7   -7   -9   -9\r\n    ];\r\nF{5} = [\r\n    -2     2    -1     2    -1     1\r\n    14    10     6     6    10    14\r\n    ];\r\nf = WayfindingPassed(AB,F);\r\nf_correct = [ 5 5 1 2 3 4 ];\r\nassert(isequal(f,f_correct));\r\n\r\n%%\r\n\r\nAB = [ 0 0 ; -6 6 ];\r\nF{1} = [\r\n    -5    7    7   -5\r\n    -9   -9    9    9\r\n    ];\r\nF{2} = [\r\n    -1    1    1   -1\r\n    -7   -7   -5   -5\r\n    ];\r\nF{3} = [\r\n    -2   -2    2    2\r\n    4    2    2    4\r\n    ];\r\nF{4} = [\r\n    2    2   -2   -2\r\n    4    2    2    4\r\n    ];\r\nF{5} = [\r\n    -1    1    1   -1\r\n    2    2   -2   -2\r\n    ];\r\nF{6} = [\r\n    -2    0   -2\r\n    -2   -3   -4\r\n    ];\r\nF{7} = [\r\n    0    2    2\r\n    -3   -4   -2\r\n    ];\r\nF{8} = [\r\n    -1    0    1\r\n    -8   -6   -8\r\n    ];\r\nf = WayfindingPassed(AB,F);\r\nf_correct = [8 2 1 7 1 5 4 1];\r\nassert(isequal(f,f_correct));\r\n\r\n%%\r\n\r\nAB = [ 2 -2 ; 8 -6 ];\r\nF{1} = [\r\n    -4   -4    4    4\r\n    -4   -0   -0   -4\r\n    ];\r\nF{2} = [\r\n    -4   -4    4    4\r\n    2    6    6    2\r\n    ];\r\nf = WayfindingPassed(AB,F);\r\nf_correct = [2 1];\r\nassert(isequal(f,f_correct));\r\n\r\n%%\r\n\r\nAB = [ 8 -4 ; 8 -8 ];\r\nF{1} = [\r\n    -6    2    2   -4   -4    8    8   -6\r\n    -6   -6   -4   -4    2    2    4    4\r\n    ];\r\nF{2} = [\r\n    -2   -2    4    4\r\n    -0   -2   -2   -0\r\n    ];\r\nf = WayfindingPassed(AB,F);\r\nf_correct = [ 1 2 1 ];\r\nassert(isequal(f,f_correct));\r\n\r\n%%\r\n\r\nAB = [ -8 8 ; 8 -8 ];\r\nF{1} = [\r\n    -2   -2    0    0\r\n    -0    2    2   -0\r\n    ];\r\nF{2} = [\r\n    2    4    4   -6   -6   -4    2    4    4    2    2   -4   -4    2\r\n    -0   -0   -6   -6    4    6    6    4    2    2    4    4   -4   -4\r\n    ];\r\nF{3} = [\r\n    -3   -3    1    0\r\n    -1   -3   -3   -1\r\n    ];\r\nF{4} = [\r\n    5    9    9    5\r\n    -3   -3   -9   -9\r\n    ];\r\nF{5} = [\r\n    -9  -10  -10   -9\r\n    9    9   10   10\r\n    ];\r\nf = WayfindingPassed(AB,F);\r\nf_correct = [ 2 1 2 4 ];\r\nassert(isequal(f,f_correct));\r\n\r\nAB = [ 0 0 ; -8 8 ];\r\nF{1} = [\r\n    -4   -2   -2   -4\r\n    8    8    4    4\r\n    ];\r\nF{2} = [\r\n    2    4    4    2\r\n    -0   -0   -6   -6\r\n    ];\r\nF{3} = [\r\n    -4   -2   -2   -6   -6\r\n    -4   -4   -6   -6   -4\r\n    ];\r\nf = WayfindingPassed(AB,F);\r\nassert(isempty(f));\r\n\r\n%%\r\n\r\nAB = [ 7 -8 ; 0 0 ];\r\nF{1} = [\r\n    8    9    9    8\r\n    3    3   -2   -2\r\n    ];\r\nF{2} = [\r\n    -9   -7   -7   -4   -4   -3   -3    0    0    1    1    4    4    5    5   -2   -8   -9\r\n    -2   -2    2    2   -2   -2    2    2   -2   -2    2    2   -2   -2    3    4    3    2\r\n    ];\r\nF{3} = [\r\n    -2   -1   -1   -2\r\n    1    1   -4   -4\r\n    ];\r\nF{4} = [\r\n    -6   -5   -5   -3    1    2    2    3    3    1   -4   -6\r\n    1    1   -3   -5   -5   -4    1    1   -5   -8   -7   -4\r\n    ];\r\nf = WayfindingPassed(AB,F);\r\nf_correct = [ 2 4 2 3 2 4 2 ];\r\nassert(isequal(f,f_correct));\r\n\r\n%%\r\n\r\nAB = [ 0 -2 ; 0 -4 ];\r\nF{1} = [\r\n    -3    3    3    2    2   -2   -2    2    2   -3\r\n    -5   -5    3    3   -3   -3    2    2    3    3\r\n    ];\r\nF{2} = [\r\n    -1    1    1   -1\r\n    1    1   -1   -1\r\n    ];\r\nF{3} = [\r\n    -4    4    4    5    5   -5   -5   -4\r\n    4    4   -7   -7    5    5   -1   -1\r\n    ];\r\nF{4} = [\r\n    -5   -4   -4    4    4   -5\r\n    -1   -1   -6   -6   -7   -7\r\n    ];\r\nf = WayfindingPassed(AB,F);\r\nf_correct = [ 2 1 ];\r\nassert(isequal(f,f_correct));\r\n\r\n%%\r\n\r\nAB = [ -2 0 ; 6 -6 ];\r\nF{1} = [\r\n    2   -4   -4    2    2   -2    0   -2    2\r\n    -4   -4    4    4    2    2   -0   -2   -2\r\n    ];\r\nf = WayfindingPassed(AB,F);\r\nf_correct = [ 1 1 1 ];\r\nassert(isequal(f,f_correct));","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":6556,"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":"2014-03-01T22:33:13.000Z","updated_at":"2014-03-06T07:49:23.000Z","published_at":"2014-03-06T07:49:23.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\u003eThis is the fourth part of a series of assignments about wayfinding. The final goal of this series is to be able to calculate the fastest route through a terrain of areas with different properties. The assignments will build on top of each other, gradually increasing the complexity, but guiding you stepwise towards the final goal. You can re-use code from preceding assignments to save some work. See\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/problems/2218-wayfinding-1-crossing\\\"\u003e\u003cw:r\u003e\u003cw:t\u003e[1]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.nl/matlabcentral/cody/problems/2219-wayfinding-2-traversing\\\"\u003e\u003cw:r\u003e\u003cw:t\u003e[2]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.nl/matlabcentral/cody/problems/2220-wayfinding-3-passed-areas\\\"\u003e\u003cw:r\u003e\u003cw:t\u003e[3]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eWhich areas are traversed?\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\u003eFor this fourth assignment in this series you have to calculate which areas are traversed and in which order, while going from A to B. Our path from A to B is a straight line. And the area boundaries are closed polygons consisting of a finite number of straight segments. Quite similar to\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.nl/matlabcentral/cody/problems/2220-wayfinding-3-passed-areas\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eassignment 3\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eHowever, now the areas may overlap. If case of traversing overlapping areas, the area with the highest index in\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e is the one listed. If an area is crossed twice, it is listed twice in the returned vector. And if\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eAB\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e crosses first for example area\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF2\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, then\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF3\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, and then\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF2\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e again, the output vector should contain\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003e[ ... 2 3 2 ... ]\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e. That would also be the case when\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF3\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e is contained in\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF2\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e. But when\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF2\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e is contained in\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF3\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, then\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF2\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e is never crossed, as it has a lower index in F than\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF3\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e. Consider the areas non-transparent and stacked on top of each other.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe inputs of the function\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eWayfindingPassed(AB,F)\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e are a matrix\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eAB\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e of two columns, each with x-y coordinates, of our straight path from A (1st column) to B (2nd column), and a cell array\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e of 2-D matrices with columns with x- and y-coordinates, each column a subsequent node of the polygon boundary of the area. The last node is implicitly connected to the first. The index of each area, to be referred to in the output vector, is equal to its position in the cell array F.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ AB = [\\n   xA xB\\n   yA yB\\n ]\\n\\n F = {\\n  [ x11 x12 ... x1n ;\\n    y11 y12 ... y1n ]\\n  [ x21 x22 ... x2n ;\\n    y21 y22 ... y2n ]\\n }]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eYour output\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ef\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e will contain the indices in\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e of the crossed areas, in the correct order. In the example above, the correct answer is\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003e[ 3 1 4 1 4 1]\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e. Crossing means 'being present in that area', so if A, the start, is in area 3, it is considered as 'crossed'.\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":2242,"title":"Wayfinding 5 - Travel contour","description":"This is the fifth part of a series of assignments about wayfinding. The final goal of this series is to be able to calculate the fastest route through a terrain of areas with different properties. The assignments will build on top of each other, gradually increasing the complexity, but guiding you stepwise towards the final goal. You can re-use code from preceding assignments to save some work. See \r\n\u003chttp://www.mathworks.nl/matlabcentral/cody/?term=tag%3Awayfinding search:tag=wayfinding\u003e for the other assignments.\r\n\r\nThis time, you will travel around a polygon, over its contour. You get the nodes of the polygon, in the correct order, as a |2xn| array |F|. The last node of |F| is connected to the first node.\r\n\r\n|a| is the index in |F| of the starting node, and |b| is the goal. \r\n\r\n\u003c\u003chttp://i61.tinypic.com/iq8p69.png\u003e\u003e\r\n\r\nCalculate the shortest distance from |a| to |b| over the contour of the polygon. \r\n\r\nThe distance is measured as the Euclidean distance between points. You can not enter the internal area of the polygon. The contour of the polygon does not self-intersect.","description_html":"\u003cp\u003eThis is the fifth part of a series of assignments about wayfinding. The final goal of this series is to be able to calculate the fastest route through a terrain of areas with different properties. The assignments will build on top of each other, gradually increasing the complexity, but guiding you stepwise towards the final goal. You can re-use code from preceding assignments to save some work. See  \u003ca href = \"http://www.mathworks.nl/matlabcentral/cody/?term=tag%3Awayfinding\"\u003esearch:tag=wayfinding\u003c/a\u003e for the other assignments.\u003c/p\u003e\u003cp\u003eThis time, you will travel around a polygon, over its contour. You get the nodes of the polygon, in the correct order, as a \u003ctt\u003e2xn\u003c/tt\u003e array \u003ctt\u003eF\u003c/tt\u003e. The last node of \u003ctt\u003eF\u003c/tt\u003e is connected to the first node.\u003c/p\u003e\u003cp\u003e\u003ctt\u003ea\u003c/tt\u003e is the index in \u003ctt\u003eF\u003c/tt\u003e of the starting node, and \u003ctt\u003eb\u003c/tt\u003e is the goal.\u003c/p\u003e\u003cimg src = \"http://i61.tinypic.com/iq8p69.png\"\u003e\u003cp\u003eCalculate the shortest distance from \u003ctt\u003ea\u003c/tt\u003e to \u003ctt\u003eb\u003c/tt\u003e over the contour of the polygon.\u003c/p\u003e\u003cp\u003eThe distance is measured as the Euclidean distance between points. You can not enter the internal area of the polygon. The contour of the polygon does not self-intersect.\u003c/p\u003e","function_template":"function d = polygon_distance(F,a,b)\r\n  d = 0;\r\nend","test_suite":"%%\r\nF = [0 0 1 1;0 1 1 0];\r\na = 1;\r\nb = 3;\r\nd = polygon_distance(F,a,b);\r\nd_correct = 2;\r\nassert(isequal(d,d_correct))\r\n\r\n%%\r\nF = [0 0 1 1;0 1 1 0];\r\na = 1;\r\nb = 2;\r\nd = polygon_distance(F,a,b);\r\nd_correct = 1;\r\nassert(isequal(d,d_correct))\r\n\r\n%%\r\nF = [0 0 1 1;0 1 1 0];\r\na = 4;\r\nb = 1;\r\nd = polygon_distance(F,a,b);\r\nd_correct = 1;\r\nassert(isequal(d,d_correct))\r\n\r\n%%\r\nF = [0 0 1 1;0 1 1 0];\r\na = 3;\r\nb = 3;\r\nd = polygon_distance(F,a,b);\r\nd_correct = 0;\r\nassert(isequal(d,d_correct))\r\n\r\n%%\r\nF = [zeros(1,101) ones(1,101);0:100 100:-1:0];\r\na = 1;\r\nfor b = randi(size(F,2)/2,1,100)\r\n  d = polygon_distance(F,a,b);\r\n  d_correct = b-1;\r\n  assert(isequal(d,d_correct));\r\nend\r\n\r\n%%\r\nF = [zeros(1,101) ones(1,101);0:100 100:-1:0];\r\na = 1;\r\nfor b = randi(size(F,2)/2,1,100)+size(F,2)/2\r\n  s = rand(1)+1;\r\n  d = polygon_distance(F*s,a,b);\r\n  d_correct = (size(F,2)-b+1)*s;\r\n  assert(abs(d-d_correct)\u003c1e-10);\r\nend\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":6556,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":5,"test_suite_updated_at":"2014-03-10T14:22:52.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2014-03-10T09:32:11.000Z","updated_at":"2014-03-10T14:22:52.000Z","published_at":"2014-03-10T13:43:07.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\u003eThis is the fifth part of a series of assignments about wayfinding. The final goal of this series is to be able to calculate the fastest route through a terrain of areas with different properties. The assignments will build on top of each other, gradually increasing the complexity, but guiding you stepwise towards the final goal. You can re-use code from preceding assignments to save some work. See \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.nl/matlabcentral/cody/?term=tag%3Awayfinding\\\"\u003e\u003cw:r\u003e\u003cw:t\u003esearch:tag=wayfinding\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e for the other assignments.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis time, you will travel around a polygon, over its contour. You get the nodes of the polygon, in the correct order, as a\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003e2xn\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e array\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e. The last node of\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e is connected to the first node.\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:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ea\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e is the index in\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eF\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e of the starting node, and\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eb\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e is the goal.\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\u003eCalculate the shortest distance from\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ea\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e to\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eb\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e over the contour of the polygon.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe distance is measured as the Euclidean distance between points. You can not enter the internal area of the polygon. The contour of the polygon does not self-intersect.\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":2291,"title":"GJam 2014 Qualifier: Deceitful War (Small)","description":"This Challenge is derived from \u003chttp://code.google.com/codejam/contest/2974486/dashboard#s=p3 GJam 2014 Qualifier Deceitful War\u003e.\r\n\r\nMy condensed summary of the problem statement.\r\n\r\nGiven two players, A and B, they are each given N masses. All masses are unique. Player A plays first on each comparison and states a Mass. Player B then plays a Mass. The player with the higher mass wins a point after they are compared on a scale. These masses then disappear. This repeats for all N masses. There are no constraints on the order of pieces played.\r\n\r\nUnsurprisingly when A truthfully states masses player B consistently wins.\r\n\r\nPlayer A, discouraged, decides to cheat. After the masses are provided player A asks B get A a drink and while B is away A looks at B's masses. Player A now plays pieces but does not necessarily honestly state the mass values. All scale comparisons must be valid based on B's strategy and A's stated mass. Player A now achieves more wins.\r\n\r\nPart one is determine the best possible score for A when playing deceitfully.\r\n\r\nPart two is determine the best possible score if player A did not look and is honest.\r\n\r\n*Examples:*\r\n\r\n  A: 0.5 0.1 0.9  B 0.6 0.4 0.3  Deceitful Wins 2, Optimal Honest 1\r\n  \r\n  A 0.186 0.389 0.907 0.832 0.959 0.557 0.300 0.992 0.899\r\n  B 0.916 0.728 0.271 0.520 0.700 0.521 0.215 0.341 0.458\r\n  Deceitful A Wins 8\r\n  Optimal Honest A Wins 4\r\n\r\n*Input:* A,B vectors of length N (Small has N\u003c=10, Large(future challenge N\u003c=1000)\r\n\r\n*Output:* Deceitful Wins, Optimal Honest Wins\r\n\r\n\r\n\r\n\r\n\r\n*Note:*\r\n\r\nIn the contest period there were 30 Matlab solutions, of which I was not one as I glitched on the easy Deceitful algorithm thinking my Honest algorithm was in error. \u003chttp://www.go-hero.net/jam/14/solutions/0/4/MATLAB GJam Deceitful Solutions\u003e. My post contest full GJam is in the test suite. About 11000 out of 28000 entrants solved this puzzle.","description_html":"\u003cp\u003eThis Challenge is derived from \u003ca href = \"http://code.google.com/codejam/contest/2974486/dashboard#s=p3\"\u003eGJam 2014 Qualifier Deceitful War\u003c/a\u003e.\u003c/p\u003e\u003cp\u003eMy condensed summary of the problem statement.\u003c/p\u003e\u003cp\u003eGiven two players, A and B, they are each given N masses. All masses are unique. Player A plays first on each comparison and states a Mass. Player B then plays a Mass. The player with the higher mass wins a point after they are compared on a scale. These masses then disappear. This repeats for all N masses. There are no constraints on the order of pieces played.\u003c/p\u003e\u003cp\u003eUnsurprisingly when A truthfully states masses player B consistently wins.\u003c/p\u003e\u003cp\u003ePlayer A, discouraged, decides to cheat. After the masses are provided player A asks B get A a drink and while B is away A looks at B's masses. Player A now plays pieces but does not necessarily honestly state the mass values. All scale comparisons must be valid based on B's strategy and A's stated mass. Player A now achieves more wins.\u003c/p\u003e\u003cp\u003ePart one is determine the best possible score for A when playing deceitfully.\u003c/p\u003e\u003cp\u003ePart two is determine the best possible score if player A did not look and is honest.\u003c/p\u003e\u003cp\u003e\u003cb\u003eExamples:\u003c/b\u003e\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003eA: 0.5 0.1 0.9  B 0.6 0.4 0.3  Deceitful Wins 2, Optimal Honest 1\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003eA 0.186 0.389 0.907 0.832 0.959 0.557 0.300 0.992 0.899\r\nB 0.916 0.728 0.271 0.520 0.700 0.521 0.215 0.341 0.458\r\nDeceitful A Wins 8\r\nOptimal Honest A Wins 4\r\n\u003c/pre\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e A,B vectors of length N (Small has N\u0026lt;=10, Large(future challenge N\u0026lt;=1000)\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e Deceitful Wins, Optimal Honest Wins\u003c/p\u003e\u003cp\u003e\u003cb\u003eNote:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eIn the contest period there were 30 Matlab solutions, of which I was not one as I glitched on the easy Deceitful algorithm thinking my Honest algorithm was in error. \u003ca href = \"http://www.go-hero.net/jam/14/solutions/0/4/MATLAB\"\u003eGJam Deceitful Solutions\u003c/a\u003e. My post contest full GJam is in the test suite. About 11000 out of 28000 entrants solved this puzzle.\u003c/p\u003e","function_template":"function W = War(m)\r\n% W=[Deceitful Wins, Optimal Honest Wins]\r\n  W=[0 0];\r\nend","test_suite":"%%\r\nm=[0.270000 0.550000 0.910000 0.330000 0.520000 0.300000 ;0.850000 0.450000 0.060000 0.240000 0.120000 0.880000 ];\r\nWexp=[5 3];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.164000 0.255000 0.009000 0.445000 0.209000 0.100000 0.391000 0.536000 0.027000 0.118000 ;0.673000 0.782000 0.582000 0.882000 0.591000 0.855000 0.745000 0.955000 0.991000 0.600000 ];\r\nWexp=[0 0];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.800000 0.480000 0.760000 0.680000 0.160000 0.640000 0.360000 ;0.200000 0.440000 0.960000 0.280000 0.880000 0.520000 0.120000 ];\r\nWexp=[5 2];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.170000 0.100000 0.120000 0.200000 0.540000 0.150000 ;0.490000 0.070000 0.240000 0.680000 0.610000 0.340000 ];\r\nWexp=[2 1];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.780000 0.770000 0.900000 0.810000 0.880000 0.840000 0.600000 0.730000 0.930000 0.990000 ;0.270000 0.150000 0.260000 0.510000 0.570000 0.310000 0.170000 0.140000 0.400000 0.040000 ];\r\nWexp=[10 10];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.320000 0.820000 0.350000 0.770000 0.020000 0.550000 0.040000 0.990000 0.610000 0.190000 ;0.730000 0.530000 0.750000 0.800000 0.670000 0.870000 0.330000 0.250000 0.080000 0.680000 ];\r\nWexp=[7 1];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.510000 0.100000 0.380000 0.050000 0.210000 0.130000 0.440000 0.180000 ;0.560000 0.920000 0.540000 0.900000 0.670000 0.790000 0.820000 0.970000 ];\r\nWexp=[0 0];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.420000 ;0.080000 ];\r\nWexp=[1 1];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.690000 0.310000 0.540000 0.230000 0.710000 0.030000 0.490000 0.600000 0.510000 0.860000 ;0.830000 0.340000 0.370000 0.740000 0.430000 0.200000 0.090000 0.170000 0.910000 0.400000 ];\r\nWexp=[8 4];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.300000 0.920000 0.710000 0.130000 0.230000 0.620000 0.140000 0.260000 0.360000 0.310000 ;0.440000 0.010000 0.640000 0.350000 0.820000 0.550000 0.780000 0.790000 0.060000 0.570000 ];\r\nWexp=[6 2];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.504000 0.218000 0.479000 0.101000 0.050000 0.445000 0.471000 0.084000 0.034000 0.008000 ;0.992000 0.546000 0.647000 0.849000 0.891000 0.739000 0.765000 0.555000 0.613000 0.748000 ];\r\nWexp=[0 0];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.570000 0.470000 0.640000 0.550000 0.060000 0.430000 0.040000 0.280000 0.130000 0.510000 ;0.700000 0.740000 0.770000 0.810000 0.870000 0.790000 0.940000 0.910000 0.850000 0.660000 ];\r\nWexp=[0 0];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.200000 0.020000 0.510000 0.120000 0.220000 0.250000 0.100000 0.490000 0.530000 0.350000 ;0.800000 0.960000 0.760000 0.820000 0.710000 0.570000 0.940000 0.690000 0.900000 0.550000 ];\r\nWexp=[0 0];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.260000 0.030000 0.360000 0.410000 0.330000 0.430000 0.540000 0.300000 0.280000 0.100000 ;0.770000 0.910000 0.700000 0.550000 0.590000 0.780000 0.650000 0.860000 0.750000 0.990000 ];\r\nWexp=[0 0];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.920000 0.370000 0.900000 0.200000 0.150000 0.020000 0.530000 0.860000 0.250000 0.190000 ;0.170000 0.980000 0.140000 0.680000 0.830000 0.470000 0.950000 0.340000 0.880000 0.540000 ];\r\nWexp=[7 0];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.510000 0.020000 0.490000 0.280000 0.080000 0.830000 0.170000 0.140000 0.850000 ;0.420000 0.650000 0.950000 0.890000 0.030000 0.580000 0.380000 0.060000 0.370000 ];\r\nWexp=[6 1];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.670000 0.050000 0.590000 0.330000 0.820000 0.030000 0.740000 0.560000 0.950000 0.620000 ;0.210000 0.380000 0.770000 0.080000 0.260000 0.640000 0.460000 0.790000 0.310000 0.410000 ];\r\nWexp=[8 4];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.840000 0.800000 0.420000 0.580000 0.670000 0.070000 0.360000 ;0.690000 0.870000 0.310000 0.600000 0.760000 0.200000 0.380000 ];\r\nWexp=[6 1];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.450000 0.380000 0.280000 0.590000 0.620000 0.230000 0.810000 ;0.320000 0.190000 0.680000 0.140000 0.090000 0.940000 0.170000 ];\r\nWexp=[6 4];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.207000 0.288000 0.180000 0.595000 0.748000 0.459000 0.802000 0.387000 0.027000 0.090000 ;0.450000 0.982000 0.694000 0.613000 0.486000 0.423000 0.685000 0.847000 0.432000 0.604000 ];\r\nWexp=[4 0];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.750000 0.970000 0.820000 0.840000 0.680000 0.780000 0.730000 0.270000 0.220000 0.150000 ;0.130000 0.920000 0.390000 0.320000 0.230000 0.080000 0.800000 0.330000 0.720000 0.590000 ];\r\nWexp=[10 4];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.260000 0.140000 0.600000 0.950000 0.160000 0.650000 0.580000 0.910000 0.230000 0.020000 ;0.120000 0.510000 0.530000 0.280000 0.350000 0.070000 0.400000 0.930000 0.490000 0.090000 ];\r\nWexp=[8 4];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.545000 0.527000 0.500000 0.727000 0.018000 0.400000 0.191000 0.982000 0.409000 0.591000 ;0.945000 0.745000 0.355000 0.673000 0.045000 0.118000 0.682000 0.827000 0.645000 0.482000 ];\r\nWexp=[6 1];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.930000 0.980000 0.470000 0.810000 0.830000 0.460000 0.510000 0.540000 ;0.490000 0.640000 0.170000 0.290000 0.140000 0.440000 0.590000 0.760000 ];\r\nWexp=[8 4];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.580000 ;0.330000 ];\r\nWexp=[1 1];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.640000 0.820000 0.700000 0.480000 0.520000 0.610000 0.060000 0.240000 0.300000 ;0.550000 0.450000 0.090000 0.030000 0.850000 0.670000 0.760000 0.360000 0.790000 ];\r\nWexp=[7 1];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.800000 ;0.900000 ];\r\nWexp=[0 0];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.340000 0.100000 0.040000 0.110000 0.650000 0.250000 0.570000 0.480000 0.150000 0.800000 ;0.550000 0.020000 0.920000 0.080000 0.700000 0.360000 0.910000 0.710000 0.820000 0.850000 ];\r\nWexp=[5 1];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.340000 0.890000 0.060000 0.090000 0.750000 0.730000 0.810000 0.950000 0.660000 0.390000 ;0.530000 0.970000 0.610000 0.670000 0.690000 0.380000 0.590000 0.300000 0.720000 0.110000 ];\r\nWexp=[8 4];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.870000 0.600000 0.860000 0.830000 0.680000 0.810000 0.700000 0.920000 0.760000 ;0.170000 0.510000 0.330000 0.050000 0.240000 0.030000 0.410000 0.480000 0.520000 ];\r\nWexp=[9 9];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.940000 0.720000 0.810000 0.220000 0.280000 0.530000 0.440000 0.160000 0.880000 0.970000 ;0.120000 0.030000 0.470000 0.560000 0.380000 0.340000 0.690000 0.090000 0.250000 0.750000 ];\r\nWexp=[10 4];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.410000 0.360000 0.230000 0.140000 0.180000 0.050000 0.500000 0.270000 0.090000 0.450000 ;0.680000 0.950000 0.910000 0.860000 0.730000 0.550000 0.590000 0.820000 0.640000 0.770000 ];\r\nWexp=[0 0];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.278000 0.852000 0.370000 0.824000 0.389000 0.704000 0.546000 0.204000 0.296000 0.056000 ;0.833000 0.315000 0.991000 0.028000 0.907000 0.630000 0.361000 0.037000 0.065000 0.954000 ];\r\nWexp=[7 2];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.713000 0.657000 0.778000 0.435000 0.565000 0.870000 0.963000 0.343000 0.481000 0.593000 ;0.287000 0.333000 0.454000 0.130000 0.370000 0.759000 0.176000 0.611000 0.231000 0.398000 ];\r\nWexp=[10 6];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.590000 0.750000 0.650000 0.900000 0.740000 0.880000 0.850000 ;0.400000 0.070000 0.540000 0.380000 0.570000 0.150000 0.490000 ];\r\nWexp=[7 7];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.110000 0.920000 0.540000 0.840000 0.380000 0.770000 0.900000 0.490000 0.870000 0.750000 ;0.620000 0.480000 0.330000 0.440000 0.890000 0.130000 0.430000 0.080000 0.340000 0.560000 ];\r\nWexp=[10 5];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.480000 0.650000 0.770000 0.690000 0.720000 0.560000 0.660000 0.550000 0.510000 0.730000 ;0.310000 0.440000 0.300000 0.060000 0.200000 0.420000 0.030000 0.070000 0.110000 0.140000 ];\r\nWexp=[10 10];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.900000 0.680000 0.600000 0.800000 ;0.350000 0.050000 0.170000 0.880000 ];\r\nWexp=[4 3];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.730000 0.910000 0.450000 0.640000 0.090000 ;0.550000 0.360000 0.270000 0.820000 0.180000 ];\r\nWexp=[4 2];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.530000 0.740000 0.410000 0.320000 0.820000 0.970000 0.620000 0.500000 0.710000 0.090000 ;0.180000 0.760000 0.380000 0.150000 0.470000 0.210000 0.560000 0.120000 0.590000 0.440000 ];\r\nWexp=[9 4];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.487000 0.092000 0.714000 0.160000 0.504000 0.277000 0.479000 0.605000 0.462000 0.832000 ;0.210000 0.824000 0.118000 0.387000 0.664000 0.874000 0.445000 0.739000 0.546000 0.017000 ];\r\nWexp=[8 2];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.100000 ;0.400000 ];\r\nWexp=[0 0];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.688000 0.872000 0.615000 0.477000 0.734000 0.624000 0.394000 0.532000 0.954000 0.817000 ;0.193000 0.119000 0.349000 0.073000 0.037000 0.009000 0.128000 0.303000 0.046000 0.064000 ];\r\nWexp=[10 10];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.910000 0.550000 0.300000 0.570000 0.920000 0.400000 0.450000 0.150000 0.110000 0.190000 ;0.090000 0.790000 0.890000 0.740000 0.850000 0.940000 0.340000 0.380000 0.720000 0.260000 ];\r\nWexp=[6 1];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.723000 0.639000 0.824000 0.697000 0.840000 0.882000 0.437000 0.782000 0.588000 0.218000 ;0.345000 0.151000 0.067000 0.849000 0.815000 0.235000 0.521000 0.765000 0.950000 0.681000 ];\r\nWexp=[9 3];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.200000 0.150000 0.350000 0.090000 0.110000 0.330000 0.220000 ;0.390000 0.460000 0.850000 0.700000 0.570000 0.610000 0.500000 ];\r\nWexp=[0 0];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.850000 0.790000 0.550000 0.380000 0.300000 0.400000 0.770000 0.740000 0.320000 0.570000 ;0.260000 0.210000 0.110000 0.130000 0.020000 0.040000 0.230000 0.190000 0.090000 0.060000 ];\r\nWexp=[10 10];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.961000 0.330000 0.010000 0.816000 0.583000 0.913000 0.893000 0.951000 0.126000 0.398000 ;0.767000 0.029000 0.262000 0.641000 0.175000 0.544000 0.359000 0.932000 0.680000 0.476000 ];\r\nWexp=[9 4];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.300000 ;0.700000 ];\r\nWexp=[0 0];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\nm=[0.240000 0.050000 0.190000 0.110000 0.920000 0.590000 0.730000 0.380000 0.780000 0.950000 ;0.860000 0.700000 0.430000 0.620000 0.220000 0.540000 0.410000 0.890000 0.680000 0.490000 ];\r\nWexp=[6 2];\r\nW=War(m);\r\nassert(isequal(Wexp,W))\r\n%%\r\n% function GJam_Qual_2014d\r\n% % \r\n% %War\r\n% fn='D-small-attempt0.in';\r\n% %fn='D-large.in';\r\n% [data] = read_file(fn); % \r\n% \r\n% fidG = fopen('D-small-output.out', 'w');\r\n% %fidG = fopen('D-large-output001.out', 'w');\r\n% tic\r\n% \r\n% for i=1:size(data,2) % Cell array has N rows of cases\r\n% % m=sort(data{i},2);\r\n%  m=data{i};\r\n%  dw = dWar(m) ;% \r\n%  w = War(m) ;%  \r\n%  \r\n%    fprintf('Case #%i: %i %i\\n',i,dw,w);\r\n%    fprintf(fidG,'Case #%i: %i %i\\n',i,dw,w);\r\n%     \r\n% end\r\n% toc\r\n% \r\n% fclose(fidG);\r\n% \r\n% end\r\n% \r\n% function dw=dWar(m)\r\n% % Post contest\r\n% % Lie to burn opponent best pieces\r\n%  N=sort(m(1,:));\r\n%  K=sort(m(2,:));\r\n%  \r\n%  dw=0;\r\n%  for i=1:length(N)\r\n%   if N(i)\u003eK(1) % Lie to above to beat lowest\r\n%    dw=dw+1;\r\n%    K=K(2:end);\r\n%   else % Lie to just below best\r\n%    K=K(1:end-1);\r\n%   end\r\n%  end\r\n%  \r\n% end\r\n% \r\n% function w=War(m)\r\n% % Optimal truthful strategy\r\n% % Best lucky sequence\r\n%  w=0;\r\n% \r\n%  Nm=sort(m(1,:));\r\n%  Km=sort(m(2,:));\r\n%  \r\n%  Nmz=[Nm' ones(size(Nm,2),1)];\r\n%  Kmz=[Km' zeros(size(Km,2),1)];\r\n%  z=[Nmz;Kmz]; \r\n%  z=sortrows(z,-1);\r\n%  \r\n%  while ~isempty(z)\r\n%   ptr1=find(z(:,2)==1,1,'last');\r\n%   ptr0=find(z(1:ptr1,2)==0,1,'last');\r\n%   if isempty(ptr0)\r\n%    % score\r\n%    w=w+1;\r\n%    z(ptr1,:)=[];\r\n%    ptr0=find(z(:,2)==0,1,'last');\r\n%    z(ptr0,:)=[];  \r\n%   else\r\n%    z(ptr1,:)=[];\r\n%    z(ptr0,:)=[];  \r\n%   end\r\n%  end \r\n%  % Create worst Ken/B Scenario\r\n%  \r\n% end\r\n% \r\n% \r\n% function [d] = read_file(fn)\r\n% % Read whole array then parse\r\n% % dlmread valid for numeric arrays\r\n%  m=dlmread(fn);\r\n%  m(1,:)=[];\r\n%  for i=1:size(m,1)/3\r\n%   d{i}=m(3*i-1:3*i,1:m(3*i-2,1));\r\n%  end\r\n%  \r\n% end % read_file\r\n% Data Set file\r\n%4\r\n%1\r\n%0.5\r\n%0.6\r\n%2\r\n%0.7 0.2\r\n%0.8 0.3\r\n%3\r\n%0.5 0.1 0.9\r\n%0.6 0.4 0.3\r\n%9\r\n%0.186 0.389 0.907 0.832 0.959 0.557 0.300 0.992 0.899\r\n%0.916 0.728 0.271 0.520 0.700 0.521 0.215 0.341 0.458\r\n\r\n\r\n\r\n\r\n\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":1,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":8,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2014-04-19T14:08:56.000Z","updated_at":"2014-04-19T15:00:47.000Z","published_at":"2014-04-19T15:00:47.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis Challenge is derived from\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://code.google.com/codejam/contest/2974486/dashboard#s=p3\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eGJam 2014 Qualifier Deceitful War\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eMy condensed summary of the problem statement.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eGiven two players, A and B, they are each given N masses. All masses are unique. Player A plays first on each comparison and states a Mass. Player B then plays a Mass. The player with the higher mass wins a point after they are compared on a scale. These masses then disappear. This repeats for all N masses. There are no constraints on the order of pieces played.\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\u003eUnsurprisingly when A truthfully states masses player B consistently wins.\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\u003ePlayer A, discouraged, decides to cheat. After the masses are provided player A asks B get A a drink and while B is away A looks at B's masses. Player A now plays pieces but does not necessarily honestly state the mass values. All scale comparisons must be valid based on B's strategy and A's stated mass. Player A now achieves more wins.\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\u003ePart one is determine the best possible score for A when playing deceitfully.\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\u003ePart two is determine the best possible score if player A did not look and is honest.\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\u003eExamples:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[A: 0.5 0.1 0.9  B 0.6 0.4 0.3  Deceitful Wins 2, Optimal Honest 1\\n\\nA 0.186 0.389 0.907 0.832 0.959 0.557 0.300 0.992 0.899\\nB 0.916 0.728 0.271 0.520 0.700 0.521 0.215 0.341 0.458\\nDeceitful A Wins 8\\nOptimal Honest A Wins 4]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e A,B vectors of length N (Small has N\u0026lt;=10, Large(future challenge N\u0026lt;=1000)\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 Deceitful Wins, Optimal Honest Wins\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\u003eNote:\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\u003eIn the contest period there were 30 Matlab solutions, of which I was not one as I glitched on the easy Deceitful algorithm thinking my Honest algorithm was in error.\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.go-hero.net/jam/14/solutions/0/4/MATLAB\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eGJam Deceitful Solutions\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. My post contest full GJam is in the test suite. About 11000 out of 28000 entrants solved this puzzle.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":698,"title":"Knots Contest: Score  (TestSuite) ","description":"This Challenge is to Score well on the \u003chttp://www.mathworks.com/matlabcentral/contest/contests/38/rules Knots contest\u003e test suite.\r\n\r\n\r\nAll Cody ToolBoxes are available. (Neural, Parallel, Stats)\r\n\r\n*Input:* A, xyIn, wts\r\n\r\n*Output:* xyOut \r\n\r\nExamples and specifics are at \u003chttp://www.mathworks.com/matlabcentral/contest/contests/38/rules Knots contest\u003e .\r\n\r\n\r\n*Scoring:* Score is Knots+6.5 e^(Time/23). Code size and distance are ignored. All 50 sample boards are scored.\r\n\r\n  \r\n  The Champions are the first three scores.\r\n  Raphael Candelier's Cheeeese is followed by the creations of Per and Alfonso.\r\n  \r\n.\r\n\r\n*Future:*\r\n  \r\n  Additional Challenges using the Contest Suite will become available as will Scoring for Fewest Knots, no time penalty. Also puzzle subsets for Fewest Knots and Low Score will be created.\r\n\r\n","description_html":"\u003cp\u003eThis Challenge is to Score well on the \u003ca href=\"http://www.mathworks.com/matlabcentral/contest/contests/38/rules\"\u003eKnots contest\u003c/a\u003e test suite.\u003c/p\u003e\u003cp\u003eAll Cody ToolBoxes are available. (Neural, Parallel, Stats)\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e A, xyIn, wts\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e xyOut\u003c/p\u003e\u003cp\u003eExamples and specifics are at \u003ca href=\"http://www.mathworks.com/matlabcentral/contest/contests/38/rules\"\u003eKnots contest\u003c/a\u003e .\u003c/p\u003e\u003cp\u003e\u003cb\u003eScoring:\u003c/b\u003e Score is Knots+6.5 e^(Time/23). Code size and distance are ignored. All 50 sample boards are scored.\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003eThe Champions are the first three scores.\r\nRaphael Candelier's Cheeeese is followed by the creations of Per and Alfonso.\r\n\u003c/pre\u003e\u003cp\u003e.\u003c/p\u003e\u003cp\u003e\u003cb\u003eFuture:\u003c/b\u003e\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003eAdditional Challenges using the Contest Suite will become available as will Scoring for Fewest Knots, no time penalty. Also puzzle subsets for Fewest Knots and Low Score will be created.\r\n\u003c/pre\u003e","function_template":"function xyOut=solver(a,xyIn,wts);\r\n xyOut=xyIn;\r\nend\r\n","test_suite":"%%\r\nfeval(@assignin,'caller','score',2000);\r\n%%\r\ntic\r\n%urlwrite('http://tinyurl.com/matlab-Knots','Knots_sample.mat')\r\n%urlwrite('http://tinyurl.com/matlab-numKnots','numKnots.m') % Fast numKnots\r\n\r\nurlwrite('http://rmatlabtest.appspot.com/testsuite_sample_knots.mat','Knots_sample.mat')\r\ntoc\r\nurlwrite('http://rmatlabtest.appspot.com/numKnots.m','numKnots.m') % Fast numKnots\r\ntoc\r\n\r\n\r\nrehash path % Make numKnots.m available\r\ntoc\r\n%%\r\ncases=50; % Reduced to 40 from 50\r\nnKnots=zeros(cases,1);\r\nKnotTime=zeros(cases,1);\r\n\r\nload Knots_sample.mat\r\ntestsuite=suite;\r\nfor n=1:cases\r\n a=testsuite(n).a;\r\n xyIn=testsuite(n).xyIn;\r\n wts=testsuite(n).wts;\r\n rng(2,'twister')\r\n time0 = cputime;\r\n xyOut=solver(a,xyIn,wts);\r\n KnotTime(n) = cputime - time0;\r\n if size(unique(xyOut,'rows'),1)\u003clength(wts)\r\n  nKnots(n)=Inf; % Points must be unique\r\n else\r\n  nKnots(n)=numKnots(xyOut,a);\r\n end\r\nend\r\nfor n=1:cases\r\n fprintf('%2i KnotTime(msec) %5i  Knots %4i\\n',n,floor(KnotTime(n)*1000),nKnots(n))\r\nend\r\n\r\nTKnotTime=sum(KnotTime);\r\nfprintf('Sum KnotTime %5i  msec\\n',floor(TKnotTime*1000))\r\nT_score=6.5*exp(TKnotTime/23);\r\nTknots=sum(nKnots);;\r\nfprintf('Time Score %10.2f\\n',T_score)\r\nfprintf('Knot Score %10.2f\\n',Tknots)\r\nfprintf('Total Score %10.2f\\n',Tknots+T_score)\r\n\r\nfprintf('Cody Maximum allowed Elapsed time is approximately 53 seconds\\n')\r\ntoc\r\n\r\nfeval(  @assignin,'caller','score',min( 2000,Tknots+floor(T_score) )  );","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":6,"test_suite_updated_at":"2013-11-15T22:54:25.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2012-05-18T02:11:49.000Z","updated_at":"2013-11-15T23:06:17.000Z","published_at":"2012-11-10T20:11:06.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis Challenge is to Score well on the\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/contest/contests/38/rules\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eKnots contest\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e test suite.\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\u003eAll Cody ToolBoxes are available. (Neural, Parallel, Stats)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e A, xyIn, wts\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 xyOut\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eExamples and specifics are 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=\\\"http://www.mathworks.com/matlabcentral/contest/contests/38/rules\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eKnots contest\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e .\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\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 Score is Knots+6.5 e^(Time/23). Code size and distance are ignored. All 50 sample boards are scored.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[The Champions are the first three scores.\\nRaphael Candelier's Cheeeese is followed by the creations of Per and Alfonso.]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eFuture:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[Additional Challenges using the Contest Suite will become available as will Scoring for Fewest Knots, no time penalty. Also puzzle subsets for Fewest Knots and Low Score will be created.]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":811,"title":"Genome Sequence 004: Long 3rd Generation Segment Correction","description":"The Melopsittacus undulates genome, Parrot Budgerigar, was successfully sequenced in July 2012 using long 3rd Gen sequences provided by \u003chttp://www.pacificbiosciences.com/ PacBio\u003e. The \u003chttp://assemblathon.org/a-parrot-a-fish-and-a-snake-walk-into-a-bar Assemblathon Genome Contest\u003e led the team of Phillippy, Koren and Jarvis to successfully \u003chttp://www.sciencedaily.com/releases/2012/07/120702210229.htm Sequence Parrot DNA\u003e using the PacBio 3rd Generation data and Illumina 2nd Gen data.\r\n\r\nThe 3rd gen PacBio data is very long, 1K-20K, but has 15% error rate. The Illumina data is 100-500 long with \u003c1% error rate. Jarvis and his team combined this data to achieve \u003c 0.1% error rate.\r\n\r\nGenome Challenge 004 is the correction of simplified PacBio simulated reads with high error rate.\r\n\r\n*Input:* \r\n\r\nCall 1: empty array, segment Width, Flag=0\r\n\r\nCall 2: N PacBio DNA vectors (N x width), Segment Width, Flag=1\r\n\r\n*Output:* \r\n\r\nCall 1: empty vector, Number of Requested Vectors\r\n\r\nCall 2: Corrected DNA vector, Number of Requested Vectors\r\n\r\n*Score:* Number of N vectors used to produce correct vector for w=1024 case\r\n\r\nThe first call to the PacBio_fix routine returns the number of vectors requested to produce a final product. This may be a function of w.\r\n\r\nThe second call to PacBio_fix will have a DNA matix (N x width) and flag=1.\r\n\r\nThe response to the second call is the fixed DNA sequence, vector of width w.\r\n\r\n*example:*\r\nFirst call return : N=3\r\n\r\n  01230123111122223333 Truth\r\n  Input example\r\n  01232123112122221332 Injected errors\r\n  01130123111122123323\r\n  11230133121122223333\r\n\r\n  Output: \r\n  01230123111122223333 Truth, hopefully\r\n\r\n\r\nThis data is simplified by only having simple substitutions and the data sets are provided pre-aligned. \r\n\r\nThe real PacBio data is quite a bit more complicated. Values may be added, deleted, substituted, and are of varying lengths. This causes alignment issues.\r\n\r\nFollow-Up Challenges: Sample Data from the PacBio site for \u003chttp://www.cbcb.umd.edu/software/PBcR/ Lambda Phage\u003e will be molded into various Challenges. Possible challenges are correcting individual long segments and assembling multiple long segments into the full Lambda Phage genome. The Parrot genome is too big for Cody to solve in 50 seconds.\r\n","description_html":"\u003cp\u003eThe Melopsittacus undulates genome, Parrot Budgerigar, was successfully sequenced in July 2012 using long 3rd Gen sequences provided by \u003ca href=\"http://www.pacificbiosciences.com/\"\u003ePacBio\u003c/a\u003e. The \u003ca href=\"http://assemblathon.org/a-parrot-a-fish-and-a-snake-walk-into-a-bar\"\u003eAssemblathon Genome Contest\u003c/a\u003e led the team of Phillippy, Koren and Jarvis to successfully \u003ca href=\"http://www.sciencedaily.com/releases/2012/07/120702210229.htm\"\u003eSequence Parrot DNA\u003c/a\u003e using the PacBio 3rd Generation data and Illumina 2nd Gen data.\u003c/p\u003e\u003cp\u003eThe 3rd gen PacBio data is very long, 1K-20K, but has 15% error rate. The Illumina data is 100-500 long with \u0026lt;1% error rate. Jarvis and his team combined this data to achieve \u0026lt; 0.1% error rate.\u003c/p\u003e\u003cp\u003eGenome Challenge 004 is the correction of simplified PacBio simulated reads with high error rate.\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eCall 1: empty array, segment Width, Flag=0\u003c/p\u003e\u003cp\u003eCall 2: N PacBio DNA vectors (N x width), Segment Width, Flag=1\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eCall 1: empty vector, Number of Requested Vectors\u003c/p\u003e\u003cp\u003eCall 2: Corrected DNA vector, Number of Requested Vectors\u003c/p\u003e\u003cp\u003e\u003cb\u003eScore:\u003c/b\u003e Number of N vectors used to produce correct vector for w=1024 case\u003c/p\u003e\u003cp\u003eThe first call to the PacBio_fix routine returns the number of vectors requested to produce a final product. This may be a function of w.\u003c/p\u003e\u003cp\u003eThe second call to PacBio_fix will have a DNA matix (N x width) and flag=1.\u003c/p\u003e\u003cp\u003eThe response to the second call is the fixed DNA sequence, vector of width w.\u003c/p\u003e\u003cp\u003e\u003cb\u003eexample:\u003c/b\u003e\r\nFirst call return : N=3\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003e01230123111122223333 Truth\r\nInput example\r\n01232123112122221332 Injected errors\r\n01130123111122123323\r\n11230133121122223333\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003eOutput: \r\n01230123111122223333 Truth, hopefully\r\n\u003c/pre\u003e\u003cp\u003eThis data is simplified by only having simple substitutions and the data sets are provided pre-aligned.\u003c/p\u003e\u003cp\u003eThe real PacBio data is quite a bit more complicated. Values may be added, deleted, substituted, and are of varying lengths. This causes alignment issues.\u003c/p\u003e\u003cp\u003eFollow-Up Challenges: Sample Data from the PacBio site for \u003ca href=\"http://www.cbcb.umd.edu/software/PBcR/\"\u003eLambda Phage\u003c/a\u003e will be molded into various Challenges. Possible challenges are correcting individual long segments and assembling multiple long segments into the full Lambda Phage genome. The Parrot genome is too big for Cody to solve in 50 seconds.\u003c/p\u003e","function_template":"function [M_fix,N]=PacBio_fix(M,w,flag)\r\n% 1st Call\r\n% M is empty\r\n% w is width of segment\r\n% flag is 0\r\n% Ouput is N, the number of segments requested to fix the segment\r\n% 2nd Call\r\n% M is an Nxw array of values [0:3]\r\n\r\n M_fix=[];\r\n N=1; % needed for 2nd call with flag==1\r\n if flag==0 % Requested number of Segments\r\n  N=1;\r\n  return;\r\n end\r\n\r\nM_fix=M(1,:);\r\n\r\n\r\nend","test_suite":"%%\r\nfeval(@assignin,'caller','score',0);\r\n%%\r\nM=[];\r\nflag=0;\r\nw=100;\r\n[M_fix,N]=PacBio_fix(M,w,flag);\r\n\r\nM_truth=randi(4,1,w,'uint8')-1;\r\nM=repmat(M_truth,N,1);\r\n\r\n% Apply 15% substitution error\r\nqerr=floor(.15*N*w);\r\nerrvec=randi(N*w,qerr,1);\r\nerrval=randi(4,qerr,1)-1;\r\n\r\nM(errvec)=errval;\r\n\r\nflag=1;\r\ntic\r\n[M_fix,N]=PacBio_fix(M,w,flag);\r\ntoc\r\n\r\nassert(isequal(M_fix,M_truth),sprintf('Error Count=%i',sum(M_fix~=M_truth)))\r\n%%\r\nM=[];\r\nflag=0;\r\nw=6144;\r\n[M_fix,N]=PacBio_fix(M,w,flag);\r\n\r\nM_truth=randi(4,1,w,'uint8')-1;\r\nM=repmat(M_truth,N,1);\r\n\r\n% Apply 15% substitution error\r\nqerr=floor(.15*N*w);\r\nerrvec=randi(N*w,qerr,1);\r\nerrval=randi(4,qerr,1)-1;\r\n\r\nM(errvec)=errval;\r\n\r\nflag=1;\r\ntic\r\n[M_fix,N]=PacBio_fix(M,w,flag);\r\ntoc\r\n\r\nassert(isequal(M_fix,M_truth),sprintf('Error Count=%i',sum(M_fix~=M_truth)))\r\n\r\n%%\r\n% Size Performance is based on w=1024 case\r\nM=[];\r\nflag=0;\r\nw=1024;\r\n[M_fix,N]=PacBio_fix(M,w,flag);\r\n\r\nM_truth=randi(4,1,w,'uint8')-1;\r\nM=repmat(M_truth,N,1);\r\n\r\n% Apply 15% substitution error\r\nqerr=floor(.15*N*w);\r\nerrvec=randi(N*w,qerr,1);\r\nerrval=randi(4,qerr,1)-1;\r\n\r\nM(errvec)=errval;\r\n\r\nflag=1;\r\ntic\r\n[M_fix,not_N]=PacBio_fix(M,w,flag);\r\ntoc\r\n\r\nassert(isequal(M_fix,M_truth),sprintf('Error Count=%i',sum(M_fix~=M_truth)))\r\n\r\nfeval(@assignin,'caller','score',min(20,N));\r\n\r\n\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":2,"test_suite_updated_at":"2012-10-08T02:30:34.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2012-07-01T05:26:57.000Z","updated_at":"2012-10-08T02:40:09.000Z","published_at":"2012-10-08T02:29:50.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe Melopsittacus undulates genome, Parrot Budgerigar, was successfully sequenced in July 2012 using long 3rd Gen sequences provided by\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.pacificbiosciences.com/\\\"\u003e\u003cw:r\u003e\u003cw:t\u003ePacBio\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. The\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://assemblathon.org/a-parrot-a-fish-and-a-snake-walk-into-a-bar\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eAssemblathon Genome Contest\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e led the team of Phillippy, Koren and Jarvis to successfully\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.sciencedaily.com/releases/2012/07/120702210229.htm\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eSequence Parrot DNA\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e using the PacBio 3rd Generation data and Illumina 2nd Gen data.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe 3rd gen PacBio data is very long, 1K-20K, but has 15% error rate. The Illumina data is 100-500 long with \u0026lt;1% error rate. Jarvis and his team combined this data to achieve \u0026lt; 0.1% error rate.\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\u003eGenome Challenge 004 is the correction of simplified PacBio simulated reads with high error rate.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eCall 1: empty array, segment Width, Flag=0\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\u003eCall 2: N PacBio DNA vectors (N x width), Segment Width, Flag=1\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eOutput:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eCall 1: empty vector, Number of Requested Vectors\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\u003eCall 2: Corrected DNA vector, Number of Requested Vectors\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\u003eScore:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Number of N vectors used to produce correct vector for w=1024 case\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe first call to the PacBio_fix routine returns the number of vectors requested to produce a final product. This may be a function of w.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe second call to PacBio_fix will have a DNA matix (N x width) and flag=1.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe response to the second call is the fixed DNA sequence, vector of width w.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eexample:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e First call return : N=3\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[01230123111122223333 Truth\\nInput example\\n01232123112122221332 Injected errors\\n01130123111122123323\\n11230133121122223333\\n\\nOutput: \\n01230123111122223333 Truth, hopefully]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis data is simplified by only having simple substitutions and the data sets are provided pre-aligned.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe real PacBio data is quite a bit more complicated. Values may be added, deleted, substituted, and are of varying lengths. This causes alignment issues.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eFollow-Up Challenges: Sample Data from the PacBio site for\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.cbcb.umd.edu/software/PBcR/\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eLambda Phage\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e will be molded into various Challenges. Possible challenges are correcting individual long segments and assembling multiple long segments into the full Lambda Phage genome. The Parrot genome is too big for Cody to solve in 50 seconds.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":787,"title":"Path Optimization thru N words : Time Optimization","description":"This is an extension of\r\n\u003chttp://www.mathworks.com/matlabcentral/cody/problems/196-love-is-an-n-letter-word Cody 196 love\u003e with a more stressing test set and scoring based upon time.\r\n\r\nGreater than 10 words induces time issues with brute force combinatorics.\r\n\r\nDescription is copy of Alfonso Nieto-Castanon's problem statement for Cody 196.\r\n\r\nGiven a list of N words, return the N-letter word (choosing one letter from each word) with the property of having the least distance between each pair of two consecutive letters (if there are multiple optimal solutions return any one of them). Letters may repeat inside words.\r\n\r\nExample: s1 = {'abcd','bcde','cdef','defg'}; should return s2 = 'dddd'; (with total letter-distance = 0)\r\n\r\nExample: s1={'aldfejk','czoa','vwy','abcde'}; should return s2='love'; (with total letter-distance = 27: 'l'-'o'=3 + 'o'-'v'=7 + 'v'-'e'=17 ; compare for example to the possible word 'aave' which has a total letter-distance of 38)\r\n\r\n*Passing:* All problems correct and time \u003c 2 seconds\r\n\r\n*Output chart:* Time in milliseconds with a max of 100 ms.\r\n\r\nNote: Did consider logarithmic scale but keeping it simple for now.","description_html":"\u003cp\u003eThis is an extension of \u003ca href=\"http://www.mathworks.com/matlabcentral/cody/problems/196-love-is-an-n-letter-word\"\u003eCody 196 love\u003c/a\u003e with a more stressing test set and scoring based upon time.\u003c/p\u003e\u003cp\u003eGreater than 10 words induces time issues with brute force combinatorics.\u003c/p\u003e\u003cp\u003eDescription is copy of Alfonso Nieto-Castanon's problem statement for Cody 196.\u003c/p\u003e\u003cp\u003eGiven a list of N words, return the N-letter word (choosing one letter from each word) with the property of having the least distance between each pair of two consecutive letters (if there are multiple optimal solutions return any one of them). Letters may repeat inside words.\u003c/p\u003e\u003cp\u003eExample: s1 = {'abcd','bcde','cdef','defg'}; should return s2 = 'dddd'; (with total letter-distance = 0)\u003c/p\u003e\u003cp\u003eExample: s1={'aldfejk','czoa','vwy','abcde'}; should return s2='love'; (with total letter-distance = 27: 'l'-'o'=3 + 'o'-'v'=7 + 'v'-'e'=17 ; compare for example to the possible word 'aave' which has a total letter-distance of 38)\u003c/p\u003e\u003cp\u003e\u003cb\u003ePassing:\u003c/b\u003e All problems correct and time \u0026lt; 2 seconds\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput chart:\u003c/b\u003e Time in milliseconds with a max of 100 ms.\u003c/p\u003e\u003cp\u003eNote: Did consider logarithmic scale but keeping it simple for now.\u003c/p\u003e","function_template":"function y = min_path_cost(s1)\r\n  s2 = '';\r\nend","test_suite":"%%\r\nfeval(@assignin,'caller','score',100);\r\n%%\r\nformat short\r\nformat compact\r\nglobal net_time\r\ns1 = {'abcd','bcde','cdef','defg'};\r\n\r\ns2=min_path_cost(s1); % to get good time\r\nt0=clock;\r\ns2=min_path_cost(s1);\r\ndt=etime(clock,t0)*1e3;\r\n\r\nassert(isequal(s2,'dddd'))\r\n\r\nnet_time=dt\r\n%%\r\nglobal net_time\r\ntemp=net_time; % anti-cheat\r\ns1 = {'aldfejk','czoa','vwy','abcde'};\r\n\r\ns2=min_path_cost(s1);\r\nt0=clock;\r\ns2=min_path_cost(s1);\r\ndt=etime(clock,t0)*1e3\r\n\r\nassert(isequal(s2,'love'))\r\n\r\nnet_time=temp+dt\r\n%%\r\nglobal net_time\r\n% anti-cheat \r\ntemp=net_time;\r\n\r\ns1 = {'aldfejk','czoa','vwy','abcde'};\r\n\r\ns2=min_path_cost(s1);\r\nt0=clock;\r\npause(0.2);\r\ns2=min_path_cost(s1);\r\ndt=etime(clock,t0)*1e3\r\n\r\nassert(isequal(s2,'love'))\r\n\r\nif dt\u003c200\r\n net_time=2001 % cheat trap fail condition\r\nend\r\n%%\r\n% not part of the time trial\r\n% avoids look-up table hack - Castano\r\ns1 = cellfun(@(x)char('a'-1+randi(26,1,5)),cell(1,7),'uniformoutput',false);\r\nassert(all(any(bsxfun(@eq,min_path_cost(s1),cell2mat(cellfun(@(x)x',s1,'uniformoutput',false)))))\u0026all(sum(abs(diff(double(min_path_cost(s1)))))\u003c=sum(abs(diff(double(cell2mat(cellfun(@(x)x(randi(numel(x),1,1000))',s1,'uniformoutput',false))),1,2)),2)));\r\n%%\r\nglobal net_time\r\ntemp=net_time;\r\ns1 = {'lqjfac','deamv','fkazbw','idlw','ajmf','abcwz','wxyz'}; %lmklmww\r\n\r\ns2=min_path_cost(s1);\r\nt0=clock;\r\ns2=min_path_cost(s1);\r\ndt=etime(clock,t0)*1e3\r\n\r\nassert(isequal(s2,'lmklmww'))\r\nnet_time=temp+dt\r\n\r\n%%\r\nglobal net_time\r\ntemp=net_time;\r\ns1 = {'lwjac','demv','fkabw','idlw','pqmf','abcnq','fwxyz','mnop'};\r\n\r\ns2=min_path_cost(s1);\r\nt0=clock;\r\ns2=min_path_cost(s1);\r\ndt=etime(clock,t0)*1e3\r\n\r\nassert(isequal(s2,'cdfdfcfm')|isequal(s2,'cdbdfcfm'))\r\nnet_time=temp+dt\r\n%%\r\nglobal net_time\r\ntemp=net_time;\r\ns1 = {'ldjac','demv','fkabw','idlw','pqmf','abcnq','fwxyz','mnop','flap'};\r\n\r\ns2=min_path_cost(s1);\r\nt0=clock;\r\ns2=min_path_cost(s1);\r\ndt=etime(clock,t0)*1e3\r\n\r\nassert(isequal(s2,'ddfdfcfml')|isequal(s2,'ddbdfcfml'))\r\nnet_time=temp+dt\r\n%%\r\nglobal net_time\r\ntemp=net_time;\r\ns1 = {'the','goal','of','life','is','living','in','agreement','with','nature'};\r\n\r\ns2=min_path_cost(s1);\r\nt0=clock;\r\ns2=min_path_cost(s1);\r\ndt=etime(clock,t0)*1e3\r\n\r\nassert(isequal(s2,'hgfiiiighe')|isequal(s2,'hgffiiighe'))\r\nnet_time=temp+dt\r\n%%\r\nglobal net_time\r\ntemp=net_time;\r\ns1 = {'he' 'has','all','the','virtues','idislike','andnone','ofthe','vicesi','admire'};\r\n\r\ns2=min_path_cost(s1);\r\nt0=clock;\r\ns2=min_path_cost(s1);\r\ndt=etime(clock,t0)*1e3\r\n\r\nassert(isequal(s2,'eaaeeeeeee'))\r\nnet_time=temp+dt\r\n%%\r\nglobal net_time\r\ntemp=net_time;\r\n\r\ns1 = {'history' 'will','be','kind','to','me','for','i','intend','to','write','it'};\r\n\r\ns2=min_path_cost(s1);\r\nt0=clock;\r\ns2=min_path_cost(s1);\r\ndt=etime(clock,t0)*1e3\r\n\r\nassert(isequal(s2,'iiekomoiiort')|isequal(s2,'iieiomoiiort'))\r\nnet_time=temp+dt\r\n\r\n%%\r\nglobal net_time\r\n% Time performance rqmt\r\nassert(net_time\u003c2000,sprintf('Net time = %s',num2str(net_time))); \r\n%%\r\nglobal net_time\r\n% net_time in ms\r\n% Create graph data\r\nnet_time=min(100,net_time) % Limit graph y-axis\r\n\r\nfeval(@assignin,'caller','score',floor(net_time));\r\n\r\n%fh=fopen('min_path_cost.m','wt');\r\n%fprintf(fh,'%s\\n',repmat('1;',[1,round(net_time/2)]));\r\n%fclose(fh);","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":8,"test_suite_updated_at":"2012-11-22T12:11:45.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2012-06-24T20:34:17.000Z","updated_at":"2012-11-22T12:11:45.000Z","published_at":"2012-06-25T00:03:56.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis is an extension of\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/problems/196-love-is-an-n-letter-word\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eCody 196 love\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e with a more stressing test set and scoring based upon time.\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\u003eGreater than 10 words induces time issues with brute force combinatorics.\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\u003eDescription is copy of Alfonso Nieto-Castanon's problem statement for Cody 196.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eGiven a list of N words, return the N-letter word (choosing one letter from each word) with the property of having the least distance between each pair of two consecutive letters (if there are multiple optimal solutions return any one of them). Letters may repeat inside words.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eExample: s1 = {'abcd','bcde','cdef','defg'}; should return s2 = 'dddd'; (with total letter-distance = 0)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eExample: s1={'aldfejk','czoa','vwy','abcde'}; should return s2='love'; (with total letter-distance = 27: 'l'-'o'=3 + 'o'-'v'=7 + 'v'-'e'=17 ; compare for example to the possible word 'aave' which has a total letter-distance of 38)\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\u003ePassing:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e All problems correct and time \u0026lt; 2 seconds\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 chart:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Time in milliseconds with a max of 100 ms.\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\u003eNote: Did consider logarithmic scale but keeping it simple for now.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":988,"title":"Convert a substructure reference string into a valid definition structure for subsref and subsasgn","description":"You have a reference to an element in a data structure, which you want to pass to a function. Not the value itself, but the reference. And you don't like to use evil eval constructions. \r\nTherefore, you convert the reference into a structure, like liked by Matlab's built-in subsref and subsasgn functions.\r\n\r\nFor example, to reference the value a(12), you would have to convert '(12)' into \r\n\r\n  def = \r\n    type: '()'\r\n    subs: {[12]}\r\n\r\nAnd to reference a(12).field_b{1,3}{2}((3:4),:).c, you would need to convert '(12).field_b{1,3}{2}((3:4),:).c' into \r\n\r\n  def(1) = \r\n    type: '()'\r\n    subs: {[12]}\r\n\r\n  def(2) = \r\n    type: '.'\r\n    subs: {'field_b'}\r\n\r\n  def(3) = \r\n    type: '{}'\r\n    subs: {[1]  [3]}\r\n\r\n  def(4) = \r\n    type: '{}'\r\n    subs: {2}\r\n\r\n  def(5) = \r\n    type: '()'\r\n    subs: {[3 4]  ':'}\r\n\r\n  def(6) = \r\n    type: '.'\r\n    subs: {'c'}\r\n\r\nThe assignment is correct when any sub-structure reference that is accepted by subsref and subsasgn is correctly converted from a string to a valid structure.\r\n\r\nNote: Solutions wrapped in (f)eval(c), inline, str2func, regexprep (dynamic regular expressions), etc, are not appreciated.","description_html":"\u003cp\u003eYou have a reference to an element in a data structure, which you want to pass to a function. Not the value itself, but the reference. And you don't like to use evil eval constructions. \r\nTherefore, you convert the reference into a structure, like liked by Matlab's built-in subsref and subsasgn functions.\u003c/p\u003e\u003cp\u003eFor example, to reference the value a(12), you would have to convert '(12)' into\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003edef = \r\n  type: '()'\r\n  subs: {[12]}\r\n\u003c/pre\u003e\u003cp\u003eAnd to reference a(12).field_b{1,3}{2}((3:4),:).c, you would need to convert '(12).field_b{1,3}{2}((3:4),:).c' into\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003edef(1) = \r\n  type: '()'\r\n  subs: {[12]}\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003edef(2) = \r\n  type: '.'\r\n  subs: {'field_b'}\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003edef(3) = \r\n  type: '{}'\r\n  subs: {[1]  [3]}\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003edef(4) = \r\n  type: '{}'\r\n  subs: {2}\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003edef(5) = \r\n  type: '()'\r\n  subs: {[3 4]  ':'}\r\n\u003c/pre\u003e\u003cpre class=\"language-matlab\"\u003edef(6) = \r\n  type: '.'\r\n  subs: {'c'}\r\n\u003c/pre\u003e\u003cp\u003eThe assignment is correct when any sub-structure reference that is accepted by subsref and subsasgn is correctly converted from a string to a valid structure.\u003c/p\u003e\u003cp\u003eNote: Solutions wrapped in (f)eval(c), inline, str2func, regexprep (dynamic regular expressions), etc, are not appreciated.\u003c/p\u003e","function_template":"function def = subsdef(defstr)\r\n  def = substruct('()',{1});\r\nend","test_suite":"%%\r\nnocheat = isempty(regexp(evalc('type subsdef'),'(eval|regexprep|inline|str2func)'));\r\ny_correct = 1i;\r\nb(12) = y_correct;\r\ndefstr = '(12)';\r\nassert(isequal(subsref(b,subsdef(defstr)),y_correct) \u0026\u0026 nocheat)\r\n\r\n%%\r\nnocheat = isempty(regexp(evalc('type subsdef'),'(eval|regexprep|inline|str2func)'));\r\ny_correct = -4i;\r\nc{1,2,3,4,5}.field_b = y_correct;\r\ndefstr = '{1,2,3,4,5}.field_b';\r\nassert(isequal(subsref(c,subsdef(defstr)),y_correct) \u0026\u0026 nocheat)\r\n\r\n%%\r\nnocheat = isempty(regexp(evalc('type subsdef'),'(eval|regexprep|inline|str2func)'));\r\ny_correct = 3i;\r\na(12).field_b{1,3}{2}((3),1).c = y_correct;\r\ndefstr = '(12).field_b{1,3}{2}((3),1).c';\r\nassert(isequal(subsref(a,subsdef(defstr)),y_correct) \u0026\u0026 nocheat)\r\n\r\n%%\r\nnocheat = isempty(regexp(evalc('type subsdef'),'(eval|regexprep|inline|str2func)'));\r\ny_correct = repmat(2i,3,1);\r\nd{2}.a(1:3,:) = y_correct;\r\ndefstr = '{2}.a(1:3,:)';\r\nassert(isequal(subsref(d,subsdef(defstr)),y_correct) \u0026\u0026 nocheat)\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":6556,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":7,"test_suite_updated_at":"2012-10-11T14:58:11.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2012-10-11T14:55:15.000Z","updated_at":"2012-10-11T14:58:11.000Z","published_at":"2012-10-11T14:55:15.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eYou have a reference to an element in a data structure, which you want to pass to a function. Not the value itself, but the reference. And you don't like to use evil eval constructions. Therefore, you convert the reference into a structure, like liked by Matlab's built-in subsref and subsasgn functions.\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\u003eFor example, to reference the value a(12), you would have to convert '(12)' into\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[def = \\n  type: '()'\\n  subs: {[12]}]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eAnd to reference a(12).field_b{1,3}{2}((3:4),:).c, you would need to convert '(12).field_b{1,3}{2}((3:4),:).c' into\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[def(1) = \\n  type: '()'\\n  subs: {[12]}\\n\\ndef(2) = \\n  type: '.'\\n  subs: {'field_b'}\\n\\ndef(3) = \\n  type: '{}'\\n  subs: {[1]  [3]}\\n\\ndef(4) = \\n  type: '{}'\\n  subs: {2}\\n\\ndef(5) = \\n  type: '()'\\n  subs: {[3 4]  ':'}\\n\\ndef(6) = \\n  type: '.'\\n  subs: {'c'}]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe assignment is correct when any sub-structure reference that is accepted by subsref and subsasgn is correctly converted from a string to a valid structure.\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\u003eNote: Solutions wrapped in (f)eval(c), inline, str2func, regexprep (dynamic regular expressions), etc, are not appreciated.\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\"}]}"},null,null,{"id":715,"title":"Chezz_015 : Simplified chess","description":"Chezz:...A simplified Chess game. Two game match with future multiple skill levels via evolutionary upgrades.\r\n\r\nSimplified the rules to implement rapid move check. Normal Chess moves like \"a4\", Castling, and En Passant are accepted. Moves are simple vectors [idx_from idx_to promo] where promo is for pawns reaching the 8th rank. Piece names are numeric 1-6 White (P,R,N,B,Q,K) and Black is 7-12. Board empty space is 0.\r\n\r\nChezz unique rules: 1) To Win must remove opponent's King.. 2) Lose Turn if try an impossible move.. 3) Checks are ignored - allow move into check, castle out of check, castle thru/into check.. 4) Pawn promote to any piece, including opponent and vacuum.. 5) Six position repetition is a Draw..6) 50 moves No captures is a Draw..\r\n\r\n\r\n*Inputs:* (b,pmv,castle)\r\n\r\nPlayer always appears to be White. However, Black may apparently move first.\r\n\r\nb (8x8) array with empty=0, White Pieces 1-6, Blk Pieces 7-12\r\n\r\npmv [from to promo] vector of both players moves (needed for en passant option). Illegal move creates a [0 0 0] pmv value. Size [2*moves,3]\r\n\r\ncastle: 6 pt logical vector to show castling options. 1 if piece is eligible. Positions are [8 40 64 1 33 57] for [WQR WK WKR BQR BK BKR]. . . eg castle mv [40 56 0]\r\n\r\n\r\n\r\n*Output:* mv  [from to pawn_new_type] where from/to are 1-64 and pawn_new is 0 thru 12 if pawn is on final row.\r\n\r\n\r\n\r\nThe Test Suite will oversee two games with the Player as Black(moving second) and then as White.\r\n\r\n*Passing:* Player must Win both games\r\n\r\n*Evolution:* Winning player algorithms will be hosted as Chezz_xyz based on their wins over other Chezz algorithms. Champions and the basis will be fully credited in Chezz updates. Champions must be able to play self and Not Cody timeout.\r\n\r\n\r\nChezz_015: Pawn Serial Attack - Will capture and Promote\r\n\r\nLink update 12/27/12","description_html":"\u003cp\u003eChezz:...A simplified Chess game. Two game match with future multiple skill levels via evolutionary upgrades.\u003c/p\u003e\u003cp\u003eSimplified the rules to implement rapid move check. Normal Chess moves like \"a4\", Castling, and En Passant are accepted. Moves are simple vectors [idx_from idx_to promo] where promo is for pawns reaching the 8th rank. Piece names are numeric 1-6 White (P,R,N,B,Q,K) and Black is 7-12. Board empty space is 0.\u003c/p\u003e\u003cp\u003eChezz unique rules: 1) To Win must remove opponent's King.. 2) Lose Turn if try an impossible move.. 3) Checks are ignored - allow move into check, castle out of check, castle thru/into check.. 4) Pawn promote to any piece, including opponent and vacuum.. 5) Six position repetition is a Draw..6) 50 moves No captures is a Draw..\u003c/p\u003e\u003cp\u003e\u003cb\u003eInputs:\u003c/b\u003e (b,pmv,castle)\u003c/p\u003e\u003cp\u003ePlayer always appears to be White. However, Black may apparently move first.\u003c/p\u003e\u003cp\u003eb (8x8) array with empty=0, White Pieces 1-6, Blk Pieces 7-12\u003c/p\u003e\u003cp\u003epmv [from to promo] vector of both players moves (needed for en passant option). Illegal move creates a [0 0 0] pmv value. Size [2*moves,3]\u003c/p\u003e\u003cp\u003ecastle: 6 pt logical vector to show castling options. 1 if piece is eligible. Positions are [8 40 64 1 33 57] for [WQR WK WKR BQR BK BKR]. . . eg castle mv [40 56 0]\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e mv  [from to pawn_new_type] where from/to are 1-64 and pawn_new is 0 thru 12 if pawn is on final row.\u003c/p\u003e\u003cp\u003eThe Test Suite will oversee two games with the Player as Black(moving second) and then as White.\u003c/p\u003e\u003cp\u003e\u003cb\u003ePassing:\u003c/b\u003e Player must Win both games\u003c/p\u003e\u003cp\u003e\u003cb\u003eEvolution:\u003c/b\u003e Winning player algorithms will be hosted as Chezz_xyz based on their wins over other Chezz algorithms. Champions and the basis will be fully credited in Chezz updates. Champions must be able to play self and Not Cody timeout.\u003c/p\u003e\u003cp\u003eChezz_015: Pawn Serial Attack - Will capture and Promote\u003c/p\u003e\u003cp\u003eLink update 12/27/12\u003c/p\u003e","function_template":"function mv=player_move(b,pmv,castle)\r\n% Author: Richard Z\r\n% Bot name: First Pawn Attack\r\n% Chezz_015\r\n% http://tinyurl.com/matlab-chezz-Cmove015\r\n%\r\n% 0-wht 1-Blk; board 8x8, opponents last move, \r\n% castle vector(8 40 64 1 33 57) 0=has moved, 1=eligible\r\n mv=zeros(1,3); % [from to promo] \r\n % mv =[39 37 0] is e4\r\n % pmv (opponents last move) is used for en passant\r\n % [0 0 0] is invalid move or first move of game\r\n % castle is used to castle yourself or see if opponent may castle\r\n \r\n pieces=1:6;\r\n enemy=7:12;\r\n\r\n pv=find(b==1);\r\n no_move=true;\r\n ptr=0;\r\n \r\n % loop thru pawns types; capture L/R or Move up\r\n \r\n while no_move\r\n  ptr=ptr+1;\r\n  if ptr\u003elength(pv),break;end\r\n  [r c]=ind2sub([8 8],pv(ptr));\r\n  if ismember(r,[1 8]),continue;end % end row for a P\r\n  if c==1\r\n   if ismember(b(pv(ptr)+7),enemy) % capture\r\n    mv=[pv(ptr) pv(ptr)+7 6];\r\n    return;\r\n   end\r\n  end\r\n  if c==8\r\n   if ismember(b(pv(ptr)-9),enemy) % capture\r\n    mv=[pv(ptr) pv(ptr)-9 6];\r\n    return;\r\n   end\r\n  end\r\n  if c\u003c8 \u0026\u0026 c\u003e1\r\n   if ismember(b(pv(ptr)+7),enemy) % capture\r\n    mv=[pv(ptr) pv(ptr)+7 6];\r\n    return;\r\n   end\r\n   if ismember(b(pv(ptr)-9),enemy) % capture\r\n    mv=[pv(ptr) pv(ptr)-9 6];\r\n    return;\r\n   end\r\n  end\r\n  \r\n  % Move fwd\r\n  if b(pv(ptr)-1)==0\r\n   mv=[pv(ptr) pv(ptr)-1 6];\r\n   return;\r\n  end\r\n  \r\n end % while no move\r\n\r\nend % End of Computer Champion Bot","test_suite":"%%\r\n% Load in the routines that play the game and check move validity\r\ntic\r\nurlwrite('http://rmatlabtest.appspot.com/Chezz_Shell.m','Chezz_Shell.m') ;\r\nurlwrite('http://rmatlabtest.appspot.com/ghost_white.m','ghost_white.m') \r\nurlwrite('http://rmatlabtest.appspot.com/computer_move015.m','computer_move.m') \r\nurlwrite('http://rmatlabtest.appspot.com/mov_chk.m','mov_chk.m') \r\nrehash path\r\ntoc\r\n%%\r\n% Play Two Chezz games\r\n% Player must win Twice to Pass\r\nglobal pmvout1 pmvout2\r\ntic\r\n wins=0; % player wins\r\n b=zeros(8);% P 1/7 R 2/8 N 3/9 B 4/10 Q 5/11 K 6/12 \r\n b(2,:)=7;\r\n b(1,:)=[8 9 10 11 12 10 9 8]; % Player 7:12\r\n b(7,:)=1;\r\n b(8,:)=b(1,:)-6; % Computer 1:6\r\n b_orig=b;\r\n \r\n %mv=zeros(1,3); % [from to promo)]  \r\n %computer_wht=0; % 0 Computer plays wht\r\n %computer_wht=1; % 1 Computer plays black\r\n \r\n pmv=zeros(1,3); % [from to promo)] Opponents last move\r\n castle=[1 1 1 1 1 1];\r\n % False move call to satisfy Cody Rqmt of TestSuite match Ref Solution\r\n mv=player_move(b,pmv,castle)\r\n  \r\n for computer_wht=0:1\r\n  pmvout1=pmv; % Store game 1 moves\r\n  \r\n  dbg=0;\r\n  game_over=false;\r\n  b=b_orig;\r\n  no_capture=0;\r\n  b_hist=zeros(102,8,8);\r\n  pmv=zeros(1,3); % [from to promo)] Opponents last move\r\n  castle=[1 1 1 1 1 1]; % History of if ever moved w/b Castles/kings\r\n %  idx 8 40 64  1 33 57\r\n \r\n while ~game_over\r\n  mvP=zeros(1,3); % [from to type/promote)] \r\n  % Shell 0=Blk,1=Wht;Board;move,prev move;\r\n  % function (1 Play Comp, 2 Player, 3 Check mv)\r\n  \r\n  % White move\r\n  if computer_wht==0\r\n   [mvP]=Chezz_Shell(0,b,mvP,pmv,castle,1); % 0 Wht,... 1 Computer\r\n  else\r\n   [mvP]=Chezz_Shell(0,b,mvP,pmv,castle,2); % 0 Wht  2 is player\r\n  end\r\n  \r\n  \r\n  [mv]=Chezz_Shell(0,b,mvP,pmv(end,:),castle,3); % 0 Wht,..., 3 Check\r\n  pmv=[pmv;mv(1:3)];\r\n  capture=false;\r\n  % Board changes only occur in Suite code\r\n  if mv(1)~=0 % Valid move determined by mv_chk\r\n   if mv(4)==0 % Normal moves and promotions\r\n    if b(mv(2))~=0,capture=true;end\r\n     b(mv(2))=b(mv(1)); % potential promotion\r\n     b(mv(1))=0;\r\n     if ismember(b(mv(2)),[1 7])\r\n      if ismember(mv(2),[1:8:57 8:8:64])\r\n       b(mv(2))=mv(3); % Place promoted selection\r\n      end\r\n     end\r\n     \r\n   else % ep or castle by White\r\n    if mv(4)==1 % castle 0-0 or 0-0-0\r\n      b(mv(1))=0;\r\n      b(mv(2))=6;\r\n      if mv(2)==24\r\n        b(8)=0;b(32)=2;  \r\n      else\r\n        b(64)=0;b(48)=2;\r\n      end    \r\n    end % castle\r\n    if mv(4)==2 % ep\r\n      capture=true;\r\n      b(mv(1))=0;\r\n      b(mv(2))=1; % White Pawn\r\n      b(mv(2)+1)=0; % Take pawn that passed\r\n    end % end ep\r\n   end % move implemented\r\n  end % end move\r\n  \r\n  %b % display board after move\r\n  \r\n  if isempty(find(b==12,1))\r\n   % Game over : Black King Captured\r\n   game_over=true; % change to if comp=wht or blk for win\r\n   if computer_wht==1 % Blk Computer King; Player is Wht captured Blk King \r\n    wins=wins+1;\r\n   end\r\n   continue;\r\n  end\r\n  \r\n  castle=castle.*logical([b(8)==2 b(40) b(64)==2 b(1)==8 b(33) b(57)==8]);\r\n  \r\n  if ~capture\r\n   no_capture=no_capture+1;\r\n   if no_capture\u003e100\r\n       fprintf('Draw 100 moves no capture\\n');\r\n       game_over=true;\r\n   end % move is b and w\r\n   b_hist(no_capture,:,:)=b;\r\n  else\r\n   no_capture=1;\r\n   b_hist=b_hist*0;\r\n   b_hist(no_capture,:,:)=b;\r\n  end\r\n   \r\n  % Black Move\r\n  mvP=zeros(1,4); % [from to type/promote specials(castle=1/ep=2)] \r\n if computer_wht==0\r\n   [mvP]=Chezz_Shell(1,b,mvP,pmv,castle,2); % 2 Blk,... 2 is player\r\n  else\r\n   [mvP]=Chezz_Shell(1,b,mvP,pmv,castle,1); % 2 Blk  1 is Computer\r\n end\r\n  \r\n  [mv]=Chezz_Shell(1,b,mvP,pmv(end,:),castle,3); % 2 Blk,..., 3 Check\r\n  \r\n pmv=[pmv;mv(1:3)];\r\n capture=false;\r\n  % Board changes only occur in Suite code\r\n  if mv(1)~=0 % Valid move determined by mv_chk\r\n   if mv(4)==0 % Normal moves and promotions\r\n    if b(mv(2))~=0,capture=true;end\r\n    b(mv(2))=b(mv(1)); % potential promotion\r\n    b(mv(1))=0;\r\n    if ismember(b(mv(2)),[1 7])\r\n     if ismember(mv(2),[1:8:57 8:8:64])\r\n      b(mv(2))=mv(3); % Place promoted selection\r\n     end\r\n    end\r\n   else % ep or castle by Black\r\n    if mv(4)==1 % castle 0-0 or 0-0-0\r\n      b(mv(1))=0;\r\n      b(mv(2))=12;\r\n      if mv(2)==49 % Blk 0-0\r\n        b(57)=0;b(41)=8;  \r\n      else % Blk 0-0-0\r\n        b(1)=0;b(25)=8;\r\n      end    \r\n    end % castle\r\n    if mv(4)==2 % ep by Black\r\n      capture=true;\r\n      b(mv(1))=0;\r\n      b(mv(2))=mv(3);\r\n    % White passed black on prior move\r\n      b(mv(2)-1)=0; \r\n    end % end ep\r\n   end % move implemented\r\n  end % end move\r\n  \r\n%   b\r\n%   figure(1);imagesc(b,[0 12]);axis equal;\r\n  \r\n  if isempty(find(b==6,1))\r\n   % Game over : Blk captured White King\r\n   game_over=true;\r\n   if computer_wht==0 % Wht Computer King; Player is Blk captured Wht King\r\n    wins=wins+1;\r\n   end\r\n   continue\r\n  end\r\n  \r\n  castle=castle.*logical([b(8)==2 b(40) b(64)==2 b(1)==8 b(33) b(57)==8]);\r\n  \r\n  if ~capture\r\n   no_capture=no_capture+1;\r\n   if no_capture\u003e100\r\n       fprintf('Draw 100 moves no capture\\n');\r\n       game_over=true;\r\n   end % move is b and w\r\n   b_hist(no_capture,:,:)=b;\r\n   % Check for 3 position repetition\r\n   for i=1:no_capture-1\r\n    cdelta=0;\r\n    for j=i+1:no_capture\r\n     delta=(b_hist(i,:,:)-b_hist(j,:,:));\r\n     if sum(abs(delta(:)))==0\r\n      cdelta=cdelta+1;\r\n     end\r\n    end\r\n    if cdelta\u003e=7 % repetitions 3 identical setups\r\n     fprintf('Game over due to repetition\\n');\r\n     game_over=true;\r\n    end\r\n   end % rep check loop \r\n  else\r\n   no_capture=1;\r\n   b_hist=b_hist*0;\r\n   b_hist(no_capture,:,:)=b;\r\n  end % ~capture\r\n  \r\n end % While ~game_over\r\n \r\n end % wht_blk\r\n\r\npmvout2=pmv;\r\nwins\r\n \r\n% Player must win Twice to Pass\r\ntoc\r\nassert(isequal(wins,2))\r\n\r\n%%\r\nglobal pmvout1 pmvout2\r\n% Output moves for games\r\n\r\n% Output game 2 moves\r\npmv=pmvout1;\r\n   for i=2:3:size(pmv,1)-3\r\n    fprintf('%2i %2i %2i %2i %2i %2i %2i %2i %2i \\n',pmv(i,1:3),pmv(i+1,1:3),pmv(i+2,1:3));\r\n   end\r\n   fprintf('%2i %2i %2i\\n',pmv(end-2,:));\r\n   fprintf('%2i %2i %2i\\n',pmv(end-1,:));\r\n   fprintf('%2i %2i %2i\\n',pmv(end,:));\r\n \r\n% Output game 2 moves\r\npmv=pmvout2;\r\n for i=2:3:size(pmv,1)-3\r\n  fprintf('%2i %2i %2i %2i %2i %2i %2i %2i %2i \\n',pmv(i,1:3),pmv(i+1,1:3),pmv(i+2,1:3));\r\n  end\r\n% repeat of moves\r\n fprintf('%2i %2i %2i\\n',pmv(end-2,:));\r\n fprintf('%2i %2i %2i\\n',pmv(end-1,:));\r\n fprintf('%2i %2i %2i\\n',pmv(end,:));","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":3,"test_suite_updated_at":"2012-12-27T22:40:04.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2012-05-24T04:58:57.000Z","updated_at":"2012-12-27T22:50:08.000Z","published_at":"2012-05-24T05:15:44.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eChezz:...A simplified Chess game. Two game match with future multiple skill levels via evolutionary upgrades.\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\u003eSimplified the rules to implement rapid move check. Normal Chess moves like \\\"a4\\\", Castling, and En Passant are accepted. Moves are simple vectors [idx_from idx_to promo] where promo is for pawns reaching the 8th rank. Piece names are numeric 1-6 White (P,R,N,B,Q,K) and Black is 7-12. Board empty space is 0.\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\u003eChezz unique rules: 1) To Win must remove opponent's King.. 2) Lose Turn if try an impossible move.. 3) Checks are ignored - allow move into check, castle out of check, castle thru/into check.. 4) Pawn promote to any piece, including opponent and vacuum.. 5) Six position repetition is a Draw..6) 50 moves No captures is a Draw..\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 (b,pmv,castle)\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\u003ePlayer always appears to be White. However, Black may apparently move first.\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\u003eb (8x8) array with empty=0, White Pieces 1-6, Blk Pieces 7-12\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\u003epmv [from to promo] vector of both players moves (needed for en passant option). Illegal move creates a [0 0 0] pmv value. Size [2*moves,3]\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\u003ecastle: 6 pt logical vector to show castling options. 1 if piece is eligible. Positions are [8 40 64 1 33 57] for [WQR WK WKR BQR BK BKR]. . . eg castle mv [40 56 0]\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 mv [from to pawn_new_type] where from/to are 1-64 and pawn_new is 0 thru 12 if pawn is on final row.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe Test Suite will oversee two games with the Player as Black(moving second) and then as White.\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\u003ePassing:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Player must Win both games\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\u003eEvolution:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Winning player algorithms will be hosted as Chezz_xyz based on their wins over other Chezz algorithms. Champions and the basis will be fully credited in Chezz updates. Champions must be able to play self and Not Cody timeout.\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\u003eChezz_015: Pawn Serial Attack - Will capture and Promote\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\u003eLink update 12/27/12\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":726,"title":"Chezz_020 Pawn Attack and Slaying King","description":"Chezz:...A simplified Chess game. Two game match with future multiple skill levels via evolutionary upgrades.\r\n\r\nSimplified the rules to implement rapid move check. Normal Chess moves like \"a4\", Castling, and En Passant are accepted. Moves are simple vectors [idx_from idx_to promo] where promo is for pawns reaching the 8th rank. Piece names are numeric 1-6 White (P,R,N,B,Q,K) and Black is 7-12. Board empty space is 0.\r\n\r\nChezz unique rules: 1) To Win must remove opponent's King.. 2) Lose Turn if try an impossible move.. 3) Checks are ignored - allow move into check, castle out of check, castle thru/into check.. 4) Pawn promote to any piece, including opponent and vacuum.. 5) Six position repetition is a Draw..6) 50 moves No captures is a Draw..\r\n\r\n\r\n*Inputs:* (b,pmv,castle)\r\n\r\nPlayer always appears to be White. However, Black may apparently move first.\r\n\r\nb (8x8) array with empty=0, White Pieces 1-6, Blk Pieces 7-12\r\n\r\npmv [from to promo] vector of both players moves (needed for en passant option). Illegal move creates a [0 0 0] pmv value. Size [2*moves,3]\r\n\r\ncastle: 6 pt logical vector to show castling options. 1 if piece is eligible. Positions are [8 40 64 1 33 57] for [WQR WK WKR BQR BK BKR]. . . eg castle mv [40 56 0]\r\n\r\n\r\n\r\n*Output:* mv  [from to pawn_new_type] where from/to are 1-64 and pawn_new is 0 thru 12 if pawn is on final row.\r\n\r\n\r\n\r\nThe Test Suite will oversee two games with the Player as Black(moving second) and then as White.\r\n\r\n*Passing:* Player must Win both games\r\n\r\n*Evolution:* Winning player algorithms will be hosted as Chezz_xyz based on their wins over other Chezz algorithms. Champions and the basis will be fully credited in Chezz updates. Champions must be able to play self and Not Cody timeout.\r\n\r\nChezz_020: Pawn Attack then Mad King Attack\r\n\r\nLink update 12/27/12","description_html":"\u003cp\u003eChezz:...A simplified Chess game. Two game match with future multiple skill levels via evolutionary upgrades.\u003c/p\u003e\u003cp\u003eSimplified the rules to implement rapid move check. Normal Chess moves like \"a4\", Castling, and En Passant are accepted. Moves are simple vectors [idx_from idx_to promo] where promo is for pawns reaching the 8th rank. Piece names are numeric 1-6 White (P,R,N,B,Q,K) and Black is 7-12. Board empty space is 0.\u003c/p\u003e\u003cp\u003eChezz unique rules: 1) To Win must remove opponent's King.. 2) Lose Turn if try an impossible move.. 3) Checks are ignored - allow move into check, castle out of check, castle thru/into check.. 4) Pawn promote to any piece, including opponent and vacuum.. 5) Six position repetition is a Draw..6) 50 moves No captures is a Draw..\u003c/p\u003e\u003cp\u003e\u003cb\u003eInputs:\u003c/b\u003e (b,pmv,castle)\u003c/p\u003e\u003cp\u003ePlayer always appears to be White. However, Black may apparently move first.\u003c/p\u003e\u003cp\u003eb (8x8) array with empty=0, White Pieces 1-6, Blk Pieces 7-12\u003c/p\u003e\u003cp\u003epmv [from to promo] vector of both players moves (needed for en passant option). Illegal move creates a [0 0 0] pmv value. Size [2*moves,3]\u003c/p\u003e\u003cp\u003ecastle: 6 pt logical vector to show castling options. 1 if piece is eligible. Positions are [8 40 64 1 33 57] for [WQR WK WKR BQR BK BKR]. . . eg castle mv [40 56 0]\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e mv  [from to pawn_new_type] where from/to are 1-64 and pawn_new is 0 thru 12 if pawn is on final row.\u003c/p\u003e\u003cp\u003eThe Test Suite will oversee two games with the Player as Black(moving second) and then as White.\u003c/p\u003e\u003cp\u003e\u003cb\u003ePassing:\u003c/b\u003e Player must Win both games\u003c/p\u003e\u003cp\u003e\u003cb\u003eEvolution:\u003c/b\u003e Winning player algorithms will be hosted as Chezz_xyz based on their wins over other Chezz algorithms. Champions and the basis will be fully credited in Chezz updates. Champions must be able to play self and Not Cody timeout.\u003c/p\u003e\u003cp\u003eChezz_020: Pawn Attack then Mad King Attack\u003c/p\u003e\u003cp\u003eLink update 12/27/12\u003c/p\u003e","function_template":"function mv=player_move(b,pmv,castle)\r\n% Author: Richard Z\r\n% Bot name: First Pawn then King Attack\r\n% Chezz_020\r\n% http://tinyurl.com/matlab-chezz-Cmove020\r\n mv=zeros(1,3); % [from to promo] \r\n% This is your opponent\r\n\r\n pieces=1:6;\r\n enemy=7:12;\r\n \r\n king_mv=[7 8 9 -1 1 -9 -8 -7]; %\r\n king_attack=[-9 -8 -7 -1 1 7 8 9]; %\r\n \r\n pv=find(b==1); % vector of Pawns\r\n no_move=true;\r\n ptr=0;\r\n \r\n % loop thru piece types\r\n \r\n while no_move % Pawn\r\n  ptr=ptr+1;\r\n  if ptr\u003elength(pv),break;end\r\n  [r c]=ind2sub([8 8],pv(ptr));\r\n  if ismember(r,[1 8]),continue;end % end row for a P\r\n  if c==1\r\n   if ismember(b(pv(ptr)+7),enemy) % capture\r\n    mv=[pv(ptr) pv(ptr)+7 6];\r\n    return;\r\n   end\r\n  end\r\n  if c==8\r\n   if ismember(b(pv(ptr)-9),enemy) % capture\r\n    mv=[pv(ptr) pv(ptr)-9 6];\r\n    return;\r\n   end\r\n  end\r\n  if c\u003c8 \u0026\u0026 c\u003e1\r\n   if ismember(b(pv(ptr)+7),enemy) % capture\r\n    mv=[pv(ptr) pv(ptr)+7 6];\r\n    return;\r\n   end\r\n   if ismember(b(pv(ptr)-9),enemy) % capture\r\n    mv=[pv(ptr) pv(ptr)-9 6];\r\n    return;\r\n   end\r\n  end\r\n  \r\n  % Move fwd\r\n  if b(pv(ptr)-1)==0\r\n   mv=[pv(ptr) pv(ptr)-1 6];\r\n   return;\r\n  end\r\n  \r\n end % while no move Pawn\r\n\r\n% No pawn move found; Move on to King\r\n\r\n% No pawn moves left: Attack with King\r\n\r\npv=find(b==6); % Find Kings\r\nno_move=true;\r\nptr=0;\r\n\r\nwhile no_move % King captures\r\n  ptr=ptr+1;\r\n  if ptr\u003elength(pv),break;end\r\n  [r c]=ind2sub([8 8],pv(ptr));\r\n  for i=1:8 % 8 King attacks\r\n   if (pv(ptr)+king_attack(i)\u003e64) || (pv(ptr)+king_attack(i)\u003c1),continue;end\r\n   if r==1 \u0026\u0026 ismember(i,[1 4 6]),continue;end % make ~ismem 1:64\r\n   if r==8 \u0026\u0026 ismember(i,[3 5 8]),continue;end\r\n   if c==1 \u0026\u0026 ismember(i,[1 2 3]),continue;end\r\n   if c==8 \u0026\u0026 ismember(i,[6 7 8]),continue;end\r\n   if ismember(b(pv(ptr)+king_attack(i)),enemy) % capture\r\n    mv=[pv(ptr) pv(ptr)+king_attack(i) 0]; % errant r1 attack idx 1 to idx 8\r\n    return; % Attack found\r\n   end\r\n  end % 8 King attacks\r\nend % while King capture search\r\n\r\n% No King capture move found\r\nmyk=pv(1); % First King\r\nek=find(b==max(enemy),1); %Find an enemy king\r\n[kr1 kc1]=ind2sub([8 8],myk);\r\n[er1 ec1]=ind2sub([8 8],ek);\r\nif er1\u003c=kr1 \u0026\u0026 ec1\u003e=kc1,king_mv=[7 8 -1 9 -9 -8 1 -7];end\r\nif er1\u003e=kr1 \u0026\u0026 ec1\u003e=kc1,king_mv=[9 8  1 -7 7 -8 -1 -9];end\r\nif er1\u003c=kr1 \u0026\u0026 ec1\u003c=kc1,king_mv=[-9 -1 -8 -7 7 8 1 9];end\r\nif er1\u003e=kr1 \u0026\u0026 ec1\u003c=kc1,king_mv=[-7 1 -8 9 -9 8 -1 7];end\r\nfor i=1:8\r\n if kr1==1 \u0026\u0026 ismember(king_mv(i),[-9 -1 7]),continue;end\r\n if kr1==8 \u0026\u0026 ismember(king_mv(i),[-7 1 9]),continue;end\r\n if kc1==1 \u0026\u0026 ismember(king_mv(i),[-9 -8 -7]),continue;end\r\n if kc1==8 \u0026\u0026 ismember(king_mv(i),[7 8 9]),continue;end\r\n if ismember(b(myk+king_mv(i)),0) % empty\r\n  mv=[myk myk+king_mv(i) 0];\r\n  return; % path found\r\n end\r\nend\r\n% Hopefully don't get here as mv=[0 0 0]\r\n\r\nend % End of Computer Champion Bot","test_suite":"%%\r\n% Load in the routines that play the game and check move validity\r\ntic\r\nurlwrite('http://rmatlabtest.appspot.com/Chezz_Shell.m','Chezz_Shell.m') ;\r\nurlwrite('http://rmatlabtest.appspot.com/ghost_white.m','ghost_white.m') \r\nurlwrite('http://rmatlabtest.appspot.com/computer_move020.m','computer_move.m') \r\nurlwrite('http://rmatlabtest.appspot.com/mov_chk.m','mov_chk.m') \r\nrehash path\r\ntoc\r\n%%\r\n% Play Two Chezz games\r\n% Player must win Twice to Pass\r\nglobal pmvout1 pmvout2\r\ntic\r\n wins=0; % player wins\r\n b=zeros(8);% P 1/7 R 2/8 N 3/9 B 4/10 Q 5/11 K 6/12 \r\n b(2,:)=7;\r\n b(1,:)=[8 9 10 11 12 10 9 8]; % Player 7:12\r\n b(7,:)=1;\r\n b(8,:)=b(1,:)-6; % Computer 1:6\r\n b_orig=b;\r\n \r\n %mv=zeros(1,3); % [from to promo)]  \r\n %computer_wht=0; % 0 Computer plays wht\r\n %computer_wht=1; % 1 Computer plays black\r\n \r\n pmv=zeros(1,3); % [from to promo)] Opponents last move\r\n castle=[1 1 1 1 1 1];\r\n % False move call to satisfy Cody Rqmt of TestSuite match Ref Solution\r\n mv=player_move(b,pmv,castle)\r\n  \r\n for computer_wht=0:1\r\n  pmvout1=pmv; % Store game 1 moves\r\n  \r\n  dbg=0;\r\n  game_over=false;\r\n  b=b_orig;\r\n  no_capture=0;\r\n  b_hist=zeros(102,8,8);\r\n  pmv=zeros(1,3); % [from to promo)] Opponents last move\r\n  castle=[1 1 1 1 1 1]; % History of if ever moved w/b Castles/kings\r\n %  idx 8 40 64  1 33 57\r\n \r\n while ~game_over\r\n  mvP=zeros(1,3); % [from to type/promote)] \r\n  % Shell 0=Blk,1=Wht;Board;move,prev move;\r\n  % function (1 Play Comp, 2 Player, 3 Check mv)\r\n  \r\n  % White move\r\n  if computer_wht==0\r\n   [mvP]=Chezz_Shell(0,b,mvP,pmv,castle,1); % 0 Wht,... 1 Computer\r\n  else\r\n   [mvP]=Chezz_Shell(0,b,mvP,pmv,castle,2); % 0 Wht  2 is player\r\n  end\r\n  \r\n  \r\n  [mv]=Chezz_Shell(0,b,mvP,pmv(end,:),castle,3); % 0 Wht,..., 3 Check\r\n  pmv=[pmv;mv(1:3)];\r\n  capture=false;\r\n  % Board changes only occur in Suite code\r\n  if mv(1)~=0 % Valid move determined by mv_chk\r\n   if mv(4)==0 % Normal moves and promotions\r\n    if b(mv(2))~=0,capture=true;end\r\n     b(mv(2))=b(mv(1)); % potential promotion\r\n     b(mv(1))=0;\r\n     if ismember(b(mv(2)),[1 7])\r\n      if ismember(mv(2),[1:8:57 8:8:64])\r\n       b(mv(2))=mv(3); % Place promoted selection\r\n      end\r\n     end\r\n     \r\n   else % ep or castle by White\r\n    if mv(4)==1 % castle 0-0 or 0-0-0\r\n      b(mv(1))=0;\r\n      b(mv(2))=6;\r\n      if mv(2)==24\r\n        b(8)=0;b(32)=2;  \r\n      else\r\n        b(64)=0;b(48)=2;\r\n      end    \r\n    end % castle\r\n    if mv(4)==2 % ep\r\n      capture=true;\r\n      b(mv(1))=0;\r\n      b(mv(2))=1; % White Pawn\r\n      b(mv(2)+1)=0; % Take pawn that passed\r\n    end % end ep\r\n   end % move implemented\r\n  end % end move\r\n  \r\n  %b % display board after move\r\n  \r\n  if isempty(find(b==12,1))\r\n   % Game over : Black King Captured\r\n   game_over=true; % change to if comp=wht or blk for win\r\n   if computer_wht==1 % Blk Computer King; Player is Wht captured Blk King \r\n    wins=wins+1;\r\n   end\r\n   continue;\r\n  end\r\n  \r\n  castle=castle.*logical([b(8)==2 b(40) b(64)==2 b(1)==8 b(33) b(57)==8]);\r\n  \r\n  if ~capture\r\n   no_capture=no_capture+1;\r\n   if no_capture\u003e100\r\n       fprintf('Draw 100 moves no capture\\n');\r\n       game_over=true;\r\n   end % move is b and w\r\n   b_hist(no_capture,:,:)=b;\r\n  else\r\n   no_capture=1;\r\n   b_hist=b_hist*0;\r\n   b_hist(no_capture,:,:)=b;\r\n  end\r\n   \r\n  % Black Move\r\n  mvP=zeros(1,4); % [from to type/promote specials(castle=1/ep=2)] \r\n if computer_wht==0\r\n   [mvP]=Chezz_Shell(1,b,mvP,pmv,castle,2); % 2 Blk,... 2 is player\r\n  else\r\n   [mvP]=Chezz_Shell(1,b,mvP,pmv,castle,1); % 2 Blk  1 is Computer\r\n end\r\n  \r\n  [mv]=Chezz_Shell(1,b,mvP,pmv(end,:),castle,3); % 2 Blk,..., 3 Check\r\n  \r\n pmv=[pmv;mv(1:3)];\r\n capture=false;\r\n  % Board changes only occur in Suite code\r\n  if mv(1)~=0 % Valid move determined by mv_chk\r\n   if mv(4)==0 % Normal moves and promotions\r\n    if b(mv(2))~=0,capture=true;end\r\n    b(mv(2))=b(mv(1)); % potential promotion\r\n    b(mv(1))=0;\r\n    if ismember(b(mv(2)),[1 7])\r\n     if ismember(mv(2),[1:8:57 8:8:64])\r\n      b(mv(2))=mv(3); % Place promoted selection\r\n     end\r\n    end\r\n   else % ep or castle by Black\r\n    if mv(4)==1 % castle 0-0 or 0-0-0\r\n      b(mv(1))=0;\r\n      b(mv(2))=12;\r\n      if mv(2)==49 % Blk 0-0\r\n        b(57)=0;b(41)=8;  \r\n      else % Blk 0-0-0\r\n        b(1)=0;b(25)=8;\r\n      end    \r\n    end % castle\r\n    if mv(4)==2 % ep by Black\r\n      capture=true;\r\n      b(mv(1))=0;\r\n      b(mv(2))=mv(3);\r\n    % White passed black on prior move\r\n      b(mv(2)-1)=0; \r\n    end % end ep\r\n   end % move implemented\r\n  end % end move\r\n  \r\n%   b\r\n%   figure(1);imagesc(b,[0 12]);axis equal;\r\n  \r\n  if isempty(find(b==6,1))\r\n   % Game over : Blk captured White King\r\n   game_over=true;\r\n   if computer_wht==0 % Wht Computer King; Player is Blk captured Wht King\r\n    wins=wins+1;\r\n   end\r\n   continue\r\n  end\r\n  \r\n  castle=castle.*logical([b(8)==2 b(40) b(64)==2 b(1)==8 b(33) b(57)==8]);\r\n  \r\n  if ~capture\r\n   no_capture=no_capture+1;\r\n   if no_capture\u003e100\r\n       fprintf('Draw 100 moves no capture\\n');\r\n       game_over=true;\r\n   end % move is b and w\r\n   b_hist(no_capture,:,:)=b;\r\n   % Check for 3 position repetition\r\n   for i=1:no_capture-1\r\n    cdelta=0;\r\n    for j=i+1:no_capture\r\n     delta=(b_hist(i,:,:)-b_hist(j,:,:));\r\n     if sum(abs(delta(:)))==0\r\n      cdelta=cdelta+1;\r\n     end\r\n    end\r\n    if cdelta\u003e=7 % repetitions 3 identical setups\r\n     fprintf('Game over due to repetition\\n');\r\n     game_over=true;\r\n    end\r\n   end % rep check loop \r\n  else\r\n   no_capture=1;\r\n   b_hist=b_hist*0;\r\n   b_hist(no_capture,:,:)=b;\r\n  end % ~capture\r\n  \r\n end % While ~game_over\r\n \r\n end % wht_blk\r\n\r\npmvout2=pmv;\r\nwins\r\n \r\n% Player must win Twice to Pass\r\ntoc\r\nassert(isequal(wins,2))\r\n\r\n%%\r\nglobal pmvout1 pmvout2\r\n% Output moves for games\r\n\r\n% Output game 2 moves\r\npmv=pmvout1;\r\n   for i=2:3:size(pmv,1)-3\r\n    fprintf('%2i %2i %2i %2i %2i %2i %2i %2i %2i \\n',pmv(i,1:3),pmv(i+1,1:3),pmv(i+2,1:3));\r\n   end\r\n   fprintf('%2i %2i %2i\\n',pmv(end-2,:));\r\n   fprintf('%2i %2i %2i\\n',pmv(end-1,:));\r\n   fprintf('%2i %2i %2i\\n',pmv(end,:));\r\n \r\n% Output game 2 moves\r\npmv=pmvout2;\r\n for i=2:3:size(pmv,1)-3\r\n  fprintf('%2i %2i %2i %2i %2i %2i %2i %2i %2i \\n',pmv(i,1:3),pmv(i+1,1:3),pmv(i+2,1:3));\r\n  end\r\n% repeat of moves\r\n fprintf('%2i %2i %2i\\n',pmv(end-2,:));\r\n fprintf('%2i %2i %2i\\n',pmv(end-1,:));\r\n fprintf('%2i %2i %2i\\n',pmv(end,:));","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":"2012-12-27T22:44:29.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2012-05-28T06:59:32.000Z","updated_at":"2012-12-27T22:44:29.000Z","published_at":"2012-05-28T07:41:09.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eChezz:...A simplified Chess game. Two game match with future multiple skill levels via evolutionary upgrades.\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\u003eSimplified the rules to implement rapid move check. Normal Chess moves like \\\"a4\\\", Castling, and En Passant are accepted. Moves are simple vectors [idx_from idx_to promo] where promo is for pawns reaching the 8th rank. Piece names are numeric 1-6 White (P,R,N,B,Q,K) and Black is 7-12. Board empty space is 0.\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\u003eChezz unique rules: 1) To Win must remove opponent's King.. 2) Lose Turn if try an impossible move.. 3) Checks are ignored - allow move into check, castle out of check, castle thru/into check.. 4) Pawn promote to any piece, including opponent and vacuum.. 5) Six position repetition is a Draw..6) 50 moves No captures is a Draw..\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 (b,pmv,castle)\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\u003ePlayer always appears to be White. However, Black may apparently move first.\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\u003eb (8x8) array with empty=0, White Pieces 1-6, Blk Pieces 7-12\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\u003epmv [from to promo] vector of both players moves (needed for en passant option). Illegal move creates a [0 0 0] pmv value. Size [2*moves,3]\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\u003ecastle: 6 pt logical vector to show castling options. 1 if piece is eligible. Positions are [8 40 64 1 33 57] for [WQR WK WKR BQR BK BKR]. . . eg castle mv [40 56 0]\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 mv [from to pawn_new_type] where from/to are 1-64 and pawn_new is 0 thru 12 if pawn is on final row.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe Test Suite will oversee two games with the Player as Black(moving second) and then as White.\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\u003ePassing:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Player must Win both games\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\u003eEvolution:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Winning player algorithms will be hosted as Chezz_xyz based on their wins over other Chezz algorithms. Champions and the basis will be fully credited in Chezz updates. Champions must be able to play self and Not Cody timeout.\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\u003eChezz_020: Pawn Attack then Mad King Attack\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\u003eLink update 12/27/12\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":727,"title":"Checkerz_000 Kamikazi Kings","description":"Checkerz: A simplified single jump checkers game between a computer bot and a player bot. Multiple jumps are not allowed.\r\n\r\nThe setup requires the player to copy the entire template into his solution.\r\n\r\nThe template includes a Shell routine that call the Player, Computer, and the Jump Check routines for move validation.\r\n\r\nThe player writes his Bot under the player_move routine.\r\n\r\nThe player will always appear to be playing as White.\r\nThe players pieces are 1-Pawn and 2-King.\r\n\r\nThe Computer pieces will appear as 3-Pawn and 4-King.\r\n\r\nThe board is a standard 8x8 with empty squares as 0.\r\n\r\nThe player move is an array index from-to. eg mv=[8 15].  Value range 1 to 64.\r\n\r\nThe routine find_jumps will provide all potential jumps.\r\n\r\nIf a jump(s) may occur then one must be used. eg mv=[8 22] which jumps a piece on 15.\r\n\r\nAn invalid move or a missed jump is a Loss.\r\n\r\n*Input:* Board  8x8 array \r\n\r\n*Output:* Move  [index_from  index_to]\r\n\r\nTo Pass requires Winning Twice. Once as first move and once as second move.\r\n\r\n100 No-capture move series is a Draw\r\n\r\nMoves will be displayed\r\n\r\nCheckerz_000 Kamikazi_Kings: Random Pawn moves and Kings will hunt the enemy.","description_html":"\u003cp\u003eCheckerz: A simplified single jump checkers game between a computer bot and a player bot. Multiple jumps are not allowed.\u003c/p\u003e\u003cp\u003eThe setup requires the player to copy the entire template into his solution.\u003c/p\u003e\u003cp\u003eThe template includes a Shell routine that call the Player, Computer, and the Jump Check routines for move validation.\u003c/p\u003e\u003cp\u003eThe player writes his Bot under the player_move routine.\u003c/p\u003e\u003cp\u003eThe player will always appear to be playing as White.\r\nThe players pieces are 1-Pawn and 2-King.\u003c/p\u003e\u003cp\u003eThe Computer pieces will appear as 3-Pawn and 4-King.\u003c/p\u003e\u003cp\u003eThe board is a standard 8x8 with empty squares as 0.\u003c/p\u003e\u003cp\u003eThe player move is an array index from-to. eg mv=[8 15].  Value range 1 to 64.\u003c/p\u003e\u003cp\u003eThe routine find_jumps will provide all potential jumps.\u003c/p\u003e\u003cp\u003eIf a jump(s) may occur then one must be used. eg mv=[8 22] which jumps a piece on 15.\u003c/p\u003e\u003cp\u003eAn invalid move or a missed jump is a Loss.\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e Board  8x8 array\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e Move  [index_from  index_to]\u003c/p\u003e\u003cp\u003eTo Pass requires Winning Twice. Once as first move and once as second move.\u003c/p\u003e\u003cp\u003e100 No-capture move series is a Draw\u003c/p\u003e\u003cp\u003eMoves will be displayed\u003c/p\u003e\u003cp\u003eCheckerz_000 Kamikazi_Kings: Random Pawn moves and Kings will hunt the enemy.\u003c/p\u003e","function_template":"function mv = Checkerz_Shell(wht_blk,b,mv,ptr)\r\n % Copy this into Players function entry\r\n %figure(1);imagesc(b,[-2 4]);axis equal\r\n %pause(0.1)\r\n \r\n % Remap routine so Engines always think they are White\r\n bv=zeros(8,8); % form of 8x8\r\n bv(1:64)=1:64;\r\n %pmap=(1:4); % [WP WK BP BK]\r\n if wht_blk==1 % Invert Player Perspective\r\n  [b,mv,bv]=ghost_white(b,mv,bv);\r\n end\r\n \r\n % Call Algorithm - White based\r\n % Un-Map to Black if required\r\n \r\n switch ptr\r\n     case {1}\r\n         mv=computer_move(b);\r\n% Self play\r\n% mv=player_move(b);\r\n     case {2}\r\n         mv=player_move(b);\r\n     case {3}\r\n         mv=mov_chk(b,mv);\r\n end % switch ptr\r\n \r\n %Remap mv to Black or leave unchanged if White\r\n if ismember(mv(1),1:64),mv(1)=bv(mv(1));end\r\n if ismember(mv(2),1:64),mv(2)=bv(mv(2));end\r\n \r\nend % Checkerz_Shell\r\n\r\nfunction [b,mv,bv]=ghost_white(b,mv,bv)\r\n% Map Blk to Wht to process \r\n  bv=rot90(rot90(bv)); % Board re-map\r\n  pmap=[3 4 1 2]; % Piece re-map to WP WK BP BK\r\n  \r\n  b=rot90(rot90(b));\r\n  v=find(b\u003e0);\r\n  b(v)=pmap(b(v));\r\n  \r\n  v=find(mv(1:2)\u003e0);\r\n  mv(v)=bv(mv(v));\r\n  \r\nend\r\n\r\nfunction [jv]=find_jumps(b)\r\n jv=[];\r\n P=find(b==1);\r\n K=find(b==2);\r\n \r\n Pjv=ones(64,2);\r\n Pjv = bsxfun(@times, Pjv, [-18 14]); % TL TR\r\n Pjv(1:18,:)=bsxfun(@times,Pjv(1:18,:),[0 1]);\r\n Pjv(2:8:58,:)=bsxfun(@times,Pjv(2:8:58,:),[0 0]);\r\n Pjv(50:64,:)=bsxfun(@times,Pjv(50:64,:),[1 0]);\r\n Pjv([1:2:7 10:2:16 17:2:23],:)=bsxfun(@times,Pjv([1:2:7 10:2:16 17:2:23],:),[0 0]);\r\n Pjv([26:2:32 33:2:39 42:2:48],:)=bsxfun(@times,Pjv([26:2:32 33:2:39 42:2:48],:),[0 0]);\r\n Pjv([49:2:55 58:2:64],:)=bsxfun(@times,Pjv([49:2:55 58:2:64],:),[0 0]);\r\n \r\n Kjv=ones(64,4);\r\n Kjv = bsxfun(@times, Kjv, [14 18 -14 -18]); % TR BR BL TL\r\n Kjv([2 9],:)=bsxfun(@times,Kjv([2 9],:),[0 1 0 0]);\r\n Kjv([4 6 11 13],:)=bsxfun(@times,Kjv([4 6 11 13],:),[1 1 0 0]);\r\n Kjv([8 15],:)=bsxfun(@times,Kjv([8 15],:),[1 0 0 0]);\r\n Kjv([18 25 34 41],:)=bsxfun(@times,Kjv([18 25 34 41],:),[0 1 1 0]);\r\n Kjv([24 31 40 47],:)=bsxfun(@times,Kjv([24 31 40 47],:),[1 0 0 1]);\r\n Kjv([50 57],:)=bsxfun(@times,Kjv([50 57],:),[0 0 1 0]);\r\n Kjv([52 54 59 61],:)=bsxfun(@times,Kjv([52 54 59 61],:),[0 0 1 1]);\r\n Kjv([56 63],:)=bsxfun(@times,Kjv([56 63],:),[0 0 0 1]);\r\n Kjv([1:2:7 10:2:16 17:2:23],:)=bsxfun(@times,Kjv([1:2:7 10:2:16 17:2:23],:),[0 0 0 0]);\r\n Kjv([26:2:32 33:2:39 42:2:48],:)=bsxfun(@times,Kjv([26:2:32 33:2:39 42:2:48],:),[0 0 0 0]);\r\n Kjv([49:2:55 58:2:64],:)=bsxfun(@times,Kjv([49:2:55 58:2:64],:),[0 0 0 0]);\r\n \r\n for i=1:length(P)\r\n  Pi=P(i);\r\n  for j=1:2\r\n   if Pjv(Pi,j)==0,continue;end\r\n   if b(Pi+Pjv(Pi,j))==0 \u0026\u0026 b(Pi+Pjv(Pi,j)/2)\u003e2\r\n    jv=[jv;Pi Pi+Pjv(Pi,j)];\r\n   end\r\n  end\r\n end\r\n \r\n \r\n \r\n for i=1:length(K)\r\n  Ki=K(i);\r\n  for j=1:4\r\n   if Kjv(Ki,j)==0,continue;end\r\n   if b(Ki+Kjv(Ki,j))==0 \u0026\u0026 b(Ki+Kjv(Ki,j)/2)\u003e2\r\n    jv=[jv;Ki K(i)+Kjv(Ki,j)];\r\n   end\r\n  end\r\n end\r\n\r\n \r\nend\r\n\r\n function mv=player_move(b)\r\n % Copy Checkerz_Shell, computer_move, and mov_chk functions into entry  \r\n % Create Player entry inside this function\r\n %\r\n % Author: Your Name\r\n % Bot name:  Your Bot's Nmae\r\n\r\n mv=[0 0]; % [from to] \r\n \r\n% Introduction function to avoid missing jumps\r\n% Player may modify. This is informational jumps only\r\n jv=find_jumps(b);\r\n if ~isempty(jv)\r\n  mv=jv(1,:); % Use the first jump\r\n  return\r\n end\r\n\r\n % End of Player entry\r\n end % End of Player Bot\r\n\r\nfunction mv=computer_move(b)\r\n% Author: Richard Z\r\n% Bot name: Kamikazi : Jump, Pmove, Kattack, Kmove \r\n% Checkerz_000\r\n mv=[0 0]; % [from to] \r\n \r\n jv=find_jumps(b);\r\n if ~isempty(jv)\r\n  mv=jv(1,:); % Use the first jump\r\n  return\r\n end\r\n\r\n % Pawn\r\n pv=find(b==1); % vector of Pawns\r\n %if ~isempty(pv),pv=pv(randperm(length(pv)));end\r\n ptr=0;\r\n while true % Pawn\r\n  pm=[-9 7];\r\n  ptr=ptr+1;\r\n  if ptr\u003elength(pv),break;end\r\n  [r c]=ind2sub([8 8],pv(ptr));\r\n  if c==1, pm=pm.*[0 1];end\r\n  if c==8,pm=pm.*[1 0];end\r\n  \r\n  for i=1:2\r\n   if b(pv(ptr)+pm(i))==0\r\n    mv=[pv(ptr) pv(ptr)+pm(i)];\r\n    return\r\n   end\r\n  end\r\n end % while no move Pawn\r\n \r\n \r\n % No King capture move found\r\nmyk=find(b==2,1); % First King\r\nep=find(b\u003e2,1); %Find an enemy piece, Pawns or Kings\r\n[kr1 kc1]=ind2sub([8 8],myk);\r\n[er1 ec1]=ind2sub([8 8],ep);\r\nif er1\u003c=kr1 \u0026\u0026 ec1\u003e=kc1,king_mv=[7 9 -9 -7];end\r\nif er1\u003e=kr1 \u0026\u0026 ec1\u003e=kc1,king_mv=[9 7 -7 -9];end\r\nif er1\u003c=kr1 \u0026\u0026 ec1\u003c=kc1,king_mv=[-9 7 -7 9];end\r\nif er1\u003e=kr1 \u0026\u0026 ec1\u003c=kc1,king_mv=[-7 9 -9 7];end\r\nfor i=1:4\r\n if kr1==1 \u0026\u0026 ismember(king_mv(i),[-9 7]),continue;end\r\n if kr1==8 \u0026\u0026 ismember(king_mv(i),[-7 9]),continue;end\r\n if kc1==1 \u0026\u0026 ismember(king_mv(i),[-9 -7]),continue;end\r\n if kc1==8 \u0026\u0026 ismember(king_mv(i),[7 9]),continue;end\r\n if b(myk+king_mv(i))==0 % empty square\r\n  mv=[myk myk+king_mv(i)];\r\n  return; % path found\r\n end\r\nend\r\n \r\n% Can I get here if I have a King?\r\n % King\r\n kv=find(b==2); % vector of Kings\r\n %if ~isempty(pv),pv=pv(randperm(length(pv)));end\r\n ptr=0;\r\n while true % King\r\n  km=[7 9 -7 -9];\r\n  ptr=ptr+1;\r\n  if ptr\u003elength(kv),break;end\r\n  [r c]=ind2sub([8 8],kv(ptr));\r\n  if c==1, km=km.*[1 1 0 0];end\r\n  if c==8, km=km.*[0 0 1 1];end\r\n  if r==1, km=km.*[0 1 1 0];end\r\n  if r==8, km=km.*[1 0 0 1];end\r\n  \r\n  \r\n  for i=1:4\r\n   if b(kv(ptr)+km(i))==0\r\n    mv=[kv(ptr) kv(ptr)+km(i)];\r\n    return\r\n   end\r\n  end\r\n end % while no move King\r\n \r\n \r\n% Hopefully don't get here as mv=[0 0] and we lose\r\n\r\nend % End of Computer Bot\r\n\r\nfunction mv_out=mov_chk(b,mv)\r\n % Improvement of mov_chk will be a separate Cody challenge\r\n % Must Copy into Solution Entry\r\n % Invalid move returns [0 0]\r\n mv_out=[0 0]; % default is Invalid\r\n \r\n % verify valid: Entry, Color, Possible capture\r\n if ~ismember(mv(1),1:64) || ~ismember(mv(2),1:64),return;end % Invalid mv\r\n if ~ismember(b(mv(1)),(1:2)),return;end % Moving Wrong team\r\n  % Must move to empty square\r\n if b(mv(2))~=0,return;end\r\n \r\n  \r\n delta=mv(2)-mv(1); % Movement vector\r\n if ~ismember(delta,[7 9 14 18 -7 -9 -14 -18]),return;end % Invalid mv\r\n \r\n msum=mv(1)+mv(2); % Jump midpoint if jump check\r\n \r\n  % use for move checks\r\n [r1 c1]=ind2sub([8 8],mv(1));\r\n [r2 c2]=ind2sub([8 8],mv(2));\r\n \r\n if abs(r1-r2)\u003e2,return;end % Invalid\r\n if abs(c1-c2)\u003e2,return;end % Invalid\r\n   \r\n jv=find_jumps(b);\r\n\r\n if ~isempty(jv)\r\n  if abs(delta)\u003c14,return;end % Jump not executed\r\n end\r\n \r\n \r\n if abs(delta)\u003e13 % Jump claimed\r\n  if b(msum/2)\u003c3,return;end % Invalid Jump -Own or Empty\r\n  \r\n  if b(mv(1))==1 \u0026\u0026 (delta==-18 ||delta==14)\r\n   mv_out=mv; % Valid move\r\n   return;\r\n  end % Legal P Jump\r\n  \r\n  if b(mv(1))==2 \u0026\u0026 (abs(delta)==18 || abs(delta)==14)\r\n   mv_out=mv; % Valid move\r\n   return;\r\n  end % Legal K Jump\r\n  \r\n  return; % Invalid Jump\r\n end % Jump\r\n \r\n % abs(delta)\u003c12 Regular move\r\n if b(mv(1))==1 \u0026\u0026 (delta==-9 ||delta==7)\r\n  mv_out=mv; % Valid move\r\n  return;\r\n end % Legal P mv\r\n \r\n if b(mv(1))==2 \u0026\u0026 (abs(delta)==9 || abs(delta) ==7)\r\n  mv_out=mv; % Valid move\r\n  return;\r\n end % Legal K mv\r\n \r\n mv_out=[0 0]; % Checks failed\r\nend\r\n","test_suite":"%%\r\n%Test Suite\r\ntic\r\n wins=0; % player wins\r\n b=zeros(8);% WP 1 BP 3  [WK 2 BK 4] \r\n b([2 9 11 18 25 27 34 41 43 50 57 59])=3;\r\n b([6 8 15 22 24 31 38 40 47 54 56 63])=1;\r\n b_orig=b;\r\n \r\n %mv=zeros(1,2); % [from to promo)]  \r\n %computer_wht=0; % 0 Computer plays wht\r\n %computer_wht=1; % 1 Computer plays black\r\n \r\n pmv=zeros(1,2); % Move History for record only\r\n  \r\n for computer_wht=0:1\r\n  if size(pmv,1)\u003e3\r\n   for i=1:4:size(pmv,1)-4\r\n    fprintf('%2i %2i %2i %2i %2i %2i %2i %2i\\n',pmv(i,1:2),pmv(i+1,1:2),pmv(i+2,1:2),pmv(i+3,1:2));\r\n   end\r\n   fprintf('%2i %2i\\n',pmv(end-3,:));\r\n   fprintf('%2i %2i\\n',pmv(end-2,:));\r\n   fprintf('%2i %2i\\n',pmv(end-1,:));\r\n   fprintf('%2i %2i\\n',pmv(end,:));\r\n % Output game 1 moves\r\n  end\r\n  %pmv % Output move history from Game 1\r\n  game_over=false;\r\n  b=b_orig; % Reset for second game\r\n  no_capture=0;\r\n  pmv=zeros(1,2); % [from to promo)] Opponents last move\r\n \r\n while ~game_over\r\n  mvP=zeros(1,2); % [from to] \r\n  % Shell 0=Blk,1=Wht;Board;move,prev move;\r\n  % function (1 Play Comp, 2 Player, 3 Check mv)\r\n  \r\n  % White move\r\n  if computer_wht==0\r\n   [mvP]=Checkerz_Shell(0,b,mvP,1); % 0 Wht,... 1 Computer\r\n  else\r\n   [mvP]=Checkerz_Shell(0,b,mvP,2); % 0 Wht  2 is player\r\n  end\r\n  \r\n  [mv]=Checkerz_Shell(0,b,mvP,3); % 0 Wht,..., 3 Check\r\n  \r\n  pmv=[pmv;mv(1:2)];\r\n  capture=false;\r\n  % Board changes only occur in Suite code\r\n  if mv(1)~=0 % Valid move determined by mv_chk \r\n    b(mv(2))=b(mv(1)); % potential promotion\r\n    b(mv(1))=0;\r\n    if ismember(mv(2),[9 25 41 57])\r\n     b(mv(2))=2; % Kinged\r\n    end\r\n    if abs(mv(1)-mv(2))\u003e9\r\n     % Piece jumped\r\n     capture=true;\r\n     b((mv(1)+mv(2))/2)=0;\r\n    end\r\n  end % end move\r\n  \r\n  if isempty(find(b\u003e2)) % White has captured All Blk Pieces\r\n   game_over=true; % change to if comp=wht or blk for win\r\n   if computer_wht==1 % Blk Computer Loses; Player is Wht \r\n    wins=wins+1;\r\n   end\r\n   continue;\r\n  end\r\n  \r\n  if mv(1)==0 % No legal move or missed jump\r\n   % Game over : White failed to move and Loses\r\n   game_over=true; % change to if comp=wht or blk for win\r\n   if computer_wht==0 % Wht Computer Loses; Player is Blk \r\n    wins=wins+1;\r\n   end\r\n   continue;\r\n  end\r\n    \r\n  if ~capture\r\n   no_capture=no_capture+1;\r\n   if no_capture\u003e100\r\n       fprintf('Draw 100 moves no capture\\n');\r\n       game_over=true;\r\n   end %\r\n  else\r\n   no_capture=1;\r\n  end\r\n   \r\n  % Black Move\r\n  mvP=[0 0]; % [from to type/promote specials(castle=1/ep=2)] \r\n if computer_wht==0\r\n   [mvP]=Checkerz_Shell(1,b,mvP,2); % 2 Blk,... 2 is player\r\n  else\r\n   [mvP]=Checkerz_Shell(1,b,mvP,1); % 2 Blk  1 is Computer\r\n end\r\n  \r\n  [mv]=Checkerz_Shell(1,b,mvP,3); % 2 Blk,..., 3 Check\r\n  \r\n pmv=[pmv;mv(1:2)];\r\n \r\n capture=false;\r\n  % Board changes only occur in Suite code\r\n  if mv(1)~=0 % Valid move determined by mv_chk \r\n    b(mv(2))=b(mv(1)); % potential promotion\r\n    b(mv(1))=0;\r\n    if ismember(mv(2),[8 24 40 56])\r\n     b(mv(2))=4; % Kinged\r\n    end\r\n    if abs(mv(1)-mv(2))\u003e9\r\n     % Piece jumped\r\n     capture=true;\r\n     b((mv(1)+mv(2))/2)=0;\r\n    end\r\n  end % end move\r\n  \r\n  if isempty([find(b==1)' find(b==2)']) % Black has captured All Wht Pieces\r\n   game_over=true; % change to if comp=wht or blk for win\r\n   if computer_wht==0 % Wht Computer Loses; Player is Blk \r\n    wins=wins+1;\r\n   end\r\n   continue;\r\n  end\r\n  \r\n  if mv(1)==0 % No legal move or missed jump by Black\r\n   % Game over : Black failed to move correctly and Loses\r\n   game_over=true; % change to if comp=wht or blk for win\r\n   if computer_wht==1 % Blk Computer Loses; Player is Wht \r\n    wins=wins+1;\r\n   end\r\n   continue;\r\n  end\r\n  \r\n  if ~capture\r\n   no_capture=no_capture+1;\r\n   if no_capture\u003e100\r\n       fprintf('Draw 100 moves no capture\\n');\r\n       game_over=true;\r\n   end % move is b and w\r\n  else\r\n   no_capture=1;\r\n  end % ~capture\r\n  \r\n end % While ~game_over\r\n \r\n end % wht_blk\r\n \r\n wins\r\n   if size(pmv,1)\u003e3\r\n    for i=1:4:size(pmv,1)-4\r\n     fprintf('%2i %2i %2i %2i %2i %2i %2i %2i\\n',pmv(i,1:2),pmv(i+1,1:2),pmv(i+2,1:2),pmv(i+3,1:2));\r\n    end\r\n    fprintf('%2i %2i\\n',pmv(end-3,:));\r\n    fprintf('%2i %2i\\n',pmv(end-2,:));\r\n    fprintf('%2i %2i\\n',pmv(end-1,:));\r\n    fprintf('%2i %2i\\n',pmv(end,:));\r\n % Output game 2 moves?\r\n  end\r\n \r\nwins\r\ntoc\r\n\r\n % Player must beat computer twice\r\n %assert(isequal(wins,2))\r\n \r\nPass=1;\r\nassert(isequal(Pass,1))","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":3,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2012-05-30T03:08:30.000Z","updated_at":"2012-05-30T03:20:09.000Z","published_at":"2012-05-30T03:17:56.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eCheckerz: A simplified single jump checkers game between a computer bot and a player bot. Multiple jumps are not allowed.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe setup requires the player to copy the entire template into his solution.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe template includes a Shell routine that call the Player, Computer, and the Jump Check routines for move validation.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe player writes his Bot under the player_move routine.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe player will always appear to be playing as White. The players pieces are 1-Pawn and 2-King.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe Computer pieces will appear as 3-Pawn and 4-King.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe board is a standard 8x8 with empty squares as 0.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe player move is an array index from-to. eg mv=[8 15]. Value range 1 to 64.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe routine find_jumps will provide all potential jumps.\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\u003eIf a jump(s) may occur then one must be used. eg mv=[8 22] which jumps a piece on 15.\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\u003eAn invalid move or a missed jump is a Loss.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Board 8x8 array\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 Move [index_from index_to]\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\u003eTo Pass requires Winning Twice. Once as first move and once as second 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:t\u003e100 No-capture move series is a Draw\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\u003eMoves will be displayed\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\u003eCheckerz_000 Kamikazi_Kings: Random Pawn moves and Kings will hunt the enemy.\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\"}]}"},null,{"id":2646,"title":"Determine the number of maximal cliques in an undirected graph","description":"In an undirected graph, a clique is a subset of vertices that are fully connected, i.e. there is an edge between all pairs of vertices in the subset. A _maximal_ clique is one in which the subset of vertices is not part of a larger clique. So, for instance, a fully connected graph has many cliques, but only one maximal clique.\r\n\r\nGiven an NxN adjacency matrix (A) for an undirected graph with N vertices, return the number (num) of maximal cliques.\r\n\r\n*Example*\r\n\r\nConsider the graph shown below,\r\n\r\n\u003c\u003chttps://dl.dropboxusercontent.com/u/13345152/examplegraph.png\u003e\u003e\r\n\r\nwhich has the following adjacency matrix:\r\n\r\n  A = [ 0 1 0 0 0\r\n        1 0 1 1 0\r\n        0 1 0 1 0\r\n        0 1 1 0 1\r\n        0 0 0 1 0 ]\r\n\r\nThe number of maximal cliques is 3. The maximal cliques are {1,2}, {2,3,4}, and {4,5}.\r\n\r\nNOTE: You may assume the data type of the adjacency matrix is double.","description_html":"\u003cp\u003eIn an undirected graph, a clique is a subset of vertices that are fully connected, i.e. there is an edge between all pairs of vertices in the subset. A \u003ci\u003emaximal\u003c/i\u003e clique is one in which the subset of vertices is not part of a larger clique. So, for instance, a fully connected graph has many cliques, but only one maximal clique.\u003c/p\u003e\u003cp\u003eGiven an NxN adjacency matrix (A) for an undirected graph with N vertices, return the number (num) of maximal cliques.\u003c/p\u003e\u003cp\u003e\u003cb\u003eExample\u003c/b\u003e\u003c/p\u003e\u003cp\u003eConsider the graph shown below,\u003c/p\u003e\u003cimg src = \"https://dl.dropboxusercontent.com/u/13345152/examplegraph.png\"\u003e\u003cp\u003ewhich has the following adjacency matrix:\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003eA = [ 0 1 0 0 0\r\n      1 0 1 1 0\r\n      0 1 0 1 0\r\n      0 1 1 0 1\r\n      0 0 0 1 0 ]\r\n\u003c/pre\u003e\u003cp\u003eThe number of maximal cliques is 3. The maximal cliques are {1,2}, {2,3,4}, and {4,5}.\u003c/p\u003e\u003cp\u003eNOTE: You may assume the data type of the adjacency matrix is double.\u003c/p\u003e","function_template":"function num = maximalcliques(A)\r\n  num = 0;\r\nend","test_suite":"%%\r\nA = 0;\r\nassert(isequal(maximalcliques(A),1))\r\n\r\n%%\r\nfor ii=1:10\r\n  N = randi(100);\r\n  A = ones(N)-eye(N);\r\n  assert(isequal(maximalcliques(A),1))\r\nend\r\n\r\n%%\r\nfor ii=1:10\r\n  N = randi(100);\r\n  A = zeros(N);\r\n  assert(isequal(maximalcliques(A),N))\r\nend\r\n\r\n%%\r\nA = [ 0 0 0 0\r\n      0 0 0 1\r\n      0 0 0 0\r\n      0 1 0 0 ];\r\nassert(isequal(maximalcliques(A),3))\r\n\r\n%%\r\nA = [ 0 1 0 0 0\r\n      1 0 1 1 0\r\n      0 1 0 1 0\r\n      0 1 1 0 1\r\n      0 0 0 1 0 ];\r\nassert(isequal(maximalcliques(A),3))\r\n\r\n%%\r\nA = [ 0 1 1 0 0 0\r\n      1 0 1 1 0 0\r\n      1 1 0 0 1 0\r\n      0 1 0 0 1 0\r\n      0 0 1 1 0 1\r\n      0 0 0 0 1 0 ];\r\nassert(isequal(maximalcliques(A),5))\r\n","published":true,"deleted":false,"likes_count":3,"comments_count":0,"created_by":4793,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":6,"test_suite_updated_at":"2014-10-28T21:35:49.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2014-10-28T21:07:46.000Z","updated_at":"2014-10-28T22:05:37.000Z","published_at":"2014-10-28T21:35:49.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/media/image1.png\"}],\"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\u003eIn an undirected graph, a clique is a subset of vertices that are fully connected, i.e. there is an edge between all pairs of vertices in the subset. A\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003emaximal\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e clique is one in which the subset of vertices is not part of a larger clique. So, for instance, a fully connected graph has many cliques, but only one maximal clique.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eGiven an NxN adjacency matrix (A) for an undirected graph with N vertices, return the number (num) of maximal cliques.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eExample\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eConsider the graph shown below,\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\u003ewhich has the following adjacency matrix:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[A = [ 0 1 0 0 0\\n      1 0 1 1 0\\n      0 1 0 1 0\\n      0 1 1 0 1\\n      0 0 0 1 0 ]]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe number of maximal cliques is 3. The maximal cliques are {1,2}, {2,3,4}, and {4,5}.\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\u003eNOTE: You may assume the data type of the adjacency matrix is double.\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.png\",\"contentType\":\"image/png\",\"content\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAADAFBMVEV4eHiTk5P29vaBgYGcnJzAwMC3t7eKiorS0tLt7e3b29vk5OTJycn///9vb28AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD61b95AAAAyklEQVR42q2SSQ6FIAxAWzQxkcj976lEE5R+hojQOmw+Cxa8RwcoGnhf6oNDD0AvGL8j/E2wC+JiXwSaAKbbatGkLjBrX13szynmtPXnKc2eCRiMGQtXxrq2hmZRuuXx6SVdPlPpopeC387sFMMIwdsyAMFAEcHuptW5oIaKYgjHBBoZ512snMeJ8g7o0DmA5jwKXRdqy9W6gfMzhd7iMOySlxq0qn/z4leR43HNQ8WrLtYi1Dz+pnjsmt/8ZsulwLgQOOeC4EyQHH5z1GUZiLNTtwAAAABJRU5ErkJggg==\"}]}"},{"id":2647,"title":"Find the maximal cliques in an undirected graph","description":"This is a variant of a \u003chttp://www.mathworks.com/matlabcentral/cody/problems/2646-determine-the-number-of-maximal-cliques-in-an-undirected-graph previous problem\u003e on maximal cliques. Instead of simply computing the number of maximal cliques in an undirected graph, now you must return the cliques themselves.\r\n\r\nGiven an NxN adjacency matrix (A) for an undirected graph with N vertices, return an array (C) in which each column encodes one of the maximal cliques in the graph. If C(i,j) = 1, then the ith vertex in the graph is included in the jth clique. The order of columns does not matter, but all maximal cliques must be given - that is, size(C,2) should equal the number of maximal cliques.\r\n\r\n*Example*\r\n\r\nConsider the graph shown below,\r\n\r\n\u003c\u003chttps://dl.dropboxusercontent.com/u/13345152/examplegraph.png\u003e\u003e\r\n\r\nwhich has the following adjacency matrix:\r\n\r\n  A = [ 0 1 0 0 0\r\n        1 0 1 1 0\r\n        0 1 0 1 0\r\n        0 1 1 0 1\r\n        0 0 0 1 0 ]\r\n\r\nThe maximal cliques are {1,2}, {2,3,4}, and {4,5}. Therefore, one (of three) valid outputs is:\r\n\r\n  C = [ 1 0 0\r\n        1 1 0\r\n        0 1 0\r\n        0 1 1\r\n        0 0 1 ]\r\n\r\nNOTE: You may assume the data type of the adjacency matrix (A) is double.","description_html":"\u003cp\u003eThis is a variant of a \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/problems/2646-determine-the-number-of-maximal-cliques-in-an-undirected-graph\"\u003eprevious problem\u003c/a\u003e on maximal cliques. Instead of simply computing the number of maximal cliques in an undirected graph, now you must return the cliques themselves.\u003c/p\u003e\u003cp\u003eGiven an NxN adjacency matrix (A) for an undirected graph with N vertices, return an array (C) in which each column encodes one of the maximal cliques in the graph. If C(i,j) = 1, then the ith vertex in the graph is included in the jth clique. The order of columns does not matter, but all maximal cliques must be given - that is, size(C,2) should equal the number of maximal cliques.\u003c/p\u003e\u003cp\u003e\u003cb\u003eExample\u003c/b\u003e\u003c/p\u003e\u003cp\u003eConsider the graph shown below,\u003c/p\u003e\u003cimg src = \"https://dl.dropboxusercontent.com/u/13345152/examplegraph.png\"\u003e\u003cp\u003ewhich has the following adjacency matrix:\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003eA = [ 0 1 0 0 0\r\n      1 0 1 1 0\r\n      0 1 0 1 0\r\n      0 1 1 0 1\r\n      0 0 0 1 0 ]\r\n\u003c/pre\u003e\u003cp\u003eThe maximal cliques are {1,2}, {2,3,4}, and {4,5}. Therefore, one (of three) valid outputs is:\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003eC = [ 1 0 0\r\n      1 1 0\r\n      0 1 0\r\n      0 1 1\r\n      0 0 1 ]\r\n\u003c/pre\u003e\u003cp\u003eNOTE: You may assume the data type of the adjacency matrix (A) is double.\u003c/p\u003e","function_template":"function C = maximalcliques(A)\r\n  C = [];\r\nend","test_suite":"%%\r\nA = 0;\r\nassert(isequal(maximalcliques(A),1))\r\n\r\n%%\r\nfor ii=1:10\r\n  N = randi(100);\r\n  A = ones(N)-eye(N);\r\n  assert(isequal(maximalcliques(A),ones(N,1)))\r\nend\r\n\r\n%%\r\nfor ii=1:10\r\n  N = randi(100);\r\n  A = zeros(N);\r\n  C = maximalcliques(A);\r\n  assert(isequal(fliplr(sortrows(C')'),eye(N)))\r\nend\r\n\r\n%%\r\nA = [ 0 0 0 0\r\n      0 0 0 1\r\n      0 0 0 0\r\n      0 1 0 0 ];\r\nC = maximalcliques(A);\r\nC = fliplr(sortrows(C')');\r\nC_correct = [ 1 0 0\r\n              0 1 0\r\n              0 0 1\r\n              0 1 0 ];\r\nassert(isequal(C,C_correct))\r\n\r\n%%\r\nA = [ 0 1 0 0 0\r\n      1 0 1 1 0\r\n      0 1 0 1 0\r\n      0 1 1 0 1\r\n      0 0 0 1 0 ];\r\nC = maximalcliques(A);\r\nC = fliplr(sortrows(C')');\r\nC_correct = [ 1 0 0\r\n              1 1 0\r\n              0 1 0\r\n              0 1 1\r\n              0 0 1 ];\r\nassert(isequal(C,C_correct))\r\n\r\n%%\r\nA = [ 0 1 1 0 0 0\r\n      1 0 1 1 0 0\r\n      1 1 0 0 1 0\r\n      0 1 0 0 1 0\r\n      0 0 1 1 0 1\r\n      0 0 0 0 1 0 ];\r\nC = maximalcliques(A);\r\nC = fliplr(sortrows(C')');\r\nC_correct = [ 1 0 0 0 0\r\n              1 1 0 0 0\r\n              1 0 1 0 0\r\n              0 1 0 1 0\r\n              0 0 1 1 1\r\n              0 0 0 0 1 ];\r\nassert(isequal(C,C_correct))\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":1,"created_by":4793,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":5,"test_suite_updated_at":"2014-10-28T22:05:02.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2014-10-28T21:53:54.000Z","updated_at":"2014-10-28T22:05:02.000Z","published_at":"2014-10-28T22:05:02.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.png\"}],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis is a variant of a\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/problems/2646-determine-the-number-of-maximal-cliques-in-an-undirected-graph\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eprevious problem\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e on maximal cliques. Instead of simply computing the number of maximal cliques in an undirected graph, now you must return the cliques themselves.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eGiven an NxN adjacency matrix (A) for an undirected graph with N vertices, return an array (C) in which each column encodes one of the maximal cliques in the graph. If C(i,j) = 1, then the ith vertex in the graph is included in the jth clique. The order of columns does not matter, but all maximal cliques must be given - that is, size(C,2) should equal the number of maximal cliques.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eExample\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eConsider the graph shown below,\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\u003ewhich has the following adjacency matrix:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[A = [ 0 1 0 0 0\\n      1 0 1 1 0\\n      0 1 0 1 0\\n      0 1 1 0 1\\n      0 0 0 1 0 ]]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe maximal cliques are {1,2}, {2,3,4}, and {4,5}. Therefore, one (of three) valid outputs is:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[C = [ 1 0 0\\n      1 1 0\\n      0 1 0\\n      0 1 1\\n      0 0 1 ]]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eNOTE: You may assume the data type of the adjacency matrix (A) is double.\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.png\",\"contentType\":\"image/png\",\"content\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAADAFBMVEV4eHiTk5P29vaBgYGcnJzAwMC3t7eKiorS0tLt7e3b29vk5OTJycn///9vb28AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD61b95AAAAyklEQVR42q2SSQ6FIAxAWzQxkcj976lEE5R+hojQOmw+Cxa8RwcoGnhf6oNDD0AvGL8j/E2wC+JiXwSaAKbbatGkLjBrX13szynmtPXnKc2eCRiMGQtXxrq2hmZRuuXx6SVdPlPpopeC387sFMMIwdsyAMFAEcHuptW5oIaKYgjHBBoZ512snMeJ8g7o0DmA5jwKXRdqy9W6gfMzhd7iMOySlxq0qn/z4leR43HNQ8WrLtYi1Dz+pnjsmt/8ZsulwLgQOOeC4EyQHH5z1GUZiLNTtwAAAABJRU5ErkJggg==\"}]}"},{"id":2697,"title":"Probability of winning single-elimination tournament","description":"Find the probability that the p^{th} player will win a single-elimination tournament with 2^n players where M(i,j)=probability that player i will beat player j in a head-to-head matchup.  In the first round player 1 plays player 2, player 3 plays player 4 and so on.  (In each round each surviving competitor plays his surviving \"next door neighbor\" in the bracket.)\r\n\r\nSee also problem \u003c2254\u003e.\r\n\r\nTrivial example :\r\n\r\nif \r\n\r\n   \r\n\r\n  M = [ NaN 0.7 ; 0.3 NaN ]\r\n\r\nthen \r\n\r\n  winprob(M,1)=0.7 \r\n\r\nand \r\n\r\n  winprob(M,2)=0.3","description_html":"\u003cp\u003eFind the probability that the p^{th} player will win a single-elimination tournament with 2^n players where M(i,j)=probability that player i will beat player j in a head-to-head matchup.  In the first round player 1 plays player 2, player 3 plays player 4 and so on.  (In each round each surviving competitor plays his surviving \"next door neighbor\" in the bracket.)\u003c/p\u003e\u003cp\u003eSee also problem \u003ca href = \"2254\"\u003e2254\u003c/a\u003e.\u003c/p\u003e\u003cp\u003eTrivial example :\u003c/p\u003e\u003cp\u003eif\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003eM = [ NaN 0.7 ; 0.3 NaN ]\r\n\u003c/pre\u003e\u003cp\u003ethen\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003ewinprob(M,1)=0.7 \r\n\u003c/pre\u003e\u003cp\u003eand\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003ewinprob(M,2)=0.3\r\n\u003c/pre\u003e","function_template":"function prob = winprob(M,p)\r\n  prob = 1;\r\nend","test_suite":"1\r\n%%\r\nM = [ NaN 1 ; 0 NaN ];\r\nassert(isequal(winprob(M,1),1));\r\nassert(isequal(winprob(M,2),0));\r\n\r\n2\r\n%%\r\nM = [ NaN 0.7 ; 0.3 NaN ];\r\nassert(isequal(winprob(M,1),0.7));\r\nassert(isequal(winprob(M,2),0.3));\r\n\r\n3\r\n%%\r\nM = zeros(8)+NaN;\r\nfor i=1:7\r\n    for j=i+1:8\r\n        r=rand();\r\n        M(i,j)=r;\r\n        M(j,i)=1-r;\r\n    end\r\nend\r\n\r\nepsilon=1e-8;\r\ntotprob=0;\r\nfor i=1:8\r\n    totprob=totprob+winprob(M,i);\r\nend\r\nassert(abs(totprob-1)\u003cepsilon);\r\n","published":true,"deleted":false,"likes_count":1,"comments_count":2,"created_by":4567,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":6,"test_suite_updated_at":"2014-12-02T02:09:00.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2014-11-30T16:23:41.000Z","updated_at":"2014-12-02T02:09:00.000Z","published_at":"2014-11-30T16:23:41.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eFind the probability that the p^{th} player will win a single-elimination tournament with 2^n players where M(i,j)=probability that player i will beat player j in a head-to-head matchup. In the first round player 1 plays player 2, player 3 plays player 4 and so on. (In each round each surviving competitor plays his surviving \\\"next door neighbor\\\" in the bracket.)\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\u003eSee also problem\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=\\\"2254\\\"\u003e\u003cw:r\u003e\u003cw:t\u003e2254\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eTrivial example :\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\u003eif\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[M = [ NaN 0.7 ; 0.3 NaN ]]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003ethen\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[winprob(M,1)=0.7]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eand\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[winprob(M,2)=0.3]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":2737,"title":"Prouhet–Tarry–Escott (basic)","description":"Inspired by \u003chttp://www.mathworks.com/matlabcentral/cody/problems/660-find-a-subset-that-divides-the-vector-into-equal-halves problem 660.\u003e\r\n\r\nGiven n return two disjoint sets of integers _A_ and _B_ with same cardinality having following property:\r\n\r\n\u003c\u003chttps://i.imgur.com/gSW7nWy.png\u003e\u003e\r\n\r\nfor i = 1:n\r\n\r\nTry to minimize sets cardinality. ","description_html":"\u003cp\u003eInspired by \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/problems/660-find-a-subset-that-divides-the-vector-into-equal-halves\"\u003eproblem 660.\u003c/a\u003e\u003c/p\u003e\u003cp\u003eGiven n return two disjoint sets of integers \u003ci\u003eA\u003c/i\u003e and \u003ci\u003eB\u003c/i\u003e with same cardinality having following property:\u003c/p\u003e\u003cimg src = \"https://i.imgur.com/gSW7nWy.png\"\u003e\u003cp\u003efor i = 1:n\u003c/p\u003e\u003cp\u003eTry to minimize sets cardinality.\u003c/p\u003e","function_template":"function [A, B] = prouhet(n)\r\n  A = 1:n;\r\n  B = -A;\r\nend","test_suite":"%%\r\nn = 1;\r\n[A, B] = prouhet(n);\r\nassert(isequal(A, round(A)) \u0026\u0026 isequal(B, round(B)))\r\nassert(isempty(intersect(A, B)));\r\nassert(isequal(numel(A), numel(B), numel(unique(A)), numel(unique(B))));\r\nassert(isequal(sum(A(:).^(1:n),1), sum(B(:).^(1:n),1)));\r\ndisp(sprintf('Each set has %i elements.', numel(A)))\r\n%%\r\nn = 2;\r\n[A, B] = prouhet(n);\r\nassert(isequal(A, round(A)) \u0026\u0026 isequal(B, round(B)))\r\nassert(isempty(intersect(A, B)));\r\nassert(isequal(numel(A), numel(B), numel(unique(A)), numel(unique(B))));\r\nassert(isequal(sum(A(:).^(1:n),1), sum(B(:).^(1:n),1)));\r\ndisp(sprintf('Each set has %i elements.', numel(A)))\r\n%%\r\nn = 5;\r\n[A, B] = prouhet(n);\r\nassert(isequal(A, round(A)) \u0026\u0026 isequal(B, round(B)))\r\nassert(isempty(intersect(A, B)));\r\nassert(isequal(numel(A), numel(B), numel(unique(A)), numel(unique(B))));\r\nassert(isequal(sum(A(:).^(1:n),1), sum(B(:).^(1:n),1)));\r\ndisp(sprintf('Each set has %i elements.', numel(A)))\r\n%%\r\nn = 7;\r\n[A, B] = prouhet(n);\r\nassert(isequal(A, round(A)) \u0026\u0026 isequal(B, round(B)))\r\nassert(isempty(intersect(A, B)));\r\nassert(isequal(numel(A), numel(B), numel(unique(A)), numel(unique(B))));\r\nassert(isequal(sum(A(:).^(1:n),1), sum(B(:).^(1:n),1)));\r\ndisp(sprintf('Each set has %i elements.', numel(A)))\r\n%%\r\n%n = 9;\r\n%[A, B] = prouhet(n);\r\n%assert(isequal(A, round(A)) \u0026\u0026 isequal(B, round(B)))\r\n%assert(isempty(intersect(A, B)));\r\n%assert(isequal(numel(A), numel(B), numel(unique(A)), numel(unique(B))));\r\n%assert(isequal(sum(uint64(A(:)).^uint64(1:n)), sum(uint64(A(:)).^uint64(1:n))));\r\n%disp(sprintf('Each set has %i elements.', numel(A)))\r\n%if numel(A) \u003c=20\r\n%    disp('A:')\r\n%    disp(A)\r\n%    disp('B:')\r\n%    disp(B)\r\n%end\r\n%%\r\n% test info\r\n%\r\n% larger n will be added later\r\n%\r\n% scoring function will be added later as well\r\n% scoring will be entirely based on size of output: smaller output == better score\r\n% something like this:\r\n%\r\n% score = 0;\r\n% for n = 1:25\r\n%   [A, B] = prouhet(n)\r\n%   assert(...);\r\n%   score = score + numel(A);\r\n% end\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":2,"created_by":14358,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":7,"test_suite_updated_at":"2016-10-08T00:11:00.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2014-12-08T09:56:20.000Z","updated_at":"2020-07-22T23:41:27.000Z","published_at":"2016-10-07T08:07:12.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\u003eInspired by\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/problems/660-find-a-subset-that-divides-the-vector-into-equal-halves\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eproblem 660.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eGiven n return two disjoint sets of integers\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eA\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e and\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eB\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e with same cardinality having following property:\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\u003efor i = 1:n\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\u003eTry to minimize sets cardinality.\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/wAALCAAiAFYBAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/AOyutU1rQfiN/ZWu63eDRdXOdKuo1iURS55gc7Pf5T9OuTjsp9CvJYisfiPVoWPR0EBI/OIipdAt9Vs9Pa11e8F9PFKwS72KhmjPKllXgEZ2nHXbnvVjV9RXSdIur90kZYIy5Eabm/AZGfpkVbTPlruIZsDJAwCafWX4htNSvtBu7fR9QNhqLJm3uNisFccgEMCMHoeOhrkfAerXfifS5odQ1bUrXXNOk+z6jafuhskH8QGz7rYyPxHOM1tajoevRtHd6X4lvmkhdXazuY4WiuFByUJCBlJGRuzx6Vsahq0Gm3FhDMkpa+uBbxFFBAfaW554GFY/gaLPURd6nfWyhwtrsRgyY+Ygk4OeeCvGBjryCMZPjzSdK1vwld2Oqh/LkwIDEuZRP/AYx3bPbvk54zWh4attVtPDWnW+t3KXOpxwqtxKg4Zv6nGMnucnjNS69PfWvh7UrjTIfOv47aR7aPGd8gUlRjvzjiuZ0OCW58QXlndrqlzp/wBhgVXvFlEcswZmkk+fG058sAKBjaSABXYyIVtXSAbWCFYwuFwccY4IH5Vg+Rr/APeuf/AqH/4zXRLnaM9cVw2qaAZfihpusaHcfZ76OPZrAC5jltyPkDf9NCQNvsMngAHu647xfbzTa1pUxtrya3tbe6mjFrvDNclUSNdycrlXl5JA65OK2/D+nS2GlWxvdkmqPbwi+uFHM0qoFLE9+lYN4ni7/hI5b5ND0y8ghJSxEmptF5SkYZyvlMN7c854HA6sWln1Px60ZFv4a0WN+xk1Z3A/AQj+dafha31iHSTLr1xBLqlxM8k4tyTFHztVEzzgKo/HJrcoorP1qa/g0e6l0xLZr1UPk/apCkQb1YgHgdffpx1rmNMbxjplp5MXhnS5WYmSWZ9aYvM56ux8jkn8gMAYAAqC/uvHepXMGnvBomk2s0ircyR37S3AiJ+YR/IoDEZAPbPHrXfUVycd/wCIZr26Q28yIEl2r5QCribam1iOW8td3cEuMDAIq8Lu5h011trec3Usgji3+e4Un+Ji65Cjr0xxUPgyCez0a4tLiCWFor66ZRIG+ZXmZwQzAFh8/XFdJRRWR4mtZr7w5e2UKs32lBDJtGWEbMFcgdyELED2rNt/7YJibUWlAIYxqiyZAMj7Q/lYG4J5YORjIOO9ZetaZd6xq2rhbKdhcfZrFVeHakkCsWlbeeV/1jjIO75AQDxXe0UUUUUUUUUUUV//2Q==\"}]}"},{"id":1688,"title":"Prime Sequences: AP-k Minimum Final Value","description":"Welcome to Fun with Primes. Today we will find the Minimum Final Value AP-k sequences for n_max=3:12 given the primorial and knowledge that the solution is of the form a + b * k# * n.\r\n\r\nThe AP-k of n sequence is n_max+1 primes of the form a + b * k# * n where n=0:n_max. The value of \"a\" is a prime and k# is the primorial.\r\n\r\nThe primorial k# is the product of all primes ≤ k, e.g. 10# = 2 · 3 · 5 · 7.\r\n\r\n*Input:* (k, n_max) \r\n\r\n*Output:* [a, b] for the equation Prime = a + b * k# * n,  n=0:n_max; Prime(n_max) must be the optimum minimum.\r\n\r\n*Value Range Limits:* [a\u003c150,000 , b\u003c8 ]\r\n\r\n*Example:* \r\n\r\n(13, 13) yields [31385539,14 ]; 31385539 + 14·13#·n (End Prime 36850999) \r\n\r\n*Commentary:*\r\n\r\n(13, 16) has a non-minimal end [17, 11387819007325752 ] to give Primes=17 + 11387819007325752·13#·n\r\n\r\nThe current June 2013 record for n is 25 via PrimeGrid:  43142746595714191 + 23681770·23#·n\r\n\r\n\r\n\r\n","description_html":"\u003cp\u003eWelcome to Fun with Primes. Today we will find the Minimum Final Value AP-k sequences for n_max=3:12 given the primorial and knowledge that the solution is of the form a + b * k# * n.\u003c/p\u003e\u003cp\u003eThe AP-k of n sequence is n_max+1 primes of the form a + b * k# * n where n=0:n_max. The value of \"a\" is a prime and k# is the primorial.\u003c/p\u003e\u003cp\u003eThe primorial k# is the product of all primes ≤ k, e.g. 10# = 2 · 3 · 5 · 7.\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e (k, n_max)\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e [a, b] for the equation Prime = a + b * k# * n,  n=0:n_max; Prime(n_max) must be the optimum minimum.\u003c/p\u003e\u003cp\u003e\u003cb\u003eValue Range Limits:\u003c/b\u003e [a\u0026lt;150,000 , b\u0026lt;8 ]\u003c/p\u003e\u003cp\u003e\u003cb\u003eExample:\u003c/b\u003e\u003c/p\u003e\u003cp\u003e(13, 13) yields [31385539,14 ]; 31385539 + 14·13#·n (End Prime 36850999)\u003c/p\u003e\u003cp\u003e\u003cb\u003eCommentary:\u003c/b\u003e\u003c/p\u003e\u003cp\u003e(13, 16) has a non-minimal end [17, 11387819007325752 ] to give Primes=17 + 11387819007325752·13#·n\u003c/p\u003e\u003cp\u003eThe current June 2013 record for n is 25 via PrimeGrid:  43142746595714191 + 23681770·23#·n\u003c/p\u003e","function_template":"function [a,b]=APk_min_end(k,n)\r\n% a+b*k#*(0:n) are all primes\r\n a=0;\r\n b=0;\r\nend\r\n","test_suite":"tic\r\nn=3; p=3;\r\n[a,b]=APk_min_end(p,n);\r\ntoc\r\nassert(isequal(a+b*prod(primes(p))*n,23))\r\n%%\r\nn=4; p=3;\r\n[a,b]=APk_min_end(p,n);\r\ntoc\r\nassert(isequal(a+b*prod(primes(p))*n,29))\r\n%%\r\nn=5; p=5;\r\n[a,b]=APk_min_end(p,n);\r\ntoc\r\nassert(isequal(a+b*prod(primes(p))*n,157))\r\n%%\r\nn=6; k=5;\r\n[a,b]=APk_min_end(k,n);\r\ntoc\r\nassert(isequal(a+b*prod(primes(k))*n,907))\r\n%%\r\nn=7; k=7;\r\n[a,b]=APk_min_end(k,n);\r\ntoc\r\nassert(isequal(a+b*prod(primes(k))*n,1669))\r\n%%\r\nn=8; k=7;\r\n[a,b]=APk_min_end(k,n);\r\ntoc\r\nassert(isequal(a+b*prod(primes(k))*n,1879))\r\n%%\r\nn=9; k=7;\r\n[a,b]=APk_min_end(k,n);\r\ntoc\r\nassert(isequal(a+b*prod(primes(k))*n,2089))\r\n%%\r\nn=10; k=11;\r\n[a,b]=APk_min_end(k,n);\r\ntoc\r\nassert(isequal(a+b*prod(primes(k))*n,249037))\r\n%%\r\nn=11; k=11;\r\n[a,b]=APk_min_end(k,n);\r\ntoc\r\nassert(isequal(a+b*prod(primes(k))*n,262897))\r\n%%\r\nn=12; k=13;\r\n[a,b]=APk_min_end(k,n);\r\ntoc\r\nassert(isequal(a+b*prod(primes(k))*n,725663))","published":true,"deleted":false,"likes_count":0,"comments_count":1,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":4,"test_suite_updated_at":"2013-06-30T03:36:26.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2013-06-30T03:04:32.000Z","updated_at":"2013-06-30T04:28:44.000Z","published_at":"2013-06-30T03:36:26.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eWelcome to Fun with Primes. Today we will find the Minimum Final Value AP-k sequences for n_max=3:12 given the primorial and knowledge that the solution is of the form a + b * k# * n.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe AP-k of n sequence is n_max+1 primes of the form a + b * k# * n where n=0:n_max. The value of \\\"a\\\" is a prime and k# is the primorial.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe primorial k# is the product of all primes ≤ k, e.g. 10# = 2 · 3 · 5 · 7.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e (k, n_max)\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 [a, b] for the equation Prime = a + b * k# * n, n=0:n_max; Prime(n_max) must be the optimum minimum.\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\u003eValue Range Limits:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e [a\u0026lt;150,000 , b\u0026lt;8 ]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eExample:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e(13, 13) yields [31385539,14 ]; 31385539 + 14·13#·n (End Prime 36850999)\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\u003eCommentary:\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\u003e(13, 16) has a non-minimal end [17, 11387819007325752 ] to give Primes=17 + 11387819007325752·13#·n\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe current June 2013 record for n is 25 via PrimeGrid: 43142746595714191 + 23681770·23#·n\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":1631,"title":"Criss-Cross: NHL - Optimize Matrix Size","description":"Given the List of NHL Teams, fit all in a minimum area Criss-Cross with no invalid words, no duplications, and all connected.\r\n\r\n*Input:* Dictionary (cell array)\r\n\r\n*Output:* Array of Char  (spaces indicated by char(96))\r\n\r\n*Score:* Numer of Elements in Array (including unused)\r\n\r\nExample: \r\n\r\ndict={'abc' 'cat'}\r\n\r\nOutput: \r\n['abc';'``a';'``t']\r\n\r\n  abc\r\n  ``a\r\n  ``t\r\n\r\nScore: 9\r\n\r\nRelated Challenges:\r\n\r\n1) \u003chttp://www.mathworks.com/matlabcentral/cody/problems/1533-criss-cross-verification-nhl Verify Criss-Cross\u003e\r\n\r\n2) Create Criss-Cross dictionary from a matrix\r\n\r\n3) Games Magazine Contest 8/31/2013","description_html":"\u003cp\u003eGiven the List of NHL Teams, fit all in a minimum area Criss-Cross with no invalid words, no duplications, and all connected.\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e Dictionary (cell array)\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e Array of Char  (spaces indicated by char(96))\u003c/p\u003e\u003cp\u003e\u003cb\u003eScore:\u003c/b\u003e Numer of Elements in Array (including unused)\u003c/p\u003e\u003cp\u003eExample:\u003c/p\u003e\u003cp\u003edict={'abc' 'cat'}\u003c/p\u003e\u003cp\u003eOutput: \r\n['abc';'``a';'``t']\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003eabc\r\n``a\r\n``t\r\n\u003c/pre\u003e\u003cp\u003eScore: 9\u003c/p\u003e\u003cp\u003eRelated Challenges:\u003c/p\u003e\u003cp\u003e1) \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/problems/1533-criss-cross-verification-nhl\"\u003eVerify Criss-Cross\u003c/a\u003e\u003c/p\u003e\u003cp\u003e2) Create Criss-Cross dictionary from a matrix\u003c/p\u003e\u003cp\u003e3) Games Magazine Contest 8/31/2013\u003c/p\u003e","function_template":"function H=criss_cross(dict)\r\n H=[''];\r\nend","test_suite":"%%\r\nfeval(@assignin,'caller','score',625);\r\n%%\r\ndict={'avalanche'\r\n'bluejackets'\r\n'blackhawks'\r\n'blues'\r\n'bruins'\r\n'canadiens'\r\n'canucks'\r\n'capitals'\r\n'coyotes'\r\n'devils'\r\n'ducks'\r\n'flames'\r\n'flyers'\r\n'hurricanes'\r\n'islanders'\r\n'jets'\r\n'kings'\r\n'lightning'\r\n'mapleleafs'\r\n'oilers'\r\n'panthers'\r\n'penguins'\r\n'predators'\r\n'rangers'\r\n'redwings'\r\n'sabres'\r\n'senators'\r\n'sharks'\r\n'stars'\r\n'wild'};\r\n\r\nt1 = cputime;\r\nH=criss_cross(dict)\r\nfprintf('Elapsed Time %.2f\\n',cputime-t1)\r\nfprintf('size of H %i %i\\n',size(H));\r\nscore=prod(size(H)); % if valid\r\n\r\n% Perform Validation : words\r\n a=H;\r\n% Ned's\r\n    gridWords = {};\r\n    for i = 1:2\r\n        a = a';\r\n        for j = 1:size(a,1)\r\n            tk = regexp(a(j,:),'(\\w\\w+)','tokens');\r\n            gridWords = [gridWords tk];\r\n        end\r\n    end\r\n    dictFound = cell(length(gridWords),1);\r\n    for i = 1:length(gridWords)\r\n        dictFound{i} = gridWords{i}{1};\r\n    end\r\n    dictFound = sort(dictFound);\r\n    dictGiven = sort(dict);\r\nassert(isequal(dictGiven,dictFound),sprintf('Invalid/Missing words'))\r\n\r\n% Perform Validation: Connected\r\nAchar=H;\r\n m= (Achar-96);\r\n m(m\u003e0)=Inf;\r\n% expand m and encircle with 0\r\n [nr, nc]=size(m);\r\n m=[zeros(nr,1) m zeros(nr,1)];\r\n m=[zeros(1,nc+2); m; zeros(1,nc+2)];\r\n nr=size(m,1);\r\n off_vec=[-1 1 -nr nr];\r\n % Initialize start location\r\n ptr=find(m==Inf,1,'first');\r\n curval=1;\r\n m(ptr)=curval;\r\n \r\n while ~isempty(ptr) % adjacent expansion search sequence\r\n  curval=curval+1;\r\n  Moff_vec=repmat(ptr,1,4)+repmat(off_vec,size(ptr,1),1);\r\n  m(Moff_vec)=min(curval*ones(size(Moff_vec)), m(Moff_vec));\r\n  ptr=find(m==curval);\r\n end\r\n\r\ninvalid=any(m(:)==Inf); % Any unconnected from start point will be Inf\r\n\r\nassert(~invalid,sprintf('Not fully connected'))\r\n\r\nHscore=numel(H);\r\n\r\nfeval(@assignin,'caller','score',Hscore);","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":3,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2013-06-08T22:55:40.000Z","updated_at":"2013-06-09T01:03:27.000Z","published_at":"2013-06-09T01:03:27.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eGiven the List of NHL Teams, fit all in a minimum area Criss-Cross with no invalid words, no duplications, and all connected.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Dictionary (cell array)\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 Array of Char (spaces indicated by char(96))\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\u003eScore:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Numer of Elements in Array (including unused)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eExample:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003edict={'abc' 'cat'}\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\u003eOutput: ['abc';'``a';'``t']\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[abc\\n``a\\n``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\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eScore: 9\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eRelated Challenges:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e1)\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/problems/1533-criss-cross-verification-nhl\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eVerify Criss-Cross\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e2) Create Criss-Cross dictionary from a matrix\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e3) Games Magazine Contest 8/31/2013\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":2191,"title":"Order of things - 3","description":"This problem is closely related to \u003chttp://www.mathworks.nl/matlabcentral/cody/problems/2189-order-of-things-1 Problem 2189, Order of things - 1\u003e and \u003chttp://www.mathworks.nl/matlabcentral/cody/problems/2190-order-of-things-2 Problem 2190, Order of things - 2\u003e. For the details, see the description for those problems. Basically, we have to find the order in which to execute tasks of which the results and prerequisites depend on each other. \r\n\r\n* However, this time the tasks are grouped, and groups of tasks should be executed at once.\r\n* It may (still) be impossible to find a solution, since dependencies may be cyclic. But this may now also be due to the grouping of tasks. In any case, return an empty vector if no order is found.\r\n* There are still multiple orders possible, return them as multiple rows of the output vector.\r\n* The tasks within a group should of course be specified in the right order, when interdependent.\r\n\r\nThe dependencies of the tasks on each other is expressed in a matrix, where each row corresponds to the execution of a task, and each column to the dependency. \r\n\r\n   A  B  C  D  E\r\nA  0  0  0  0  0\r\nB  0  0  0  0  0\r\nC  0  1  0  0  0\r\nD  0  1  1  0  0\r\nE  1  0  0  0  0\r\n\r\nThe |1| on row |C|, column |B|, indicates that task |C| depends on task |B|. \r\n\r\nThe grouping of tasks is expressed as an input vector with groups assigned an integer value \u003e 0, e.g.\r\n\r\n [ 1 1 2 3 3 ] \r\n\r\nReturn the new row/column order as a numeric row-vector, referring to the rows/columns of the input matrix. If multiple orders exist, return them all as rows of a matrix. In this example:\r\n\r\n [ \r\n   1 2 3 4 5\r\n   1 2 3 5 4\r\n   2 1 3 4 5\r\n   2 1 3 5 4\r\n ]\r\n\r\nIf no order fulfilling the dependencies exists, return an empty vector.","description_html":"\u003cp\u003eThis problem is closely related to \u003ca href = \"http://www.mathworks.nl/matlabcentral/cody/problems/2189-order-of-things-1\"\u003eProblem 2189, Order of things - 1\u003c/a\u003e and \u003ca href = \"http://www.mathworks.nl/matlabcentral/cody/problems/2190-order-of-things-2\"\u003eProblem 2190, Order of things - 2\u003c/a\u003e. For the details, see the description for those problems. Basically, we have to find the order in which to execute tasks of which the results and prerequisites depend on each other.\u003c/p\u003e\u003cul\u003e\u003cli\u003eHowever, this time the tasks are grouped, and groups of tasks should be executed at once.\u003c/li\u003e\u003cli\u003eIt may (still) be impossible to find a solution, since dependencies may be cyclic. But this may now also be due to the grouping of tasks. In any case, return an empty vector if no order is found.\u003c/li\u003e\u003cli\u003eThere are still multiple orders possible, return them as multiple rows of the output vector.\u003c/li\u003e\u003cli\u003eThe tasks within a group should of course be specified in the right order, when interdependent.\u003c/li\u003e\u003c/ul\u003e\u003cp\u003eThe dependencies of the tasks on each other is expressed in a matrix, where each row corresponds to the execution of a task, and each column to the dependency.\u003c/p\u003e\u003cpre\u003e   A  B  C  D  E\r\nA  0  0  0  0  0\r\nB  0  0  0  0  0\r\nC  0  1  0  0  0\r\nD  0  1  1  0  0\r\nE  1  0  0  0  0\u003c/pre\u003e\u003cp\u003eThe \u003ctt\u003e1\u003c/tt\u003e on row \u003ctt\u003eC\u003c/tt\u003e, column \u003ctt\u003eB\u003c/tt\u003e, indicates that task \u003ctt\u003eC\u003c/tt\u003e depends on task \u003ctt\u003eB\u003c/tt\u003e.\u003c/p\u003e\u003cp\u003eThe grouping of tasks is expressed as an input vector with groups assigned an integer value \u0026gt; 0, e.g.\u003c/p\u003e\u003cpre\u003e [ 1 1 2 3 3 ] \u003c/pre\u003e\u003cp\u003eReturn the new row/column order as a numeric row-vector, referring to the rows/columns of the input matrix. If multiple orders exist, return them all as rows of a matrix. In this example:\u003c/p\u003e\u003cpre\u003e [ \r\n   1 2 3 4 5\r\n   1 2 3 5 4\r\n   2 1 3 4 5\r\n   2 1 3 5 4\r\n ]\u003c/pre\u003e\u003cp\u003eIf no order fulfilling the dependencies exists, return an empty vector.\u003c/p\u003e","function_template":"function order = calculation_order(dependencies,groups)\r\n  order  = 1:size(dependencies,1);\r\nend","test_suite":"%%\r\ndependencies = [\r\n0  0  0  0  1\r\n0  0  1  1  0\r\n0  0  0  0  0\r\n0  0  1  0  0\r\n0  0  0  0  0\r\n];\r\ngroups = [ 3  3  1  2  1 ];\r\norder = calculation_order(dependencies,groups);\r\norder_correct = [\r\n5  3  4  2  1\r\n5  3  4  1  2\r\n4  3  5  2  1\r\n4  3  5  1  2\r\n];\r\nassert(isequal(sortrows(order_correct),sortrows(order)));\r\n\r\n%%\r\ndependencies = [\r\n0  1  0  0  0\r\n0  0  1  0  0\r\n0  0  0  0  0\r\n0  0  0  0  0\r\n1  0  0  1  0\r\n];\r\ngroups = [ 2  2  2  1  2 ];\r\norder = calculation_order(dependencies,groups);\r\norder_correct = [\r\n4  3  2  1  5\r\n];\r\nassert(isequal(sortrows(order_correct),sortrows(order)));\r\n\r\n%%\r\ndependencies = [\r\n0  1  0  0  0\r\n0  0  0  0  0\r\n0  0  0  0  0\r\n1  0  0  0  1\r\n0  0  1  0  0\r\n];\r\ngroups = [ 1  1  2  3  2 ];\r\norder = calculation_order(dependencies,groups);\r\norder_correct = [\r\n2  1  3  5  4\r\n4  3  1  5  2\r\n];\r\nassert(isequal(sortrows(order_correct),sortrows(order)));\r\n\r\n%%\r\ndependencies = [\r\n0  0  0  0  0\r\n0  0  1  0  0\r\n0  1  0  0  0\r\n0  0  0  0  0\r\n0  0  0  0  0\r\n];\r\ngroups = [ 5  1  2  3  4 ];\r\norder = calculation_order(dependencies,groups);\r\nassert(isempty(order));\r\n\r\n%%\r\ndependencies = [\r\n0  0  0  0  0\r\n1  0  0  0  0\r\n0  0  0  1  0\r\n0  1  0  0  0\r\n0  0  1  0  0\r\n];\r\ngroups = [ 1  1  2  3  2 ];\r\norder = calculation_order(dependencies,groups);\r\nassert(isempty(order));\r\n\r\n%%\r\ndependencies = [\r\n0  0  0  0  1\r\n0  0  0  0  0\r\n0  0  0  0  0\r\n0  0  0  0  0\r\n1  0  0  0  0\r\n];\r\ngroups = [ 2  2  3  1  1 ];\r\norder = calculation_order(dependencies,groups);\r\nassert(isempty(order));\r\n\r\n%%\r\ndependencies_ = ones(10+randi(10));\r\ndependencies_ = dependencies_-triu(dependencies_);\r\norder_ = randperm(size(dependencies_,1));\r\ndependencies = dependencies_(order_,order_);\r\norder_ = 0;\r\norder = calculation_order(dependencies,1:size(dependencies_,1));\r\nordered = dependencies(order,order);\r\nassert(~nnz(triu(ordered-diag(diag(ordered)))));\r\norder = calculation_order(dependencies,ones(1,size(dependencies_,1)));\r\nordered = dependencies(order,order);\r\nassert(~nnz(triu(ordered-diag(diag(ordered)))));\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":2,"created_by":6556,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":1,"test_suite_updated_at":"2014-02-21T15:59:05.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2014-02-18T08:50:55.000Z","updated_at":"2014-02-21T15:59:05.000Z","published_at":"2014-02-21T09:38:58.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis problem is closely related to\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.nl/matlabcentral/cody/problems/2189-order-of-things-1\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eProblem 2189, Order of things - 1\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e and\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.nl/matlabcentral/cody/problems/2190-order-of-things-2\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eProblem 2190, Order of things - 2\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. For the details, see the description for those problems. Basically, we have to find the order in which to execute tasks of which the results and prerequisites depend on each other.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eHowever, this time the tasks are grouped, and groups of tasks should be executed at once.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eIt may (still) be impossible to find a solution, since dependencies may be cyclic. But this may now also be due to the grouping of tasks. In any case, return an empty vector if no order is found.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThere are still multiple orders possible, return them as multiple rows of the output vector.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe tasks within a group should of course be specified in the right order, when interdependent.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe dependencies of the tasks on each other is expressed in a matrix, where each row corresponds to the execution of a task, and each column to the dependency.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[   A  B  C  D  E\\nA  0  0  0  0  0\\nB  0  0  0  0  0\\nC  0  1  0  0  0\\nD  0  1  1  0  0\\nE  1  0  0  0  0]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003e1\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e on row\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eC\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, column\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eB\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, indicates that task\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eC\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e depends on task\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eB\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe grouping of tasks is expressed as an input vector with groups assigned an integer value \u0026gt; 0, e.g.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ [ 1 1 2 3 3 ]]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eReturn the new row/column order as a numeric row-vector, referring to the rows/columns of the input matrix. If multiple orders exist, return them all as rows of a matrix. In this example:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ [ \\n   1 2 3 4 5\\n   1 2 3 5 4\\n   2 1 3 4 5\\n   2 1 3 5 4\\n ]]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eIf no order fulfilling the dependencies exists, return an empty vector.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":2192,"title":"Order of things - 4","description":"*This is the last assignment in the _Order of Things_-series. If that past incompleteness kept you from solving it, you may start now.* Open that bottle of wine, and spend an entertaining evening coding.\r\n\r\nThis problem is closely related to \u003chttp://www.mathworks.nl/matlabcentral/cody/problems/2189-order-of-things-1 Problem 2189, Order of things - 1\u003e, \u003chttp://www.mathworks.nl/matlabcentral/cody/problems/2190-order-of-things-2 Problem 2190, Order of things - 2\u003e, and \u003chttp://www.mathworks.nl/matlabcentral/cody/problems/2191-order-of-things-3 Problem 2191, Order of things - 3\u003e. For the details, see the description for those problems. Basically, we have to find the order in which to execute tasks of which the results and prerequisites depend on each other. \r\n\r\nHowever, this is the most complex case, as \r\n* Calculations are preferably grouped, but may, due to their dependencies, not all be clustered. So groups of events may be split over different clusters. The number of clusters per group should be kept to a minimum. \r\n\r\nThe same complications as in problem 3 may apply:\r\n* It may (still) be impossible to find a solution, since dependencies may be cyclic. But this is now no longer due to the grouping of tasks, as you may, if necessary, break the rule of grouping. In any case, return an empty vector if no order is found.\r\n* There are still multiple orders possible, return them as multiple rows of the output vector.\r\n* The tasks within a group should of course be specified in the right order, when interdependent.\r\n\r\nThe dependencies of the tasks on each other is expressed in a matrix, where each row corresponds to the execution of a task, and each column to the dependency. \r\n\r\n   A  B  C  D  E\r\nA  0  0  0  0  0\r\nB  0  0  1  0  0\r\nC  1  0  0  0  0\r\nD  0  0  1  0  0\r\nE  1  0  0  0  0\r\n\r\nThe |1| on row |C|, column |B|, indicates that task |C| depends on task |B|. \r\n\r\nThe grouping of tasks is expressed as an input vector with groups assigned an integer value \u003e 0, for every task, e.g. \r\n\r\n [ 1 1 2 2 3 ] \r\n\r\nReturn the new row/column order as a numeric row-vector, referring to the rows/columns of the input matrix. If multiple orders exist, return them all as rows of a matrix. In this example:\r\n\r\n [ \r\n   1 3 4 2 5\r\n   1 3 4 5 2\r\n   1 5 3 4 2\r\n ]\r\n\r\nIf no order fulfilling the dependencies exists, return an empty vector.","description_html":"\u003cp\u003e\u003cb\u003eThis is the last assignment in the \u003ci\u003eOrder of Things\u003c/i\u003e-series. If that past incompleteness kept you from solving it, you may start now.\u003c/b\u003e Open that bottle of wine, and spend an entertaining evening coding.\u003c/p\u003e\u003cp\u003eThis problem is closely related to \u003ca href = \"http://www.mathworks.nl/matlabcentral/cody/problems/2189-order-of-things-1\"\u003eProblem 2189, Order of things - 1\u003c/a\u003e, \u003ca href = \"http://www.mathworks.nl/matlabcentral/cody/problems/2190-order-of-things-2\"\u003eProblem 2190, Order of things - 2\u003c/a\u003e, and \u003ca href = \"http://www.mathworks.nl/matlabcentral/cody/problems/2191-order-of-things-3\"\u003eProblem 2191, Order of things - 3\u003c/a\u003e. For the details, see the description for those problems. Basically, we have to find the order in which to execute tasks of which the results and prerequisites depend on each other.\u003c/p\u003e\u003cp\u003eHowever, this is the most complex case, as \r\n* Calculations are preferably grouped, but may, due to their dependencies, not all be clustered. So groups of events may be split over different clusters. The number of clusters per group should be kept to a minimum.\u003c/p\u003e\u003cp\u003eThe same complications as in problem 3 may apply:\r\n* It may (still) be impossible to find a solution, since dependencies may be cyclic. But this is now no longer due to the grouping of tasks, as you may, if necessary, break the rule of grouping. In any case, return an empty vector if no order is found.\r\n* There are still multiple orders possible, return them as multiple rows of the output vector.\r\n* The tasks within a group should of course be specified in the right order, when interdependent.\u003c/p\u003e\u003cp\u003eThe dependencies of the tasks on each other is expressed in a matrix, where each row corresponds to the execution of a task, and each column to the dependency.\u003c/p\u003e\u003cpre\u003e   A  B  C  D  E\r\nA  0  0  0  0  0\r\nB  0  0  1  0  0\r\nC  1  0  0  0  0\r\nD  0  0  1  0  0\r\nE  1  0  0  0  0\u003c/pre\u003e\u003cp\u003eThe \u003ctt\u003e1\u003c/tt\u003e on row \u003ctt\u003eC\u003c/tt\u003e, column \u003ctt\u003eB\u003c/tt\u003e, indicates that task \u003ctt\u003eC\u003c/tt\u003e depends on task \u003ctt\u003eB\u003c/tt\u003e.\u003c/p\u003e\u003cp\u003eThe grouping of tasks is expressed as an input vector with groups assigned an integer value \u0026gt; 0, for every task, e.g.\u003c/p\u003e\u003cpre\u003e [ 1 1 2 2 3 ] \u003c/pre\u003e\u003cp\u003eReturn the new row/column order as a numeric row-vector, referring to the rows/columns of the input matrix. If multiple orders exist, return them all as rows of a matrix. In this example:\u003c/p\u003e\u003cpre\u003e [ \r\n   1 3 4 2 5\r\n   1 3 4 5 2\r\n   1 5 3 4 2\r\n ]\u003c/pre\u003e\u003cp\u003eIf no order fulfilling the dependencies exists, return an empty vector.\u003c/p\u003e","function_template":"function order = calculation_order(dependencies,groups)\r\n  order  = 1:size(dependencies,1);\r\nend","test_suite":"dependencies = [\r\n0  1  0  0  0\r\n0  0  0  0  0\r\n0  0  0  0  1\r\n0  0  0  0  1\r\n0  1  0  0  0\r\n];\r\ngroups = [ 3  1  2  1  2 ];\r\norder = calculation_order(dependencies,groups);\r\norder_correct = [\r\n3  2  5  4  1\r\n3  5  2  4  1\r\n5  4  2  3  1\r\n];\r\nassert(isequal(sortrows(order_correct),sortrows(order)));\r\n\r\n%%\r\ndependencies = [\r\n0  1  0  0  0\r\n0  0  0  0  0\r\n0  0  0  1  0\r\n0  1  0  0  0\r\n0  0  0  1  0\r\n];\r\ngroups = [ 3  1  1  2  2 ];\r\norder = calculation_order(dependencies,groups);\r\norder_correct = [\r\n3  4  2  5  1\r\n3  4  5  2  1\r\n5  3  4  2  1\r\n];\r\nassert(isequal(sortrows(order_correct),sortrows(order)));\r\n\r\n%%\r\ndependencies = [\r\n0  0  1  0  0\r\n0  0  0  1  0\r\n0  0  0  1  0\r\n0  0  0  0  0\r\n0  0  1  0  0\r\n];\r\ngroups = [ 1  3  2  1  2 ];\r\norder = calculation_order(dependencies,groups);\r\norder_correct = [\r\n2  1  4  5  3\r\n5  1  4  2  3\r\n4  1  3  2  5\r\n];\r\nassert(isequal(sortrows(order_correct),sortrows(order)));\r\n\r\n%%\r\ndependencies = [\r\n    0 0 0 0 0\r\n    0 0 0 0 0\r\n    0 1 0 0 0\r\n    0 0 1 0 0\r\n    1 0 0 1 0\r\n    ];\r\ngroups = [1 2 2 2 2];\r\norder = calculation_order(dependencies,groups);\r\norder_correct = [\r\n    1 2 3 4 5\r\n];\r\nassert(isequal(sortrows(order_correct),sortrows(order)));\r\n\r\n%%\r\ndependencies = [\r\n0  0  0  1  0\r\n0  0  0  0  0\r\n0  0  0  0  0\r\n1  0  0  0  0\r\n0  0  0  0  0\r\n];\r\ngroups = [ 1  3  4  2  5 ];\r\norder = calculation_order(dependencies,groups);\r\nassert(isempty(order));\r\n\r\n%%\r\ndependencies = [\r\n0  0  0  0  0\r\n0  0  0  0  0\r\n0  0  0  1  0\r\n0  0  1  0  0\r\n0  0  0  0  0\r\n];\r\ngroups = [ 1  3  2  1  2 ];\r\norder = calculation_order(dependencies,groups);\r\norder_correct = [\r\n1  2  4  5  3\r\n1  2  3  5  4\r\n1  5  4  2  3\r\n1  5  3  2  4\r\n1  4  3  2  5\r\n1  3  4  2  5\r\n5  4  3  2  1\r\n5  3  4  2  1\r\n];\r\nassert(isequal(sortrows(order_correct),sortrows(order)));\r\n\r\n%%\r\ndependencies_ = ones(randi(10));\r\ndependencies_ = dependencies_-triu(dependencies_);\r\norder_ = randperm(size(dependencies_,1));\r\ndependencies = dependencies_(order_,order_);\r\norder_ = 0;\r\norder = calculation_order(dependencies,1:size(dependencies_,1));\r\nordered = dependencies(order,order);\r\nassert(~nnz(triu(ordered-diag(diag(ordered)))));\r\norder = calculation_order(dependencies,ones(1,size(dependencies_,1)));\r\nordered = dependencies(order,order);\r\nassert(~nnz(triu(ordered-diag(diag(ordered)))));\r\n","published":true,"deleted":false,"likes_count":0,"comments_count":0,"created_by":6556,"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":"2014-02-18T08:57:21.000Z","updated_at":"2014-03-04T07:49:56.000Z","published_at":"2014-03-04T07:49:56.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eThis is the last assignment in the\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eOrder of Things\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003e-series. If that past incompleteness kept you from solving it, you may start now.\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Open that bottle of wine, and spend an entertaining evening coding.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis problem is closely related to\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.nl/matlabcentral/cody/problems/2189-order-of-things-1\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eProblem 2189, Order of things - 1\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e,\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.nl/matlabcentral/cody/problems/2190-order-of-things-2\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eProblem 2190, Order of things - 2\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e, and\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.nl/matlabcentral/cody/problems/2191-order-of-things-3\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eProblem 2191, Order of things - 3\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. For the details, see the description for those problems. Basically, we have to find the order in which to execute tasks of which the results and prerequisites depend on each other.\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\u003eHowever, this is the most complex case, as * Calculations are preferably grouped, but may, due to their dependencies, not all be clustered. So groups of events may be split over different clusters. The number of clusters per group should be kept to a minimum.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe same complications as in problem 3 may apply: * It may (still) be impossible to find a solution, since dependencies may be cyclic. But this is now no longer due to the grouping of tasks, as you may, if necessary, break the rule of grouping. In any case, return an empty vector if no order is found. * There are still multiple orders possible, return them as multiple rows of the output vector. * The tasks within a group should of course be specified in the right order, when interdependent.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe dependencies of the tasks on each other is expressed in a matrix, where each row corresponds to the execution of a task, and each column to the dependency.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[   A  B  C  D  E\\nA  0  0  0  0  0\\nB  0  0  1  0  0\\nC  1  0  0  0  0\\nD  0  0  1  0  0\\nE  1  0  0  0  0]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003e1\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e on row\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eC\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, column\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eB\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e, indicates that task\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eC\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e depends on task\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:rFonts w:cs=\\\"monospace\\\"/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eB\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe grouping of tasks is expressed as an input vector with groups assigned an integer value \u0026gt; 0, for every task, e.g.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ [ 1 1 2 2 3 ]]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eReturn the new row/column order as a numeric row-vector, referring to the rows/columns of the input matrix. If multiple orders exist, return them all as rows of a matrix. In this example:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ [ \\n   1 3 4 2 5\\n   1 3 4 5 2\\n   1 5 3 4 2\\n ]]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eIf no order fulfilling the dependencies exists, return an empty vector.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":1900,"title":"GJam 2014 China Rd A: Rational Number Tree (Large Values)","description":"This Challenge is derived from \u003chttp://code.google.com/codejam/contest/2924486/dashboard#s=p1 GJam 2014 China Rational Number Tree\u003e.\r\n\r\nThe Goal is to determine the tree node if given [P,Q] or provide the [P,Q] if given a node. This is the Large Challenge with a Max of 64 Tree levels. Processing of uint64 size data requires extra care.\r\n\r\nConsider an infinite complete binary tree where the root node is 1/1 and the left and right children of node P/Q are P/(P+Q) and (P+Q)/Q, respectively. \r\n\r\nThe Tree looks like:\r\n\r\n         1/1\r\n    ______|______\r\n    |           |\r\n   1/2         2/1\r\n ___|___     ___|___\r\n |     |     |     |\r\n1/3   3/2   2/3   3/1\r\n\r\n\r\nThe nodes are 1/1, 1/2, 2/1, 1/3, 3/2, 2/3, 3/1,...\r\n\r\n\r\n*Input:* [N] or [P,Q] where N is a uint64 integer node or [P,Q] (double) are terms of a Node\r\n\r\n*Output:* [P,Q](double) or [N](uint64) depends on Input type\r\n\r\n*Examples:*\r\n\r\n  [Input]  [Output]\r\n    [2] [1 2]\r\n    [1 2] [2]\r\n    [5] [3 2]\r\n    [3 2] [5]\r\n\r\n*Contest Performance:* Best Delta Time of 14 minutes with only 368 able to process the large data set in less than 3 hours.\r\n\r\n*Notes:*\r\n\r\n1) Matlab has issues with uint64 for dec2bin and matrix multiplies.\r\n\r\n2) Example of uint64 read is provided in test suite comments\r\n\r\n3) Bitshift and bitget work on uint64","description_html":"\u003cp\u003eThis Challenge is derived from \u003ca href = \"http://code.google.com/codejam/contest/2924486/dashboard#s=p1\"\u003eGJam 2014 China Rational Number Tree\u003c/a\u003e.\u003c/p\u003e\u003cp\u003eThe Goal is to determine the tree node if given [P,Q] or provide the [P,Q] if given a node. This is the Large Challenge with a Max of 64 Tree levels. Processing of uint64 size data requires extra care.\u003c/p\u003e\u003cp\u003eConsider an infinite complete binary tree where the root node is 1/1 and the left and right children of node P/Q are P/(P+Q) and (P+Q)/Q, respectively.\u003c/p\u003e\u003cp\u003eThe Tree looks like:\u003c/p\u003e\u003cpre\u003e         1/1\r\n    ______|______\r\n    |           |\r\n   1/2         2/1\r\n ___|___     ___|___\r\n |     |     |     |\r\n1/3   3/2   2/3   3/1\u003c/pre\u003e\u003cp\u003eThe nodes are 1/1, 1/2, 2/1, 1/3, 3/2, 2/3, 3/1,...\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e [N] or [P,Q] where N is a uint64 integer node or [P,Q] (double) are terms of a Node\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e [P,Q](double) or [N](uint64) depends on Input type\u003c/p\u003e\u003cp\u003e\u003cb\u003eExamples:\u003c/b\u003e\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003e[Input]  [Output]\r\n  [2] [1 2]\r\n  [1 2] [2]\r\n  [5] [3 2]\r\n  [3 2] [5]\r\n\u003c/pre\u003e\u003cp\u003e\u003cb\u003eContest Performance:\u003c/b\u003e Best Delta Time of 14 minutes with only 368 able to process the large data set in less than 3 hours.\u003c/p\u003e\u003cp\u003e\u003cb\u003eNotes:\u003c/b\u003e\u003c/p\u003e\u003cp\u003e1) Matlab has issues with uint64 for dec2bin and matrix multiplies.\u003c/p\u003e\u003cp\u003e2) Example of uint64 read is provided in test suite comments\u003c/p\u003e\u003cp\u003e3) Bitshift and bitget work on uint64\u003c/p\u003e","function_template":"function vout=Tree_CH(v);\r\n  vout=0;\r\nend","test_suite":"%%\r\ntic\r\nv=[          2081355757           4898583766 ];\r\nvexp=[uint64(11412103587704585708) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        385960903003         298051413714 ];\r\nvexp=[uint64(13079621846505187505) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(15477096172227810860) ];\r\nvexp=[        188445238409         450375998772 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 6473043965665514375) ];\r\nvexp=[        109230282567          33788952110 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(11270280438309969755) ];\r\nvexp=[         23328302733           8557676614 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[          6893018069           8719066441 ];\r\nvexp=[uint64( 1875942192845872366) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 6566840053865194126) ];\r\nvexp=[         65441249939          85425641391 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         21562167101          16520535073 ];\r\nvexp=[uint64(  956959952027690353) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[          1684200303           7336396097 ];\r\nvexp=[uint64(  871479491406563248) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 2524835851416755114) ];\r\nvexp=[         28589000023          46221104912 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        154908421282         199691474905 ];\r\nvexp=[uint64( 7885684695614904270) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 8176570117722182781) ];\r\nvexp=[         40721598494          22123450931 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 9379940828518631730) ];\r\nvexp=[         37341631466          63773070917 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        232141051889         328442531011 ];\r\nvexp=[uint64( 9972945692012784742) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 9539984397959825908) ];\r\nvexp=[         70384313011         178968141063 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        421484284721         599703187188 ];\r\nvexp=[uint64(17162693345262485798) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        127506314007          35528864794 ];\r\nvexp=[uint64( 4167185002280551319) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         11313093168          21049073135 ];\r\nvexp=[uint64(16014443480831614722) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 7450646608300783266) ];\r\nvexp=[         83429116694         148768825269 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(13305041571212833467) ];\r\nvexp=[         77301627056          27774083789 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(13635447149676152154) ];\r\nvexp=[         90797761304         143479563807 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(11002893257806672560) ];\r\nvexp=[         44637053272         195624712811 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(11051724027090761936) ];\r\nvexp=[         41361095819         189799709732 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(16687200783289968235) ];\r\nvexp=[        552258283575         209936061221 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         54164851566         156315474505 ];\r\nvexp=[uint64(13714337615447966724) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 7329431770178715643) ];\r\nvexp=[         13299036287           4535592331 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(16479631524350748877) ];\r\nvexp=[        165234451641          96812407705 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 6965988866158891263) ];\r\nvexp=[         21216614218           2585039947 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 2910455928437551420) ];\r\nvexp=[          6642417815          14808129701 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         13173276049          27570716815 ];\r\nvexp=[uint64( 4977980945016614908) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(16721022657493559975) ];\r\nvexp=[         65473107451          19359384006 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         16946040975          10725070912 ];\r\nvexp=[uint64( 6003309882203701925) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 2198342485367409266) ];\r\nvexp=[         23006488657          39032588924 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        120013217139          50302005308 ];\r\nvexp=[uint64(14344732783514005715) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         57191814347          77886936688 ];\r\nvexp=[uint64( 8056110860202858614) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(  971778736353519486) ];\r\nvexp=[         17760921544          20384041659 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        129560016431         165770554719 ];\r\nvexp=[uint64(15111464173338859822) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(17855284157674478998) ];\r\nvexp=[        215281025997         298483051015 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[          8822618162           5678585885 ];\r\nvexp=[uint64( 4934822377188433797) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(  632138406214928188) ];\r\nvexp=[          1835073727           4084131059 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(17330627945660580534) ];\r\nvexp=[         41195382388          56325602793 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[          6130953526          13549540271 ];\r\nvexp=[uint64( 1896894898836571068) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         25774822611          36694510870 ];\r\nvexp=[uint64(15996304402734859814) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 9847540446768144862) ];\r\nvexp=[         31041969169          37560295989 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(16612432143632526945) ];\r\nvexp=[         74531365158          60753898717 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(18413647273680019461) ];\r\nvexp=[         10651217970           6995653927 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         62279662838          47373225825 ];\r\nvexp=[uint64( 9640047776936252913) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(16583979163800903818) ];\r\nvexp=[        114249431453         187605944484 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[          9050571726           1557293089 ];\r\nvexp=[uint64( 9060257062169994207) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(12613321696385576431) ];\r\nvexp=[        125835757545          26079146381 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         35625689704          19896848117 ];\r\nvexp=[uint64( 4411487194398480861) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 3484689439967270015) ];\r\nvexp=[         38461243033           5285269728 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         16085645428          43823408873 ];\r\nvexp=[uint64(  894482490922679460) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(12060487473657709988) ];\r\nvexp=[        250877787515         682594856898 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        143931327293          76531069545 ];\r\nvexp=[uint64(12786697318005254653) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(14215963369683634045) ];\r\nvexp=[        100316121935          54160354223 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[          6557653153          12053301655 ];\r\nvexp=[uint64(  343376420813762434) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         47494216762         112901758075 ];\r\nvexp=[uint64( 3772080181899583404) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 6766488059228584288) ];\r\nvexp=[          8189923863          44106320581 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         41526542352          17027036567 ];\r\nvexp=[uint64(17583140790467836275) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[          7196361275           6496875429 ];\r\nvexp=[uint64( 6443574928762444801) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(17365843048376429107) ];\r\nvexp=[         18457341831           7658711707 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         78140576077          33767545674 ];\r\nvexp=[uint64( 6098897546038113251) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[          6734445697          12144787423 ];\r\nvexp=[uint64( 4770215408132554690) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        426726665699         126968827572 ];\r\nvexp=[uint64(12995540462042527271) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 5523416580603863552) ];\r\nvexp=[          4255700693          41585972826 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 3928457774057619184) ];\r\nvexp=[          3877602413          16306596859 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        136097916108          28801327007 ];\r\nvexp=[uint64( 5984770176263773551) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(16263054952801281548) ];\r\nvexp=[         14189368539          34874268638 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        662028875555         839442017139 ];\r\nvexp=[uint64(11859750004469197678) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         61393402621         332298132605 ];\r\nvexp=[uint64( 7879625004656522848) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[          1998630709           8715852076 ];\r\nvexp=[uint64(  429234479783941040) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         46021740257          21715449429 ];\r\nvexp=[uint64(14347105153381215235) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(  498971859648614985) ];\r\nvexp=[         30472124134          22307121041 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 6396162213707057064) ];\r\nvexp=[         26683188512          96283024611 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         46925294325          33937979441 ];\r\nvexp=[uint64( 1189627028589296041) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         76315837293          99424320902 ];\r\nvexp=[uint64(11656949174638158734) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         81880058662          38464981613 ];\r\nvexp=[uint64( 7071867154613101059) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(10763027175299443277) ];\r\nvexp=[        330973468653         194345162402 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         79087591419          23535674032 ];\r\nvexp=[uint64(15017024826981320231) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        241564818347         155909390759 ];\r\nvexp=[uint64(15575297637481852549) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         45079186819         295776092742 ];\r\nvexp=[uint64(16532545499676710720) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[         22268771423          34477255167 ];\r\nvexp=[uint64(11007510539515659130) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 5666822869473456046) ];\r\nvexp=[         28640204779          36488487629 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(14041232599151835393) ];\r\nvexp=[         28442192536          25169506635 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 9611808239041397120) ];\r\nvexp=[          1055826287           7876555270 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        358405360794         498368744795 ];\r\nvexp=[uint64( 4955841772239017238) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 3979638765694296062) ];\r\nvexp=[          6903410593           7465748396 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        151761015812         211325030677 ];\r\nvexp=[uint64( 7987025462351843862) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        325266071703          87446899892 ];\r\nvexp=[uint64(16944641327505127607) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 3273057505586617135) ];\r\nvexp=[        124425395619          27124979723 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        142722642746          60293518411 ];\r\nvexp=[uint64(10857549622062058131) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        379488415355         462240655923 ];\r\nvexp=[uint64(16693497308621268574) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 5336487237226370963) ];\r\nvexp=[         76728175571          32349586492 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        366909173981         111494050923 ];\r\nvexp=[uint64(11044880014193584327) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 2767480983943234275) ];\r\nvexp=[        155407720950          67429662431 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[          4375152441          11923449250 ];\r\nvexp=[uint64(14458798758395123876) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[        107946470399          33010545783 ];\r\nvexp=[uint64(13708745226178508359) ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64(  546205200272961984) ];\r\nvexp=[          1773793574          11180737745 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\n%%\r\nv=[uint64( 6791165959744564855) ];\r\nvexp=[        125726750555          33307435529 ];\r\nvout=Tree_CH(v);\r\nassert(isequal(vout,vexp))\r\ntoc\r\n%%\r\n% Read of GJam 64 bit data\r\n% function z = read_input64(fn)\r\n%  fid=fopen(fn);\r\n%  u=textscan(fid,'%u64');\r\n%  fclose(fid);\r\n%  vptr=2; % skip Test case count \r\n%  dptr=1;\r\n%  while vptr\u003csize(u{1},1)\r\n%   if u{1}(vptr)==1 % single N\r\n%    z{dptr}=u{1}(vptr+1);\r\n%    vptr=vptr+2;\r\n%   else % Pair for p/q\r\n%    z{dptr}=[u{1}(vptr+1) u{1}(vptr+2)];\r\n%    vptr=vptr+3;\r\n%   end\r\n%   dptr=dptr+1;\r\n%  end\r\n% end\r\n%Typical GJam 64 bit data\r\n% 100\r\n% 2 2081355757 4898583766\r\n% 2 385960903003 298051413714\r\n% 1 15477096172227810860\r\n% 1 6473043965665514375\r\n% 1 11270280438309969755\r\n% 2 6893018069 8719066441\r\n% 1 6566840053865194126\r\n% 2 21562167101 16520535073\r\n% 2 1684200303 7336396097\r\n% 1 2524835851416755114\r\n% 2 154908421282 199691474905\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":5,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2013-09-29T03:53:20.000Z","updated_at":"2013-09-29T21:22:24.000Z","published_at":"2013-09-29T04:19:40.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis Challenge is derived from\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://code.google.com/codejam/contest/2924486/dashboard#s=p1\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eGJam 2014 China Rational Number Tree\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe Goal is to determine the tree node if given [P,Q] or provide the [P,Q] if given a node. This is the Large Challenge with a Max of 64 Tree levels. Processing of uint64 size data requires extra care.\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\u003eConsider an infinite complete binary tree where the root node is 1/1 and the left and right children of node P/Q are P/(P+Q) and (P+Q)/Q, respectively.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe Tree looks like:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[         1/1\\n    ______|______\\n    |           |\\n   1/2         2/1\\n ___|___     ___|___\\n |     |     |     |\\n1/3   3/2   2/3   3/1]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe nodes are 1/1, 1/2, 2/1, 1/3, 3/2, 2/3, 3/1,...\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e [N] or [P,Q] where N is a uint64 integer node or [P,Q] (double) are terms of a Node\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 [P,Q](double) or [N](uint64) depends on Input type\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\u003eExamples:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[[Input]  [Output]\\n  [2] [1 2]\\n  [1 2] [2]\\n  [5] [3 2]\\n  [3 2] [5]]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eContest Performance:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Best Delta Time of 14 minutes with only 368 able to process the large data set in less than 3 hours.\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\u003eNotes:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e1) Matlab has issues with uint64 for dec2bin and matrix multiplies.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e2) Example of uint64 read is provided in test suite comments\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e3) Bitshift and bitget work on uint64\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":1908,"title":"Equilibrium","description":"Is this tower of blocks going to fall?\r\n\r\n\u003c\u003chttp://www.alfnie.com/software/equilibrium02.jpg\u003e\u003e\r\n\r\n*Description*\r\n\r\nGiven a stacking configuration for a series of square blocks, your function should return _true_ if they are at equilibrium and _false_ otherwise. \r\n\r\nThe block configuration for N blocks is provided as a input vector *x* with N elements listing the _x-coordinates_ of the left-side of each block. The blocks are square with side equal to 1 (so the i-th block left side is at x(i) and its right side is at x(i)+1). The _y-coordinates_ of each block are determined implicitly by the order of the blocks, which are dropped \"tetris-style\" until they hit the floor or another block. \r\n\r\nAll blocks are identical (same dimensions and mass) and perfectly smooth (friction is to be disregarded).\r\n \r\nIntermediate positions may be unstable. You are only required to determine whether the final configuration is stable.\r\n\r\n*Examples*:\r\n\r\nExample (1) \r\n \r\n x = [0 0.4];\r\n\r\n\u003c\u003chttp://www.alfnie.com/software/equilibrium01a.jpg\u003e\u003e\r\n\r\nThe first block bottom-left corner is at (0,0) and the second block falls on top of it, with its bottom-left corner at (0.4 1). This configuration is stable so your function should return _true_.\r\n\r\nExample (2) \r\n\r\n x = [0 0.6];\r\n\r\n\u003c\u003chttp://www.alfnie.com/software/equilibrium01b.jpg\u003e\u003e\r\n\r\nThe first block bottom-left corner is at (0,0) and the second block falls on top of it, with its bottom-left corner at (0.6 1). This configuration is unstable (the second block will fall) so your function should return _false_.\r\n\r\nExample (3) \r\n\r\n x = [0 1.5 0.6];\r\n\r\n\u003c\u003chttp://www.alfnie.com/software/equilibrium01c.jpg\u003e\u003e\r\n\r\nThe three block bottom-left corner coordinates are (0,0) (1.5,0) and (0.6,1). This configuration is stable so your function should return _true_.\r\n\r\nExample (4) \r\n\r\n x = [0 .9 -.9 zeros(1,5)];\r\n\r\n\u003c\u003chttp://www.alfnie.com/software/equilibrium01d.jpg\u003e\u003e\r\n\r\nThis configuration is unstable, but note that if instead of five we add a few more blocks on top of this at the 0 position that will keep the tower from falling!\r\n\r\nExample (5) \r\n\r\nx = cumsum(fliplr(1./(1:8))/2);\r\n\r\n\u003c\u003chttp://www.alfnie.com/software/equilibrium01e.jpg\u003e\u003e\r\n\r\nThis configuration is stable (see the \u003chttp://en.wikipedia.org/wiki/Block-stacking_problem classic optimal stacking solution\u003e) so your function should return _true_.\r\n\r\n*Display*\r\n\r\nIf you wish, you may display any given block configuration *x* using the code below:\r\n\r\n clf;\r\n y=[];\r\n for n=1:numel(x), y(n)=max([0 y(abs(x(1:n-1)-x(n))\u003c1)+1]); end\r\n h=arrayfun(@(x,y)patch(x+[0,1,1,0],y+[0,0,1,1],rand(1,3)),x,y);\r\n text(x+.5,y+.5,arrayfun(@num2str,1:numel(x),'uni',0),...\r\n 'horizontalalignment','center');\r\n\r\nVisit \u003chttp://www.mathworks.com/matlabcentral/cody/problems/1910-block-canvas Block canvas\u003e for a related Cody problem.","description_html":"\u003cp\u003eIs this tower of blocks going to fall?\u003c/p\u003e\u003cimg src = \"http://www.alfnie.com/software/equilibrium02.jpg\"\u003e\u003cp\u003e\u003cb\u003eDescription\u003c/b\u003e\u003c/p\u003e\u003cp\u003eGiven a stacking configuration for a series of square blocks, your function should return \u003ci\u003etrue\u003c/i\u003e if they are at equilibrium and \u003ci\u003efalse\u003c/i\u003e otherwise.\u003c/p\u003e\u003cp\u003eThe block configuration for N blocks is provided as a input vector \u003cb\u003ex\u003c/b\u003e with N elements listing the \u003ci\u003ex-coordinates\u003c/i\u003e of the left-side of each block. The blocks are square with side equal to 1 (so the i-th block left side is at x(i) and its right side is at x(i)+1). The \u003ci\u003ey-coordinates\u003c/i\u003e of each block are determined implicitly by the order of the blocks, which are dropped \"tetris-style\" until they hit the floor or another block.\u003c/p\u003e\u003cp\u003eAll blocks are identical (same dimensions and mass) and perfectly smooth (friction is to be disregarded).\u003c/p\u003e\u003cp\u003eIntermediate positions may be unstable. You are only required to determine whether the final configuration is stable.\u003c/p\u003e\u003cp\u003e\u003cb\u003eExamples\u003c/b\u003e:\u003c/p\u003e\u003cp\u003eExample (1)\u003c/p\u003e\u003cpre\u003e x = [0 0.4];\u003c/pre\u003e\u003cimg src = \"http://www.alfnie.com/software/equilibrium01a.jpg\"\u003e\u003cp\u003eThe first block bottom-left corner is at (0,0) and the second block falls on top of it, with its bottom-left corner at (0.4 1). This configuration is stable so your function should return \u003ci\u003etrue\u003c/i\u003e.\u003c/p\u003e\u003cp\u003eExample (2)\u003c/p\u003e\u003cpre\u003e x = [0 0.6];\u003c/pre\u003e\u003cimg src = \"http://www.alfnie.com/software/equilibrium01b.jpg\"\u003e\u003cp\u003eThe first block bottom-left corner is at (0,0) and the second block falls on top of it, with its bottom-left corner at (0.6 1). This configuration is unstable (the second block will fall) so your function should return \u003ci\u003efalse\u003c/i\u003e.\u003c/p\u003e\u003cp\u003eExample (3)\u003c/p\u003e\u003cpre\u003e x = [0 1.5 0.6];\u003c/pre\u003e\u003cimg src = \"http://www.alfnie.com/software/equilibrium01c.jpg\"\u003e\u003cp\u003eThe three block bottom-left corner coordinates are (0,0) (1.5,0) and (0.6,1). This configuration is stable so your function should return \u003ci\u003etrue\u003c/i\u003e.\u003c/p\u003e\u003cp\u003eExample (4)\u003c/p\u003e\u003cpre\u003e x = [0 .9 -.9 zeros(1,5)];\u003c/pre\u003e\u003cimg src = \"http://www.alfnie.com/software/equilibrium01d.jpg\"\u003e\u003cp\u003eThis configuration is unstable, but note that if instead of five we add a few more blocks on top of this at the 0 position that will keep the tower from falling!\u003c/p\u003e\u003cp\u003eExample (5)\u003c/p\u003e\u003cp\u003ex = cumsum(fliplr(1./(1:8))/2);\u003c/p\u003e\u003cimg src = \"http://www.alfnie.com/software/equilibrium01e.jpg\"\u003e\u003cp\u003eThis configuration is stable (see the \u003ca href = \"http://en.wikipedia.org/wiki/Block-stacking_problem\"\u003eclassic optimal stacking solution\u003c/a\u003e) so your function should return \u003ci\u003etrue\u003c/i\u003e.\u003c/p\u003e\u003cp\u003e\u003cb\u003eDisplay\u003c/b\u003e\u003c/p\u003e\u003cp\u003eIf you wish, you may display any given block configuration \u003cb\u003ex\u003c/b\u003e using the code below:\u003c/p\u003e\u003cpre\u003e clf;\r\n y=[];\r\n for n=1:numel(x), y(n)=max([0 y(abs(x(1:n-1)-x(n))\u0026lt;1)+1]); end\r\n h=arrayfun(@(x,y)patch(x+[0,1,1,0],y+[0,0,1,1],rand(1,3)),x,y);\r\n text(x+.5,y+.5,arrayfun(@num2str,1:numel(x),'uni',0),...\r\n 'horizontalalignment','center');\u003c/pre\u003e\u003cp\u003eVisit \u003ca href = \"http://www.mathworks.com/matlabcentral/cody/problems/1910-block-canvas\"\u003eBlock canvas\u003c/a\u003e for a related Cody problem.\u003c/p\u003e","function_template":"function y = equilibrium(x)\r\n  y = true;\r\nend","test_suite":"%%\r\nx = [0 0.6];\r\nassert(isequal(equilibrium(x),false))\r\n\r\n%%\r\nx = [0 0.4];\r\nassert(isequal(equilibrium(x),true))\r\n\r\n%%\r\nx = [0 1.5 0.6];\r\nassert(isequal(equilibrium(x),true))\r\n\r\n%%\r\nx = cumsum(fliplr(1./(1:16))/2);\r\nassert(isequal(equilibrium(x),true))\r\n\r\n%%\r\nx = [1.5 2.5 1 0.25 5.5 3.5 -1.5 -0.25 -4 -1.75 6.25 -1.25 0.5 1 -0.5 4.75 -1.25 -1.5 0.5 1.5];\r\nassert(isequal(equilibrium(x),false))\r\n\r\n%%\r\nx = [-1.5 -0.25 -0.25 -1.75 1.75 -2 -5.25 2.25 0.75 -0 0.25 0 -1 -1.5 4.75 -1 4.75 -2.5 3.25 -1];\r\nassert(isequal(equilibrium(x),true))\r\n\r\n%%\r\nx = [1.25 -1.75 -0.75 2.75 -1.5 3.75 1.75 1.5 -0.25 -4 -0.5 -2 1.75 -3.5 -2 -3.75 0 -1.75 1.75 3.25 -1.5 -0.5 1.25 -2 1.5 3 -0.25 1.75 -0.5 2.75 0.5 -4.25 1.5 5.5 3 4.25 2.75 -0.75 0.5 3 3.5 3.25 1.75 1.5 3.25 2.5 5.5 -2 -3.75 -1 5 0.25 -3.75 5.5 1.75 2 1.75 0.5 -3.75 1.5 -0 2 0.5 0 -0.25 0.25 -9 1.75 -3.75 1.25 -3.75 -0 1.75 3.5 -3.75 3.75 -5.75 1.25 3.5 1.5 -2 2 -2.5 -1.5 3 1.75 -1.5 3.25 1.75 -1.5 1.25 -2.5 1.25 -4.25 3.25 -2.5 1.75 1.75 7.25 3.5];\r\nassert(isequal(equilibrium(x),true))\r\n\r\n%%\r\nx = [-0.5 1.5 3.5 0.5 -5.75 2 -1.5 0.25 -0.25 -3 -0.25 3 -3.5 -4.5 1.75 -0.25 0.75 3 0.25 -2.5 2.25 -0.25 1.75 -1.5 -5 -0 -0.5 -2 -0 4.75 -0 2 3.5 1.5 -2.25 3.5 -0.5 4.5 2.5 0.5 1.75 3.5 -0 -2.25 -0.25 -4.75 -2.5 -0.75 -6 2.75 -5 2.25 1 -2.25 -0.75 -0.25 -3.5 0.75 -0 -0.5 -0.5 -1.75 -2 -0.25 -0.25 5 -0.25 -0.75 -0.25 -5 -2 -0.25 -5.5 -5 -0.5 -2 1 -0.75 2 3.25 4.5 2.25 1.25 -0.25 -0.5 -0.25 -2.5 -5 2.25 -2 7.5 6.5 2.25 -0.25 -0.5 7.25 -2.5 1 -2.5 -4.75];\r\nassert(isequal(equilibrium(x),false))\r\n\r\n%%\r\nx = [0.1 0.1 -4.6 -0.4 -1.5 1.6 3 2.7 2.3 -2.7 0.1 -1.7 0 4.4 3.8 -0.4 -2 -0.6 3.3 2.5 -3 -1.7 3.1 2.7 2.7 3.1 -0.4 1.1 -0.2 -0.1 -0.3 2.7];\r\nassert(isequal(equilibrium(x),true))\r\n\r\n%%\r\nx = [0.1 0.1 -4.6 -0.4 -1.5 1.6 3 2.7 2.3 -2.7 0.1 -1.7 0 4.4 3.8 -0.4 -2 -0.6 3.3 2.5 -3 -1.7 3.1 2.7 2.7 3.1 -0.4 1.1 -0.2 -0.1 -0.3 2.7 -1.8 2.3];\r\nassert(isequal(equilibrium(x),false))\r\n\r\n%%\r\nx = [-3.5 2.6 -0.7 -1.1 -2.6 -2 0.8 -0.7 2.7 0.4 -5 3.7 -1.2 -1.3 2.8 0.8 -1.5 -1.8 0 -0 4.8 -1.4 -1.2 -1.5 1 0.2 2.6 1.7 1.6 -1.3 2.1 -1.5 -1.4 2 0.1 -0.1 -0.1 4.6 -3 -0.3 0.2 -1.9 -0 0.1 0 2.1 -1.7 -3.1 -0 0.2 -0.1 -0.5 4.7 -1.8 -0.1 -2.2];\r\nassert(isequal(equilibrium(x),false));\r\n\r\n%%\r\nx = [-2.5 2.6 -0.7 -1.1 -2.6 -2 0.8 -0.7 2.7 0.4 -5 3.7 -1.2 -1.3 2.8 0.8 -1.5 -1.8 0 -0 4.8 -1.4 -1.2 -1.5 1 0.2 2.6 1.7 1.6 -1.3 2.1 -1.5 -1.4 2 0.1 -0.1 -0.1 4.6 -3 -0.3 0.2 -1.9 -0 0.1 0 2.1 -1.7 -3.1 -0 0.2 -0.1 -0.5 4.7 -1.8 -0.1 -2.2];\r\nassert(isequal(equilibrium(x),true));\r\n\r\n%%\r\nx =[0 .9 -.9 zeros(1,8)];\r\nassert(isequal(equilibrium(x),true))\r\n\r\n%%\r\nx =[0 .9 -.9 zeros(1,6)];\r\nassert(isequal(equilibrium(x),false))\r\n\r\n%%\r\nx = repmat([0 .7 -.7 0],1,2);\r\nassert(isequal(equilibrium(x),false))\r\n\r\n%%\r\nx = repmat([0 .6 -.6 0],1,2);\r\nassert(isequal(equilibrium(x),true))\r\n","published":true,"deleted":false,"likes_count":2,"comments_count":0,"created_by":43,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":3,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2013-10-02T08:49:59.000Z","updated_at":"2013-10-08T00:22:34.000Z","published_at":"2013-10-02T09:44:07.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\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/media/image2.JPEG\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"targetMode\":\"\",\"relationshipId\":\"rId3\",\"target\":\"/media/image3.JPEG\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"targetMode\":\"\",\"relationshipId\":\"rId4\",\"target\":\"/media/image4.JPEG\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"targetMode\":\"\",\"relationshipId\":\"rId5\",\"target\":\"/media/image5.JPEG\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"targetMode\":\"\",\"relationshipId\":\"rId6\",\"target\":\"/media/image6.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\u003eIs this tower of blocks going to fall?\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:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eDescription\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eGiven a stacking configuration for a series of square blocks, your function should return\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003etrue\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e if they are at equilibrium and\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003efalse\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e otherwise.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe block configuration for N blocks is provided as a input vector\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ex\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e with N elements listing the\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ex-coordinates\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e of the left-side of each block. The blocks are square with side equal to 1 (so the i-th block left side is at x(i) and its right side is at x(i)+1). The\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ey-coordinates\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e of each block are determined implicitly by the order of the blocks, which are dropped \\\"tetris-style\\\" until they hit the floor or another block.\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\u003eAll blocks are identical (same dimensions and mass) and perfectly smooth (friction is to be disregarded).\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\u003eIntermediate positions may be unstable. You are only required to determine whether the final configuration is stable.\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\u003eExamples\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eExample (1)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ x = [0 0.4];]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw: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=\\\"rId2\\\"/\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\u003eThe first block bottom-left corner is at (0,0) and the second block falls on top of it, with its bottom-left corner at (0.4 1). This configuration is stable so your function should return\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003etrue\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eExample (2)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ x = [0 0.6];]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw: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=\\\"rId3\\\"/\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\u003eThe first block bottom-left corner is at (0,0) and the second block falls on top of it, with its bottom-left corner at (0.6 1). This configuration is unstable (the second block will fall) so your function should return\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003efalse\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eExample (3)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ x = [0 1.5 0.6];]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw: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=\\\"rId4\\\"/\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\u003eThe three block bottom-left corner coordinates are (0,0) (1.5,0) and (0.6,1). This configuration is stable so your function should return\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003etrue\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eExample (4)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ x = [0 .9 -.9 zeros(1,5)];]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw: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=\\\"rId5\\\"/\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\u003eThis configuration is unstable, but note that if instead of five we add a few more blocks on top of this at the 0 position that will keep the tower from falling!\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eExample (5)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003ex = cumsum(fliplr(1./(1:8))/2);\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw: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=\\\"rId6\\\"/\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\u003eThis configuration is stable (see the\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://en.wikipedia.org/wiki/Block-stacking_problem\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eclassic optimal stacking solution\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e) so your function should return\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003etrue\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eDisplay\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\u003eIf you wish, you may display any given block configuration\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003ex\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e using the code below:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ clf;\\n y=[];\\n for n=1:numel(x), y(n)=max([0 y(abs(x(1:n-1)-x(n))\u003c1)+1]); end\\n h=arrayfun(@(x,y)patch(x+[0,1,1,0],y+[0,0,1,1],rand(1,3)),x,y);\\n text(x+.5,y+.5,arrayfun(@num2str,1:numel(x),'uni',0),...\\n 'horizontalalignment','center');]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eVisit\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.mathworks.com/matlabcentral/cody/problems/1910-block-canvas\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eBlock canvas\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e for a related Cody problem.\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/wAARCAGbAGkDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3w9aKO9FcbKCiiii4BRRRRcAoooouAUUUUXAKKKKLgFLmkoppgBpKKKlsBc0ZpKKVwFzRmkoouAuaM0lFFwFzRmkoouAuaM0lFFwFzRmkopoAPWiiipe4wooopXAKKKKLgFFFFFwCiiii4BRRRRcAooopoANFIe9FJvUBaKSikAtFJRQAtFJRQAtFJRQAtFJRQAtFJS5ppgIe9FBoqW9QsFFFFTcAooopgFFFFK4BRRRRcAoooouAUuKSlqkAhNJmmnqaM0pbk3HZFGRTc0ZpD5iG9Z1sbkx5DiJipHXODXhuo+IdZjsYjFrGpCfcocCd84I7iveK8k1rxpar4tv7VbO6ZvtC2wIZQCwOw9+me9dFKc1TnGEOZv8AAcaSqvlbsbPwt1HU9Qg1NtRuru4VWj8prgk8EHOM9uleh5FU9MhktdKs7eXHmRQojYORkAA1bzXPayIguRct7jsijIpuaM0Fcw7IoyKbmjNAcw7NLmmZpaaFcYx5NFMZvmI96TdRLczbJKKj3UbqQXG3Uxgs55UxujjZhn1AryOy8Iwar4ktL25vLkyXdz9ok2KoG7Bk446ZAH4166cMCDgg9iK8D8eoknjG4GlW7rBGqQgW8ZVRIMqwGAOc8cVUFV506crd/M6MNh5YipyqXLY+gSc80Y781k6OWsvDdh9sLRvBZx+dv6qQg3Z+lfOsa61qvxTFxYf2hNazauZoirOAYvN3Zweg289KqMLt3M+STu0r2PqCioy3J5o3VnYzuSUVHuo3UBckzTt1Q7/enbqpBcidsOw96buFMkbErj3pu4VT3FfUl3CjcKi3CjcKVhEoYZrw7VLmUeKrxAkez+0mGSxz/rvyr2zcPWvHdTtbD+3Ly4e4CzC+diDPgZ8307fSvRy+lGo5c3Y2o+015HY9ivovtNrc24YKZY3jBPYkEfpXjEMV54I8WKZPs949mnIVmQPvj45wfWvY4761uJisF3BK3UrHIrED6CvF9WkXUfFFybq8d5HvfJKiUD5RJsAA+nFYYf2am/aq6OnCOtKM4Qdk1qe1WV19rsLa5K7POhWTbnOMgHH61PuFV4oo7aFLeIERQqI0GckAYA69afuFcztfQ4CXcKNwqLcKNwpWAl3e9Pz71W3D1qXPvTSAhlYCZx/tGmbhSTt+/kH+0aj3e9W1qK+pLuFG4VFu96N3vSsIl3ivF/FPhLWbjVdUEdgrm7kmlhbzEwylup5yPvDtmvY93vXnuteIdRF5czoLbFqZYY1MTHI39zu/2f1ruwVWtS5nSS26jjShUkud2SML4T+DNa0PxVLqV9ZxQ2ot5Lfesqsd+V4wKqXMMh8VyyfZzt/tMnf8v/Pau48J63ezat9gnEBhl8yYsiFSG49+n4Z96zZtAZpJdQ+2HH2ppfL8r/pseM5/WuSlmkKK55fa02OuhOHNK2x6U7De3Pc0m4VG7fO3Pc0m73qN9TkZLuFG4VFu96N3vRYRJuqbPvVXd71Nn3ppDILhv9Jl/wB81HuFJct/pU3T77VHuPtVtCe5LuFG4VFuPtRuPtSsK5Lur528SRa2vjrUEMepCyk1ByoCyeW0fmc47Yr6E3H2rC1u2urzUrRbYIxWGTId9oA3L6A56USryoQlKKuGnV2MvwxBZr4himsoztWOVWcBsDpgEniiSbSvs8qGZftf2hvl3v8Ae849un9K2dHeXT9IuzcKN0E00jKjZHAB6+4ridN1GXWNSitIrbyzcTNKGeXhRuMnYenHFRhqKlTu0aUqkaWm9z1R2+dvrSbhUTPliQetG4+1XYzuS7hRuFRbj7Ubj7UWC5LuFT596pbuO1Wd3uKaQ0V7psXcw/6aH+dRbvelu2xezjj75/nUO6qa1JZLu96N3vUW6jdRYCprd5NZ6RNPBII5VKBWKg4ywHf2Nee674s1rTru1kh1BN7xuvzRIeMr2Ar0uRUlQpIiOjfeVhkEfSuRvxptjC9vc6aBM7yNH/ooYEeZ2P0I/Ou7CSpcsozhzM6KUYTi4SMHT/E+r3ei3Tyagn71pd+2JMHjHpx0pl/A/hvxC/8AZ93Kpto0MZkVWwWjGe2O5rvIjo+qXFrNYabF5EbSB3a0CLnA45Hqa8xu9OuJPEk1w1k7xHUCTIVBBXzu/rxXHgZyr803Bx30O6NGjWtFJLlX3nsFhcPcabaTyEF5IEdiPUqD0+pqxu96iJCnaoAUcADoKN1S0eS9yXd70bveot1G6iwEhY4qzn3qju47VazRYCveN/p0/T/WN/Ood1Let/p9x0/1rfzqHdV21JZLuo3VFuo3UWAl3VxvieeefVxFGIlW2jwC2SW34P0HTFdburj/ABbLpezzkvYkvjMkcgjucNgA8FQeOw6ZrbD1o0Z88lsaUVzTSOg8NwNb6LBvdWaYmc7RgDdg4/D9ayX0q5azku/Ph8vzmfZsO7HmnvmjwdczSx3UTzyyRReUsYkbIXrwD+ApXmt/7OkX7a/mea37r7QcZ808bc4rJ49UXzv7Whc/a0ZuMH6nVu3zHp1NJuqJm+Y9O9G6kYXJd1G6ot1G6iwEm7jtVzdWcX47Vd3UWGirfN/xMLnp/rW/nVfd71JqDY1G6HH+tb+dV91XYlkm73pQcnHGai3UBsEEY4NFhGHb+L7O4vYrZba5BklEQchcA5x0zn9K4HUtGvm8S3d8kKGEXzSZEgBIElRazd3OheI7iK2kR1tJg8fmJnJ4bnH1x9K6fxJDNp8kBhnJF0HmYNGDtOQcD/vqrnQ5kkVLD4i8OW2r/A7OPUGlvFiktpYi+4qWZSDjGeh44rmZPF1kkUmkm3ufP89od+F27vN+ucfhUX9r348My66ZojcwO0aR+V8nLquTz6VzOhWcmtatczTzlHRhcDZGMbi5P5ZooZdTr03LF/Z2t3Lx1RYZOcPhW56drGqw6PYTX06u8cZUFYxkkk44qjoXii08QSTpbQzxmEKzeaBg5zjGD7U2ezPiLRZ7K8mKbptpkiUA/KwI4P0rktDSbQL6U2029ZZVhcSx/wAIkx/I1ChNystjXDxo1cO5a826PSd3vRu96jJGe3WjdRY5rkhPB6Vdz71m7uD0q9u+lFgRV1E/8TK6HH+tf+ZqvuqTUWxqd2OP9a/86q7vpVie5Nuo3VDu+lG76UCuVIovDL6rfS6rZ2kjBEDPLbF/mG7OTj0K1zF7qHhu6M6xy28rGWTyRsYnbuOMcegFdD/Z13d3s1rCYP8ASvMZWdyNoCjqMfyrgL/w7eeHdaW0nmt5ngVXLRlgCCp9RmnWwqxMoQpyd1q7FYOUPauWIlyxPQoJ9EubGW3gS3ks1cB4RCduSePlIyeRXOtaWNqrqtkYZXdiMW7qSvmfToBWhoWnXMNl9pLQk3BgmRNxwAOcE475x+FQ32sz3N2sgtEUR5hI848nfjP3fUVjXpOdRQu1E1r4enUxPs4SvT7m5NcWcejzvaFUh2uiiNSPnORgDrkmsqztdMl1C1ENom9CZG/dEYG04JyP72Pxq3LazQaRKGMRljla4wGOCAd2Acf0qGwnmXUozJEgWZDHlZCSpGW7is66j7WPvW/Uz9rKnNwpq8X1Og3Ubqh3fSjd9K6SLkpbjt0q/u+lZZbg9K0N30osNMqam3/E1vOn+uf+dVd1Tao3/E2vOn+vf+dVN1XYlvUl3Ubqi3UbqLCuVtYvJ7DT3vbWdoLiHG2QAcBiAeD/AJFefazql1faiLm5vmkldMM3yjgYA6CvSiQwwygj0PeuOuNRsEae0MJ83z3TiEYzv9acq0qULU4+8+vY2oRcpX5Oa3Q3fCV1Lc+H4Glk8wo7RqxA+6pwPY46VaOh6Y2gyX5uJftWWk2eeMbvMParfyo21VVVyeAMAflXJyXloEeHyG87zmG/yhjPmHvXNWrOkldXvoNYmMJN23N/WJW3Qw+cYo5RIHIIGRgcc/WoNLijad3a5eV4XxGpkGANg9OvU1evoxcWtxEI1dmjYICB1I/TrXFaFazWWp213NaPHCu5WcBeMgqOhz1q1h4OXtJytbZHbRVOrhZLRSWvqd/uo3VEW7cUbq1seXclLcHp0rQ3fSsktwenStPdRYaZT1Q41e9/67v/ADqpuqfVj/xOL0f9N3/nVTdV2Je5Juo3VHuo3U7ASbq8716KSy164VHVhuE3zL6ndjr2ru53K20zDghGII65xXOqPD+p3VqqTW11cyEbgJyzMAh68561E3NK0dGenl0nTU5p6WN46hK2lQXiogllWMkEEgFsfn1qnpHhmTWL+eJr5Yto8/Ihzkl+mN1X/Iga3W3MY8ldoVBxgDGOnpj9Kw4ryC0jkMF5JFclzGdlw4YjzOnBrixPu1ISnqu3meZ7CVapdbI3tTuJtPFwoMcksVwIQxUgHnrjPp71kWS3Fw7WryRCNAJCRGcn58464rXlt4Z1aKVDIrPubc5JJz1z17UyNdBh8PiSKWFdT2BeJm3lt/TGcfhXRVgpSTa0O+g4OjKKj73cuFsntSbqjJ5/GjdW9jgJC3ynp0rT3Vjk8H6VqbqGhplLVzjWb7/ru/8AOqm6p9Yb/idX/wD13f8A9Cqlu9qtImW5Nuo3VDu9qN3tRYQ6X95DKgxlkK8njJBrz7w74W1LRfEEV1N9mkW3BDKkvJ3IcYOMd672WQpDI4xlVJH4A1BcWTxJFOt1LvndQ+UX+7249q569RwtGO7NaGIo06ijWvZ9h9xqSW2mC+MTsmFOwEZ5xjk/WuVhvJLuZ0jtyDvMp3SDpvz/APWrpp7GK40/7EzOIwFG4Hnj/wDUKpweHYLfSXv47qfzthyDtxw+OmPaufGUpTUf61O3CY6hhW+e+uhpw36y2kl0YmQRl9yE5Py/z6Vg2l4900NssBVpHLBi4wBndz+AxW1FapFbPbbnZZC2WPU7v/1+lY1tZG2SK7Sdy6NjBC4I3bfT0/WtalSpTcPPcMNUqxlN4fZrr2OmLDJPrRuqInmk3e1ddjzWyUtwfpWrurFLfKa1t1JoaKOsH/ieX/8A18P/AOhGqWas60f+J7qH/Xy//oRqjmtEtBS3Jc0ZqLNGadhXJGcKpLY2gc/T/wDVWJf2b6dp7XN1YTwRmQ7JHhIHLErjHtWncH/RpuP+WbfyNc3qvxDl8VabDpH9lpbZdH83zy/3Qe2KulSU5pM68NT507K7OktdTtb8ubV2lKuFwqHOT0471dkW0h0H7NNZNHfOjFQ1uck7+ucYHX9a5bwsJbaSd/kZ0kikAycHGfxqfxJ4znj1YRPYRFoY8ZEx53YPp7VjjaShV5eiOCtha1SsqdttWbN43+h3JGf9W/Q+xrltHktZtUtURASAx5jx/Cf6/rW/JN5+kvLt2+ZblsZ6ZX/69YWlabLZ6lbSvKjL8wwoOeVNY1MPOpKMorRbntYHF0aGHq06jtKS0OszRmos0ZrpseTckJ+U1sZrDLfKfpWxmk0NMo62f+J7qP8A18yf+hGqGata43/E/wBR/wCvmT/0I1n7qpLQmW5NmjNQ7qN1VYVyVsMpVh8pBB57f/qrL0vw34bE0rnYrIwEZ+1kcbe3NXJm/wBHl4/5Zt/I1z+n6nbXd5aQpG+7OcsoxjaatUPaQk1KzR6OChFwnOU7NbLubum2sNvbh4w26UAsWbOfp+Zrh79zda7N9okZs3HltlsYTdjH4Cu+3VWa7S1nlV4XYyHepUDGMAevrUKHtHaTM8LGeIrcsW7stSIiWbxoP3Yi2rg/w4/Xiuk8T6H4a0/TrWbTrtRN54Ulb3fhdjep+lcjaXC/2ejlWAjTawI7qOae8Etp5jy2TKJnAXBQk/L9fY1wYyrOlKLg+u3cvDYWFSpKnWfLa+r7k0LJ58yxzGWNQmCX3Y696mzVaBfLt40IAKoAQMYzin7q7731PPa5dL3JmPyn8a2c1gFvlP0NbW6kxoo663/FQakP+nqT/wBCNZ+72q3rzY8RamOf+PqT/wBCNZ+761UVoKW5Lu9qN3tUW760bvrVWESPh0ZDkBlIOKfpvgCK20BNfTUZ2lhikkERiG04yuM/hVcuFBJ6AdT6CrEOp6U/h1rdbxTdOkgWIO2S2SRx05Fc+IrzopcqbvpoROUklYTPPenzaK8+inVjdFWWJiIxFwPm7nPPSqk7HyZdud21sY9cHpVVCGSFIvPaJTh1UOVAwTyOnXH51FeVRSioHdgsTKhV5oJt9LdCwIvs9lNHvLEhyTjHX2rd1m2nhtrZ5J1kXzcYEW3nY3vWBcSbrOVlycxNgj6VlWy6lBdW73yX6w88zLJtztPrXLjKc5V6ck9FubUqqnCo6ivJ9ToN3tRu9qrpOkudhJK4zkYx+dP3fWvUWp5zVnZkhb5T9DW3uNc+zfKetbm6k0NGfr7f8VHqfX/j6l/9CNZ+761b8QH/AIqTU+v/AB9yf+hGs/d9auK0JluS7vrUc84gt5JSCwRSxHc0m760yVFmheJ87XUg4PaqsEbXV9inDqwu2kh8goTE5B3ZHStVfBup2BtLh5rRgWAAV2zkqfVa5h40tp7gxTMCm5RkgnGK6Y69qc4EUt+dsRRlGxBg7fp7mli6v1aKmvhZ016fM7UOqH3EEtpP5M2zdtDfI2Rg59vY1q+G7W6v57u2t1iyoExaSQjjhcDg9x+tYC3U14sdxcSmSRo1GcAY/LjvUun6ve6Xd3Mtpd+SzKsZG1SMcHuPXNYV5yVPmpbvY3yeliJVuWLXNYfd2ktjLcWEpQywZiYocqTgdD1796k8QeNFukW0/s90aFw5bzgQRtPt71Ta/e8c3VzMslxPiSRuBkkDsOnTtWNewRzXk7s7A/L0YY+6K6sJTpzt7fXT8SsJGc60oRNqB3lJnZQokRNoDZOOe/41Nu+tVbZv9Fh6/wCrX+QqXd9ahRS0RwVJNzbY8t8p69DW9u9q51j8p6963t1DRETO8QtjxLqg5/4+5P8A0I1nbvrV3xE2PE2q9f8Aj7l/9CNZm7604rRCluybd9aimuUt4/Mk3bcgcDPP0pN31qtqAL2bEHBXDjI64zRO6i2EFzSUe5cF/YT6WltHAWuQqZHkc5BGefoDTodLvNTlMttp8syoNjEqvDcHufesO0eWC7Vh5ZLccg/5716L4EN5d3N3ZI1sgUCfeyscnhcda8yTpvDNtnp+zxGCrKfLqjkLXKxN8hQF2IB4wK3/AA5aPLc3FwbB54tgj3iMN82c49eh/WszVLFtJ1W609pRKYJNvmBdu7gHoenX9KpRfEG58MPPYQ6dBcKzebvkcqQSo4wPp+td1NXpR5diMNiJLFOs9GdWmt6I2jXqC3O9hNsP2XpnOOa860LQtSN4ly2nu8KblYjaeSvpn3rptN02W80FrlZkQOjttKE44+tassFz4c00MskFwJZu6lcEr9f9n9a82p9aldxjqnp6Co/UfaylGbvK7l5PyMRWBVSucEcfSnbvrUCfKirk8DGaXd9a9iKdtTz5NX0JC3ynr0NdBu+tc0z/ACnr0NdBu+tDQ4md4jb/AIqfVhz/AMfkv/oRrM3fWr3iRv8AiqdW6/8AH5L/AOhGszd9aqC0RMt2SFwBk5qOd0aF1JPIxj1HtViwWSTUbZYl3MJBJgtjhTk8mtLV9S/4m9mWglBtssw3DkMOMfka4MVi5QqeyhG7tclTtNRW5jTwWizRCL7x3ZAcnArqNMltbHwzLd2d48OpG3cM0dw2/IJwCM+w7VzmpakLyWO6WGRYvLCkswz19Pxrb0bVf7CsZPtVtK3mzBl8t1P8I9/arw7gqcY10ouXRno0niYRlKSctOpjS3MtzM888zzSyHLSO2Sx+v0/lWbLptreQPO9u00+cFhuPIPTjpgVZB45zXW+EfHVl4e0ie3uba7kZ7hpAYtuMYC9z6j8q6KsGorkOHmlujg5NRvrYT29td3MdupYKiMduMVrT6jPcLEsl5NNGr8hpCwB2n8KuWU8i6PNGIWIPm8hhjv/AI1chS60DTS15bkiSUbfKlB52/8A1jXDg8wpurOlOyd7I7lh6FVq0raa27mMHBAIz+Hejd9ap+eY8R7GYqozgipUlEkauMjI/EV6iOKUHHXoTM3ynr0NdDurmWb5T16Gui3e5pNCiZviVj/wlOrjn/j8m/8AQzWXu9zV/wATNjxXq/X/AI/Jf/QzWXu9zVQXuomW7LEN3LaSi4hIEiqcblyDxWpr1q8dj/aZnZpWCLtKAL0/z3rFjeMTRmbBhDqXBGflyM1pa5HEVt3hgdYSGDHYQpJxjr+Nc9WNKM+d2UmbYepThL34Xv1MfMhCW7PlCOcLzx710ejWsmvzyWlzcMkcSCQGJACSOP5Zrfnh0K6+HgOn2EUmorbRr5kVod4kXbv+bHXGfrXI6fE620t48EwiPImCNgqAO47V5DxP1ylJyVpRdkd2MxE8TKUcK+VW2Wp2tp8PbS40a7vWv7sPD5m1QqYO0ZHavPrmzMFpGwmYhjyCo9z/ADrr/C81rN4XngdZZrwebvAR2ILZ25PTn61kXsmkFY4EhTzYn/eJ5JyMAg549anD46tSc4VIuR1YDA0asVSc05tfcdFqHhVNL8GJqMN5OzyJG5V412gyYzg9f4jXL6prF9erHbXDxmNcSALHtOen9ap3MrXl0Le3aeVCFRYhuwWGeNv5Vo3MVjZ+HkhubUQ6i0Hy74SHznscVhh8O6DjWqR5pSd/Q5sTRpU68qEJJW/ELXQI7rRZdSNxMsgSQhQo2/LnFY0WEiVASQAOfWqlho2vSW8d3HZX7WILM8iq2zaM7v1Bq5BHNcyrFbxPNIRlUjXJI9h7CvZwCqtzlUle708jixMHSahz8y8ugrMdp69K6LP1rnLmGe1ZormGWGQDOyRdpxz6+uP0roM+9eg0c8TL8UOB4q1k88Xk3/oZqG50u4tbFbt5YmRtvyrnPP6Vc1WKG5+IV5b3BIgl1Vo5Du2/KZcHntxWx4+srDS7TTobC6Zo5GYOhnEg+UDb/WiNSEYpSFK7lZHFs25SMnnNdXcW9zqnhZLlfIjRVEmCxJwmR6Y7VmzadpyeGVvVlP2rykY5m/iJGflqTS7tn023tWvmWB22NGHAAUvz/WvGxUo4q04Kzi+p6uBwE6zlG60Vy5Z6/LoOiiwe1SbzGkAdZCuNw9MVDpt/NP4cfTEhjASMw+aznJzznGO2fWt74k6Domj6TZz6VMXla4Ktm58zC7Cen1rmtRhttM0sSWVyySPIu7EobPB7flXNTlCmoqa96b3JwdSlg8Q+aLtJamp4FuJ0S/8AKSJstHnexHPPoKzYtNub7UtQuUkhTFxJGVOeu7P9azNHv57Jolt714lmZPNAYc/n0robBYFupkF66rJmZsTDlyeTXr4vL68IOpFroduDw9CliIukrVHfU5yxvTa6jDelAxSXzPLzjPtmul1W1uvEFjaakpggQRcISWPzMO+K5W+jit9RuIIGzFG5C5bdx9a7bwhHbX/h5lvb11EcpjRPPCYUAEcde9ZYuNX2cXRepw06WHeLqPFK8lcWTW7jwz4Xj0eW2iuPOSeISpKVxuzyRj/arlNC1CTTNSW9WJZViVk2Ftucj6VZMg1PRfPvrx5J41kZMyAYPPYfQVW0y3tprKR5ZSr7zx5u3jAq8PzYakpYjVvsXLLHVqWpaXV9Q1rWDrV6bwwiDMSoEDbumf8AGtXP1rk1dTCMEHCjoa6nNd26ueW4uLcX0Of8W6tZp4w1tGc5W/mBG3uHNVYfEWlR6U9ud4kKuOIh1Oax/G3/ACPWv/8AYRuP/RjVhCvDxE3XSjLoe3h4qg3KPU9C8O+KtG0x7o3RkPmbNu2HPTPv70XPi3RZEuAvm5kZiv7kdCfr6V57RQ5vm5hU4Km7xO21LxFpVwsQgLqVYk/u8dvatKx8X6Jb6PFbP5nmquDiEf3s+teb0VnVSqxUZdHc7Fi5e2dayu1Y9M8VeMtD1ezgitDLuSQsd0OOMEetT6f448P2+oW00vm7ELbv3AP8JHr64ryylreVeTpOk9mYVJupWVZ7noXirxbo+ratHcWTSCJYVQhotvIJPr71e8S+NNB1TS0gtfM8wSq3zwgcYPufWvLqO1Z05OnGMY7I48RhYV6vtZ7nTf2vY+U6ncSd2PlpRrFj5iEsTj/Y9q5gdaM8VpOvKUXF9T0PrE+anL+TY6dtYsi7kMwBA/h711H9q2n99/8AvmvMK7CqpYmdOKguhy4mCr1XVluz/9k=\"},{\"partUri\":\"/media/image2.JPEG\",\"contentType\":\"image/JPEG\",\"content\":\"data:image/JPEG;base64,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\"},{\"partUri\":\"/media/image3.JPEG\",\"contentType\":\"image/JPEG\",\"content\":\"data:image/JPEG;base64,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\"},{\"partUri\":\"/media/image4.JPEG\",\"contentType\":\"image/JPEG\",\"content\":\"data:image/JPEG;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCACvAOkDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACmHrT6jPWsaz0GhaKSiue4xaKSii4C0UlFFwFopKKLgLRSUUXAWikoouAtFJRQmBJRRRXciQooooAKKKKACiiigAooooAKKKKACiiigAqM9TUlRE/NXPiHohoXNGaTNGa5LlC5ozSZozRcBc0ZpM0ZouAuaM0maM0XAXNGaTNGaLgLmjNJmjNFwFzRmkzRmmnqBLRRRXpIgKKKKACiiigAooooAKKKKACiiigAooooAKrO2HPNWazJpMTOPeufEK6Qm7Fnd70bveqfm+9Hm+9cnKTzFzd70bveqfm+9Hm+9HKHMXN3vRu96p+b70eb70cocxc3e9G73qn5vvR5vvRyhzFzd70bveqfm+9Hm+9HKHMXN3vRu96p+b70eb70cocxc3e9G/3FU/N96PN96ajqHMa3aijtRXpIsKKKKACiiigAooooAKKKKACiiigAooooASsK5kxcyD/ardrlr2TF9MP9s1nUV0RPYn833o833qj5v1o8361hymVy95vvR5vvVHzfrR5v1o5QuXvN96PN96o+b9aPN+tHKFy95vvR5vvVHzfrR5v1o5QuXvN96PN96o+b9aPN+tHKFy95vvR5vvVHzfrR5v1o5QuXvN96PNqj5v1o8360cgXOxHSikHQUtdZ0BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFACVxeoy7dRuB/00NdpXAatJjVrof9NDSauZVdh3nUedVHzf85o83/OankMLl7zqPOqj5v8AnNHm/wCc0cgXL3nUedVHzf8AOaPN/wA5o5AuXvOo86qPm/5zR5v+c0cgXL3nUedVHzf85o83/OaOQLl7zqPOqj5v+c0eb/nNHIFy951HnVR83/OaPN/zmjkC56WOlLSDpS1Z2BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXmetS7davBn/lq1emV5RrsgGvXw/6bNVQV2YV/hGed70ed71R82jza05DluXvO96PO96o+bR5tHIFy953vR53vVHzfejzh61NorcpKT2Re873o873qj5w9aPN9DRaPcOWXYved70ed71R82jzarkJuXvO96PO96o+bR5tHIFy953vR53vVHzaPNpcg0z2cdKWgdKKyPQQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAGvHPEMmPEV+P+mzfzr2M14j4lkx4m1If9N2/nW1FXZz4l+6iDzfcUeb7iqPm0ebXRynFcveb7ijzfcVR82jzaOULjC27Wrn/r3i/9CkqxVGBt2r3X/XvF/wChSVdckIcEA44JGQK+OzOTWKkkz9AyeMXg4NoWnIdrg1FEWaNS+N3fAwDSudq596wwjl9Yir9Tox0I/VZtLoy35vuKPN9xVHzaPNr7jlPze5e833FHm+4qj5tHm0coXL3m+4o833FUfNpPNocRp6n0GOlLSDoKWuE9NBRRRQMKKKKACiiigAooooAKKKKACiiigANeC+KZMeKtTGf+Xh/5170a+ePFsmPFuqj/AKeX/nXThleTOXFP3UVfOo86qHm0ebXbynBcv+dR51Rabbi+uZ0eSRVjRCNmOpLeo9hWj/Y0X/PxP/47/wDE1yVMVThJxZyVsdSpT5JblOwbdqt3/wBcIv8A0KStOoY9ISGV5I7m4VnUKx+TkDOP4fc0y+t5bezklS9n3LjqI/X/AHa+axeFlicQ5Qe59RlfFmCpUY0ZJ3LNRXLbYGNYn2u7/wCf2X/viP8A+JrMv9T1Bbkwi9k8vy1bBROuT/s+1bUcmr0akakmrJnq4nP8NWoypxTu0dB51HnVyn269/5+n/75T/Cj7de/8/Tf98p/hX0ftYnx1zq/Oo86ubs7y6e7jWS4Z1OcqVXnj2Favm1rC0loF7F/zqPOqh5tHm1TjoCep9PjpS0g6ClryT11sFFFFAwooooAKKKKACiiigAooooAKKKKAEr5u8YygeMtXH/T0/8AOvpE18xeNZceNtZH/T0/867MErzOPGP3UZ/m/SjzfpVHzh/k0ecP8mvT5TzrnT+Gm33N6f8AYiH6vXQkgDPYelcz4SbdPfH/AGYv5vXT18zjP40j53Mf94fy/IbFIJYkkXIV1DAH3qnrLbdJmP8Au/8AoQq6FCqFUAKBgAdqztfO3RLg/wC7/wChCow/8WJhh7e3jbuct5vuKzrtt98x/wCmS/zan+cP8mq7tuu3P+wv82r6HERtA+ri73FJwCQM+1IrblBHf1pSARgj8KK4B9CW2O24Q+/9K0PN+lZiNtdT71L5w/ya7sMrxFJl7zfpR5v0qj5w/wAmjzh/k10OOhKep9dj7opRSD7opRXgnuLYKKKKBhRRRQAUUUUAFFFFABRRRQAUUUUAJXyT4+1mCDx9rsTLJuS8kBwB2P1r63r4q+JX/JS/Ef8A1/y/zrSlVlTd4mdSnGorSIv7ftv7sv8A3yP8aP7ftv7sv/fI/wAa5qit/rtUy+qUux3Wh+NbTSmuC9tLIJQmOQCMZ/xrY/4WfYf8+E//AH2K8uorjqRU5OUtzCpleGqS5pR1PUf+Fn2H/PhN/wB9iqmp/EOyv9Oltls5kL45LA4wQf6V5zS9KUIKDUkTDKMLBqSjqdH/AG/bekv5D/Gmf29AsrMI3YFQOcA8Z/xrns0CuqeJqTVmdSwtNdDof+Eih/54P+dH/CRQ/wDPB/zFc9RWPMx/V6fY6MeIISeYZB7gil/t+29Jf++R/jXN0lbQxE4KyE8LTfQ6X+37b+7L/wB8j/Gj+37b+7L/AN8j/Guapav65VF9Vpdj79HAFLRRXIdIUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV8VfEr/kpfiP/r/l/nX2rXxV8Sv+Sl+I/wDr/l/nQBytFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH3/RRRQAUUUUAFFFFABRRRQB/9k=\"},{\"partUri\":\"/media/image5.JPEG\",\"contentType\":\"image/JPEG\",\"content\":\"data:image/JPEG;base64,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\"},{\"partUri\":\"/media/image6.JPEG\",\"contentType\":\"image/JPEG\",\"content\":\"data:image/JPEG;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCACvAOkDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACiiigAooooAYfvUlK3Wkrjm9WUhaKSipuAtFJRRcBaKSii4CjrT6jHWpK6KOwmFFFFbCCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAIz96ihutJXBN+8yxaKSiouAtFJmm70/vD86OYV0Popm9ezD86dRcLijrUlRDrUvauqg7piYUUUV0CCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAIXOHNN3VFNJtmYVH5vvXnTXvMnmsWd1G6q3m+9Hm+9RYOcg1xs6Df8A/XvJ/wCgmvN7i5htY/MnYoucZwT2z2+n9K9B1mTOh3wz/wAu8n/oJrz25tYbuPy503LnOM47Y/kSPxrysxfvR7Hh5tJuUS3bYF1Ccfxj+demhuBXmNvxcxH/AGx/OvRvN96vLU+R37muUuShK/cshuRU4qgsmXUZ71fr3cPsz2E7i0UUV0jCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAMi8fbdOPp/KofNpmoybb+UfT+Qqr5tcko+8zFvUu+bWfrkmfD+pD/AKdZf/QDT/NqlrMmdD1Af9O0v/oBqJQ91ku7TsecMwQZPA45qxZH/Trc/wDTRf51AQGGCM8jr61Na8XkJ/6aL/OvAjGXOro87klzK6PWfMFL5tUvNo82vfUD0VZbF+KTM0f+8K2xXM28mbmIf7Y/nXSiuikrI1gxaKKK2LCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAOV1d9uqTD/AHf/AEEVS8z3qTXH26xcD/d/9BFZ3m+9ZuOpyyepd80VxPi1t2uIf+nZP/QnrqfN965HxKS2sKf+ndP/AEJ61oR989TJpRWKXNsYkU0UxcRuGKMVbHY5x/Suz8INts7kf9NB/KuMjgjid3RMM5y3+fxP511fhd9ttOP9sfyravGPJse5nLpvC6WvfodX5nvR5nvVLzfejzfeuPlPjrmnayZvIf8Arov867AVwdlL/p1uM/8ALVf513oq4qxtSCiiiqNQooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDgvET7dduR/u/+giszzKs+KHx4iuh/uf+gLWR5vvVKNzim/eZe8yqumyxQeH7KWZ1jjW2jLMxwANoqvNdxW0TSzypHGvV3baBn3NM03VNLOiWcL6jbKfsyKwFwqkHaO4OQauKseJm7laPLf5G0pV1DIQysMgg8Gs7SZMaNYj/AKd4/wD0EU5NX0iCJY11KzCIoUZuFPA/Gs/SpR/ZFlz/AMu8ff8A2RRJXJyZ1Fz897abm15lHmVR833o833qeU9u5rWEmdStf+uqfzr0evK9Mlzqtpz/AMt0/wDQhXqnapasdFF3QtFFFI3CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPLvFsm3xPeD/c/wDQFrF833/WtHxlJt8V3o/3P/QFrC873/WumMdDzqj95liWTLW4/wCnmH/0YtdJcXUdqsbSZw8ixLgd2OBXGz3tvbyWzXE8USm5i5kcKOHU9/8APFdHLrOgTlDLqWmyGNg6Fp4ztYdCOetbQskeLmMJSmrLQd4gONIY/wDTeD/0atZnm+/60/XNa0u50ow2+pWk0rTQ7UjnVmP71OwNUPO9/wBaU0m9Doy6LjSfMrFzzff9aPN9/wBap+d7/rR53v8ArUcp6FzX0qTOr2XP/LxH/wChCvXx0rxXSJc61YjP/LxH/wChCvah0rGqrHVh3dMWiiisjpCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPG/HEm3xhfj/rn/wCi1rnvN962PHsm3xrqA/65/wDota5vzfevQpxvFHl1X77Mjxc+61th/tn+Vcln5gCPxro/FNxH5VujSIG3E4Lc4rmvOiP/AC0T/vqolCV9DSCujf8ACjbdZc5/5d2/9CSuz833rhfDMq/2s5Vwf3DZwf8AaWuu833q4RdjOpoy55vvR5vvVPzfejzfer5SLm1osmdd0/n/AJeY/wD0IV7sOlfP2hy58QaaM/8AL1F/6GK+gR0rkxCs0dmFd0xaKKK5zrCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPCPiG+3x1qQ/65/wDopa5fzff9a3viRJt8famP+uX/AKKSuV833r1qMfcR5FV++yeBt2pTnP8Ayxi/m9WVl3TPGUIK4OSRyD+v51mWt1Cl/ceZNGn7qMDcwHQv/iKui8sgSRcwZbriQV62HqUlTSbVzppyXKiPds1Sbn/ljF/6E9Teb7/rWfJcxSalK0UiOvkxglGzzl6k833rirJOo3HY56z95lzzff8AWjzff9ap+b70eb71lymVzd0CT/iotL5/5e4v/QxX0aK+Z/D0ufEulD/p8h/9DFfTA6VwYtWaO/CO6YtFFFch2BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAHzp8Tn2/EPVR/1y/wDRSVyPm+/610HxVuoY/iTq6PMisPJyCwH/ACxSuO+3W/8Az3j/AO+xXtUHH2auzx6sZObsj0fwec6TMf8Apuf/AEFa3wc9vzrkfB+r6bDo7rNqFrG5mJ2vMqnGF9T0roP7c0j/AKCtj/4EJ/jXxmMU/byte1z53FUqzqysmcX4ifb4ivR/tJ/6LWszzff9af4k1Gzk8RXjxXUDoSmGWQEH5FrL+3W//PeP/vsV9dgmvq8bvWx7dKE+SN10Ro+b7/rR5vv+tZ3263/57x/99ij7db/894/++xXVePcvkn2Ok8OSZ8UaR/1+w/8AoYr6lHSvkvwxewN4s0YCaMk30GBvH99a+tB0rzcbbmVjvwaaTuhaKKK4jtCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPkD42n/i72u/8Abv8A+k8def5PrXoHxt/5K9rv/bv/AOk8def0XAXcR3NG9v7x/OkooCwpJJ60mT60UUXAMn1oyfWiindgbng0/wDFceH/APsJW3/o1a+46+G/Bv8AyPHh/wD7CVv/AOjVr7kpAFFFFABRRRQAUUUUAFFFFABRRRQB/9k=\"}]}"},{"id":1942,"title":"GJam 2014 China Rd B: Party","description":"This Challenge is derived from \u003chttp://code.google.com/codejam/contest/2929486/dashboard#s=p1 GJam 2014 China Party\u003e. Small Case.\r\n\r\nThe Goal is determine the optimal Party House. Given a set of people to attend a party, select the home from this set that minimizes the total travel of people. People travel only NSEW, no diagonals, to reach the host's home. If multiple homes have equal distance then select the home with minimum X. If there are more than one with Min distance and equal Min X then choose the house with Min Y.\r\n\r\nThe input is an array that defines rectangles of partiers. One line of the array is [xmin,ymin,xmax,ymax]. Blocks do not overlap.\r\n\r\n\r\n*Input:* [M], Bx4 matrix (B\u003c=100). Total B area of \u003c=1000\r\n\r\n*Output:* [x,y,d] where [x,y] is Party House and d is everyone's total distance\r\n\r\n*Examples:*\r\n\r\n  M   [x y d]\r\n  [0 0 2 2] [1 1 12]\r\n  [-1 2 -1 2;0 0 0 0;1 3 1 3] [-1 2 6]\r\n\r\n \r\n*Contest Performance:* Best Delta Time of 16 minutes with 496 of 2010 able to process the small data set. The large data set was only achieved by 47 in the 3 hrs of contest duration.\r\n\r\n\r\n*Commentary:*\r\n\r\n  1) The small can be solved by brute force since fewer than 1000 points require evaluation.\r\n  2) The large case, which is giving me fits, has up to 1,000,000 points to evaluate.\r\n  3) Graphing the small case with surf gives some unexpected asymmetric results relative to the simple centroid.","description_html":"\u003cp\u003eThis Challenge is derived from \u003ca href = \"http://code.google.com/codejam/contest/2929486/dashboard#s=p1\"\u003eGJam 2014 China Party\u003c/a\u003e. Small Case.\u003c/p\u003e\u003cp\u003eThe Goal is determine the optimal Party House. Given a set of people to attend a party, select the home from this set that minimizes the total travel of people. People travel only NSEW, no diagonals, to reach the host's home. If multiple homes have equal distance then select the home with minimum X. If there are more than one with Min distance and equal Min X then choose the house with Min Y.\u003c/p\u003e\u003cp\u003eThe input is an array that defines rectangles of partiers. One line of the array is [xmin,ymin,xmax,ymax]. Blocks do not overlap.\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e [M], Bx4 matrix (B\u0026lt;=100). Total B area of \u0026lt;=1000\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e [x,y,d] where [x,y] is Party House and d is everyone's total distance\u003c/p\u003e\u003cp\u003e\u003cb\u003eExamples:\u003c/b\u003e\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003eM   [x y d]\r\n[0 0 2 2] [1 1 12]\r\n[-1 2 -1 2;0 0 0 0;1 3 1 3] [-1 2 6]\r\n\u003c/pre\u003e\u003cp\u003e\u003cb\u003eContest Performance:\u003c/b\u003e Best Delta Time of 16 minutes with 496 of 2010 able to process the small data set. The large data set was only achieved by 47 in the 3 hrs of contest duration.\u003c/p\u003e\u003cp\u003e\u003cb\u003eCommentary:\u003c/b\u003e\u003c/p\u003e\u003cpre class=\"language-matlab\"\u003e1) The small can be solved by brute force since fewer than 1000 points require evaluation.\r\n2) The large case, which is giving me fits, has up to 1,000,000 points to evaluate.\r\n3) Graphing the small case with surf gives some unexpected asymmetric results relative to the simple centroid.\r\n\u003c/pre\u003e","function_template":"function [x,y,d]=Party_CH(p)\r\n x=0;\r\n y=0;\r\n d=0;\r\nend","test_suite":"%%\r\ntic\r\nzm=[0 0 30 30 ];\r\nvexp=[15 15 14880];\r\n[x y d]=Party_CH(zm);\r\nv=[x y d];\r\nassert(isequal(v,vexp))\r\n%%\r\nzm=[0 0 29 29 ];\r\nvexp=[14 14 13500];\r\n[x y d]=Party_CH(zm);\r\nv=[x y d];\r\nassert(isequal(v,vexp))\r\n%%\r\nzm=[0 1 0 100 ;0 -100 0 -1 ;-100 0 -1 0 ;1 0 100 0 ];\r\nvexp=[-1 0 20400];\r\n[x y d]=Party_CH(zm);\r\nv=[x y d];\r\nassert(isequal(v,vexp))\r\n%%\r\nzm=[616 34 616 34 ;78 -828 78 -828 ;-762 -671 -762 -671 ;-199 -960 -199 -960 ;427 -575 427 -575 ;448 798 448 798 ;-819 -939 -819 -939 ;852 -564 852 -564 ;-145 281 -145 281 ;694 828 694 828 ;-278 963 -278 963 ;47 813 47 813 ;-393 24 -393 24 ;198 -257 198 -257 ;-393 -177 -393 -177 ;596 237 596 237 ;-678 760 -678 760 ;-180 92 -180 92 ;-590 995 -590 995 ;27 -946 27 -946 ;459 799 459 799 ;-491 -739 -491 -739 ;-691 -922 -691 -922 ;-38 185 -38 185 ;495 -471 495 -471 ;-850 532 -850 532 ;-360 798 -360 798 ;589 -104 589 -104 ;-492 -364 -492 -364 ;-797 415 -797 415 ;105 319 105 319 ;-879 -347 -879 -347 ;-795 172 -795 172 ;529 831 529 831 ;357 -199 357 -199 ;621 959 621 959 ;-475 125 -475 125 ;769 884 769 884 ;172 -706 172 -706 ;618 222 618 222 ;989 734 989 734 ;-273 478 -273 478 ;-548 930 -548 930 ;-634 889 -634 889 ;599 879 599 879 ;836 834 836 834 ;463 901 463 901 ;972 -903 972 -903 ;-319 495 -319 495 ;-727 -368 -727 -368 ;-685 -487 -685 -487 ;834 902 834 902 ;-114 -961 -114 -961 ;-984 193 -984 193 ;-388 867 -388 867 ;712 232 712 232 ;-750 19 -750 19 ;855 -455 855 -455 ;857 996 857 996 ;493 -722 493 -722 ;-582 426 -582 426 ;-824 848 -824 848 ;479 -993 479 -993 ;-976 -820 -976 -820 ;208 443 208 443 ;919 745 919 745 ;-460 -548 -460 -548 ;375 556 375 556 ;-572 980 -572 980 ;345 -411 345 -411 ;-275 613 -275 613 ;718 -895 718 -895 ;-838 -892 -838 -892 ;-241 836 -241 836 ;336 -878 336 -878 ;891 -355 891 -355 ;-986 989 -986 989 ;629 856 629 856 ;-779 787 -779 787 ;970 711 970 711 ;-578 -163 -578 -163 ;779 735 779 735 ;572 -203 572 -203 ;237 192 237 192 ;-427 -213 -427 -213 ;-338 9 -338 9 ;-905 45 -905 45 ;64 -35 64 -35 ;476 -560 476 -560 ;-370 24 -370 24 ;-836 487 -836 487 ;53 50 53 50 ;540 -897 540 -897 ;-179 -8 -179 -8 ;-979 227 -979 227 ;528 257 528 257 ;-876 615 -876 615 ;-342 -895 -342 -895 ;802 -744 802 -744 ;-458 -395 -458 -395 ];\r\nvexp=[-38 185 110298];\r\n[x y d]=Party_CH(zm);\r\nv=[x y d];\r\nassert(isequal(v,vexp))\r\n%%\r\nzm=[241 -635 241 -635 ;75 -432 75 -432 ;-522 -517 -522 -517 ;-589 -931 -589 -931 ;-903 447 -903 447 ;-555 757 -555 757 ;-584 19 -584 19 ;420 -458 420 -458 ;-127 517 -127 517 ;-417 158 -417 158 ;542 703 542 703 ;865 -531 865 -531 ;-592 -191 -591 -190 ;570 467 570 467 ;-326 -668 -325 -668 ;197 516 197 516 ;238 -442 239 -441 ;-339 -71 -338 -70 ;255 -450 256 -450 ;408 -232 409 -231 ;302 -765 303 -764 ;-575 687 -575 688 ;-352 -651 -351 -650 ;-483 -96 -483 -95 ;285 170 286 170 ;-349 -660 -348 -659 ;518 -419 518 -418 ;555 -506 556 -506 ;900 97 901 98 ;-969 -258 -969 -257 ;-514 -199 -513 -198 ;-422 -197 -422 -197 ;-852 -115 -852 -114 ;166 -651 166 -650 ;628 -930 629 -930 ;-53 853 -52 853 ;484 503 484 504 ;-912 -976 -911 -975 ;-386 -562 -386 -561 ;521 946 521 947 ;717 -799 718 -797 ;-463 -348 -461 -348 ;-14 167 -13 169 ;-346 -677 -344 -675 ;-675 176 -673 179 ;894 807 896 811 ];\r\nvexp=[-338 -71 136630];\r\n[x y d]=Party_CH(zm);\r\nv=[x y d];\r\nassert(isequal(v,vexp))\r\n%%\r\nzm=[468 377 468 377 ;839 -105 839 -105 ;-871 487 -871 487 ;-307 651 -307 651 ;135 -929 135 -929 ;-411 -829 -411 -829 ;745 -64 745 -64 ;336 784 336 784 ;-875 -84 -875 -84 ;-723 -736 -723 -736 ;701 -818 701 -818 ;-239 210 -239 210 ;-15 614 -15 614 ;362 225 362 225 ;894 443 894 443 ;-352 -303 -352 -303 ;-287 254 -287 255 ;-739 -960 -739 -960 ;110 28 110 28 ;540 434 541 435 ;-103 -962 -102 -962 ;913 -274 913 -273 ;835 -730 836 -730 ;544 866 545 867 ;-97 -358 -96 -358 ;-490 -319 -490 -319 ;-122 700 -122 702 ;37 902 39 902 ;103 266 104 266 ;-581 -714 -579 -710 ];\r\nvexp=[-97 -358 62565];\r\n[x y d]=Party_CH(zm);\r\nv=[x y d];\r\nassert(isequal(v,vexp))\r\n%%\r\nzm=[28 122 30 124 ;-85 -609 -83 -607 ;763 19 764 20 ;612 -204 613 -203 ;-521 792 -520 794 ;-782 193 -781 195 ;-662 149 -661 151 ;-561 -568 -559 -567 ;-190 -897 -189 -896 ;-725 -317 -723 -315 ;704 -957 706 -956 ;-329 -967 -328 -966 ;-564 -639 -563 -637 ;-603 -86 -601 -84 ;-165 548 -164 550 ;-197 -150 -195 -148 ;-379 -581 -377 -579 ;401 -684 403 -683 ;546 -194 548 -192 ;267 573 268 574 ;-634 288 -632 290 ;593 857 595 858 ;78 -240 80 -238 ;800 981 801 982 ;473 472 474 473 ;-894 469 -893 471 ;582 347 583 349 ;516 189 518 190 ;333 -865 335 -864 ;-192 507 -191 508 ;-310 534 -309 536 ;-783 -487 -781 -486 ;-915 -696 -914 -695 ;-57 872 -56 874 ;717 -423 718 -422 ;509 -810 510 -809 ;-186 -335 -184 -333 ;-403 629 -401 631 ;-598 104 -596 106 ;-149 -210 -147 -208 ;920 911 922 913 ;819 -934 821 -932 ;518 -328 520 -326 ;-630 429 -628 431 ;348 -766 350 -764 ;242 -300 244 -298 ;387 -191 389 -189 ;-19 -871 -17 -869 ;383 723 385 725 ;-742 -327 -740 -325 ;-181 -43 -179 -41 ;799 -46 801 -44 ;729 -373 731 -371 ;-863 -16 -861 -14 ;998 -444 1000 -442 ;242 962 244 964 ;-249 -412 -247 -410 ;116 -14 118 -12 ;871 -455 873 -453 ;669 492 671 494 ;877 -447 879 -445 ;990 -938 992 -936 ;43 522 45 524 ;-70 45 -68 47 ;808 8 810 10 ;-879 -310 -877 -308 ;979 79 981 81 ;-695 202 -693 204 ;-650 469 -648 471 ;690 -624 692 -622 ;-169 -43 -167 -41 ;-81 723 -78 726 ;-789 968 -787 970 ;-913 698 -912 701 ;-597 -970 -595 -968 ;693 -79 694 -77 ;41 847 43 849 ;39 -728 41 -725 ;422 470 425 473 ;-518 -883 -517 -880 ;-858 784 -855 786 ;-246 311 -245 312 ;194 -715 197 -712 ;-370 -868 -369 -865 ;377 174 380 176 ;-697 223 -694 225 ;-489 -957 -486 -955 ;-585 -164 -583 -162 ;-283 -880 -281 -878 ;-141 -729 -140 -728 ;835 447 838 450 ;-424 -612 -423 -610 ;-280 376 -276 377 ;-351 -393 -350 -392 ;-793 -436 -788 -434 ;-548 -180 -547 -175 ;826 775 831 778 ;-664 -604 -658 -602 ;987 -65 988 -57 ;-540 -796 -533 -795 ];\r\nvexp=[-167 -43 874364];\r\n[x y d]=Party_CH(zm);\r\nv=[x y d];\r\nassert(isequal(v,vexp))\r\n%%\r\nzm=[-291 955 -289 956 ;276 -710 278 -708 ;-724 283 -722 285 ;-850 588 -848 589 ;625 -511 627 -509 ;-530 -994 -529 -993 ;-312 -655 -311 -654 ;86 -269 87 -267 ;565 -521 566 -520 ;438 320 440 321 ;-330 985 -328 986 ;-408 -942 -407 -940 ;755 792 756 794 ;847 -794 848 -793 ;436 -1 438 0 ;206 -637 208 -635 ;516 544 518 546 ;77 -200 78 -199 ;-618 276 -616 277 ;380 868 382 870 ;-664 284 -663 286 ;-526 929 -524 931 ;743 -555 745 -553 ;331 145 333 146 ;98 124 99 126 ;220 -661 222 -660 ;-92 498 -90 500 ;646 -552 647 -550 ;-531 -850 -529 -849 ;573 -80 574 -79 ;-317 299 -315 300 ;-963 713 -962 714 ;411 818 412 819 ;-99 -503 -97 -501 ;279 599 280 601 ;793 -237 794 -235 ;-41 -876 -39 -875 ;-550 -478 -549 -477 ;-107 820 -105 822 ;657 886 659 888 ;-460 684 -458 686 ;-80 455 -78 457 ;-779 -528 -777 -526 ;-829 719 -827 721 ;-760 -716 -758 -714 ;39 342 41 344 ;254 447 256 449 ;-272 -705 -270 -703 ;-900 507 -898 509 ;498 327 500 329 ;-669 168 -667 170 ;519 -367 521 -365 ;-674 323 -672 325 ;-724 519 -722 521 ;52 -596 54 -594 ;897 -724 899 -722 ;6 -387 8 -385 ;62 808 64 810 ;-84 -749 -82 -747 ;-475 -379 -473 -377 ;-467 -819 -465 -817 ;-130 232 -128 234 ;218 862 220 864 ;-206 339 -204 341 ;821 658 823 660 ;261 61 263 63 ;-704 869 -702 871 ;788 -490 790 -488 ;482 67 484 69 ;-328 -781 -326 -779 ;150 -117 152 -115 ;946 -90 948 -88 ;-68 477 -65 479 ;-704 915 -701 918 ;979 -761 980 -759 ;328 705 331 708 ;969 951 971 953 ;-638 991 -637 993 ;-621 120 -619 121 ;-546 651 -545 654 ;217 550 218 551 ;-743 196 -740 199 ;-591 847 -588 849 ;-48 -769 -46 -766 ;678 424 680 425 ;-250 268 -248 270 ;964 -389 966 -386 ;193 -818 195 -815 ;-803 107 -801 109 ;16 -725 19 -722 ;-721 -274 -720 -273 ;14 666 17 668 ;-822 933 -820 936 ;-895 -416 -894 -412 ;821 -329 824 -326 ;382 68 387 68 ;590 282 595 284 ;97 -310 103 -307 ;147 933 150 933 ;-772 -42 -765 -33 ];\r\nvexp=[-128 232 914624];\r\n[x y d]=Party_CH(zm);\r\nv=[x y d];\r\nassert(isequal(v,vexp))\r\n%%\r\nzm=[-987 -105 -985 -103 ;-22 -655 -20 -653 ;-622 412 -621 414 ;-526 641 -524 642 ;-694 573 -692 575 ;268 -697 269 -695 ;366 544 368 545 ;648 218 649 220 ;314 443 316 445 ;-589 354 -588 355 ;60 544 62 546 ;21 -444 23 -442 ;175 -224 176 -223 ;-915 -696 -914 -695 ;-417 766 -415 767 ;-874 -599 -873 -598 ;606 921 607 922 ;-672 562 -671 564 ;-17 39 -16 40 ;-708 632 -707 633 ;823 -170 825 -168 ;996 -372 997 -371 ;961 -169 962 -167 ;572 577 573 579 ;53 345 55 347 ;569 453 570 454 ;716 753 718 754 ;-803 -873 -802 -872 ;-110 940 -108 942 ;-943 841 -941 842 ;186 997 187 999 ;-107 388 -105 390 ;193 -54 195 -52 ;-231 -916 -230 -914 ;-962 749 -960 750 ;794 -458 796 -457 ;259 -909 261 -908 ;-719 65 -718 67 ;242 -481 244 -479 ;-528 -223 -526 -221 ;283 955 285 957 ;-888 946 -886 948 ;847 -707 849 -705 ;757 -814 759 -812 ;-940 -941 -938 -939 ;2 -176 4 -174 ;665 -708 667 -706 ;656 170 658 172 ;494 949 496 951 ;994 802 996 804 ;-65 785 -63 787 ;147 684 149 686 ;-488 807 -486 809 ;-875 462 -873 464 ;-152 253 -150 255 ;114 247 116 249 ;760 -206 762 -204 ;-204 569 -202 571 ;89 -752 91 -750 ;-464 -975 -462 -973 ;-783 -545 -781 -543 ;75 -251 77 -249 ;471 -462 473 -460 ;-126 -169 -124 -167 ;-311 615 -309 617 ;-398 -727 -396 -725 ;834 -915 836 -913 ;-87 -21 -85 -19 ;-301 918 -299 920 ;-740 -366 -738 -364 ;24 47 26 49 ;-929 -761 -927 -759 ;-863 -36 -861 -33 ;541 604 543 606 ;-279 -423 -276 -422 ;-620 -116 -619 -114 ;-145 571 -143 573 ;-638 133 -636 136 ;-885 546 -882 549 ;-625 -11 -622 -8 ;-610 -369 -609 -367 ;80 -655 83 -652 ;-398 -183 -395 -182 ;-71 -953 -69 -951 ;-767 939 -766 942 ;-763 -362 -760 -360 ;46 -897 47 -895 ;23 -437 25 -436 ;550 -440 553 -439 ;-660 178 -658 182 ;851 -919 853 -917 ;124 437 125 438 ;-414 -524 -411 -520 ;881 797 884 799 ;-73 -303 -68 -301 ;-373 -585 -369 -584 ;-239 963 -237 968 ;453 965 456 968 ;-742 875 -738 877 ;-894 -954 -884 -944 ];\r\nvexp=[-126 -168 1055075];\r\n[x y d]=Party_CH(zm);\r\nv=[x y d];\r\nassert(isequal(v,vexp))\r\n%%\r\nzm=[-648 -872 -646 -871 ;739 270 741 272 ;-847 -333 -845 -331 ;-510 -174 -508 -173 ;182 -353 183 -352 ;-573 277 -571 278 ;297 245 299 247 ;-223 818 -221 819 ;886 57 887 58 ;888 -773 889 -772 ;-593 513 -591 514 ;-587 -107 -585 -106 ;-564 40 -563 41 ;234 -624 236 -622 ;-82 902 -81 903 ;222 851 223 852 ;-726 476 -724 478 ;-392 -160 -390 -158 ;-153 -484 -152 -483 ;-522 -962 -520 -960 ;66 -926 68 -925 ;-535 28 -534 29 ;-603 -292 -602 -291 ;-981 -471 -980 -469 ;-367 865 -365 867 ;-445 -75 -443 -73 ;300 -40 301 -38 ;-329 -287 -328 -286 ;554 935 556 936 ;593 -932 594 -930 ;206 873 208 875 ;335 574 336 575 ;296 154 298 155 ;323 -423 325 -422 ;-144 472 -143 474 ;-284 211 -282 213 ;-289 -996 -287 -994 ;167 574 168 575 ;65 803 67 805 ;264 173 266 175 ;-820 -637 -818 -635 ;-897 813 -895 815 ;60 -524 62 -522 ;652 850 654 852 ;-837 57 -835 59 ;31 -96 33 -94 ;-607 540 -605 542 ;-240 794 -238 796 ;386 453 388 455 ;-421 -468 -419 -466 ;-838 -196 -836 -194 ;248 -366 250 -364 ;7 -933 9 -931 ;578 742 580 744 ;-634 -828 -632 -826 ;678 16 680 18 ;706 -163 708 -161 ;228 771 230 773 ;-440 -564 -438 -562 ;228 -606 230 -604 ;-361 652 -359 654 ;-608 -741 -606 -739 ;-926 42 -924 44 ;984 147 986 149 ;-132 -334 -130 -332 ;492 870 494 872 ;-470 523 -468 525 ;440 983 442 985 ;-68 -14 -66 -12 ;652 970 654 972 ;-591 -410 -589 -408 ;-252 -573 -250 -571 ;-639 -424 -637 -421 ;-306 -234 -303 -231 ;-720 81 -718 83 ;-645 845 -642 846 ;-938 507 -936 508 ;646 122 648 125 ;-76 864 -73 867 ;777 -142 778 -141 ;267 -756 269 -755 ;-151 -11 -150 -10 ;-568 -929 -567 -926 ;753 -830 756 -828 ;-205 -663 -202 -661 ;329 368 330 369 ;-402 -682 -399 -679 ;-649 463 -647 465 ;995 538 999 539 ;107 817 111 818 ;-546 -441 -544 -437 ;-856 920 -854 921 ;-587 -483 -584 -479 ;717 -641 719 -639 ;-892 -134 -890 -132 ;-300 -887 -296 -883 ;605 -228 607 -224 ;-93 -994 -90 -994 ;-421 -56 -414 -50 ;76 -592 80 -583 ];\r\nvexp=[-303 -231 855861];\r\n[x y d]=Party_CH(zm);\r\nv=[x y d];\r\nassert(isequal(v,vexp))\r\ntoc\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":5,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2013-10-18T01:44:26.000Z","updated_at":"2013-10-18T02:33:24.000Z","published_at":"2013-10-18T02:33:24.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis Challenge is derived from\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://code.google.com/codejam/contest/2929486/dashboard#s=p1\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eGJam 2014 China Party\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e. Small Case.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe Goal is determine the optimal Party House. Given a set of people to attend a party, select the home from this set that minimizes the total travel of people. People travel only NSEW, no diagonals, to reach the host's home. If multiple homes have equal distance then select the home with minimum X. If there are more than one with Min distance and equal Min X then choose the house with Min Y.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe input is an array that defines rectangles of partiers. One line of the array is [xmin,ymin,xmax,ymax]. Blocks do not overlap.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e [M], Bx4 matrix (B\u0026lt;=100). Total B area of \u0026lt;=1000\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 [x,y,d] where [x,y] is Party House and d is everyone's total distance\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\u003eExamples:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[M   [x y d]\\n[0 0 2 2] [1 1 12]\\n[-1 2 -1 2;0 0 0 0;1 3 1 3] [-1 2 6]]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eContest Performance:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Best Delta Time of 16 minutes with 496 of 2010 able to process the small data set. The large data set was only achieved by 47 in the 3 hrs of contest duration.\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\u003eCommentary:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[1) The small can be solved by brute force since fewer than 1000 points require evaluation.\\n2) The large case, which is giving me fits, has up to 1,000,000 points to evaluate.\\n3) Graphing the small case with surf gives some unexpected asymmetric results relative to the simple centroid.]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":1983,"title":"Big data","description":"Optimize this line of code:\r\n\r\n B = sum(gradient(corrcoef(A)).^2);\r\n \r\nfor a matrix A with size(A,2)\u003e\u003esize(A,1)\r\n\r\n*Description:*\r\n\r\nAnalyses of large datasets often require some level of optimization for speed and/or memory usage. This is an example problem where both the initial data A and final measure of interest B fit perfectly well in memory, but the intermediate variables (in this case an impossibly large correlation matrix) required to compute the final measure of interest do not. \r\n\r\nWe have a large 2-dimensional matrix A (with dimensions 100 x 100,000).\r\n\r\nWe need to compute the following row vector B (with dimensions 1 x 100,000):\r\n\r\n B = sum(gradient(corrcoef(A)).^2);\r\n \r\nThis computes first the matrix of correlation coefficients for each pair of columns in A:\r\n\r\n a = corrcoef(A)\r\n\r\n(a 100,000 by 100,000 matrix), then computes the spatial derivative of the resulting correlation matrix along the second dimension:\r\n\r\n b = gradient(a)\r\n\r\n(another 100,000 by 100,000 matrix), and finally computes the squared norm of each column in the resulting matrix:\r\n\r\n B = sum(b.^2,1) \r\n\r\n(a 100,000 element vector)\r\n\r\nThis straight-forward \"vectorized\" approach, nevertheless, fails because it requires too much memory (enough to store a 100,000 x 100,000 correlation matrix, around 80Gb). \r\n\r\nWe clearly need some form of simplification/optimization. Can you compute the measure B within the time-limit of a Cody solution? (typically about 30 seconds)\r\n\r\nSolutions will be scored based on computation time (score equal to total time in seconds). \r\n\r\n*Context:* (not relevant to solving this problem)\r\n\r\nThis problem arises in the analyses of fMRI datasets. A typical result from a fMRI scanner session is a 4-dimensional matrix A(x,y,z,t), where the first three dimensions are spatial dimensions (a scanner of the subject's head/brain) and the fourth dimension is temporal (sequential scans obtained during a typical fMRI session). Think of these as time-varying three-dimensional pictures of your brain activation. A lot of research in the past few years has focused on functional connectivity, a measure of the temporal correlation between the \"activation\" of any pair of brain areas. Several recent papers have investigated the possibility to obtain entirely data-driven parcellations of the brain (partitioning the brain into functionally-homogeneous areas) based on these spatial patterns of functional connectivity. The measure _B_ above represents one of the measures that have been suggested as a way to drive these data-driven parcellations (borders between two adjacent but functionally distinct brain areas are expected to show higher spatial gradients in functional connectivity profiles). For simplicity I have collapsed the three spatial dimensions into one for this problem, but the computational complexity of the original computation is approximately the same (a typical scanner session results in something of the order of several hundred thousands \"voxels\" -three dimensional \"pixels\"- within the brain, and a few hundred time-points; this makes computing the entire \"voxel-to-voxel\" correlation matrix, or measures derived from it, rather challenging).\r\n\r\n","description_html":"\u003cp\u003eOptimize this line of code:\u003c/p\u003e\u003cpre\u003e B = sum(gradient(corrcoef(A)).^2);\u003c/pre\u003e\u003cp\u003efor a matrix A with size(A,2)\u0026gt;\u0026gt;size(A,1)\u003c/p\u003e\u003cp\u003e\u003cb\u003eDescription:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eAnalyses of large datasets often require some level of optimization for speed and/or memory usage. This is an example problem where both the initial data A and final measure of interest B fit perfectly well in memory, but the intermediate variables (in this case an impossibly large correlation matrix) required to compute the final measure of interest do not.\u003c/p\u003e\u003cp\u003eWe have a large 2-dimensional matrix A (with dimensions 100 x 100,000).\u003c/p\u003e\u003cp\u003eWe need to compute the following row vector B (with dimensions 1 x 100,000):\u003c/p\u003e\u003cpre\u003e B = sum(gradient(corrcoef(A)).^2);\u003c/pre\u003e\u003cp\u003eThis computes first the matrix of correlation coefficients for each pair of columns in A:\u003c/p\u003e\u003cpre\u003e a = corrcoef(A)\u003c/pre\u003e\u003cp\u003e(a 100,000 by 100,000 matrix), then computes the spatial derivative of the resulting correlation matrix along the second dimension:\u003c/p\u003e\u003cpre\u003e b = gradient(a)\u003c/pre\u003e\u003cp\u003e(another 100,000 by 100,000 matrix), and finally computes the squared norm of each column in the resulting matrix:\u003c/p\u003e\u003cpre\u003e B = sum(b.^2,1) \u003c/pre\u003e\u003cp\u003e(a 100,000 element vector)\u003c/p\u003e\u003cp\u003eThis straight-forward \"vectorized\" approach, nevertheless, fails because it requires too much memory (enough to store a 100,000 x 100,000 correlation matrix, around 80Gb).\u003c/p\u003e\u003cp\u003eWe clearly need some form of simplification/optimization. Can you compute the measure B within the time-limit of a Cody solution? (typically about 30 seconds)\u003c/p\u003e\u003cp\u003eSolutions will be scored based on computation time (score equal to total time in seconds).\u003c/p\u003e\u003cp\u003e\u003cb\u003eContext:\u003c/b\u003e (not relevant to solving this problem)\u003c/p\u003e\u003cp\u003eThis problem arises in the analyses of fMRI datasets. A typical result from a fMRI scanner session is a 4-dimensional matrix A(x,y,z,t), where the first three dimensions are spatial dimensions (a scanner of the subject's head/brain) and the fourth dimension is temporal (sequential scans obtained during a typical fMRI session). Think of these as time-varying three-dimensional pictures of your brain activation. A lot of research in the past few years has focused on functional connectivity, a measure of the temporal correlation between the \"activation\" of any pair of brain areas. Several recent papers have investigated the possibility to obtain entirely data-driven parcellations of the brain (partitioning the brain into functionally-homogeneous areas) based on these spatial patterns of functional connectivity. The measure \u003ci\u003eB\u003c/i\u003e above represents one of the measures that have been suggested as a way to drive these data-driven parcellations (borders between two adjacent but functionally distinct brain areas are expected to show higher spatial gradients in functional connectivity profiles). For simplicity I have collapsed the three spatial dimensions into one for this problem, but the computational complexity of the original computation is approximately the same (a typical scanner session results in something of the order of several hundred thousands \"voxels\" -three dimensional \"pixels\"- within the brain, and a few hundred time-points; this makes computing the entire \"voxel-to-voxel\" correlation matrix, or measures derived from it, rather challenging).\u003c/p\u003e","function_template":"function B = bigdata(A)\r\nB=zeros(1,size(A,2));\r\nend","test_suite":"%%\r\nglobal score time_count;\r\nscore=60; time_count=[];\r\nassessFunctionAbsence({'global'},'FileName','bigdata.m');\r\n\r\n%%\r\n% test small matrices first\r\nA=randn(100,100);\r\nB=bigdata(A);\r\nB0=sum(gradient(corrcoef(A)).^2);\r\nassert(all(abs(B-B0)\u003c1e-4));\r\n\r\n%%\r\n% test small matrices first\r\nA=randn(100,1000);\r\nt0=clock;\r\nB=bigdata(A);\r\nt1=etime(clock,t0);\r\nB0=sum(gradient(corrcoef(A)).^2);\r\nassert(all(abs(B-B0)\u003c1e-4));\r\nfprintf('Test 1 (1000 columns). Ellapsed time %f\\n',t1);\r\n\r\n%%\r\n% test small matrices first\r\nglobal time_count;\r\nA=randn(100,2000);\r\nt0=clock;\r\nB=bigdata(A);\r\nt1=etime(clock,t0);\r\nB0=sum(gradient(corrcoef(A)).^2);\r\nassert(all(abs(B-B0)\u003c1e-4));\r\nfprintf('Test 2 (2000 columns). Ellapsed time %f\\n',t1);\r\ntime_count=t1;\r\n\r\n%%\r\n% test small matrices first\r\nglobal time_count;\r\nA=randn(100,3000);\r\nt0=clock;\r\nB=bigdata(A);\r\nt1=etime(clock,t0);\r\nB0=sum(gradient(corrcoef(A)).^2);\r\nassert(all(abs(B-B0)\u003c1e-4));\r\nfprintf('Test 3 (3000 columns). Ellapsed time %f\\n',t1);\r\ntime_count=[time_count t1];\r\n\r\n%%\r\n% test small matrices first\r\nglobal time_count;\r\nA=randn(100,4000);\r\nt0=clock;\r\nB=bigdata(A);\r\nt1=etime(clock,t0);\r\nB0=sum(gradient(corrcoef(A)).^2);\r\nassert(all(abs(B-B0)\u003c1e-4));\r\nfprintf('Test 4 (4000 columns). Ellapsed time %f\\n',t1);\r\ntime_count=[time_count t1];\r\n\r\n%%\r\n% test big matrix\r\nglobal score time_count;\r\nassert(sum(time_count)\u003c2,'small matrices take too long; skipping big matrix computation to avoid time-out');\r\n\r\nrandn('seed',0);\r\nA=randn(100,100000);\r\nt0=clock;\r\nB=bigdata(A);\r\nt1=etime(clock,t0);\r\n\r\nassert(all(abs(B([81473 90580 12699 91338 63236 9755 27850 54689 95751 96489 15762 97060 95717 48538 80029 14189 42177 91574 79221 95950 65575 3572 84913 93400 67874])-[446.969229611013 529.483918542325 492.884459351883 506.453343056463 557.687700571202 570.008636747334 546.678181864512 445.139644002495 459.617263841976 565.276303202775 481.70081228927 505.718997924023 515.061623552965 363.542792068668 482.02142593325 578.480557740742 553.42526785998 470.314702013725 604.606838616675 539.148055906616 450.528222494512 491.803528433601 547.232718164205 561.773622227699 520.453638191039])\u003c1e-4));\r\nfprintf('Test 5 (100000 columns). Ellapsed time %f\\n',t1);\r\ntime_count=[time_count t1];\r\nscore=min(60,round(sum(time_count)));\r\n\r\n%%\r\nglobal score;\r\nurlwrite('https://sites.google.com/a/alfnie.com/alfnie/software/SetSolutionScore.p?attredirects=0\u0026amp;d=1','SetSolutionScore.p');\r\nrehash path;\r\nSetSolutionScore(score);\r\n\r\n","published":true,"deleted":false,"likes_count":2,"comments_count":3,"created_by":43,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":4,"test_suite_updated_at":"2017-10-27T00:44:32.000Z","rescore_all_solutions":true,"group_id":1,"created_at":"2013-11-12T05:45:56.000Z","updated_at":"2017-10-27T00:44:32.000Z","published_at":"2013-11-13T03:31:33.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eOptimize this line of code:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ B = sum(gradient(corrcoef(A)).^2);]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003efor a matrix A with size(A,2)\u0026gt;\u0026gt;size(A,1)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eDescription:\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\u003eAnalyses of large datasets often require some level of optimization for speed and/or memory usage. This is an example problem where both the initial data A and final measure of interest B fit perfectly well in memory, but the intermediate variables (in this case an impossibly large correlation matrix) required to compute the final measure of interest do not.\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\u003eWe have a large 2-dimensional matrix A (with dimensions 100 x 100,000).\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\u003eWe need to compute the following row vector B (with dimensions 1 x 100,000):\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ B = sum(gradient(corrcoef(A)).^2);]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis computes first the matrix of correlation coefficients for each pair of columns in A:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ a = corrcoef(A)]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e(a 100,000 by 100,000 matrix), then computes the spatial derivative of the resulting correlation matrix along the second dimension:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ b = gradient(a)]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e(another 100,000 by 100,000 matrix), and finally computes the squared norm of each column in the resulting matrix:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"code\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e\u003c![CDATA[ B = sum(b.^2,1)]]\u003e\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e(a 100,000 element vector)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis straight-forward \\\"vectorized\\\" approach, nevertheless, fails because it requires too much memory (enough to store a 100,000 x 100,000 correlation matrix, around 80Gb).\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\u003eWe clearly need some form of simplification/optimization. Can you compute the measure B within the time-limit of a Cody solution? (typically about 30 seconds)\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\u003eSolutions will be scored based on computation time (score equal to total time in seconds).\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\u003eContext:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e (not relevant to solving this problem)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis problem arises in the analyses of fMRI datasets. A typical result from a fMRI scanner session is a 4-dimensional matrix A(x,y,z,t), where the first three dimensions are spatial dimensions (a scanner of the subject's head/brain) and the fourth dimension is temporal (sequential scans obtained during a typical fMRI session). Think of these as time-varying three-dimensional pictures of your brain activation. A lot of research in the past few years has focused on functional connectivity, a measure of the temporal correlation between the \\\"activation\\\" of any pair of brain areas. Several recent papers have investigated the possibility to obtain entirely data-driven parcellations of the brain (partitioning the brain into functionally-homogeneous areas) based on these spatial patterns of functional connectivity. The measure\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:i/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eB\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e above represents one of the measures that have been suggested as a way to drive these data-driven parcellations (borders between two adjacent but functionally distinct brain areas are expected to show higher spatial gradients in functional connectivity profiles). For simplicity I have collapsed the three spatial dimensions into one for this problem, but the computational complexity of the original computation is approximately the same (a typical scanner session results in something of the order of several hundred thousands \\\"voxels\\\" -three dimensional \\\"pixels\\\"- within the brain, and a few hundred time-points; this makes computing the entire \\\"voxel-to-voxel\\\" correlation matrix, or measures derived from it, rather challenging).\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":1254,"title":"PACMAT 06 - Optimized Ghosts, Equal Speed, Inf Lives; Interactive Download","description":"The Classic PACMAN game brought to Cody.\r\n\r\nPACMAT requires clearing all the Yellow Dots. Inf lives are available. Adjacent Ghosts will capture PACMAT.  Ghosts do not use the tunnel. On Ghost capture everyone gets reset. These trained ghosts take the minimum path 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_006c.m PACMAT_Interactive.m\u003e. (Right click, 'save link as'). The routine creates a PACMAT_solver.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/PACMAT_G004_video_14_764.mp4 14 Lives Interactive\u003e (MP4)  Best Score seen is 9 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 + 500 * Lives\r\n\r\n\r\n*Near Future:* Randomized Awesome 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. Inf lives are available. Adjacent Ghosts will capture PACMAT.  Ghosts do not use the tunnel. On Ghost capture everyone gets reset. These trained ghosts take the minimum path 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_006c.m\"\u003ePACMAT_Interactive.m\u003c/a\u003e. (Right click, 'save link as'). The routine creates a PACMAT_solver.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/PACMAT_G004_video_14_764.mp4\"\u003e14 Lives Interactive\u003c/a\u003e (MP4)  Best Score seen is 9 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 + 500 * Lives\u003c/p\u003e\u003cp\u003e\u003cb\u003eNear Future:\u003c/b\u003e Randomized Awesome Ghosts to make them non-deterministic\u003c/p\u003e","function_template":"function  [newdir]=PACMAT_solver(map)\r\n% 314 move solver if Ghosts do not move\r\n persistent ptr\r\n if isempty(ptr)\r\n  ptr=['bbbbbbbcccbbbbbcccdddddddddddddddddddddddddaaa'...\r\n      'bbbbbaaaaaaaaaaaaaaaaaaaaaaaaadddddcccccccbbbbddddaaabbbbbbbb'...\r\n      'cccbbbdddaaabbbaaaadddddbbbbbccccbbbbbbbbbbbbbbaaaaddddddddddd'...\r\n      'ccccbbbcccdddbbbaaabbbaaaccccccbbbbbaaccdddddccccccccccccccaabbbbbcccddccc'...\r\n      'dddaaaaaaddddddcccbbbcccdddcccdddaaadddaaaddbbbbbaaadddddddddddcccbbccc'];\r\n  ptr=(ptr-'a')+1;\r\n end\r\n  \r\n newdir=ptr(1);\r\n ptr(1)=[];\r\n\r\nend","test_suite":"%%\r\nfeval(@assignin,'caller','score',10000);\r\n%%\r\nmax_moves=4000; % Interactive approx 1000 moves\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  gmap=map; % Map used by ghosts to simplify PAC Capture\r\n  gmap(15,6)=Inf; %No tunnel ghosts\r\n  gmap(15,26)=Inf;\r\n  gmap(map==-1)=Inf; % walls to Inf\r\n  gmap(map\u003e2)=Inf; % Elim start points as viable moves, quicker box exit\r\n\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];% use deal?\r\n  [gstartx, gstarty]=find(map\u003e2);\r\n  \r\n  lives=0; % Lives\r\n  movepac=0;\r\n\r\nwhile any(mod(map(:),10)==1) \u0026\u0026 movepac\u003cmax_moves\r\n movepac=movepac+1;\r\n\r\n [curdir]=PACMAT_solver(map);\r\n [pmr, pmc]=find(map==2);\r\nif 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;\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\nend % curdir \u003e0\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 ~isempty(gmov) % PAC adjacent\r\n   lives=lives+1;\r\n   %if lives==0,break;end\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 no tunnel usage, Walls\r\n \r\n   gmap=map; gmap(15,1)=-1;gmap(15,28)=-1;\r\n       \r\n   ptctr=0;\r\n   gmap(gmap\u003e=0)=Inf;\r\n   \r\n% Ghost algor change   \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     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     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     else\r\n      gmov=[];\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    map(gidx+mapdelta(gmov))=map(gidx+mapdelta(gmov))+10*i;     \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\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 + 500*lives; % All dots must be removed\r\n\r\nfeval( @assignin,'caller','score',floor(min( 10000,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":3,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2013-02-08T04:11:21.000Z","updated_at":"2025-12-03T08:52:46.000Z","published_at":"2013-02-08T04:48:28.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. Inf lives are available. Adjacent Ghosts will capture PACMAT. Ghosts do not use the tunnel. On Ghost capture everyone gets reset. These trained ghosts take the minimum path 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_006c.m\\\"\u003e\u003cw:r\u003e\u003cw:t\u003ePACMAT_Interactive.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 PACMAT_solver.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/PACMAT_G004_video_14_764.mp4\\\"\u003e\u003cw:r\u003e\u003cw:t\u003e14 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 9 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 + 500 * 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 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":1255,"title":"PACMAT 07 - Optimized Ghosts, PAC 2X Ghost Speed, 4 Lives; Interactive 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, Four lives are available. Adjacent Ghosts will capture PACMAT.  Ghosts do not use the tunnel. On Ghost capture everyone gets reset. These trained ghosts take the minimum path 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_Interactive2X.m file that creates a solver script and video has been posted at \u003chttps://sites.google.com/site/razapor/matlab_cody/PACMAT_Interactive_007a.m PACMAT_Interactive2X.m\u003e. (Right click, 'save link as'). The routine creates a PACMAT_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/PACMAT_G004_2Xvideo_1_548.mp4 PAC2X 1 Life Interactive\u003e (MP4)\r\n\r\n\u003chttps://sites.google.com/site/razapor/matlab_cody/PACMAT_G004_2Xvideo_0_398.mp4 Alfonso 398\u003e (MP4)\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 and 4 Lives\r\n\r\n*Scoring:* Moves + 1000 * Lives\r\n\r\n\r\n*Near Future:* Tunneling Ghosts and then Randomized Awesome 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. PACMAT moves at 2X Ghost Speed, Four lives are available. Adjacent Ghosts will capture PACMAT.  Ghosts do not use the tunnel. On Ghost capture everyone gets reset. These trained ghosts take the minimum path 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_Interactive2X.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_007a.m\"\u003ePACMAT_Interactive2X.m\u003c/a\u003e. (Right click, 'save link as'). The routine creates a PACMAT_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/PACMAT_G004_2Xvideo_1_548.mp4\"\u003ePAC2X 1 Life Interactive\u003c/a\u003e (MP4)\u003c/p\u003e\u003cp\u003e\u003ca href=\"https://sites.google.com/site/razapor/matlab_cody/PACMAT_G004_2Xvideo_0_398.mp4\"\u003eAlfonso 398\u003c/a\u003e (MP4)\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 and 4 Lives\u003c/p\u003e\u003cp\u003e\u003cb\u003eScoring:\u003c/b\u003e Moves + 1000 * Lives\u003c/p\u003e\u003cp\u003e\u003cb\u003eNear Future:\u003c/b\u003e Tunneling Ghosts and then Randomized Awesome Ghosts to make them non-deterministic\u003c/p\u003e","function_template":"function ans = PACMAT_2Xsolver(map)\r\npersistent mv\r\nif isempty(mv)\r\nmv=[2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 4 4 4 4 4 4 4 4 1 1 1 1 ];\r\nend\r\nmv(1);\r\nmv(1)=[];\r\nend","test_suite":"%%\r\nfeval(@assignin,'caller','score',5000);\r\n%%\r\nmax_moves=4000; % Interactive approx 1000 moves\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  gmap=map; % Map used by ghosts to simplify PAC Capture\r\n  gmap(15,6)=Inf; %No tunnel ghosts\r\n  gmap(15,26)=Inf;\r\n  gmap(map==-1)=Inf; % walls to Inf\r\n  gmap(map\u003e2)=Inf; % Elim start points as viable moves, quicker box exit\r\n\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\u003c4 \u0026\u0026 any(mod(map(:),10)==1) \u0026\u0026 movepac\u003cmax_moves\r\n for pac2x=1:2 % PAC Speed Multiplier\r\n  if lives\u003e3 || ~any(mod(map(:),10)==1),break;end % Died or Completed\r\n movepac=movepac+1;\r\n [curdir]=PACMAT_2Xsolver(map);\r\n [pmr, pmc]=find(map==2);\r\nif 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  % 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;\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\nend % curdir \u003e0\r\nend % pac2x\r\nif lives\u003e3 || ~any(mod(map(:),10)==1),break;end % Completed\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 ~isempty(gmov) % PAC adjacent\r\n   lives=lives+1;\r\n   %if lives==0,break;end\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 no tunnel usage, Walls\r\n \r\n   gmap=map; gmap(15,1)=-1;gmap(15,28)=-1;\r\n       \r\n   ptctr=0;\r\n   gmap(gmap\u003e=0)=Inf;\r\n   \r\n% Ghost algor change   \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     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     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     else\r\n      gmov=[];\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    map(gidx+mapdelta(gmov))=map(gidx+mapdelta(gmov))+10*i;     \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 and lives\u003c4\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( 5000,score )) );\r\n","published":true,"deleted":false,"likes_count":2,"comments_count":1,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":3,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2013-02-09T03:33:37.000Z","updated_at":"2025-12-03T15:28:58.000Z","published_at":"2013-02-09T04:11:24.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, Four lives are available. Adjacent Ghosts will capture PACMAT. Ghosts do not use the tunnel. On Ghost capture everyone gets reset. These trained ghosts take the minimum path 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_Interactive2X.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_007a.m\\\"\u003e\u003cw:r\u003e\u003cw:t\u003ePACMAT_Interactive2X.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 PACMAT_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/PACMAT_G004_2Xvideo_1_548.mp4\\\"\u003e\u003cw:r\u003e\u003cw:t\u003ePAC2X 1 Life Interactive\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e (MP4)\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/PACMAT_G004_2Xvideo_0_398.mp4\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eAlfonso 398\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e (MP4)\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 and 4 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\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 Tunneling Ghosts and then Randomized Awesome 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,/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=\"}]}"},{"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,/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=\"}]}"},{"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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\"}]}"},{"id":737,"title":"Criss_Cross_000 : Unique elements in a Square array","description":"Criss Cross matrix puzzle - Easy: Square matrix, Unique elements\r\n\r\nArrange the \"words\" into a solid square such that all words are used.\r\n\r\nGiven an array of row words and an array of column words make the unique Square.\r\n\r\nThere is no flipping or rotating in this simplest case.\r\n\r\nexample:\r\n\r\nM_orig =[1 2 3; 4 5 6; 7 8 9]\r\n\r\n*Inputs:*\r\n\r\nvr = [1 2 3; 4 5 6; 7 8 9]\r\n\r\nscramled gives vr =[7 8 9; 1 2 3; 4 5 6]\r\n\r\nvc =[1 2 3; 4 5 6; 7 8 9]\r\n\r\nscrambled gives vc =[3 1 2;6 4 5; 9 7 8]\r\n\r\n*Output:*\r\n\r\nM_out=[1 2 3; 4 5 6; 7 8 9]\r\n\r\nMax size : 4096\r\n\r\n\r\nThis is the first in a series of Criss Cross puzzles.\r\n\r\nFollow up puzzles will have non-unique values, non-identified row or col, and there are quite a few other variations.","description_html":"\u003cp\u003eCriss Cross matrix puzzle - Easy: Square matrix, Unique elements\u003c/p\u003e\u003cp\u003eArrange the \"words\" into a solid square such that all words are used.\u003c/p\u003e\u003cp\u003eGiven an array of row words and an array of column words make the unique Square.\u003c/p\u003e\u003cp\u003eThere is no flipping or rotating in this simplest case.\u003c/p\u003e\u003cp\u003eexample:\u003c/p\u003e\u003cp\u003eM_orig =[1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003e\u003cb\u003eInputs:\u003c/b\u003e\u003c/p\u003e\u003cp\u003evr = [1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003escramled gives vr =[7 8 9; 1 2 3; 4 5 6]\u003c/p\u003e\u003cp\u003evc =[1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003escrambled gives vc =[3 1 2;6 4 5; 9 7 8]\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eM_out=[1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003eMax size : 4096\u003c/p\u003e\u003cp\u003eThis is the first in a series of Criss Cross puzzles.\u003c/p\u003e\u003cp\u003eFollow up puzzles will have non-unique values, non-identified row or col, and there are quite a few other variations.\u003c/p\u003e","function_template":"function M_out = Criss_Cross(vr,vc)\r\n\r\n M_out=vr*0;\r\n \r\nend","test_suite":"%%\r\nformat long\r\nformat compact\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed)\r\n\r\nn=4;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n)\r\n\r\nvr=M(1:n,:);\r\nvr=sortrows(vr);\r\n\r\nvc=M(:,1:n);\r\nvc=sortrows(vc')';\r\n\r\ntic\r\nM_out=Criss_Cross(vr,vc);\r\ntoc\r\nM_out\r\n\r\nassert(isequal(M,M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed)\r\n\r\nn=8;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n)\r\n\r\nvr=M(1:n,:);\r\nvr=sortrows(vr);\r\n\r\nvc=M(:,1:n);\r\nvc=sortrows(vc')';\r\n\r\ntic\r\nM_out=Criss_Cross(vr,vc);\r\ntoc\r\nM_out\r\n\r\nassert(isequal(M,M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed)\r\n\r\nn=128;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n);\r\n\r\nvr=M(1:n,:);\r\nvr=sortrows(vr);\r\n\r\nvc=M(:,1:n);\r\nvc=sortrows(vc')';\r\n\r\ntic\r\nM_out=Criss_Cross(vr,vc);\r\ntoc\r\n\r\nassert(isequal(M,M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed)\r\n\r\nn=1024;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n);\r\n\r\nvr=M(1:n,:);\r\nvr=sortrows(vr);\r\n\r\nvc=M(:,1:n);\r\nvc=sortrows(vc')';\r\n\r\ntic\r\nM_out=Criss_Cross(vr,vc);\r\ntoc\r\n\r\nassert(isequal(M,M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed)\r\n\r\nn=4096;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n);\r\n\r\nvr=M(1:n,:);\r\nvr=sortrows(vr);\r\n\r\nvc=M(:,1:n);\r\nvc=sortrows(vc')';\r\n\r\ntic\r\nM_out=Criss_Cross(vr,vc);\r\ntoc\r\n\r\nassert(isequal(M,M_out));","published":true,"deleted":false,"likes_count":1,"comments_count":0,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":8,"test_suite_updated_at":"2012-06-03T20:42:28.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2012-06-03T18:05:05.000Z","updated_at":"2012-06-04T02:25:58.000Z","published_at":"2012-06-03T19:37:49.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eCriss Cross matrix puzzle - Easy: Square matrix, Unique elements\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eArrange the \\\"words\\\" into a solid square such that all words are used.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eGiven an array of row words and an array of column words make the unique Square.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThere is no flipping or rotating in this simplest case.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eexample:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eM_orig =[1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInputs:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003evr = [1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003escramled gives vr =[7 8 9; 1 2 3; 4 5 6]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003evc =[1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003escrambled gives vc =[3 1 2;6 4 5; 9 7 8]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eOutput:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eM_out=[1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eMax size : 4096\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis is the first in a series of Criss Cross puzzles.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eFollow up puzzles will have non-unique values, non-identified row or col, and there are quite a few other variations.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":738,"title":"Criss_Cross_010 : Unique elements, Square array, Words in one array","description":"Criss Cross matrix puzzle - Square matrix, Unique elements, Single Word List\r\n\r\nArrange the \"words\" into a solid square such that all words are used.\r\n\r\nGiven an array of words make the original Square or Square Transpose.\r\n\r\nWords are left to Right or Top to Bottom. No fliplr or flipud.\r\n\r\n*Example:*\r\n\r\nM_orig = [1 2 3; 4 5 6; 7 8 9]\r\n\r\nvr = [1 2 3; 4 5 6; 7 8 9]\r\n\r\nvc = [1 2 3; 4 5 6; 7 8 9]\r\n\r\n*Inputs:*\r\n\r\nw = [1 2 3; 4 5 6; 7 8 9;1 4 7; 2 5 8; 3 6 9]\r\n\r\nsorted w gives\r\n\r\nw = [1 2 3; 1 4 7; 2 5 8; 3 6 9; 4 5 6; 7 8 9]\r\n\r\n\r\n*Output:*\r\n\r\nM_out = [1 2 3; 4 5 6; 7 8 9] or\r\n\r\nM_out=[1 4 7; 2 5 8; 3 6 9]\r\n\r\n\r\nMax size : 256\r\n\r\nThis is the second in the Criss Cross puzzles series.\r\n\r\nFollow up puzzles will have non-unique values and quite a few other variations.\r\n","description_html":"\u003cp\u003eCriss Cross matrix puzzle - Square matrix, Unique elements, Single Word List\u003c/p\u003e\u003cp\u003eArrange the \"words\" into a solid square such that all words are used.\u003c/p\u003e\u003cp\u003eGiven an array of words make the original Square or Square Transpose.\u003c/p\u003e\u003cp\u003eWords are left to Right or Top to Bottom. No fliplr or flipud.\u003c/p\u003e\u003cp\u003e\u003cb\u003eExample:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eM_orig = [1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003evr = [1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003evc = [1 2 3; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003e\u003cb\u003eInputs:\u003c/b\u003e\u003c/p\u003e\u003cp\u003ew = [1 2 3; 4 5 6; 7 8 9;1 4 7; 2 5 8; 3 6 9]\u003c/p\u003e\u003cp\u003esorted w gives\u003c/p\u003e\u003cp\u003ew = [1 2 3; 1 4 7; 2 5 8; 3 6 9; 4 5 6; 7 8 9]\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e\u003c/p\u003e\u003cp\u003eM_out = [1 2 3; 4 5 6; 7 8 9] or\u003c/p\u003e\u003cp\u003eM_out=[1 4 7; 2 5 8; 3 6 9]\u003c/p\u003e\u003cp\u003eMax size : 256\u003c/p\u003e\u003cp\u003eThis is the second in the Criss Cross puzzles series.\u003c/p\u003e\u003cp\u003eFollow up puzzles will have non-unique values and quite a few other variations.\u003c/p\u003e","function_template":"function M_out = Criss_Cross(w)\r\n\r\n M_out=zeros(size(w,2));\r\n \r\nend","test_suite":"%%\r\nformat long\r\nformat compact\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed);\r\n\r\nn=4;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n)\r\n\r\nvr=M(1:n,:);\r\nvc=M(:,1:n);\r\n\r\nw=[vr;vc'];\r\nw=sortrows(w);\r\n\r\nM_out=Criss_Cross(w)\r\n\r\nassert(isequal(M,M_out)||isequal(M',M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed);\r\n\r\nn=8;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n)\r\n\r\nvr=M(1:n,:);\r\nvc=M(:,1:n);\r\n\r\nw=[vr;vc'];\r\nw=sortrows(w);\r\n\r\nM_out=Criss_Cross(w)\r\n\r\nassert(isequal(M,M_out)||isequal(M',M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed);\r\n\r\nn=16;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n);\r\n\r\nvr=M(1:n,:);\r\nvc=M(:,1:n);\r\n\r\nw=[vr;vc'];\r\nw=sortrows(w);\r\n\r\ntic\r\nM_out=Criss_Cross(w);\r\ntoc\r\n\r\nassert(isequal(M,M_out)||isequal(M',M_out));\r\n%%\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed);\r\n\r\nn=16;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n);\r\n\r\nvr=M(1:n,:);\r\nvc=M(:,1:n);\r\n\r\nw=[vr;vc'];\r\nw=sortrows(w);\r\n\r\ntic\r\nM_out=Criss_Cross(w);\r\ntoc\r\n\r\nassert(isequal(M,M_out)||isequal(M',M_out));\r\n%%\r\nn=256;\r\n% Create a Unique element square array\r\nM=randperm(n*n);\r\nM=reshape(M,n,n);\r\n\r\nvr=M(1:n,:);\r\nvc=M(:,1:n);\r\n\r\nw=[vr;vc'];\r\nw=sortrows(w);\r\n\r\ntic\r\nM_out=Criss_Cross(w);\r\ntoc\r\n\r\nassert(isequal(M,M_out)||isequal(M',M_out));","published":true,"deleted":false,"likes_count":1,"comments_count":0,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":8,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2012-06-03T20:11:23.000Z","updated_at":"2012-06-04T02:27:22.000Z","published_at":"2012-06-03T21:38:39.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eCriss Cross matrix puzzle - Square matrix, Unique elements, Single Word List\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eArrange the \\\"words\\\" into a solid square such that all words are used.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eGiven an array of words make the original Square or Square Transpose.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eWords are left to Right or Top to Bottom. No fliplr or flipud.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eExample:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eM_orig = [1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003evr = [1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003evc = [1 2 3; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInputs:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003ew = [1 2 3; 4 5 6; 7 8 9;1 4 7; 2 5 8; 3 6 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003esorted w gives\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003ew = [1 2 3; 1 4 7; 2 5 8; 3 6 9; 4 5 6; 7 8 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eOutput:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eM_out = [1 2 3; 4 5 6; 7 8 9] or\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eM_out=[1 4 7; 2 5 8; 3 6 9]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eMax size : 256\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThis is the second in the Criss Cross puzzles series.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eFollow up puzzles will have non-unique values and quite a few other variations.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":740,"title":"Battleship_010 : (TM)  Classic Game - Methodical Bot (100 move max)","description":"The Classic Battleship(TM) game implemented between a computer bot and a player's bot.\r\n\r\n\u003chttp://en.wikipedia.org/wiki/Battleship_%28game%29 Battleship\u003e\r\n\r\nYou and your opponent have 9 ships of various sizes.\r\n\r\nThese Ships/Sizes/Qty are Carrier-5, Battleship-4, Submarine-3(qty 2), Cruiser-3(qty 2), Destroyer-2(qty-3).\r\n\r\nThe board is 10x10. (index 1-100)\r\nUnknown=0, Miss=1, Hit=2\r\n\r\n*The Play:*\r\n\r\nPlayer places his ships on the board. Ships may not overlap but may touch.\r\n\r\nShips array is [9,2] where 1 is the Carrier and 9 is a Destroyer. \r\n\r\n[start_idx, orientation; start_idx, orientation...]. An orientation of 0 is Down and a 1 is Right. \r\n\r\nShips[1 1;...] places the Carrier in cells [1 11 22 33 44]\r\n\r\nPlayer takes a shot on the board - idx 1:100.\r\n\r\nThe computer bot will take a shot if he has any ships remaining.\r\n\r\nThe player will see an updated board for his next shot if he has any ships remaining.\r\n\r\n*Pass: Win*\r\n\r\nBattleship_bot_010 randomly picks from Zero sectors. \r\n","description_html":"\u003cp\u003eThe Classic Battleship™ game implemented between a computer bot and a player's bot.\u003c/p\u003e\u003cp\u003e\u003ca href=\"http://en.wikipedia.org/wiki/Battleship_%28game%29\"\u003eBattleship\u003c/a\u003e\u003c/p\u003e\u003cp\u003eYou and your opponent have 9 ships of various sizes.\u003c/p\u003e\u003cp\u003eThese Ships/Sizes/Qty are Carrier-5, Battleship-4, Submarine-3(qty 2), Cruiser-3(qty 2), Destroyer-2(qty-3).\u003c/p\u003e\u003cp\u003eThe board is 10x10. (index 1-100)\r\nUnknown=0, Miss=1, Hit=2\u003c/p\u003e\u003cp\u003e\u003cb\u003eThe Play:\u003c/b\u003e\u003c/p\u003e\u003cp\u003ePlayer places his ships on the board. Ships may not overlap but may touch.\u003c/p\u003e\u003cp\u003eShips array is [9,2] where 1 is the Carrier and 9 is a Destroyer.\u003c/p\u003e\u003cp\u003e[start_idx, orientation; start_idx, orientation...]. An orientation of 0 is Down and a 1 is Right.\u003c/p\u003e\u003cp\u003eShips[1 1;...] places the Carrier in cells [1 11 22 33 44]\u003c/p\u003e\u003cp\u003ePlayer takes a shot on the board - idx 1:100.\u003c/p\u003e\u003cp\u003eThe computer bot will take a shot if he has any ships remaining.\u003c/p\u003e\u003cp\u003eThe player will see an updated board for his next shot if he has any ships remaining.\u003c/p\u003e\u003cp\u003e\u003cb\u003ePass: Win\u003c/b\u003e\u003c/p\u003e\u003cp\u003eBattleship_bot_010 randomly picks from Zero sectors.\u003c/p\u003e","function_template":"function [mv,ships] = Battleship(b)\r\n % b is 10x10; idx 1:100\r\n % output mv is idx 1 thru 100\r\n % b: 0-open ocean; 1-miss shot, 2-Hit\r\n % ships: Placement of player ships\r\n % ships are initialized on first turn sum(b(:))==0\r\n % Place 9 ships [idx1 0/1;idx2 0/1;...idx9 0/1]\r\n % Ship lengths : 5/4/3/3/3/3/2/2/2\r\n % Ship orientation : 0-Vert Down; 1-Horiz Right \r\n % ships=[1 1;2 1;...8 1;99 0] \r\n % Places 8 ships on Left edge, one down in bottom rt corner\r\n % ships may not overlap - Loss\r\n \r\n% Need ships each call or will Lose; Ships placed only on first move\r\n  ships=[1 1;2 1;3 1;4 1;5 1;6 1;7 1;8 1;99 0]; \r\n \r\n % randomly pick an open spot (same as Battleship_bot_000)\r\n mv=randi(100);\r\n \r\nend % Battleship\r\n","test_suite":"%%\r\n%Test Suite\r\n%Battleship_000\r\n% Carrier/Battleship/Sub/Cruiser/Destroyer\r\n% 5/4/3/3/2  Qty 1/1/2/2/3\r\n% b 0-Unknown 1-Miss 2-Hit\r\nseed=clock;\r\nseed=1000*seed(6);\r\nrng(seed);\r\ngame_over=false;\r\nwins=0; % player wins\r\nbp=zeros(10);\r\nbc=zeros(10);\r\nships_p=ones(10);\r\nships_c=ones(10);\r\nship_vec=[5 4 3 3 3 3 2 2 2]; % Length of ships\r\n\r\ntic\r\n% initialize Computer Ships\r\nfor ship=1:9\r\n placed=false;\r\n while~placed\r\n  idx=randi(100);\r\n  [r c]=ind2sub([10 10],idx);\r\n  dwn_rt=randi(2)-1; % 0-down, 1-right\r\n  try % may go beyond board size\r\n   if dwn_rt==0 % down\r\n    blocked=any(ships_c(r:r+ship_vec(ship)-1,c)==2);\r\n   else % right\r\n    blocked=any(ships_c(r,c:c+ship_vec(ship)-1)==2);\r\n   end\r\n  catch\r\n   blocked=true; % invalid placement\r\n  end\r\n  if ~blocked % No ship conflict\r\n   if dwn_rt==0 % down\r\n    ships_c(r:r+ship_vec(ship)-1,c)=2;\r\n   else % right\r\n    ships_c(r,c:c+ship_vec(ship)-1)=2;\r\n   end\r\n   placed=true;\r\n  end \r\n end % placed\r\nend % ship\r\n \r\n% Initialize Player's ships and first move\r\n  try % for invalid mvP values\r\n   [mvP,ships]=Battleship(bp); % \r\n   bp(mvP(1))=ships_c(mvP(1));\r\n   \r\n    for ship=1:9\r\n      [r c]=ind2sub([10 10],ships(ship,1));\r\n      dwn_rt=ships(ship,2); \r\n      try % may go beyond board size\r\n       if dwn_rt==0 % down\r\n        blocked=any(ships_p(r:r+ship_vec(ship)-1,c)==2);\r\n       else % right\r\n        blocked=any(ships_p(r,c:c+ship_vec(ship)-1)==2);\r\n       end\r\n      catch\r\n       blocked=true; % invalid placement\r\n      end\r\n      if ~blocked % No ship conflict\r\n       if dwn_rt==0 % down\r\n        ships_p(r:r+ship_vec(ship)-1,c)=2;\r\n       else % right\r\n        ships_p(r,c:c+ship_vec(ship)-1)=2;\r\n       end\r\n      end \r\n    end % ship\r\n   \r\n   if sum(ships_p(:))~=127 % Expect 127 board if all placed\r\n    fprintf('Invalid Ship placement - Game over\\n');\r\n    ships\r\n    ships_p\r\n    game_over=true;\r\n   end\r\n   \r\n  catch\r\n   fprintf('Invalid first respone - Game over\\n');\r\n   mvP\r\n   ships\r\n   game_over=true;\r\n  end\r\n\r\n% Main Game Loop\r\n\r\n while ~game_over \r\n  % Computer move\r\n  % Author: Richard Z\r\n  % Date: 2012/06/03\r\n  % Battleship_010 bot: Random of Zeros\r\n  \r\n   avail=find(bc==0);\r\n   mvC=avail(randi(length(avail))); \r\n  %End Battleship bot: Random of Zeros\r\n  \r\n  bc(mvC)=ships_p(mvC); % Hit=2, Miss=1\r\n\r\n  if length(find(bc==2))\u003e=27 % Computer Wins\r\n   break;\r\n  end\r\n  \r\n  % Player's Second move and thereafter\r\n  try % for invalid mvP values\r\n   [mvP,ships]=Battleship(bp); % \r\n   bp(mvP(1))=ships_c(mvP(1)); % Hit=2, Miss=1\r\n  catch\r\n   fprintf('Ignoring Illegal move %i \\n',mvP(1));\r\n  end\r\n  \r\n  if length(find(bp==2))\u003e=27 % All ships sunk\r\n   wins=1;\r\n   break;\r\n  end\r\n  \r\n end % While ~game_over\r\n\r\ntoc\r\n \r\n % Player must win to Pass\r\n assert(isequal(wins,1))\r\n%Pass=1;\r\n%assert(isequal(Pass,1));\r\n\r\n bc\r\n bp\r\n wins","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":4,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2012-06-04T04:28:43.000Z","updated_at":"2012-06-04T04:57:27.000Z","published_at":"2012-06-04T04:56:04.000Z","restored_at":null,"restored_by":null,"spam":false,"simulink":false,"admin_reviewed":false,"description_opc":"{\"relationships\":[{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/document\",\"targetMode\":\"\",\"relationshipId\":\"rId1\",\"target\":\"/matlab/document.xml\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/output\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/matlab/output.xml\"}],\"parts\":[{\"partUri\":\"/matlab/document.xml\",\"relationship\":[],\"contentType\":\"application/vnd.mathworks.matlab.code.document+xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?\u003e\\n\u003cw:document xmlns:w=\\\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\\\"\u003e\u003cw:body\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe Classic Battleship™ game implemented between a computer bot and a player's bot.\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=\\\"http://en.wikipedia.org/wiki/Battleship_%28game%29\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eBattleship\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eYou and your opponent have 9 ships of various sizes.\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\u003eThese Ships/Sizes/Qty are Carrier-5, Battleship-4, Submarine-3(qty 2), Cruiser-3(qty 2), Destroyer-2(qty-3).\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe board is 10x10. (index 1-100) Unknown=0, Miss=1, Hit=2\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eThe Play:\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\u003ePlayer places his ships on the board. Ships may not overlap but may touch.\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\u003eShips array is [9,2] where 1 is the Carrier and 9 is a Destroyer.\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\u003e[start_idx, orientation; start_idx, orientation...]. An orientation of 0 is Down and a 1 is Right.\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\u003eShips[1 1;...] places the Carrier in cells [1 11 22 33 44]\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\u003ePlayer takes a shot on the board - idx 1:100.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe computer bot will take a shot if he has any ships remaining.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe player will see an updated board for his next shot if he has any ships remaining.\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: Win\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\u003eBattleship_bot_010 randomly picks from Zero sectors.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003c/w:body\u003e\u003c/w:document\u003e\"},{\"partUri\":\"/matlab/output.xml\",\"contentType\":\"text/xml\",\"content\":\"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" standalone=\\\"no\\\" ?\u003e\u003cembeddedOutputs\u003e\u003cmetaData\u003e\u003cevaluationState\u003emanual\u003c/evaluationState\u003e\u003clayoutState\u003ecode\u003c/layoutState\u003e\u003coutputStatus\u003eready\u003c/outputStatus\u003e\u003c/metaData\u003e\u003coutputArray type=\\\"array\\\"/\u003e\u003cregionArray type=\\\"array\\\"/\u003e\u003c/embeddedOutputs\u003e\"}]}"},{"id":908,"title":"AVIRIS Inscribed Rectangle Bit Mask - Speed Test","description":"The AVIRIS data sometimes is provided uncropped. This creates edge regions with values of \"-50\". Shown is AVIRIS Moffett Field image Layer 1 (400nm) and a zoom of the top-right corner. The dark blue on the edges is non-imaged ground.\r\n\r\nTo expedite compression the unused mask can be created with an interior excluded rectangle of no Zeros and maximum pixels. The challenge is to quickly and accurately determine the maximum non-zero inscribed rectangle for this image and some other test cases.\r\n\r\n\u003c\u003chttps://sites.google.com/site/razapor/matlab_cody/AVIRIS_L001.jpg\u003e\u003e \r\n\r\n\r\n\u003c\u003chttps://sites.google.com/site/razapor/matlab_cody/AVIRIS_L001_TR.jpg\u003e\u003e\r\n\r\n\r\n*Input:* m ( 2-D array with zero and non-zero values )\r\n\r\n*Output:* [idxtlc rmnr rmnc]\r\n\r\n* idxtlc : array index of top left corner\r\n* rmnr : numer of rows of the non-zero rectangle mask\r\n* rmnc : number of columns of the non-zero rectangle mask\r\n\r\n*Score:* Time ( msec ) Based upon time to process the 1924x753 AVIRIS image.\r\n\r\n(If time-out occurs I suggest downloading the mat file using the test suite code and then optimize with profiler.)\r\n\r\n*Passing:* Minimum number of pixels in rectangle\r\n\r\n\r\n\r\n*Example:* \r\n\r\n* m=[ 1 1 0 1 1......idxtlc = 3  ( index of TLC row 3, col 1) \r\n* ........1 0 1 1 1......rmnr = 3 ( rectangle mask number rows )\r\n* ........1 1 1 1 1......rmnc = 5 ( rectangle mask number columns )\r\n* ........1 1 1 1 1......Maximum rectangle pixels of 15\r\n* ........1 1 1 1 1 ]\r\n \r\n \r\nFor the AVIRIS image the zero edge bit mask encoding can be reduced 89% using an inscribed rectangle.\r\n\r\nNote: Additional test cases may be invoked if hard coded solution achieves best score. ","description_html":"\u003cp\u003eThe AVIRIS data sometimes is provided uncropped. This creates edge regions with values of \"-50\". Shown is AVIRIS Moffett Field image Layer 1 (400nm) and a zoom of the top-right corner. The dark blue on the edges is non-imaged ground.\u003c/p\u003e\u003cp\u003eTo expedite compression the unused mask can be created with an interior excluded rectangle of no Zeros and maximum pixels. The challenge is to quickly and accurately determine the maximum non-zero inscribed rectangle for this image and some other test cases.\u003c/p\u003e\u003cimg src=\"https://sites.google.com/site/razapor/matlab_cody/AVIRIS_L001.jpg\"\u003e\u003cimg src=\"https://sites.google.com/site/razapor/matlab_cody/AVIRIS_L001_TR.jpg\"\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e m ( 2-D array with zero and non-zero values )\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e [idxtlc rmnr rmnc]\u003c/p\u003e\u003cul\u003e\u003cli\u003eidxtlc : array index of top left corner\u003c/li\u003e\u003cli\u003ermnr : numer of rows of the non-zero rectangle mask\u003c/li\u003e\u003cli\u003ermnc : number of columns of the non-zero rectangle mask\u003c/li\u003e\u003c/ul\u003e\u003cp\u003e\u003cb\u003eScore:\u003c/b\u003e Time ( msec ) Based upon time to process the 1924x753 AVIRIS image.\u003c/p\u003e\u003cp\u003e(If time-out occurs I suggest downloading the mat file using the test suite code and then optimize with profiler.)\u003c/p\u003e\u003cp\u003e\u003cb\u003ePassing:\u003c/b\u003e Minimum number of pixels in rectangle\u003c/p\u003e\u003cp\u003e\u003cb\u003eExample:\u003c/b\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003em=[ 1 1 0 1 1......idxtlc = 3  ( index of TLC row 3, col 1)\u003c/li\u003e\u003cli\u003e........1 0 1 1 1......rmnr = 3 ( rectangle mask number rows )\u003c/li\u003e\u003cli\u003e........1 1 1 1 1......rmnc = 5 ( rectangle mask number columns )\u003c/li\u003e\u003cli\u003e........1 1 1 1 1......Maximum rectangle pixels of 15\u003c/li\u003e\u003cli\u003e........1 1 1 1 1 ]\u003c/li\u003e\u003c/ul\u003e\u003cp\u003eFor the AVIRIS image the zero edge bit mask encoding can be reduced 89% using an inscribed rectangle.\u003c/p\u003e\u003cp\u003eNote: Additional test cases may be invoked if hard coded solution achieves best score.\u003c/p\u003e","function_template":"function [idxtlc rmnr rmnc]=rect_mask(m)\r\n  idxtlc=1; rmnr=0; rmnc=0;\r\nend","test_suite":"global dt\r\ndt=0;\r\nm=ones(5); m(7)=0;\r\nt0=clock;\r\n[idxtlc rmnr rmnc]=rect_mask(m);\r\ndt=etime(clock,t0)*1000; % ms\r\ndt\r\n\r\n[x y]=ind2sub(size(m),idxtlc);\r\npass=~any(any(m(x:x+rmnr-1,y:y+rmnc-1)==0));\r\n\r\nassert(rmnr*rmnc\u003e=15,sprintf('Expected 15 pixels, only have %i\\n',rmnr*rmnc))\r\nassert(isequal(pass,1),sprintf('Not all non-zero [%i,%i] [%i,%i]\\n',x,y,x+rmnr-1,y+rmnc-1))\r\n\r\nfprintf('Time to process %.0f msec\\n',dt);\r\nfprintf('idx=%i x=%i y=%i  rect_nr=%i  rect_nc=%i\\n',idxtlc,x,y,rmnr,rmnc)\r\n%%\r\nm=ones(5); m(7)=0; m(11)=0;\r\nt0=clock;\r\n[idxtlc rmnr rmnc]=rect_mask(m);\r\ndt=etime(clock,t0)*1000; % ms\r\ndt\r\n\r\n[x y]=ind2sub(size(m),idxtlc);\r\npass=~any(any(m(x:x+rmnr-1,y:y+rmnc-1)==0));\r\n\r\nassert(rmnr*rmnc\u003e=15,sprintf('Expected 15 pixels, only have %i\\n',rmnr*rmnc))\r\nassert(isequal(pass,1),sprintf('Not all non-zero [%i,%i] [%i,%i]\\n',x,y,x+rmnr-1,y+rmnc-1))\r\n\r\nfprintf('Time to process %.0f msec\\n',dt);\r\nfprintf('idx=%i x=%i y=%i  rect_nr=%i  rect_nc=%i\\n',idxtlc,x,y,rmnr,rmnc)\r\n%%\r\n m=zeros(6);m(15)=1;\r\nt0=clock;\r\n[idxtlc rmnr rmnc]=rect_mask(m);\r\ndt=etime(clock,t0)*1000; % ms\r\ndt\r\n\r\n[x y]=ind2sub(size(m),idxtlc);\r\npass=~any(any(m(x:x+rmnr-1,y:y+rmnc-1)==0));\r\n\r\nassert(rmnr*rmnc\u003e=1,sprintf('Expected 1 pixel, only have %i\\n',rmnr*rmnc))\r\nassert(isequal(pass,1),sprintf('Not all non-zero [%i,%i] [%i,%i]\\n',x,y,x+rmnr-1,y+rmnc-1))\r\n\r\nfprintf('Time to process %.0f msec\\n',dt);\r\nfprintf('idx=%i x=%i y=%i  rect_nr=%i  rect_nc=%i\\n',idxtlc,x,y,rmnr,rmnc)\r\n%%\r\nm=ones(8); m(2,:)=0;  m(7,:)=0;  m(4,2)=0;  m(5,7)=0;\r\nt0=clock;\r\n[idxtlc rmnr rmnc]=rect_mask(m);\r\ndt=etime(clock,t0)*1000; % ms\r\ndt\r\n\r\n[x y]=ind2sub(size(m),idxtlc);\r\npass=~any(any(m(x:x+rmnr-1,y:y+rmnc-1)==0));\r\n\r\nassert(rmnr*rmnc\u003e=16,sprintf('Expected 16 pixels, only have %i\\n',rmnr*rmnc))\r\nassert(isequal(pass,1),sprintf('Not all non-zero [%i,%i] [%i,%i]\\n',x,y,x+rmnr-1,y+rmnc-1))\r\n\r\nfprintf('Time to process %.0f msec\\n',dt);\r\nfprintf('idx=%i x=%i y=%i  rect_nr=%i  rect_nc=%i\\n',idxtlc,x,y,rmnr,rmnc)\r\n%%\r\n% Load aviris file Layer 1 ; 1.8MB mat file\r\nglobal dt\r\ntic % approx 2.5 sec to write and load\r\nurlwrite('http://tinyurl.com/matlab-avmofL001','aviris_moffett_L001.mat');\r\ntoc\r\nload('aviris_moffett_L001.mat');\r\ntoc\r\n\r\n% Array variable is L001\r\n%Files also posted are L010,L023,L157, and L158 with same tinyurl format\r\n% L010 and L023 have high contrast L157 and L158 are in atmospheric notch\r\n\r\n% Time Trial File 1924 x 753\r\nt0=clock;\r\n[idxtlc rmnr rmnc]=rect_mask(L001);\r\ndt=etime(clock,t0)*1000; % ms\r\n\r\n[x y]=ind2sub(size(L001),idxtlc);\r\npass=~any(any(L001(x:x+rmnr-1,y:y+rmnc-1)==0));\r\n\r\nassert(rmnr*rmnc\u003e=1282281,sprintf('Expected 1282281 pixels, only have %i\\n',rmnr*rmnc))\r\nassert(isequal(pass,1),sprintf('Not all non-zero [%i,%i] [%i,%i]\\n',x,y,x+rmnr-1,y+rmnc-1))\r\n\r\nfprintf('Time to process %.0f msec\\n',dt);\r\nfprintf('idx=%i x=%i y=%i  rect_nr=%i  rect_nc=%i\\n',idxtlc,x,y,rmnr,rmnc)\r\n\r\n%%\r\nglobal dt\r\n%Write file based on time in test 1\r\nnet_time=uint32(dt);\r\n% net_time in ms\r\n% Create graph data\r\nnet_time=min(4000,net_time); % Limit graph y-axis\r\nfh=fopen('rect_mask.m','wt');\r\nfeval(@assignin,'caller','score',net_time)\r\nfprintf(fh,'%s\\n',repmat('1;',[1,round(net_time/2)]));\r\nfclose(fh);","published":true,"deleted":false,"likes_count":0,"comments_count":1,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":4,"test_suite_updated_at":"2012-08-15T00:11:30.000Z","rescore_all_solutions":false,"group_id":1,"created_at":"2012-08-13T00:01:09.000Z","updated_at":"2012-08-15T00:22:27.000Z","published_at":"2012-08-13T05:16:56.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\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/media/image2.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 AVIRIS data sometimes is provided uncropped. This creates edge regions with values of \\\"-50\\\". Shown is AVIRIS Moffett Field image Layer 1 (400nm) and a zoom of the top-right corner. The dark blue on the edges is non-imaged ground.\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\u003eTo expedite compression the unused mask can be created with an interior excluded rectangle of no Zeros and maximum pixels. The challenge is to quickly and accurately determine the maximum non-zero inscribed rectangle for this image and some other test cases.\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: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=\\\"rId2\\\"/\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:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e m ( 2-D array with zero and non-zero values )\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 [idxtlc rmnr rmnc]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eidxtlc : array index of top left corner\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003ermnr : numer of rows of the non-zero rectangle mask\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003ermnc : number of columns of the non-zero rectangle mask\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\u003eScore:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Time ( msec ) Based upon time to process the 1924x753 AVIRIS image.\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\u003e(If time-out occurs I suggest downloading the mat file using the test suite code and then optimize with profiler.)\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\u003ePassing:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Minimum number of pixels in rectangle\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eExample:\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003em=[ 1 1 0 1 1......idxtlc = 3 ( index of TLC row 3, col 1)\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e........1 0 1 1 1......rmnr = 3 ( rectangle mask number rows )\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e........1 1 1 1 1......rmnc = 5 ( rectangle mask number columns )\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e........1 1 1 1 1......Maximum rectangle pixels of 15\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"ListParagraph\\\"/\u003e\u003cw:numPr\u003e\u003cw:numId w:val=\\\"1\\\"/\u003e\u003c/w:numPr\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003e........1 1 1 1 1 ]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eFor the AVIRIS image the zero edge bit mask encoding can be reduced 89% using an inscribed rectangle.\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\u003eNote: Additional test cases may be invoked if hard coded solution achieves best score.\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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\"},{\"partUri\":\"/media/image2.JPEG\",\"contentType\":\"image/JPEG\",\"content\":\"data:image/JPEG;base64,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\"}]}"},{"id":916,"title":"Rubik's Cube : Solve Ten Face Move - Speed Scoring","description":"A set of cubes will be scrambled with 10 Face moves.\r\nThe Challenge is to Solve all Cubes in 10 Moves or Less.\r\nScore will be by cumulative time of cubes 2 thru 11. The first cube may be used to load arrays but is still required to solve the cube.\r\nTen moves relates to worst case 18^10 configs - 3.6e12. In actuality there are only 2.4e11 cubes at 10 turns. Brute force might not work.\r\n\r\n\r\n\u003c\u003chttps://sites.google.com/site/razapor/matlab_cody/cube_small.gif\u003e\u003e\r\n\r\n\u003c\u003chttps://sites.google.com/site/razapor/matlab_cody/Cube_Map48_200.png\u003e\u003e\r\n\r\n\u003c\u003chttp://mathworks.com/matlabcentral/images/surf.gif\u003e\u003e\r\n\r\n\r\n.\r\n\r\n*Input:* Cube vector (1x48](see Figure) with values 0:5, eight of each\r\n\r\n*Output:* Rotation Vector of 10 or less values. Values range from 1:18\r\n\r\nValues 1:18 represent the standard cube moves:ufdlbru'f'd'l'b'r'u2f2d2l2b2r2\r\n\r\n*Example:* Move of FL[2 4]  requires L'F' solv_vec=[10 8] at a minimum to solve\r\n\r\nCube=[00303003 44410110 11022222 22253533 53344444 11155555] as integer array\r\n\r\nsolv_vec=[10 8]\r\n\r\nActual solutions will be 8 to 10 values.\r\n\r\n\r\nThe Cube sites claim a capability of solving 10 moves in only 40 hrs.\r\nNot sure if they have Matlab, which can achieve 10 moves in \u003c0.15 sec. Matlab with a 16GB/i5 can solve 12 moves in \u003c 1.8 seconds. Unfortunately, Cody appears to have a memory/processing speed issue which makes the 11 and 12 move Challenges impossible.\r\n\r\n\u003chttp://kociemba.org/cube.htm Cube Org\u003e  and \u003chttp://www.speedcubing.com/CubeSolver/CubeSolver.html Speed Cubing\u003e\r\n\r\nThe next Cube Challenge will be to solve a fully randomized cube in as few moves as possible. With this next challenge I'll post my 3D-Cube Viewer Tool used for algorithm development.\r\n ","description_html":"\u003cp\u003eA set of cubes will be scrambled with 10 Face moves.\r\nThe Challenge is to Solve all Cubes in 10 Moves or Less.\r\nScore will be by cumulative time of cubes 2 thru 11. The first cube may be used to load arrays but is still required to solve the cube.\r\nTen moves relates to worst case 18^10 configs - 3.6e12. In actuality there are only 2.4e11 cubes at 10 turns. Brute force might not work.\u003c/p\u003e\u003cimg src=\"https://sites.google.com/site/razapor/matlab_cody/cube_small.gif\"\u003e\u003cimg src=\"https://sites.google.com/site/razapor/matlab_cody/Cube_Map48_200.png\"\u003e\u003cimg src=\"http://mathworks.com/matlabcentral/images/surf.gif\"\u003e\u003cp\u003e.\u003c/p\u003e\u003cp\u003e\u003cb\u003eInput:\u003c/b\u003e Cube vector (1x48](see Figure) with values 0:5, eight of each\u003c/p\u003e\u003cp\u003e\u003cb\u003eOutput:\u003c/b\u003e Rotation Vector of 10 or less values. Values range from 1:18\u003c/p\u003e\u003cp\u003eValues 1:18 represent the standard cube moves:ufdlbru'f'd'l'b'r'u2f2d2l2b2r2\u003c/p\u003e\u003cp\u003e\u003cb\u003eExample:\u003c/b\u003e Move of FL[2 4]  requires L'F' solv_vec=[10 8] at a minimum to solve\u003c/p\u003e\u003cp\u003eCube=[00303003 44410110 11022222 22253533 53344444 11155555] as integer array\u003c/p\u003e\u003cp\u003esolv_vec=[10 8]\u003c/p\u003e\u003cp\u003eActual solutions will be 8 to 10 values.\u003c/p\u003e\u003cp\u003eThe Cube sites claim a capability of solving 10 moves in only 40 hrs.\r\nNot sure if they have Matlab, which can achieve 10 moves in \u0026lt;0.15 sec. Matlab with a 16GB/i5 can solve 12 moves in \u0026lt; 1.8 seconds. Unfortunately, Cody appears to have a memory/processing speed issue which makes the 11 and 12 move Challenges impossible.\u003c/p\u003e\u003cp\u003e\u003ca href=\"http://kociemba.org/cube.htm\"\u003eCube Org\u003c/a\u003e  and \u003ca href=\"http://www.speedcubing.com/CubeSolver/CubeSolver.html\"\u003eSpeed Cubing\u003c/a\u003e\u003c/p\u003e\u003cp\u003eThe next Cube Challenge will be to solve a fully randomized cube in as few moves as possible. With this next challenge I'll post my 3D-Cube Viewer Tool used for algorithm development.\u003c/p\u003e","function_template":"function solv_vec = Rubik_Solve_10(cube)\r\n  solv_vec=[1 2 3 4 5 6 7 8 9 10 11];\r\n\r\nvf=[ 17 2 3 20 5 22 7 8 11 13 16 10 15 9 12 14 41 18 19 44 21 46 23 24 25 26 27 28 29 30 31 32 33 34 6 36 4 38 39 1 40 42 43 37 45 35 47 48; \r\n  1 2 3 4 5 25 28 30 9 10 8 12 7 14 15 6 19 21 24 18 23 17 20 22 43 26 27 42 29 41 31 32 33 34 35 36 37 38 39 40 11 13 16 44 45 46 47 48 ;\r\n  1 2 38 4 36 6 7 33 9 10 11 12 13 14 15 16 17 18 3 20 5 22 23 8 27 29 32 26 31 25 28 30 48 34 35 45 37 43 39 40 41 42 19 44 21 46 47 24 ;\r\n  3 5 8 2 7 1 4 6 33 34 35 12 13 14 15 16 9 10 11 20 21 22 23 24 17 18 19 28 29 30 31 32 25 26 27 36 37 38 39 40 41 42 43 44 45 46 47 48 ;\r\n  14 12 9 4 5 6 7 8 46 10 11 47 13 48 15 16 17 18 19 20 21 22 23 24 25 26 1 28 2 30 31 3 35 37 40 34 39 33 36 38 41 42 43 44 45 32 29 27 ;\r\n  1 2 3 4 5 6 7 8 9 10 11 12 13 22 23 24 17 18 19 20 21 30 31 32 25 26 27 28 29 38 39 40 33 34 35 36 37 14 15 16 43 45 48 42 47 41 44 46 ;\r\n  40 2 3 37 5 35 7 8 14 12 9 15 10 16 13 11 1 18 19 4 21 6 23 24 25 26 27 28 29 30 31 32 33 34 46 36 44 38 39 41 17 42 43 20 45 22 47 48 ;\r\n  1 2 3 4 5 16 13 11 9 10 41 12 42 14 15 43 22 20 17 23 18 24 21 19 6 26 27 7 29 8 31 32 33 34 35 36 37 38 39 40 30 28 25 44 45 46 47 48 ;\r\n  1 2 19 4 21 6 7 24 9 10 11 12 13 14 15 16 17 18 43 20 45 22 23 48 30 28 25 31 26 32 29 27 8 34 35 5 37 3 39 40 41 42 38 44 36 46 47 33 ;\r\n  6 4 1 7 2 8 5 3 17 18 19 12 13 14 15 16 25 26 27 20 21 22 23 24 33 34 35 28 29 30 31 32 9 10 11 36 37 38 39 40 41 42 43 44 45 46 47 48 ;\r\n  27 29 32 4 5 6 7 8 3 10 11 2 13 1 15 16 17 18 19 20 21 22 23 24 25 26 48 28 47 30 31 46 38 36 33 39 34 40 37 35 41 42 43 44 45 9 12 14 ;\r\n  1 2 3 4 5 6 7 8 9 10 11 12 13 38 39 40 17 18 19 20 21 14 15 16 25 26 27 28 29 22 23 24 33 34 35 36 37 30 31 32 46 44 41 47 42 48 45 43 ;\r\n  41 2 3 44 5 46 7 8 16 15 14 13 12 11 10 9 40 18 19 37 21 35 23 24 25 26 27 28 29 30 31 32 33 34 22 36 20 38 39 17 1 42 43 4 45 6 47 48 ;\r\n  1 2 3 4 5 43 42 41 9 10 30 12 28 14 15 25 24 23 22 21 20 19 18 17 16 26 27 13 29 11 31 32 33 34 35 36 37 38 39 40 8 7 6 44 45 46 47 48 ;\r\n  1 2 43 4 45 6 7 48 9 10 11 12 13 14 15 16 17 18 38 20 36 22 23 33 32 31 30 29 28 27 26 25 24 34 35 21 37 19 39 40 41 42 3 44 5 46 47 8 ;\r\n  8 7 6 5 4 3 2 1 25 26 27 12 13 14 15 16 33 34 35 20 21 22 23 24 9 10 11 28 29 30 31 32 17 18 19 36 37 38 39 40 41 42 43 44 45 46 47 48 ;\r\n  48 47 46 4 5 6 7 8 32 10 11 29 13 27 15 16 17 18 19 20 21 22 23 24 25 26 14 28 12 30 31 9 40 39 38 37 36 35 34 33 41 42 43 44 45 3 2 1 ; \r\n  1 2 3 4 5 6 7 8 9 10 11 12 13 30 31 32 17 18 19 20 21 38 39 40 25 26 27 28 29 14 15 16 33 34 35 36 37 22 23 24 48 47 46 45 44 43 42 41 ];\r\n\r\n% Basic move is implemented using the rot table\r\n% cube=cube(vf(mov,:)); % mov is 1:18 represents  ufdlbru'f'd'l'b'r'u2f2d2l2b2r2\r\n% Note: only the 48 moving cube tiles are mapped\r\n% a solved cube displays as [000000001111111122222222333333334444444455555555]\r\n\r\nend","test_suite":"%%\r\n% Load max score of 50 seconds\r\nfeval(@assignin,'caller','score',50)\r\n%%\r\nglobal vf gPass\r\nPass=1;\r\n% Load rot map 18 moves : ufdlbru'f'd'l'b'r'u2f2d2l2b2r2\r\n vf=[ 17 2 3 20 5 22 7 8 11 13 16 10 15 9 12 14 41 18 19 44 21 46 23 24 25 26 27 28 29 30 31 32 33 34 6 36 4 38 39 1 40 42 43 37 45 35 47 48; \r\n  1 2 3 4 5 25 28 30 9 10 8 12 7 14 15 6 19 21 24 18 23 17 20 22 43 26 27 42 29 41 31 32 33 34 35 36 37 38 39 40 11 13 16 44 45 46 47 48 ;\r\n  1 2 38 4 36 6 7 33 9 10 11 12 13 14 15 16 17 18 3 20 5 22 23 8 27 29 32 26 31 25 28 30 48 34 35 45 37 43 39 40 41 42 19 44 21 46 47 24 ;\r\n  3 5 8 2 7 1 4 6 33 34 35 12 13 14 15 16 9 10 11 20 21 22 23 24 17 18 19 28 29 30 31 32 25 26 27 36 37 38 39 40 41 42 43 44 45 46 47 48 ;\r\n  14 12 9 4 5 6 7 8 46 10 11 47 13 48 15 16 17 18 19 20 21 22 23 24 25 26 1 28 2 30 31 3 35 37 40 34 39 33 36 38 41 42 43 44 45 32 29 27 ;\r\n  1 2 3 4 5 6 7 8 9 10 11 12 13 22 23 24 17 18 19 20 21 30 31 32 25 26 27 28 29 38 39 40 33 34 35 36 37 14 15 16 43 45 48 42 47 41 44 46 ;\r\n  40 2 3 37 5 35 7 8 14 12 9 15 10 16 13 11 1 18 19 4 21 6 23 24 25 26 27 28 29 30 31 32 33 34 46 36 44 38 39 41 17 42 43 20 45 22 47 48 ;\r\n  1 2 3 4 5 16 13 11 9 10 41 12 42 14 15 43 22 20 17 23 18 24 21 19 6 26 27 7 29 8 31 32 33 34 35 36 37 38 39 40 30 28 25 44 45 46 47 48 ;\r\n  1 2 19 4 21 6 7 24 9 10 11 12 13 14 15 16 17 18 43 20 45 22 23 48 30 28 25 31 26 32 29 27 8 34 35 5 37 3 39 40 41 42 38 44 36 46 47 33 ;\r\n  6 4 1 7 2 8 5 3 17 18 19 12 13 14 15 16 25 26 27 20 21 22 23 24 33 34 35 28 29 30 31 32 9 10 11 36 37 38 39 40 41 42 43 44 45 46 47 48 ;\r\n  27 29 32 4 5 6 7 8 3 10 11 2 13 1 15 16 17 18 19 20 21 22 23 24 25 26 48 28 47 30 31 46 38 36 33 39 34 40 37 35 41 42 43 44 45 9 12 14 ;\r\n  1 2 3 4 5 6 7 8 9 10 11 12 13 38 39 40 17 18 19 20 21 14 15 16 25 26 27 28 29 22 23 24 33 34 35 36 37 30 31 32 46 44 41 47 42 48 45 43 ;\r\n  41 2 3 44 5 46 7 8 16 15 14 13 12 11 10 9 40 18 19 37 21 35 23 24 25 26 27 28 29 30 31 32 33 34 22 36 20 38 39 17 1 42 43 4 45 6 47 48 ;\r\n  1 2 3 4 5 43 42 41 9 10 30 12 28 14 15 25 24 23 22 21 20 19 18 17 16 26 27 13 29 11 31 32 33 34 35 36 37 38 39 40 8 7 6 44 45 46 47 48 ;\r\n  1 2 43 4 45 6 7 48 9 10 11 12 13 14 15 16 17 18 38 20 36 22 23 33 32 31 30 29 28 27 26 25 24 34 35 21 37 19 39 40 41 42 3 44 5 46 47 8 ;\r\n  8 7 6 5 4 3 2 1 25 26 27 12 13 14 15 16 33 34 35 20 21 22 23 24 9 10 11 28 29 30 31 32 17 18 19 36 37 38 39 40 41 42 43 44 45 46 47 48 ;\r\n  48 47 46 4 5 6 7 8 32 10 11 29 13 27 15 16 17 18 19 20 21 22 23 24 25 26 14 28 12 30 31 9 40 39 38 37 36 35 34 33 41 42 43 44 45 3 2 1 ; \r\n  1 2 3 4 5 6 7 8 9 10 11 12 13 30 31 32 17 18 19 20 21 38 39 40 25 26 27 28 29 14 15 16 33 34 35 36 37 22 23 24 48 47 46 45 44 43 42 41 ];\r\n\r\nr=ones(1,48,'uint8'); \r\n r(1:8)=0; %5;     %Left % straight numeric mapping\r\n r(9:16)=1; %2;   %Up\r\n r(17:24)=2; %3;   %Front\r\n r(25:32)=3; %4;   %Down\r\n r(33:40)=4; %6;   %Back\r\n r(41:48)=5; %7; %Right\r\n \r\nmix=10;\r\nrmov=randi(18,[mix,1]);\r\n for i=1:length(rmov) \r\n  if i\u003e1 % Eliminate move undos\r\n  % f2 f2 or f f'  or f' f\r\n   if (rmov(i)\u003e12 \u0026\u0026 rmov(i-1)==rmov(i))||(rmov(i-1)\u003c7 \u0026\u0026 rmov(i)==rmov(i-1)+6)||...\r\n       (rmov(i-1)\u003e6  \u0026\u0026 rmov(i)==rmov(i-1)-6)    \r\n    rmov(i)=rmov(i)+1;   % 1:17 map to 2:18  18 map to 1\r\n    if rmov(i)==19,rmov(i)=1;end\r\n   end\r\n  end\r\n  r=r(vf(rmov(i),:));\r\n end\r\n\r\n\r\n%assert(isequal(your_fcn_name(x),y_correct))\r\n\r\nt0=clock;\r\nsolv_vec=Rubik_Solve_10(r)\r\ndt=etime(clock,t0)\r\n% Dubious Code Check\r\nif all(r(1:8)==r(1)) \u0026\u0026 all(r(9:16)==r(9))  \u0026\u0026 all(r(17:24)==r(17)) \u0026\u0026 ...\r\n     all(r(25:32)==r(25))  \u0026\u0026 all(r(33:40)==r(33)) \u0026\u0026 all(r(41:48)==r(41))\r\n Pass=0;\r\nend\r\n\r\nPass=Pass \u0026\u0026 length(solv_vec\u003c11);\r\n\r\nlength(solv_vec)\r\nrt=r;\r\nfor i=1:length(solv_vec)\r\n   rt=rt(vf(solv_vec(i),:));\r\n end\r\n if all(rt(1:8)==rt(1)) \u0026\u0026 all(rt(9:16)==rt(9))  \u0026\u0026 all(rt(17:24)==rt(17)) \u0026\u0026 ...\r\n     all(rt(25:32)==rt(25))  \u0026\u0026 all(rt(33:40)==rt(33)) \u0026\u0026 all(rt(41:48)==rt(41))\r\n   fprintf('Cube Solved\\n')\r\n  Pass=Pass; % No change to Pass status\r\n else\r\n  fprintf('Cube Solve Failure\\n')\r\n  Pass=0;\r\n end\r\n\r\nassert(isequal(Pass,1))\r\n\r\ngPass=Pass;\r\n\r\n%%\r\n\r\nglobal gPass vf\r\nPass1=gPass;\r\n\r\n\r\nr=ones(1,48,'uint8'); \r\n r(1:8)=0; %5;     %Left % straight numeric mapping\r\n r(9:16)=1; %2;   %Up\r\n r(17:24)=2; %3;   %Front\r\n r(25:32)=3; %4;   %Down\r\n r(33:40)=4; %6;   %Back\r\n r(41:48)=5; %7; %Right\r\nrbase=r;\r\n\r\nsum_dt=0;\r\nfor cases=1:10 \r\n r=rbase;\r\n mix=10;\r\n rmov=randi(18,[mix,1]);\r\n  for i=1:length(rmov) \r\n   if i\u003e1 % Eliminate move undos\r\n   % f2 f2 or f f'  or f' f\r\n    if (rmov(i)\u003e12 \u0026\u0026 rmov(i-1)==rmov(i))||(rmov(i-1)\u003c7 \u0026\u0026 rmov(i)==rmov(i- 1)+6)||...\r\n       (rmov(i-1)\u003e6  \u0026\u0026 rmov(i)==rmov(i-1)-6)    \r\n     rmov(i)=rmov(i)+1;   % 1:17 map to 2:18  18 map to 1\r\n     if rmov(i)==19,rmov(i)=1;end\r\n    end\r\n   end\r\n   r=r(vf(rmov(i),:));\r\n  end\r\n\r\n\r\nt0=clock;\r\nsolv_vec=Rubik_Solve_10(r)\r\ndt=etime(clock,t0)\r\nsum_dt=sum_dt+dt;\r\n\r\nPass1=Pass1 \u0026\u0026 length(solv_vec\u003c11);\r\n\r\nrt=r;\r\nfor i=1:length(solv_vec)\r\n   rt=rt(vf(solv_vec(i),:));\r\n end\r\n if all(rt(1:8)==rt(1)) \u0026\u0026 all(rt(9:16)==rt(9))  \u0026\u0026 all(rt(17:24)==rt(17)) \u0026\u0026 ...\r\n     all(rt(25:32)==rt(25))  \u0026\u0026 all(rt(33:40)==rt(33)) \u0026\u0026 all(rt(41:48)==rt(41))\r\n   fprintf('Cube Solved\\n')\r\n  Pass1=Pass1; % No change to Pass1 status\r\n else\r\n  fprintf('Cube Solve Failure\\n')\r\n  Pass1=0;\r\n end\r\n\r\nend\r\n\r\n\r\n\r\nassert(isequal(Pass1,1))\r\n\r\nif Pass1\r\n feval(@assignin,'caller','score',floor(sum_dt))\r\nend\r\n","published":true,"deleted":false,"likes_count":1,"comments_count":0,"created_by":3097,"edited_by":null,"edited_at":null,"deleted_by":null,"deleted_at":null,"solvers_count":2,"test_suite_updated_at":null,"rescore_all_solutions":false,"group_id":1,"created_at":"2012-08-19T03:27:10.000Z","updated_at":"2012-08-26T03:40:30.000Z","published_at":"2012-08-19T07:18:19.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.gif\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"targetMode\":\"\",\"relationshipId\":\"rId2\",\"target\":\"/media/image1.png\"},{\"relationshipType\":\"http://schemas.mathworks.com/matlab/code/2013/relationships/image\",\"targetMode\":\"\",\"relationshipId\":\"rId3\",\"target\":\"/media/image2.gif\"}],\"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\u003eA set of cubes will be scrambled with 10 Face moves. The Challenge is to Solve all Cubes in 10 Moves or Less. Score will be by cumulative time of cubes 2 thru 11. The first cube may be used to load arrays but is still required to solve the cube. Ten moves relates to worst case 18^10 configs - 3.6e12. In actuality there are only 2.4e11 cubes at 10 turns. Brute force might not work.\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: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=\\\"rId2\\\"/\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: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=\\\"rId3\\\"/\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\u003e.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eInput:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Cube vector (1x48](see Figure) with values 0:5, eight of each\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 Rotation Vector of 10 or less values. Values range from 1:18\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\u003eValues 1:18 represent the standard cube moves:ufdlbru'f'd'l'b'r'u2f2d2l2b2r2\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:rPr\u003e\u003cw:b/\u003e\u003c/w:rPr\u003e\u003cw:t\u003eExample:\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e Move of FL[2 4] requires L'F' solv_vec=[10 8] at a minimum to solve\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\u003eCube=[00303003 44410110 11022222 22253533 53344444 11155555] as integer array\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\u003esolv_vec=[10 8]\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eActual solutions will be 8 to 10 values.\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe Cube sites claim a capability of solving 10 moves in only 40 hrs. Not sure if they have Matlab, which can achieve 10 moves in \u0026lt;0.15 sec. Matlab with a 16GB/i5 can solve 12 moves in \u0026lt; 1.8 seconds. Unfortunately, Cody appears to have a memory/processing speed issue which makes the 11 and 12 move Challenges impossible.\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=\\\"http://kociemba.org/cube.htm\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eCube Org\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003cw:r\u003e\u003cw:t\u003e and\u003c/w:t\u003e\u003c/w:r\u003e\u003cw:r\u003e\u003cw:t\u003e \u003c/w:t\u003e\u003c/w:r\u003e\u003cw:hyperlink w:docLocation=\\\"http://www.speedcubing.com/CubeSolver/CubeSolver.html\\\"\u003e\u003cw:r\u003e\u003cw:t\u003eSpeed Cubing\u003c/w:t\u003e\u003c/w:r\u003e\u003c/w:hyperlink\u003e\u003c/w:p\u003e\u003cw:p\u003e\u003cw:pPr\u003e\u003cw:pStyle w:val=\\\"text\\\"/\u003e\u003c/w:pPr\u003e\u003cw:r\u003e\u003cw:t\u003eThe next Cube Challenge will be to solve a fully randomized cube in as few moves as possible. With this next challenge I'll post my 3D-Cube Viewer Tool used for algorithm development.\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.gif\",\"contentType\":\"image/gif\",\"content\":\"data:image/gif;base64,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\"},{\"partUri\":\"/media/image1.png\",\"contentType\":\"image/png\",\"content\":\"data:image/png;base64,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\"},{\"partUri\":\"/media/image2.gif\",\"contentType\":\"image/gif\",\"content\":\"data:image/gif;base64,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\"}]}"}],"term":"difficulty_rating_bin:unrated","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":"difficulty_rating_bin:unrated","current_player":null,"sort":"map(difficulty_value,0,0,999) asc"},"parser":"MathWorks::Search::Solr::QueryParser","directives":{"term":{"directives":{"difficulty_rating_bin":[["difficulty_rating_bin:unrated","","","unrated",""]]}}},"facets":{"#\u003cMathWorks::Search::Field:0x00007fbf317660e0\u003e":null,"#\u003cMathWorks::Search::Field:0x00007fbf31766040\u003e":["unrated"]},"filters":{"#\u003cMathWorks::Search::Field:0x00007fbf31765500\u003e":"\"cody:problem\""},"fields":{"#\u003cMathWorks::Search::Field:0x00007fbf31766360\u003e":1,"#\u003cMathWorks::Search::Field:0x00007fbf317662c0\u003e":50,"#\u003cMathWorks::Search::Field:0x00007fbf31766220\u003e":"map(difficulty_value,0,0,999) asc","#\u003cMathWorks::Search::Field:0x00007fbf31766180\u003e":"difficulty_rating_bin:unrated"},"user_query":{"#\u003cMathWorks::Search::Field:0x00007fbf31766180\u003e":"difficulty_rating_bin:unrated"},"queried_facets":{"#\u003cMathWorks::Search::Field:0x00007fbf31766040\u003e":["unrated"]}},"query_backend":{"connection":{"configuration":{"index_url":"http://index-op-v2/solr/","query_url":"http://search-op-v2/solr/","direct_access_index_urls":["http://index-op-v2/solr/"],"direct_access_query_urls":["http://search-op-v2/solr/"],"timeout":10,"vhost":"search","exchange":"search.topic","heartbeat":30,"pre_index_mode":false,"host":"rabbitmq-eks","port":5672,"username":"cody-search","password":"78X075ddcV44","virtual_host":"search","indexer":"amqp","http_logging":"true","core":"cody"},"query_connection":{"uri":"http://search-op-v2/solr/cody/","proxy":null,"connection":{"parallel_manager":null,"headers":{"User-Agent":"Faraday v1.0.1"},"params":{},"options":{"params_encoder":"Faraday::FlatParamsEncoder","proxy":null,"bind":null,"timeout":null,"open_timeout":null,"read_timeout":null,"write_timeout":null,"boundary":null,"oauth":null,"context":null,"on_data":null},"ssl":{"verify":true,"ca_file":null,"ca_path":null,"verify_mode":null,"cert_store":null,"client_cert":null,"client_key":null,"certificate":null,"private_key":null,"verify_depth":null,"version":null,"min_version":null,"max_version":null},"default_parallel_manager":null,"builder":{"adapter":{"name":"Faraday::Adapter::NetHttp","args":[],"block":null},"handlers":[{"name":"Faraday::Response::RaiseError","args":[],"block":null}],"app":{"app":{"ssl_cert_store":{"verify_callback":null,"error":null,"error_string":null,"chain":null,"time":null},"app":{},"connection_options":{},"config_block":null}}},"url_prefix":"http://search-op-v2/solr/cody/","manual_proxy":false,"proxy":null},"update_format":"RSolr::JSON::Generator","update_path":"update","options":{"url":"http://search-op-v2/solr/cody"}}},"query":{"params":{"per_page":50,"term":"difficulty_rating_bin:unrated","current_player":null,"sort":"map(difficulty_value,0,0,999) asc"},"parser":"MathWorks::Search::Solr::QueryParser","directives":{"term":{"directives":{"difficulty_rating_bin":[["difficulty_rating_bin:unrated","","","unrated",""]]}}},"facets":{"#\u003cMathWorks::Search::Field:0x00007fbf317660e0\u003e":null,"#\u003cMathWorks::Search::Field:0x00007fbf31766040\u003e":["unrated"]},"filters":{"#\u003cMathWorks::Search::Field:0x00007fbf31765500\u003e":"\"cody:problem\""},"fields":{"#\u003cMathWorks::Search::Field:0x00007fbf31766360\u003e":1,"#\u003cMathWorks::Search::Field:0x00007fbf317662c0\u003e":50,"#\u003cMathWorks::Search::Field:0x00007fbf31766220\u003e":"map(difficulty_value,0,0,999) asc","#\u003cMathWorks::Search::Field:0x00007fbf31766180\u003e":"difficulty_rating_bin:unrated"},"user_query":{"#\u003cMathWorks::Search::Field:0x00007fbf31766180\u003e":"difficulty_rating_bin:unrated"},"queried_facets":{"#\u003cMathWorks::Search::Field:0x00007fbf31766040\u003e":["unrated"]}},"options":{"fields":["id","difficulty_rating"]},"join":" "},"results":[{"id":58842,"difficulty_rating":"unrated"},{"id":42355,"difficulty_rating":"unrated"},{"id":527,"difficulty_rating":"unrated"},{"id":42774,"difficulty_rating":"unrated"},{"id":42765,"difficulty_rating":"unrated"},{"id":42341,"difficulty_rating":"unrated"},{"id":44784,"difficulty_rating":"unrated"},{"id":44832,"difficulty_rating":"unrated"},{"id":44545,"difficulty_rating":"unrated"},{"id":44655,"difficulty_rating":"unrated"},{"id":1022,"difficulty_rating":"unrated"},{"id":3074,"difficulty_rating":"unrated"},{"id":1440,"difficulty_rating":"unrated"},{"id":1173,"difficulty_rating":"unrated"},{"id":2122,"difficulty_rating":"unrated"},{"id":2103,"difficulty_rating":"unrated"},{"id":2226,"difficulty_rating":"unrated"},{"id":2242,"difficulty_rating":"unrated"},{"id":2291,"difficulty_rating":"unrated"},{"id":698,"difficulty_rating":"unrated"},{"id":811,"difficulty_rating":"unrated"},{"id":787,"difficulty_rating":"unrated"},{"id":988,"difficulty_rating":"unrated"},{"id":60761,"difficulty_rating":"unrated"},{"id":60768,"difficulty_rating":"unrated"},{"id":715,"difficulty_rating":"unrated"},{"id":726,"difficulty_rating":"unrated"},{"id":727,"difficulty_rating":"unrated"},{"id":60799,"difficulty_rating":"unrated"},{"id":2646,"difficulty_rating":"unrated"},{"id":2647,"difficulty_rating":"unrated"},{"id":2697,"difficulty_rating":"unrated"},{"id":2737,"difficulty_rating":"unrated"},{"id":1688,"difficulty_rating":"unrated"},{"id":1631,"difficulty_rating":"unrated"},{"id":2191,"difficulty_rating":"unrated"},{"id":2192,"difficulty_rating":"unrated"},{"id":1900,"difficulty_rating":"unrated"},{"id":1908,"difficulty_rating":"unrated"},{"id":1942,"difficulty_rating":"unrated"},{"id":1983,"difficulty_rating":"unrated"},{"id":1254,"difficulty_rating":"unrated"},{"id":1255,"difficulty_rating":"unrated"},{"id":1313,"difficulty_rating":"unrated"},{"id":1314,"difficulty_rating":"unrated"},{"id":737,"difficulty_rating":"unrated"},{"id":738,"difficulty_rating":"unrated"},{"id":740,"difficulty_rating":"unrated"},{"id":908,"difficulty_rating":"unrated"},{"id":916,"difficulty_rating":"unrated"}]}}