บอร์ด Tic-Tac-Toe นี้ใช้ได้หรือไม่?


48

ท้าทาย

ให้บอร์ด tic-tac-toe ในรูปแบบใด ๆ ตรวจสอบว่ามันถูกต้องหรือไม่ หากบอร์ดสามารถเป็นผลมาจากเกม tic-tac-toe ก็ถือว่าใช้ได้ ตัวอย่างเช่นกระดานนี้ถูกต้อง:

XOX
OXO
XOX
ในทางตรงกันข้ามบอร์ดนี้ไม่ถูกต้อง:

XXX
XXO
OOO

อินพุต

  • กระดานเขยิบแบบเต็ม (9/9) เต็มผล (ไม่ใช่ผลของเกม)

กฎระเบียบ

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

กรณีทดสอบ

ถูกต้อง:

XOX
OXO
XOX

XOX
XOX
OXO

XOO
OOX
OXX

OXO
XOX
OXO

ไม่ถูกต้อง:

XXX
XXX
XXX

OOO
OOO
OOO

XXX
OOO
XXX

OOO
OOX
XXX

XXO
OXO
OOX

ความช่วยเหลือเล็กน้อย?

บอร์ดถือว่ามีผลใช้ได้ (สำหรับการท้าทายนี้) หากว่ามีสองเงื่อนไขต่อไปนี้:

  • มี 5 X และ 4 O หรือ 4 X และ 5 O ตัวอย่างเช่น
    XXX
    OXO
    XXX
    ถือว่าไม่ถูกต้องเนื่องจากมี 7 Xs และ 2 Os
  • มีเพียงผู้เล่นที่มี 5 คะแนนเท่านั้นที่ชนะหรือไม่มีผู้ใดชนะ ตัวอย่างเช่น,
    XXX
    OOO
    OOX
    ถือว่าไม่ถูกต้องเนื่องจากแถวของOs หรือแถวXs จะถูกสร้างขึ้นก่อน ผู้เล่นสองคนไม่สามารถเลี้ยวได้พร้อมกัน

ผู้ชนะในปัจจุบันคือ ...

... คำตอบของเยลลี่ ais523ที่น่าประหลาดใจ 26 ไบต์!


2
อาจเพิ่มกรณีทดสอบเช่นO O O X O X X O Xเพื่อแสดงว่าผู้เล่นคนเดียวกันอาจมีทั้งแนวนอนและแนวตั้ง
smls

2
คุณต้องระบุเครื่องหมายของบอร์ดแยกต่างหาก ฉันไม่แน่ใจที่จะเข้าใจส่วนนั้น คุณสามารถให้ตัวอย่างตัวอย่างได้หรือไม่?
Arnauld

3
@Tim X มี 4 คะแนน
Martin Ender

2
@ Sparr "มีเพียงผู้เล่นที่มี 5 คะแนนเท่านั้นที่ชนะหรือไม่มีผู้ชนะเลย"
Martin Ender

2
@Kevin (ตอบกลับความคิดเห็นที่ 1) เนื่องจากไม่มีบอร์ด 9/9 จะเสร็จสมบูรณ์หากผู้เล่นคนที่สอง (ผู้เล่นที่มี 4 คะแนน) ชนะ
Erik the Outgolfer

คำตอบ:


11

เยลลี่ 26 ไบต์

ṢŒrṪ4=$$Ðfx3ðœ-µẆm€6R¤;/µL

ลองออนไลน์!

รูปแบบการป้อนข้อมูลนั้นผิดปกติเล็กน้อย มันเป็นสตริงที่แสดงถึงบอร์ด แต่มีการขึ้นบรรทัดใหม่ของ Windows (carriage return ตามด้วย newline) ตัวอย่างเช่นXXO\r\nOXO\r\nOOX. (ที่จริงแล้วสตริงการแพ็ดสองอักขระใด ๆ ระหว่างบรรทัดใช้งานได้ แต่บรรทัดใหม่ของ Windows มีความสามารถในการป้องกันมากกว่าตัวเลือกอื่น ๆ )

