เกมที่ดีที่สุดของ Tic Tac Torus


31

ความท้าทายนี้เกี่ยวกับเกม Tic Tac Toe แต่มันเล่นบนพรู

วิธีการเล่น

ในการสร้างกระดานเกมที่จำเป็นคุณต้องเริ่มด้วยเกมกระดาน Tic Tac Toe เป็นประจำ ก่อนพับลงในกระบอกสูบโดยการรวมขอบซ้ายและขอบขวา จากนั้นพับเป็นทอรัสโดยรวมขอบบนและขอบล่าง นี่คือการสร้างภาพข้อมูลอย่างง่ายของเกมกระดานที่มีการเคลื่อนไหวเล็กน้อย (ทักษะ Sick Paint!)

Tic Tac Torus

กฎของ Tic Tac Toe บนพรูเป็นเช่นเดียวกับ Tic Tac Toe ปกติ ผู้เล่นแต่ละคนวาง Xs และ Os สลับกัน คนแรกที่มี 3 สัญลักษณ์เดียวกันในแถวคอลัมน์หรือในแนวทแยงชนะ

เนื่องจากพรูค่อนข้างมองเห็นได้ยากเราจึงฉายบอร์ดกลับลงบนกระดาษ ตอนนี้เราสามารถเล่นเกมตามปกติ Tic Tac Toe ความแตกต่างเพียงอย่างเดียวคือคุณสามารถชนะด้วยสัญลักษณ์เดียวกัน 3 ตัวในแนวทแยงที่แตก เช่นผู้เล่น 1 (X) ชนะบอร์ดต่อไปนี้ คุณสามารถเห็นสิ่งนี้ได้อย่างง่ายดายโดยเปลี่ยนมุมมองบนพรูเล็กน้อย

ผู้เล่น 1 (X) ชนะเพราะ 3 Xs ในแนวทแยงที่หักหนึ่งครั้ง

หากสนใจของคุณคุณสามารถเล่น Tic Tac Toe บน Torus ที่Torus เกมส์ มีทั้งรุ่น Windows, Mac และ Android

เกมที่ดีที่สุด

ในความท้าทายนี้มีความสนใจในเกมที่ดีที่สุด เกมที่ดีที่สุดคือเกมที่ผู้เล่นทั้งสองเล่นกลยุทธ์ที่ดีที่สุด ในเกมกระดานที่ดีที่สุดของ Tic Tac Toe จะจบลงด้วยเสมอ ชวนตะลึงบนกระดานพรูเสมอผู้เล่นคนแรกที่ชนะ ในความเป็นจริงเกมบนกระดาน torus ไม่สามารถจบลงด้วยการเสมอกัน

กลยุทธ์ที่ดีที่สุดนั้นง่ายมาก:

  • หากคุณสามารถชนะโดยการวางสัญลักษณ์ของคุณทำมัน
  • มิฉะนั้นหากคู่แข่งของคุณมีสองสัญลักษณ์ในหนึ่งแถว / คอลัมน์ / điagonalพยายามปิดกั้นเขา มิฉะนั้นทำในสิ่งที่คุณต้องการ
  • มิฉะนั้นทำในสิ่งที่คุณต้องการ

ทุกเกมที่ดีที่สุดประกอบด้วยการเคลื่อนไหว 7 ครั้งและการเคลื่อนไหวเหล่านี้สามารถอธิบายได้ด้วยวิธีต่อไปนี้:

  1. ผู้เล่น 1 วาง X ที่ใดก็ได้บนกระดาน (9 ตัวเลือก)
  2. ผู้เล่น 2 วาง O ทุกที่บนกระดาน (8 ตัวเลือก)
  3. ผู้เล่น 1 วาง X ที่ใดก็ได้บนกระดาน (7 ตัวเลือก)
  4. การเคลื่อนไหวของผู้เล่น 2 อาจถูกบังคับ (1 ทางเลือก) ถ้าไม่เขาวาง O ไว้ที่ใดก็ได้ (6 ตัวเลือก)
  5. การเคลื่อนไหวของผู้เล่น 1 ถูกบังคับ (1 ทางเลือก)
  6. ผู้เล่น 2 ถูกจับ (ผู้เล่น 1 สามารถชนะได้สองวิธี), ดังนั้นผู้เล่น 2 ต้องบล็อกผู้เล่น 1 ในทางเดียว (2 ทางเลือก)
  7. ผู้เล่น 1 ทำการย้ายครั้งสุดท้ายและชนะ (1 ตัวเลือก)

