Dört Doğrulayıcı Bağla


20

Giriş

Connect Four, arka arkaya dört tane almaya çalıştığınız bir oyundur: yatay, dikey veya çapraz. Bu kod golf, biz bir oyun tahtası verilen kim kazandı bulmaya çalışacağız. Her zaman bir kazanan ve sadece bir kazanan olacak.


Görev

Bir Connect Four tahtası verildiğinde kazananın kim olduğunu bulun: Xveya Y. Her zaman bir kazanan ve sadece bir kazanan olacak. Tahta boyutu her zaman oyun tahtasının resimde nasıl olduğu gibi 6 x 7 olacaktır.

Bir tahta verildiğinde, aşağıdaki tahta Xkırmızı ve Ymavi renktedir:

resim açıklamasını buraya girin

Girdiğiniz bilgiler:

OOOOOOO
OOOOOOO
OOOOOOO
OOOOXOO
OOOXXOO
OOXYYYY

Oyunun satırlarını yeni satır karakterine (yukarıdaki gibi) ayırabilir, bölme karakteri yoktur, satırları bir diziye veya listeye bölebilir veya bir karakter matrisi girebilirsiniz.

Bu örnek için doğru çıktı:

Y

Y'nin arka arkaya dörtü vardır; yani Y kazanır. Yani, Y çıktı.


Test senaryoları

Giriş:

OOOOOOO
OOOOOOO
OOOOOOO
OOOOOOO
OOYYOOO
OYXXXXO

Çıktı:

X

Giriş:

OOOOOOO
OOOOOOO
OOOOOOO
XXXXOOO
YXYYOOO
YXYYXYX

Çıktı:

X

Giriş:

YXYYXOO
XYXXYOO
XXXYYOO
YYYXXOO
XXYYYYO
XXYYXXO

Çıktı:

Y

Giriş:

OOOOOOO
OOOOOOO
OYOOOOO
OOYOOOO
OOOYOOO
OOOOYOO

Çıktı:

Y

Giriş:

OOOOOOO
OOOOOOO
OYOOOOX
OOYOOOX
OOOXOOX
OXOXYOX

Çıktı:

X

puanlama

En az sayıda bayt kazanır!


Bu, PMA / Salyangozlar için mükemmel bir meydan okumadır. Codegolf.stackexchange.com/questions/47311/…
Jerry Jeremiah

2
Kazanan her zaman kaybeden bir jetona sahip olacağını varsayabilir miyiz?
matematik bağımlısı

1
@mathjunkie Yanılmışım, bunu kabul edemezsin.
Neil

3
@nfnneil Çıktının X veya Y olması gerekiyor mu yoksa kazananı belirtmek için iki tutarlı çıktı daha seçebilir miyiz?
Martin Ender

1
Giriş olarak diğer karakterleri kullanmayı seçebilir miyiz? Veya sayısal bir matris girmek için?
Luis Mendo

Yanıtlar:


2

Jöle , 19 bayt

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

Çevrimiçi deneyin!

Bu cevabın özü, bu çok benzer soruya verdiğim yanıttan kopyalanıyor .

açıklama

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.

Oldukça basit: Tüm satırları, sütunları, köşegenleri ve antidiagonalleri (n-queens validator'da olduğu gibi) alırız, daha sonra bunların tüm uzunluk-4 alt dizelerini alırız, ardından bunları 4 sıradaki kazanan çizgi sıralanacak şekilde sıralarız. son. ( Veya öğesinin OOOOyanında bir de varsa, satır sonrasına ihtiyacımız vardır .) Son öğenin son öğesini al ve bu , gerektiği gibi veya gerektiği gibi.XXXXYYYYXY


6

Retina, 51 48 bayt

Martin Ender'e 3 bayt kazandığı için teşekkürler

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

Çevrimiçi deneyin!

Girdiyi virgülle ayrılmış satır listesi olarak alır


Bir maç aşamasını kullanarak ve kısaltmak (.{7}X){3}|XXXiçin birkaç bayt kaydedebilirsiniz (.{7}X|X)\4\4: tio.run/nexus/retina#fc4xCsMwDAXQPfcI2GC6NDS5QaeipcP/…
Martin Ender

1
@MartinEnder Nasıl kullanabileceğinizi göremiyorum \4- .{7}eşleşen dizeyi değil, etkisini tekrarlamak istiyorsunuz . (Ve dengeleme grupları muhtemelen çok uzun olurdu.)
Neil

1
@Neil oh evet, boşver, bir şekilde ızgaradaki maçtan başka OXY hücreleri olduğunu düşünmedim. maç aşamasını kullanmak yine de 3 bayt tasarruf sağlar.
Martin Ender

5

Javascript (ES6), 54 55

Düzenleme 1 bayt kaydedildi teşekkürler @Arnauld

X'in kazanan olup olmadığını kontrol ediyorum, çünkü her zaman bir kazanan olacak ve sadece bir kazanan olacak

Giriş, @ Arnauld'un cevabı gibi herhangi bir ayırıcıya sahip bir dizedir

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 right, teşekkürler
edc65

4

Jöle , 25 22 bayt

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

Oluşan bir dizeleri listesi (veya karakter listesinin listesi) Alır X, Yve O(aynı zamanda uzay hem sayaçlar daha düşük ordinal sahip olacak şekilde değiştirmeler ile çalışmak olacaktır).

Çevrimiçi deneyin! veyaçok satırlı bir dize alan artırılmış bir sürümü çalıştırın.

Nasıl?

Œ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 bayt

Neil sayesinde 7 bayt kurtardı

Girdiyi, bir şeyin temelde herhangi bir karakter olduğu ayrı bir dize olarak alır .

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

Test senaryoları


Neden kullanmıyorsunuz b.match()? RegExpÇağrı kaydetmelidir .
Neil

@ Neil Ben tamamen match()örtük bir dönüşüm yaptığını unuttum RegExp. Teşekkürler!
Arnauld

3

Python 2 , 143 bayt

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]))]

