Xs And Os Referee


Subject: Xs And Os Referee
Hace unos días Shell comentó sobre Checkio y pss me puse a jugar algunos retos, y aquí lanzo la convocatoria para la resolución de uno de ellos en gambas.

Tic-Tac-Toe, a veces conocido también como Xs y Os, es un juego de dos jugadores (X y O) que toman turnos para marcar espacios en una malla 3x3. El jugador que logra poner tres respectivas marcas en línea horizontal, vertical o diagonal (de noroeste-sureste y noreste-suroeste) gana el juego.

Pero nosotros no estaremos jugando este juego. Tu seras el referee para los resultados de este juego. Se te dará un resultado de un juego y tu debes determinar si el juego terminó en una vitoria o empate, así como quien será el ganador. Asegurate de regresar 'X' si jugador-X gana y una 'O' si jugador-O gana. Si el juego queda en empate regresa una 'D' (Draw - Empate).

x-o-referee

Un resultado de juego es presentado como un array de strings, donde 'X' y 'O' son las marcas de los jugadores y '.' es una celda vacía.

Entrada: Un resultado de juego como un array de strings (unicode).

Salida: 'X', 'O' o 'D' como una string.

Subject: Re: Xs And Os Referee
Se supone que es un reto de los "simples", aunque yo me tardé un ratillo porque quería hacerlo simple y elegante pero creo aún no conozco bien python porque terminé usando mis loops FOR, jajaja

Espero se animen a participar que está muy divertido este reto.

Saludos!

Subject: Re: Xs And Os Referee
Hola RazaAztk.

Se debe tener en cuenta "solo" las posibles combinaciones para hacer tres en raya.
Tenemos una función a la que pasamos el tablero y la letra del jugador. Devolviendo verdadero o falso
si se ha hecho tres en raya.

Podemos hacer tres en raya de estas formas:

- En la parte superior
- En la parte de en medio
- En la parte de abajo
- Por la izquierda
- Por el medio
- Por la derecha
- Diagonal 1
- Diagonal 2

Nuestra función va a recibir: tablero y letra y devolverá verdadero o falso

HayGanador(t, l)

Continuara..


Saludos

Subject: Re: Xs And Os Referee
Qué tal!

Que bueno Shell que te animes a resolver este reto, yo acabo de terminar mi implementación en gambas y ocupé más líneas que el código que hice en python, y también ocupé otros recursos (en python corrí sobre los elementos de tuplas y en gambas usé funciones de cadena). Espero ver que tal te ha quedado tu código y cómo lo resolviste.

Dejo una plantilla para usar como base en la implementación en gambas.

Saludos!

' gambas module file

Function checkio(game_result As String[]) As String

' Your code here!
Return "X" Or "O" Or "D"

End

Public Sub Main()

If checkio(["X.O",
"XX.",
"XXO"]) = "X" Then Print "1st Ok"
If checkio(["OO.",
"XOX",
"XOX"]) = "O" Then Print "2nd Ok"
If checkio(["OOX",
"XXO",
"OXX"]) = "D" Then Print "3rd Ok"
If checkio(["O.X",
"XX.",
"XOO"]) = "X" Then Print "4th Ok"

End

Subject: Re: Xs And Os Referee
Hola!.

Esta es otra forma de hacerlo. Como lo primero es la honradez, diré que la idea no es mía.
La implementación si. Como veo que es una buena opción la muestro para que la veáis.

Existen dos funciones, una que comprueba si se ha hecho tres en raya y la otra para dibujar el tablero. (en consola)
Durante el juego se comprueba la letra jugador y el tablero, saliendo del juego en caso de que alguno
haya conseguido hacer tres en raya, persona o ordenador.

El código se extiende debido al testeo.

' gambas module file
Public Sub Main()

Dim tablero As New String[10]

'No es necesario si no se juega
' tablero.Fill(" ", 0, 10)

'Prueba1
tablero = ["",
"X", " ", "O",
"X", "X", " ",
"X", "X", "O"]

DibujaTablero(tablero)
'Jugador X
Print HayGanador(tablero, "X")
Print

'Prueba 2
tablero = ["",
"O", "O", " ",
"X", "O", "X",
"X", "O", "X"]

DibujaTablero(tablero)
'Jugador O
Print HayGanador(tablero, "O")
Print

'Prueba 3
tablero = ["",
"O", "O", "X",
"X", "X", "O",
"O", "X", "X"]

DibujaTablero(tablero)
'Jugador X
Print HayGanador(tablero, "X")
'Jugador O
Print HayGanador(tablero, "O")
Print

'Prueba 4
tablero = ["",
"O", " ", "X",
"X", "X", " ",
"X", "O", "O"]

DibujaTablero(tablero)
'Jugador X
Print HayGanador(tablero, "X")

End

Public Function HayGanador(t As String[], l As String) As Boolean