มี 9 * 8 * 1 * 6 * 1 * 2 * 1 + 9 * 8 * 6 * 1 * 1 * 2 * 1 = 1728 เกมที่ดีที่สุดที่แตกต่างกันในบอร์ดของเรา ที่นี่คุณสามารถดูเกมที่ดีที่สุดหนึ่งเกม:

ตัวอย่างของเกมที่ดีที่สุด

ถ้าเราติดป้ายเซลล์ของคณะกรรมการที่มีตัวเลขแต่ละเราสามารถอธิบายเกมนี้โดยตัวเลข0-8 3518207ตัวแรกคือ X ที่อยู่ในเซลล์ 3 (แถวกลาง, คอลัมน์ซ้าย), กว่า O ในเซลล์ 5 (แถวกลาง, คอลัมน์ขวา), มากกว่า X ในเซลล์ 1 (แถวบน, คอลัมน์กลาง), ...

การใช้สัญกรณ์หลักนี้เราจะสร้างคำสั่งซื้อโดยอัตโนมัติ ตอนนี้เราสามารถจัดเรียงเกมที่ดีที่สุดทั้งหมด 1728 เกมและเราได้รับรายชื่อ:

Game 0000: 0123845
Game 0001: 0123854
Game 0002: 0124735
Game 0003: 0124753
Game 0004: 0125634
   ...
Game 0674: 3518207
   ...
Game 1000: 5167423
Game 1001: 5167432
Game 1002: 5168304
   ...
Game 1726: 8765034
Game 1727: 8765043

ท้าทาย

รายการนี้เป็นส่วนหนึ่งของงานของคุณ คุณจะได้รับหนึ่งหมายเลขkระหว่าง 0 ถึง 1727 และคุณจะต้องส่งคืนkเกมที่สามด้วยสัญกรณ์หลักของรายการที่เรียง

เขียนฟังก์ชั่นหรือโปรแกรมที่ได้รับตัวเลขk(จำนวนเต็ม) คำนวณเกมที่เกี่ยวข้อง คุณสามารถอ่านอินพุตผ่าน STDIN, อาร์กิวเมนต์บรรทัดคำสั่ง, พร้อมต์หรือฟังก์ชันอาร์กิวเมนต์และพิมพ์ผลลัพธ์ (7 หลัก) ในรูปแบบที่อ่านได้ (เช่น0123845หรือ[0, 1, 2, 3, 8, 4, 5]) หรือส่งคืนโดยใช้สตริง (รูปแบบที่มนุษย์สามารถอ่านได้) หรือจำนวนเต็ม ตัวเลขในฐาน 10) หรือในรูปแบบอาร์เรย์ / รายการใด ๆ

ประเภทความท้าทายคือรหัสกอล์ฟ ดังนั้นรหัสที่สั้นที่สุดชนะ


เหตุใดการย้ายครั้งแรกของผู้เล่น 2 จึงต้องอยู่ในแถวหรือคอลัมน์เดียวกันกับการย้ายครั้งแรกของผู้เล่น 1 ฉันเล่นเกมสองสามครั้งในหัวของฉันแล้วที่การเคลื่อนไหวแรกของผู้เล่น 2 อยู่ในแนวทแยงมุมเดียวกันและพวกเขาทำตามรูปแบบเกมที่เหมาะสมที่สุด สำหรับฉันแล้วดูเหมือนว่าหนึ่งในแง่มุมของบอร์ด toroidal คือแถว, คอลัมน์และ diagonals มีผลกระทบที่สมมาตรกับเกม
Runer112

