박하 사탕 발가락-X 또는 O?


14

배경

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

틱택 토 는 유명한 2 인용 게임입니다. 두 명의 플레이어로 점진적으로 채워지 는 3x3 보드 로 구성됩니다 (아래 설명). 첫 번째 플레이어는 캐릭터 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.


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


2
내 뇌에서 나가! 말 그대로 나는 월요일에 Sanbox를 할 것이라는 Noughts & Crosses 도전에 대한 아이디어를 얻었습니다. 그런 다음 사이트를 열면 이것을 볼 수 있습니다!
— 얽히고 설킨

1
@Shaggy "Fast and Furious"시리즈에서 누군가 인용 : 너무 느림! ; p
— Mr. Xcoder

괜찮아, 내 생각은 아직 완료되지 않았다고 가정하고 재생 가능한 버전에 대한 것이었다.
— 얽히고 설킨

4
@Laikoni 나는 그것이 더 유연한 입력 및 출력을 가지고 있고 또한 빈 상자를 가지고 있기 때문에 그것이 속임수라고 생각하지 않으며, 또한 입력이 유효한 보드라고 가정 할 수 있습니다.
— Outgolfer Erik

1
@Joshua 틱택 토 게임을 만드는 것입니다. 이것은 하나를 등급에 관한 것입니다.
— DonielF

답변:


6

젤리 ,  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)

네, 난해한 언어 답변에는 설명이 있어야한다고 생각합니다 (그리고 일반 언어에 대한 설명도보고 싶습니다!)
— Jonathan Allan

추가해 주셔서 감사합니다! 아주 좋은 접근 방식, 제가 생각했던 것보다 훨씬 영리합니다 ... Nice
— Mr. Xcoder

6

자바 스크립트 (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]))


"프로그램은 3 개의 고유하고 일관되며 비어 있지 않은 값 을 출력 할 수 있어야합니다 . 따라서 빈 문자열을 출력 할 수 없습니다.
— RedClover

1
@Soaku 나의 나쁜, 나는 규칙의 그 부분을 놓쳤다.
— 허먼 L

4

젤리 , 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 개의 목록으로 입력됩니다 .


와우 니스 ... 골프를 마쳤 으면 I / O 값과 설명을 추가하십시오 :-)
— Mr. Xcoder

다음 은 약간 더 짧은 테스트와 비슷한 방법입니다. X= 1, O= 2, _=를 취 하면 (X 승), (O 승) 또는 (넥타이)가 3반환 됩니다. 123
— Arnauld

@Arnauld 단축에 감사드립니다
— Erik the Outgolfer

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'조각에 대해 확인됩니다.


파이썬 슬라이싱 FTW 어쨌든 81 바이트 가 작동해야한다고 생각합니다.
— 완전히 인간적인

@icrieverytim [2::2]slices to 3579, [2:8:2]제공357
— TFeld

파이썬 3, 73 바이트 .
— Jonathan Frech

3

제 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 넥타이 인 경우를 .

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


1
M[c(3,5,7)]반대 대각선의 경우 더 짧습니다
— user2390246


2