แนวคิดพื้นฐานคือเรามองหาตัวละครที่ปรากฏขึ้น 4 ครั้งในอินพุต แต่ไม่มีการเว้นระยะสามครั้งเท่ากันในสตริงเดิม ด้วยอักขระสองตัวหรือมากกว่าของการเว้นระหว่างบรรทัดของตาราง 3 × 3 เส้นแนวนอนแนวตั้งและแนวทแยงทั้งหมดจะเว้นระยะเท่ากัน แต่ไม่มีเส้นเว้นระยะเท่ากันอื่น ๆ ที่สามารถมีองค์ประกอบสาม

คำอธิบาย:

The ðและµs เป็นตัวแยกลูกโซ่ซึ่งแบ่งโปรแกรมออกเป็นหลายส่วนที่เป็นอิสระ ฉันได้แทนที่พวกเขาด้วยช่องว่างด้านล่างเพื่อทำให้สิ่งต่าง ๆ ชัดเจนขึ้น

ṢŒrṪ4=$$Ðfx3 œ- Ẇm€6R¤;/ L
Ṣ                           sorted version of the input
 Œr                         run-length-encode it
        Ðf                  keep only elements where
   Ṫ                        delete the last element, and it was
    4=                      equal to 4
      $$                    parse Ṫ4= as a group
          x3                repeat each element three times

                Ẇ           all sublists of the input
                 m€         take every nth element of each (€) sublist
                   6R       for each n in 1..6
                     ¤      parse 6R as a group
                      ;/    flatten one level (m€ creates a nested structure)

             œ-             multiset difference
                         L  length of that difference

