เชื่อมต่อสี่ Validator


20

บทนำ

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


งาน

ที่กำหนดให้คณะกรรมการต่อสี่คิดออกที่ผู้ชนะคือ: หรือX Yจะมีผู้ชนะหนึ่งคนและผู้ชนะเพียงคนเดียวเท่านั้น ขนาดกระดานจะมีขนาด 6 x 7 ตามลักษณะของกระดานเกมในภาพ

ให้บอร์ดต่อไปนี้แก่บอร์ดในกรณีนี้XคือสีแดงและYสีน้ำเงิน:

ป้อนคำอธิบายรูปภาพที่นี่

ข้อมูลของคุณจะเป็น:

OOOOOOO
OOOOOOO
OOOOOOO
OOOOXOO
OOOXXOO
OOXYYYY

คุณสามารถแยกแถวของเกมด้วยอักขระขึ้นบรรทัดใหม่ (เช่นด้านบน), ไม่แบ่งอักขระแบ่งแถวออกเป็นอาร์เรย์หรือรายการหรือคุณสามารถป้อนเมทริกซ์ของอักขระได้

เอาต์พุตที่ถูกต้องสำหรับตัวอย่างนี้:

Y

Y มีสี่เรียงติดกัน ดังนั้น Y คือผู้ชนะ ดังนั้นเราจึงส่งออก Y


กรณีทดสอบ

การป้อนข้อมูล:

OOOOOOO
OOOOOOO
OOOOOOO
OOOOOOO
OOYYOOO
OYXXXXO

เอาท์พุท:

X

การป้อนข้อมูล:

OOOOOOO
OOOOOOO
OOOOOOO
XXXXOOO
YXYYOOO
YXYYXYX

เอาท์พุท:

X

การป้อนข้อมูล:

YXYYXOO
XYXXYOO
XXXYYOO
YYYXXOO
XXYYYYO
XXYYXXO

เอาท์พุท:

Y

การป้อนข้อมูล:

OOOOOOO
OOOOOOO
OYOOOOO
OOYOOOO
OOOYOOO
OOOOYOO

เอาท์พุท:

Y

การป้อนข้อมูล:

OOOOOOO
OOOOOOO
OYOOOOX
OOYOOOX
OOOXOOX
OXOXYOX

เอาท์พุท:

X

เกณฑ์การให้คะแนน

จำนวนไบต์ที่น้อยที่สุดจะชนะ!


นี่เป็นความท้าทายที่สมบูรณ์แบบสำหรับ PMA / Snails codegolf.stackexchange.com/questions/47311/…
Jerry Jeremiah

2
เราสามารถสันนิษฐานได้ว่าผู้ชนะจะมีโทเค็นมากกว่าหนึ่งผู้แพ้เสมอหรือไม่
คณิตศาสตร์ junkie

1
@ Mathjunkie ฉันผิดคุณไม่สามารถคิดได้
Neil

3
@nfnneil เอาต์พุตต้องเป็น X หรือ Y หรือเราสามารถเลือกเอาต์พุตที่สอดคล้องกันอีกสองตัวเพื่อระบุผู้ชนะได้หรือไม่?
Martin Ender

1
เราสามารถเลือกใช้อักขระอื่นเป็นอินพุตได้หรือไม่ หรือใส่เมทริกซ์ตัวเลข?
Luis Mendo เมื่อ

คำตอบ:


2

เยลลี่ขนาด 19 ไบต์

UŒD;ŒD;Z;ṡ€4;/ṢEÞṪṪ

ลองออนไลน์!

แก่นแท้ของคำตอบนี้ถูกคัดลอกจากคำตอบของฉันไปยังคำถามที่คล้ายกันนี้

คำอธิบาย

UŒD;ŒD;Z;ṡ€4;/ṢEÞṪṪ
   ;  ; ;             Append {the input} and the following three values:
UŒD                     the antidiagonals of {the input};
    ŒD                  the diagonals of {the input};
       Z                the transposed {input}.
         ṡ 4          Find all length-4 substrings
          €             of each subarray within that.
            ;/        Flatten one level.
                Þ     Sort, with the following sort order:
               E        If all elements are the same, sort later.
              Ṣ         Tiebreak via lexicographical order.
                 ṪṪ   Take the last element of the last element.

ค่อนข้างง่าย: เราใช้แถว, คอลัมน์, diagonals และ antidiagonals ทั้งหมด (เช่นเดียวกับใน validator ของ n-queens), จากนั้นใช้ substrings ที่มีความยาวทั้งหมด 4-4, จากนั้นเรียงลำดับพวกมันในแบบที่ผู้ชนะ 4 ตอนจบ. (เราต้องการเน็คไทด์ในกรณีที่มีส่วนOOOOเพิ่มเติมXXXXหรือหรือYYYY) นำองค์ประกอบสุดท้ายขององค์ประกอบสุดท้ายและนั่นจะเป็นXหรือYจำเป็น


6