파이썬 (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

[8,0,3,6,1,4,7,2,5,8,0,4,8,2,4,6]->map(int,'8036147258048246')
— Outgolfer Erik

@EriktheOutgolfer 감사합니다. 내가 사용하여 골프에 정수 목록을 시도하고 있었다 map(ord,"...")불구하고, nul문자열의 중간에 바이트가 ... 잘 안
— 조나단 FRECH

117 바이트 . [j*3:j*3+3]입니다 [j*3:][:3]. 참고로, j*3+3와 동일 -~j*3하지만 118 바이트입니다.
— Mr. Xcoder

@JonathanFrech 당신은 여분의 것 같습니다 01234567...
— Outgolfer Erik

1
@ Mr.Xcoder 감사합니다. 오늘 새로운 슬라이싱 골프를 배웠습니다.
— Jonathan Frech

2

파이썬 3 , 173 바이트

lambda x:h(x,1)*2or+h(x,0)
h=lambda x,y:g(x,y)or g(zip(*x),y)or x[0][0]==x[1][1]==x[2][2]==y or x[0][2]==x[1][1]==x[2][0]==y
g=lambda x,y:any(all(e==y for e in r)for r in x)

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

  • 행렬로 입력 1 == X, 0 == O, -1 == _

  • 단일 값으로 출력 : 2 == X, 1 == O, 0 == TIE

Outgolfer Erik 덕분에 -8 바이트


첫 번째 줄 lambda x:h(x,1)*2or+h(x,0)을 -8 바이트로 바꿀 수 있습니다 0 == TIE(더 예뻐진 imo).
— Outgolfer Erik

@EriktheOutgolfer 쿨, 감사합니다
— HyperNeutrino

2

PHP, 70 바이트

for($c=95024101938;${${$i++&7}.=$argn[$c%9]}=1<$c/=3;);echo$XXX-$OOO;

가정합니다 -n(인터프리터 기본값). 추가로 -R( <code>모든 입력 라인에 대해 실행 )가 하나로 계산됩니다.

입력은 한 줄로 이루어집니다 (모든 공백이 제거 된 것을 제외하고는 정확하게 문제 설명과 동일).

출력은 다음과 같습니다. 1→ X 승리, -1→ O 승리, 0→ 타이.

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


전체 문자열을 가질 필요는 없으며 출력 값을 선택할 수 있습니다. 'X Wins'로 변경할 수 있습니다 'X'(또는 정수-say 1). 'O wins'및에 적용됩니다 Tie. 109 바이트 라고 합니다 .
— Mr. Xcoder

명확하게 해주셔서 감사합니다.
— primo '

1

망막 , 49 바이트

;
;;
.*(\w)(.)*\1(?<-2>.)*(?(2)(?!))\1.*
$1
..+
T

온라인으로 사용해보십시오! 링크에 지정된 테스트 케이스를이 형식으로 변환하는 헤더가 포함되어 있지만, 3 개의 그룹으로 구성된 3 개의 그룹에서 9 X, Os 또는 -s 의 11 자 문자열로 입력을 ;받습니다. 균형 그룹을 사용하여 당첨 라인을 직접 일치시켜 3 개의 일치하는 문자가 같은 거리에 있도록합니다. (적절한 거리는 0 (수평선), 4 (역 대각선), 5 (수직선) 또는 6 (대각선)이며, 다른 거리는 ;문자열에 부딪 치 거나 줄 바깥쪽으로 확장됩니다.)


1

자바 (8) 112 108 106 104 90 102 93 바이트

b->b.replaceAll(".*(X|O)(\\1|...\\1...|.{4}\\1.{4}|..\\1..)\\1.*","$1").replaceAll("..+","T")

둘 다 대신 하나의 대각선 만 검사하는 버그 수정으로 인해 +12 바이트 (90 → 102).
-9 바이트 (102 → 93)replaceAll 대신에matches .

형식의 입력 XOX OX_ O_X, 출력 X, O또는 T.

설명:

여기에서 시도하십시오.

b->{                   // Method with String as both parameter and return-type
  b.replaceAll(".*(X|O)(\\1|...\\1...|.{4}\\1.{4}|..\\1..)\\1.*",
                       //  If we found a line of X or O:
     "$1")             //   Replace it with either X or O
   .replaceAll("..+",  //  If there are now more than 2 characters left:
     "T")              //   Replace it with T
                       // End of method (implicit / single-line return-statement)

정규식 설명 :

.*(X|O)(\1|...\1...|.{4}\1.{4}|..\1..)\1.*
.*                                      .*# 0 or more trailing & leading chars
  (X|O)                               \1  # X or O next to those leading/trailing chars
       (\1                                # A single X or O in between (row found)
          |...\1...                       # 3 chars, X or O, 3 chars (column found)
                   |.{4}\1.{4}            # 4 chars, X or O, 4 chars (diagonal TL→BR found)
                              |..\1..)    # 2 chars, X or O, 2 chars (diagonal TR→BL found)


0

레티 나 , 51 바이트

.*(X|O)(\1|...\1...|.{4}\1.{4}|..\1..)\1.*
$1
..+
T

내 Java 8 답변 포트 . 의 입력 형식 XOX OX_ O_X, 출력 X, O또는T .

설명:

여기에서 시도하십시오.

.*(X|O)(\1|...\1...|.{4}\1.{4}|..\1..)\1.*
.*                                      .*# 0 or more trailing & leading chars
  (X|O)                               \1  # X or O next to those leading/trailing chars
       (\1                                # A single X or O in between (row found)
          |...\1...                       # 3 chars, X or O, 3 chars (column found)
                   |.{4}\1.{4}            # 4 chars, X or O, 4 chars (diagonal TL→BR found)
                              |..\1..)    # 2 chars, X or O, 2 chars (diagonal TR→BL found)

$1                                        #  Replace match of above with either X or O

..+                                       # If there are now 2 or more characters left:
T                                         #  Replace everything with T

0

J, 34 바이트

[:>./[:+./"1(2 1 0},:0 1 2}),(,|:)

언 골프 드 :

[: >./ [: +./"1 (2 1 0} ,: 0 1 2}) , (, |:)

설명

부호화:

X = 2
O = 3
_ = 1

우리의 높은 수준의 전략은 먼저 각 행이 가능한 승리의 행렬을 만드는 것입니다. 행 1은 대각선 /, 행 2는 대각선 \, 다음 3 행은 행이고 마지막 3 행은 열입니다. 이 부분은 (항목 Amend 사용 }) 문구에 의해 달성됩니다 .

(2 1 0},:0 1 2}),(,|:)

마지막으로 각 행의 GCD를 가져옵니다.

+./"1

우리의 인코딩 덕분에 공백이있는 행은 1의 GCD를 가지며, 2와 3은 coprime이기 때문에 X와 Os가 혼합 된 행과 마찬가지로 GCD는 1입니다. 다음으로해야 할 일은 최대 요소를 찾는 것입니다.>./

게임이 동점 인 경우 1이됩니다. 플레이어가 이기면 그 번호가됩니다.

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


0

자바 스크립트, 66 바이트

([a,b,c,d,e,f,g,h,i])=>e&(a&i|c&g|b&h|d&f)|a&(b&c|d&g)|i&(c&f|g&h)

간단하게 유지하십시오.

  • 입력 : 0공백, 1X 및 2O에 해당하는 문자열 또는 숫자 또는 문자열 배열입니다 .
  • 결과 : 0동점, 1X 승리, 2O 승리

확장되고 가볍게 주석을 달았습니다.

( [a,b,c,d,e,f,g,h,i] ) => // Break apart the input into nine variables w/ destructuring
  // Run through all possible win conditions. 1&1&1 -> 1, 2&2&2 -> 2
  e & (             // All victories involving the middle square
    a & i | c & g | // Diagonal lines
    b & h | d & f   // Vertical/horizontal through the middle
  ) | 
  a & ( b & c | d & g ) | // Victories with the top-left square
  i & ( c & f | g & h )   // Victories with the bottom-right square
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.