박하 사탕 발가락-X 또는 O? 많이 생각합니다!) 틱택 토 는 유명한 2

배경

Tic-Tac-Toe에 익숙하면 “작업”으로 건너 뛰십시오 (가장 많이 생각합니다!)

틱택 토 는 유명한 2 인용 게임입니다. 두 명의 플레이어로 점진적으로 채워지 는 3×3 보드 로 구성됩니다 (아래 설명). 첫 번째 플레이어는 캐릭터 X를 사용하고 다른 플레이어는를 사용 합니다 O. 우승자는 가로, 세로 또는 대각선으로 3 개의 연속적이고 동일한 문자 ( X또는 O) 를 가장 먼저받습니다 . 보드가 가득 차고 위에 언급 된대로 3 명의 연속적인 캐릭터를 얻지 못한 플레이어가있는 경우 게임은 동점으로 끝납니다. 게임이 끝날 때 빈 자리가있을 수 있습니다. 두 선수 중 총 9 번 미만으로 이길 경우 (동점 인 경우에는 불가능)

직무

게임이 끝날 때 틱택 토 보드 (문자열, 매트릭스, 9 개의 순서 값으로 구성된 플랫 목록, 기타 적절한 형식)가 주어지면 게임에서이기는 사람을 결정하십시오.

  • 입력은 별개의 구성된다 일관된 값에 대한 하나의 X, 하나 O및 빈 곳을 나타내는 또 하나.

  • 당신의 프로그램은 3 개의 독특하고 일관성 있고 비어 있지 않은 값을 출력 할 수 있어야합니다 : 하나는 X이기면, 다른 하나는 O이기면 또 다른 하나 는 플레이어가 묶인 경우.

    답변에이 값을 지정하십시오. 입력이 유효한 Tic-Tac-Toe 보드라고 가정 할 수 있습니다.

테스트 사례

X, O, _여기서 상기 입력 값이고; X wins, O winsTie출력을위한 것이다.

X O X
O X _
O _ X

출력 : X wins.

X _ O
X O _
X O X

출력 : X wins.

X O X
_ O X
_ O _

출력 : O wins.

X O X
O O X
X X O

출력 : Tie.


평소와 같이 모든 표준 규칙이 적용됩니다. 이것은 모든 언어에서 가장 짧은 바이트 코드 인 .



답변

젤리 ,  16 15  14 바이트

U,Z;ŒD$€ẎḄỊÐḟḢ

값이있는 목록 (행 또는 열) 목록을 허용하는 모나드 링크 :

X = 0.155; O = -0.155; _ = 0

결과 반환 :

X wins = 1.085; O wins = -1.085; Tie = 0

참고 :에 0 값 사용 _ 하고, 동일하지만 반대의 값 XO이 값 (여기서 0.155) 범위 일 수있다 (1/6, 1/7)(양단 제외) – I에서만 정확하게 표현할 부동 소수점 결과를 준 범위의 값을 선택 승리의 경우.

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

어떻게?

