{"id":15929,"date":"2024-10-15T11:51:56","date_gmt":"2024-10-15T11:51:56","guid":{"rendered":"https:\/\/bestkora.com\/IosDeveloper\/?p=15929"},"modified":"2025-09-11T15:39:20","modified_gmt":"2025-09-11T15:39:20","slug":"ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai","status":"publish","type":"post","link":"https:\/\/bestkora.com\/IosDeveloper\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\/","title":{"rendered":"iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u044b 2048 \u0432 SwiftUI \u0441 ChatGPT. \u0427\u0430\u0441\u0442\u044c 3. \u0418\u0418 (AI) \u0434\u043b\u044f \u0438\u0433\u0440\u044b 2048."},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412 \u0434\u0432\u0443\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0441\u0442\u0430\u0445 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 <a href=\"https:\/\/bestkora.com\/IosDeveloper\/test\/\" title=\"\u043b\u043e\u0433\u0438\u043a\u0438 \u0438\u0433\u0440\u044b 2048\">\u043b\u043e\u0433\u0438\u043a\u0438 \u0438\u0433\u0440\u044b 2048<\/a> \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 <a href=\"https:\/\/bestkora.com\/IosDeveloper\/%d0%b0%d0%b7%d0%b0%d1%80%d1%82%d0%bd%d0%b0%d1%8f-%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b0-ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-%d0%b8%d0%b3%d1%80%d1%8b\/\" title=\"UI  \u0441 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0435\u0439\">UI  \u0441 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0435\u0439<\/a>. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0418\u0418 (\u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442 ) \u0434\u043b\u044f \u0438\u0433\u0440\u044b 2048 \u0432 \u0432\u0438\u0434\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 <strong>Expectimax<\/strong> \u0438 <strong>Monte Carlo<\/strong>. \u041a\u043e\u0434 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 <a href=\"https:\/\/github.com\/BestKora\/Game2048ChatGPT\/tree\/main\" title=\"\">Github<\/a>.<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\"><strong>\u0428\u0410\u0413 16.&nbsp; \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 AI \u0432 \u0438\u0433\u0440\u0443 2048<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0418\u0418 \u0432 \u0438\u0433\u0440\u0443 2048 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043b\u043e\u0433\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043b\u0443\u0447\u0448\u0438\u0439 \u0445\u043e\u0434 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435. \u0418\u0418 \u0431\u0443\u0434\u0435\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">\u0444\u0443\u043d\u043a\u0446\u0438\u044e bestMoveDirection()<\/mark><\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0440\u0430\u043d\u0435\u0435 \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u043b\u0438, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043a\u0430\u043a\u043e\u0439 \u0445\u043e\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c, \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u044f\u0441\u044c \u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u043c \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0438 \u0441\u0447\u0435\u0442\u0430. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0418\u0418 \u043c\u043e\u0436\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0433\u0440\u0430\u0442\u044c \u0432 \u0438\u0433\u0440\u0443 2048, \u0434\u0435\u043b\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0445\u043e\u0434\u044b.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0445\u043e\u0434\u0430 \u0418\u0418, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0435\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u043d\u043e\u0441\u0442\u044c\u044e, \u0438, \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0440\u0443\u0447\u043d\u044b\u043c&nbsp; \u0440\u0435\u0436\u0438\u043c\u043e\u043c \u0441\u043e <strong>swipe<\/strong> \u0436\u0435\u0441\u0442\u043e\u043c \u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u0418\u0418.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041d\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0439\u043c\u0435\u043c, \u043a\u0430\u043a\u0438\u0435 \u0432 SwiftUI \u0435\u0441\u0442\u044c \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u0440\u0430\u0432\u043d\u044b\u0435 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.29.12.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"189\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.29.12-1024x189.png\" alt=\"\" class=\"wp-image-15933\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.29.12-1024x189.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.29.12-300x55.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.29.12-768x142.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.29.12-500x92.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.29.12.png 1384w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.29.21.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"270\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.29.21-1024x270.png\" alt=\"\" class=\"wp-image-15934\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.29.21-1024x270.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.29.21-300x79.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.29.21-768x203.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.29.21-500x132.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.29.21.png 1348w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<!--more-->\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import SwiftUI\n\nstruct PeriodicTaskView: View {\n    @State private var counter = 0\n    \n    \/\/ Create a timer publisher that fires every second\n    let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()\n\n    var body: some View {\n        VStack {\n            Text(\"Counter: \\(counter)\")\n                .font(.largeTitle)\n                .padding()\n\n            \/\/ Example of something happening periodically\n            Text(\"This text will update every second.\")\n        }\n        .onReceive(timer) { _ in\n            \/\/ Increment the counter every time the timer fires\n            counter += 1\n            \n            \/\/ Place any other periodic code here\n            print(\"Timer fired. Counter is now \\(counter).\")\n        }\n    }\n}\n\n #Preview {\n            PeriodicTaskView()\n }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SwiftUI<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">PeriodicTaskView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> counter = <\/span><span style=\"color: #D19A66\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Create a timer publisher that fires every second<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> timer = Timer.<\/span><span style=\"color: #61AFEF\">publish<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">every<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">on<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">in<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">common<\/span><span style=\"color: #ABB2BF\">).<\/span><span style=\"color: #61AFEF\">autoconnect<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Counter: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">counter<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">largeTitle<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Example of something happening periodically<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;This text will update every second.&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">onReceive<\/span><span style=\"color: #ABB2BF\">(timer) { _ <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Increment the counter every time the timer fires<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            counter += <\/span><span style=\"color: #D19A66\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Place any other periodic code here<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #56B6C2\">print<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Timer fired. Counter is now <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">counter<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">.&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">#Preview<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">PeriodicTaskView<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\"> }<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.35.04.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"789\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.35.04-1024x789.png\" alt=\"\" class=\"wp-image-15935\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.35.04-1024x789.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.35.04-300x231.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.35.04-768x592.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.35.04-389x300.png 389w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.35.04.png 1378w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.38.25.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"312\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.38.25-1024x312.png\" alt=\"\" class=\"wp-image-15936\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.38.25-1024x312.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.38.25-300x91.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.38.25-768x234.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.38.25-500x152.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.38.25.png 1364w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>struct GameView: View {\n    @ObservedObject var viewModel: GameViewModel\n    @State private var isAIEnabled = false\n    \n    \/\/ Create a timer publisher that fires every second\n    let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()\n\n    var body: some View {\n        VStack {\n            Toggle(\"Enable AI\", isOn: $isAIEnabled)\n                .padding()\n\n            \/\/ Your game UI components go here...\n\n        }\n        .onReceive(timer) { _ in\n            if isAIEnabled {\n                let direction = viewModel.bestMoveDirection()\n                viewModel.move(direction)\n            }\n        }\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">GameView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@ObservedObject<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> viewModel: GameViewModel<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> isAIEnabled = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Create a timer publisher that fires every second<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> timer = Timer.<\/span><span style=\"color: #61AFEF\">publish<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">every<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">on<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">in<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">common<\/span><span style=\"color: #ABB2BF\">).<\/span><span style=\"color: #61AFEF\">autoconnect<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Toggle<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Enable AI&quot;<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">isOn<\/span><span style=\"color: #ABB2BF\">: $isAIEnabled)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Your game UI components go here...<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">onReceive<\/span><span style=\"color: #ABB2BF\">(timer) { _ <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> isAIEnabled {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> direction = viewModel.<\/span><span style=\"color: #61AFEF\">bestMoveDirection<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                viewModel.<\/span><span style=\"color: #56B6C2\">move<\/span><span style=\"color: #ABB2BF\">(direction)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.41.47.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"272\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.41.47-1024x272.png\" alt=\"\" class=\"wp-image-15937\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.41.47-1024x272.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.41.47-300x80.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.41.47-768x204.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.41.47-500x133.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.41.47.png 1386w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" style=\"font-size:17px;text-transform:none\"><strong>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 .onReceive (timer) \u0438 Timer.publish \u0432 GameView <\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.46.03.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"224\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.46.03-1024x224.png\" alt=\"\" class=\"wp-image-15938\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.46.03-1024x224.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.46.03-300x66.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.46.03-768x168.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.46.03-500x110.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.46.03.png 1396w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.46.13.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"326\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.46.13-1024x326.png\" alt=\"\" class=\"wp-image-15939\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.46.13-1024x326.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.46.13-300x95.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.46.13-768x244.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.46.13-500x159.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.46.13.png 1402w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.41.22.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"161\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.41.22-1024x161.png\" alt=\"\" class=\"wp-image-16133\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.41.22-1024x161.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.41.22-300x47.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.41.22-768x121.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.41.22-500x79.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.41.22.png 1308w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import SwiftUI\n\nstruct GameView: View {\n    @ObservedObject var viewModel = GameViewModel ()\n\n    let tileSize: CGFloat = 80\n    let padding: CGFloat = 8\n    \n    @State var isAIPlaying = false\n    @State private var isShowingOptimalDirection = false\n    \n    \/\/ Timer that triggers every 0.5 seconds\n    private let timer = \n               Timer.publish(every: 0.5, on: .main, in:.common).autoconnect()\n    \n    var body: some View {\n        VStack {\n            \/\/ Your game UI components here (e.g., grid view, score display)...\n\n            HStack {\n                Button(action: {\n                    isAIPlaying.toggle()\n                }) {\n                    HStack {\n                        Image(systemName: \n                                 isAIPlaying ? \"checkmark.square\" : \"square\")\n                            .resizable()\n                            .frame(width: 24, height: 24)\n                                                   \n                       Text( isAIPlaying ? \"AI Stop\" : \"AI Play\")\n                     }\n                }\n                .padding()\n                .background(.accentColor)\n            }\n            \n            if viewModel.isGameOver {\n                Text(viewModel.isGameOver  ? \"Game Over\": \" ___ \")\n                    .font(.title)\n                    .foregroundColor(viewModel.isGameOver  ? .red : .clear)\n            }\n        }\n        .padding()\n\n        \/\/ This triggers AI moves at intervals when AI is playing\n        .onReceive(timer) { _ in\n            if isAIPlaying {\n                viewModel.executeAIMove()\n            }\n        }\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SwiftUI<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">GameView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@ObservedObject<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> viewModel = <\/span><span style=\"color: #61AFEF\">GameViewModel<\/span><span style=\"color: #ABB2BF\"> ()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> tileSize: CGFloat = <\/span><span style=\"color: #D19A66\">80<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> padding: CGFloat = <\/span><span style=\"color: #D19A66\">8<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> isAIPlaying = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> isShowingOptimalDirection = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Timer that triggers every 0.5 seconds<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> timer = <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">               Timer.<\/span><span style=\"color: #61AFEF\">publish<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">every<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">0.5<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">on<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">in<\/span><span style=\"color: #ABB2BF\">:.<\/span><span style=\"color: #E06C75\">common<\/span><span style=\"color: #ABB2BF\">).<\/span><span style=\"color: #61AFEF\">autoconnect<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Your game UI components here (e.g., grid view, score display)...<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">HStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Button<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">action<\/span><span style=\"color: #ABB2BF\">: {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                    isAIPlaying.<\/span><span style=\"color: #61AFEF\">toggle<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">HStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">Image<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">systemName<\/span><span style=\"color: #ABB2BF\">: <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                                 isAIPlaying ? <\/span><span style=\"color: #98C379\">&quot;checkmark.square&quot;<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;square&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #61AFEF\">resizable<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">width<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">24<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">height<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">24<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                                                   <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                       <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">( isAIPlaying ? <\/span><span style=\"color: #98C379\">&quot;AI Stop&quot;<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;AI Play&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                     }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">background<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">accentColor<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> viewModel.isGameOver {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(viewModel.<\/span><span style=\"color: #E06C75\">isGameOver<\/span><span style=\"color: #ABB2BF\">  ? <\/span><span style=\"color: #98C379\">&quot;Game Over&quot;<\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot; ___ &quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">title<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(viewModel.<\/span><span style=\"color: #E06C75\">isGameOver<\/span><span style=\"color: #ABB2BF\">  ? .<\/span><span style=\"color: #E06C75\">red<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> .<\/span><span style=\"color: #E06C75\">clear<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ This triggers AI moves at intervals when AI is playing<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        .<\/span><span style=\"color: #61AFEF\">onReceive<\/span><span style=\"color: #ABB2BF\">(timer) { _ <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> isAIPlaying {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                viewModel.<\/span><span style=\"color: #61AFEF\">executeAIMove<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-16.25.20.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"716\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-16.25.20-1024x716.png\" alt=\"\" class=\"wp-image-15941\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-16.25.20-1024x716.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-16.25.20-300x210.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-16.25.20-768x537.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-16.25.20-429x300.png 429w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-16.25.20.png 1352w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-16.25.31.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"278\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-16.25.31-1024x278.png\" alt=\"\" class=\"wp-image-15942\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-16.25.31-1024x278.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-16.25.31-300x81.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-16.25.31-768x208.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-16.25.31-500x136.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-16.25.31.png 1400w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.42.14.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"135\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.42.14-1024x135.png\" alt=\"\" class=\"wp-image-16136\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.42.14-1024x135.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.42.14-300x39.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.42.14-768x101.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.42.14-500x66.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.42.14.png 1338w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>class GameViewModel: ObservableObject {\n    @Published var tiles: [&#91;Tile&#93;] = []\n    @Published var score: Int = 0\n        \n    private var aiGame = AIGame()\n    \n    init() {\n        resetGame()\n    }\n    \n    func resetGame() { . . .}\n        \/\/ Reset the game board, score, and other states    \n     \n     func executeAIMove() {\n        var  bestDirection : Direction \n        guard !isGameOver else { return }\n       \n        bestDirection = bestMoveDirection()\n        move(bestDirection)\n        }\n           \n    func bestMoveDirection() -> Direction {\n        var bestDirection: Direction = .right\n        var maxScore = 0\n        \n        for direction in Direction.allCases {\n            let result = \n                      aiGame.oneStepGame(direction: direction, matrix: tiles)\n            if result.moved &amp;&amp; result.score >= maxScore {\n                maxScore = result.score\n                bestDirection = direction\n            }\n        }\n        \n        return bestDirection\n    }\n    \n    func move(_ direction: Direction) {\n        \/\/ Logic to slide and merge tiles, add newTile if moved and gain the score\n        let (moved, score) = slide(direction)\n        \n        if moved {\n            self.score += score\n            addNewTile()\n        }\n        checkGameOver()\n    }\n\n    private func checkGameOver() {\n        if !canMove() {\n            isGameOver = true\n        }\n    }\n    \n    private func canMove() -> Bool {\n        return Direction.allCases.contains { direction in\n            aiGame.oneStepGame(direction: direction, matrix: tiles).moved\n        }\n    }\n    \n    private func addNewTile() {\n        \/\/ Logic to add a new tile at a random empty position\n    }\n    \n    func slide(_ direction: Direction) -> (moved: Bool, score: Int) {\n        \/\/ Logic to slide and merge tiles, returning whether any tiles moved and the score gained\n        var moved = false\n        var totalScore = 0\n        \n        \/\/ Rotate board, compress, merge, and update rows...\n        \n        return (moved, totalScore)\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">class<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">GameViewModel<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">ObservableObject <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> tiles: [&#91;Tile&#93;] = []<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> score: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> aiGame = <\/span><span style=\"color: #61AFEF\">AIGame<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">init<\/span><span style=\"color: #ABB2BF\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">resetGame<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">resetGame<\/span><span style=\"color: #ABB2BF\">() { . . .}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Reset the game board, score, and other states    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">     <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">     <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">executeAIMove<\/span><span style=\"color: #ABB2BF\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\">  bestDirection : Direction <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> !isGameOver <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">       <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        bestDirection = <\/span><span style=\"color: #61AFEF\">bestMoveDirection<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">move<\/span><span style=\"color: #ABB2BF\">(bestDirection)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">bestMoveDirection<\/span><span style=\"color: #ABB2BF\">() -&gt; Direction {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> bestDirection: Direction = .<\/span><span style=\"color: #E06C75\">right<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> maxScore = <\/span><span style=\"color: #D19A66\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">for<\/span><span style=\"color: #ABB2BF\"> direction <\/span><span style=\"color: #C678DD\">in<\/span><span style=\"color: #ABB2BF\"> Direction.allCases {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> result = <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                      aiGame.<\/span><span style=\"color: #61AFEF\">oneStepGame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">direction<\/span><span style=\"color: #ABB2BF\">: direction, <\/span><span style=\"color: #61AFEF\">matrix<\/span><span style=\"color: #ABB2BF\">: tiles)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> result.moved &amp;&amp; result.score &gt;= maxScore {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                maxScore = result.<\/span><span style=\"color: #E06C75\">score<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                bestDirection = direction<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> bestDirection<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">move<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">_<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">direction<\/span><span style=\"color: #ABB2BF\">: Direction) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Logic to slide and merge tiles, add newTile if moved and gain the score<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> (moved, score) = <\/span><span style=\"color: #61AFEF\">slide<\/span><span style=\"color: #ABB2BF\">(direction)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> moved {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #E5C07B\">self<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #E06C75\">score<\/span><span style=\"color: #ABB2BF\"> += score<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">addNewTile<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">checkGameOver<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">checkGameOver<\/span><span style=\"color: #ABB2BF\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> !<\/span><span style=\"color: #61AFEF\">canMove<\/span><span style=\"color: #ABB2BF\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            isGameOver = <\/span><span style=\"color: #D19A66\">true<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">canMove<\/span><span style=\"color: #ABB2BF\">() -&gt; <\/span><span style=\"color: #E5C07B\">Bool<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> Direction.<\/span><span style=\"color: #E06C75\">allCases<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #56B6C2\">contains<\/span><span style=\"color: #ABB2BF\"> { direction <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            aiGame.<\/span><span style=\"color: #61AFEF\">oneStepGame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">direction<\/span><span style=\"color: #ABB2BF\">: direction, <\/span><span style=\"color: #61AFEF\">matrix<\/span><span style=\"color: #ABB2BF\">: tiles).<\/span><span style=\"color: #E06C75\">moved<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">addNewTile<\/span><span style=\"color: #ABB2BF\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Logic to add a new tile at a random empty position<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">slide<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">_<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">direction<\/span><span style=\"color: #ABB2BF\">: Direction) -&gt; (moved: <\/span><span style=\"color: #E5C07B\">Bool<\/span><span style=\"color: #ABB2BF\">, score: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Logic to slide and merge tiles, returning whether any tiles moved and the score gained<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> moved = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> totalScore = <\/span><span style=\"color: #D19A66\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Rotate board, compress, merge, and update rows...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> (moved, totalScore)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-17.01.53.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"637\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-17.01.53-1024x637.png\" alt=\"\" class=\"wp-image-15944\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-17.01.53-1024x637.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-17.01.53-300x187.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-17.01.53-768x478.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-17.01.53-482x300.png 482w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-17.01.53.png 1398w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" style=\"font-size:17px;text-transform:none\"><strong>Checkmark \u043a\u043d\u043e\u043f\u043a\u0430 isAIPlaying \u0434\u043b\u044f 2048<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.19.21.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"72\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.19.21-1024x72.png\" alt=\"\" class=\"wp-image-15945\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.19.21-1024x72.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.19.21-300x21.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.19.21-768x54.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.19.21-500x35.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.19.21.png 1344w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.19.32.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"121\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.19.32-1024x121.png\" alt=\"\" class=\"wp-image-15946\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.19.32-1024x121.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.19.32-300x35.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.19.32-768x91.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.19.32-500x59.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.19.32.png 1370w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.43.24.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"281\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.43.24-1024x281.png\" alt=\"\" class=\"wp-image-16137\" style=\"width:637px;height:auto\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.43.24-1024x281.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.43.24-300x82.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.43.24-768x211.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.43.24-500x137.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.43.24.png 1392w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import SwiftUI\nstruct GameView: View {\n    @ObservedObject var viewModel: GameViewModel\n\n    let tileSize: CGFloat = 80\n    let padding: CGFloat = 8\n\n    @State private var isAIPlaying = false\n     @State private var isShowingOptimalDirection = false\n\n\/\/ Create a timer publisher that fires every second \n    let timer = \n         Timer.publish(every: 0.5, on: .main, in: .common).autoconnect()\n    \n    var body: some View {\n        VStack {\n            \/\/ Your other game UI components here...\n\n            HStack {\n                Button(action: {\n                   isAIEnabled.toggle()\n                }) {\n                    HStack {\n                        Image(systemName: isAIPlaying ? \n                                               \"checkmark.square\" : \"square\")\n                            .resizable()\n                            .frame(width: 24, height: 24)\n                                                   \n                         Text(isAIPlaying ? \"AI Stop\" : \"AI Play\")\n                            .foregroundColor(.black)\n                    }\n                }\n                .padding()\n        }\n            \n            \/\/ Display other game-related UI components here...\n            \/\/ Game Over\n            Text(viewModel.isGameOver  ? \"Game Over\": \" ___ \")\n                    .font(.title)\n                    .foregroundColor(viewModel.isGameOver  ? .red : .clear)\n        }\n         .onReceive(timer){ value in\n            if isAIPlaying {\n                viewModel.executeAIMove()\n            }\n       }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">import<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">SwiftUI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">GameView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@ObservedObject<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> viewModel: GameViewModel<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> tileSize: CGFloat = <\/span><span style=\"color: #D19A66\">80<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> padding: CGFloat = <\/span><span style=\"color: #D19A66\">8<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> isAIPlaying = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">     <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> isShowingOptimalDirection = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ Create a timer publisher that fires every second <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> timer = <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">         Timer.<\/span><span style=\"color: #61AFEF\">publish<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">every<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">0.5<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">on<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">in<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">common<\/span><span style=\"color: #ABB2BF\">).<\/span><span style=\"color: #61AFEF\">autoconnect<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Your other game UI components here...<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">HStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Button<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">action<\/span><span style=\"color: #ABB2BF\">: {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                   isAIEnabled.<\/span><span style=\"color: #61AFEF\">toggle<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                }) {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">HStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                        <\/span><span style=\"color: #61AFEF\">Image<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">systemName<\/span><span style=\"color: #ABB2BF\">: isAIPlaying ? <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                                               <\/span><span style=\"color: #98C379\">&quot;checkmark.square&quot;<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;square&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #61AFEF\">resizable<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">width<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">24<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">height<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">24<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                                                   <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                         <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(isAIPlaying ? <\/span><span style=\"color: #98C379\">&quot;AI Stop&quot;<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;AI Play&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">black<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Display other game-related UI components here...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Game Over<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(viewModel.<\/span><span style=\"color: #E06C75\">isGameOver<\/span><span style=\"color: #ABB2BF\">  ? <\/span><span style=\"color: #98C379\">&quot;Game Over&quot;<\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot; ___ &quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">title<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(viewModel.<\/span><span style=\"color: #E06C75\">isGameOver<\/span><span style=\"color: #ABB2BF\">  ? .<\/span><span style=\"color: #E06C75\">red<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> .<\/span><span style=\"color: #E06C75\">clear<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">         .<\/span><span style=\"color: #61AFEF\">onReceive<\/span><span style=\"color: #ABB2BF\">(timer){ value <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> isAIPlaying {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                viewModel.<\/span><span style=\"color: #61AFEF\">executeAIMove<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">       }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.44.18.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"647\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.44.18-1024x647.png\" alt=\"\" class=\"wp-image-16138\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.44.18-1024x647.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.44.18-300x189.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.44.18-768x485.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.44.18-475x300.png 475w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-16.44.18.png 1384w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.30.16.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"396\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.30.16-1024x396.png\" alt=\"\" class=\"wp-image-15950\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.30.16-1024x396.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.30.16-300x116.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.30.16-768x297.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.30.16-500x193.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.30.16.png 1376w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u043e\u0442 \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435:<br><\/span><strong>\u041a\u043e\u0434 GameView:<\/strong><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>struct GameView: View {\n    @ObservedObject private var viewModel = GameViewModel()\n\n    let tileSize: CGFloat = 80\n    let padding: CGFloat = 8\n    \n   @State private var isShowingOptimalDirection = false    \n   @State var isAIPlaying = false\n\n  let timer = Timer.publish(every: 0.5, on: .main, in: .common).autoconnect()\n    var body: some View {\n        VStack {\n            Text(\"2048\")\n                .font(.largeTitle)\n                .padding()\n            \n            HStack {\n                \/\/ Score Display\n                Text(\"Score: \\(viewModel.score)\")\n                Spacer()\n                \/\/ AI\n                Button(action: {\n                    isAIPlaying.toggle()\n                }) {\n                    HStack {\n                      Image(systemName: isAIPlaying ? \n                                             \"checkmark.square\" : \"square\")\n                            .resizable()\n                            .frame(width: 34, height: 34)\n                       Text(isAIPlaying ? \"AI Play\" : \"AI Stop\")\n                    }\n                }\n            }\n            .font(.title)\n            .foregroundColor(.accentColor)\n            .padding()\n                 \n              \/\/ Display other game-related UI components here...\n        }\n      .onReceive(timer){ value in\n            if isAIPlaying {\n                viewModel.executeAIMove()\n            }\n        }\n    }\n    \n    \/\/ Handle swipe gesture and trigger game actions\n    private func handleSwipe(value: DragGesture.Value) {. . .}\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">struct<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">GameView<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">View <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@ObservedObject<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> viewModel = <\/span><span style=\"color: #61AFEF\">GameViewModel<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> tileSize: CGFloat = <\/span><span style=\"color: #D19A66\">80<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> padding: CGFloat = <\/span><span style=\"color: #D19A66\">8<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">   <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> isShowingOptimalDirection = <\/span><span style=\"color: #D19A66\">false<\/span><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">   <\/span><span style=\"color: #C678DD\">@State<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> isAIPlaying = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">  <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> timer = Timer.<\/span><span style=\"color: #61AFEF\">publish<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">every<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">0.5<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">on<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">main<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">in<\/span><span style=\"color: #ABB2BF\">: .<\/span><span style=\"color: #E06C75\">common<\/span><span style=\"color: #ABB2BF\">).<\/span><span style=\"color: #61AFEF\">autoconnect<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> body: <\/span><span style=\"color: #C678DD\">some<\/span><span style=\"color: #ABB2BF\"> View {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">VStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;2048&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">largeTitle<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">HStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Score Display<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #98C379\">&quot;Score: <\/span><span style=\"color: #C678DD\">\\(<\/span><span style=\"color: #ABB2BF\">viewModel.<\/span><span style=\"color: #E06C75\">score<\/span><span style=\"color: #C678DD\">)<\/span><span style=\"color: #98C379\">&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Spacer<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ AI<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                <\/span><span style=\"color: #61AFEF\">Button<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">action<\/span><span style=\"color: #ABB2BF\">: {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                    isAIPlaying.<\/span><span style=\"color: #61AFEF\">toggle<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                }) {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                    <\/span><span style=\"color: #61AFEF\">HStack<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                      <\/span><span style=\"color: #61AFEF\">Image<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">systemName<\/span><span style=\"color: #ABB2BF\">: isAIPlaying ? <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                                             <\/span><span style=\"color: #98C379\">&quot;checkmark.square&quot;<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;square&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #61AFEF\">resizable<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                            .<\/span><span style=\"color: #61AFEF\">frame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">width<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">34<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">height<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">34<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                       <\/span><span style=\"color: #61AFEF\">Text<\/span><span style=\"color: #ABB2BF\">(isAIPlaying ? <\/span><span style=\"color: #98C379\">&quot;AI Play&quot;<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">:<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #98C379\">&quot;AI Stop&quot;<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                    }<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">font<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">title<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">foregroundColor<\/span><span style=\"color: #ABB2BF\">(.<\/span><span style=\"color: #E06C75\">accentColor<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            .<\/span><span style=\"color: #61AFEF\">padding<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">              <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Display other game-related UI components here...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      .<\/span><span style=\"color: #61AFEF\">onReceive<\/span><span style=\"color: #ABB2BF\">(timer){ value <\/span><span style=\"color: #C678DD\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> isAIPlaying {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                viewModel.<\/span><span style=\"color: #61AFEF\">executeAIMove<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Handle swipe gesture and trigger game actions<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">handleSwipe<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF; font-style: italic\">value<\/span><span style=\"color: #ABB2BF\">: DragGesture.<\/span><span style=\"color: #E5C07B\">Value<\/span><span style=\"color: #ABB2BF\">) {. . .}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>A \u0432\u043e\u0442 \u043d\u0430\u0448 UI:<\/strong><\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.36.41.png\"><img loading=\"lazy\" decoding=\"async\" width=\"514\" height=\"1024\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.36.41-514x1024.png\" alt=\"\" class=\"wp-image-15951\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.36.41-514x1024.png 514w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.36.41-150x300.png 150w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.36.41.png 674w\" sizes=\"auto, (max-width: 514px) 100vw, 514px\" \/><\/a><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screen-Recording-2024-10-15-at-18.36.59.gif\"><img loading=\"lazy\" decoding=\"async\" width=\"364\" height=\"738\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screen-Recording-2024-10-15-at-18.36.59.gif\" alt=\"\" class=\"wp-image-15952\"\/><\/a><\/figure>\n<\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\"><strong>\u0428\u0410\u0413 17. \u041b\u0443\u0447\u0448\u0430\u044f \u0418\u0418 (AI) \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.41.57.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"205\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.41.57-1024x205.png\" alt=\"\" class=\"wp-image-15954\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.41.57-1024x205.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.41.57-300x60.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.41.57-768x154.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.41.57-500x100.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.41.57.png 1360w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.42.08.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"184\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.42.08-1024x184.png\" alt=\"\" class=\"wp-image-15955\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.42.08-1024x184.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.42.08-300x54.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.42.08-768x138.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.42.08-500x90.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.42.08.png 1402w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.42.26.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"390\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.42.26-1024x390.png\" alt=\"\" class=\"wp-image-15956\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.42.26-1024x390.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.42.26-300x114.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.42.26-768x293.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.42.26-500x191.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-18.42.26.png 1370w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.06.52.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"468\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.06.52-1024x468.png\" alt=\"\" class=\"wp-image-15958\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.06.52-1024x468.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.06.52-300x137.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.06.52-768x351.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.06.52-500x228.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.06.52.png 1370w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.07.03.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"515\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.07.03-1024x515.png\" alt=\"\" class=\"wp-image-15959\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.07.03-1024x515.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.07.03-300x151.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.07.03-768x386.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.07.03-500x251.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.07.03.png 1380w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.07.27.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"443\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.07.27-1024x443.png\" alt=\"\" class=\"wp-image-15960\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.07.27-1024x443.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.07.27-300x130.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.07.27-768x332.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.07.27-500x216.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.07.27.png 1388w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.51.01.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"475\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.51.01-1024x475.png\" alt=\"\" class=\"wp-image-15961\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.51.01-1024x475.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.51.01-300x139.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.51.01-768x357.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.51.01-500x232.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-20.51.01.png 1370w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>func expectimax (board: [&#91;Tile&#93;], depth: Int, isAITurn: Bool) -> Double {\n    \/\/ Base case: return the board evaluation if depth is 0 or game is over\n    if depth == 0 || isGameOver(board) {\n        return evaluateBoard(board)\n    }\n\n    \/\/ AI's move (maximize the score)\n    if isAITurn {\n        var maxScore = -Double.infinity\n        for direction in Direction.allCases {\n            let newBoard = makeMove(board, direction)\n            if board != newBoard {\n        \/\/ Recur for the next move, but now it's the tile placement's turn\n                maxScore = \n              max(maxScore, expectimax(newBoard, depth - 1, isAITurn: false))\n            }\n        }\n        return maxScore\n    } \n    \/\/ Random tile placement's move (chance node)\n    else {\n        var expectedScore = 0.0\n        let emptyTiles = findEmptyTiles(board)\n\n        \/\/ If no empty tiles, the game is over\n        if emptyTiles.isEmpty {\n            return evaluateBoard(board)\n        }\n\n        \/\/ For each empty tile, calculate the expected value\n        for tile in emptyTiles {\n            let boardWith2 = addTile(board, tile, value: 2)\n            let boardWith4 = addTile(board, tile, value: 4)\n\n    \/\/ 90% probability of placing a '2' tile, 10% of placing a '4' tile\n      expectedScore += 0.9 * expectimax(boardWith2, depth - 1, isAITurn: true)\n      expectedScore += 0.1 * expectimax(boardWith4, depth - 1, isAITurn: true)\n        }\n        return expectedScore \/ Double(emptyTiles.count)\n    }\n}\n\n\nfunc evaluate(_ tiles: [&#91;Tile&#93;]) -> Double {\n    \/\/ A heuristic function to evaluate the current board state\n    \/\/ e.g., sum of all tile values, number of empty spaces, etc.\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">expectimax<\/span><span style=\"color: #ABB2BF\"> (<\/span><span style=\"color: #61AFEF; font-style: italic\">board<\/span><span style=\"color: #ABB2BF\">: [&#91;Tile&#93;], <\/span><span style=\"color: #61AFEF; font-style: italic\">depth<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF; font-style: italic\">isAITurn<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Bool<\/span><span style=\"color: #ABB2BF\">) -&gt; <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Base case: return the board evaluation if depth is 0 or game is over<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> depth == <\/span><span style=\"color: #D19A66\">0<\/span><span style=\"color: #ABB2BF\"> || <\/span><span style=\"color: #61AFEF\">isGameOver<\/span><span style=\"color: #ABB2BF\">(board) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">evaluateBoard<\/span><span style=\"color: #ABB2BF\">(board)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ AI&#39;s move (maximize the score)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> isAITurn {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> maxScore = -<\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">.infinity<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">for<\/span><span style=\"color: #ABB2BF\"> direction <\/span><span style=\"color: #C678DD\">in<\/span><span style=\"color: #ABB2BF\"> Direction.allCases {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> newBoard = <\/span><span style=\"color: #61AFEF\">makeMove<\/span><span style=\"color: #ABB2BF\">(board, direction)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> board != newBoard {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Recur for the next move, but now it&#39;s the tile placement&#39;s turn<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                maxScore = <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">              <\/span><span style=\"color: #56B6C2\">max<\/span><span style=\"color: #ABB2BF\">(maxScore, <\/span><span style=\"color: #61AFEF\">expectimax<\/span><span style=\"color: #ABB2BF\">(newBoard, depth - <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">isAITurn<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">false<\/span><span style=\"color: #ABB2BF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> maxScore<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    } <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Random tile placement&#39;s move (chance node)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> expectedScore = <\/span><span style=\"color: #D19A66\">0.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> emptyTiles = <\/span><span style=\"color: #61AFEF\">findEmptyTiles<\/span><span style=\"color: #ABB2BF\">(board)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ If no empty tiles, the game is over<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> emptyTiles.isEmpty {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">evaluateBoard<\/span><span style=\"color: #ABB2BF\">(board)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ For each empty tile, calculate the expected value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">for<\/span><span style=\"color: #ABB2BF\"> tile <\/span><span style=\"color: #C678DD\">in<\/span><span style=\"color: #ABB2BF\"> emptyTiles {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> boardWith2 = <\/span><span style=\"color: #61AFEF\">addTile<\/span><span style=\"color: #ABB2BF\">(board, tile, <\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">2<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> boardWith4 = <\/span><span style=\"color: #61AFEF\">addTile<\/span><span style=\"color: #ABB2BF\">(board, tile, <\/span><span style=\"color: #61AFEF\">value<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">4<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ 90% probability of placing a &#39;2&#39; tile, 10% of placing a &#39;4&#39; tile<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">      expectedScore += <\/span><span style=\"color: #D19A66\">0.9<\/span><span style=\"color: #ABB2BF\"> * <\/span><span style=\"color: #61AFEF\">expectimax<\/span><span style=\"color: #ABB2BF\">(boardWith2, depth - <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">isAITurn<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">true<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">      expectedScore += <\/span><span style=\"color: #D19A66\">0.1<\/span><span style=\"color: #ABB2BF\"> * <\/span><span style=\"color: #61AFEF\">expectimax<\/span><span style=\"color: #ABB2BF\">(boardWith4, depth - <\/span><span style=\"color: #D19A66\">1<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">isAITurn<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">true<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> expectedScore \/ <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">(emptyTiles.count)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">evaluate<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">_<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">tiles<\/span><span style=\"color: #ABB2BF\">: [&#91;Tile&#93;]) -&gt; <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ A heuristic function to evaluate the current board state<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ e.g., sum of all tile values, number of empty spaces, etc.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.15.36.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"454\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.15.36-1024x454.png\" alt=\"\" class=\"wp-image-15962\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.15.36-1024x454.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.15.36-300x133.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.15.36-768x340.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.15.36-500x222.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.15.36.png 1318w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong> \u0428\u0410\u0413. 18 \u041a\u0430\u043a \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0418\u0418?<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.56.35.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"203\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.56.35-1024x203.png\" alt=\"\" class=\"wp-image-15963\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.56.35-1024x203.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.56.35-300x59.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.56.35-768x152.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.56.35-500x99.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.56.35.png 1402w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.56.48.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"442\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.56.48-1024x442.png\" alt=\"\" class=\"wp-image-15964\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.56.48-1024x442.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.56.48-300x130.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.56.48-768x332.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.56.48-500x216.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.56.48.png 1376w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.57.01.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"692\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.57.01-1024x692.png\" alt=\"\" class=\"wp-image-15965\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.57.01-1024x692.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.57.01-300x203.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.57.01-768x519.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.57.01-444x300.png 444w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.57.01.png 1396w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>func evaluateBoard(_ board: [&#91;Tile&#93;]) -> Double {\n    let monotonicityWeight = 1.0\n    let smoothnessWeight = 1.0\n    let emptyTilesWeight = 2.0\n    let maxTileWeight = 0.5\n\n    return monotonicity(board) * monotonicityWeight +\n           smoothness(board) * smoothnessWeight +\n           countEmptyTiles(board) * emptyTilesWeight +\n           getMaxTile(board) * maxTileWeight\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">evaluateBoard<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">_<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #ABB2BF; font-style: italic\">board<\/span><span style=\"color: #ABB2BF\">: [&#91;Tile&#93;]) -&gt; <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> monotonicityWeight = <\/span><span style=\"color: #D19A66\">1.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> smoothnessWeight = <\/span><span style=\"color: #D19A66\">1.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> emptyTilesWeight = <\/span><span style=\"color: #D19A66\">2.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> maxTileWeight = <\/span><span style=\"color: #D19A66\">0.5<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">monotonicity<\/span><span style=\"color: #ABB2BF\">(board) * monotonicityWeight +<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           <\/span><span style=\"color: #61AFEF\">smoothness<\/span><span style=\"color: #ABB2BF\">(board) * smoothnessWeight +<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           <\/span><span style=\"color: #61AFEF\">countEmptyTiles<\/span><span style=\"color: #ABB2BF\">(board) * emptyTilesWeight +<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           <\/span><span style=\"color: #61AFEF\">getMaxTile<\/span><span style=\"color: #ABB2BF\">(board) * maxTileWeight<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.58.35.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"420\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.58.35-1024x420.png\" alt=\"\" class=\"wp-image-15966\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.58.35-1024x420.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.58.35-300x123.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.58.35-768x315.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.58.35-500x205.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-21.58.35.png 1380w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-13.06.12.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"355\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-13.06.12-1024x355.png\" alt=\"\" class=\"wp-image-15969\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-13.06.12-1024x355.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-13.06.12-300x104.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-13.06.12-768x266.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-13.06.12-500x173.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-13.06.12.png 1380w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(238, 255, 255, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>func expectimax(board: [&#91;Tile&#93;], depth: Int, isAITurn: Bool) -> Double {\n    \/\/ Base case: return the board evaluation if depth is 0 or game is over\n    if depth == 0 || isGameOver(board) {\n        return evaluate(board)\n    }\n\n    \/\/ AI's move (maximize the score)\n    if isAITurn {\n        var maxScore = -Double.infinity\n        for direction in Direction.allCases {\n            let newBoard = makeMove(board, direction)\n            if board != newBoard {\n           \/\/ Recur for the next move, but now it's the tile placement's turn\n                maxScore = \n            max(maxScore, expectimax(newBoard, depth - 1, isAITurn: false))\n            }\n        }\n        return maxScore\n    } \n    \/\/ Random tile placement's move (chance node)\n    else {\n        var expectedScore = 0.0\n        let emptyTiles = findEmptyTiles(board)\n\n        \/\/ If no empty tiles, the game is over\n        if emptyTiles.isEmpty {\n            return evaluateBoard(board)\n        }\n\n        \/\/ For each empty tile, calculate the expected value\n        for tile in emptyTiles {\n            let boardWith2 = addTile(board, tile, value: 2)\n            let boardWith4 = addTile(board, tile, value: 4)\n\n         \/\/ 90% probability of placing a '2' tile, 10% of placing a '4' tile\n            expectedScore += \n                   0.9 * expectimax(boardWith2, depth - 1, isAITurn: true)\n            expectedScore += \n                   0.1 * expectimax(boardWith4, depth - 1, isAITurn: true)\n        }\n        return expectedScore \/ Double(emptyTiles.count)\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">expectimax<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF; font-style: italic\">board<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #EEFFFF\">Tile<\/span><span style=\"color: #89DDFF\">&#93;]<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF; font-style: italic\">depth<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #FFCB6B\">Int<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF; font-style: italic\">isAITurn<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #FFCB6B\">Bool<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">    <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Base case: return the board evaluation if depth is 0 or game is over<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> depth <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">||<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">isGameOver<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">board<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">evaluate<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">board<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">    <\/span><span style=\"color: #545454; font-style: italic\">\/\/ AI&#39;s move (maximize the score)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> isAITurn <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> maxScore <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\">.infinity<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> direction <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> Direction.allCases <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> newBoard <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">makeMove<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">board, direction<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> board <\/span><span style=\"color: #89DDFF\">!=<\/span><span style=\"color: #EEFFFF\"> newBoard <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">           <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Recur for the next move, but now it&#39;s the tile placement&#39;s turn<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                maxScore <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #82AAFF\">max<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">maxScore, <\/span><span style=\"color: #82AAFF\">expectimax<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">newBoard, depth <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF\">isAITurn<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FF9CAC\">false<\/span><span style=\"color: #89DDFF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> maxScore<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">    <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Random tile placement&#39;s move (chance node)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">else<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> expectedScore <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> emptyTiles <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">findEmptyTiles<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">board<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        <\/span><span style=\"color: #545454; font-style: italic\">\/\/ If no empty tiles, the game is over<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> emptyTiles.isEmpty <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">evaluateBoard<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">board<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        <\/span><span style=\"color: #545454; font-style: italic\">\/\/ For each empty tile, calculate the expected value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> tile <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> emptyTiles <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> boardWith2 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">addTile<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">board, tile, <\/span><span style=\"color: #82AAFF\">value<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> boardWith4 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">addTile<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">board, tile, <\/span><span style=\"color: #82AAFF\">value<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">         <\/span><span style=\"color: #545454; font-style: italic\">\/\/ 90% probability of placing a &#39;2&#39; tile, 10% of placing a &#39;4&#39; tile<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            expectedScore <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">                   <\/span><span style=\"color: #F78C6C\">0.9<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">expectimax<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">boardWith2, depth <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF\">isAITurn<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FF9CAC\">true<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            expectedScore <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">                   <\/span><span style=\"color: #F78C6C\">0.1<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">expectimax<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">boardWith4, depth <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF\">isAITurn<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FF9CAC\">true<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> expectedScore <\/span><span style=\"color: #89DDFF\">\/<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">emptyTiles.count<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.26.20.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"399\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.26.20-1024x399.png\" alt=\"\" class=\"wp-image-15971\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.26.20-1024x399.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.26.20-300x117.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.26.20-768x300.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.26.20-500x195.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.26.20.png 1400w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.28.33.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"645\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.28.33-1024x645.png\" alt=\"\" class=\"wp-image-15972\" style=\"width:610px;height:auto\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.28.33-1024x645.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.28.33-300x189.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.28.33-768x484.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.28.33-476x300.png 476w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.28.33.png 1352w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.28.46.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"596\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.28.46-1024x596.png\" alt=\"\" class=\"wp-image-15973\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.28.46-1024x596.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.28.46-300x175.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.28.46-768x447.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.28.46-500x291.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.28.46.png 1384w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.28.55.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"268\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.28.55-1024x268.png\" alt=\"\" class=\"wp-image-15974\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.28.55-1024x268.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.28.55-300x78.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.28.55-768x201.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.28.55-500x131.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.28.55.png 1400w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.29.03.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"499\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.29.03-1024x499.png\" alt=\"\" class=\"wp-image-15975\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.29.03-1024x499.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.29.03-300x146.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.29.03-768x374.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.29.03-500x244.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.29.03.png 1366w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.31.18.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"498\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.31.18-1024x498.png\" alt=\"\" class=\"wp-image-15976\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.31.18-1024x498.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.31.18-300x146.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.31.18-768x373.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.31.18-500x243.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.31.18.png 1386w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\"><strong>\u0428\u0410\u0413 18. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c Expectimax<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.48.51.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"194\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.48.51-1024x194.png\" alt=\"\" class=\"wp-image-15977\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.48.51-1024x194.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.48.51-300x57.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.48.51-768x145.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.48.51-500x95.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-14.48.51.png 1416w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-18.02.04.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"511\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-18.02.04-1024x511.png\" alt=\"\" class=\"wp-image-16140\" style=\"width:614px;height:auto\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-18.02.04-1024x511.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-18.02.04-300x150.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-18.02.04-768x383.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-18.02.04-500x250.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-18.02.04.png 1382w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(1 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>enum Direction: CaseIterable {\n    case up, down, left, right\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">enum<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Direction<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">CaseIterable <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #C792EA\">case<\/span><span style=\"color: #EEFFFF\"> up, down, left, right<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-18.02.54.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"163\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-18.02.54-1024x163.png\" alt=\"\" class=\"wp-image-16141\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-18.02.54-1024x163.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-18.02.54-300x48.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-18.02.54-768x122.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-18.02.54-500x80.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-18.02.54.png 1406w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(2 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>struct Tile : Equatable, Identifiable {\n    var value: Int\n    var position: Position\n    var id = UUID()  \/\/ This provides a unique identifier for each tile\n    \n    \/\/ Manually implement Equatable conformance\n    static func == (lhs: Tile, rhs: Tile) -> Bool {\n        return lhs.value == rhs.value\n    }\n}\n\nstruct Position: Equatable {\n    var row: Int\n    var col: Int\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">struct<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Tile<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Equatable<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #FFCB6B\">Identifiable <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> value: <\/span><span style=\"color: #FFCB6B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> position: Position<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> id <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">UUID<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #EEFFFF\">  <\/span><span style=\"color: #545454; font-style: italic\">\/\/ This provides a unique identifier for each tile<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">    <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Manually implement Equatable conformance<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #C792EA\">static<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">==<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF; font-style: italic\">lhs<\/span><span style=\"color: #EEFFFF\">: Tile, <\/span><span style=\"color: #82AAFF; font-style: italic\">rhs<\/span><span style=\"color: #EEFFFF\">: Tile<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Bool<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> lhs.value <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> rhs.value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">struct<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Position<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Equatable <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> row: <\/span><span style=\"color: #FFCB6B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> col: <\/span><span style=\"color: #FFCB6B\">Int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-18.03.43.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"557\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-18.03.43-1024x557.png\" alt=\"\" class=\"wp-image-16142\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-18.03.43-1024x557.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-18.03.43-300x163.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-18.03.43-768x418.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-18.03.43-500x272.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-18.03.43.png 1390w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(2 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>func expectimax(board: [&#91;Tile&#93;], depth: Int, isAITurn: Bool) -> Double {\n      \/\/ Base case: return the board evaluation if depth is 0 or game is over\n        if depth == 0 || isGameOver(board) {\n            return evaluateBoard  (board)\n        }\n        \n        \/\/ AI's move (maximize the score)\n        if isAITurn {\n            var maxScore = -Double.infinity\n            for direction in Direction.allCases {\n                let newBoard = GameViewModel (matrix: board)\n                let (moved, _) = newBoard.slide(direction)\n                if moved {\n                 \/\/ Recur for the next move, but now it's the tile placement's turn\n                    maxScore = max(maxScore, \n        expectimax(board: newBoard.tiles, depth: depth - 1, isAITurn: false))\n                }\n            }\n            return maxScore\n        }\n        \/\/ Random tile placement's move (chance node)\n        else {\n            var expectedScore = 0.0\n            let emptyTiles = board.flatMap{$0}.filter{$0.value == 0}\n            \/\/ If no empty tiles, the game is over\n            if emptyTiles.isEmpty {\n                return evaluateBoard (board)\n            }\n            \n            \/\/ For each empty tile, calculate the expected value\n            for tile in emptyTiles {\n                var boardWith2 = board\n                boardWith2&#91;tile.position.row&#93;&#91;tile.position.col&#93;.value = 2\n                var boardWith4 = board\n                boardWith4&#91;tile.position.row&#93;&#91;tile.position.col&#93;.value = 4\n                \n                \/\/ 90% probability of placing a '2' tile, 10% of placing a '4' tile\n                expectedScore += \n        0.9 * expectimax(board: boardWith2, depth: depth - 1, isAITurn: true)\n                expectedScore += \n        0.1 * expectimax(board: boardWith4, depth: depth - 1, isAITurn: true)\n            }\n            return expectedScore \/ Double(emptyTiles.count)\n        }\n    }\n\n  func evaluateBoard(_ board: [&#91;Tile&#93;]) -> Double {\n        let monotonicityWeight = 1.0\n        let smoothnessWeight = 0.1\n        let emptyTilesWeight = 2.7\n        let maxTileWeight = 1.0\n\n        let emptyTilesCount = \n               Double(board.flatMap{$0}.filter{$0.value == 0}.count)\n              \n        return monotonicity(board) * monotonicityWeight +\n               smoothness(board) * smoothnessWeight +\n               emptyTilesCount * emptyTilesWeight +\n               maxTileInCorne() * maxTileWeight\n    }\n    \n    func  monotonicity (_ board: [&#91;Tile&#93;]) -> Double {\n        \/\/ calculate\n        return 0.0\n    }\n    func  smoothness (_ board: [&#91;Tile&#93;]) -> Double {\n        \/\/ calculate\n        return 0.0\n    }\n\n    func maxTileInCorner(_ board: [&#91;Tile&#93;]) -> Double \n        \/\/ calculate\n        return 0.0\n    }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">expectimax<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF; font-style: italic\">board<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #EEFFFF\">Tile<\/span><span style=\"color: #89DDFF\">&#93;]<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF; font-style: italic\">depth<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #FFCB6B\">Int<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF; font-style: italic\">isAITurn<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #FFCB6B\">Bool<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">      <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Base case: return the board evaluation if depth is 0 or game is over<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> depth <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">||<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">isGameOver<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">board<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">evaluateBoard<\/span><span style=\"color: #EEFFFF\">  <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">board<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        <\/span><span style=\"color: #545454; font-style: italic\">\/\/ AI&#39;s move (maximize the score)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> isAITurn <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> maxScore <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\">.infinity<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> direction <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> Direction.allCases <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> newBoard <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">GameViewModel<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">matrix<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> board<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">moved, _<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> newBoard.<\/span><span style=\"color: #82AAFF\">slide<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">direction<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> moved <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">                 <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Recur for the next move, but now it&#39;s the tile placement&#39;s turn<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    maxScore <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">max<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">maxScore, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #82AAFF\">expectimax<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">board<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> newBoard.tiles, <\/span><span style=\"color: #82AAFF\">depth<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> depth <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF\">isAITurn<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FF9CAC\">false<\/span><span style=\"color: #89DDFF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> maxScore<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Random tile placement&#39;s move (chance node)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">else<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> expectedScore <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> emptyTiles <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> board.<\/span><span style=\"color: #82AAFF\">flatMap<\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\">$0<\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\">.<\/span><span style=\"color: #82AAFF\">filter<\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\">$0.value <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">            <\/span><span style=\"color: #545454; font-style: italic\">\/\/ If no empty tiles, the game is over<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> emptyTiles.isEmpty <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">evaluateBoard<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">board<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">            <\/span><span style=\"color: #545454; font-style: italic\">\/\/ For each empty tile, calculate the expected value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> tile <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> emptyTiles <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> boardWith2 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> board<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                boardWith2<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">tile.position.row<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">&#91;tile.position.col&#93;.value <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> boardWith4 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> board<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                boardWith4<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">tile.position.row<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">&#91;tile.position.col&#93;.value <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">                <\/span><span style=\"color: #545454; font-style: italic\">\/\/ 90% probability of placing a &#39;2&#39; tile, 10% of placing a &#39;4&#39; tile<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                expectedScore <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">0.9<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">expectimax<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">board<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> boardWith2, <\/span><span style=\"color: #82AAFF\">depth<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> depth <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF\">isAITurn<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FF9CAC\">true<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                expectedScore <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">0.1<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">expectimax<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">board<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> boardWith4, <\/span><span style=\"color: #82AAFF\">depth<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> depth <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF\">isAITurn<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FF9CAC\">true<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> expectedScore <\/span><span style=\"color: #89DDFF\">\/<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">emptyTiles.count<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">  <\/span><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">evaluateBoard<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">_<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">board<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #EEFFFF\">Tile<\/span><span style=\"color: #89DDFF\">&#93;])<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> monotonicityWeight <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> smoothnessWeight <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> emptyTilesWeight <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">2.7<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> maxTileWeight <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1.0<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> emptyTilesCount <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">               <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">board.<\/span><span style=\"color: #82AAFF\">flatMap<\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\">$0<\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\">.<\/span><span style=\"color: #82AAFF\">filter<\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\">$0.value <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\">.count<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">              <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">monotonicity<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">board<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> monotonicityWeight <\/span><span style=\"color: #89DDFF\">+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">               <\/span><span style=\"color: #82AAFF\">smoothness<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">board<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> smoothnessWeight <\/span><span style=\"color: #89DDFF\">+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">               emptyTilesCount <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> emptyTilesWeight <\/span><span style=\"color: #89DDFF\">+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">               <\/span><span style=\"color: #82AAFF\">maxTileInCorne<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> maxTileWeight<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\">  <\/span><span style=\"color: #82AAFF\">monotonicity<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">_<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">board<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #EEFFFF\">Tile<\/span><span style=\"color: #89DDFF\">&#93;])<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        <\/span><span style=\"color: #545454; font-style: italic\">\/\/ calculate<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\">  <\/span><span style=\"color: #82AAFF\">smoothness<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">_<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">board<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #EEFFFF\">Tile<\/span><span style=\"color: #89DDFF\">&#93;])<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        <\/span><span style=\"color: #545454; font-style: italic\">\/\/ calculate<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">maxTileInCorner<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">_<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">board<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #EEFFFF\">Tile<\/span><span style=\"color: #89DDFF\">&#93;])<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        <\/span><span style=\"color: #545454; font-style: italic\">\/\/ calculate<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    }<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.02.35.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"382\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.02.35-1024x382.png\" alt=\"\" class=\"wp-image-15983\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.02.35-1024x382.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.02.35-300x112.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.02.35-768x287.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.02.35-500x187.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.02.35.png 1388w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.02.46.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"561\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.02.46-1024x561.png\" alt=\"\" class=\"wp-image-15984\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.02.46-1024x561.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.02.46-300x164.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.02.46-768x421.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.02.46-500x274.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.02.46.png 1398w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.03.05.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"553\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.03.05-1024x553.png\" alt=\"\" class=\"wp-image-15985\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.03.05-1024x553.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.03.05-300x162.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.03.05-768x415.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.03.05-500x270.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.03.05.png 1378w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.03.14.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"363\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.03.14-1024x363.png\" alt=\"\" class=\"wp-image-15986\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.03.14-1024x363.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.03.14-300x106.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.03.14-768x273.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.03.14-500x177.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.03.14.png 1364w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.05.37.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"694\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.05.37-1024x694.png\" alt=\"\" class=\"wp-image-15987\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.05.37-1024x694.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.05.37-300x203.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.05.37-768x520.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.05.37-443x300.png 443w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.05.37.png 1382w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.05.45.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"159\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.05.45-1024x159.png\" alt=\"\" class=\"wp-image-15988\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.05.45-1024x159.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.05.45-300x46.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.05.45-768x119.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.05.45-500x77.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.05.45.png 1368w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ MARK: - Expectimax\n    func expectimaxBestMove (depth: Int, matrix: [&#91;Tile&#93;]) -> Direction {\n        var bestDirection = Direction.right\n        var bestScore: Double = -Double.infinity\n \n       \/\/ for move in possibleMoves {\n        for direction in Direction.allCases {\n            var model = GameViewModel (matrix: matrix) \/\/ Initialize Game\n            let (moved, _ ) = model.slide(direction)\n            if moved {\n               let newScore = \n          expectimaxScore (board: model.tiles, depth: depth, isAITurn: false)\n               if newScore > bestScore {\n                    bestScore = newScore\n                    bestDirection = direction\n                }\n            }\n        }\n        return bestDirection\n    }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #7F848E; font-style: italic\">\/\/ MARK: - Expectimax<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">expectimaxBestMove<\/span><span style=\"color: #ABB2BF\"> (<\/span><span style=\"color: #61AFEF; font-style: italic\">depth<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF; font-style: italic\">matrix<\/span><span style=\"color: #ABB2BF\">: [&#91;Tile&#93;]) -&gt; Direction {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> bestDirection = Direction.<\/span><span style=\"color: #E06C75\">right<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> bestScore: <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\"> = -<\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">.infinity<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">       <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ for move in possibleMoves {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">for<\/span><span style=\"color: #ABB2BF\"> direction <\/span><span style=\"color: #C678DD\">in<\/span><span style=\"color: #ABB2BF\"> Direction.allCases {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> model = <\/span><span style=\"color: #61AFEF\">GameViewModel<\/span><span style=\"color: #ABB2BF\"> (<\/span><span style=\"color: #61AFEF\">matrix<\/span><span style=\"color: #ABB2BF\">: matrix) <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Initialize Game<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> (moved, _ ) = model.<\/span><span style=\"color: #61AFEF\">slide<\/span><span style=\"color: #ABB2BF\">(direction)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> moved {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">               <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> newScore = <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">          <\/span><span style=\"color: #61AFEF\">expectimaxScore<\/span><span style=\"color: #ABB2BF\"> (<\/span><span style=\"color: #61AFEF\">board<\/span><span style=\"color: #ABB2BF\">: model.<\/span><span style=\"color: #E06C75\">tiles<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">depth<\/span><span style=\"color: #ABB2BF\">: depth, <\/span><span style=\"color: #61AFEF\">isAITurn<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">false<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">               <\/span><span style=\"color: #C678DD\">if<\/span><span style=\"color: #ABB2BF\"> newScore &gt; bestScore {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    bestScore = newScore<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                    bestDirection = direction<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">                }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> bestDirection<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-09.18.06.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"286\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-09.18.06-1024x286.png\" alt=\"\" class=\"wp-image-16036\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-09.18.06-1024x286.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-09.18.06-300x84.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-09.18.06-768x215.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-09.18.06-500x140.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-09.18.06.png 1388w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>class GameViewModel: ObservableObject {\n    @Published var tiles: [&#91;Tile&#93;] = []\n    @Published var isGameOver = false\n    @Published var score: Int = 0\n        \n    private var aiGame = AIGame()\n    \n    init() {\n        resetGame()\n    }\n    \n    func resetGame() { . . .}\n        \/\/ Reset the game board, score, and other states    \n     \n    \/\/ ------ AI ---------\n    func executeAIMove() {\n            guard !isGameOver else { return }\n            move(bestAIMoveDirection())\n    }\n      func bestAIMoveDirection() -> Direction {\n           aiGame.expectimaxBestMove(depth: 4, matrix: tiles)\n      }\n              \n     \/\/ Other functions: move, slide, compress, merge, and update rows...\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">class<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #E5C07B\">GameViewModel<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">ObservableObject <\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> tiles: [&#91;Tile&#93;] = []<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> isGameOver = <\/span><span style=\"color: #D19A66\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">@Published<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> score: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\"> = <\/span><span style=\"color: #D19A66\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">private<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> aiGame = <\/span><span style=\"color: #61AFEF\">AIGame<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">init<\/span><span style=\"color: #ABB2BF\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #61AFEF\">resetGame<\/span><span style=\"color: #ABB2BF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">resetGame<\/span><span style=\"color: #ABB2BF\">() { . . .}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Reset the game board, score, and other states    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">     <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ ------ AI ---------<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">    <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">executeAIMove<\/span><span style=\"color: #ABB2BF\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #C678DD\">guard<\/span><span style=\"color: #ABB2BF\"> !isGameOver <\/span><span style=\"color: #C678DD\">else<\/span><span style=\"color: #ABB2BF\"> { <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> }<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">            <\/span><span style=\"color: #61AFEF\">move<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">bestAIMoveDirection<\/span><span style=\"color: #ABB2BF\">())<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">      <\/span><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">bestAIMoveDirection<\/span><span style=\"color: #ABB2BF\">() -&gt; Direction {<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">           aiGame.<\/span><span style=\"color: #61AFEF\">expectimaxBestMove<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">depth<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #D19A66\">4<\/span><span style=\"color: #ABB2BF\">, <\/span><span style=\"color: #61AFEF\">matrix<\/span><span style=\"color: #ABB2BF\">: tiles)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">      }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">              <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">     <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Other functions: move, slide, compress, merge, and update rows...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-09.20.02.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"371\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-09.20.02-1024x371.png\" alt=\"\" class=\"wp-image-16037\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-09.20.02-1024x371.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-09.20.02-300x109.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-09.20.02-768x278.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-09.20.02-500x181.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-09.20.02.png 1434w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(238, 255, 255, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import SwiftUI\n\nstruct GameView: View {\n    @ObservedObject var viewModel = GameViewModel ()\n\n    let tileSize: CGFloat = 80\n    let padding: CGFloat = 8\n    \n    @State var isAIPlaying = false\n    @State private var isShowingOptimalDirection = false\n    \n    \/\/ Timer that triggers every 0.5 seconds\n    private let timer = \n            Timer.publish(every: 0.5, on: .main, in:.common).autoconnect()\n    \n    var body: some View {\n        VStack {\n            \/\/ Your game UI components here (score display)...\n\n            HStack {\n                Button(action: {\n                    isAIPlaying.toggle()\n                }) {\n                    HStack {\n                     Image(systemName: \n                                 isAIPlaying ? \"checkmark.square\" : \"square\")\n                            .resizable()\n                            .frame(width: 24, height: 24)\n                                                   \n                      Text(isAIPlaying ? \"AI Stop\" : \"AI Play\")\n                     }\n                }\n                .padding()\n            }\n            \n            if viewModel.isGameOver {\n                Text(viewModel.isGameOver  ? \"Game Over\": \" ___ \")\n                    .font(.title)\n                    .foregroundColor(viewModel.isGameOver  ? .red : .clear)\n            }\n       \/\/ Your game UI components here (e.g., grid view, reset display)...\n        }\n        .padding()\n\n        \/\/ This triggers AI moves at intervals when AI is playing\n        .onReceive(timer) { _ in\n            if isAIPlaying {\n                viewModel.executeAIMove()\n            }\n        }\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">import<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">SwiftUI<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">struct<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">GameView<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">View <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">@<\/span><span style=\"color: #C792EA\">ObservedObject<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> viewModel <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">GameViewModel<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> tileSize: CGFloat <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">80<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> padding: CGFloat <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">8<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">@<\/span><span style=\"color: #C792EA\">State<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> isAIPlaying <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FF9CAC\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">@<\/span><span style=\"color: #C792EA\">State<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">private<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> isShowingOptimalDirection <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FF9CAC\">false<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">    <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Timer that triggers every 0.5 seconds<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">private<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> timer <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            Timer.<\/span><span style=\"color: #82AAFF\">publish<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">every<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.5<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF\">on<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> .main, <\/span><span style=\"color: #82AAFF\">in<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\">.common<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">.<\/span><span style=\"color: #82AAFF\">autoconnect<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> body: <\/span><span style=\"color: #F78C6C\">some<\/span><span style=\"color: #EEFFFF\"> View <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #82AAFF\">VStack<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">            <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Your game UI components here (score display)...<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #82AAFF\">HStack<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #82AAFF\">Button<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">action<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    isAIPlaying.<\/span><span style=\"color: #82AAFF\">toggle<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF\">})<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    <\/span><span style=\"color: #82AAFF\">HStack<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                     <\/span><span style=\"color: #82AAFF\">Image<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">systemName<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                                 isAIPlaying <\/span><span style=\"color: #89DDFF\">?<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">checkmark.square<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">square<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                            .<\/span><span style=\"color: #82AAFF\">resizable<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                            .<\/span><span style=\"color: #82AAFF\">frame<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">width<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">24<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF\">height<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">24<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                                                   <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                      <\/span><span style=\"color: #82AAFF\">Text<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">isAIPlaying <\/span><span style=\"color: #89DDFF\">?<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">AI Stop<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">AI Play<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                     <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                .<\/span><span style=\"color: #82AAFF\">padding<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> viewModel.isGameOver <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #82AAFF\">Text<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">viewModel.isGameOver  <\/span><span style=\"color: #89DDFF\">?<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Game Over<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\"> ___ <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    .<\/span><span style=\"color: #82AAFF\">font<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">.title<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    .<\/span><span style=\"color: #82AAFF\">foregroundColor<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">viewModel.isGameOver  <\/span><span style=\"color: #89DDFF\">?<\/span><span style=\"color: #EEFFFF\"> .red <\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> .clear<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">       <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Your game UI components here (e.g., grid view, reset display)...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        .<\/span><span style=\"color: #82AAFF\">padding<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        <\/span><span style=\"color: #545454; font-style: italic\">\/\/ This triggers AI moves at intervals when AI is playing<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        .<\/span><span style=\"color: #82AAFF\">onReceive<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">timer<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\"> _ <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> isAIPlaying <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">                viewModel.<\/span><span style=\"color: #82AAFF\">executeAIMove<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u043e\u0442 \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">expectimax<\/mark><\/code> \u043f\u043e\u0438\u0441\u043a \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0445\u043e\u0434\u0430:<\/span><\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/1.gif\"><img loading=\"lazy\" decoding=\"async\" width=\"364\" height=\"738\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/1.gif\" alt=\"\" class=\"wp-image-16029\"\/><\/a><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/4.gif\"><img loading=\"lazy\" decoding=\"async\" width=\"364\" height=\"738\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/4.gif\" alt=\"\" class=\"wp-image-16032\"\/><\/a><\/figure>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/5.gif\"><img loading=\"lazy\" decoding=\"async\" width=\"364\" height=\"738\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/5.gif\" alt=\"\" class=\"wp-image-16031\"\/><\/a><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/6.gif\"><img loading=\"lazy\" decoding=\"async\" width=\"364\" height=\"738\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/6.gif\" alt=\"\" class=\"wp-image-16030\"\/><\/a><\/figure>\n<\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\"><strong>\u0428\u0410\u0413 19. \u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 evaluate()<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.11.16.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"178\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.11.16-1024x178.png\" alt=\"\" class=\"wp-image-15991\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.11.16-1024x178.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.11.16-300x52.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.11.16-768x134.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.11.16-500x87.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-16-at-18.11.16.png 1390w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.02.31.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"777\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.02.31-1024x777.png\" alt=\"\" class=\"wp-image-15993\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.02.31-1024x777.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.02.31-300x228.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.02.31-768x582.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.02.31-396x300.png 396w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.02.31.png 1366w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(2 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>func monotonicity (_ grid: [&#91;Int&#93;]) -> Double {\n        func calculateMonotonicity(values: &#91;Int&#93;) -> (Double, Double) {\n            var increasing = 0.0\n            var decreasing = 0.0\n            var current = 0\n            \/\/ Skip over any initial zeros in the row\/column\n            while current &lt; values.count &amp;&amp; values&#91;current&#93; == 0 {\n                current += 1\n            }\n            var next = current + 1\n            while next &lt; values.count {\n                \/\/ Skip over any zeros in the middle\n                while next &lt; values.count &amp;&amp; values&#91;next&#93; == 0 {\n                    next += 1\n                }\n                if next &lt; values.count {\n                    let currentValue = values&#91;current&#93; != 0 ?    \n                                          log2(Double(values&#91;current&#93;)) : 0\n                    let nextValue = values&#91;next&#93; != 0 ? \n                                          log2(Double(values&#91;next&#93;)) : 0\n                    if currentValue > nextValue {\n                        decreasing += nextValue - currentValue\n                    } else if currentValue &lt; nextValue {\n                        increasing += currentValue - nextValue\n                    }\n                    \/\/ Move to the next non-zero tile\n                    current = next\n                    next += 1\n                }\n            }\n            return (increasing, decreasing)\n        }\n        var rowMonotonicity = (increasing: 0.0, decreasing: 0.0)\n        var colMonotonicity = (increasing: 0.0, decreasing: 0.0)\n        \/\/ Check row monotonicity (left-right)\n        for row in grid {\n            let (increasing, decreasing) = calculateMonotonicity(values: row)\n            rowMonotonicity.increasing += increasing\n            rowMonotonicity.decreasing += decreasing\n         }\n        \/\/ Check column monotonicity (up-down)\n        for col in 0..&lt;grid&#91;0&#93;.count {\n            let columnValues = grid.map { $0&#91;col&#93; }\n            let (increasing, decreasing) = \n                                  calculateMonotonicity(values: columnValues)\n            colMonotonicity.increasing += increasing\n            colMonotonicity.decreasing += decreasing\n        }\n        return max(rowMonotonicity.increasing, rowMonotonicity.decreasing) +\n               max(colMonotonicity.increasing, colMonotonicity.decreasing)\n    }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">monotonicity<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">_<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">grid<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #FFCB6B\">Int<\/span><span style=\"color: #89DDFF\">&#93;])<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">calculateMonotonicity<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF; font-style: italic\">values<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #FFCB6B\">Int<\/span><span style=\"color: #89DDFF\">&#93;)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> increasing <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> decreasing <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> current <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">            <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Skip over any initial zeros in the row\/column<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">while<\/span><span style=\"color: #EEFFFF\"> current <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #EEFFFF\"> values.count <\/span><span style=\"color: #89DDFF\">&amp;&amp;<\/span><span style=\"color: #EEFFFF\"> values<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">current<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                current <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> next <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> current <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">while<\/span><span style=\"color: #EEFFFF\"> next <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #EEFFFF\"> values.count <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">                <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Skip over any zeros in the middle<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF; font-style: italic\">while<\/span><span style=\"color: #EEFFFF\"> next <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #EEFFFF\"> values.count <\/span><span style=\"color: #89DDFF\">&amp;&amp;<\/span><span style=\"color: #EEFFFF\"> values<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">next<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    next <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> next <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #EEFFFF\"> values.count <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> currentValue <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> values<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">current<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">!=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">?<\/span><span style=\"color: #EEFFFF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                                          <\/span><span style=\"color: #82AAFF\">log2<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">values<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">current<\/span><span style=\"color: #89DDFF\">&#93;))<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> nextValue <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> values<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">next<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">!=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">?<\/span><span style=\"color: #EEFFFF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                                          <\/span><span style=\"color: #82AAFF\">log2<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">values<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">next<\/span><span style=\"color: #89DDFF\">&#93;))<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> currentValue <\/span><span style=\"color: #89DDFF\">&gt;<\/span><span style=\"color: #EEFFFF\"> nextValue <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                        decreasing <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> nextValue <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> currentValue<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">else<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> currentValue <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #EEFFFF\"> nextValue <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                        increasing <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> currentValue <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> nextValue<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">                    <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Move to the next non-zero tile<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    current <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> next<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    next <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">increasing, decreasing<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> rowMonotonicity <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">increasing<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF\">decreasing<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.0<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> colMonotonicity <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">increasing<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF\">decreasing<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.0<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Check row monotonicity (left-right)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> row <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> grid <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">increasing, decreasing<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">calculateMonotonicity<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">values<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> row<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            rowMonotonicity.increasing <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> increasing<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            rowMonotonicity.decreasing <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> decreasing<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">         <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Check column monotonicity (up-down)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> col <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">..&lt;<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">.count <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> columnValues <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> grid.<\/span><span style=\"color: #82AAFF\">map<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\"> $0<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">col<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">increasing, decreasing<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                                  <\/span><span style=\"color: #82AAFF\">calculateMonotonicity<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">values<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> columnValues<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            colMonotonicity.increasing <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> increasing<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            colMonotonicity.decreasing <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> decreasing<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">max<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">rowMonotonicity.increasing, rowMonotonicity.decreasing<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">               <\/span><span style=\"color: #82AAFF\">max<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">colMonotonicity.increasing, colMonotonicity.decreasing<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.14.23.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"324\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.14.23-1024x324.png\" alt=\"\" class=\"wp-image-15994\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.14.23-1024x324.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.14.23-300x95.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.14.23-768x243.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.14.23-500x158.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.14.23.png 1376w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(2 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>func smoothness(_ grid: [&#91;Int&#93;]) -> Double {\n      var smoothness: Double = 0\n      for row in 0..&lt;4 {\n          for col in 0..&lt;4 {\n              if grid&#91;row&#93;&#91;col&#93; != 0 {\n                 let value = Double(grid&#91;row&#93;&#91;col&#93;)\n                 if col &lt; 3 &amp;&amp; grid&#91;row&#93;&#91;col+1&#93; != 0 {\n                     smoothness -= abs(value - Double(grid&#91;row&#93;&#91;col+1&#93;))\n                 }\n                 if row &lt; 3 &amp;&amp; grid&#91;row+1&#93;&#91;col&#93; != 0 {\n                      smoothness -= abs(value - Double(grid&#91;row+1&#93;&#91;col&#93;))\n                 }\n              }\n          }\n      }\n       return smoothness\n  }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">smoothness<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">_<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">grid<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #FFCB6B\">Int<\/span><span style=\"color: #89DDFF\">&#93;])<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">      <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> smoothness: <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">      <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> row <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">..&lt;<\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">          <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> col <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">..&lt;<\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">              <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> grid<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">row<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">&#91;col&#93; <\/span><span style=\"color: #89DDFF\">!=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                 <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> value <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">row<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">&#91;col&#93;<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                 <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> col <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">3<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&amp;&amp;<\/span><span style=\"color: #EEFFFF\"> grid<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">row<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">&#91;col<\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #EEFFFF\">&#93; <\/span><span style=\"color: #89DDFF\">!=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                     smoothness <\/span><span style=\"color: #89DDFF\">-=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">abs<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">value <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">row<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">&#91;col<\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><span style=\"color: #89DDFF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                 <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                 <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> row <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">3<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&amp;&amp;<\/span><span style=\"color: #EEFFFF\"> grid<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">row<\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">&#91;col&#93; <\/span><span style=\"color: #89DDFF\">!=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                      smoothness <\/span><span style=\"color: #89DDFF\">-=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">abs<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">value <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">row<\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">&#91;col&#93;<\/span><span style=\"color: #89DDFF\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                 <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">              <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">          <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">      <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">       <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> smoothness<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">  <\/span><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.35.48.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"291\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.35.48-1024x291.png\" alt=\"\" class=\"wp-image-15995\" style=\"width:614px;height:auto\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.35.48-1024x291.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.35.48-300x85.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.35.48-768x218.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.35.48-500x142.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.35.48.png 1394w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(1 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>func emptyTileCount(_ board: [&#91;Tile&#93;]) -> Int {\n    return board.flatMap { $0 }.filter { $0.value == 0 }.count\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">emptyTileCount<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">_<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">board<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #EEFFFF\">Tile<\/span><span style=\"color: #89DDFF\">&#93;])<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Int<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> board.<\/span><span style=\"color: #82AAFF\">flatMap<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\"> $0 <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\">.<\/span><span style=\"color: #82AAFF\">filter<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\"> $0.value <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\">.count<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.36.45.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"277\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.36.45-1024x277.png\" alt=\"\" class=\"wp-image-15996\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.36.45-1024x277.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.36.45-300x81.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.36.45-768x207.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.36.45-500x135.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.36.45.png 1348w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(1 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>func maxTileInCorner(_ board: [&#91;Tile&#93;]) -> Double {\n    let maxTile = board.flatMap { $0 }.max(by: { $0.value &lt; $1.value })?.value ?? 0\n    let cornerTiles = [\n        board&#91;0&#93;&#91;0&#93;, board&#91;0&#93;&#91;3&#93;,\n        board&#91;3&#93;&#91;0&#93;, board&#91;3&#93;&#91;3&#93;\n    ]\n    return cornerTiles.contains(where: { $0.value == maxTile }) ? 1.0 : 0.0\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">maxTileInCorner<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">_<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">board<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #EEFFFF\">Tile<\/span><span style=\"color: #89DDFF\">&#93;])<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> maxTile <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> board.<\/span><span style=\"color: #82AAFF\">flatMap<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\"> $0 <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\">.<\/span><span style=\"color: #82AAFF\">max<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">by<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\"> $0.value <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #EEFFFF\"> $1.value <\/span><span style=\"color: #89DDFF\">})?<\/span><span style=\"color: #EEFFFF\">.value <\/span><span style=\"color: #89DDFF\">??<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> cornerTiles <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        board<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">&#91;<\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">&#93;, board<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">&#91;<\/span><span style=\"color: #F78C6C\">3<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        board<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #F78C6C\">3<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">&#91;<\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">&#93;, board<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #F78C6C\">3<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">&#91;<\/span><span style=\"color: #F78C6C\">3<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> cornerTiles.<\/span><span style=\"color: #82AAFF\">contains<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">where<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\"> $0.value <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> maxTile <\/span><span style=\"color: #89DDFF\">})<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">?<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1.0<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" style=\"font-size:17px;text-transform:none\"><strong>\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u044d\u0432\u0440\u0438\u0441\u0442\u0438\u043a \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0446\u0435\u043d\u043a\u0438 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0434\u043e\u0441\u043a\u0438 evaluate()<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.38.56.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"205\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.38.56-1024x205.png\" alt=\"\" class=\"wp-image-15999\" style=\"width:654px;height:auto\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.38.56-1024x205.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.38.56-300x60.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.38.56-768x154.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.38.56-500x100.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-13.38.56.png 1380w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(2 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>func evaluateBoard(_ board: [&#91;Tile&#93;]) -> Double {\n    let emptyWeight = 2.7\n    let smoothnessWeight = 0.1\n    let monotonicityWeight = 1.0\n    let maxTileCornerWeight = 1.0\n\n    let emptyTilesScore = Double(emptyTileCount(board)) * emptyWeight\n    let smoothnessScore = smoothness(board) * smoothnessWeight\n    let monotonicityScore = monotonicity(board) * monotonicityWeight\n    let maxTileInCornerScore = maxTileInCorner(board) * maxTileCornerWeight\n    \n    return emptyTilesScore + smoothnessScore + monotonicityScore + maxTileInCornerScore\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">evaluateBoard<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">_<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">board<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #EEFFFF\">Tile<\/span><span style=\"color: #89DDFF\">&#93;])<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> emptyWeight <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">2.7<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> smoothnessWeight <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> monotonicityWeight <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> maxTileCornerWeight <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1.0<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> emptyTilesScore <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">emptyTileCount<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">board<\/span><span style=\"color: #89DDFF\">))<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> emptyWeight<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> smoothnessScore <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">smoothness<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">board<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> smoothnessWeight<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> monotonicityScore <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">monotonicity<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">board<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> monotonicityWeight<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> maxTileInCornerScore <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">maxTileInCorner<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">board<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> maxTileCornerWeight<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> emptyTilesScore <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> smoothnessScore <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> monotonicityScore <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> maxTileInCornerScore<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-14.58.18.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"643\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-14.58.18-1024x643.png\" alt=\"\" class=\"wp-image-16001\" style=\"width:614px;height:auto\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-14.58.18-1024x643.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-14.58.18-300x188.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-14.58.18-768x483.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-14.58.18-477x300.png 477w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-14.58.18.png 1356w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-14.58.47.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"615\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-14.58.47-1024x615.png\" alt=\"\" class=\"wp-image-16002\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-14.58.47-1024x615.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-14.58.47-300x180.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-14.58.47-768x461.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-14.58.47-500x300.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-14.58.47.png 1396w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\"><strong>\u0428\u0410\u0413 20. \u0413\u043b\u0430\u0434\u043a\u043e\u0441\u0442\u044c smoothness<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.01.18.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"168\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.01.18-1024x168.png\" alt=\"\" class=\"wp-image-16003\" style=\"width:616px;height:auto\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.01.18-1024x168.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.01.18-300x49.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.01.18-768x126.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.01.18-500x82.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.01.18.png 1404w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.04.29.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"455\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.04.29-1024x455.png\" alt=\"\" class=\"wp-image-16004\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.04.29-1024x455.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.04.29-300x133.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.04.29-768x341.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.04.29-500x222.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.04.29.png 1382w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.05.18.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"411\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.05.18-1024x411.png\" alt=\"\" class=\"wp-image-16005\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.05.18-1024x411.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.05.18-300x121.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.05.18-768x309.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.05.18-500x201.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.05.18.png 1394w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(2 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>func smoothness(board: [&#91;Tile&#93;]) -> Double {\n    var smoothnessScore = 0.0\n\n    \/\/ Iterate through each tile on the board\n    for row in 0..&lt;board.count {\n        for col in 0..&lt;board&#91;row&#93;.count {\n            let currentTile = board&#91;row&#93;&#91;col&#93;\n\n            \/\/ Skip empty tiles\n            if currentTile.value == 0 {\n                continue\n            }\n\n            \/\/ Compare with the tile to the right (horizontal neighbor)\n            if col + 1 &lt; board&#91;row&#93;.count {\n                let rightTile = board&#91;row&#93;&#91;col + 1&#93;\n                if rightTile.value != 0 {\n                    smoothnessScore -= abs(log2(Double(currentTile.value)) -           \n                                           log2(Double(rightTile.value)))\n                }\n            }\n\n            \/\/ Compare with the tile below (vertical neighbor)\n            if row + 1 &lt; board.count {\n                let belowTile = board&#91;row + 1&#93;&#91;col&#93;\n                if belowTile.value != 0 {\n                    smoothnessScore -= abs(log2(Double(currentTile.value)) -   \n                                           log2(Double(belowTile.value)))\n                }\n            }\n        }\n    }\n\n    return smoothnessScore\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">smoothness<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF; font-style: italic\">board<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #EEFFFF\">Tile<\/span><span style=\"color: #89DDFF\">&#93;])<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> smoothnessScore <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.0<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">    <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Iterate through each tile on the board<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> row <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">..&lt;<\/span><span style=\"color: #EEFFFF\">board.count <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> col <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">..&lt;<\/span><span style=\"color: #EEFFFF\">board<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">row<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">.count <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> currentTile <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> board<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">row<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">&#91;col&#93;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">            <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Skip empty tiles<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> currentTile.value <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF; font-style: italic\">continue<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">            <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Compare with the tile to the right (horizontal neighbor)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> col <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #EEFFFF\"> board<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">row<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">.count <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> rightTile <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> board<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">row<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">&#91;col <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> rightTile.value <\/span><span style=\"color: #89DDFF\">!=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    smoothnessScore <\/span><span style=\"color: #89DDFF\">-=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">abs<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">log2<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">currentTile.value<\/span><span style=\"color: #89DDFF\">))<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\">           <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                                           <\/span><span style=\"color: #82AAFF\">log2<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">rightTile.value<\/span><span style=\"color: #89DDFF\">)))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">            <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Compare with the tile below (vertical neighbor)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> row <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #EEFFFF\"> board.count <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> belowTile <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> board<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">row <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">&#91;col&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> belowTile.value <\/span><span style=\"color: #89DDFF\">!=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    smoothnessScore <\/span><span style=\"color: #89DDFF\">-=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">abs<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">log2<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">currentTile.value<\/span><span style=\"color: #89DDFF\">))<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\">   <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                                           <\/span><span style=\"color: #82AAFF\">log2<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">belowTile.value<\/span><span style=\"color: #89DDFF\">)))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> smoothnessScore<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.07.09.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"667\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.07.09-1024x667.png\" alt=\"\" class=\"wp-image-16006\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.07.09-1024x667.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.07.09-300x195.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.07.09-768x500.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.07.09-461x300.png 461w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.07.09.png 1376w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.07.17.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"165\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.07.17-1024x165.png\" alt=\"\" class=\"wp-image-16007\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.07.17-1024x165.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.07.17-300x48.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.07.17-768x124.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.07.17-500x81.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.07.17.png 1352w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(1 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>let smoothnessScore = smoothness(board)<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> smoothnessScore <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">smoothness<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">board<\/span><span style=\"color: #89DDFF\">)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.07.24.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"186\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.07.24-1024x186.png\" alt=\"\" class=\"wp-image-16008\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.07.24-1024x186.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.07.24-300x55.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.07.24-768x140.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.07.24-500x91.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.07.24.png 1386w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\"><strong>\u0428\u0410\u0413 21. \u041c\u043e\u043d\u043e\u0442\u043e\u043d\u043d\u043e\u0441\u0442\u044c  monotonicity<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.42.34.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"166\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.42.34-1024x166.png\" alt=\"\" class=\"wp-image-16015\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.42.34-1024x166.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.42.34-300x49.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.42.34-768x124.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.42.34-500x81.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.42.34.png 1360w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.43.26.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"490\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.43.26-1024x490.png\" alt=\"\" class=\"wp-image-16016\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.43.26-1024x490.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.43.26-300x144.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.43.26-768x368.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.43.26-500x239.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.43.26.png 1370w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.44.17.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"530\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.44.17-1024x530.png\" alt=\"\" class=\"wp-image-16017\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.44.17-1024x530.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.44.17-300x155.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.44.17-768x397.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.44.17-500x259.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.44.17.png 1376w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(238, 255, 255, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>func monotonicity (_ grid: [&#91;Int&#93;]) -> Double {\n        func calculateMonotonicity(values: &#91;Int&#93;) -> (Double, Double) {\n            var increasing = 0.0\n            var decreasing = 0.0\n            var current = 0\n            \/\/ Skip over any initial zeros in the row\/column\n            while current &lt; values.count &amp;&amp; values&#91;current&#93; == 0 {\n                current += 1\n            }\n            var next = current + 1\n            while next &lt; values.count {\n                \/\/ Skip over any zeros in the middle\n                while next &lt; values.count &amp;&amp; values&#91;next&#93; == 0 {\n                    next += 1\n                }\n                if next &lt; values.count {\n                    let currentValue = values&#91;current&#93; != 0 ?            \n                                           log2(Double(values&#91;current&#93;)) : 0\n                    let nextValue = values&#91;next&#93; != 0 ? \n                                           log2(Double(values&#91;next&#93;)) : 0\n                    if currentValue > nextValue {\n                        decreasing += nextValue - currentValue\n                    } else if currentValue &lt; nextValue {\n                        increasing += currentValue - nextValue\n                    }\n                    \/\/ Move to the next non-zero tile\n                    current = next\n                    next += 1\n                }\n            }\n            return (increasing, decreasing)\n        }\n        var rowMonotonicity = (increasing: 0.0, decreasing: 0.0)\n        var colMonotonicity = (increasing: 0.0, decreasing: 0.0)\n        \/\/ Check row monotonicity (left-right)\n        for row in grid {\n            let (increasing, decreasing) = calculateMonotonicity(values: row)\n            rowMonotonicity.increasing += increasing\n            rowMonotonicity.decreasing += decreasing\n          \/\/  print (rowMonotonicity)\n        }\n        \/\/ Check column monotonicity (up-down)\n        for col in 0..&lt;grid&#91;0&#93;.count {\n            let columnValues = grid.map { $0&#91;col&#93; }\n            let (increasing, decreasing) = \n                               calculateMonotonicity(values: columnValues)\n            colMonotonicity.increasing += increasing\n            colMonotonicity.decreasing += decreasing\n         \/\/   print (colMonotonicity)\n        }\n        return max(rowMonotonicity.increasing, rowMonotonicity.decreasing) +\n               max(colMonotonicity.increasing, colMonotonicity.decreasing)\n    }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">monotonicity<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">_<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">grid<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #FFCB6B\">Int<\/span><span style=\"color: #89DDFF\">&#93;])<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">calculateMonotonicity<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF; font-style: italic\">values<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #FFCB6B\">Int<\/span><span style=\"color: #89DDFF\">&#93;)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> increasing <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> decreasing <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> current <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">            <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Skip over any initial zeros in the row\/column<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">while<\/span><span style=\"color: #EEFFFF\"> current <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #EEFFFF\"> values.count <\/span><span style=\"color: #89DDFF\">&amp;&amp;<\/span><span style=\"color: #EEFFFF\"> values<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">current<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                current <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> next <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> current <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">while<\/span><span style=\"color: #EEFFFF\"> next <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #EEFFFF\"> values.count <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">                <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Skip over any zeros in the middle<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF; font-style: italic\">while<\/span><span style=\"color: #EEFFFF\"> next <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #EEFFFF\"> values.count <\/span><span style=\"color: #89DDFF\">&amp;&amp;<\/span><span style=\"color: #EEFFFF\"> values<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">next<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    next <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> next <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #EEFFFF\"> values.count <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> currentValue <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> values<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">current<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">!=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">?<\/span><span style=\"color: #EEFFFF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                                           <\/span><span style=\"color: #82AAFF\">log2<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">values<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">current<\/span><span style=\"color: #89DDFF\">&#93;))<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> nextValue <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> values<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">next<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">!=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">?<\/span><span style=\"color: #EEFFFF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                                           <\/span><span style=\"color: #82AAFF\">log2<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">values<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">next<\/span><span style=\"color: #89DDFF\">&#93;))<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> currentValue <\/span><span style=\"color: #89DDFF\">&gt;<\/span><span style=\"color: #EEFFFF\"> nextValue <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                        decreasing <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> nextValue <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> currentValue<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">else<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> currentValue <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #EEFFFF\"> nextValue <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                        increasing <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> currentValue <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> nextValue<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">                    <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Move to the next non-zero tile<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    current <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> next<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    next <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">increasing, decreasing<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> rowMonotonicity <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">increasing<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF\">decreasing<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.0<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> colMonotonicity <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">increasing<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF\">decreasing<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.0<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Check row monotonicity (left-right)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> row <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> grid <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">increasing, decreasing<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">calculateMonotonicity<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">values<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> row<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            rowMonotonicity.increasing <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> increasing<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            rowMonotonicity.decreasing <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> decreasing<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">          <\/span><span style=\"color: #545454; font-style: italic\">\/\/  print (rowMonotonicity)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Check column monotonicity (up-down)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> col <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">..&lt;<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">.count <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> columnValues <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> grid.<\/span><span style=\"color: #82AAFF\">map<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\"> $0<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">col<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">increasing, decreasing<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">                               <\/span><span style=\"color: #82AAFF\">calculateMonotonicity<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">values<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> columnValues<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            colMonotonicity.increasing <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> increasing<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            colMonotonicity.decreasing <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> decreasing<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">         <\/span><span style=\"color: #545454; font-style: italic\">\/\/   print (colMonotonicity)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">max<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">rowMonotonicity.increasing, rowMonotonicity.decreasing<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">               <\/span><span style=\"color: #82AAFF\">max<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">colMonotonicity.increasing, colMonotonicity.decreasing<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.49.56.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"548\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.49.56-1024x548.png\" alt=\"\" class=\"wp-image-16019\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.49.56-1024x548.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.49.56-300x161.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.49.56-768x411.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.49.56-500x268.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.49.56.png 1360w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.50.11.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"621\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.50.11-1024x621.png\" alt=\"\" class=\"wp-image-16020\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.50.11-1024x621.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.50.11-300x182.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.50.11-768x466.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.50.11-495x300.png 495w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.50.11.png 1388w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.50.36.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"610\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.50.36-1024x610.png\" alt=\"\" class=\"wp-image-16021\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.50.36-1024x610.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.50.36-300x179.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.50.36-768x458.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.50.36-500x298.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.50.36.png 1376w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(1 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>let monotonicityScore = monotonicity(board)<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> monotonicityScore <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">monotonicity<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">board<\/span><span style=\"color: #89DDFF\">)<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.52.23.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"139\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.52.23-1024x139.png\" alt=\"\" class=\"wp-image-16022\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.52.23-1024x139.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.52.23-300x41.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.52.23-768x104.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.52.23-500x68.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.52.23.png 1382w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" style=\"font-size:18px;text-transform:none\"><strong>\u0412\u0435\u0440\u0441\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 monotonicity1 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432\u044b\u0441\u0448\u0435\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.57.19.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"76\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.57.19-1024x76.png\" alt=\"\" class=\"wp-image-16023\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.57.19-1024x76.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.57.19-300x22.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.57.19-768x57.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.57.19-500x37.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-15.57.19.png 1370w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(2 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>func monotonicity1(_ board: [&#91;Int&#93;]) -> Double {\n        \/\/ The same as monotonicity2\n        \n        let grid:[&#91;Int&#93;] = board.map{$0.map{ $0 != 0 ? \n                                                  Int(log2(Double($0))): 0}}\n        func monotonicityScore(_ arr: &#91;Int&#93;) -> (Double, Double) {\n            let arrNonZero = arr.filter { $0 != 0 }\n    \n            let increasingScore = zip(arrNonZero, arrNonZero.dropFirst())\n                    .filter {$0 >= $1}.map {Double($1 - $0) }.reduce(0.0, +)\n            let decreasingScore = zip(arrNonZero, arrNonZero.dropFirst())\n                    .filter {$0 &lt;= $1}.map {Double($0 - $1) }.reduce(0.0, +)\n            return (increasingScore, decreasingScore)\n        }\n        \n        let rowScores = grid.map(monotonicityScore)\n        let rowIncreasing = rowScores.map {$0.0}\n        let rowDecreasing = rowScores.map {$0.1}\n        \n        let columns = (0..&lt;grid&#91;0&#93;.count).map { col in grid.map { $0&#91;col&#93; } }\n        let columnScores = columns.map(monotonicityScore)\n        let columnIncreasing = columnScores.map {$0.0}\n        let columnDecreasing = columnScores.map {$0.1}\n        \n        let totalScore = max (rowIncreasing.reduce(0.0, +), \n                              rowDecreasing.reduce(0.0, +)) + \n                         max (columnIncreasing.reduce(0.0, +),\n                              columnDecreasing.reduce(0.0, +))\n        return totalScore\n    }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">monotonicity1<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">_<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">board<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #FFCB6B\">Int<\/span><span style=\"color: #89DDFF\">&#93;])<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        <\/span><span style=\"color: #545454; font-style: italic\">\/\/ The same as monotonicity2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> grid:<\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #FFCB6B\">Int<\/span><span style=\"color: #89DDFF\">&#93;]<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> board.<\/span><span style=\"color: #82AAFF\">map<\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\">$0.<\/span><span style=\"color: #82AAFF\">map<\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\"> $0 <\/span><span style=\"color: #89DDFF\">!=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">?<\/span><span style=\"color: #EEFFFF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                                                  <\/span><span style=\"color: #FFCB6B\">Int<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">log2<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">$0<\/span><span style=\"color: #89DDFF\">))):<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">}}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">monotonicityScore<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">_<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">arr<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #FFCB6B\">Int<\/span><span style=\"color: #89DDFF\">&#93;)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> arrNonZero <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> arr.<\/span><span style=\"color: #82AAFF\">filter<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\"> $0 <\/span><span style=\"color: #89DDFF\">!=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> increasingScore <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">zip<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">arrNonZero, arrNonZero.<\/span><span style=\"color: #82AAFF\">dropFirst<\/span><span style=\"color: #89DDFF\">())<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    .<\/span><span style=\"color: #82AAFF\">filter<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\">$0 <\/span><span style=\"color: #89DDFF\">&gt;=<\/span><span style=\"color: #EEFFFF\"> $1<\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\">.<\/span><span style=\"color: #82AAFF\">map<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">$1 <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> $0<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\">.<\/span><span style=\"color: #82AAFF\">reduce<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">0.0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #89DDFF\">+)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> decreasingScore <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">zip<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">arrNonZero, arrNonZero.<\/span><span style=\"color: #82AAFF\">dropFirst<\/span><span style=\"color: #89DDFF\">())<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    .<\/span><span style=\"color: #82AAFF\">filter<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\">$0 <\/span><span style=\"color: #89DDFF\">&lt;=<\/span><span style=\"color: #EEFFFF\"> $1<\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\">.<\/span><span style=\"color: #82AAFF\">map<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">$0 <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> $1<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\">.<\/span><span style=\"color: #82AAFF\">reduce<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">0.0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #89DDFF\">+)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">increasingScore, decreasingScore<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> rowScores <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> grid.<\/span><span style=\"color: #82AAFF\">map<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">monotonicityScore<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> rowIncreasing <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> rowScores.<\/span><span style=\"color: #82AAFF\">map<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\">$0.0<\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> rowDecreasing <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> rowScores.<\/span><span style=\"color: #82AAFF\">map<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\">$0.1<\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> columns <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">..&lt;<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">.count<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">.<\/span><span style=\"color: #82AAFF\">map<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\"> col <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> grid.<\/span><span style=\"color: #82AAFF\">map<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\"> $0<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">col<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> columnScores <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> columns.<\/span><span style=\"color: #82AAFF\">map<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">monotonicityScore<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> columnIncreasing <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> columnScores.<\/span><span style=\"color: #82AAFF\">map<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\">$0.0<\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> columnDecreasing <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> columnScores.<\/span><span style=\"color: #82AAFF\">map<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\">$0.1<\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> totalScore <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">max<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">rowIncreasing.<\/span><span style=\"color: #82AAFF\">reduce<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">0.0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #89DDFF\">+)<\/span><span style=\"color: #EEFFFF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                              rowDecreasing.<\/span><span style=\"color: #82AAFF\">reduce<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">0.0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #89DDFF\">+))<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                         <\/span><span style=\"color: #82AAFF\">max<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">columnIncreasing.<\/span><span style=\"color: #82AAFF\">reduce<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">0.0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #89DDFF\">+)<\/span><span style=\"color: #EEFFFF\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                              columnDecreasing.<\/span><span style=\"color: #82AAFF\">reduce<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">0.0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #89DDFF\">+))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> totalScore<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-20.33.55.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"667\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-20.33.55-1024x667.png\" alt=\"\" class=\"wp-image-16024\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-20.33.55-1024x667.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-20.33.55-300x195.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-20.33.55-768x500.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-20.33.55-461x300.png 461w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-20.33.55.png 1382w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-20.34.04.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"168\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-20.34.04-1024x168.png\" alt=\"\" class=\"wp-image-16025\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-20.34.04-1024x168.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-20.34.04-300x49.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-20.34.04-768x126.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-20.34.04-500x82.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-20.34.04.png 1364w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(3 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\n\/\/ Test case for strictly increasing row monotonicity\n        func testIncreasingRowMonotonicity() {\n            let grid = [\n                &#91;2, 4, 8, 16&#93;,\n                &#91;8, 16, 0, 32&#93;,\n                &#91;32, 16, 64, 8&#93;,\n                &#91;8, 16, 32, 64&#93;\n            ]\n            let result = aiGame.monotonicity(grid)\n            XCTAssertEqual(result, -9.0, \n                      \"Monotonicity score for increasing row is incorrect.\")\n            let result2 = aiGame.monotonicity2(grid)\n            XCTAssertEqual(result2, -9.0, \n                       \"Monotonicity score for increasing row is incorrect.\")\n            let result1 = aiGame.monotonicity1(grid)\n            XCTAssertEqual(result1, -9.0, \n                       \"Monotonicity score for increasing row is incorrect.\")\n        }\n\n\n\/\/ Test case for monotonicity in rows\n        func testColumnMonotonicity1() {\n            let grid = [\n                &#91;2, 4, 8, 16&#93;,\n                &#91;4, 8, 16, 32&#93;,\n                &#91;2, 0, 2, 0&#93;,\n                &#91;0, 4, 8, 16&#93;\n            ]\n            let result = aiGame.monotonicity(grid)\n            XCTAssertEqual(result, -7.0, \n                   \"Monotonicity score for increasing column is incorrect.\")\n            let result2 = aiGame.monotonicity2(grid)\n            XCTAssertEqual(result2, -6.0, \n                      \"Monotonicity score for increasing row is incorrect.\")\n            let result1 = aiGame.monotonicity1(grid)\n            XCTAssertEqual(result1, -6.0, \n                      \"Monotonicity score for increasing row is incorrect.\")\n        }\n    \n    \/\/ Test case for strictly decreasing row monotonicity\n        func testDecreasingRowMonotonicity() {\n            let grid = [\n                &#91;16, 8, 4, 2&#93;,\n                &#91;4, 0, 2, 0&#93;,\n                &#91;8, 4, 0, 0&#93;,\n                &#91;32, 4, 8, 16&#93;\n            ]\n            let result = aiGame.monotonicity(grid)\n            XCTAssertEqual(result, -6, \n                      \"Monotonicity score for decreasing row is incorrect.\")\n            let result2 = aiGame.monotonicity2(grid)\n            XCTAssertEqual(result2, -6, \n                      \"Monotonicity score for increasing row is incorrect.\")\n            let result1 = aiGame.monotonicity1(grid)\n            XCTAssertEqual(result1, -6, \n                      \"Monotonicity score for increasing row is incorrect.\")\n        }\n    \n    \/\/ Test case for mixed values row\n        func testMixedRowMonotonicity() {\n            let grid = [\n                &#91;2, 16, 4, 8&#93;,\n                &#91;0, 0, 0, 0&#93;,\n                &#91;0, 0, 0, 0&#93;,\n                &#91;0, 0, 0, 0&#93;\n            ]\n            let result = aiGame.monotonicity(grid)\n            XCTAssertEqual(result, -2.0, \n                            \"Monotonicity score for mixed row is incorrect.\")\n            let result2 = aiGame.monotonicity2(grid)\n            XCTAssertEqual(result2, -2.0, \n                      \"Monotonicity score for increasing row is incorrect.\")\n            let result1 = aiGame.monotonicity1(grid)\n            XCTAssertEqual(result1, -2.0, \n                      \"Monotonicity score for increasing row is incorrect.\")\n        }\n    \n    \/\/ Test case for monotonicity in columns\n        func testColumnMonotonicity() {\n            let grid = [\n                &#91;2, 8, 0, 0&#93;,\n                &#91;4, 16, 0, 0&#93;,\n                &#91;0, 0, 0, 0&#93;,\n                &#91;16, 32, 0, 0&#93;\n            ]\n            let result = aiGame.monotonicity(grid)\n            XCTAssertEqual(result, -5.0, \n                   \"Monotonicity score for increasing column is incorrect.\")\n            let result2 = aiGame.monotonicity2(grid)\n            XCTAssertEqual(result2, 0.0, \n                      \"Monotonicity score for increasing row is incorrect.\")\n            let result1 = aiGame.monotonicity1(grid)\n            XCTAssertEqual(result1, 0.0, \n                      \"Monotonicity score for increasing row is incorrect.\")\n        }\n    \n    \/\/ Test case for penalty when zeros are present\n       func testZerosPenaltyMonotonicity() {\n           let grid = [\n               &#91;2, 0, 8, 16&#93;,\n               &#91;4, 0, 0, 0&#93;,\n               &#91;0, 0, 0, 4&#93;,\n               &#91;0, 0, 0, 0&#93;\n           ]\n           let result = aiGame.monotonicity(grid)\n           XCTAssertEqual(result, -3.0, \n                             \"Monotonicity score should penalize zeros.\")\n           let result2 = aiGame.monotonicity2(grid)\n           XCTAssertEqual(result2, -1.0, \n                       \"Monotonicity score for increasing row is incorrect.\")\n           let result1 = aiGame.monotonicity1(grid)\n           XCTAssertEqual(result1, -1.0, \n                       \"Monotonicity score for increasing row is incorrect.\")\n       }\n    \n    \/\/ Test case for empty grid\n        func testEmptyGridMonotonicity() {\n            let grid = [\n                &#91;0, 0, 0, 0&#93;,\n                &#91;0, 0, 0, 0&#93;,\n                &#91;0, 0, 0, 0&#93;,\n                &#91;0, 0, 0, 0&#93;\n            ]\n            let result = aiGame.monotonicity(grid)\n            XCTAssertEqual(result, 0.0, \n                          \"Monotonicity score for empty grid is incorrect.\")\n            let result2 = aiGame.monotonicity2(grid)\n            XCTAssertEqual(result2, 0.0, \n                      \"Monotonicity score for increasing row is incorrect.\")\n            let result1 = aiGame.monotonicity1(grid)\n            XCTAssertEqual(result1, 0.0, \n                      \"Monotonicity score for increasing row is incorrect.\")\n        }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #545454; font-style: italic\">\/\/ Test case for strictly increasing row monotonicity<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">testIncreasingRowMonotonicity<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> grid <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                &#91;<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">8<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">16<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                &#91;<\/span><span style=\"color: #F78C6C\">8<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">16<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">32<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                &#91;<\/span><span style=\"color: #F78C6C\">32<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">16<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">64<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">8<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                &#91;<\/span><span style=\"color: #F78C6C\">8<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">16<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">32<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">64<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> result <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> aiGame.<\/span><span style=\"color: #82AAFF\">monotonicity<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #82AAFF\">XCTAssertEqual<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">result, <\/span><span style=\"color: #F78C6C\">-9.0<\/span><span style=\"color: #EEFFFF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                      <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Monotonicity score for increasing row is incorrect.<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> result2 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> aiGame.<\/span><span style=\"color: #82AAFF\">monotonicity2<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #82AAFF\">XCTAssertEqual<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">result2, <\/span><span style=\"color: #F78C6C\">-9.0<\/span><span style=\"color: #EEFFFF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                       <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Monotonicity score for increasing row is incorrect.<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> result1 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> aiGame.<\/span><span style=\"color: #82AAFF\">monotonicity1<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #82AAFF\">XCTAssertEqual<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">result1, <\/span><span style=\"color: #F78C6C\">-9.0<\/span><span style=\"color: #EEFFFF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                       <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Monotonicity score for increasing row is incorrect.<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #545454; font-style: italic\">\/\/ Test case for monotonicity in rows<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">testColumnMonotonicity1<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> grid <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                &#91;<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">8<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">16<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                &#91;<\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">8<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">16<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">32<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                &#91;<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                &#91;<\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">8<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">16<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> result <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> aiGame.<\/span><span style=\"color: #82AAFF\">monotonicity<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #82AAFF\">XCTAssertEqual<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">result, <\/span><span style=\"color: #F78C6C\">-7.0<\/span><span style=\"color: #EEFFFF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                   <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Monotonicity score for increasing column is incorrect.<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> result2 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> aiGame.<\/span><span style=\"color: #82AAFF\">monotonicity2<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #82AAFF\">XCTAssertEqual<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">result2, <\/span><span style=\"color: #F78C6C\">-6.0<\/span><span style=\"color: #EEFFFF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                      <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Monotonicity score for increasing row is incorrect.<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> result1 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> aiGame.<\/span><span style=\"color: #82AAFF\">monotonicity1<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #82AAFF\">XCTAssertEqual<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">result1, <\/span><span style=\"color: #F78C6C\">-6.0<\/span><span style=\"color: #EEFFFF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                      <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Monotonicity score for increasing row is incorrect.<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">    <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Test case for strictly decreasing row monotonicity<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">testDecreasingRowMonotonicity<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> grid <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                &#91;<\/span><span style=\"color: #F78C6C\">16<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">8<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                &#91;<\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                &#91;<\/span><span style=\"color: #F78C6C\">8<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                &#91;<\/span><span style=\"color: #F78C6C\">32<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">8<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">16<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> result <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> aiGame.<\/span><span style=\"color: #82AAFF\">monotonicity<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #82AAFF\">XCTAssertEqual<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">result, <\/span><span style=\"color: #F78C6C\">-6<\/span><span style=\"color: #EEFFFF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                      <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Monotonicity score for decreasing row is incorrect.<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> result2 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> aiGame.<\/span><span style=\"color: #82AAFF\">monotonicity2<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #82AAFF\">XCTAssertEqual<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">result2, <\/span><span style=\"color: #F78C6C\">-6<\/span><span style=\"color: #EEFFFF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                      <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Monotonicity score for increasing row is incorrect.<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> result1 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> aiGame.<\/span><span style=\"color: #82AAFF\">monotonicity1<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #82AAFF\">XCTAssertEqual<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">result1, <\/span><span style=\"color: #F78C6C\">-6<\/span><span style=\"color: #EEFFFF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                      <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Monotonicity score for increasing row is incorrect.<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">    <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Test case for mixed values row<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">testMixedRowMonotonicity<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> grid <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                &#91;<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">16<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">8<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                &#91;<\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                &#91;<\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                &#91;<\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> result <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> aiGame.<\/span><span style=\"color: #82AAFF\">monotonicity<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #82AAFF\">XCTAssertEqual<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">result, <\/span><span style=\"color: #F78C6C\">-2.0<\/span><span style=\"color: #EEFFFF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                            <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Monotonicity score for mixed row is incorrect.<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> result2 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> aiGame.<\/span><span style=\"color: #82AAFF\">monotonicity2<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #82AAFF\">XCTAssertEqual<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">result2, <\/span><span style=\"color: #F78C6C\">-2.0<\/span><span style=\"color: #EEFFFF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                      <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Monotonicity score for increasing row is incorrect.<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> result1 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> aiGame.<\/span><span style=\"color: #82AAFF\">monotonicity1<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #82AAFF\">XCTAssertEqual<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">result1, <\/span><span style=\"color: #F78C6C\">-2.0<\/span><span style=\"color: #EEFFFF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                      <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Monotonicity score for increasing row is incorrect.<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">    <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Test case for monotonicity in columns<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">testColumnMonotonicity<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> grid <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                &#91;<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">8<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                &#91;<\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">16<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                &#91;<\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                &#91;<\/span><span style=\"color: #F78C6C\">16<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">32<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> result <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> aiGame.<\/span><span style=\"color: #82AAFF\">monotonicity<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #82AAFF\">XCTAssertEqual<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">result, <\/span><span style=\"color: #F78C6C\">-5.0<\/span><span style=\"color: #EEFFFF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                   <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Monotonicity score for increasing column is incorrect.<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> result2 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> aiGame.<\/span><span style=\"color: #82AAFF\">monotonicity2<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #82AAFF\">XCTAssertEqual<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">result2, <\/span><span style=\"color: #F78C6C\">0.0<\/span><span style=\"color: #EEFFFF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                      <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Monotonicity score for increasing row is incorrect.<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> result1 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> aiGame.<\/span><span style=\"color: #82AAFF\">monotonicity1<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #82AAFF\">XCTAssertEqual<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">result1, <\/span><span style=\"color: #F78C6C\">0.0<\/span><span style=\"color: #EEFFFF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                      <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Monotonicity score for increasing row is incorrect.<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">    <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Test case for penalty when zeros are present<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">       <\/span><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">testZerosPenaltyMonotonicity<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">           <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> grid <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">               &#91;<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">8<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">16<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">               &#91;<\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">               &#91;<\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">               &#91;<\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">           ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">           <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> result <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> aiGame.<\/span><span style=\"color: #82AAFF\">monotonicity<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">           <\/span><span style=\"color: #82AAFF\">XCTAssertEqual<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">result, <\/span><span style=\"color: #F78C6C\">-3.0<\/span><span style=\"color: #EEFFFF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                             <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Monotonicity score should penalize zeros.<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">           <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> result2 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> aiGame.<\/span><span style=\"color: #82AAFF\">monotonicity2<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">           <\/span><span style=\"color: #82AAFF\">XCTAssertEqual<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">result2, <\/span><span style=\"color: #F78C6C\">-1.0<\/span><span style=\"color: #EEFFFF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                       <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Monotonicity score for increasing row is incorrect.<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">           <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> result1 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> aiGame.<\/span><span style=\"color: #82AAFF\">monotonicity1<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">           <\/span><span style=\"color: #82AAFF\">XCTAssertEqual<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">result1, <\/span><span style=\"color: #F78C6C\">-1.0<\/span><span style=\"color: #EEFFFF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                       <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Monotonicity score for increasing row is incorrect.<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">       <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">    <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Test case for empty grid<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">testEmptyGridMonotonicity<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> grid <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                &#91;<\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                &#91;<\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                &#91;<\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                &#91;<\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> result <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> aiGame.<\/span><span style=\"color: #82AAFF\">monotonicity<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #82AAFF\">XCTAssertEqual<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">result, <\/span><span style=\"color: #F78C6C\">0.0<\/span><span style=\"color: #EEFFFF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                          <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Monotonicity score for empty grid is incorrect.<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> result2 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> aiGame.<\/span><span style=\"color: #82AAFF\">monotonicity2<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #82AAFF\">XCTAssertEqual<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">result2, <\/span><span style=\"color: #F78C6C\">0.0<\/span><span style=\"color: #EEFFFF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                      <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Monotonicity score for increasing row is incorrect.<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> result1 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> aiGame.<\/span><span style=\"color: #82AAFF\">monotonicity1<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #82AAFF\">XCTAssertEqual<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">result1, <\/span><span style=\"color: #F78C6C\">0.0<\/span><span style=\"color: #EEFFFF\">, <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                      <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Monotonicity score for increasing row is incorrect.<\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-21.06.21.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"156\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-21.06.21-1024x156.png\" alt=\"\" class=\"wp-image-16033\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-21.06.21-1024x156.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-21.06.21-300x46.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-21.06.21-768x117.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-21.06.21-500x76.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-21.06.21.png 1364w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\"><strong>\u0428\u0410\u0413 21 \u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u043c\u043e\u043d\u043e\u0442\u043e\u043d\u043d\u043e\u0441\u0442\u044c\u044e Monotonicity \u0438 \u201c\u0433\u043b\u0430\u0434\u043a\u043e\u0441\u0442\u044c\u044e\u201d Smoothness.&nbsp;<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-21.07.52.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"161\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-21.07.52-1024x161.png\" alt=\"\" class=\"wp-image-16034\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-21.07.52-1024x161.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-21.07.52-300x47.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-21.07.52-768x121.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-21.07.52-500x78.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-17-at-21.07.52.png 1376w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-10.10.36.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"660\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-10.10.36-1024x660.png\" alt=\"\" class=\"wp-image-16039\" style=\"width:614px;height:auto\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-10.10.36-1024x660.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-10.10.36-300x193.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-10.10.36-768x495.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-10.10.36-466x300.png 466w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-10.10.36.png 1378w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-10.10.49.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"743\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-10.10.49-1024x743.png\" alt=\"\" class=\"wp-image-16040\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-10.10.49-1024x743.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-10.10.49-300x218.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-10.10.49-768x557.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-10.10.49-414x300.png 414w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-10.10.49.png 1368w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-10.11.10.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"435\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-10.11.10-1024x435.png\" alt=\"\" class=\"wp-image-16041\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-10.11.10-1024x435.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-10.11.10-300x127.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-10.11.10-768x326.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-10.11.10-500x212.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-10.11.10.png 1370w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.29.55.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"624\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.29.55-1024x624.png\" alt=\"\" class=\"wp-image-16042\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.29.55-1024x624.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.29.55-300x183.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.29.55-768x468.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.29.55-492x300.png 492w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.29.55.png 1470w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.32.30.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"119\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.32.30-1024x119.png\" alt=\"\" class=\"wp-image-16043\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.32.30-1024x119.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.32.30-300x35.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.32.30-768x89.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.32.30-500x58.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.32.30.png 1398w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(1 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&#91;64, 32, 16, 8&#93;\n&#91;32, 16, 8, 4&#93;\n&#91;16, 8, 4, 2&#93;\n&#91;8, 4, 2, 0&#93;<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #EEFFFF\">&#91;<\/span><span style=\"color: #F78C6C\">64<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">32<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">16<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">8<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">&#91;<\/span><span style=\"color: #F78C6C\">32<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">16<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">8<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">&#91;<\/span><span style=\"color: #F78C6C\">16<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">8<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">&#91;<\/span><span style=\"color: #F78C6C\">8<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.43.41.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"266\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.43.41-1024x266.png\" alt=\"\" class=\"wp-image-16044\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.43.41-1024x266.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.43.41-300x78.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.43.41-768x200.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.43.41-500x130.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.43.41.png 1408w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(1 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&#91;16, 16, 8, 8&#93;\n&#91;8, 8, 4, 4&#93;\n&#91;4, 4, 2, 2&#93;\n&#91;2, 2, 0, 0&#93;<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #EEFFFF\">&#91;<\/span><span style=\"color: #F78C6C\">16<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">16<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">8<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">8<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">&#91;<\/span><span style=\"color: #F78C6C\">8<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">8<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">&#91;<\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">&#91;<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.44.36.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"579\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.44.36-1024x579.png\" alt=\"\" class=\"wp-image-16045\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.44.36-1024x579.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.44.36-300x170.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.44.36-768x434.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.44.36-500x283.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-11.44.36.png 1372w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\"><strong>\u0428\u0410\u0413 22. \u042d\u0432\u0440\u0438\u0441\u0442\u0438\u043a\u0430 \u0432 \u0432\u0438\u0434\u0435 Snake (\u0417\u043c\u0435\u044f) \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0414\u0432\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0434\u043e\u0441\u043a\u0438 \u0432 \u0432\u0438\u0434\u0435 <strong>Snake<\/strong> \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435:<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdYk5iRC-GAgzNZaTewLu9p9MnUhAORXMl2v_Y5FiOL_itl5d-XyNJUQrqTEOqMqS6jwI4Iw5FG9s72d9vIuhcXCijxjpccqiLmcoZq_Zojs7kppMfzgQBkjTvQfaOutXznkHpTDCAKZRBXkYoWgU43YsA?key=w5NuDZeiHz-JjML98dOHbA\" width=\"669\" height=\"339\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXc4uakpHjvpmaqS2S_o0tYBZHSVb1Hf9ZvhlsVpZUUzMivbPHJ8dgBEOB8cCS_aR7LJM2fik5Cib0wYu5ecB4w3F7XYdXxmUoQo2RU3oqI0TaVUCVnrCnXiO_gx34xaskwYRDUooHSAArNck_dkB4O4LqIx?key=w5NuDZeiHz-JjML98dOHbA\" width=\"272\" height=\"252\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0432\u0435\u0441\u043e\u0432 \u0434\u043b\u044f <strong>Snake<\/strong> \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u0438\u0433\u0440\u044b 2048<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-12.08.42.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"197\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-12.08.42-1024x197.png\" alt=\"\" class=\"wp-image-16046\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-12.08.42-1024x197.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-12.08.42-300x58.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-12.08.42-768x148.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-12.08.42-500x96.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-12.08.42.png 1436w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.21.56.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"273\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.21.56-1024x273.png\" alt=\"\" class=\"wp-image-16048\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.21.56-1024x273.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.21.56-300x80.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.21.56-768x205.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.21.56-500x133.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.21.56.png 1380w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.22.18.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"545\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.22.18-1024x545.png\" alt=\"\" class=\"wp-image-16049\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.22.18-1024x545.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.22.18-300x160.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.22.18-768x409.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.22.18-500x266.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.22.18.png 1382w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.22.27-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"484\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.22.27-1-1024x484.png\" alt=\"\" class=\"wp-image-16050\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.22.27-1-1024x484.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.22.27-1-300x142.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.22.27-1-768x363.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.22.27-1-500x237.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.22.27-1.png 1374w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(1 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&#91;15, 14, 13, 12&#93;\n&#91;8,  9,  10, 11&#93;\n&#91;7,  6,  5,  4&#93;\n&#91;0,  1,  2,  3&#93;<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #EEFFFF\">&#91;<\/span><span style=\"color: #F78C6C\">15<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">14<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">13<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">12<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">&#91;<\/span><span style=\"color: #F78C6C\">8<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #F78C6C\">9<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #F78C6C\">10<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">11<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">&#91;<\/span><span style=\"color: #F78C6C\">7<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #F78C6C\">6<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #F78C6C\">5<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">&#91;<\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #F78C6C\">3<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.26.35.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"304\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.26.35-1024x304.png\" alt=\"\" class=\"wp-image-16051\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.26.35-1024x304.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.26.35-300x89.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.26.35-768x228.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.26.35-500x148.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.26.35.png 1374w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(2 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>func snakeHeuristic(_ board: [&#91;Tile&#93;]) -> Double {\n    \/\/ Snake pattern score weights for each tile position\n    let snakePattern: [&#91;Double&#93;] = [\n        &#91;15, 14, 13, 12&#93;,\n        &#91;8,  9,  10, 11&#93;,\n        &#91;7,  6,  5,  4&#93;,\n        &#91;0,  1,  2,  3&#93;\n    ]\n    \n    var score = 0.0\n\n    \/\/ Evaluate how well the board follows the snake pattern\n    for row in 0..&lt;4 {\n        for col in 0..&lt;4 {\n            let tileValue = board&#91;row&#93;&#91;col&#93;.value\n            if tileValue > 0 {\n            score += Double(log2(Double(tileValue))) * snakePattern&#91;row&#93;&#91;col&#93;\n            }\n        }\n    }\n\n    return score\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">snakeHeuristic<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">_<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">board<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #EEFFFF\">Tile<\/span><span style=\"color: #89DDFF\">&#93;])<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">    <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Snake pattern score weights for each tile position<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> snakePattern: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">&#93;]<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        &#91;<\/span><span style=\"color: #F78C6C\">15<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">14<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">13<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">12<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        &#91;<\/span><span style=\"color: #F78C6C\">8<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #F78C6C\">9<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #F78C6C\">10<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">11<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        &#91;<\/span><span style=\"color: #F78C6C\">7<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #F78C6C\">6<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #F78C6C\">5<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        &#91;<\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #F78C6C\">3<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> score <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.0<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">    <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Evaluate how well the board follows the snake pattern<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> row <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">..&lt;<\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> col <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">..&lt;<\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> tileValue <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> board<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">row<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">&#91;col&#93;.value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> tileValue <\/span><span style=\"color: #89DDFF\">&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            score <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">log2<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">tileValue<\/span><span style=\"color: #89DDFF\">)))<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> snakePattern<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">row<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">&#91;col&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> score<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-19.17.15.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"391\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-19.17.15-1024x391.png\" alt=\"\" class=\"wp-image-16143\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-19.17.15-1024x391.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-19.17.15-300x115.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-19.17.15-768x293.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-19.17.15-500x191.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-19.17.15.png 1372w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(238, 255, 255, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>func evaluateBoard(_ board: [&#91;Tile&#93;]) -> Double {\n        let monotonicityWeight = 1.0\n        let smoothnessWeight = 0.1\n        let emptyTilesWeight = 5.7\n        let maxTileWeight = 0.5\n\n        let emptyTilesCount = \n               Double(board.flatMap{$0}.filter{$0.value == 0}.count)\n              \n        return monotonicity(board) * monotonicityWeight +\n               smoothness(board) * smoothnessWeight +\n               emptyTilesCount * emptyTilesWeight +\n               maxTileInCorne() * maxTileWeight +\n               snakeHeuristic (board)\n    }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">evaluateBoard<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">_<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">board<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #EEFFFF\">Tile<\/span><span style=\"color: #89DDFF\">&#93;])<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> monotonicityWeight <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> smoothnessWeight <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> emptyTilesWeight <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">5.7<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> maxTileWeight <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.5<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> emptyTilesCount <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">               <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">board.<\/span><span style=\"color: #82AAFF\">flatMap<\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\">$0<\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\">.<\/span><span style=\"color: #82AAFF\">filter<\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\">$0.value <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\">.count<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">              <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">monotonicity<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">board<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> monotonicityWeight <\/span><span style=\"color: #89DDFF\">+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">               <\/span><span style=\"color: #82AAFF\">smoothness<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">board<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> smoothnessWeight <\/span><span style=\"color: #89DDFF\">+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">               emptyTilesCount <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> emptyTilesWeight <\/span><span style=\"color: #89DDFF\">+<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">               <\/span><span style=\"color: #82AAFF\">maxTileInCorne<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> maxTileWeight <\/span><span style=\"color: #89DDFF\">+<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">               <\/span><span style=\"color: #82AAFF\">snakeHeuristic<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">board<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.29.11.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"397\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.29.11-1024x397.png\" alt=\"\" class=\"wp-image-16053\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.29.11-1024x397.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.29.11-300x116.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.29.11-768x298.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.29.11-500x194.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.29.11.png 1394w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.29.35.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"460\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.29.35-1024x460.png\" alt=\"\" class=\"wp-image-16054\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.29.35-1024x460.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.29.35-300x135.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.29.35-768x345.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.29.35-500x225.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.29.35.png 1380w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(1 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>&#91;2^15, 2^14, 2^13, 2^12&#93;\n&#91;2^8,  2^9,  2^10, 2^11&#93;\n&#91;2^7,  2^6,  2^5,  2^4&#93;\n&#91;2^0,  2^1,  2^2,  2^3&#93;<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #EEFFFF\">&#91;<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">^<\/span><span style=\"color: #F78C6C\">15<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">^<\/span><span style=\"color: #F78C6C\">14<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">^<\/span><span style=\"color: #F78C6C\">13<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">^<\/span><span style=\"color: #F78C6C\">12<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">&#91;<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">^<\/span><span style=\"color: #F78C6C\">8<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">^<\/span><span style=\"color: #F78C6C\">9<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">^<\/span><span style=\"color: #F78C6C\">10<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">^<\/span><span style=\"color: #F78C6C\">11<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">&#91;<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">^<\/span><span style=\"color: #F78C6C\">7<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">^<\/span><span style=\"color: #F78C6C\">6<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">^<\/span><span style=\"color: #F78C6C\">5<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">^<\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">&#91;<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">^<\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">^<\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">^<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">^<\/span><span style=\"color: #F78C6C\">3<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.30.31.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"198\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.30.31-1024x198.png\" alt=\"\" class=\"wp-image-16055\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.30.31-1024x198.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.30.31-300x58.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.30.31-768x148.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.30.31-500x97.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.30.31.png 1408w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(1 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>let snakePattern: [&#91;Double&#93;] = [\n    &#91;pow(2, 15), pow(2, 14), pow(2, 13), pow(2, 12)&#93;,\n    &#91;pow(2, 8),  pow(2, 9),  pow(2, 10), pow(2, 11)&#93;,\n    &#91;pow(2, 7),  pow(2, 6),  pow(2, 5),  pow(2, 4)&#93;,\n    &#91;pow(2, 0),  pow(2, 1),  pow(2, 2),  pow(2, 3)&#93;\n]<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> snakePattern: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">&#93;]<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    &#91;<\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">15<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">14<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">13<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">12<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    &#91;<\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">8<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">9<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">10<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">11<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    &#91;<\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">7<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">6<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">5<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    &#91;<\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">3<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">]<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.31.52.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"268\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.31.52-1024x268.png\" alt=\"\" class=\"wp-image-16056\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.31.52-1024x268.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.31.52-300x78.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.31.52-768x201.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.31.52-500x131.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.31.52.png 1378w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(2 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>func snakeHeuristic(_ board: [&#91;Tile&#93;]) -> Double {\n    \/\/ Snake pattern score weights for each tile position based on powers of 2\n    let snakePattern: [&#91;Double&#93;] = [\n        &#91;pow(2, 15), pow(2, 14), pow(2, 13), pow(2, 12)&#93;,\n        &#91;pow(2, 8),  pow(2, 9),  pow(2, 10), pow(2, 11)&#93;,\n        &#91;pow(2, 7),  pow(2, 6),  pow(2, 5),  pow(2, 4)&#93;,\n        &#91;pow(2, 0),  pow(2, 1),  pow(2, 2),  pow(2, 3)&#93;\n    ]\n    \n    var score = 0.0\n\n    \/\/ Evaluate how well the board follows the snake pattern\n    for row in 0..&lt;4 {\n        for col in 0..&lt;4 {\n            let tileValue = board&#91;row&#93;&#91;col&#93;.value\n                score += Double(tileValue) * snakePattern&#91;row&#93;&#91;col&#93;\n        }\n    }\n\n    return score\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">snakeHeuristic<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">_<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">board<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #EEFFFF\">Tile<\/span><span style=\"color: #89DDFF\">&#93;])<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">    <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Snake pattern score weights for each tile position based on powers of 2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> snakePattern: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">&#93;]<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        &#91;<\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">15<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">14<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">13<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">12<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        &#91;<\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">8<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">9<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">10<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">11<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        &#91;<\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">7<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">6<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">5<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">&#93;,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        &#91;<\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">,  <\/span><span style=\"color: #82AAFF\">pow<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #F78C6C\">3<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    ]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> score <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.0<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">    <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Evaluate how well the board follows the snake pattern<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> row <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">..&lt;<\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> col <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">..&lt;<\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> tileValue <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> board<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">row<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">&#91;col&#93;.value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                score <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">tileValue<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> snakePattern<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">row<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">&#91;col&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> score<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.33.21.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"733\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.33.21-1024x733.png\" alt=\"\" class=\"wp-image-16057\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.33.21-1024x733.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.33.21-300x215.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.33.21-768x550.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.33.21-419x300.png 419w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.33.21.png 1392w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.33.29.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"257\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.33.29-1024x257.png\" alt=\"\" class=\"wp-image-16058\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.33.29-1024x257.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.33.29-300x75.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.33.29-768x193.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.33.29-500x126.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-18-at-17.33.29.png 1384w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u043e\u0442 \u043d\u0430\u0448\u0430 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">evaluate() <\/mark><\/code>\u0444\u0443\u043d\u043a\u0446\u0438\u044f:<\/span><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(2 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\nfunc evaluateBoard (_ board: [&#91;Tile&#93;]) -> Double {\n        let grid = board.map {$0.map{$0.value}}\n        let emptyCells = board.flatMap { $0 }.filter { $0.value == 0 }.count\n               let smoothWeight: Double = 0.1\n            let monoWeight: Double = 1.0\n            let emptyWeight: Double = 5.7\n            let maxWeight: Double = 1.0\n         \/\/   let maxTileCornerWeight = 1.0\n        \n                return monoWeight *  monotonicity(grid)\n                 + smoothWeight * smoothness(grid)\n                 + emptyWeight * Double(emptyCells)\n                 + maxWeight * Double(grid.flatMap { $0 }.max() ?? 0)\n             \/\/    + maxTileCornerWeight * maxTileInCorner(board)\n                 + snakeHeuristic(grid)\n     }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">evaluateBoard<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">_<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">board<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #EEFFFF\">Tile<\/span><span style=\"color: #89DDFF\">&#93;])<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> grid <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> board.<\/span><span style=\"color: #82AAFF\">map<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\">$0.<\/span><span style=\"color: #82AAFF\">map<\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\">$0.value<\/span><span style=\"color: #89DDFF\">}}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> emptyCells <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> board.<\/span><span style=\"color: #82AAFF\">flatMap<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\"> $0 <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\">.<\/span><span style=\"color: #82AAFF\">filter<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\"> $0.value <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\">.count<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">               <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> smoothWeight: <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> monoWeight: <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> emptyWeight: <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">5.7<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> maxWeight: <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">         <\/span><span style=\"color: #545454; font-style: italic\">\/\/   let maxTileCornerWeight = 1.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> monoWeight <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\">  <\/span><span style=\"color: #82AAFF\">monotonicity<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                 <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> smoothWeight <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">smoothness<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                 <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> emptyWeight <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">emptyCells<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                 <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> maxWeight <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid.<\/span><span style=\"color: #82AAFF\">flatMap<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\"> $0 <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\">.<\/span><span style=\"color: #82AAFF\">max<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">??<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">             <\/span><span style=\"color: #545454; font-style: italic\">\/\/    + maxTileCornerWeight * maxTileInCorner(board)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                 <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">snakeHeuristic<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">     <\/span><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\"><strong>\u0428\u0410\u0413 23. \u041c\u0435\u0442\u043e\u0434 Monte Carlo \u043a\u0430\u043a \u0418\u0418 \u0434\u043b\u044f \u0438\u0433\u0440\u044b 2048<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-19-at-13.11.30.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"187\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-19-at-13.11.30-1024x187.png\" alt=\"\" class=\"wp-image-16063\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-19-at-13.11.30-1024x187.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-19-at-13.11.30-300x55.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-19-at-13.11.30-768x140.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-19-at-13.11.30-500x91.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-19-at-13.11.30.png 1382w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.30.27.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"173\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.30.27-1024x173.png\" alt=\"\" class=\"wp-image-16096\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.30.27-1024x173.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.30.27-300x51.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.30.27-768x130.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.30.27-500x85.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.30.27.png 1396w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.31.28.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"690\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.31.28-1024x690.png\" alt=\"\" class=\"wp-image-16097\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.31.28-1024x690.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.31.28-300x202.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.31.28-768x518.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.31.28-445x300.png 445w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.31.28.png 1368w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(238, 255, 255, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>func monteCarloSearch(board: [&#91;Tile&#93;], simulations: Int, depth: Int) -> Direction {\n        var bestDirection: Direction = .up\n        var bestScore: Double = -Double.infinity\n        \n        \/\/ Iterate over all possible moves\n        for direction in Direction.allCases {\n            var totalScore: Double = 0\n            \n            \/\/ Simulate a number of games for each move\n            for _ in 0..&lt;simulations {\n                var gameBoard = GameViewModel(matrix: board)\n                let (moved, _) = gameBoard.slide(direction)\n                if moved {\n                    \/\/ Play a random game starting from this move\n                  let score = randomGame(board: gameBoard.tiles, depth: depth)\n                    totalScore += score\n                }\n            }\n            \n            \/\/ Calculate the average score for this move\n            let averageScore = totalScore \/ Double(simulations)\n            \n            \/\/ Select the move with the highest average score\n            if averageScore > bestScore {\n                bestScore = averageScore\n                bestDirection = direction\n            }\n        }\n        \n        return bestDirection\n    }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">monteCarloSearch<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF; font-style: italic\">board<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #EEFFFF\">Tile<\/span><span style=\"color: #89DDFF\">&#93;]<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF; font-style: italic\">simulations<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #FFCB6B\">Int<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF; font-style: italic\">depth<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #FFCB6B\">Int<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> Direction <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> bestDirection: Direction <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> .up<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> bestScore: <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\">.infinity<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Iterate over all possible moves<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> direction <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> Direction.allCases <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> totalScore: <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">            <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Simulate a number of games for each move<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> _ <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">..&lt;<\/span><span style=\"color: #EEFFFF\">simulations <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> gameBoard <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">GameViewModel<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">matrix<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> board<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">moved, _<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> gameBoard.<\/span><span style=\"color: #82AAFF\">slide<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">direction<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> moved <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">                    <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Play a random game starting from this move<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">                  <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> score <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">randomGame<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">board<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> gameBoard.tiles, <\/span><span style=\"color: #82AAFF\">depth<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> depth<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    totalScore <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> score<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">            <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Calculate the average score for this move<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> averageScore <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> totalScore <\/span><span style=\"color: #89DDFF\">\/<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">simulations<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">            <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Select the move with the highest average score<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> averageScore <\/span><span style=\"color: #89DDFF\">&gt;<\/span><span style=\"color: #EEFFFF\"> bestScore <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                bestScore <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> averageScore<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                bestDirection <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> direction<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> bestDirection<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.32.15.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"191\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.32.15-1024x191.png\" alt=\"\" class=\"wp-image-16098\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.32.15-1024x191.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.32.15-300x56.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.32.15-768x143.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.32.15-500x93.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.32.15.png 1364w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#abb2bf;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(134, 167, 228, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282c34\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#abb2bf;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>func randomGame(board:[&#91;Tile&#93;], depth: Int) -> Double{\n        var moves = 0\n        var gameBoard = GameViewModel(matrix:board)\n\n       \/\/ Play until no more moves or reach max depth\n        while !isGameOver(gameBoard.tiles) &amp;&amp; moves &lt; depth {\n           let randomMove = Direction.allCases.randomElement()!\n            gameBoard.move (randomMove)\n            moves += 1\n       }\n       \n       \/\/ Evaluate the board at the end of the game\n       return evaluateBoard(gameBoard.tiles)\n    }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki one-dark-pro\" style=\"background-color: #282c34\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C678DD\">func<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">randomGame<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF; font-style: italic\">board<\/span><span style=\"color: #ABB2BF\">:[&#91;Tile&#93;], <\/span><span style=\"color: #61AFEF; font-style: italic\">depth<\/span><span style=\"color: #ABB2BF\">: <\/span><span style=\"color: #E5C07B\">Int<\/span><span style=\"color: #ABB2BF\">) -&gt; <\/span><span style=\"color: #E5C07B\">Double<\/span><span style=\"color: #ABB2BF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> moves = <\/span><span style=\"color: #D19A66\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">var<\/span><span style=\"color: #ABB2BF\"> gameBoard = <\/span><span style=\"color: #61AFEF\">GameViewModel<\/span><span style=\"color: #ABB2BF\">(<\/span><span style=\"color: #61AFEF\">matrix<\/span><span style=\"color: #ABB2BF\">:board)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">       <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Play until no more moves or reach max depth<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">        <\/span><span style=\"color: #C678DD\">while<\/span><span style=\"color: #ABB2BF\"> !<\/span><span style=\"color: #61AFEF\">isGameOver<\/span><span style=\"color: #ABB2BF\">(gameBoard.<\/span><span style=\"color: #E06C75\">tiles<\/span><span style=\"color: #ABB2BF\">) &amp;&amp; moves &lt; depth {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">           <\/span><span style=\"color: #C678DD\">let<\/span><span style=\"color: #ABB2BF\"> randomMove = Direction.<\/span><span style=\"color: #E06C75\">allCases<\/span><span style=\"color: #ABB2BF\">.<\/span><span style=\"color: #61AFEF\">randomElement<\/span><span style=\"color: #ABB2BF\">()!<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">            gameBoard.<\/span><span style=\"color: #56B6C2\">move<\/span><span style=\"color: #ABB2BF\"> (randomMove)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #ABB2BF\">            moves += <\/span><span style=\"color: #D19A66\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">       }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">       <\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">       <\/span><span style=\"color: #7F848E; font-style: italic\">\/\/ Evaluate the board at the end of the game<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">       <\/span><span style=\"color: #C678DD\">return<\/span><span style=\"color: #ABB2BF\"> <\/span><span style=\"color: #61AFEF\">evaluateBoard<\/span><span style=\"color: #ABB2BF\">(gameBoard.<\/span><span style=\"color: #E06C75\">tiles<\/span><span style=\"color: #ABB2BF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ABB2BF\">    }<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.33.51.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"219\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.33.51-1024x219.png\" alt=\"\" class=\"wp-image-16099\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.33.51-1024x219.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.33.51-300x64.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.33.51-768x164.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.33.51-500x107.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-11.33.51.png 1384w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(1 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>func evaluateBoard(_ board: [&#91;Tile&#93;]) -> Double {\n    \/\/ Use a heuristic to evaluate the current state of the board\n    \/\/ For example: Sum of tiles, number of empty spaces, smoothness, monotonicity, etc.\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">evaluateBoard<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">_<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">board<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #EEFFFF\">Tile<\/span><span style=\"color: #89DDFF\">&#93;])<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">    <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Use a heuristic to evaluate the current state of the board<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">    <\/span><span style=\"color: #545454; font-style: italic\">\/\/ For example: Sum of tiles, number of empty spaces, smoothness, monotonicity, etc.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.15.24.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"215\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.15.24-1024x215.png\" alt=\"\" class=\"wp-image-16102\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.15.24-1024x215.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.15.24-300x63.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.15.24-768x161.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.15.24-500x105.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.15.24.png 1354w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.15.52.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"733\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.15.52-1024x733.png\" alt=\"\" class=\"wp-image-16103\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.15.52-1024x733.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.15.52-300x215.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.15.52-768x550.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.15.52-419x300.png 419w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.15.52.png 1394w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.16.22.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"422\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.16.22-1024x422.png\" alt=\"\" class=\"wp-image-16104\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.16.22-1024x422.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.16.22-300x124.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.16.22-768x316.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.16.22-500x206.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.16.22.png 1388w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\"><strong>\u0428\u0410\u0413 24. \u0423\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 Monte Carlo \u043a\u0430\u043a \u0418\u0418 \u0434\u043b\u044f \u0438\u0433\u0440\u044b 2048<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.18.47.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"180\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.18.47-1024x180.png\" alt=\"\" class=\"wp-image-16105\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.18.47-1024x180.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.18.47-300x53.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.18.47-768x135.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.18.47-500x88.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.18.47.png 1352w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.22.29.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"223\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.22.29-1024x223.png\" alt=\"\" class=\"wp-image-16108\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.22.29-1024x223.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.22.29-300x65.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.22.29-768x168.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.22.29-500x109.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.22.29.png 1402w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.22.12.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"728\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.22.12-1024x728.png\" alt=\"\" class=\"wp-image-16109\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.22.12-1024x728.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.22.12-300x213.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.22.12-768x546.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.22.12-422x300.png 422w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.22.12.png 1392w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(238, 255, 255, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>func biasedRandomGame(direction: Direction,board:[&#91;Tile&#93;], depth: Int) -> Double{\n        var moves = 0\n        var gameBoard = GameViewModel(matrix:board)\n       \n\/\/ Play until no more moves or reach max depth\n        while !isGameOver(gameBoard.tiles) &amp;&amp; moves &lt; depth {\n           let biasedMoves = biasedMoveSelection(board: gameBoard.tiles)\n           let randomMove = biasedMoves.randomElement()!\n            gameBoard.move (randomMove)\n            moves += 1\n       }\n       \n       \/\/ Evaluate the board at the end of the game\n       return evaluateBoard(gameBoard.tiles)\n    }\n\nfunc biasedMoveSelection(board: [&#91;Tile&#93;]) -> &#91;Direction&#93; {\n        var possibleMoves: &#91;Direction&#93; = []\n        \n        for direction in Direction.allCases {\n    \n            var gameBoard = GameViewModel(matrix:board)\n            let (moved, _) = gameBoard.slide(direction)\n            if moved {\n     \/\/ Prioritize moves that make the board smoother or merge tiles\n             if mergesTiles(gameBoard.tiles) || isBoardSmoother(gameBoard.tiles) {\n                    possibleMoves.append(direction)\n                } else {\n                    possibleMoves.append(direction)\n                }\n            }\n        }\n        \n        return possibleMoves.isEmpty ? Direction.allCases : possibleMoves\n    }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">biasedRandomGame<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF; font-style: italic\">direction<\/span><span style=\"color: #EEFFFF\">: Direction,<\/span><span style=\"color: #82AAFF; font-style: italic\">board<\/span><span style=\"color: #EEFFFF\">:<\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #EEFFFF\">Tile<\/span><span style=\"color: #89DDFF\">&#93;]<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF; font-style: italic\">depth<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #FFCB6B\">Int<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> moves <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> gameBoard <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">GameViewModel<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">matrix<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\">board<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">       <\/span><\/span>\n<span class=\"line\"><span style=\"color: #545454; font-style: italic\">\/\/ Play until no more moves or reach max depth<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">while<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">!<\/span><span style=\"color: #82AAFF\">isGameOver<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">gameBoard.tiles<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&amp;&amp;<\/span><span style=\"color: #EEFFFF\"> moves <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #EEFFFF\"> depth <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">           <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> biasedMoves <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">biasedMoveSelection<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">board<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> gameBoard.tiles<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">           <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> randomMove <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> biasedMoves.<\/span><span style=\"color: #82AAFF\">randomElement<\/span><span style=\"color: #89DDFF\">()!<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            gameBoard.<\/span><span style=\"color: #82AAFF\">move<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">randomMove<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            moves <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">       <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">       <\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">       <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Evaluate the board at the end of the game<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">       <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">evaluateBoard<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">gameBoard.tiles<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">biasedMoveSelection<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF; font-style: italic\">board<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #EEFFFF\">Tile<\/span><span style=\"color: #89DDFF\">&#93;])<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">Direction<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> possibleMoves: <\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">Direction<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> []<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> direction <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> Direction.allCases <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> gameBoard <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">GameViewModel<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">matrix<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\">board<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">moved, _<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> gameBoard.<\/span><span style=\"color: #82AAFF\">slide<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">direction<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> moved <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">     <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Prioritize moves that make the board smoother or merge tiles<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">             <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">mergesTiles<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">gameBoard.tiles<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">||<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">isBoardSmoother<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">gameBoard.tiles<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    possibleMoves.<\/span><span style=\"color: #82AAFF\">append<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">direction<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">else<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    possibleMoves.<\/span><span style=\"color: #82AAFF\">append<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">direction<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> possibleMoves.isEmpty <\/span><span style=\"color: #89DDFF\">?<\/span><span style=\"color: #EEFFFF\"> Direction.allCases <\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> possibleMoves<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.24.26.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"366\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.24.26-1024x366.png\" alt=\"\" class=\"wp-image-16110\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.24.26-1024x366.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.24.26-300x107.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.24.26-768x275.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.24.26-500x179.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.24.26.png 1392w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(238, 255, 255, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly> func randomGameWithEarlyStopping(board: [&#91;Tile&#93;], depth: Int, maxBadMoves: Int = 3) -> Double {\n        var moves = 0\n        var badMoves = 0\n        var gameBoard = GameViewModel(matrix:board)\n\n        \/\/ Play until no more moves or reach max depth\n         while !isGameOver(gameBoard.tiles) &amp;&amp; moves &lt; depth {\n            let randomMove = Direction.allCases.randomElement()!\n            let (moved, _) = gameBoard.slide( randomMove)\n            \n            if moved {\n                gameBoard.addNewTile()\n            } else {\n                badMoves += 1\n                if badMoves >= maxBadMoves {\n                    break\n                }\n            }\n            moves += 1\n        }\n        \n        return evaluateBoard(gameBoard.tiles)\n    }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">randomGameWithEarlyStopping<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF; font-style: italic\">board<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #EEFFFF\">Tile<\/span><span style=\"color: #89DDFF\">&#93;]<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF; font-style: italic\">depth<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #FFCB6B\">Int<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF; font-style: italic\">maxBadMoves<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #FFCB6B\">Int<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">3<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> moves <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> badMoves <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> gameBoard <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">GameViewModel<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">matrix<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\">board<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Play until no more moves or reach max depth<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">         <\/span><span style=\"color: #89DDFF; font-style: italic\">while<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">!<\/span><span style=\"color: #82AAFF\">isGameOver<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">gameBoard.tiles<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&amp;&amp;<\/span><span style=\"color: #EEFFFF\"> moves <\/span><span style=\"color: #89DDFF\">&lt;<\/span><span style=\"color: #EEFFFF\"> depth <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> randomMove <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> Direction.allCases.<\/span><span style=\"color: #82AAFF\">randomElement<\/span><span style=\"color: #89DDFF\">()!<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">moved, _<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> gameBoard.<\/span><span style=\"color: #82AAFF\">slide<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\"> randomMove<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> moved <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                gameBoard.<\/span><span style=\"color: #82AAFF\">addNewTile<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">else<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                badMoves <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> badMoves <\/span><span style=\"color: #89DDFF\">&gt;=<\/span><span style=\"color: #EEFFFF\"> maxBadMoves <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">                    <\/span><span style=\"color: #89DDFF; font-style: italic\">break<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            moves <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">evaluateBoard<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">gameBoard.tiles<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.28.32.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"379\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.28.32-1024x379.png\" alt=\"\" class=\"wp-image-16111\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.28.32-1024x379.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.28.32-300x111.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.28.32-768x284.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.28.32-500x185.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.28.32.png 1366w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(238, 255, 255, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>func monteCarloSearchWithDynamicSimulations(board: [&#91;Tile&#93;], maxSimulations: Int, depth: Int) -> Direction {\n    var bestDirection: Direction = .up\n    var bestScore: Double = -Double.infinity\n    \n    \/\/ Adjust simulations based on the number of empty tiles\n    let emptyTilesCount = board.flatMap{$0}.filter{$0.value == 0}.count\n    let simulations = max(1, maxSimulations - emptyTilesCount * 2)\n    \n    for direction in Direction.allCases {\n        var totalScore: Double = 0\n        \n        for _ in 0..&lt;simulations {\n            let gameBoard = GameViewModel(matrix: board)\n            let (moved, _ ) = gameBoard.slide( direction)\n            \n            if moved {\n                let score = randomGame(board:gameBoard.tiles, depth: depth)\n                totalScore += score\n            }\n        }\n        \n        let averageScore = totalScore \/ Double(simulations)\n        if averageScore > bestScore {\n            bestScore = averageScore\n            bestDirection = direction\n        }\n    }\n    \n    return bestDirection\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">monteCarloSearchWithDynamicSimulations<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF; font-style: italic\">board<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #EEFFFF\">Tile<\/span><span style=\"color: #89DDFF\">&#93;]<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF; font-style: italic\">maxSimulations<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #FFCB6B\">Int<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF; font-style: italic\">depth<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #FFCB6B\">Int<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> Direction <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> bestDirection: Direction <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> .up<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> bestScore: <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\">.infinity<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">    <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Adjust simulations based on the number of empty tiles<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> emptyTilesCount <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> board.<\/span><span style=\"color: #82AAFF\">flatMap<\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\">$0<\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\">.<\/span><span style=\"color: #82AAFF\">filter<\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\">$0.value <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\">.count<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> simulations <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">max<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #EEFFFF\">, maxSimulations <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> emptyTilesCount <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">2<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> direction <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> Direction.allCases <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> totalScore: <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> _ <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">..&lt;<\/span><span style=\"color: #EEFFFF\">simulations <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> gameBoard <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">GameViewModel<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">matrix<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> board<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">moved, _ <\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> gameBoard.<\/span><span style=\"color: #82AAFF\">slide<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\"> direction<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> moved <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> score <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">randomGame<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">board<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\">gameBoard.tiles, <\/span><span style=\"color: #82AAFF\">depth<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> depth<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                totalScore <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> score<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> averageScore <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> totalScore <\/span><span style=\"color: #89DDFF\">\/<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">simulations<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> averageScore <\/span><span style=\"color: #89DDFF\">&gt;<\/span><span style=\"color: #EEFFFF\"> bestScore <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            bestScore <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> averageScore<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            bestDirection <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> direction<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> bestDirection<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.34.15.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"306\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.34.15-1024x306.png\" alt=\"\" class=\"wp-image-16112\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.34.15-1024x306.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.34.15-300x90.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.34.15-768x230.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.34.15-500x149.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.34.15.png 1392w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(238, 255, 255, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>func runSimulationsParallel(board: [&#91;Tile&#93;], direction: Direction, simulations: Int, depth: Int) -> Double {\n    let queue = DispatchQueue.global(qos: .userInitiated)\n    let group = DispatchGroup()\n    var totalScore = 0.0\n    \n    for _ in 0..&lt;simulations {\n        queue.async(group: group) {\n           var gameBoard = GameViewModel(matrix: board)\n           let (moved, _) = gameBoard.slide(direction)\n            if moved {\n              let score = randomGame(board: gameBoard.tiles, depth: depth)\n                DispatchQueue.main.sync {\n                    totalScore += score\n                }\n            }\n        }\n    }\n    \n    group.wait()\n    return totalScore \/ Double(simulations)\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">runSimulationsParallel<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF; font-style: italic\">board<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #EEFFFF\">Tile<\/span><span style=\"color: #89DDFF\">&#93;]<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF; font-style: italic\">direction<\/span><span style=\"color: #EEFFFF\">: Direction, <\/span><span style=\"color: #82AAFF; font-style: italic\">simulations<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #FFCB6B\">Int<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF; font-style: italic\">depth<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #FFCB6B\">Int<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> queue <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> DispatchQueue.<\/span><span style=\"color: #82AAFF\">global<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">qos<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> .userInitiated<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> group <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">DispatchGroup<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> totalScore <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> _ <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">..&lt;<\/span><span style=\"color: #EEFFFF\">simulations <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">        queue.<\/span><span style=\"color: #82AAFF\">async<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">group<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> group<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">           <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> gameBoard <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">GameViewModel<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">matrix<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> board<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">           <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">moved, _<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> gameBoard.<\/span><span style=\"color: #82AAFF\">slide<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">direction<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> moved <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">              <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> score <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">randomGame<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">board<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> gameBoard.tiles, <\/span><span style=\"color: #82AAFF\">depth<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> depth<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">                DispatchQueue.main.<\/span><span style=\"color: #82AAFF\">sync<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">                    totalScore <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> score<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">    group.<\/span><span style=\"color: #82AAFF\">wait<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> totalScore <\/span><span style=\"color: #89DDFF\">\/<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">simulations<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.41.50.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"526\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.41.50-1024x526.png\" alt=\"\" class=\"wp-image-16115\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.41.50-1024x526.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.41.50-300x154.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.41.50-768x394.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.41.50-500x257.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.41.50.png 1344w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(1 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>func evaluateBoard(_ board: [&#91;Tile&#93;]) -> Double {\n    let smoothness = calculateSmoothness(board)\n    let monotonicity = calculateMonotonicity(board)\n    let emptySpaces = Double(getEmptyTiles(board).count)\n    \n    return smoothness + monotonicity + emptySpaces * 2\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">evaluateBoard<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">_<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #EEFFFF; font-style: italic\">board<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #EEFFFF\">Tile<\/span><span style=\"color: #89DDFF\">&#93;])<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> smoothness <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">calculateSmoothness<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">board<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> monotonicity <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">calculateMonotonicity<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">board<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> emptySpaces <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">getEmptyTiles<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">board<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\">.count<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> smoothness <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> monotonicity <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> emptySpaces <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.42.42.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"277\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.42.42-1024x277.png\" alt=\"\" class=\"wp-image-16116\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.42.42-1024x277.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.42.42-300x81.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.42.42-768x208.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.42.42-500x135.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.42.42.png 1374w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.43.17.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"579\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.43.17-1024x579.png\" alt=\"\" class=\"wp-image-16117\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.43.17-1024x579.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.43.17-300x170.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.43.17-768x434.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.43.17-500x283.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.43.17.png 1348w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\"><strong>\u0428\u0410\u0413 25. \u0421\u0434\u0435\u043b\u0430\u0439 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 <\/strong>runSimulationsParallel<strong> \u0441<\/strong> async await<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.48.20.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"796\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.48.20-1024x796.png\" alt=\"\" class=\"wp-image-16118\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.48.20-1024x796.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.48.20-300x233.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.48.20-768x597.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.48.20-386x300.png 386w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.48.20.png 1302w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.48.29.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"86\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.48.29-1024x86.png\" alt=\"\" class=\"wp-image-16119\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.48.29-1024x86.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.48.29-300x25.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.48.29-768x64.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.48.29-500x42.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.48.29.png 1382w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.50.00.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"372\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.50.00-1024x372.png\" alt=\"\" class=\"wp-image-16120\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.50.00-1024x372.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.50.00-300x109.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.50.00-768x279.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.50.00-500x182.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.50.00.png 1382w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(238, 255, 255, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>func runSimulationsParallel(board: [&#91;Tile&#93;], direction: Direction, simulations: Int, depth: Int) async -> Double {\n    var totalScore = 0.0\n    \n    \/\/ Create an array of tasks for parallel execution\n    await withTaskGroup(of: Double.self) { taskGroup in\n        for _ in 0..&lt;simulations {\n            taskGroup.addTask {\n               let gameBoard = Game(matrix: matrix)\n                let (moved, _) = gameBoard.slide(direction)\n                \n                if moved {\n                  let score = randomGame(board:gameBoard.tiles, depth: depth)\n                    return score\n                } else {\n                    return 0.0 \/\/ If no move is made, return a score of 0\n                }\n            }\n        }\n        \n        \/\/ Collect all the results from the tasks\n        for await score in taskGroup {\n            totalScore += score\n        }\n    }\n    \n    return totalScore \/ Double(simulations)\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">runSimulationsParallel<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF; font-style: italic\">board<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #EEFFFF\">Tile<\/span><span style=\"color: #89DDFF\">&#93;]<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF; font-style: italic\">direction<\/span><span style=\"color: #EEFFFF\">: Direction, <\/span><span style=\"color: #82AAFF; font-style: italic\">simulations<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #FFCB6B\">Int<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF; font-style: italic\">depth<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #FFCB6B\">Int<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C792EA\">async<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> totalScore <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">    <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Create an array of tasks for parallel execution<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">await<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">withTaskGroup<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">of<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\">.<\/span><span style=\"color: #F78C6C\">self<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\"> taskGroup <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> _ <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #89DDFF\">..&lt;<\/span><span style=\"color: #EEFFFF\">simulations <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">            taskGroup.<\/span><span style=\"color: #82AAFF\">addTask<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">               <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> gameBoard <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">Game<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">matrix<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> matrix<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">moved, _<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> gameBoard.<\/span><span style=\"color: #82AAFF\">slide<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">direction<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> moved <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                  <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> score <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">randomGame<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">board<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\">gameBoard.tiles, <\/span><span style=\"color: #82AAFF\">depth<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> depth<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> score<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">else<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.0<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #545454; font-style: italic\">\/\/ If no move is made, return a score of 0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Collect all the results from the tasks<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">await<\/span><span style=\"color: #EEFFFF\"> score <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> taskGroup <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            totalScore <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> score<\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> totalScore <\/span><span style=\"color: #89DDFF\">\/<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">simulations<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.54.18.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"872\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.54.18-1024x872.png\" alt=\"\" class=\"wp-image-16121\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.54.18-1024x872.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.54.18-300x256.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.54.18-768x654.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.54.18-352x300.png 352w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.54.18.png 1364w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.59.49.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"308\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.59.49-1024x308.png\" alt=\"\" class=\"wp-image-16122\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.59.49-1024x308.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.59.49-300x90.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.59.49-768x231.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.59.49-500x151.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-12.59.49.png 1368w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\"><strong>\u0428\u0410\u0413 26. \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c expectimax \u0441<\/strong> async await<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.03.27.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"149\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.03.27-1024x149.png\" alt=\"\" class=\"wp-image-16123\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.03.27-1024x149.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.03.27-300x44.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.03.27-768x112.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.03.27-500x73.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.03.27.png 1400w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.03.36.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"368\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.03.36-1024x368.png\" alt=\"\" class=\"wp-image-16124\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.03.36-1024x368.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.03.36-300x108.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.03.36-768x276.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.03.36-500x180.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.03.36.png 1376w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.06.16.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"821\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.06.16-1024x821.png\" alt=\"\" class=\"wp-image-16125\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.06.16-1024x821.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.06.16-300x241.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.06.16-768x616.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.06.16-374x300.png 374w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.06.16.png 1374w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(2 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>import Foundation\n\n   \/\/ Asynchronous expectimax algorithm with improved parallelism\n   func expectimaxAsyn(grid: [&#91;Tile&#93;], depth: Int, isAITurn: Bool) async -> Double {\n        \n        \/\/ Base case: return the board evaluation if depth is 0 or game is over\n        if depth == 0 || isGameOver (grid.map {$0.map{$0.value}}){\n          \/\/ return evaluateBoard(grid.map {$0.map{$0.value}})\n            return evaluateBoard(grid)\n        }\n        if isAITurn {\n            \/\/------\n            \/\/ Player's turn (maximize the score)\n            var maxScore = -Double.infinity\n            \n            \/\/ Use task group for parallel evaluation of all directions\n            return await withTaskGroup(of: Double.self) { group in\n                for direction in Direction.allCases {\n                    group.addTask {\n                        var game = Game (matrix: grid) \/\/ Initialize Game\n                        let (moved, _) = game.slide( direction)\n                        if moved {\n                            return \n    await expectimaxAsyn (grid: game.tiles, depth: depth - 1, isAITurn: false)\n                        }\n                        return -Double.infinity\n                    }\n                }\n                \n                for await result in group {\n                    maxScore = max(maxScore, result)\n                }\n                return maxScore\n            }\n            \/\/------\n           \n        } else {\n            \/\/ AI's turn (chance node)\n        \/\/    var expectedScore = 0.0\n            let emptyTiles = grid.flatMap { $0 }.filter { $0.value == 0 }\n            \/\/ If no empty tiles, the game is over\n            if emptyTiles.isEmpty {\n             \/\/  return evaluateBoard(grid.map {$0.map{$0.value}})\n                return evaluateBoard(grid)\n            }\n            \/\/ Limit parallelism at deeper levels to avoid overwhelming system\n            if depth > 4 {\/\/3 {\n                var expectedValue = 0.0\n                for tile in emptyTiles {\n                    var boardWith2 = grid\n                    boardWith2&#91;tile.position.row&#93;&#91;tile.position.col&#93;.value = 2\n                    let valueFor2 = \n      await expectimaxAsyn(grid: boardWith2, depth: depth - 1, isAITurn: true)\n                    \n                    var boardWith4 = grid\n                    boardWith4&#91;tile.position.row&#93;&#91;tile.position.col&#93;.value = 4\n                    let valueFor4 = \n      await expectimaxAsyn(grid: boardWith4, depth: depth - 1, isAITurn: true)\n                    expectedValue += 0.9 * valueFor2 + 0.1 * valueFor4\n                }\n                return expectedValue \/ Double(emptyTiles.count)\n            } else {\n                \/\/ Use task group for parallel execution in shallower levels\n                return await withTaskGroup(of: Double.self) { group in\n                    var expectedValue = 0.0\n                    for tile in emptyTiles {\n                        group.addTask {\n                            var boardWith2 = grid\n                    boardWith2&#91;tile.position.row&#93;&#91;tile.position.col&#93;.value = 2\n                            return \nawait expectimaxAsyn(grid: boardWith2, depth: depth - 1, isAITurn: true) * 0.9\n                        }\n                        group.addTask {\n                            var boardWith4 = grid                                         \n                    boardWith4&#91;tile.position.row&#93;&#91;tile.position.col&#93;.value = 4\n                            return \nawait expectimaxAsyn(grid: boardWith4, depth: depth - 1, isAITurn: true) * 0.1\n                        }\n                    }\n                    \n                    for await result in group {\n                        expectedValue += result\n                    }\n                    return expectedValue \/ Double(emptyTiles.count)\n                }\n            }\n        }\n    }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">import<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Foundation<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">   <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Asynchronous expectimax algorithm with improved parallelism<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">   <\/span><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">expectimaxAsyn<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF; font-style: italic\">grid<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #EEFFFF\">Tile<\/span><span style=\"color: #89DDFF\">&#93;]<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF; font-style: italic\">depth<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #FFCB6B\">Int<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF; font-style: italic\">isAITurn<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #FFCB6B\">Bool<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C792EA\">async<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Base case: return the board evaluation if depth is 0 or game is over<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> depth <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">||<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">isGameOver<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid.<\/span><span style=\"color: #82AAFF\">map<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\">$0.<\/span><span style=\"color: #82AAFF\">map<\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\">$0.value<\/span><span style=\"color: #89DDFF\">}}){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">          <\/span><span style=\"color: #545454; font-style: italic\">\/\/ return evaluateBoard(grid.map {$0.map{$0.value}})<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">evaluateBoard<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> isAITurn <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">            <\/span><span style=\"color: #545454; font-style: italic\">\/\/------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">            <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Player&#39;s turn (maximize the score)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> maxScore <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\">.infinity<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">            <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Use task group for parallel evaluation of all directions<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">await<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">withTaskGroup<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">of<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\">.<\/span><span style=\"color: #F78C6C\">self<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\"> group <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> direction <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> Direction.allCases <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    group.<\/span><span style=\"color: #82AAFF\">addTask<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                        <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> game <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">Game<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">matrix<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> grid<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Initialize Game<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                        <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">moved, _<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> game.<\/span><span style=\"color: #82AAFF\">slide<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\"> direction<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                        <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> moved <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                            <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">await<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">expectimaxAsyn<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">grid<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> game.tiles, <\/span><span style=\"color: #82AAFF\">depth<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> depth <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF\">isAITurn<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FF9CAC\">false<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                        <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\">.infinity<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">await<\/span><span style=\"color: #EEFFFF\"> result <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> group <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    maxScore <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">max<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">maxScore, result<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> maxScore<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">            <\/span><span style=\"color: #545454; font-style: italic\">\/\/------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">           <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">else<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">            <\/span><span style=\"color: #545454; font-style: italic\">\/\/ AI&#39;s turn (chance node)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">        <\/span><span style=\"color: #545454; font-style: italic\">\/\/    var expectedScore = 0.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> emptyTiles <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> grid.<\/span><span style=\"color: #82AAFF\">flatMap<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\"> $0 <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\">.<\/span><span style=\"color: #82AAFF\">filter<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\"> $0.value <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">            <\/span><span style=\"color: #545454; font-style: italic\">\/\/ If no empty tiles, the game is over<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> emptyTiles.isEmpty <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">             <\/span><span style=\"color: #545454; font-style: italic\">\/\/  return evaluateBoard(grid.map {$0.map{$0.value}})<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">evaluateBoard<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">grid<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">            <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Limit parallelism at deeper levels to avoid overwhelming system<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> depth <\/span><span style=\"color: #89DDFF\">&gt;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">4<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #545454; font-style: italic\">\/\/3 {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> expectedValue <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> tile <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> emptyTiles <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> boardWith2 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> grid<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    boardWith2<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">tile.position.row<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">&#91;tile.position.col&#93;.value <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> valueFor2 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">      <\/span><span style=\"color: #89DDFF; font-style: italic\">await<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">expectimaxAsyn<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">grid<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> boardWith2, <\/span><span style=\"color: #82AAFF\">depth<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> depth <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF\">isAITurn<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FF9CAC\">true<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> boardWith4 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> grid<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    boardWith4<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">tile.position.row<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">&#91;tile.position.col&#93;.value <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> valueFor4 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">      <\/span><span style=\"color: #89DDFF; font-style: italic\">await<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">expectimaxAsyn<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">grid<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> boardWith4, <\/span><span style=\"color: #82AAFF\">depth<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> depth <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF\">isAITurn<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FF9CAC\">true<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    expectedValue <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.9<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> valueFor2 <\/span><span style=\"color: #89DDFF\">+<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.1<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> valueFor4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> expectedValue <\/span><span style=\"color: #89DDFF\">\/<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">emptyTiles.count<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">else<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">                <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Use task group for parallel execution in shallower levels<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">await<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">withTaskGroup<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">of<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\">.<\/span><span style=\"color: #F78C6C\">self<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><span style=\"color: #EEFFFF\"> group <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> expectedValue <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> tile <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> emptyTiles <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                        group.<\/span><span style=\"color: #82AAFF\">addTask<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                            <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> boardWith2 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> grid<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    boardWith2<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">tile.position.row<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">&#91;tile.position.col&#93;.value <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                            <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">await<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">expectimaxAsyn<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">grid<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> boardWith2, <\/span><span style=\"color: #82AAFF\">depth<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> depth <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF\">isAITurn<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FF9CAC\">true<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.9<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                        group.<\/span><span style=\"color: #82AAFF\">addTask<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                            <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> boardWith4 <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> grid                                         <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    boardWith4<\/span><span style=\"color: #89DDFF\">&#91;<\/span><span style=\"color: #EEFFFF\">tile.position.row<\/span><span style=\"color: #89DDFF\">&#93;<\/span><span style=\"color: #EEFFFF\">&#91;tile.position.col&#93;.value <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                            <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF; font-style: italic\">await<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">expectimaxAsyn<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">grid<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> boardWith4, <\/span><span style=\"color: #82AAFF\">depth<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> depth <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">1<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF\">isAITurn<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FF9CAC\">true<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">*<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">0.1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">await<\/span><span style=\"color: #EEFFFF\"> result <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> group <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                        expectedValue <\/span><span style=\"color: #89DDFF\">+=<\/span><span style=\"color: #EEFFFF\"> result<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> expectedValue <\/span><span style=\"color: #89DDFF\">\/<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">emptyTiles.count<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.52.44.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"783\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.52.44-1024x783.png\" alt=\"\" class=\"wp-image-16126\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.52.44-1024x783.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.52.44-300x229.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.52.44-768x587.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.52.44-392x300.png 392w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.52.44.png 1334w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.52.53.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"328\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.52.53-1024x328.png\" alt=\"\" class=\"wp-image-16127\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.52.53-1024x328.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.52.53-300x96.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.52.53-768x246.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.52.53-500x160.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-24-at-13.52.53.png 1342w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(2 * 0.6 * .75rem);--cbp-line-highlight-color:rgba(238, 255, 255, 0.2);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ MARK: -  ExpectimaxAsync AI\n  func bestExpectimaxAsync (depth: Int, matrix: [&#91;Tile&#93;]) async -> Direction {\n        var bestDirection = Direction.right\n        var bestScore: Double = -Double.infinity\n               \n       \/\/ for move in possibleMoves {\n        for direction in Direction.allCases {\n            var model = Game (matrix: matrix) \/\/ Initialize Game\n          \/\/  let (moved, _ ) = model.slide(move)\n            let (moved, _ ) = model.slide(direction)\n            if moved {\n                let newScore = \n    await expectimaxAsyn (grid: model.tiles, depth: depth ,  isAITurn: false)\n                if newScore > bestScore {\n                    bestScore = newScore\n                   \/\/ bestMove = move\n                    bestDirection = direction\n                }\n            }\n        }\n        return bestDirection\n    }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #545454; font-style: italic\">\/\/ MARK: -  ExpectimaxAsync AI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">  <\/span><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">bestExpectimaxAsync<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF; font-style: italic\">depth<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #FFCB6B\">Int<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF; font-style: italic\">matrix<\/span><span style=\"color: #EEFFFF\">: <\/span><span style=\"color: #89DDFF\">[&#91;<\/span><span style=\"color: #EEFFFF\">Tile<\/span><span style=\"color: #89DDFF\">&#93;])<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C792EA\">async<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> Direction <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> bestDirection <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> Direction.right<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> bestScore: <\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-<\/span><span style=\"color: #FFCB6B\">Double<\/span><span style=\"color: #EEFFFF\">.infinity<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">               <\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">       <\/span><span style=\"color: #545454; font-style: italic\">\/\/ for move in possibleMoves {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">for<\/span><span style=\"color: #EEFFFF\"> direction <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><span style=\"color: #EEFFFF\"> Direction.allCases <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">var<\/span><span style=\"color: #EEFFFF\"> model <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">Game<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">matrix<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> matrix<\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #545454; font-style: italic\">\/\/ Initialize Game<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">          <\/span><span style=\"color: #545454; font-style: italic\">\/\/  let (moved, _ ) = model.slide(move)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">moved, _ <\/span><span style=\"color: #89DDFF\">)<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> model.<\/span><span style=\"color: #82AAFF\">slide<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">direction<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> moved <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> newScore <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><\/span>\n<span class=\"line cbp-line-highlight\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF; font-style: italic\">await<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">expectimaxAsyn<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">grid<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> model.tiles, <\/span><span style=\"color: #82AAFF\">depth<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> depth ,  <\/span><span style=\"color: #82AAFF\">isAITurn<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #FF9CAC\">false<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> newScore <\/span><span style=\"color: #89DDFF\">&gt;<\/span><span style=\"color: #EEFFFF\"> bestScore <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    bestScore <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> newScore<\/span><\/span>\n<span class=\"line\"><span style=\"color: #89DDFF\">                   <\/span><span style=\"color: #545454; font-style: italic\">\/\/ bestMove = move<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    bestDirection <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> direction<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> bestDirection<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.53.07.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"158\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.53.07-1024x158.png\" alt=\"\" class=\"wp-image-16145\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.53.07-1024x158.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.53.07-300x46.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.53.07-768x119.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.53.07-500x77.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.53.07.png 1398w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(1 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>  func bestMoveDirectionExpectimaxAsync() async -> Direction {\n    let direction = await aiGame.bestExpectimaxAsync(depth: 5, matrix: tiles)\n        return direction\n  }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #EEFFFF\">  <\/span><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">bestMoveDirectionExpectimaxAsync<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C792EA\">async<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">-&gt;<\/span><span style=\"color: #EEFFFF\"> Direction <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">    <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> direction <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">await<\/span><span style=\"color: #EEFFFF\"> aiGame.<\/span><span style=\"color: #82AAFF\">bestExpectimaxAsync<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #82AAFF\">depth<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #F78C6C\">5<\/span><span style=\"color: #EEFFFF\">, <\/span><span style=\"color: #82AAFF\">matrix<\/span><span style=\"color: #89DDFF\">:<\/span><span style=\"color: #EEFFFF\"> tiles<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #89DDFF; font-style: italic\">return<\/span><span style=\"color: #EEFFFF\"> direction<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">  <\/span><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.54.35.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"62\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.54.35-1024x62.png\" alt=\"\" class=\"wp-image-16146\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.54.35-1024x62.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.54.35-300x18.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.54.35-768x47.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.54.35-500x30.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.54.35.png 1382w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(1 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly> func expectimaxAsyncAIMove() {\n        Task{\n            let bestDirection =  await game.bestMoveDirectionExpectimaxAsync()\n            game.move(bestDirection)\n         } \n }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C792EA\">func<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #82AAFF\">expectimaxAsyncAIMove<\/span><span style=\"color: #89DDFF\">()<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">        <\/span><span style=\"color: #82AAFF\">Task<\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            <\/span><span style=\"color: #F78C6C\">let<\/span><span style=\"color: #EEFFFF\"> bestDirection <\/span><span style=\"color: #89DDFF\">=<\/span><span style=\"color: #EEFFFF\">  <\/span><span style=\"color: #89DDFF; font-style: italic\">await<\/span><span style=\"color: #EEFFFF\"> game.<\/span><span style=\"color: #82AAFF\">bestMoveDirectionExpectimaxAsync<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">            game.<\/span><span style=\"color: #82AAFF\">move<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">bestDirection<\/span><span style=\"color: #89DDFF\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">         <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.56.02.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"76\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.56.02-1024x76.png\" alt=\"\" class=\"wp-image-16147\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.56.02-1024x76.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.56.02-300x22.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.56.02-768x57.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.56.02-500x37.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.56.02.png 1374w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(2 * 0.6 * .75rem);line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#212121\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>.onReceive(timer){ value in\n          if isAIPlaying  &amp;&amp; !viewModel.isGameOver {\n              if selectedAlgorithm == Algorithm.MonteCarloAsync {\n                  viewModel.monteCarloAsyncAIMove()\n              } else if selectedAlgorithm == Algorithm.Expectimax1 {\n                  viewModel.expectimaxAsyncAIMove()\n              } else {\n                    viewModel.executeAIMove()\n              }\n           }\n   }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-darker\" style=\"background-color: #212121\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #EEFFFF\">.<\/span><span style=\"color: #82AAFF\">onReceive<\/span><span style=\"color: #89DDFF\">(<\/span><span style=\"color: #EEFFFF\">timer<\/span><span style=\"color: #89DDFF\">){<\/span><span style=\"color: #EEFFFF\"> value <\/span><span style=\"color: #89DDFF; font-style: italic\">in<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">          <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> isAIPlaying  <\/span><span style=\"color: #89DDFF\">&amp;&amp;<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">!<\/span><span style=\"color: #EEFFFF\">viewModel.isGameOver <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">              <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> selectedAlgorithm <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> Algorithm.MonteCarloAsync <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                  viewModel.<\/span><span style=\"color: #82AAFF\">monteCarloAsyncAIMove<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">              <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">else<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">if<\/span><span style=\"color: #EEFFFF\"> selectedAlgorithm <\/span><span style=\"color: #89DDFF\">==<\/span><span style=\"color: #EEFFFF\"> Algorithm.Expectimax1 <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                  viewModel.<\/span><span style=\"color: #82AAFF\">expectimaxAsyncAIMove<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">              <\/span><span style=\"color: #89DDFF\">}<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF; font-style: italic\">else<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">                    viewModel.<\/span><span style=\"color: #82AAFF\">executeAIMove<\/span><span style=\"color: #89DDFF\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">              <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">           <\/span><span style=\"color: #89DDFF\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #EEFFFF\">   <\/span><span style=\"color: #89DDFF\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.59.40.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"272\" src=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.59.40-1024x272.png\" alt=\"\" class=\"wp-image-16148\" srcset=\"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.59.40-1024x272.png 1024w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.59.40-300x80.png 300w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.59.40-768x204.png 768w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.59.40-500x133.png 500w, https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-25-at-11.59.40.png 1364w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435:<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f ChatGPT \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441\u0442\u0430\u043b\u0430 \u0431\u043e\u043b\u0435\u0435 \u043e\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e\u0439. \u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0432\u043b\u0435\u043a\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0435 \u0432\u0435\u0449\u0438 \u0442\u0438\u043f\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0438\u043b\u0438 \u043c\u0435\u043d\u044e \u043d\u0430 UI \u2014 \u0430 \u0441\u0444\u043e\u043a\u0443\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0445 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f\u0445. \u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c \u0438 \u0432\u0430\u0436\u043d\u043e\u043c. \u042d\u0442\u043e \u0440\u043e\u0436\u0434\u0430\u0435\u0442 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0440\u0438\u0441\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435, \u043d\u0435 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0438\u043b\u0438\u0439. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u043f\u0440\u043e\u0441\u044b\u043f\u0430\u0435\u0442\u0441\u044f \u0447\u0443\u0432\u0441\u0442\u0432\u043e \u0430\u0437\u0430\u0440\u0442\u0430 \u0438 \u043e\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 ChatGPT \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0448\u044c \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0435 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0427\u0442\u043e \u0436\u0435 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u043e\u0441\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e?<\/span><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">ChatGPT \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u201c\u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0430\u043c\u0438\u201d \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043d\u043e \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u0430\u043b\u044c\u0448\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c, \u0441\u0441\u044b\u043b\u0430\u044f\u0441\u044c \u043d\u0430 \u044d\u0442\u0438 \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0438 \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0430\u0437\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0439.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">ChatGPT \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445&nbsp;<code>var<\/code>, \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442&nbsp;<code>let<\/code>&nbsp;\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0439&nbsp;<code>func<\/code>, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u0435\u0442 \u0447\u0442\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0438 \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0430\u0441 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u201c\u043b\u043e\u043c\u0430\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u0443\u201d \u043d\u0430\u0434 \u044d\u0442\u0438\u043c. \u0418 \u0432\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u0438\u0445 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0434\u0438\u0430\u043b\u043e\u0433\u0435 \u0441 ChatGPT.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">ChatGPT 4-o \u0432 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u0435 \u0432\u043b\u0430\u0434\u0435\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u0432\u044b\u0441\u0448\u0435\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f\u043c\u0438 (<code>map<\/code>,<strong>&nbsp;<\/strong><code>flatMap<\/code>,&nbsp;<code>compactMap<\/code>,&nbsp;<code>filter<\/code>,&nbsp;<code>allSatisfy<\/code>) \u0432 Swift \u0438 \u0432\u0441\u044e\u0434\u0443 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0438\u0445, \u0438\u043d\u043e\u0433\u0434\u0430 \u0432 \u0441\u0430\u043c\u044b\u0445 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445 \u0438 \u0441\u0430\u043c\u044b\u043c \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u0438\u044f\u0442\u043d\u043e \u0443\u0434\u0438\u0432\u043b\u044f\u0435\u0442.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0432\u043b\u0430\u0434\u0435\u0435\u0442&nbsp;<a href=\"https:\/\/docs.google.com\/document\/d\/16o_x7bcbbkgSNJq-vKr8650Ei7rFjVSprBIj8ac_Fi4\/edit?usp=drive_link\" target=\"_blank\" rel=\"noreferrer noopener\"><u>\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439 MVVM<\/u><\/a>&nbsp;(\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438, \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0430), \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044f \u043a\u0430\u043a \u043d\u0435\u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c, \u043a\u043e\u0433\u0434\u0430&nbsp;<code>ViewModel<\/code>&nbsp;\u0438&nbsp;<code>Model<\/code>&nbsp;\u0432 \u043e\u0434\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 (\u0441 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u043c&nbsp;<code>ObservableObject<\/code>&nbsp;\u0438\u043b\u0438 \u043d\u043e\u0432\u044b\u043c \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u043c&nbsp;<code>@Observable<\/code>), \u0442\u0430\u043a \u0438 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c:&nbsp;<code>Model<\/code>&nbsp;\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442&nbsp;<code>ViewModel<\/code>&nbsp;\u0438&nbsp;<code>View<\/code>. \u041b\u0435\u0433\u043a\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043e\u0442 \u043e\u0434\u043d\u043e\u0439 \u043a \u0434\u0440\u0443\u0433\u043e\u0439.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0420\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438 \u0434\u0430\u0451\u0442 \u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u043e\u0432\u0435\u0442\u044b \u043f\u043e \u0438\u0445 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u0438 \u0445\u0440\u0430\u043d\u0438\u0442 \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043a\u043e\u0434 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0430 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0435\u0433\u043e \u044d\u0442\u0430\u043f\u044b.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0425\u043e\u0440\u043e\u0448\u043e \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442 \u043a\u043e\u0434.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 Unit \u0442\u0435\u0441\u0442\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c XCTest.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u041f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442 \u0444\u0430\u043d\u0442\u0430\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u044d\u0440\u0443\u0434\u0438\u0446\u0438\u044e \u0432 \u0447\u0430\u0441\u0442\u0438 \u0418\u0418 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0434\u043b\u044f \u0438\u0433\u0440 \u0442\u0438\u043f\u0430 2048.<\/span><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0418 \u043c\u043d\u043e\u0433\u043e \u0447\u0435\u0433\u043e \u0435\u0449\u0435 \u2026.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u0412\u0441\u0435 \u0441\u0432\u043e\u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 ChatGPT \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u0442 \u0442\u0430\u043a\u0438\u043c\u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u043c\u0438 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0434\u0430\u0441\u0442 \u0432\u0430\u043c \u043d\u0438 \u043e\u0434\u0438\u043d \u043a\u0443\u0440\u0441 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f. \u0422\u0430\u043a \u0447\u0442\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0438\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c&nbsp; \u0438\u043d\u0442\u0435\u043d\u0441\u0438\u0432\u043d\u043e\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u044f\u0437\u044b\u043a\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Swift&nbsp; \u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0443 SwiftUI (\u043c\u043d\u0435 \u044d\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u043a\u0430\u043a \u043d\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0438 \u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b\u0430 \u0438\u0445 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432, \u043d\u043e \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u0435\u0442 \u0438 \u0434\u0430\u0436\u0435 \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u043b\u043e \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u043e\u0435!!!).&nbsp;<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438:<\/span><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"font-weight: 400;\">\u0425\u043e\u0442\u044f \u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0440\u0435\u0448\u0430\u0435\u043c\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043e\u0434\u043d\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438, \u043a\u043e\u0434 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u043e \u043a\u0443\u0441\u043e\u0447\u043a\u0430\u043c, \u044d\u0442\u043e \u0432\u0430\u043c \u043d\u0435 Claude 3.5 Sonnet. \u041e\u0434\u043d\u0430\u043a\u043e \u043a \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f &#8212; ChatGPT 4 Canvas, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u0435\u0440\u0436\u0438\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043d\u043e \u044f \u0435\u0449\u0435 \u043d\u0435 \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0430.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0418\u043d\u043e\u0433\u0434\u0430 &#171;\u0443\u0432\u0438\u043b\u0438\u0432\u0430\u0435\u0442&#187; \u043e\u0442 \u043f\u0440\u044f\u043c\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430.<\/span><\/li>\n\n\n\n<li><span style=\"font-weight: 400;\">\u0420\u0435\u0434\u043a\u043e, \u043d\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043a\u043e\u0434\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c.<\/span><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\">\u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u043d\u0430\u0434 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0438\u0433\u0440\u044b 2048 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e ChatGPT \u043c\u043d\u0435 \u043d\u0438 \u0440\u0430\u0437\u0443 \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a Google \u0438\u043b\u0438 StackOverFlow, \u0442\u0430\u043a \u0447\u0442\u043e ChatGPT \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u044d\u0442\u0438 \u0434\u0432\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">\u0418\u0418 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b<strong> Expectimax <\/strong>&nbsp;\u0438 <strong>Monte Carlo<\/strong> \u0434\u043b\u044f \u0438\u0433\u0440\u044b 2048 &#8212; \u044d\u0442\u043e \u0441\u0442\u043e\u0445\u0430\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b &#8212; \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">value<\/mark><\/code> \u043f\u043b\u0438\u0442\u043a\u0438 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">maxTile<\/mark><\/code> \u0438 \u0441\u0447\u0435\u0442 <code><mark style=\"background-color:#e2e2e2\" class=\"has-inline-color\">score<\/mark><\/code> &#8212; \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u044b. \u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0438\u043c\u0435\u0442\u044c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u044d\u0442\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0432\u0435\u043b\u0438\u0447\u0438\u043d \u0432 \u0432\u0438\u0434\u0435 \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0438\u0445 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. \u0412 \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c  \u043f\u043e\u0441\u0442\u0435 <a href=\"https:\/\/bestkora.com\/IosDeveloper\/\u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430-\u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445-chatgpt-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432-expe\u0441timax\/\" title=\"\">&#171;\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 ChatGPT \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 Expe\u0441timax \u0438 Monte Carlo \u0434\u043b\u044f \u0438\u0433\u0440\u044b 2048&#187;<\/a><a href=\"http:\/\/bestkora.com\/IosDeveloper\/wp-admin\/post.php?post=16187&amp;action=edit\" title=\"\"> <\/a> \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e.<\/span><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412 \u0434\u0432\u0443\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0441\u0442\u0430\u0445 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043b\u043e\u0433\u0438\u043a\u0438 \u0438\u0433\u0440\u044b 2048 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 UI \u0441 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0435\u0439. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0418\u0418 (\u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442 ) \u0434\u043b\u044f \u0438\u0433\u0440\u044b 2048 \u0432 \u0432\u0438\u0434\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 Expectimax \u0438 Monte Carlo. \u041a\u043e\u0434 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 Github. \u0428\u0410\u0413 16.&nbsp; &hellip; <a href=\"https:\/\/bestkora.com\/IosDeveloper\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\/\">\u0427\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043b\u0435\u0435 <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[107,14,54,109,108],"tags":[112,113,31,56,110],"class_list":["post-15929","post","type-post","status-publish","format-standard","hentry","category-chatgpt","category-swift","category-swiftui","category-109","category-108","tag-expectimax","tag-monte-carlo","tag-swift","tag-swiftui","tag-110"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.8 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u0434\u0432\u0443\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0441\u0442\u0430\u0445 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043b\u043e\u0433\u0438\u043a\u0438 \u0438\u0433\u0440\u044b 2048 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 UI \u0441 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0435\u0439. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0418\u0418 (\u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442 ) \u0434\u043b\u044f \u0438\u0433\u0440\u044b 2048 \u0432 \u0432\u0438\u0434\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 Expectimax \u0438 Monte Carlo. \u041a\u043e\u0434 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 Github. \u0428\u0410\u0413 16. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 AI \u0432 \u0438\u0433\u0440\u0443 2048 \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0418\u0418 \u0432 \u0438\u0433\u0440\u0443 2048 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043b\u043e\u0433\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442\" \/>\n\t<meta name=\"robots\" content=\"max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n\t<meta name=\"author\" content=\"tatiana.kornilova@gmail.com\"\/>\n\t<meta name=\"keywords\" content=\"ai,game 2048,2048,chatgpt 4-o,swiftui,expectimax,monte carlo\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/bestkora.com\/IosDeveloper\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.8\" \/>\n\t\t<meta property=\"og:locale\" content=\"ru_RU\" \/>\n\t\t<meta property=\"og:site_name\" content=\"\u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. | \u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u043d\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442 \u043b\u0435\u043a\u0446\u0438\u0439 \u0421\u0442\u044d\u043d\u0444\u043e\u0440\u0434\u0441\u043a\u043e\u0433\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0430 &quot; \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439&quot; 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 , 2023,  2024,  2025  \u0438 2026 \u0433\u0433., \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u043c\u044b\u0439 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u043c\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0441 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0435\u0439 \u043a\u0443\u0440\u0441\u043e\u0432 \u043a \u043d\u043e\u0432\u044b\u043c \u0432\u0435\u0440\u0441\u0438\u044f\u043c Swift, Objective-C \u0438 iOS.\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u044b 2048 \u0432 SwiftUI \u0441 ChatGPT. \u0427\u0430\u0441\u0442\u044c 3. \u0418\u0418 (AI) \u0434\u043b\u044f \u0438\u0433\u0440\u044b 2048. | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u0434\u0432\u0443\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0441\u0442\u0430\u0445 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043b\u043e\u0433\u0438\u043a\u0438 \u0438\u0433\u0440\u044b 2048 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 UI \u0441 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0435\u0439. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0418\u0418 (\u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442 ) \u0434\u043b\u044f \u0438\u0433\u0440\u044b 2048 \u0432 \u0432\u0438\u0434\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 Expectimax \u0438 Monte Carlo. \u041a\u043e\u0434 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 Github. \u0428\u0410\u0413 16. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 AI \u0432 \u0438\u0433\u0440\u0443 2048 \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0418\u0418 \u0432 \u0438\u0433\u0440\u0443 2048 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043b\u043e\u0433\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/bestkora.com\/IosDeveloper\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2024-10-15T11:51:56+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2025-09-11T15:39:20+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u044b 2048 \u0432 SwiftUI \u0441 ChatGPT. \u0427\u0430\u0441\u0442\u044c 3. \u0418\u0418 (AI) \u0434\u043b\u044f \u0438\u0433\u0440\u044b 2048. | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.\" \/>\n\t\t<meta name=\"twitter:description\" content=\"\u0412 \u0434\u0432\u0443\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0441\u0442\u0430\u0445 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043b\u043e\u0433\u0438\u043a\u0438 \u0438\u0433\u0440\u044b 2048 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 UI \u0441 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0435\u0439. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0418\u0418 (\u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442 ) \u0434\u043b\u044f \u0438\u0433\u0440\u044b 2048 \u0432 \u0432\u0438\u0434\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 Expectimax \u0438 Monte Carlo. \u041a\u043e\u0434 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 Github. \u0428\u0410\u0413 16. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 AI \u0432 \u0438\u0433\u0440\u0443 2048 \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0418\u0418 \u0432 \u0438\u0433\u0440\u0443 2048 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043b\u043e\u0433\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\\\/#article\",\"name\":\"iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0435 \\u0438\\u0433\\u0440\\u044b 2048 \\u0432 SwiftUI \\u0441 ChatGPT. \\u0427\\u0430\\u0441\\u0442\\u044c 3. \\u0418\\u0418 (AI) \\u0434\\u043b\\u044f \\u0438\\u0433\\u0440\\u044b 2048. | \\u041e\\u0431\\u0443\\u0447\\u0430\\u044e\\u0449\\u0438\\u0439 \\u043a\\u0443\\u0440\\u0441 \\u043f\\u043e \\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0435 iOS+Swift \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0439.\",\"headline\":\"iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0435 \\u0438\\u0433\\u0440\\u044b 2048 \\u0432 SwiftUI \\u0441 ChatGPT. \\u0427\\u0430\\u0441\\u0442\\u044c 3. \\u0418\\u0418 (AI) \\u0434\\u043b\\u044f \\u0438\\u0433\\u0440\\u044b 2048.\",\"author\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/author\\\/tatiana-lornilovagmail-com\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/#person\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/Screenshot-2024-10-15-at-15.29.12.png\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\\\/#articleImage\",\"width\":1384,\"height\":256},\"datePublished\":\"2024-10-15T11:51:56+00:00\",\"dateModified\":\"2025-09-11T15:39:20+00:00\",\"inLanguage\":\"ru-RU\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\\\/#webpage\"},\"articleSection\":\"ChatGPT, Swift, SwiftUI, \\u0438\\u0433\\u0440\\u0430 2048, \\u0418\\u0418 \\u0430\\u043b\\u0433\\u043e\\u0440\\u0438\\u0442\\u043c\\u044b, Expectimax, Monte Carlo, Swift, SwiftUI, \\u0418\\u0418 2048\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/category\\\/swift\\\/#listItem\",\"name\":\"Swift\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/category\\\/swift\\\/#listItem\",\"position\":2,\"name\":\"Swift\",\"item\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/category\\\/swift\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\\\/#listItem\",\"name\":\"iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0435 \\u0438\\u0433\\u0440\\u044b 2048 \\u0432 SwiftUI \\u0441 ChatGPT. \\u0427\\u0430\\u0441\\u0442\\u044c 3. \\u0418\\u0418 (AI) \\u0434\\u043b\\u044f \\u0438\\u0433\\u0440\\u044b 2048.\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\\\/#listItem\",\"position\":3,\"name\":\"iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0435 \\u0438\\u0433\\u0440\\u044b 2048 \\u0432 SwiftUI \\u0441 ChatGPT. \\u0427\\u0430\\u0441\\u0442\\u044c 3. \\u0418\\u0418 (AI) \\u0434\\u043b\\u044f \\u0438\\u0433\\u0440\\u044b 2048.\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/category\\\/swift\\\/#listItem\",\"name\":\"Swift\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/#person\",\"name\":\"tatiana.kornilova@gmail.com\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\\\/#personImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/33ccc19059014d8a7849c3621afa2b66a5f3e50ac7291c91c30ff35df5747628?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"tatiana.kornilova@gmail.com\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/author\\\/tatiana-lornilovagmail-com\\\/#author\",\"url\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/author\\\/tatiana-lornilovagmail-com\\\/\",\"name\":\"tatiana.kornilova@gmail.com\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/33ccc19059014d8a7849c3621afa2b66a5f3e50ac7291c91c30ff35df5747628?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"tatiana.kornilova@gmail.com\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\\\/#webpage\",\"url\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\\\/\",\"name\":\"iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0435 \\u0438\\u0433\\u0440\\u044b 2048 \\u0432 SwiftUI \\u0441 ChatGPT. \\u0427\\u0430\\u0441\\u0442\\u044c 3. \\u0418\\u0418 (AI) \\u0434\\u043b\\u044f \\u0438\\u0433\\u0440\\u044b 2048. | \\u041e\\u0431\\u0443\\u0447\\u0430\\u044e\\u0449\\u0438\\u0439 \\u043a\\u0443\\u0440\\u0441 \\u043f\\u043e \\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0435 iOS+Swift \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0439.\",\"description\":\"\\u0412 \\u0434\\u0432\\u0443\\u0445 \\u043f\\u0440\\u0435\\u0434\\u044b\\u0434\\u0443\\u0449\\u0438\\u0445 \\u043f\\u043e\\u0441\\u0442\\u0430\\u0445 \\u043c\\u044b \\u0440\\u0430\\u0441\\u0441\\u043c\\u043e\\u0442\\u0440\\u0435\\u043b\\u0438 \\u0441\\u043e\\u0437\\u0434\\u0430\\u043d\\u0438\\u0435 \\u043b\\u043e\\u0433\\u0438\\u043a\\u0438 \\u0438\\u0433\\u0440\\u044b 2048 \\u0438 \\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0443 UI \\u0441 \\u0430\\u043d\\u0438\\u043c\\u0430\\u0446\\u0438\\u0435\\u0439. \\u0412 \\u044d\\u0442\\u043e\\u043c \\u043f\\u043e\\u0441\\u0442\\u0435 \\u043c\\u044b \\u0434\\u043e\\u0431\\u0430\\u0432\\u0438\\u043c \\u0418\\u0418 (\\u0438\\u0441\\u043a\\u0443\\u0441\\u0441\\u0442\\u0432\\u0435\\u043d\\u043d\\u044b\\u0439 \\u0438\\u043d\\u0442\\u0435\\u043b\\u043b\\u0435\\u043a\\u0442 ) \\u0434\\u043b\\u044f \\u0438\\u0433\\u0440\\u044b 2048 \\u0432 \\u0432\\u0438\\u0434\\u0435 \\u0430\\u043b\\u0433\\u043e\\u0440\\u0438\\u0442\\u043c\\u043e\\u0432 Expectimax \\u0438 Monte Carlo. \\u041a\\u043e\\u0434 \\u043d\\u0430\\u0445\\u043e\\u0434\\u0438\\u0442\\u0441\\u044f \\u043d\\u0430 Github. \\u0428\\u0410\\u0413 16. \\u0414\\u043e\\u0431\\u0430\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435 AI \\u0432 \\u0438\\u0433\\u0440\\u0443 2048 \\u0414\\u043e\\u0431\\u0430\\u0432\\u043b\\u0435\\u043d\\u0438\\u0435 \\u0418\\u0418 \\u0432 \\u0438\\u0433\\u0440\\u0443 2048 \\u043f\\u043e\\u0434\\u0440\\u0430\\u0437\\u0443\\u043c\\u0435\\u0432\\u0430\\u0435\\u0442 \\u0440\\u0435\\u0430\\u043b\\u0438\\u0437\\u0430\\u0446\\u0438\\u044e \\u043b\\u043e\\u0433\\u0438\\u043a\\u0438, \\u043a\\u043e\\u0442\\u043e\\u0440\\u0430\\u044f \\u043c\\u043e\\u0436\\u0435\\u0442\",\"inLanguage\":\"ru-RU\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/author\\\/tatiana-lornilovagmail-com\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/author\\\/tatiana-lornilovagmail-com\\\/#author\"},\"datePublished\":\"2024-10-15T11:51:56+00:00\",\"dateModified\":\"2025-09-11T15:39:20+00:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/#website\",\"url\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/\",\"name\":\"\\u041e\\u0431\\u0443\\u0447\\u0430\\u044e\\u0449\\u0438\\u0439 \\u043a\\u0443\\u0440\\u0441 \\u043f\\u043e \\u0440\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0435 iOS+Swift \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0439.\",\"description\":\"\\u0420\\u0443\\u0441\\u0441\\u043a\\u0438\\u0439 \\u043d\\u0435\\u0430\\u0432\\u0442\\u043e\\u0440\\u0438\\u0437\\u043e\\u0432\\u0430\\u043d\\u043d\\u044b\\u0439 \\u043a\\u043e\\u043d\\u0441\\u043f\\u0435\\u043a\\u0442 \\u043b\\u0435\\u043a\\u0446\\u0438\\u0439 \\u0421\\u0442\\u044d\\u043d\\u0444\\u043e\\u0440\\u0434\\u0441\\u043a\\u043e\\u0433\\u043e \\u0443\\u043d\\u0438\\u0432\\u0435\\u0440\\u0441\\u0438\\u0442\\u0435\\u0442\\u0430 \\\" \\u0420\\u0430\\u0437\\u0440\\u0430\\u0431\\u043e\\u0442\\u043a\\u0430 iOS \\u043f\\u0440\\u0438\\u043b\\u043e\\u0436\\u0435\\u043d\\u0438\\u0439\\\" 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 , 2023,  2024,  2025  \\u0438 2026 \\u0433\\u0433., \\u0441\\u043e\\u043f\\u0440\\u043e\\u0432\\u043e\\u0436\\u0434\\u0430\\u0435\\u043c\\u044b\\u0439 \\u0440\\u0435\\u0448\\u0435\\u043d\\u0438\\u044f\\u043c\\u0438 \\u0437\\u0430\\u0434\\u0430\\u043d\\u0438\\u0439 \\u0438 \\u0434\\u043e\\u043f\\u043e\\u043b\\u043d\\u0435\\u043d\\u0438\\u044f\\u043c\\u0438, \\u0441\\u0432\\u044f\\u0437\\u0430\\u043d\\u043d\\u044b\\u043c\\u0438 \\u0441 \\u0430\\u0434\\u0430\\u043f\\u0442\\u0430\\u0446\\u0438\\u0435\\u0439 \\u043a\\u0443\\u0440\\u0441\\u043e\\u0432 \\u043a \\u043d\\u043e\\u0432\\u044b\\u043c \\u0432\\u0435\\u0440\\u0441\\u0438\\u044f\\u043c Swift, Objective-C \\u0438 iOS.\",\"inLanguage\":\"ru-RU\",\"publisher\":{\"@id\":\"https:\\\/\\\/bestkora.com\\\/IosDeveloper\\\/#person\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u044b 2048 \u0432 SwiftUI \u0441 ChatGPT. \u0427\u0430\u0441\u0442\u044c 3. \u0418\u0418 (AI) \u0434\u043b\u044f \u0438\u0433\u0440\u044b 2048. | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.","description":"\u0412 \u0434\u0432\u0443\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0441\u0442\u0430\u0445 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043b\u043e\u0433\u0438\u043a\u0438 \u0438\u0433\u0440\u044b 2048 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 UI \u0441 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0435\u0439. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0418\u0418 (\u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442 ) \u0434\u043b\u044f \u0438\u0433\u0440\u044b 2048 \u0432 \u0432\u0438\u0434\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 Expectimax \u0438 Monte Carlo. \u041a\u043e\u0434 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 Github. \u0428\u0410\u0413 16. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 AI \u0432 \u0438\u0433\u0440\u0443 2048 \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0418\u0418 \u0432 \u0438\u0433\u0440\u0443 2048 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043b\u043e\u0433\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442","canonical_url":"https:\/\/bestkora.com\/IosDeveloper\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\/","robots":"max-snippet:-1, max-image-preview:large, max-video-preview:-1","keywords":"ai,game 2048,2048,chatgpt 4-o,swiftui,expectimax,monte carlo","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/bestkora.com\/IosDeveloper\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\/#article","name":"iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u044b 2048 \u0432 SwiftUI \u0441 ChatGPT. \u0427\u0430\u0441\u0442\u044c 3. \u0418\u0418 (AI) \u0434\u043b\u044f \u0438\u0433\u0440\u044b 2048. | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.","headline":"iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u044b 2048 \u0432 SwiftUI \u0441 ChatGPT. \u0427\u0430\u0441\u0442\u044c 3. \u0418\u0418 (AI) \u0434\u043b\u044f \u0438\u0433\u0440\u044b 2048.","author":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/author\/tatiana-lornilovagmail-com\/#author"},"publisher":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/#person"},"image":{"@type":"ImageObject","url":"https:\/\/bestkora.com\/IosDeveloper\/wp-content\/uploads\/2024\/10\/Screenshot-2024-10-15-at-15.29.12.png","@id":"https:\/\/bestkora.com\/IosDeveloper\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\/#articleImage","width":1384,"height":256},"datePublished":"2024-10-15T11:51:56+00:00","dateModified":"2025-09-11T15:39:20+00:00","inLanguage":"ru-RU","mainEntityOfPage":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\/#webpage"},"isPartOf":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\/#webpage"},"articleSection":"ChatGPT, Swift, SwiftUI, \u0438\u0433\u0440\u0430 2048, \u0418\u0418 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, Expectimax, Monte Carlo, Swift, SwiftUI, \u0418\u0418 2048"},{"@type":"BreadcrumbList","@id":"https:\/\/bestkora.com\/IosDeveloper\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper#listItem","position":1,"name":"Home","item":"https:\/\/bestkora.com\/IosDeveloper","nextItem":{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper\/category\/swift\/#listItem","name":"Swift"}},{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper\/category\/swift\/#listItem","position":2,"name":"Swift","item":"https:\/\/bestkora.com\/IosDeveloper\/category\/swift\/","nextItem":{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\/#listItem","name":"iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u044b 2048 \u0432 SwiftUI \u0441 ChatGPT. \u0427\u0430\u0441\u0442\u044c 3. \u0418\u0418 (AI) \u0434\u043b\u044f \u0438\u0433\u0440\u044b 2048."},"previousItem":{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\/#listItem","position":3,"name":"iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u044b 2048 \u0432 SwiftUI \u0441 ChatGPT. \u0427\u0430\u0441\u0442\u044c 3. \u0418\u0418 (AI) \u0434\u043b\u044f \u0438\u0433\u0440\u044b 2048.","previousItem":{"@type":"ListItem","@id":"https:\/\/bestkora.com\/IosDeveloper\/category\/swift\/#listItem","name":"Swift"}}]},{"@type":"Person","@id":"https:\/\/bestkora.com\/IosDeveloper\/#person","name":"tatiana.kornilova@gmail.com","image":{"@type":"ImageObject","@id":"https:\/\/bestkora.com\/IosDeveloper\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\/#personImage","url":"https:\/\/secure.gravatar.com\/avatar\/33ccc19059014d8a7849c3621afa2b66a5f3e50ac7291c91c30ff35df5747628?s=96&d=mm&r=g","width":96,"height":96,"caption":"tatiana.kornilova@gmail.com"}},{"@type":"Person","@id":"https:\/\/bestkora.com\/IosDeveloper\/author\/tatiana-lornilovagmail-com\/#author","url":"https:\/\/bestkora.com\/IosDeveloper\/author\/tatiana-lornilovagmail-com\/","name":"tatiana.kornilova@gmail.com","image":{"@type":"ImageObject","@id":"https:\/\/bestkora.com\/IosDeveloper\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/33ccc19059014d8a7849c3621afa2b66a5f3e50ac7291c91c30ff35df5747628?s=96&d=mm&r=g","width":96,"height":96,"caption":"tatiana.kornilova@gmail.com"}},{"@type":"WebPage","@id":"https:\/\/bestkora.com\/IosDeveloper\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\/#webpage","url":"https:\/\/bestkora.com\/IosDeveloper\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\/","name":"iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u044b 2048 \u0432 SwiftUI \u0441 ChatGPT. \u0427\u0430\u0441\u0442\u044c 3. \u0418\u0418 (AI) \u0434\u043b\u044f \u0438\u0433\u0440\u044b 2048. | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.","description":"\u0412 \u0434\u0432\u0443\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0441\u0442\u0430\u0445 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043b\u043e\u0433\u0438\u043a\u0438 \u0438\u0433\u0440\u044b 2048 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 UI \u0441 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0435\u0439. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0418\u0418 (\u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442 ) \u0434\u043b\u044f \u0438\u0433\u0440\u044b 2048 \u0432 \u0432\u0438\u0434\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 Expectimax \u0438 Monte Carlo. \u041a\u043e\u0434 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 Github. \u0428\u0410\u0413 16. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 AI \u0432 \u0438\u0433\u0440\u0443 2048 \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0418\u0418 \u0432 \u0438\u0433\u0440\u0443 2048 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043b\u043e\u0433\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442","inLanguage":"ru-RU","isPartOf":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/#website"},"breadcrumb":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\/#breadcrumblist"},"author":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/author\/tatiana-lornilovagmail-com\/#author"},"creator":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/author\/tatiana-lornilovagmail-com\/#author"},"datePublished":"2024-10-15T11:51:56+00:00","dateModified":"2025-09-11T15:39:20+00:00"},{"@type":"WebSite","@id":"https:\/\/bestkora.com\/IosDeveloper\/#website","url":"https:\/\/bestkora.com\/IosDeveloper\/","name":"\u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.","description":"\u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u043d\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442 \u043b\u0435\u043a\u0446\u0438\u0439 \u0421\u0442\u044d\u043d\u0444\u043e\u0440\u0434\u0441\u043a\u043e\u0433\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0430 \" \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439\" 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 , 2023,  2024,  2025  \u0438 2026 \u0433\u0433., \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u043c\u044b\u0439 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u043c\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0441 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0435\u0439 \u043a\u0443\u0440\u0441\u043e\u0432 \u043a \u043d\u043e\u0432\u044b\u043c \u0432\u0435\u0440\u0441\u0438\u044f\u043c Swift, Objective-C \u0438 iOS.","inLanguage":"ru-RU","publisher":{"@id":"https:\/\/bestkora.com\/IosDeveloper\/#person"}}]},"og:locale":"ru_RU","og:site_name":"\u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. | \u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u043d\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442 \u043b\u0435\u043a\u0446\u0438\u0439 \u0421\u0442\u044d\u043d\u0444\u043e\u0440\u0434\u0441\u043a\u043e\u0433\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0430 &quot; \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439&quot; 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 , 2023,  2024,  2025  \u0438 2026 \u0433\u0433., \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0435\u043c\u044b\u0439 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u043c\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0441 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0435\u0439 \u043a\u0443\u0440\u0441\u043e\u0432 \u043a \u043d\u043e\u0432\u044b\u043c \u0432\u0435\u0440\u0441\u0438\u044f\u043c Swift, Objective-C \u0438 iOS.","og:type":"article","og:title":"iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u044b 2048 \u0432 SwiftUI \u0441 ChatGPT. \u0427\u0430\u0441\u0442\u044c 3. \u0418\u0418 (AI) \u0434\u043b\u044f \u0438\u0433\u0440\u044b 2048. | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.","og:description":"\u0412 \u0434\u0432\u0443\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0441\u0442\u0430\u0445 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043b\u043e\u0433\u0438\u043a\u0438 \u0438\u0433\u0440\u044b 2048 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 UI \u0441 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0435\u0439. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0418\u0418 (\u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442 ) \u0434\u043b\u044f \u0438\u0433\u0440\u044b 2048 \u0432 \u0432\u0438\u0434\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 Expectimax \u0438 Monte Carlo. \u041a\u043e\u0434 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 Github. \u0428\u0410\u0413 16. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 AI \u0432 \u0438\u0433\u0440\u0443 2048 \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0418\u0418 \u0432 \u0438\u0433\u0440\u0443 2048 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043b\u043e\u0433\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442","og:url":"https:\/\/bestkora.com\/IosDeveloper\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\/","article:published_time":"2024-10-15T11:51:56+00:00","article:modified_time":"2025-09-11T15:39:20+00:00","twitter:card":"summary","twitter:title":"iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u044b 2048 \u0432 SwiftUI \u0441 ChatGPT. \u0427\u0430\u0441\u0442\u044c 3. \u0418\u0418 (AI) \u0434\u043b\u044f \u0438\u0433\u0440\u044b 2048. | \u041e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u043a\u0443\u0440\u0441 \u043f\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 iOS+Swift \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.","twitter:description":"\u0412 \u0434\u0432\u0443\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0441\u0442\u0430\u0445 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043b\u043e\u0433\u0438\u043a\u0438 \u0438\u0433\u0440\u044b 2048 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 UI \u0441 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0435\u0439. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0418\u0418 (\u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442 ) \u0434\u043b\u044f \u0438\u0433\u0440\u044b 2048 \u0432 \u0432\u0438\u0434\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 Expectimax \u0438 Monte Carlo. \u041a\u043e\u0434 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 Github. \u0428\u0410\u0413 16. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 AI \u0432 \u0438\u0433\u0440\u0443 2048 \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0418\u0418 \u0432 \u0438\u0433\u0440\u0443 2048 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043b\u043e\u0433\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442"},"aioseo_meta_data":{"post_id":"15929","title":null,"description":null,"keywords":[{"label":"AI","value":"AI"},{"label":"Game 2048","value":"Game 2048"},{"label":"2048","value":"2048"},{"label":"ChatGPT 4-o","value":"ChatGPT 4-o"},{"label":"SwiftUI","value":"SwiftUI"},{"label":"Expectimax","value":"Expectimax"},{"label":"Monte Carlo","value":"Monte Carlo"}],"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":{"faqs":[],"keyPoints":[],"titles":[],"descriptions":[],"socialPosts":{"email":[],"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2024-10-15 11:50:23","updated":"2026-02-22 20:11:16","seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/bestkora.com\/IosDeveloper\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/bestkora.com\/IosDeveloper\/category\/swift\/\" title=\"Swift\">Swift<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tiOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u044b 2048 \u0432 SwiftUI \u0441 ChatGPT. \u0427\u0430\u0441\u0442\u044c 3. \u0418\u0418 (AI) \u0434\u043b\u044f \u0438\u0433\u0440\u044b 2048.\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/bestkora.com\/IosDeveloper"},{"label":"Swift","link":"https:\/\/bestkora.com\/IosDeveloper\/category\/swift\/"},{"label":"iOS \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u044b 2048 \u0432 SwiftUI \u0441 ChatGPT. \u0427\u0430\u0441\u0442\u044c 3. \u0418\u0418 (AI) \u0434\u043b\u044f \u0438\u0433\u0440\u044b 2048.","link":"https:\/\/bestkora.com\/IosDeveloper\/ios-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-%d0%b8%d0%b3%d1%80%d1%8b-2048-%d0%b2-swiftui-%d1%81-chatgpt-%d1%87%d0%b0%d1%81%d1%82%d1%8c-3-%d0%b8%d0%b8-ai\/"}],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/posts\/15929","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/comments?post=15929"}],"version-history":[{"count":4,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/posts\/15929\/revisions"}],"predecessor-version":[{"id":17082,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/posts\/15929\/revisions\/17082"}],"wp:attachment":[{"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/media?parent=15929"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/categories?post=15929"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bestkora.com\/IosDeveloper\/wp-json\/wp\/v2\/tags?post=15929"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}