กำหนดชัยชนะใน Tictactoe


19

ลองเล่นโค้ดกอล์ฟกัน!

ได้รับสถานะบอร์ด tic-tac-toe (ตัวอย่าง :)

|x|x|o|
|x|o|x|
|o|o|x|

ตรวจสอบว่าเกมเป็นหรือ รหัสของคุณควรส่งออกตัวเลือกใด ๆ เหล่านี้เมื่อได้รับสถานะ เกมดังกล่าวข้างต้นควรจะออกwinlosecatlose

เพื่อให้ชัดเจน: การชนะหมายถึง 3 xs ใด ๆในแถว (แนวทแยง, แนวนอน, แนวตั้ง) การสูญเสียคือ 3 oวินาทีในขณะที่catเกมไม่มีใครอยู่ติดกัน

เพื่อให้สิ่งต่าง ๆ น่าสนใจคุณจะต้องกำหนดโครงสร้างข้อมูลเข้าของคุณสำหรับสถานะที่คุณต้องอธิบาย ตัวอย่างเช่นxxoxoxooxเป็นสถานะที่ถูกต้องตามที่เห็นด้านบนซึ่งอักขระแต่ละตัวถูกอ่านจากซ้ายไปขวาบนลงล่าง [['x','x','o'],['x','o','x'],['o','o','x']]เป็นเกมในอาเรย์หลายมิติอ่านในทำนองเดียวกัน ในขณะที่0x1a9ซึ่งเป็นฐานสิบหกสำหรับ110101001การทำงานอาจจะเป็นการบีบอัดที่เหมาะสมที่1สามารถจัดการสำหรับxและสามารถจัดการสำหรับ0o

แต่นั่นเป็นเพียงความคิดบางอย่างฉันแน่ใจว่าคุณอาจมีของคุณเองมากมาย

กฎพื้นฐาน:

  1. โปรแกรมของคุณจะต้องสามารถยอมรับสถานะใด ๆ ที่ทำงานได้
  2. รูปแบบการป้อนข้อมูลจะต้องสามารถเป็นตัวแทนของรัฐใด ๆ
  3. "สถานะชนะต้องถูกกำหนดจากกระดาน"
  4. สมมติว่าบอร์ดสมบูรณ์
  5. Winก่อนloseเช่นในกรณี 'xxxoooxxx'

จำนวนตัวละครต่ำสุดชนะ


1
ฉันชอบโครงสร้างอินพุตนี้: (win|lose|cat) [xo]{9}ที่คำแรกแสดงว่าเกมชนะหรือแพ้ (สำหรับ) สำหรับผู้เล่น x สามารถเป็นตัวแทนของรัฐใด ๆ
Runer112

2
ฉันสามารถแนะนำกฎเช่น "รัฐที่ชนะจะต้องพิจารณาจากกระดาน" หรือ "ข้อมูลนั้นจะต้องไม่มีข้อมูลใด ๆ ยกเว้นสถานะกระดาน"
undergroundmonorail

3
เราสมมติว่าเล่นเกมตามกฎหมายเท่านั้นหรือไม่ ถ้าเป็นเช่นนั้นบางรัฐจะเป็นไปไม่ได้เช่น XXX OOO XXX แต่อย่างใดบางรัฐแบบเต็มคณะกรรมการรวมนี้เป็นผลที่เป็นไปไม่ได้ที่สี่ที่ X ชนะ แต่ O ชนะ
Riot

10
ทำไม "แมว" ไม่สนใจ?
Chris

7
@DylanMadisetti: ไม่เคยได้ยินมาก่อนและ googlign สำหรับ "win lost cat" ก็ไม่มีอะไรเกิดขึ้น ฉันจะไปผูกหรือวาดเป็นการส่วนตัว หรือในกรณีของเกมนี้อาจจะ "หลีกเลี่ยงไม่ได้" ;-) ฉันไม่ได้สนใจอะไรมากนักเท่าที่การแข่งขันดำเนินไป สตริงคือสตริง ;-)
Chris

คำตอบ:


11

Ruby 2.0, 85 ตัวอักษร

นี่คือโซลูชัน bitmask-based แบบง่าย ๆ ใน Ruby:

d=gets.hex
$><<[292,146,73,448,56,7,273,84].map{|m|d&m<1?:lose:d&m<m ?:cat: :win}.max

กระดานจะแสดงเป็นเลขฐานสิบหกประกอบด้วยเก้าบิตที่สอดคล้องกับเก้าสี่เหลี่ยม 1 เป็นX0 Oเป็น นี่เป็นเหมือน0x1a9ตัวอย่างในคำถามแม้ว่าจะ0xเป็นตัวเลือก!

อาจเป็นวิธีที่ดีกว่าในการทำ bitmasks จากนั้นทำการ hardcoding รายการขนาดใหญ่ ฉันจะรับคำแนะนำอย่างมีความสุข

ดูมันทำงานบน Ideone ที่นี่


1
รายการของคุณมี273สองครั้ง และฉันชอบmaxความคิดจริงๆ!
Ventero

1
โอ้ @Ventero มักจะมีการเพิ่มประสิทธิภาพที่ชัดเจน (ขอบคุณ)
Paul Prestidge

อาจมีช่องว่างบนกระดาน รูปแบบการป้อนข้อมูลของคุณไม่ได้คำนึงถึงสิ่งนี้และดังนั้นจึงไม่สามารถแสดงสถานะของเกมที่ทำงานได้
สตีเฟ่น Ostermiller