U,Z;ŒD$€ẎḄỊÐḟḢ - Link: list of lists (as described above)
U              - upend (reverse each row)
  Z            - transpose (get the columns)
 ,             - pair the two
      $€       - last two links as a monad for each of them:
    ŒD         -   diagonals (leading diagonals - notes: 1. only one is of length 3;
               -              2. the upend means we get the anti-diagonals too)
        Ẏ      - tighten (make a single list of all the rows, columns and diagonals)
         Ḅ     - from binary (vectorises) (note that [0.155, 0.155, 0.155]
               -                           converts to 4*0.155+2*0.155+1*0.155 = 1.085
               -                           and [-0.155, -0.155, -0.155]
               -                           converts to 4*-0.155+2*-0.155+1*-0.155 = -1.085
               -                           while shorter lists or those of length three
               -                           with any other mixtures of 0.155, -0.155 and 0
               -                           yield results between -1 and 1
               -                           e.g. [.155,.155,0] -> 0.93)
           Ðḟ  - filter discard if:
          Ị    -   insignificant (if abs(z) <= 1) (discards all non-winning results)
             Ḣ - head (yields the first value from the list or zero if it's empty)


답변

자바 스크립트 (ES6), 103 87 바이트

a=>"012+345+678+036+147+258+048+246T".replace(/\d/g,n=>a[n]||!1).match(/(\d)\1\1|T/)[0]

입력

  • X는 1
  • O는 2
  • _는 0

산출

  • X 승은 "111"
  • O 승은 다음과 같이 표현됩니다 "000"
  • 넥타이는 "T"

설명

a=>
    "012+345+678+036+147+258+048+246" // List of indexes for each row
    .replace(/\d/g,n=>a[n]||!1)       // Replace all digits with the value of the cell
    .match(/(\d)\1\1|$/)[0]           // Find the first row filled with the same value

테스트 사례

f=
a=>"012+345+678+036+147+258+048+246T".replace(/\d/g,n=>a[n]||!1).match(/(\d)\1\1|T/)[0]
console.log(f([1,2,1,2,1,0,2,0,1]))
console.log(f([1,0,2,1,2,0,1,2,1]))
console.log(f([1,2,1,0,2,1,0,2,0]))
console.log(f([1,2,1,2,2,1,1,1,2]))


답변

젤리 , 18 바이트

UŒD;;Z;ŒDµSA⁼3µÐfḢ

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

X= 1, O= -1, _= 0
X wins = [1, 1, 1], O wins = [-1, -1, -1], Tie = 각각 0
3 개의 요소로 (1, -1, 0)구성된 3 개의 목록으로 입력됩니다 .


답변

파이썬 3 , 73 바이트

lambda b:{'XXX','OOO'}&{*b.split(),b[::4],b[1::4],b[2::4],b[::5],b[2::3]}

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


파이썬 2 , 100 95 92 87 82 77 바이트

lambda b:{'XXX','OOO'}&set(b.split()+[b[::4],b[1::4],b[2::4],b[::5],b[2::3]])

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


줄 바꿈으로 구분 된 문자열로 입력을받습니다. XO_

출력 :

  • {'XXX'}대한 X,
  • {'OOO'} …에 대한 O
  • {} 넥타이

문자열을 행 열과 대각선으로 자르면 작동합니다.

The board:
    1 2 3
    4 5 6
    7 8 9
which is '123\n456\n789' is sliced into:

['123', '456', '789', '147', '258', '369', '159', '357']
rows: b.split() -> ['123', '456', '789']
cols: [b[::4],b[1::4],b[2::4]] -> ['147', '258', '369']
diag: [b[::5],b[2::3]] -> ['159', '357']

그때 'XXX''OOO'조각에 대해 확인됩니다.

줄 바꿈으로 구분 된 문자열로 입력을받습니다. XO_

출력 :

  • {'XXX'} …에 대한 X,
  • {'OOO'} …에 대한 O
  • {} 넥타이

문자열을 행 열과 대각선으로 자르면 작동합니다.

The board:
    1 2 3
    4 5 6
    7 8 9
which is '123\n456\n789' is sliced into:

['123', '456', '789', '147', '258', '369', '159', '357']
rows: b.split() -> ['123', '456', '789']
cols: [b[::4],b[1::4],b[2::4]] -> ['147', '258', '369']
diag: [b[::5],b[2::3]] -> ['159', '357']

그때 'XXX''OOO'조각에 대해 확인됩니다.


답변

118 화 116 115 바이트

두 개의 추가 바이트에 대한 @ user2390246 에게 감사 합니다.

function(M,b=table,u=unlist(c(apply(M,1,b),apply(M,2,b),b(diag(M)),b(M[2*1:3+1]))))`if`(any(u>2),names(u[u>2]),"T")

약간 골퍼되지 않음 :

function(M){
    u=unlist(c(apply(M,1,table), #Contingency table of the rows
             apply(M,2,table), #of the columns
             table(diag(M)), #of the diagonal
             table(M[2*1:3+1]))) #of the opposite diagonal
    `if`(any(u>2),names(u[u>2]),"T") #Give name of element that occurs more than twice in any setting
 }

XX가 이기면 반환O 경우 O의 승T 넥타이 인 경우를 .

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


답변

펄 5 , 58 바이트

56 바이트 코드 + 2 fpr -p0.

$_=eval sprintf'/(.)(.{%s}\1){2}/s||'x4 .'0?$1:T',0,2..4

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

출력 XO승리 또는 T동점. 한 번에 모두 테스트 할 수있는 많은 헤더 / 바닥 글 코드가 포함되어 있습니다.


대안, 58 바이트

$}.="/(.)(.{$_}\\1){2}/s||"for 0,2..4;$_=eval$}.'0?$1:T'

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


답변

파이썬 (2) , 124 (118) 117 115 바이트

  • 덕분에 6 바이트 절약 Outgolfer Erik 절약했습니다 . 쉼표를 피하기 위해 문자열을 사용합니다.
  • Mr. Xcoder 덕분에 1 바이트를 절약했습니다 . 골프[j*3:j*3+3][j*3:][:3] .
  • 마법의 숫자를 사용하여 문자열을 압축하여 2 바이트를 절약했습니다.
def T(B):
 for j in range(8):
	a,b,c=map(int,`0x197bf3c88b2586f4bef6`[j*3:][:3])
	if B[a]==B[b]==B[c]>0:return B[a]

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

입력 / 출력 값

  • X 로 표현된다 1
  • O 로 표현된다 2
  • _ 로 표현된다 None