Return ((t[7] = l And t[8] = l And t[9] = l) Or 'En la parte superior
(t[4] = l And t[5] = l And t[6] = l) Or 'En la parte de en medio
(t[1] = l And t[2] And t[3] = l) Or 'En la parte de abajo
(t[7] = l And t[4] = l And t[1] = l) Or 'Por la izquierda
(t[8] = l And t[5] = l And t[2] = l) Or 'Por el medio
(t[9] = l And t[6] = l And t[3] = l) Or 'Por la derecha
(t[7] = l And t[5] = l And t[3] = l) Or 'diagonal
(t[9] = l And t[5] = l And t[1] = l)) 'diagonal

End

Public Sub DibujaTablero(tablero As String[])

' No se usa el elemento con indice 0
Print " | |"
Print " " & tablero[7] & " | " & tablero[8] & " | " & tablero[9]
Print " | |"
Print "-----------"
Print " | |"
Print " " & tablero[4] & " | " & tablero[5] & " | " & tablero[6]
Print " | |"
Print "-----------"
Print " | |"
Print " " & tablero[1] & " | " & tablero[2] & " | " & tablero[3]
Print " | |"

End


Es normal que el código en gambas sea siempre algo mas grande que en Python.
Sobre todo por las declaraciones. Como veis en este código no hay muchas declaraciones.
Creo que es una buena posibilidad, pasarle la letra del jugador y el tablero a la función.

P.d Comprueba el número de jugadas. ¿ Cómo es posible que en la primera partida haya cinco jugadas de la X y solo dos de la O ?.

Saludos

Last edited by Shell on Friday, 10 October 2014, 12:45; edited 2 times in total
Subject: Re: Xs And Os Referee
Sin usar bucles, la función puede quedar así:

Function checkio(game_result As String[]) As String

Dim letras As String[] = ["X", "O", "D"]
Dim l As String

For Each l In letras
'Parte superior
If Left(game_result[0], 1) = l And Mid(game_result[0], 1, 1) = l And Right(game_result[0], 1) = l Then Break
'Parte de en medio
If Left(game_result[1], 1) = l And Mid(game_result[1], 2, 1) = l And Right(game_result[1], 1) = l Then Break
'Parte de abajo
If Left(game_result[2], 1) = l And Mid(game_result[2], 2, 1) = l And Right(game_result[2], 1) = l Then Break
'Por la izquierda
If Left(game_result[0], 1) = l And Left(game_result[1], 1) = l And Left(game_result[2], 1) = l Then Break
'Por en medio
If Mid(game_result[0], 2, 1) = l And Mid(game_result[1], 2, 1) = l And Mid(game_result[2], 2, 1) = l Then Break
'Por la derecha
If Right(game_result[0], 1) = l And Right(game_result[1], 1) = l And Right(game_result[2], 1) = l Then Break
'Diagonal 1
If Left(game_result[0], 1) = l And Mid(game_result[1], 2, 1) = l And Right(game_result[2], 1) = l Then Break
'Diagonal 2
If Right(game_result[0], 1) = l And Mid(game_result[1], 2, 1) = l And Left(game_result[2], 1) = l Then Break
Next
Return l

End

Public Sub Main()

If checkio(
["X.O",
"XX.",
"XXO"]) = "X" Then Print "1st Ok"
If checkio(
["OO.",
"OOX",
"OOX"]) = "O" Then Print "2nd Ok"
If checkio(
["OOX",
"XXO",
"OXX"]) = "D" Then Print "3rd Ok"
If checkio(
["O.X",
"XX.",
"XOO"]) = "X" Then Print "4th Ok"
If checkio(
["XO.",
"OXO",
".OX"]) = "X" Then Print "5th Ok"
If checkio(
[".XO",
"XO.",
"OX."]) = "O" Then Print "6th Ok"

End



La ultima letra que es la D se devolvería por defecto en caso de no haberse encontrado la X o la O, lo que haría es recorrer todo los if's hasta el final.
Como es normal esto es el primer ejemplo funcional sin mejorar.

P.d si formateo el código me deforma las sentencias ifs, dejándolas desplazadas, cuando deberían tener la misma sangría.

Saludos

Subject: Re: Xs And Os Referee
Por cierto, ahora que estábamos hablando de tres en raya.

Cuando era pequeño jugábamos a otra modalidad de tres en raya. La base era la misma.
Pero cada jugador solo disponías de tres fichas.

A la salida del colegio, en frente teníamos la Catedral Vieja (su construcción fue entre el 1262-1263, luego en el siglo XVIII fue remodelada).
En la escaleras de mármol usábamos una tiza. Y creábamos un tablero como este:

tres_en_raya

Vaya, como cambia el tamaño de jpg a png.

Como veis hay unos caminos. Una vez colocadas las tres piezas de cada jugador, los turnos de los jugadores en el caso de
no haber hecho tres en raya, era mover esas fichas por los caminos para lograr hacer tres en raya, solo se podía desplazar
un movimiento.

