박하 사탕 발가락-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 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.


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


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 값 사용 _ 하고, 동일하지만 반대의 값 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)

네, 난해한 언어 답변에는 설명이 있어야한다고 생각합니다 (그리고 일반 언어에 대한 설명도보고 싶습니다!)
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 TLBR found)
                              |..\1..)    # 2 chars, X or O, 2 chars (diagonal TRBL 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.