2
@StephenOstermiller กฎ 4: ถือว่าบอร์ดสมบูรณ์ คุณถูกต้องว่ากฎนี้อาจขัดแย้งกับกฎ 1 และ 2 อย่างไรก็ตามหากคุณอ่านความคิดเห็นทั้งหมดเกี่ยวกับคำถามที่ฉันคิดว่านี่เป็นจิตวิญญาณของคำถาม (บอร์ดที่ไม่สมบูรณ์จะไม่ได้รับการครอบคลุม อย่างไรก็ตามฉันคิดว่าฐานแปดจะเป็นรูปแบบอินพุตที่ใช้งานง่ายกว่า hex
Level River St

1
เข้าใจแล้วฉันคิดว่าสมบูรณ์หมายถึงสิ่งที่แตกต่าง
Stephen Ostermiller

10

Mathematica, 84 ตัวอักษร

a=Input[];Which[Max@#>2,win,Min@#<1,lose,1>0,cat]&@{Tr@a,Tr@Reverse@a,Tr/@a,Total@a}

รูปแบบอินพุต: {{1, 1, 0}, {1, 0, 1}, {0, 0, 1}}


เกิดอะไรขึ้นที่นี่
seequ

3
@TheRare เริ่มจากด้านขวา Tr@aคือร่องรอยของสนาม (ผลรวมเหนือแนวทแยงมุม) Tr@Reverse@aคือร่องรอยของสนามพลิก (บางส่วนผ่านแนวทแยงมุม) Tr/@aถูกTrนำไปใช้กับแต่ละแถวซึ่งให้ผลรวมกับแต่ละแถวTotal@aให้ผลรวมกับแต่ละคอลัมน์ โดยพื้นฐานแล้วคุณมี 8 บรรทัดที่คุณต้องตรวจสอบ จากนั้นWhichสิ่งที่นำไปใช้กับที่ (โดยทั่วไปif/elseif/elseคำสั่ง) ซึ่ง#แสดงถึงรายการของค่า 8 ที่ ifมี3คุณชนะelse ifมี0คุณสูญเสีย(จริง)else if 1>0 cat
Martin Ender

6

Bash: 283 262 258

โดดเด่นด้วยอินเตอร์เฟสที่ค่อนข้างเป็นมิตร

t(){ sed 's/X/true/g;s/O/false/g'<<<$@;}
y(){ t $(sed 's/X/Q/g;s/O/X/g;s/Q/O/g'<<<$@);}
f(){($1&&$2&&$3)||($1&&$5&&$9)||($1&&$4&&$7)||($2&&$5&&$8)||($3&&$5&&$7)||($3&&$6&&$9)||($4&&$5&&$6)||($7&&$8&&$9)}
f $(t $@)&&echo win||(f $(y $@)&&echo lose)||echo cat

เพื่อรัน bash tictactoe.sh O X O X O X X O X

หมายเหตุ: รายการของ 9 ตำแหน่งคือการแสดงเมทริกซ์มาตรฐาน ไม่สำคัญว่าบอร์ดจะแสดงเป็นคอลัมน์หลักหรือแถวหลักอ่านจากซ้ายไปขวาหรือจากบนลงล่าง - เกมของเอกซ์และกากบาท (หรือนิ้วเท้าแทคหากคุณยืนยัน) มีความสมมาตรดังนั้นคำสั่งซื้อที่ไม่เกี่ยวข้อง ไปยังผลลัพธ์ในทุกการใช้งานที่ถูกต้องตราบใดที่อินพุตเป็นเส้นตรง

แก้ไข: ขอบคุณ hjk สำหรับคำแนะนำทางไวยากรณ์ของฟังก์ชันที่สั้นกว่า


พิจารณาt() { ... }แทนที่จะเป็นfunction t? สามารถบันทึกตัวละครบางตัวที่นั่น :)
hjk

ฉันลืมทั้งหมดเกี่ยวกับไวยากรณ์ของฟังก์ชันทางเลือก - ขอบคุณ!
จลาจล

ไม่จำเป็นต้องเว้นวรรค<<<เพื่อบันทึกอักขระอีกสี่ตัว
Michael Mior

4

Befunge 93 - 375

ใช้สตริงไบนารีเป็นอินพุต

99>~\1-:!!|>v  
>0v>v>v   >^$>v
^+ + +    0<:p:
>#+#+#+    ^246
^+ + +    0<265
>#+#+#+    ^pp6
^+ + +    0<2++
 #+#+#+     55p
   0 0      552
  >^>^>0v   +46
v+ + +  <   ppp
>0 + + + v  444
   v!!-3:<< 246
  v_"ni"v   ppp
  0v" w"<   :+:
  \>,,,,@   266
  ->,,,@    555
  !^"cat"_^ 645
  !>:9-! ^  +:+
  >|        p:p
   >"eso"v  6p6
 @,,,,"l"<  246
            p2p
            >^ 
  v       <^  <

อ่านสตริง Bruteforce เขียนมัน (แถบแนวตั้งที่เหมาะสมที่สุด) เป็นเมทริกซ์ระหว่าง

^+ + + 
>#+#+#+
^+ + + 
>#+#+#+
^+ + + 
 #+#+#+

เพิ่มขัดแตะ (idk) กำหนดผลรวมของคอลัมน์แถวและการวิเคราะห์สองรายการ เปรียบเทียบค่าเหล่านั้นกับ 3 ("win") หรือ 0 ("แพ้") มิฉะนั้นหากค่าทั้งหมดเท่ากับ 1 หรือ 2 แล้ววาด ("cat")


4

GolfScript, 27 ตัวอักษร

70&.{~"win""lose"if}"cat"if

รูปแบบการป้อนข้อมูลเป็นสตริงที่ประกอบด้วยตัวเลขแปดแปดหลักแต่ละส่วน (ซ้ำซ้อน) เข้ารหัสตารางสี่เหลี่ยมที่ต่อเนื่องกันสามอัน:

  • ตัวเลขสามหลักแรกแต่ละตัวเข้ารหัสแถวเดียวของบอร์ดจากบนลงล่างและซ้ายไปขวา
  • ตัวเลขสามหลักต่อไปนี้แต่ละเข้ารหัสหนึ่งคอลัมน์ของบอร์ดจากซ้ายไปขวาและจากบนลงล่าง
  • ตัวเลขสองหลักสุดท้ายแต่ละเข้ารหัสหนึ่งของ diagonals (แรกจากบนซ้ายไปล่างขวาจากนั้นจากล่างซ้ายไปขวาบน)

หากต้องการเข้ารหัสลำดับ (แถว / คอลัมน์ / แนวทะแยง) ของสามสแควร์เป็นตัวเลขฐานแปดให้แทนที่ทุกxลำดับด้วย 1 และทุก ๆoด้วย 0 และตีความลำดับผลลัพธ์ของเลข 1 และเลขศูนย์เป็น 0 ระหว่างเลข 7 และ 7 รวมทั้ง

รูปแบบการป้อนข้อมูลนี้ค่อนข้างซ้ำซ้อน (ตำแหน่งของคณะกรรมการทั้งหมดถูกเข้ารหัสอย่างน้อยสองครั้งโดยมีตำแหน่งตรงกลางเข้ารหัสสี่ครั้ง) แต่มันไม่ได้แสดงถึงสถานะที่เป็นไปได้ใด ๆ ของคณะกรรมการ tic-tac-toe ที่สมบูรณ์และไม่เข้ารหัสโดยตรงผู้ชนะในการป้อนข้อมูล

อินพุตอาจมีช่องว่างหรือตัวคั่นอื่นระหว่างตัวเลข ในความเป็นจริงโปรแกรมทั้งหมดที่ใส่ใจจริงๆคือสตริงอินพุตมีตัวเลข7หรือ0ไม่

ตัวอย่างเช่นกระดานตัวอย่าง:

|x|x|o|
|x|o|x|
|o|o|x|

อาจแสดงโดยอินพุต:

651 643 50

เพื่อความสะดวกนี่คือโปรแกรม GolfScript เพื่อแปลงเลย์เอาต์ของบอร์ด ASCII ดังที่แสดงในความท้าทายข้างต้นเป็นสตริงอินพุตที่เหมาะสมสำหรับโปรแกรมนี้:

."XOxo"--[{1&!}/]:a[3/.zip"048642"{15&a=}%3/]{{2base""+}%}%" "*

ตัวแปลงนี้จะละเว้นอักขระใด ๆ นอกเหนือจากxและoในกรณีใด ๆ ในอินพุต มันผลิตสายอักขระตัวเลขเดี่ยว (พร้อมด้วยตัวคั่นช่องว่างดังที่แสดงไว้ด้านบน) เหมาะสำหรับป้อนเข้าสู่โปรแกรมตรวจสอบการชนะด้านบนดังนั้นการต่อโปรแกรมสองโปรแกรมนี้เข้าด้วยกันเพื่อกำหนดผู้ชนะโดยตรงจาก ASCII art board

นอกจากนี้นี่คือตัวแปลงกลับเพื่อแสดงให้เห็นว่าอินพุตนั้นแสดงถึงบอร์ดได้อย่างไม่น่าสงสัย:

.56,48>-- 3<{2base-3>{"ox"=}%n}%"|".@@*+);