Dizelerin listesini veya karakterlerin listesini alır. Şartname garanti edildiği gibi 6 satır x 7 sütun için sabit kodlanmıştır .

Çevrimiçi deneyin!



2

Python 2 , 201 143 129 128 107 Bayt

Bir listeye birlikte yatay, dikey ve diyagonal eklemeye karar verdim ve sonra artış ekledim ve ardından X için aramaya baktım. Ve her zaman bir kazanan olacağından, X olmazsa Y'nin kazandığını varsayabilirim. Bu kodlar, tüm farklı parçaların ve boş yerlerin bir matrisini alır.

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)]))]

Çevrimiçi deneyin!

Kredi


Kendi kendine cevap vermek son derece kabul edilebilir.
Jonathan Allan

Çok fazla ona bakmadan, orada en yararsız boşlukları gibi görünüyor: i:] for, i, r, r] forve 1 for.
Yytsi

@TuukkaX Giriş için teşekkürler, güncellendi.
Neil

Ayrıca, *(len(m)-1)olabilir *~-len(m). Nasıl çalışır.
Yytsi

] forVe 1 forhala orada.
Yytsi

1

K (ngn / k) , 58 55 bayt

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

Çevrimiçi deneyin!

{ } argüman ile işlev x

+!6 7 0..5 ve 0..6 olası tüm çiftler

{ }' her biri için

4#1-+!3 3 8 orto-diyagonal yönün 4'üdür: (1 1;1 0;1 -1;0 1)

3+[ ]\&4dört sıfır ( &4) listesi ile başlayın ve her bir yönde 3 adım atın

x+/:/: olası her konumdan başlayın ve olası her yönde adımları atın

,/concatenate. bu noktada 4'lü koordinat çifti listesinden oluşan bir matrisimiz var, bunların bazıları tahtanın ötesine uzanıyor

x ./:/: karşılık gelen hücreleri aramak x

88<hangisi "Y"-s? (88 ascii kodudur "X")

&/'hangi 4 liste sadece "Y"-s'den oluşur ? (ve-azaltmak-her biri)

|/en az bir tane var mı? (Ya da azaltmak için)

"XY"@yanlış dönüş "X"ise, gerçek dönüş ise"Y"


1

Zsh , 207 ... 159 bayt

Sürüm geçmişi: İlk hafta ~ 25 bayt için 4 yineleme; 6 ay sonra ~ 25 bayt için 3 tekrar daha.

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

( birinci ) ( ikinci ) ( üçüncü ) ( dördüncü ) ( beşinci ) ( altıncı ) Çevrimiçi deneyin!

Altbilgide, hem giriş kartını hem de ondan oluşturduğumuz diziyi stderr'a yazdırıyorum. Bunları görmek için hata ayıklamak üzere aşağı kaydırın. Yaptığımız dizi şimdi çok daha uzun, çünkü her çağrıda tgiriş kartı olan kartezyen bir ürün var . (Hey, kodu birkaç bayt kısalttı.)

Burada ele alınacak çok şey var, bu yüzden (altıncı baskı) yorumları açıklamalı bir özete taşıdım .

(tl; dr: orijinal dizinin aktarımlarını birleştirin, ancak ayırdığınızdan emin olun)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.