¿ Imagináis los año que no recordaba esta manera de jugar ?.
En la imagen se ve una dirección, quizás se pueda jugar de esa manera.

Oye, pues la pagina esta muy interesante, otro post más para Shell!, alla voyyy!.

Pues si, debió ser una variante del juego tres en raya.

Citar:

Tres en línea: Es una variante que se juega en un tablero con nueve puntos conectados vertical y horizontalmente, además de dos grandes diagonales. Cada jugador consta de tres piezas. Por turnos, cada uno coloca sus piezas, cuando todas están en el tablero, empiezan a moverse una intersección por turno. El primero que logra hacer una fila con sus tres piezas, gana.


Pero por lo general estamos tan acostumbrados a la clásica versión que no volvemos a verla.

Saludos

Last edited by Shell on Sunday, 12 October 2014, 12:40; edited 1 time in total
Subject: Re: Xs And Os Referee
Shell:
Citar:

Tres en línea: Es una variante que se juega en un tablero con nueve puntos conectados vertical y horizontalmente, además de dos grandes diagonales. Cada jugador consta de tres piezas. Por turnos, cada uno coloca sus piezas, cuando todas están en el tablero, empiezan a moverse una intersección por turno. El primero que logra hacer una fila con sus tres piezas, gana.

Esta chula, no conocia esa variante...


Citar:
Vaya, como cambia el tamaño de jpg a png.

Cambiar de jpg a png, no varia el tamaño, solo el número de colores

Saludos

Subject: Re: Xs And Os Referee
Hola Julio.

jsbsan escribió: [Ver mensaje]
Shell:
Citar:
Vaya, como cambia el tamaño de jpg a png.

Cambiar de jpg a png, no varia el tamaño, solo el número de colores


No me refiero a la resolución, sino a que los archivos son mas grande.
Y eso que le pongo la calidad a la mitad con Gimp cuando exporto el archivo a otro formato.

Es que normalmente los jpeg no se suelen previsualizar "aparentemente" en el editor de la comunidad,
por eso los convierto a png.

Saludos

Subject: Re: Xs And Os Referee
Qué tal!

Disculpen la tardanza, fue un fin de semana muy divertido, jejeje.

Hey Shell, código simple y funcional; creo yo me compliqué mucho usando un buen de variables y otras cosas. Pero aquí dejo mis códigos. El primero en python, el que usé para pasar el reto en checkio

def checkio(game_result):
op = ((0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6))

for p in op:
i_r, i_c = int(p[0]/3), p[0]%3
j_r, j_c = int(p[1]/3), p[1]%3
k_r, k_c = int(p[2]/3), p[2]%3
p_p = game_result[i_r][i_c] + game_result[j_r][j_c] + game_result[k_r][k_c]
if p_p == 'XXX':
return 'X'
elif p_p == 'OOO':
return 'O'
return 'D'

if __name__ == '__main__':
#These "asserts" using only for self-checking and not necessary for auto-testing
assert checkio([
"X.O",
"XX.",
"XOO"]) == "X", "Xs wins"
assert checkio([
"OO.",
"XOX",
"XOX"]) == "O", "Os wins"
assert checkio([
"OOX",
"XXO",
"OXX"]) == "D", "Draw"
assert checkio([
"O.X",
"XX.",
"XOO"]) == "X", "Xs wins again"


Y mi código rebuscado en gambas:

' gambas module file

Function checkio(game_result As String[]) As String

Dim op As String[] = ["*1*2*3*", "*4*5*6*", "*7*8*9*", "*1*4*7*", "*2*5*8*", "*3*6*9*", "*1*5*9*", "*3*5*7*"]
Dim pt As String
Dim s_t As String
Dim py As String
Dim s_r As String = ""
Dim i As Integer = -1
s_t = game_result.Join("")
For Each py In ["X", "O"]
While (i <> 0) And (i < 10)
i = String.InStr(s_t, py, i + 1)
s_r = s_r & i
Wend
For Each pt In op
If s_r Like pt Then Return py
Next
s_r = ""
i = -1
Next
Return "D"

End

Public Sub Main()

If checkio(["X.O",
"XX.",
"XXO"]) = "X" Then Print "1st Ok"
If checkio(["OO.",
"XOX",
"XOX"]) = "O" Then Print "2nd Ok"
If checkio(["OOX",
"XXO",
"OXX"]) = "D" Then Print "3rd Ok"
If checkio(["O.X",
"XX.",
"XOO"]) = "X" Then Print "4th Ok"

End


Saludos!


Page 1 of 1


  
You cannot post new topics
You cannot reply to topics
You cannot edit your posts
You cannot delete your posts
You cannot vote in polls
You cannot attach files
You can download files
You cannot post calendar events

   

This is a "Lo-Fi" version of our main content. To view the full version with more information, formatting and images, please click here.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Generation Time: 0.2422s (PHP: 41% SQL: 59%)
SQL queries: 24 - Debug Off - GZIP Enabled