Four Validatorの接続


20

前書き

Connect Fourは、水平方向、垂直方向、斜め方向の4つを連続して取得しようとするゲームです。このコードゴルフでは、ゲームボードを与えられて、誰が勝ったかを見つけようとします。勝者は常に1人で、勝者は1人だけです。


仕事

Connect Fourボードが与えられたら、勝者が誰であるかを調べます:XまたはY。勝者は常に1人で、勝者は1人だけです。ボードのサイズは、ゲームボードの様子と同じように常に6 x 7です。

ボードの場合、次のボードはこの例でXは赤でY青です。

ここに画像の説明を入力してください

入力は次のようになります。

OOOOOOO
OOOOOOO
OOOOOOO
OOOOXOO
OOOXXOO
OOXYYYY

ゲームの行を改行文字(上記のように)で区切ることができます。分割文字は使用できません。行を配列またはリストに分割するか、文字のマトリックスを入力できます。

この例の正しい出力:

Y

Yには4つが連続しています。したがって、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

得点

最小バイト数が勝ちです!



2
勝者は常に敗者よりも多くのトークンを持っていると仮定できますか?
数学中毒

1
@mathjunkie私は間違っていた、あなたはそれを仮定することはできません。
ニール

3
@nfnneilは出力をXまたはYにする必要がありますか、それとも他の2つの一貫した出力を選択して勝者を示すことができますか?
マーティンエンダー

1
入力として他の文字を使用することを選択できますか?または、数値行列を入力するには?
ルイスメンドー

回答:


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.

かなり単純です:すべての行、列、対角線、および対角線(n-queensバリデーターの場合と同様)を取得し、それらのすべての長さ4の部分文字列を取得し、4の勝者の行が終わり。(あります場合には私たちは、タイブレークを必要とするOOOOに加えて、XXXXまたはYYYY。)最後の要素の最後の要素を取り、それは可能でしょうXY、必要に応じ。


6

網膜、51 48バイト

3バイトを節約してくれたMartin Enderに感謝

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

オンラインでお試しください!

入力を行のコンマ区切りリストとして取得します


あなたは試合の段階を使用して短縮することによって、いくつかのバイトを保存することができます(.{7}X){3}|XXXする(.{7}X|X)\4\4tio.run/nexus/retina#fc4xCsMwDAXQPfcI2GC6NDS5QaeipcP/...
マーティン・エンダー

1
@MartinEnderどのように使用できるかわかりません\4- .{7}マッチした文字列ではなく、の効果を繰り返したいのです。(そして、バランスをとるグループはおそらく長すぎるでしょう。)
ニール

1
@Neil oh yeah、なんとなく、グリッド内の一致以外のOXYセルがあるとは思わなかった。一致ステージを使用すると、3バイト節約されます。
マーティンエンダー

5

Javascript(ES6)、54 55

@Arnauldに感謝して1バイトを編集しました

Xが勝者かどうかを確認します。勝者は常に1人で、勝者は1人だけです。

入力は、@ 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)))


@アーナウド、ありがとう
-edc65

4

ゼリー25 22 バイト

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

で形成された文字列のリスト(または文字のリストのリスト)を受け取りXYO(もスペースが両方のカウンタより低い序を有するように、代替品では動作します)。

オンラインでお試しください!または、複数行の文字列を取る拡張バージョンを実行します。

どうやって?

Œ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バイト節約

入力を何かで区切られた文字列として受け取ります。ここで、何かは基本的に任意の文字です。

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

テストケース


なぜ使用しないのb.match()ですか?RegExp通話を節約する必要があります。
ニール

@Neil私はそれmatch()がに暗黙的に変換されていたことを完全に忘れていましたRegExp。ありがとう!
アーナルド



2

パイソン2201 143 129 128 107バイト

水平、垂直、対角線を1つのリストに追加し、増分を追加して、その中の時間をXで探すことにしました。そして、常に勝者がいるので、Xが勝てない場合、Yが勝ったと仮定できます。このコードは、すべての異なる部分と空の場所のマトリックスを取ります。

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

オンラインでお試しください!

クレジット


自己回答は完全に受け入れられます。
ジョナサンアラン

:それをあまり見ず、そこでは役に立たない空白のようだi:] fori, rr] for1 for
-Yytsi

@TuukkaX入力をありがとう、更新しました。
ニール

また、*(len(m)-1)可能性があります*~-len(m)使い方。
-Yytsi

まだそこにあります。] for1 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 8つの直交対角線方向のうちの4つです。 (1 1;1 0;1 -1;0 1)

3+[ ]\&44つのゼロのリスト(&4)から始めて、各方向に3つのステップを作成します

x+/:/: 各可能な位置から開始し、可能な各方向にステップを踏みます

,/連結します。この時点で、座標リストの4つのリストのマトリックスがあり、それらのいくつかはボードを超えて伸びています

x ./:/: 対応するセルを検索します x

88<どれが"Y"-sですか?(88はのASCIIコードです"X"

&/'どの4リストが"Y"-s のみで構成されていますか?(および-reduce-each)

|/少なくとも1つはありますか?(または削減)

"XY"@falseが返される"X"場合、trueが返される場合"Y"


1

Zsh207 ... 159バイト

バージョン履歴:最初の週に〜25バイトで4回反復。6か月後に〜25バイトでさらに3回繰り返します。

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

最初)(2)(3)(4)(5)(6 オンラインで試してみてください!

フッターでは、入力ボードとそこから構築した配列の両方を標準エラー出力に出力します。下にスクロールしてデバッグします。呼び出しごとにt入力ボードを備えたデカルト積を行うため、構築する配列はさらに長くなりました。(ちょっと、コードを数バイト短くしました。)

ここでは多くのことを説明する必要があるため、(第6版)コメントを注釈付きの要点に移動しました

(tl; dr:元の配列の転置を連結しますが、それらは必ず分離してください)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.