@ Runer112 ประยุกต์กลยุทธ์ที่เหมาะสมที่สุดให้มากที่สุด กฎเพียงข้อเดียวคือบล็อกคู่ต่อสู้ของคุณหากทำได้ไม่เช่นนั้นจะทำในสิ่งที่คุณต้องการ
Jakube

7
เพียงความเห็นด้านข้าง: จริงๆแล้วมีเกมที่เป็นเอกลักษณ์น้อยกว่าที่เป็นไปได้ที่นี่ สมมาตรที่ผ่านการแปลทำให้ตำแหน่งของการเคลื่อนไหวครั้งแรกไม่เกี่ยวข้อง (เพราะคุณสามารถกำหนดมุมมองของคุณให้อยู่ตรงกลางได้เสมอ) ดังนั้นหารด้วย 9 ... และการหมุนของกระดานทำให้มีการเคลื่อนไหวเพียงสองวินาทีที่แตกต่างกัน 48 เกมที่แตกต่างมากที่สุด หากคุณคำนึงถึงสัดส่วนการสะท้อนกลับมันจะยิ่งลดลงไปอีก รุ่นพรูนี้น่าเบื่อกว่ารุ่นปกติมาก กอล์ฟออกไป
orion

@orion อันที่จริงความจริงที่ว่าพรูล้อมไม่ได้ห้ามให้เราคิดว่า '0' เป็น 'แรก' rect บนกระดานพรูและแยกทั้งเก้าเขตโดยทั่วไป ... แต่เราเห็นด้วยกับ "meridian 0" ที่ Greenwich ในขณะที่ฝั่งตรงข้ามของโลกเราสามารถเป็นหนึ่งขาในสถานที่ที่เป็นวันพฤหัสบดีขาข้างหนึ่งอยู่ในวันพุธ (24h แตกต่างกันในเวลาท้องถิ่น!) - และทั้งหมดแม้จะมีความจริงที่ว่าโลกเป็นรอบและไม่มี "จุดเริ่มต้น" ...
pawel.boczarski

@Rodney Nope เป็นหนึ่งไม่ใช่เจ็ด ลองคำนวณดู
Jakube

คำตอบ:


6

JavaScript (ES6), 266 308 317 334 341

ฟังก์ชันส่งคืนสตริง แก้ไขพบวิธีแก้ปัญหาทางคณิตศาสตร์สำหรับฟังก์ชัน M (ในที่สุด!)

F=(n,x=[],M=(a,b,t=-a-b)=>(a-b)%3?a<3&b<3?3+t:a>5&b>5?21+t:12+t:9+t+a%3*3)=>
[for(a of z='012345678')for(b of z)for(c of z)for(d of z) 
a-b&&c-a&&c-b&&(b-(y=M(a,c))?d==y:d-a&&d-b&&d-c)&&(
f=M(c,e=M(b,d)),g=M(a,e),g<f?[f,g]=[g,f]:0,r=a+b+c+d+e,x.push(r+f+g,r+g+f))]
&&x[n]

ไร้เดียงสามากก็สามารถจะสั้นลงในหลาย ๆ เพียงระบุค่าทางกฎหมายทั้งหมดที่เป็นไปได้และส่งคืนสิ่งที่พบในที่ที่ n ฟังก์ชั่น M ส่งคืนตำแหน่งระหว่างสองเซลล์นั่นคือการย้ายที่บังคับเพื่อบล็อกผู้เล่นฝั่งตรงข้าม

อ่านเพิ่มเติม