ps นี่คือตัวอย่างออนไลน์ของการแก้ปัญหานี้


2
รูปแบบการป้อนข้อมูลดูเหมือนว่ามีการโกงเล็กน้อยเนื่องจากมีงานจำนวนมากเกิดขึ้นในการสร้างอินพุต
Arkku

@Arkku: ใช่แล้วมันเป็น แต่คำถามอย่างชัดเจนบอกว่า "คุณได้รับการกำหนดโครงสร้างการป้อนข้อมูลของคุณสำหรับรัฐ - ซึ่งคุณจะต้องอธิบายแล้ว" มันยังแสดงสตริง hex ที่เต็มไปด้วยบิตเป็นตัวอย่างของรูปแบบอินพุตที่ถูกต้อง ความแตกต่างเพียงอย่างเดียวระหว่างสิ่งนั้นกับรูปแบบการป้อนข้อมูลของฉันคือฉันเรียงลำดับใหม่และทำซ้ำบางส่วน
Ilmari Karonen

6
มันเป็นการจำลองแบบที่ดูเหมือนโกง (เช่นมันไม่โดยตรงเข้ารหัสผู้ชนะกับการปรากฏตัวของ 7 หรือ 0 ในการป้อนข้อมูล)
Arkku

ยังเป็นการเข้ารหัสที่ฉลาด แต่มันซ้ำซ้อน แต่ทำให้การค้นหาโซลูชันมีประสิทธิภาพมากกว่าการเข้ารหัสที่ไม่ซ้ำซ้อน!
ARRG

3

Python 2 - 214 ไบต์

b=eval(raw_input())
s=map(sum,b)
w,l='win','lose'
e="if min(s)<1:print l;a\nif max(s)>2:print w;a"
exec e+'\ns=map(sum,zip(*b))\n'+e
m=b[1][1]
for i in 0,2:
 if m==b[0][i]==b[2][abs(i-2)]:print[l,w][m];a
print'cat'

ฉันแน่ใจว่ามีการปรับปรุงที่จะทำ

วิ่ง:

python2 tictactoe.py <<< '[[1,1,1],[1,0,1],[0,1,0]]'

ซึ่งแสดงถึงกระดานนี้:

X|X|X
-----
X|O|X
-----
0|X|0

ออกจากการมีข้อยกเว้นในทุกกรณียกเว้นNameErrorcat


โอ้โหฉันไม่เคยรู้เกี่ยวกับ<<<! +1 สำหรับสิ่งนั้น
Greg Hewgill

@ GregHewgill สะดวกดีทีเดียว ./whatever <<< 'blah blah blah'เป็นเช่นเดียวแต่โดยไม่ต้องมีกระบวนการแยกทั้งecho -n 'blah blah blah' | ./whatever echo
undergroundmonorail

@undergroundmonorail echoในความbashเป็นจริงในตัวจึงไม่แยกกระบวนการใหม่
Bob

@ GregHewgill มันถูกเรียกว่า herestring

3

Haskell, 146 ตัวอักษร

เพื่อให้สิ่งต่าง ๆ น่าสนใจคุณจะต้องกำหนดโครงสร้างข้อมูลเข้าของคุณสำหรับสถานะที่คุณต้องอธิบาย

ตกลง :). การเป็นตัวแทนคณะกรรมการของฉันคือหนึ่งใน 126 ตัวอักษร

ĻŃŇʼnŊœŗřŚşšŢťŦŨųŷŹźsƁƂƅƆƈƏƑƒƕƖƘƝƞƠƤƳƷƹƺƿǁǂDždžLjǏǑǒǕǖǘǝǞǠǤǯDZDzǵǶǸǽǾȀȄȍȎȐȔȜȳȷȹȺȿɁɂɅɆɈɏɑɒɕɖɘɝɞɠɤɯɱɲɵɶɸɽɾʀʄʍʎʐʔʜʯʱʲʵʶʸ''ˀˎː˔~˭ˮ˰˴˼̌

นี่คือวิธีการแก้ปัญหาใน 146 ตัวอักษร:

main=interact$(\x->case(head x)of h|elem h "ĻŃœťŦŨųŷŹƁƂƅƈƕƠƤƳƿǂdžǞǤǵǾȀȳȿɁɅɑɒɘɝɠɤɵɽʀʐʽʾː˭ˮ˰˴˼̌"->"lose";h|elem h "ƏƝƞƹǁLjǑǝȍȺɆɈɶɾʎʸ"->"cat";h->"win")

และนี่คือวิธีการทำงานในรูปแบบของ Haskell:

import Data.List (subsequences, (\\))
import Data.Char (chr)

-- A set of indexes [0-8] describing where on the board pieces of a single color have been played
-- For example the board "OxO;Oxx;xxO" is indexes [0,2,3,8]
type Play = [Int]

-- There are 126 filled tic tac toe boards when X plays first.
--      (This is a combination of 4 OHs among 9 places : binomial(9 4) = 126)
-- perms returns a list of all such possible boards (represented by the index of their OHs).
perms = filter (\x -> 4 == length x) $ subsequences [0..8]

-- We now create an encoding for plays that brings them down to a single char.
-- The index list can be seen as an 9 bit binary word [0,2,3,8] -> '100001101'
-- This, in turn is the integer 269. The possible boards give integers between 15 and 480.
-- Let's call those PlayInts
type PlayInt = Int

permToInt [] = 0
permToInt (x:xs) = (2 ^ x) + permToInt xs 