กล่าวอีกนัยหนึ่งเราจะค้นหารายชื่อตัวละครที่ปรากฏอย่างแน่นอนสี่ครั้งในอินพุตและสร้างรายการที่ประกอบด้วยสำเนาสามชุดของแต่ละชุด เราค้นหารายการของทุกองค์ประกอบที่เว้นระยะเท่ากันในสายเดิม; และถ้าเราลบวินาทีจากครั้งแรกเราต้องการให้ผลลัพธ์มีความยาว 1 (เช่นผู้เล่นเล่นสี่ครั้ง แต่ไม่ชนะ) โปรดทราบว่าในขณะที่เราอยู่บนกริด 3 × 3 และทุกตารางเต็มจึงเป็นไปไม่ได้ที่ผู้เล่นทั้งสองจะเล่นสี่ครั้ง ใน Jelly 1 มีความจริง 0 เป็นเท็จดังนั้นเราไม่จำเป็นต้องทำอะไรเป็นพิเศษในการแปลงรายการผลลัพธ์เป็นบูลีน (แม้ว่าµLจะเป็นสิ่งที่จำเป็นเพราะอย่างอื่นทั้งสอง“XXX”และ“OOO”อาจเป็นไปได้ว่าเป็นค่าจริงที่เป็นไปได้และคำถามนั้นต้องการให้บอร์ดที่ถูกต้องทั้งหมดให้ผลลัพธ์เดียวกัน


3
สิ่งนี้สามารถอ่านได้ทั้งหมด
pabrams

21

JavaScript (ES6), 88 87 ไบต์

s=>(a=[...s]).sort()[5]-a[3]&[7,56,73,84,146,273,292,448].every(j=>j&i,i=`0b`+s^~-a[4])

รับอินพุตเป็นสตริง 9 0และ1อักขระและส่งคืนค่าที่1ถูกต้อง0สำหรับค่าที่ไม่ถูกต้อง เราเรียงลำดับตัวละครตามลำดับ หากตอนนี้ตัวละครสามตัวตรงกลางเหมือนกันกระดานจะไม่ถูกต้องเนื่องจากมีชิ้นส่วนมากเกินไป มิฉะนั้นเราจะแปลงบอร์ดดั้งเดิมให้เป็นไบนารี่พลิกบิตถ้ามี0มากกว่า1s ณ จุดนี้บอร์ดจะถูกต้องหาก0ไม่มีสามบรรทัดดังนั้นเราจึงทดสอบทั้งแปดบรรทัดผ่านทางอาร์เรย์ของ bitmasks แก้ไข: บันทึก 1 ไบต์ขอบคุณ @ETHproductions


@ETHproductions แน่นอนว่าผลลัพธ์จะเป็น 0 หรือ 1 เท่านั้น
Neil

14

Python 3, 131 127 125 100 96 ไบต์

สำหรับวิธีอัลกอริทึมที่แตกต่างกัน (และภาษาที่เหมาะกับภาษากอล์ฟแบบหลายไบต์เหล่านี้พร้อมการบีบอัดในตัว) แทนที่จะคำนวณว่าบอร์ดถูกต้องหรือไม่เรามีหมายเลข 512 บิตที่แต่ละบิตแสดงว่าหรือไม่ บอร์ดเฉพาะถูกต้องหรือไม่และผ่านในค่าไบนารีที่เป็นตัวแทนของคณะกรรมการ นอกจากนี้เนื่องจากความสมมาตรช่วงครึ่งหลังของตารางจะถูกตัดออกไปพร้อมกับศูนย์จำนวนหนึ่ง:

def z(b):return int('agqozfx67wwye6rxr508ch2i8qicekpreqkap0725pk',36)<<24&1<<b+(b>255)*(511-b-b)

ค่าทดสอบ:

X X X
O X O
X X X

แสดงเป็นค่าไบนารี่0b111010111และฟังก์ชั่นจะคืนค่าที่ไม่เป็นศูนย์หากบอร์ดถูกต้อง


ลบตัวแปรกลางสำหรับ 4 ไบต์น้อยกว่า
Ken YN

สองไบต์ที่น้อยลงเนื่องจากa&(1<<b)ไม่จำเป็นต้องใช้วงเล็บ
Ken YN

เคาะออก 25 ไบต์โดยใช้สมมาตรและอีกหนึ่งตัวย่อด้วย 24 บิตศูนย์ต่ำสุด - ต้องมีวิธีที่นักกอล์ฟต้องทำif b>255:b=511-b!
Ken YN

พบวิธี golfier ifที่จะทำ
Ken YN

11

แบตช์ 140 ไบต์

@set/aXXX=OOO=O=0
@for %%l in (%* %1%2%3 %1%4%7 %1%5%9 %2%5%8 %3%5%7 %3%6%9 %4%5%6 %7%8%9)do @set/a%%l+=1
@cmd/cset/a!XXX*!(O-=5)+!OOO*!~O

รับอินพุตเป็นอาร์กิวเมนต์บรรทัดรับคำสั่งและเอาต์พุตแยกกันเก้ารายการ1เพื่อให้ถูกต้องและ0ไม่ถูกต้อง ทำงานโดยการติดตามจำนวนครั้งที่มันเห็นOและสายมุมฉากของหรือOOO XXXแบทช์ที่สะดวกช่วยให้เราสามารถดำเนินการทางคณิตศาสตร์จำนวนเต็มทางอ้อมดังนั้นเราจึงไม่เพิ่มขึ้น%%lแต่เป็นตัวแปรบางอย่างแทน (แม้ว่าเราจะสนใจเพียงสามตัวแปรที่กล่าวถึง) จากนั้นเราต้องทดสอบว่าXไม่ชนะและมีห้าOวินาทีหรือOไม่ชนะและมีสี่Oวินาที


10

Mathematica, 82 75 ไบต์

ขอบคุณ Martin Ender สำหรับการประหยัด 7 ไบต์!

t=Total;3<(b=#~t~2)<6&&{t[c=If[b>4,1-#,#]],t/@c,Tr@c,Tr@Reverse@c}~FreeQ~3&

ฟังก์ชั่นที่ไม่มีชื่อการรายการ 3x3 ซ้อนกันของ 1 และ 0 เป็น input และ outputting หรือTrueFalse

ใช้ความยืดหยุ่นที่มีประโยชน์ของTotalฟังก์ชั่น (ที่นี่ golfed เพื่อt): ในตัวอย่างอาร์เรย์e = { {1,2,3} , {4,5,6} , {7,8,9} }คำสั่งจะt[e]รวมสามเวกเตอร์ (ที่นี่ให้ผล{12,15,18}) คำสั่งจะt/@eรวมผลรวมย่อยแต่ละรายการแยก{6,15,24}กัน และคำสั่งจะe~t~2สรุปองค์ประกอบทั้งเก้า (ที่นี่ให้ผล45)

ก่อนอื่นเราทดสอบ3<(b=#~t~2)<6ด้วยว่าจำนวนทั้งหมด 1s เป็น 4 หรือ 5 หรือไม่ Falseถ้าเราไม่ออกจากกับ ถ้าเป็นเช่นนั้นเราใช้c=If[b>4,1-#,#]เพื่อบังคับให้มีสี่ 1s ไม่ใช่ห้า จากนั้นเราคำนวณผลบวกของคอลัมน์ผลรวมt[c]ของแถวผลt/@cรวมของเส้นทแยงมุมหลักTr@cและผลรวมของเส้นทแยงมุมตรงข้ามTr@Reverse~cและใช้~FreeQ~3เพื่อตรวจสอบว่า3ไม่ปรากฏในระดับใด ๆ ในผลรวมที่คำนวณได้

ข้อความด้านข้างที่น่าสนุก: ไม่เหมือนกับที่ปรากฏในไซต์นี้ส่วนใหญ่นี่Trไม่ได้ใช้เพื่อรวมรายการหนึ่งมิติ แต่ใช้จริงตามที่ออกแบบมา - เพื่อคำนวณร่องรอยของเมทริกซ์สองมิติ!



5

JavaScript (ES6), 101 ไบต์

รับอินพุตเป็นมาสก์ไบนารี 9 บิตโดยที่X = 1และO = 0(MSB = เซลล์ซ้ายบน, LSB = เซลล์ล่างขวา)

n=>[7,56,73,84,146,273,292,448,o=x=0].map((m,i)=>(c-=n>>i&1,m&n^m?m&n||o++:m&&x++),c=4)&&!(c|x&&~c|o)

กรณีทดสอบ


ฉันรู้ว่าจะต้องมีวิธีการแก้ปัญหาบิต (ค่อนข้าง) ง่าย การทำงานที่ดี
ETHproductions

5

Python 2 158 132 109 92 91 123 ไบต์

def v(b):f=sum(b,());w={x[0]for x in b+zip(*b)+[f[::4],f[-3:1:-2]]if len(set(x))==1};return sum(map(`b`.count,w))==len(w)*5

อินพุตคือ list / tuple ของแถวโดยแต่ละสตริงมีสาม tuple ของสตริงเช่น:
[('X', 'O', 'X'), ('O', 'X', 'O'), ('X', 'O', 'X')]

บันทึกไบต์จำนวนหนึ่งโดยละเว้น diagonals ต่อคำตอบของ @ Maltysen ซึ่งทำให้นิพจน์ต่อไปนี้สั้นลง

ขอบคุณ @vaultah สำหรับการบันทึก 17 18 ไบต์

การตรวจสอบเส้นทแยงมุมกลายเป็นสิ่งจำเป็นซึ่งทำให้ประหยัดได้มาก

ลองที่นี่

คำอธิบาย

def v(b):
  f=sum(b,())
  w={x[0]for x in b+zip(*b)+[f[::4],f[-3:1:-2]]if len(set(x))==1}
  return sum(map(`b`.count,w))==len(w)*5

fเป็นอินพุตแบบแบนสำหรับการแบ่งส่วน
wมีตัวละครที่มีลำดับที่ชนะ
นับการเกิดขึ้นของตัวละครที่ชนะแต่ละตัวซึ่งจะเป็น 0 ถ้าwว่างเปล่าหรือ 5 ถ้าlen(w)เป็น 1 ผลรวม 10 เมื่อทั้งคู่มีลำดับที่ชนะเป็นไปไม่ได้ ผู้ชนะที่มี 5 หมายถึงผู้แพ้มี 4 คุณไม่สามารถมี 5 โดยไม่มีลำดับที่ชนะ


lambda b:len({x[0]for x in b+zip(*b)if len(set(x))==1})<2and set(map(b .count,'XO'))=={4,5}บันทึกบางไบต์
vaultah

และฉันเพิ่งสังเกตเห็นว่า...and{4,5}==set(map(b .count,'XO'))บันทึกอีกหนึ่งไบต์
vaultah

ฉันคิดว่านี่ถือว่าผิดตัวอย่าง "ไม่ถูกต้อง" ล่าสุดจากคำถามว่าถูกต้องเพราะไม่แน่ใจว่าผู้ชนะคือผู้เล่นที่มี 5 คะแนน
smls

@smls คุณพูดถูก การตรวจสอบเงื่อนไขนั้นมีค่าใช้จ่ายเป็นจำนวนมากอาจจะสามารถตีได้ไกลขึ้น
Jake Cobb

5

R, 88 82 ไบต์

x=scan();`if`(sum(x)%in%4:5,all(apply(combn(which(x==(sum(x)<5)),3),2,sum)!=15),F)

การรวมกันของจำนวนเต็มสามจำนวนตั้งแต่ 1 ถึง 9 ที่รวมกันสูงสุด 15 เป็นแถว / คอลัมน์ / diagonals ของตารางที่แสดงด้านล่าง

2 7 6
9 5 1
4 3 8

ฟังก์ชั่นนี้ใช้อินพุตเป็นเวกเตอร์ของ booleans, T สำหรับ "X", F สำหรับ "O" ซึ่งเป็นตัวแทนของบอร์ดแบบแบน แต่สิ่งเหล่านี้จะถูกจัดลำดับใหม่เพื่อให้ดัชนีของพวกเขาเหมือนกันกับจำนวนในตารางตามลำดับ (2,7,6,9,5,1,4,3,8) คำสั่งนั้นอาจทำได้โดยการทำให้กระดานแบนในแบบปกติจากนั้นให้แบ่งเป็น c (6,1,8,7,5,3,2,9,4) ดังนั้นนี่

X O X
O X O
X O X

จะแสดงเป็น:

c(T, F, T, F, T, F, T, F, T)[c(6,1,8,7,5,3,2,9,4)]

ซึ่งเป็น:

c(F, T, F, T, T, T, F, T, F)

ฟังก์ชั่นแรกพิจารณาว่ามีผู้เล่นที่มีเครื่องหมายสี่ประการหรือไม่ ถ้าเป็นเช่นนั้นฟังก์ชั่นจะใช้ fact-of-things-that-add-up-to-15 เพื่อตรวจสอบว่าผู้เล่นนั้นมีสามในแถว (บอร์ดไม่ถูกต้องถ้าผู้เล่นทำ)

หากคุณต้องการที่จะใส่บอร์ดแบบแบนตามอัตภาพเป็นรหัสป้อนจะมีลักษณะเช่นนี้แทน:

f=function(x)ifelse(sum(x)%in%4:5,all(apply(combn(c(2,7,6,9,5,1,4,3,8)[which(x==(sum(x)<5))],3),2,sum)!=15),F)

ฉันใหม่ที่นี้คำแนะนำจะได้รับการชื่นชม


1
บันทึก 2 ไบต์ถ้าคุณใช้if()แทน: ถ้าf=function(x) (sum(x)%in%4:5,all(apply(combn(which(x==(sum(x)<5)),3),2,sum)!=15),F)ไม่ผ่านการทดสอบอย่างครอบคลุมใจคุณ backticks ทำลายรหัส backtick if backtick(แต่ก็
Jonathan Carroll

1
ดีกว่า; x=scan();ถ้า(sum(x)%in%4:5,all(apply(combn(which(x==(sum(x)<5)),3),2,sum)!=15),F)และใส่เป็นและ1 082 ไบต์
Jonathan Carroll

3

JavaScript (ES6), 145 139 131 127 ไบต์

s=>!(q="XO"[s.split`O`.length-5])|![...s].some((c,i)=>c==q&!/(.)(\1|..(\1|.(\1|.\1.).)..)\1/.test(s.slice(0,i)+0+s.slice(i+1)))

"XOX OXO XOX"การป้อนข้อมูลเป็นสตริงพื้นที่แยกออกจากกันเช่น เอาต์พุต1สำหรับบอร์ดที่ไม่ถูกต้อง, 0สำหรับบอร์ดที่ถูกต้อง เห็นได้ชัดว่านี่ไม่ใช่เทคนิคที่ดีที่สุดอย่างน้อยก็ไม่ใช่ JavaScript ...

โดยทั่วไปจะตรวจสอบว่ามีการระงับทั้งสองต่อไปนี้หรือไม่:

  • มี 4 หรือ 5 Oวินาทีและ
  • มีอย่างน้อยหนึ่งใน 5 ส่วนของอินสแตนซ์ที่สร้างเกมที่ไม่มีความปลอดภัยเมื่อนำออก

regex คือการตรวจสอบว่าเกมได้รับการตัดสินใจแล้ว มันตรงกับบอร์ดถ้ามีความยาวสามตัวอักษรหนึ่งตัวคือ 0 (แถว), 2 (เส้นทแยงมุมขวา), 3 (คอลัมน์) หรือ 4 (เส้นทแยงมุมซ้าย) แยกตัวอักษรแต่ละคู่

ตัวอย่างการทดสอบ


2

Ruby, 104 99 91 ไบต์

->x{[7,56,448,292,146,73,84,273].none?{|y|b=x.to_i 2;((a=x.count'1')==4?b:a==5?~b:7)&y==y}}

รูปแบบอินพุต: สตริงไบนารี 9 สัญลักษณ์ (0s และ 1s) 101010101เป็นตัวแทนของคณะกรรมการเช่นกรณีการทดสอบครั้งแรกคือ ก่อนอื่นให้แปลงเป็นเลขฐานสองตรวจสอบว่า popcount เป็น 4 หรือ 5 หรือ 5 ถ้าเป็น 5 จะแปลงกลับเป็นตัวเลขดังนั้นเราจึงมี 4 เสมอตรวจสอบว่ามีสามตัวอยู่ในแนวเดียวกันหรือไม่

TL; DR : คืนค่าเท็จถ้าผู้เล่นที่มี 4 คะแนนชนะจริงไม่เช่นนั้น

ขอบคุณจอร์แดนสำหรับความคิดเห็น

ฉันไม่สามารถทำซ้ำสตริง UTF-8 ซึ่งจะบันทึกไบต์อื่น


คุณสามารถแทนที่ด้วย.select{...}[0] .find{...}
Jordan

และคุณสามารถบันทึกอีกหนึ่งไบต์ได้ด้วยการแทนที่อาเรย์ของตัวเลขด้วย"8ǀĤITđ".unpack("U*")(ในกรณีที่บางอย่างหายไปในการแปลสตริงนั้นเป็นผลมาจากการเรียกpack("U*")ใช้อาเรย์ดั้งเดิมมันคือ 12 ไบต์)
Jordan

คุณสามารถใช้any?แทนnone?พลิกผลลัพธ์และบันทึกทั้งไบต์ได้หรือไม่
Alexis Andersen

ฉันลองด้วยหรือไม่ แทนที่จะเป็นใคร แต่ฉันต้องการ! เพื่อพลิกผลลัพธ์
GB

1

Perl 6 , 103 99 ไบต์

{my \c=%(.flat.Bag.invert)<5>;?all c,|(.[0]===c if [eq] $_ for |.flat[<0 4 8>,<2 4 6>],|$_,|.&zip)}

แลมบ์ดาที่ยอมรับรายการของรายการที่ชอบ(('X','O','X'), ('O','X','O'), ('X','O','X'))และส่งคืน Bool

มันได้ผลเช่นนี้:

  1. ตรวจสอบเครื่องหมายปรากฏว่า 5 cครั้งและเก็บไว้ใน (หากไม่มีเครื่องหมายปรากฏ 5 ครั้งสิ่งนี้จะมีค่าเท็จ)
  2. ย้ำกว่าเส้นทแยงมุมทั้งหมดแถวและคอลัมน์และกรองออกมา "ชนะ" คน(เช่นผู้ที่ทุกตัวอักษรสามตัวมีค่าเท่ากัน)
  3. ตรวจสอบว่าcเป็น truthy, และcแต่ละบรรทัดชนะเป็นประเภท

1

PHP, 125 ไบต์

for($p=$n=$argv[1];$p;$p/=2)$i+=$p&1;foreach([7,56,448,73,146,292,273,84]as$m)$n&$m^$m?$n&$m||$o++:$x++;echo!$x|!$o&&2>$i^=4;

ฉันมีความคิดเช่นเดียวกับArnauld : คณะกรรมการที่ถูกต้องถ้ามีทั้ง 4 หรือ 5 บิตตั้งและทั้งXหรือOหรือไม่มีใครมีแนว ( แต่ไม่ใช่ทั้งสองอย่าง)

ในการสร้างอินพุตจากฟิลด์แทนที่Xด้วย1และOด้วย0ให้เข้าร่วมบรรทัดและแปลงไบนารีเป็นทศนิยมให้เป็นอาร์กิวเมนต์บรรทัดคำสั่ง

พิมพ์1ให้ถูกต้อง เอาต์พุตว่างสำหรับไม่ถูกต้อง -rทำงานด้วย

ชำรุด

// count set bits
for($p=$n=$argv[1];$p;$p/=2)$i+=$p&1;
    /* ($p/=2 takes longer than $p>>=1, but eventually
       $p will come close enough to 0 for the loop to finish */
// count streaks for X and O
foreach([7,56,448,73,146,292,273,84]as$m)
    $n&$m^$m            // ($n masked with streak)!=streak <=> no streak for X
        ?$n&$m||$o++    // true: O has a streak if ($n masked with streak) is empty
        :$x++;          // false: X has a streak
echo!$x|!$o&&2>$i^=4;   // valid if not both have a streak
                        // AND $i is 4 or 5 (toggle 4 -> result 0 or 1)

1

สวิฟท์, 178 ไบต์

func t(i:String)->Bool{let r=i.characters.filter({$0=="X"}).count;let g=i.characters.split(separator:"\n").map(String.init).contains;return(r==5||r==4)&&(!g("XXX") && !g("OOO"))}

0

ES6 (Javacript) 130, 138, 117 ไบต์

การแก้ไข:

  • 21 ไบต์ปิดขอบคุณคำแนะนำที่ยอดเยี่ยมจาก @Neil!
  • เวอร์ชันเริ่มต้นมีแนวโน้มที่จะเกิดข้อผิดพลาดซึ่งตอนนี้ควรได้รับการแก้ไขที่ราคา +8 ไบต์ (ขอบคุณ @ETHProductions สำหรับการชี้ให้เห็น)

วิธีการ straighforward สุดขั้ว อาจจะสามารถเล่นกอล์ฟได้อีกเล็กน้อย

ยอมรับอินพุตเป็น 9 อาร์กิวเมนต์แยกต่างหาก 1es และ 0es

  • 1สำหรับX
  • 0สำหรับO

อาร์กิวเมนต์: 1-3 - แถวแรก, 4-6 - แถวที่สอง, 7-9 - แถวที่สาม

แข็งแรงเล่นกอล์ฟ

(a,b,c,d,e,f,g,h,j)=>![a+b+c,d+e+f,g+h+j,a+d+g,b+e+h,c+f+j,a+e+j,g+e+c,7].some(x=>x=="7777307777"[a+b+c+d+e+f+g+h+j])

"เตียงทดสอบ" แบบโต้ตอบ

var a=b=c=d=e=f=g=h=j=0;

T=(a,b,c,d,e,f,g,h,j)=>![a+b+c,d+e+f,g+h+j,a+d+g,b+e+h,c+f+j,a+e+j,g+e+c,7].some(x=>x=="7777307777"[a+b+c+d+e+f+g+h+j]);

function test() {
  if(T(a,b,c,d,e,f,g,h,j)) {
     grid.style.backgroundColor='green';
     msg.innerHTML="GOOD"
  } else {
     grid.style.backgroundColor='red';
     msg.innerHTML="BAD"
  }
}
<table id=grid style="background: red">
<thead>
  <tr>
     <td id=msg align="center" colspan="3">BAD</td>
    </tr>
  </thead>
  <tr>
      <td><input type="checkbox" onchange="a=this.checked*1;test();" id="ca"/></td>
      <td><input type="checkbox" onchange="b=this.checked*1;test();" id="cb"/></td>
      <td><input type="checkbox" onchange="c=this.checked*1;test();" id="cc"/></td>
    </tr>
    <tr>
      <td><input type="checkbox" onchange="d=this.checked*1;test();" id="cd"/></td>
      <td><input type="checkbox" onchange="e=this.checked*1;test();" id="ce"/></td>
      <td><input type="checkbox" onchange="f=this.checked*1;test();" id="cf"/></td>
    </tr>
    <tr>
      <td><input type="checkbox" onchange="g=this.checked*1;test();" id="cg"/></td>
      <td><input type="checkbox" onchange="h=this.checked*1;test();" id="ch"/></td>
      <td><input type="checkbox" onchange="j=this.checked*1;test();" id="cj"/></td>
    </tr>
 </table>


ฉันอาจจะผิด แต่ดูเหมือนว่านี้เท่านั้นตรวจสอบว่ามีผู้ชนะ บอร์ดที่ถูกต้องจะต้องไม่มีผู้ชนะ; ตัวอย่างเช่น[1,0,1,1,0,1,0,1,0]( XOX XOX OXO)
ETHproductions

ใช่ฉันหลงทางในขณะตีกอล์ฟ มันควรจะตรวจสอบว่าฝั่งตรงข้ามไม่ใช่ผู้ชนะ ควรได้รับการแก้ไขแล้ว ขอบคุณ !
เรือเหาะ

(ฉันเริ่มแสดงความคิดเห็นก่อนการแก้ไขล่าสุด) คุณ a) เขียนa+b+c+d+e+f+g+H+iแทนF.reduce((r,c)=>r+=c*1)(ณ จุดที่คุณไม่ต้องการF) b) เขียน.includes(C)(และไปยังCค่าของอินไลน์)?
Neil

@ Neil นี่อาจจะใช้ได้ฉันจะลองในวันพรุ่งนี้ ขอบคุณ !
เรือเหาะ

มันOOO XXX OXOล้มเหลวเหรอ?
Ismael Miguel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.