배경
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 wins
및 Tie
출력을위한 것이다.
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
.
평소와 같이 모든 표준 규칙이 적용됩니다. 이것은 모든 언어에서 가장 짧은 바이트 코드 인 code-golf입니다 .
답변
젤리 , 16 15 14 바이트
U,Z;ŒD$€ẎḄỊÐḟḢ
값이있는 목록 (행 또는 열) 목록을 허용하는 모나드 링크 :
X = 0.155; O = -0.155; _ = 0
결과 반환 :
X wins = 1.085; O wins = -1.085; Tie = 0
참고 :에 0 값 사용 _
하고, 동일하지만 반대의 값 X
과 O
이 값 (여기서 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
}
X
X가 이기면 반환O
경우 O의 승T
넥타이 인 경우를 .
답변
펄 5 , 58 바이트
56 바이트 코드 + 2 fpr -p0
.
$_=eval sprintf'/(.)(.{%s}\1){2}/s||'x4 .'0?$1:T',0,2..4
출력 X
과 O
승리 또는 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