-- Since the characters in the range 15-480 are not all printable. We offset the chars by 300, this gives the range 
-- ĻŃŇʼnŊœŗřŚşšŢťŦŨųŷŹźſƁƂƅƆƈƏƑƒƕƖƘƝƞƠƤƳƷƹƺƿǁǂDždžLjǏǑǒǕǖǘǝǞǠǤǯDZDzǵǶǸǽǾȀȄȍȎȐȔȜȳȷȹȺȿɁɂɅɆɈɏɑɒɕɖɘɝɞɠɤɯɱɲɵɶɸɽɾʀʄʍʎʐʔʜʯʱʲʵʶʸʽʾˀ˄ˍˎː˔˜˭ˮ˰˴˼̌
-- Of all distinct, printable characters
uOffset = 300

-- Transform a PlayInt to its Char representation
pIntToUnicode i = chr $ i + uOffset

-- Helper function to convert a board in a more user friendly representation to its Char
-- This accepts a representation in the form "xooxxxoxo"
convertBoard s = let play = map snd $ filter (\(c, i) -> c == 'o') $ (zip s [0..]) :: Play 
    in pIntToUnicode $ permToInt play

--
-- Now let's cook some data for our final result
--  

-- All boards as chars
allUnicode = let allInts = map permToInt perms 
    in map pIntToUnicode allInts

-- Now let's determine which boards give which outcome.

-- These are all lines, columns, and diags that give a win when filled
wins = [
        [0,1,2],[3,4,5],[6,7,8], -- lines
        [0,3,6],[1,4,7],[2,5,8], -- columns
        [0,4,8],[2,4,6] -- diagonals
    ]

isWin :: Play -> Bool   
isWin ps = let triplets = filter (\x -> 3 == length x) $ subsequences ps -- extract all triplets in the 4 or 5 moves played
    in any (\t -> t `elem` wins) triplets -- And check if any is a win line

-- These are OH wins
oWins = filter isWin perms
-- EX wins when the complement board wins
xWins = filter (isWin . complement) perms
    where complement ps = [0..9] \\ ps
-- And it's stalemate otherwise
cWins = (perms \\ oWins) \\ xWins

-- Write the cooked data to files
cookData = let toString = map (pIntToUnicode . permToInt) in do
  writeFile "all.txt" allUnicode
  writeFile "cWins.txt" $ toString cWins
  writeFile "oWins.txt" $ toString oWins
  writeFile "xWins.txt" $ toString xWins

-- Now we know that there are 48 OH-wins, 16 stalemates, and 62 EX wins (they have more because they play 5 times instead of 4).
-- Finding the solution is just checking to which set an input board belongs to (ungolfed :)
main = interact $ \x -> case (head x) of -- Only consider the first input char
    h | elem h "ĻŃœťŦŨųŷŹƁƂƅƈƕƠƤƳƿǂdžǞǤǵǾȀȳȿɁɅɑɒɘɝɠɤɵɽʀʐʽʾː˭ˮ˰˴˼̌" -> "lose" -- This string is == oWins
    h | elem h "ƏƝƞƹǁLjǑǝȍȺɆɈɶɾʎʸ" -> "cat" -- And this one == cWins
    h -> "win"

3

JavaScript, 420 ตัวอักษร

if((s&0x3F000)==0x3F000||(s&0x00FC0)==0x00FC0||(s&0x0003F)==0x0003F||(s&0x030C3)==0x030C3||(s&0x0C30C)==0x0C30C||(s&0x30C30)==0x30C30||(s&0x03330)==0x03330||(s&0x30303)==0x30303)return 'win'
if((s&0x3F000)==0x2A000||(s&0x00FC0)==0x00A80||(s&0x0003F)==0x0002A||(s&0x030C3)==0x02082||(s&0x0C30C)==0x08208||(s&0x30C30)==0x20820||(s&0x03330)==0x02220||(s&0x30303)==0x20202)return 'lose'
if((s&0x2AAAA)==0x2AAAA)return 'cat'

ในรุ่นsนี้มีจำนวนเต็มซึ่งแสดงถึงสถานะของเกมกระดาน เป็นอาร์เรย์ของค่าที่มีสองบิตแทนแต่ละช่องบนกระดาน:

  • 10 - X
  • 11 - โอ
  • 00 - สี่เหลี่ยมจัตุรัสที่ว่างเปล่า

โซลูชันนี้ใช้การจัดการบิตเพื่อทดสอบการกำหนดค่า "สามในแถว" ที่เป็นไปได้แปดแบบ (ทดสอบแต่ละสองครั้งครั้งละหนึ่งครั้งสำหรับ X และอีกครั้งสำหรับ O)

ฉันนำเสนอสิ่งนี้ด้วยการย่อส่วนเล็กน้อยจากเว็บไซต์Tic-Tac-Toe ของฉันซึ่งdetectWinมีการใช้งานฟังก์ชั่นนี้เป็นส่วนหนึ่งของเกม Tic-Tac-Toe จริง


6
ทีนี้นี่อาจเรียกว่าเดรัจฉานบังคับได้
seequ

2

Ruby, 84 ตัวอักษร

$><<(gets.tr("01","10")[r=/0..(0|.0.)..0|000(...)*$|^..0.0.0/]?:win:~r ?:lose: :cat)

วิธีการแก้ปัญหาที่เรียบง่ายและใช้ RegExp รูปแบบการป้อนข้อมูลเป็นสตริงไบนารี 9 หลักเช่น110101001สำหรับบอร์ดตัวอย่างที่ให้ไว้ในคำถาม

Ruby, 78 ตัวอักษร

$><<(gets.tr("ox","xo")[r=/o...(o|.o.)...o|ooo|o_.o._o/]?:win:~r ?:lose: :cat)

รูปแบบอินพุต: xxo_xox_oox


1

Haskell, 169

main=interact$(\x->last$"cat":[b|(a,b)<-[("ooo","lose"),("xxx","win")],any(==a)x]).(\x->x++(foldr(zipWith(:))(repeat[])x)++map(zipWith(!!)x)[[0..],[2,1,0]]).take 3.lines

รูปแบบอินพุต: "X" เป็นตัวแทนโดยเฉพาะx"O" oโดยเฉพาะ ภายในแต่ละแถวอักขระจะพร้อมกันโดยไม่มีช่องว่าง ฯลฯ แถวจะถูกคั่นด้วยบรรทัดใหม่

สร้างแถว / คอลัมน์ / diagonals ที่เป็นไปได้ทั้งหมดแล้วกรอง[("ooo","lose"),("xxx","win")]ตามการมีอยู่บนกระดานจากนั้นเลือกคำที่สองใน tuple เพื่อให้เรารู้ว่าผู้เล่นคนไหนชนะ เราเสริม"cat"เพื่อให้เราสามารถนำองค์ประกอบสุดท้ายของรายการเป็นผู้ชนะของเรา หากผู้เล่นทั้งสองชนะ"win"จะเป็นครั้งสุดท้าย เนื่องจาก"cat"จะเป็นอันดับแรกเสมอหากมีผู้ชนะอยู่ก็จะถูกเลือก แต่อย่างอื่นองค์ประกอบสุดท้ายยังคงมีอยู่ว่าเป็นการ"cat"รับประกันที่ไม่เพียงพอ