F=(n,x=[],
  M=(a,b,t=-a-b)=>(a-b)%3? 
     a<3&b<3?
       3+t // first row
       :a>5&b>5?
          21+t // last row
          :12+t // middle row and diags
     :9+t+a%3*3 // columns
  )=>
  [for(a of z='012345678') // enumerate the first 4 moves
     for(b of z)
       for(c of z)
         for(d of z) 
           a-b&&c-a&&c-b // avoid duplicates
           &&(b-(y=M(a,c))?d==y:d-a&&d-b&&d-c) // and check if d must block a-c or it's free
           &&(
             e=M(b,d), // forced to block b-d
             f=M(c,e),g=M(a,e),g<f?[f,g]=[g,f]:0, // f and g could be in the wrong order
             r=a+b+c+d+e, // start building a return string
             x.push(r+f+g,r+g+f) // store all values in x
  )]&&x[n] // return value at requested position

3

ระดับเสียงคู่กัน, 467 369 363 309 297 ตัวอักษร

297:

global t=0*(1:9)m=dec2bin([15;113;897;1170;1316;1608;2370;2216;2580])-48 a;
function g(s,p)global a t m;
if nnz(s)<8&&any((t==1)*m>2)a=[a;s];return;end;q=t==3-p;
(r=sort(~q.*(1:9)*m(:,find([3 1]*([q;t==p]*m)==6)')))||(r=find(~t));
for i=r t(i)=p;g([s i+47],3-p);t(i)=0;end;end;g('',1);f=@(n)a(n+1,:);

การเปลี่ยนแปลงที่เกี่ยวข้องเพียงอย่างเดียวคือ เราไม่เคยตรวจสอบว่าผู้เล่นในปัจจุบันสามารถชนะเพียงตรวจสอบความเป็นไปได้ของฝ่ายตรงข้ามที่จะชนะการเปิดต่อไป เนื่องจากผู้เล่น 1 คนเท่านั้นที่สามารถชนะได้คือเทิร์น 7นี่เป็นสถานที่เดียวที่อัลกอริทึมจะสร้างเกมที่ไม่เหมาะสม แต่มันง่ายมากในการกรองสถานการณ์ดังกล่าวออกมา เราเพียงตรวจสอบแต่ละเกมที่สร้างขึ้นหากผู้เล่นคนที่ 1 ชนะ - หากไม่ใช่เกมการย้ายในรอบที่ 7 นั้นไม่ถูกต้องดังนั้นเราจึงไม่เพิ่มเกมนี้ลงในตารางเกมที่ดีที่สุด

(ครึ่งหนึ่งของเกมที่สร้างขึ้นโดยกฎนี้เป็นเท็จเช่นในรอบที่ 7 ผู้เล่น 1 มีความเป็นไปได้สองทางในการปิดกั้นผู้เล่นสองคน แต่มีเพียงเกมเดียวเท่านั้นที่จะทำให้เขาชนะทันที)

ใช้:

$ octave
octave:1>> source script.m
octave:2>> f(634)
ans = 3270148

รหัส ungolfed ดูเหมือนว่า:

 global t=0*(1:9);
 global m=dec2bin([15;113;897;1170;1316;1608;2370;2216;2580])-48;
 global allgames;
 allgames=[];

 function r=canbewon(by)
  global t m
  q=[t==by;t==(3-by)]*m;
  g=(find([3 1]*q==6))';
  r=sort((~(t==by).*(1:9)) * m(:,g));
 end

 function games_starting_with(s)
 global allgames t;
 if 7==numel(s) && any((t==1)*m==3) # it's 7th move and first player won
  allgames=[allgames;s];
  return;
 end;
 poss=(find(~t));                  # for now all free slots are possible
 player=1+mod(numel(s),2);
 moves = canbewon(3-player);
 if numel(moves) poss=moves; end;  # ... no, we must block the other player
 for i=poss
  t(i)=player;
  games_starting_with([s char(i+47)]);
  t(i)=0;
 end
end

games_starting_with('');
f=@(n)(allgames(n+1,:));

1
คำใบ้เล็ก ๆ : คุณสามารถตัดออกเวอร์ชันเก่าหากพวกเขาใช้ตรรกะเดียวกันเนื่องจากสิ่งเหล่านี้ถูกเก็บไว้ในประวัติการแก้ไขเพื่อให้พวกเขายังคงพร้อมใช้งาน
masterX244
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.