เรติน่า, 51 48 ไบต์

ขอบคุณ Martin Ender สำหรับการบันทึก 3 ไบต์

M`X((.{6}X){3}|(.{8}X){3}|(.{7}X){3}|XXX)
T`d`YX

ลองออนไลน์!

รับอินพุตเป็นรายการของแถวที่คั่นด้วยเครื่องหมายจุลภาค


คุณสามารถบันทึกได้สองสามไบต์โดยใช้ระยะการแข่งขันและย่อ(.{7}X){3}|XXXให้เหลือ(.{7}X|X)\4\4: tio.run/nexus/retina#fc4xCsMwDAXQPPcc22CC6NDS5QaeipcP/ …
Martin Ender

1
@MartinEnder ฉันไม่เห็นว่าคุณสามารถใช้งานได้อย่างไร\4- คุณต้องการทำซ้ำเอฟเฟ็ก.{7}ต์ไม่ใช่สตริงที่ตรงกัน (และกลุ่มที่มีความสมดุลอาจยาวเกินไป)
นีล

1
@ Neil โอ้ใช่ไม่เป็นไรอย่างใดฉันไม่คิดว่ามีเซลล์ OXY อื่นนอกเหนือจากการแข่งขันในตาราง ใช้เวทีการแข่งขันยังคงบันทึก 3 ไบต์แล้ว
Martin Ender

5

Javascript (ES6), 54 55

แก้ไขการบันทึก 1 ไบต์ขอบคุณ @Arnauld

ฉันแค่ตรวจสอบว่า X เป็นผู้ชนะหรือไม่เนื่องจากจะมีผู้ชนะหนึ่งคนเสมอและผู้ชนะเพียงคนเดียวเท่านั้น

อินพุตเป็นสตริงที่มีตัวคั่นใด ๆ เช่นในคำตอบของ @ Arnauld

F=    
b=>'YX'[+[0,6,7,8].some(x=>b.match(`X(.{${x}}X){3}`))]

;['OOOOOOO OOOOOOO OOXOOOO OOXOOOO OOXOOOO OOXOYYY'
 ,'OOOOOOO OOOOOOO OOXOOOO OOYXOOO OOYOXOO OOYYOXY'
 ,'OOOOOOO,OOOOOOO,OOOOOOO,OOOOOOO,OOYYOOO,OYXXXXO'
 ,'OOOOOOO,OOOOOOO,OOOOOOO,XXXXOOO,YXYYOOO,YXYYXYX'
 ,'YXYYXOO,XYXXYOO,XXXYYOO,YYYXXOO,XXYYYYO,XXYYXXO']
.forEach(s => console.log(s,F(s)))


@Arnauld ถูกต้องขอบคุณ
edc65

4

เยลลี่ , 25 22 ไบต์

ŒgL⁼¥Ðf
;UŒD€;Z;$ç€4FṀ

ใช้รายการของสตริง (หรือรายการของตัวละคร) ที่เกิดขึ้นจากX, YและO(ยังสามารถทำงานกับการแทนที่เช่นว่าพื้นที่มีลำดับที่ต่ำกว่าทั้งสองเคาน์เตอร์)

ลองออนไลน์! หรือเรียกใช้เวอร์ชั่นเพิ่มเติมที่ใช้สตริงหลายบรรทัด

อย่างไร?

ŒgL⁼¥Ðf - Link 1, runs of given length: list A, length B  e.g. "XYYYXXO", 4
Œg      - group runs of equal elements of A                     ["X","YYY","XX","O"]
     Ðf - filter keep:
    ¥   -     last two links as a dyad:
  L     -         length                                         1   3     2    1
   ⁼    -         equal to B?         (none kept in this case->) 0   0     0    0

;UŒD€;Z;$ç€4FṀ - Main link: list of list of chars (or list of stings) I
 U             - reverse each row of I
;              - I concatenated with that
  ŒD€          - positive diagonals of €ach (positive and negative diagonals)
        $      - last two links as a monad:
      Z        -     transpose of I (i.e. the columns)
       ;       -     concatenated with I (columns + rows)
     ;         - concatenate (all the required directional slices)
         ç€4   - call the last link (1) as a dyad for €ach with right argument = 4
            F  - flatten the result
             Ṁ - take the maximum ('Y'>'X'>'O') - this has the bonus effect of returning:
                               'Y' or 'X' for a winning board; and
                               'O' or '' for a (valid) game in progress.

4

JavaScript (ES6), 77 76 69 ไบต์

บันทึก 7 ไบต์ขอบคุณ Neil

จะเข้าเป็นบางสิ่งบางอย่างสตริง -separated ที่บางสิ่งบางอย่างนั้นเป็นตัวอักษรใด ๆ

b=>[...'XXXXYYYY'].find((c,i)=>b.match(`(${c}.{${(i%4+6)%9}}){3}`+c))

กรณีทดสอบ


ทำไมไม่ใช้b.match()? ควรบันทึกในการRegExpโทร
Neil

@Neil ฉันทั้งหมดลืมไปว่ากำลังทำแปลงนัยไปmatch() RegExpขอบคุณ!
Arnauld

3

Python 2 , 143 ไบต์

m=input()
u=[r[::-1]for r in m]
print"YX"[any(any('X'*4in''.join(t[i][j-i]for i in range(j+1))for j in range(6))for t in(m[::-1],m,u,u[::-1]))]

รับรายการสตริงหรือรายการลิสต์ กำหนดค่าตายตัวสำหรับ6แถว7คอลัมน์เนื่องจากข้อกำหนดรับประกัน

ลองออนไลน์!



2

Python 2 , 201 143 129 128 107 ไบต์

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

lambda m:"YX"[any("X"*4in"".join(a)for a in zip(*m)+m+zip(*["0"*(7-i)+m[i]+"00"*i+m[i]for i in range(6)]))]

ลองออนไลน์!

เครดิต


เป็นที่ยอมรับอย่างสมบูรณ์แบบในการตอบด้วยตนเอง
Jonathan Allan

โดยไม่ได้มองมากเกินไปที่มันดูเหมือนว่าจะมีช่องว่างที่ไร้ประโยชน์ที่: i:] for, i, r, และr] for 1 for
Yytsi

@ TuukkaX ขอบคุณสำหรับการป้อนข้อมูลอัปเดต
Neil

นอกจากนี้อาจจะ*(len(m)-1) มันทำงานอย่างไร. *~-len(m)
Yytsi

] forและ1 forยังคงมี
Yytsi

1

K (ngn / k) , 58 55 ไบต์

{"XY"@|/&/'88<x ./:/:,/{x+/:/:+3+[4#1-+!3 3]\&4}'+!6 7}

ลองออนไลน์!

{ } ฟังก์ชั่นที่มีข้อโต้แย้ง x

+!6 7 คู่ที่เป็นไปได้ทั้งหมด 0..5 และ 0..6

{ }' สำหรับแต่ละคนทำ

4#1-+!3 3 คือ 4 จาก 8 ทิศทางในแนวทแยง (1 1;1 0;1 -1;0 1)

3+[ ]\&4เริ่มต้นด้วยรายการสี่ศูนย์ ( &4) และทำ 3 ขั้นตอนในแต่ละทิศทาง

x+/:/: เริ่มต้นจากแต่ละตำแหน่งที่เป็นไปได้และทำตามขั้นตอนในแต่ละทิศทางที่เป็นไปได้

,/concatenate ณ จุดนี้เรามีตารางเมทริกซ์ของรายการคู่ประสานงาน 4 รายการบางรายการขยายออกไปจากกระดาน

x ./:/: ค้นหาเซลล์ที่เกี่ยวข้องจาก x

88<อัน"Y"ไหนของพวกเขา-s? (88 คือรหัส ascii ของ"X")

&/'รายการ"Y"ใดบ้างที่ประกอบด้วย-s เท่านั้น (และลดแต่ละ)

|/มีอย่างน้อยหนึ่งอย่าง? (หรือลด)

"XY"@หากผลตอบแทนที่ผิดพลาด"X"หากผลตอบแทนที่แท้จริง"Y"


1

Zsh , 207 ... 159 ไบต์

ประวัติรุ่น: 4 ซ้ำประมาณ ~ 25 ไบต์ในสัปดาห์แรก; จากนั้นจึงเพิ่มอีก 3 ครั้งสำหรับ ~ 25 ไบต์ 6 เดือนต่อมา

t(){a=($^a-$^@_);for s l (${w:^^argv})s+=$l&&for ((i=0;i++<$#s;))a[i]+=$s[i];}
w=(+)
t $@
for s;w[++j]=${(l:j:)}_
t $@
t ${(Oa)@}
[[ $a = *XXXX* ]]&&<<<X||<<<Y

( แรก ) ( ที่สอง ) ( ที่สาม ) ( ที่สี่ ) ( ที่ห้า ) ( ที่หก ) ลองออนไลน์!

ในส่วนท้ายฉันพิมพ์ทั้งบอร์ดอินพุตและอาร์เรย์ที่เราสร้างจากมันไปยัง stderr เลื่อนลงเพื่อแก้ไขข้อบกพร่องเพื่อดู อาร์เรย์ที่เราสร้างนั้นใช้เวลานานกว่ามากเนื่องจากtผลิตภัณฑ์คาร์ทีเซียนที่มีบอร์ดอินพุตในการโทรทุกครั้ง (นี่มันย่อโค้ดไม่กี่ไบต์)

มีจำนวนมากที่จะปกนี่ดังนั้นฉันย้าย (รุ่นที่หก) ความคิดเห็นที่เค้าข้อเขียน

(tl; dr: เชื่อมโยง transpositions ของอาเรย์ดั้งเดิมเข้าด้วยกัน แต่ต้องแน่ใจว่าจะแยกมันออกจากกัน)

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