แก้ไข: โกน 3 mapตัวอักษรโดยการเปลี่ยนความเข้าใจในรายการสุดท้ายที่จะ


1

C, 150 ประมาณ

เที่ยงคืนที่นี่และฉันยังไม่ได้ทำการทดสอบใด ๆแต่ฉันจะโพสต์แนวคิดต่อไป พรุ่งนี้ฉันจะกลับไปหามัน

ผู้ใช้ป้อนหมายเลขแปดแปดตัว (ฉันต้องการใช้เลขฐานสอง แต่เท่าที่ฉันรู้ว่า C รองรับเฉพาะฐานแปด):

a หมายถึงจตุรัสกลาง 1 สำหรับ X, 0 สำหรับ O

b เป็นตัวเลขเก้าหลักที่แสดงถึงเส้นรอบวงรอบวงรอบกระดานเริ่มต้นที่มุมหนึ่งและจบในมุมเดียวกัน (ด้วยการทำซ้ำของมุมนั้นเท่านั้น) 1 สำหรับ X, 0 สำหรับ O

มีสองวิธีที่เป็นไปได้ที่จะชนะ:

  1. จัตุรัสกลางคือ X ( a= 1) และสี่เหลี่ยมสองอันตรงข้ามก็คือ X ( b&b*4096ไม่ใช่ศูนย์)

  2. สามสี่เหลี่ยมที่อยู่ติดกันคือ X ( b/8 & b & b*8ไม่ใช่ศูนย์) นี่เป็นเพียงการชนะที่ถูกต้องหากสี่เหลี่ยมกลางเป็นสี่เหลี่ยมจัตุรัสไม่ใช่สี่เหลี่ยมมุมดังนั้นจึงจำเป็นต้องใช้มาสก์mเพื่อหลีกเลี่ยงกรณีสี่เหลี่ยมมุม

ตรวจพบการสูญเสียโดยใช้ตัวแปร c ซึ่งเป็นค่าผกผันของ b

int a,b,c,m=010101010;
main(){
    scanf("%o%o",a,b);c=b^0111111111;
    printf("%s",(a&&b&b*4096)|(b/8&b&b*8&m)?"win":((!a&&c&c*4096)|(c/8&c&c*8)?"lose":"cat"));
}

คุณลืมที่จะใช้หน้ากากmในการตรวจสอบ "สูญเสีย" c/8&c&c*8- ฉันเล่นกอล์ฟซ้ำรหัสของคุณ (โดยไม่ต้องทดสอบการทำงาน) ดังต่อไปนี้: int a,b;t(v){return a&&v&v<<12||v/8&v&v*8&0x208208;}main(){scanf("%o%o",a,b);printf("%s",t(b)?"win":t(b^0x1249249)?"lose":"cat");}(130 ตัวอักษร) การทดสอบซ้ำแล้วซ้ำอีกเป็นเวลานานพอที่จะดึงเข้ามาในฟังก์ชั่นการทดสอบt(); สิ่งนี้จะขจัดความต้องการcและm; ค่าคงที่แปลงเป็น hex เพื่อบันทึกหนึ่งอักขระ
Toby Speight

เพิ่งเห็นว่าprintfไม่ต้องการสตริงรูปแบบ - เพียงระบุสตริงผลลัพธ์เป็นรูปแบบ - หรือputsเนื่องจากคำถามไม่ขอบรรทัดใหม่หลังจากเอาต์พุต! (บันทึกอีก 7 ตัวอักษร)
Toby Speight

1

ทุบตี, 107 103

สร้างและรันสคริปต์ sed

รูปแบบ I / O: oxo-oox-xooเอาต์พุตlose(ใช้-เพื่อแยกแถว) อินพุตบน stdin ต้องการ GNU sed สำหรับcคำสั่ง

ฉันตีความกฏ 5 ว่า "ถ้าทั้งชนะและแพ้มีความเป็นไปได้เลือกชนะ"

รหัสหลัก

นี่คือคำตอบที่แท้จริง

ไม่มีอะไรน่าสนใจจริงๆ มันกำหนด$bเป็น/cwinเพื่อบันทึกตัวอักษรแล้วกำหนดส่วนสภาพชนะของสคริปต์แล้วใช้sed y/x/o/\;s$b/close/การแปลงxไปoและcwinไปclose(จึงสร้างเงื่อนไขแพ้) จากนั้นจะส่งสองสิ่งและccat(ซึ่งจะส่งออกcatหากไม่มีเงื่อนไขการชนะ / แพ้) ไปยัง sed

b=/cwin
v="/xxx$b
/x...x...x$b
/x..-.x.-..x$b
/x-.x.-x$b"
sed "$v
`sed y/x/o/\;s$b/close/<<<"$v"`
ccat"

สร้างรหัส

นี่คือสคริปต์สร้างและสร้างโดยสคริปต์ Bash

ใน regexes .จับคู่อักขระใด ๆ และหลังจากนั้นจะcTEXTพิมพ์ TEXT และออกหากมีการจับคู่ regex

สิ่งนี้สามารถเรียกใช้เป็นสคริปต์แบบสแตนด์อโลน มีความยาว 125 อักขระคุณสามารถนับเป็นโซลูชันอื่นได้

/xxx/cwin
/x...x...x/cwin
/x..-.x.-..x/cwin
/x-.x.-x/cwin
/ooo/close
/o...o...o/close
/o..-.o.-..o/close
/o-.o.-o/close
ccat

1

Python 3, 45

อินพุตอยู่iซึ่งเป็นรายการของตัวเลขที่แสดงถึงแต่ละแถวคอลัมน์และแนวทแยงของกระดานเกมเช่น:

X X O
O X O
O O X

[6, 2, 1, 4, 6, 1, 7, 4]เป็นตัวแทนจาก

รหัส :('cat','lose','win')[2 if 7 in i else 0 in i]


1

Dart - 119

(ดูdartlang.org )

เวอร์ชันดั้งเดิมโดยใช้ RegExp: 151 ตัวอักษร

main(b,{w:"cat",i,p,z}){
 for(p in["olose","xwin"])
   for(i in[0,2,3,4])
     if(b[0].contains(new RegExp('${z=p[0]}(${'.'*i}$z){2}')))
       w=p.substring(1);
  print(w);
}

อินพุตบนบรรทัดรับคำสั่งคือ 11 อักขระเช่น "xxx | ooo | xxx" อักขระที่ไม่ใช่ xo ใด ๆ สามารถใช้เป็นตัวคั่นได้

ควรเว้นเว้นช่องว่างนำหน้าและขึ้นบรรทัดใหม่ก่อนที่จะนับจำนวนตัวอักษร แต่ฉันตัดช่องว่างภายในออกหากเป็นไปได้ ฉันหวังว่าจะมีวิธีที่เล็กกว่าในการสร้างสตริงย่อย

