네 개의 유효성 검사기 연결


20

소개

Connect Four는 가로, 세로 또는 대각선으로 4 개를 연속으로 시도하는 게임입니다. 이 코드 골프에서는 게임 보드를 통해 누가 이겼는지 찾으려고 노력할 것입니다. 항상 한 명의 승자가 있으며 한 명의 승자가 있습니다.


태스크

승자가 누구인지 파악하는 연결되는 4 개의 보드 감안할 때 : XY. 항상 한 명의 승자가 있으며 한 명의 승자가 있습니다. 보드 크기는 게임 보드가 그림과 같이 항상 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
승자가 항상 패자보다 하나 더 많은 토큰을 가지고 있다고 가정 할 수 있습니까?
math 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.

상당히 간단합니다 : 우리는 모든 행, 열, 대각선 및 대각 대각선 (n-queens 유효성 검사기에서와 같이)을 취한 다음 4 개의 하위 문자열을 모두 취한 다음 4 개의 우승 라인을 정렬하는 방식으로 정렬합니다 끝. (우리는 거기 경우에 타이 브레이크 필요 OOOO에 추가 XXXX또는 YYYY마지막 요소의 마지막 요소를 가져 가라.), 그리고 그 수 있습니다 X또는 Y필요에 따라.


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\4: tio.run/nexus/retina#fc4xCsMwDAXQPfcI2GC6NDS5QaeipcP/...를
마틴 청산

1
@MartinEnder 사용 방법을 모르겠습니다 . 일치하는 문자열이 아닌의 \4효과를 반복하고 싶습니다 .{7}. (그리고 밸런싱 그룹은 아마도 너무 길 것입니다.)
Neil

1
@ Neil 오 예, 신경 쓰지 마십시오. 어쨌든 그리드에 일치하는 것보다 다른 OXY 셀이 있다고 생각하지 않았습니다. 일치 단계를 사용하면 여전히 3 바이트가 절약됩니다.
Martin Ender

5

자바 스크립트 (ES6), 54 55

@Arnauld 덕분에 저장된 1 바이트 편집

항상 한 명의 승자가 있고 한 명의 승자가 있기 때문에 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

자바 스크립트 (ES6), 77 76 69 바이트

Neil 덕분에 7 바이트 절약

입력을 무언가 분리 된 문자열 로 가져 옵니다. 여기서 무언가 는 기본적으로 모든 문자입니다.

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

테스트 사례


왜 사용하지 b.match()않습니까? RegExp통화를 절약해야합니다 .
Neil

@Neil 나는 match()암묵적으로 변환하는 것을 완전히 잊었다 RegExp. 감사!
Arnauld



2

파이썬 (2) , 201 (143) 129 128 107 바이트

가로, 세로 및 대각선을 하나의 목록에 추가 한 다음 증분을 추가하고 시간을 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)]))]

온라인으로 사용해보십시오!

크레딧


자체 답변은 완벽하게 허용됩니다.
Jonathan Allan

너무 많이 보지 않고, 거기에 쓸모없는 공백을 것 같다 : i:] for, i, r, r] for1 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 8 개의 직각 대각선 방향 중 4 개입니다. (1 1;1 0;1 -1;0 1)

3+[ ]\&4 네 개의 0으로 시작합니다 (&4 ) 각 방향에서 3 단계를 수행하십시오.

x+/:/: 가능한 각 위치에서 시작하여 가능한 각 방향으로 단계를 수행하십시오.

,/사슬 같이 잇다. 이 시점에서 우리는 4 개의 좌표 쌍으로 구성된 매트릭스를 가지고 있으며, 그중 일부는 보드를 넘어 확장됩니다.

x ./:/: 에서 해당 셀을 조회 x

88<그들 중 어느 것이 "Y"-s입니까? (88은 ASCII 코드입니다."X" )

&/' 4 개의 목록 만 "Y"-s 무엇입니까? (각각 감소)

|/적어도 하나는 있습니까? (또는 감소)

"XY"@false "X"이면 true이면 true"Y"


1

Zsh , 207 ... 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

( ) ( ) ( 세 번째 ) ( () () 여섯째 ) 온라인으로 사용해보십시오!

바닥 글에서 입력 보드와 입력 보드를 stderr로 인쇄합니다. 아래로 스크롤하여 디버그하여 확인하십시오. 우리가 구축하는 배열은 지금 훨씬 더 길다.t입력 보드가있는 데카르트 식 제품이 되었습니다. 모든 호출 . (코드가 몇 바이트 단축되었습니다.)

여기서 다룰 내용이 많으므로 (6 판) 주석을 주석이 달린 요점으로 .

(tl; dr : 원래 배열의 전치를 연결하지만 분리 된 상태로 유지하십시오)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.