เวอร์ชันบิตฐานซ้ำ ๆ : 119 chars ข้อมูลที่ป้อนต้องเป็นตัวเลข 9 บิตโดยมี 1 วินาทีแทน 'x' และ 0s แทน 'o'

main(n){
  n=int.parse(n[0]);
  z(b,r)=>b>0?b&n==b&511?"win":z(b>>9,n&b==0?"lose":r):r;
  print(z(0x9224893c01c01e2254,"cat"));
}

1

CJam, 39 38 36 ตัวอักษร

"ᔔꉚ굌궽渒䗠脯뗠㰍㔚귇籾〳㎪䬔⹴쪳儏⃒ꈯ琉"2G#b129b:c~

นี่คือรหัสแปลงฐานสำหรับ

q3/_z__Wf%s4%\s4%]`:Q3'o*#"win"{Q'x3*#"lose""cat"?}?

ซึ่งมีความยาว 52 อักขระ

อินพุตเป็นเพียงการแสดงสตริงของบอร์ดโดยเริ่มจากด้านบนซ้ายไปทีละแถว ตัวอย่างเช่น:

oxooxooox

ซึ่งผลลัพธ์ในwinผลลัพธ์ หรือ

oxooxoxox

ซึ่งส่งผลให้ catผลลัพธ์ ฯลฯ

รหัสจะทำสามสิ่งต่อไปนี้:

  • q3/_ - แยกสตริงออกเป็นส่วน ๆ ของ 3 คือต่อแถว
  • _z - คัดลอกอาร์เรย์ต่อแถวและเปลี่ยนเป็นต่ออาร์เรย์คอลัมน์
  • __Wf%s4%- ย้อนกลับแต่ละแถวและรับซ้ายไปขวาในแนวทแยง นี่คือเส้นทแยงมุมที่สองของกระดาน
  • \s4% - รับเส้นทแยงมุมหลักของคณะกรรมการ
  • ]` - ห่อทุกอย่างในอาร์เรย์และทำให้อาร์เรย์เป็นชุด

ตอนนี้เรามีกลุ่มที่เป็นไปได้ 3 กลุ่มจากกระดาน เราเพียงตรวจสอบการมีอยู่ของ "ooo" และ "xxx" เพื่อกำหนดผลลัพธ์

ลองออนไลน์ได้ที่นี่


1

GNU sed, 25 ไบต์

หากอินพุตเป็นตัวแทนที่ซ้ำซ้อนของบอร์ดที่มีมุมมองแยกกันสำหรับคอลัมน์แถวและแนวทแยงมุมตามที่ใช้ในคำตอบอื่นเช่นกันดังนั้น sed จึงเหมาะอย่างยิ่งสำหรับการตรวจสอบสถานะสิ้นสุดของเกมด้วยไบต์ที่น้อยที่สุด

รูปแบบอินพุต: xxx ooo xxx xox xox xox xox xox (สถานะกระดานนำมาจากคำถามของ OP)

/xxx/cwin
/ooo/close
ccat

หากรูปแบบอินพุตไม่ใช่ non-redundant ( xxx ooo xxx) ดังนั้นโค้ด sed ข้างต้นจะใช้ได้ก็ต่อเมื่อได้รับการจัดเตรียมโดยบรรทัดด้านล่างทำให้โปรแกรมมีความยาว 96 ไบต์ (โดยมีการrนับแฟล็กที่จำเป็น)

s/(.)(.)(.) (.)(.)(.) (.)(.)(.)/& \1\4\7 \2\5\8 \3\6\9 \1\5\9 \3\5\7/

1

Bash: 208 ตัวอักษร

y(){ tr '01' '10'<<<$@;}
f(){ x=$[($1&$2&$3)|($1&$5&$9)|($1&$4&$7)|($2&$5&$8)|($3&$5&$7)|($3&$6&$9)|($4&$5&$6)|($7&$8&$9)]; }
f $@;w=$x
f $(y $@)
([ $x -eq 1 ]&&echo lose)||([ $w -eq 1 ]&&echo win)||echo cat

เพื่อรัน bash tictactoe.sh 0 1 0 1 0 1 1 0 1

แรงบันดาลใจจากคำตอบนี้


0

VB.net

ตัวอย่างที่มีให้มีการเข้ารหัสเป็นรูปแบบบิตต่อไปนี้

q  = &B_100101_100110_011010 ' 00 Empty, 01 = O, 10 = X

ตอนนี้เราสามารถกำหนดผลลัพธ์ (หรือผู้ชนะ) โดยทำสิ่งต่อไปนี้

Dim g = {21, 1344, 86016, 66576, 16644, 4161, 65379, 4368}
Dim w = If(g.Any(Function(p)(q And p)=p),"Lose",If(g.Any(Function(p)(q And p*2)=p*2),"Win","Cat"))

0

J - 97 ไบต์

เป็นวิธีที่ง่ายที่สุดที่มีอยู่ อินพุตถูกนำมาเป็น111222333โดยที่ตัวเลขแสดงถึงแถว อ่านจากซ้ายไปขวา Player เป็นศัตรูคือx oสี่เหลี่ยมที่ว่างสามารถเป็นอะไรก็ได้ยกเว้นหรือxo

f=:(cat`lose>@{~'ooo'&c)`('win'"_)@.('xxx'&c=:+./@(r,(r|:),((r=:-:"1)(0 4 8&{,:2 4 6&{)@,))3 3&$)

ตัวอย่าง: (NB. เป็นความคิดเห็น)

   f 'xoxxoxxox' NB. Victory from first and last column.
win
   f 'oxxxooxxx' NB. Victory from last row.
win
   f 'ooxxoxxxo' NB. The example case, lost to a diagonal.
lose
   f 'xxooxxxoo' NB. Nobody won.
cat
   f 'xoo xx ox' NB. Victory from diagonal.
win

คำอธิบายที่ไม่ดี

row   =: -:"1                        Checks if victory can be achieved from any row.
col   =: -:"1 |:                     Checks if victory can be achieved from any column.
diag  =: -:"1 (0 4 8&{ ,: 2 4 6&{)@, Checks if victory can be achieved from diagonals.
check =: +./@(row,col,diag) 3 3&$    Checks all of the above and OR's them.

f     =: (cat`lose >@{~ 'ooo'&check)`('win'"_)@.('xxx'&check)
Check if you have won ........................@.('xxx'&check)
 If yes, return 'win' .............. ('win'"_)
 If not                   (cat`lose >@{~ 'ooo'&check)
  Check if enemy won ................... 'ooo'&check
   If yes, return 'lose'   ---`lose >@{~
   If not, return 'cat'    cat`---- >@{~

0

Python 2, 120 ไบต์

b=0b101001110
l=[448,56,7,292,146,73,273,84]
print(['Win'for w in l if w&b==w]+['Lose'for w in l if w&~b==w]+['Cat'])[0]

หรือPython 115 ไบต์จาก Python shell (2 หรือ 3):

b=0b101001110;l=[448,56,7,292,146,73,273,84];(['Win'for w in l if w&b==w]+['Lose'for w in l if w&~b==w]+['Cat'])[0]

ตัวแปรบอร์ดถูกตั้งค่าเป็นรูปแบบไบนารีที่อธิบายไว้ในคำถาม: 1สำหรับ X, 0O, จากซ้ายไปขวา, จากบนลงล่าง ในกรณีนี้101001110หมายถึง

XOX
OOX
XXO

ซึ่งนำไปสู่ผลลัพธ์: Cat


รูปแบบอินพุตคืออะไร
Seequ

0

Python ( 73 62 ตัวอักษร)

อินพุตเป็นสตริงตัวพิมพ์เล็กสี่ตัวที่แสดงมุมมองที่แตกต่างกันสี่แบบของบอร์ดเดียวกันซึ่งทั้งหมดจะถูกรวมเข้าด้วยกันเป็นสตริงเดียว: เรียงเป็นแถวตามคอลัมน์ตามแนวทแยงมุมขวาทแยงมุมซ้าย

UPDATE

ขอบคุณ theRare สำหรับการชี้ให้เห็นด้วยตัวอย่างที่ดี! แต่ละมุมมองของกระดานพร้อมกับแต่ละส่วน (แถวหรือคอลัมน์) ภายในกระดานจะต้องแยกจากกันด้วยอักขระที่ไม่ใช่ "x" หรือ "o" เพื่อให้โครงสร้างของกระดานถูกเก็บรักษาไว้แม้ว่าจะต่อกัน เส้นขอบรอบ ๆ แต่ละมุมมองของบอร์ดจะเป็นวงเล็บเหลี่ยม ("[" และ "]") และตัวคั่นระหว่างแถว / คอลัมน์จะเป็นอักขระไพพ์ "|"

สิ่งนี้ทำให้อัลกอริทึมง่าย - เพียงแค่มองหา "xxx" หรือ "ooo" เพื่อชนะหรือแพ้ตามลำดับ ไม่อย่างนั้นมันจะเป็นเน็คไท (cat)

เช่นกระดาน (อ่านจากซ้ายไปขวา, จากบนลงล่าง) ...

X | X | X X | O | X O | X | O

... แสดงเป็น "[xxx | xox | oxo]" (โดยแถว) + "[xxo | xox | xxo]" (โดยคอลัมน์) + "[xoo]" (diag ขวา) + [xoo] "(ซ้าย diag) = "[xxx | xox | oxo] [xxo | xox | xxo] [xoo] [xoo]"

คำสั่งนี้จะพิมพ์หลามผลเกมที่กำหนดตัวแปรsเป็น input:

print 'win' if 'xxx' in s else 'lose' if 'ooo' in s else 'cat'

ใช้กับบอร์ดOXX XOO XOXได้ไหม (ควรเป็นแบบแมว)?
Seequ

ไม่ ... ไม่เลย จับดี! ฉันคิดว่าวิธีแก้ปัญหาของฉันเรียบง่ายไปหน่อย ... อุ๊ป!
บ๊อบ

ฉันไม่สามารถพูดได้ว่าการแก้ปัญหาประเภทนี้ไม่ได้ทำให้ฉันกังวลใจ :)
seequ

0

Haskell (69 ตัวอักษร)

i x=take 4$(x>>=(\y->case y of{'7'->"win";'0'->"lose";_->""}))++"cat"

นี่จะเป็นอินพุตเดียวกับที่อธิบายโดยคำตอบนี้ โดยเฉพาะอย่างยิ่งอินพุตคือ 8 ค่าฐานแปดซึ่งอธิบายค่าไบนารีของแต่ละแถวคอลัมน์และแนวทแยงมุม รหัสทำให้ทุกอินสแตนซ์ของ 7 "ชนะ" ทุกอินสแตนซ์ของ 0 "แพ้" และเอาทุกอย่างออก จากนั้นจะเพิ่ม "cat" ไปยังจุดสิ้นสุดและใช้ 4 chars แรกจากผลลัพธ์

จะมีคำตอบที่เป็นไปได้ 4 ข้อ: "แพ้", "แมว", "ชนะ" ตามด้วย 'l' และ "ชนะ" ตามด้วย 'c' ซึ่งกฎไม่ได้ห้าม :)

ตัวอย่างการใช้งาน:

i "65153806" --outputs "lose"

0

J: 83

(;:'lose cat win'){::~>:*(-&(+/@:(*./"1)@;@(;((<0 1)&|:&.>@(;|.)(,<)|:)))-.)3 3$'x'=

การใช้งาน: เพียงต่อท้ายสตริงของ x's และ o's แล้วดูเวทย์มนตร์ เช่น. 'xxxoooxxx'

คำกริยาภายใน(+/@:(*./"1)@;@(;((<0 1)&|:&.>@(;|.)(,<)|:)))นั้นรวมกล่องไบนารีเมทริกซ์ดั้งเดิมเข้าด้วยกันพร้อมกล่องแปลงสัญญาณพร้อมกับ 2 เส้นทแยงมุม ผลลัพธ์เหล่านี้ถูกรื้อถอนด้วยกัน ผลรวมของแถวจะถูกนำมาใช้เพื่อตัดสินว่าชนะแล้วหาผลรวมแล้ว ฉันจะเรียกกริยานี้Innerอีก

สำหรับการหาผู้ชนะความแตกต่างของคะแนนระหว่างการฝึกอบรมไบนารีปกติและ inversed (-&Inner -.)ที่มีการดำเนินการโดยเบ็ด

ส่วนที่เหลือของรหัสเพียงแค่สร้างผลลัพธ์และเลือกรหัสที่ถูกต้อง


0

JavaScript, 133 , 114 ตัวอักษร

r = '/(1){3}|(1.{3}){2}1|(1.{4}){2}1|(1\|.1.\|1)/';alert(i.match(r)?'WIN':i.match(r.replace(/1/g,0))?'LOSS':'CAT')

อินพุตiเป็นสตริงธรรมดาที่มีตัวคั่นสำหรับแถวคือ100|001|100

แก้ไข: อัปเดตวิธีการของฉันเพื่อแทนที่ 1s ใน regex ด้วยเลขศูนย์เพื่อตรวจสอบกรณีการสูญเสีย


คุณสามารถลบช่องว่างรอบ ๆ=และเครื่องหมายคำพูดรอบตัวอักษร regex นอกจากนี้ยังเป็นหนึ่งในตัวละครที่สั้นกว่า1... 1.{3}
nyuszika7h

1
r.test(i)i.match(r)ยังเป็นหนึ่งในตัวละครที่สั้นกว่า
nyuszika7h

0

J - 56 (26) char

อินพุตได้รับเมทริกซ์ 3x3 ตัวอักษรเก้าตัวเนื่องจาก J สามารถรองรับได้ว่าเป็นประเภทข้อมูล LOL

(win`lose`cat{::~xxx`ooo<./@i.<"1,<"1@|:,2 7{</.,</.@|.)

ตัวอย่าง:

   NB. 4 equivalent ways to input the example board
   (3 3 $ 'xxoxoxoox') ; (_3 ]\ 'xxoxoxoox') ; ('xxo','xox',:'oox') ; (];._1 '|xxo|xox|oox')
+---+---+---+---+
|xxo|xxo|xxo|xxo|
|xox|xox|xox|xox|
|oox|oox|oox|oox|
+---+---+---+---+
   (win`lose`cat{::~xxx`ooo<./@i.<"1,<"1@|:,2 7{</.,</.@|.) 3 3 $ 'xxoxoxoox'
lose
   wlc =: (win`lose`cat{::~xxx`ooo<./@i.<"1,<"1@|:,2 7{</.,</.@|.)
   wlc (3 3 $ 'xoxoxooxo')
cat
   wlc (3 3 $ 'xxxoooxxx')
win

หากเราได้รับอนุญาตให้เข้ารหัส Golfscriptish ของเลขฐานแปดที่ซ้ำซ้อนแสดงถึงสถานะของแต่ละแถวคอลัมน์และเส้นทแยงมุมแล้วมันเป็นเพียง 26 ตัวอักษร:

   win`lose`cat{::~7 0<./@i.] 6 5 1 6 4 3 5 0
lose
   f=:win`lose`cat{::~7 0<./@i.]
   f  7 0 7 5 5 5 5 5
win

0

T-SQL (2012), 110

select max(iif(@&m=0,'lose',iif(@&m=m,'win','cat')))from(VALUES(292),(146),(73),(448),(56),(7),(273),(84))z(m)

อินพุตเป็นตัวเลขฐานสิบหก นี่เป็นคำแปลของทับทิมใน T-SQL ที่ค่อนข้างดีและเรียบร้อย


0

Javascript 1.6, 71 chars

ฉันสมมติว่าอินพุตเป็นอาร์เรย์gameที่มีแต่ละแถวแต่ละคอลัมน์และแต่ละ diag เป็นสตริงอักขระ 3 ตัว คล้ายกับคำตอบของบ็อบแต่มันมาในอาเรย์ไม่ใช่สตริงที่ต่อกัน

alert(game.indexOf("xxx")>=0?"win":game.indexOf("ooo")>=0?"lose":"cat")

ความคิดเห็นของ EDIT @ nyuszika7h (67 ตัวอักษร)

alert(~game.indexOf("xxx")?"win":~game.indexOf("ooo")?"lose":"cat")

คุณสามารถใช้~game.indexOf("xxx")แทนgame.indexOf("xxx")>=0เหมือนกันสำหรับอีกอันหนึ่ง
nyuszika7h

0

Java 7, 260 bytes

String c(int[]s){int a[]=new int[8],x=0,y;for(;x<3;x++){for(y=0;y<3;a[x]+=s[x*3+y++]);for(y=0;y<3;a[x+3]+=s[y++%3]);}for(x=0;x<9;y=s[x],a[6]+=x%4<1?y:0;a[7]+=x%2<1&x>0&x++<8?y:0);x=0;for(int i:a)if(i>2)return"win";for(int i:a)if(i<1)return"loose";return"cat";}

กรณีที่ไม่ได้รับการทดสอบ &:

ลองที่นี่

class M{
  static String c(int[] s){
    int a[] = new int[8],
        x = 0,
        y;
    for(; x < 3; x++){
      for(y = 0; y < 3; a[x] += s[x * 3 + y++]);
      for (y = 0; y < 3; a[x + 3] += s[y++ % 3]);
    }
    for(x = 0; x < 9; y = s[x],
                      a[6] += x % 4 < 1
                               ? y
                               : 0,
                      a[7] += x % 2 < 1 & x > 0 & x++ < 8
                               ? y
                               : 0);
    x = 0;
    for(int i : a){
      if(i > 2){
        return "win";
      }
    }
    for(int i : a){
      if(i < 1){
        return "loose";
      }
    }
    return "cat";
  }

  public static void main(String[] a){
    /*  xxo
        xox
        oox  */
    System.out.println(c(new int[]{ 1, 1, 0, 1, 0, 1, 0, 0, 1 }));
    /*  xxx
        ooo
        xxx  */
    System.out.println(c(new int[]{ 1, 1, 1, 0, 0, 0, 1, 1, 1 }));
    /*  xxo
        oox
        xox  */
    System.out.println(c(new int[]{ 1, 1, 0, 0, 0, 1, 1, 0, 1 }));
  }
}

เอาท์พุท:

loose
win
cat

0

APL (NARS), 69 ตัวอักษร, 138 ไบต์

{w←3 3⍴⍵⋄x←(+/1 1⍉⊖w),(+/1 1⍉w),(+⌿w),+/w⋄3∊x:'win'⋄0∊x:'lose'⋄'cat'}

อินพุตควรเป็นเมทริกซ์ 3x3 หรืออาร์เรย์เชิงเส้นหนึ่งองค์ประกอบ 9 องค์ประกอบที่มีเพียง 1 (สำหรับ X) และ 0 (สำหรับ O) ผลลัพธ์จะเป็น "cat" หากไม่มีใครชนะ "แพ้" ถ้า O ชนะ "win "ถ้า X ชนะ ไม่มีการตรวจสอบบอร์ดหรืออินพุตที่ไม่ถูกต้องหนึ่งอันคืออาเรย์หนึ่งมีองค์ประกอบน้อยกว่า 9 องค์ประกอบขึ้นไปหรือตรวจสอบแต่ละองค์ประกอบ <2

ตามความเห็น: มันจะแปลงอินพุตในเมทริกซ์ 3x3 และสร้างอาร์เรย์หนึ่งชื่อ "x" โดยที่องค์ประกอบนั้นเป็นผลรวมของแต่ละคอลัมน์ของแถวและแนวทแยง

การทดสอบดูตัวอย่างแสดงให้เห็นจากคนอื่น ๆ :

  f←{w←3 3⍴⍵⋄x←(+/1 1⍉⊖w),(+/1 1⍉w),(+⌿w),+/w⋄3∊x:'win'⋄0∊x:'lose'⋄'cat'}
  f 1 2 3
win
  f 0 0 0
lose
  f 1 0 1  1 0 1  1 0 1
win
  f 0 1 1  1 0 0  1 1 1
win
  f 0 0 1  1 0 1  1 1 0
lose
  f 1 1 0  0 1 1  1 0 0
cat
  f 1 1 0  0 1 0  0 0 1
win
  f 1 1 0  1 0 1  0 0 1
lose
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.