Vamos jogar um código de golfe!
Dado o estado da placa do jogo da velha (exemplo :)
|x|x|o|
|x|o|x|
|o|o|x|
Determine se um jogo é um win
a lose
ou cat
. Seu código deve gerar uma dessas opções, dependendo do estado. O jogo acima deve gerarlose
Só para esclarecer: uma vitória é definida como qualquer 3 x
s consecutivos (diagonal, horizontal, vertical). uma perda é de 3 o
s seguidos, enquanto um cat
jogo não é seguido.
Para tornar as coisas interessantes, você determina sua estrutura de entrada para o estado - que você deve explicar. Por exemplo, xxoxoxoox
é um estado válido, como visto acima, onde cada um dos caracteres é lido da esquerda para a direita, de cima para baixo. [['x','x','o'],['x','o','x'],['o','o','x']]
é o jogo em matriz multidimensional lido de maneira semelhante. Enquanto 0x1a9
que é hexagonal para 110101001
trabalho poder como uma compressão apropriada, onde 1
pode ser manipulado para x
s e 0
pode ser manipulado para o
.
Mas essas são apenas algumas idéias, tenho certeza que você pode ter muitas.
Regras básicas:
- Seu programa deve poder aceitar qualquer estado viável.
- A forma de entrada deve ser capaz de representar qualquer estado.
- "O estado da vitória deve ser determinado a partir do quadro"
- Suponha uma placa completa
Win
antes,lose
por exemplo, no caso 'xxxoooxxx'
Vitórias mais baixas na contagem de caracteres
(win|lose|cat) [xo]{9}
onde a primeira palavra indica se o jogo é uma vitória, uma derrota ou um gato (?) Para o jogador x. Capaz de representar qualquer estado.Respostas:
Ruby 2.0, 85 caracteres
Aqui está uma solução simples baseada em máscara de bit no Ruby:
A placa é representada como um número hexadecimal, composto por nove bits correspondentes aos nove quadrados. 1 é um
X
, 0 é umO
. É exatamente como o0x1a9
exemplo da pergunta, embora o0x
seja opcional!Provavelmente existe uma maneira melhor de fazer as máscaras de bits do que apenas codificar uma grande lista. Ficarei feliz em receber sugestões.
Veja-o rodando no Ideone aqui .
fonte
273
duas vezes. E eu realmente gosto damax
ideia!Mathematica, 84 caracteres
Formato de entrada:
{{1, 1, 0}, {1, 0, 1}, {0, 0, 1}}
fonte
Tr@a
é o rastreamento do campo (soma acima da diagonal),Tr@Reverse@a
é o rastreamento do campo invertido (alguns acima da anti-diagonal),Tr/@a
éTr
aplicado a cada linha, que fornece a soma de cada linha,Total@a
fornece a soma de cada coluna. Então, basicamente, você tem todas as 8 linhas que precisa verificar. Então, aWhich
coisa é aplicada a isso (basicamente umaif/elseif/else
declaração), onde#
representa essa lista de 8 valores.if
há um que3
você ganha,else if
há um que0
você perdeelse if 1>0
(verdade)cat
.Bash:
283262258Apresentando uma interface relativamente amigável.
Executar
bash tictactoe.sh O X O X O X X O X
Nota: a lista de 9 posições é uma representação matricial padrão. Não importa se o quadro é representado como coluna maior ou linha maior, lido da esquerda para a direita ou de cima para baixo - jogos de zeros e cruzamentos (ou tic tac toe se você insistir) são simétricos, portanto, a ordem de entrada deve ser irrelevante para o resultado em toda implementação correta, desde que a entrada seja linear.
Edit: Obrigado ao hjk pela sugestão de sintaxe de função mais curta.
fonte
t() { ... }
vez defunction t
? Pode salvar alguns caracteres lá. :)<<<
para salvar outros quatro caracteres.Befunge 93-375
Toma uma string binária como entrada.
Lê a string. O Bruteforce a grava (a faixa mais vertical à direita) como uma matriz entre o
adicionando retículo (idk). Determina a soma das colunas, linhas e dois diagnósticos. Compara esses valores com 3 ("vitória") ou 0 ("perda"), caso contrário, se todos os valores forem iguais a 1 ou 2, então empate ("gato").
fonte
GolfScript, 27 caracteres
O formato de entrada é uma sequência composta por oito dígitos octais, cada um (redundantemente) codificando três quadrados consecutivos do quadro:
Para codificar uma sequência (linha / coluna / diagonal) de três quadrados como um dígito octal, substitua todos
x
na sequência por 1 e cadao
com 0, e interprete a sequência resultante de uns e zeros como um número binário entre 0 e 7 inclusive.Esta formato de entrada é bastante redundante (todas as posições do tabuleiro são codificados, pelo menos, duas vezes, com a posição central codificado quatro vezes), mas não de forma inequívoca representar qualquer estado possível de uma placa de tic-tac-dedo do pé completamente preenchido, e não directamente codificar o vencedor na entrada.
A entrada pode, opcionalmente, conter espaços ou outros delimitadores entre os dígitos. De fato, todo o programa realmente se importa é se a sequência de entrada contém ou não os dígitos
7
ou0
.Por exemplo, o quadro de exemplo:
pode ser representado pela entrada:
Por conveniência, aqui está um programa GolfScript para converter um layout de placa de arte ASCII, como mostrado no desafio acima, em uma sequência de entrada adequada para este programa:
Este conversor ignora quaisquer caracteres que não sejam
x
eo
, em ambos os casos, em sua entrada. Ele produz uma sequência de um dígito (completa com delimitadores de espaço, como mostrado acima), adequada para alimentar o programa de determinação de vitórias acima, de modo que a concatenação desses dois programas pode ser usada para determinar o vencedor diretamente do quadro de arte ASCII.Além disso, aqui está um conversor reverso, apenas para demonstrar que a entrada realmente representa inequivocamente a placa:
Ps. Aqui está uma demonstração online desta solução.
fonte
Python 2 - 214 bytes
Tenho certeza de que há melhorias a serem feitas.
Para correr:
que representa este fórum:
Sai com uma
NameError
exceção em todos os casos, excetocat
.fonte
<<<
! +1 apenas por isso../whatever <<< 'blah blah blah'
é o mesmo queecho -n 'blah blah blah' | ./whatever
mas sem ter todo um processo separado paraecho
.echo
embash
é realmente um embutido, então não desembolsar um novo processoHaskell, 146 caracteres
ESTÁ BEM :). Minha representação de um quadro é um desses 126 caracteres
Aqui está a solução em 146 caracteres:
E aqui está como ele funciona, como um script haskell:
fonte
JavaScript, 420 caracteres
Nesta versão,
s
contém um número inteiro que representa o estado do tabuleiro de jogo. É uma matriz de valores em que dois bits representam cada quadrado no quadro:10
- X11
- O00
- Praça vaziaEssa solução usa manipulação de bits para testar cada uma das oito configurações possíveis "três em linha" (as testa duas vezes, uma vez para X e uma vez para O).
Apresento isso com uma minificação menor no meu site Tic-Tac-Toe, onde essa
detectWin
função está em uso como parte de um jogo real de Tic-Tac-Toe.fonte
Ruby, 84 caracteres
Solução simples, baseada em RegExp. O formato de entrada é uma sequência binária de 9 dígitos, por exemplo,
110101001
para o quadro de exemplo fornecido na pergunta.Ruby, 78 caracteres
Formato de entrada:
xxo_xox_oox
fonte
Haskell, 169
Formato de entrada: "X" é representado apenas por
x
, "O" apenas poro
. Dentro de cada linha, os caracteres são simultâneos sem espaços, etc. As linhas são separadas por novas linhas.Gera todas as linhas / colunas / diagonais possíveis, depois filtra
[("ooo","lose"),("xxx","win")]
pela existência no quadro e depois seleciona a segunda palavra na tupla, para sabermos quais jogadores venceram. Anexamos anteriormente"cat"
para que possamos levar o último elemento da lista como nosso vencedor. Se os dois jogadores venceram,"win"
será o último (as compreensões da lista mantêm a ordem). Como"cat"
sempre é o primeiro, se um vencedor existir, ele será escolhido; caso contrário, um último elemento ainda existe, pois o anexo"cat"
garante a não-vacuidade.EDIT: Raspou 3 caracteres alterando a compreensão da última lista para
map
.fonte
C, 150 aprox.
Aqui é meia-noite e ainda não testei , mas postarei o conceito de qualquer maneira. Volto amanhã.
O usuário insere dois números octais (eu queria usar o binário, mas, tanto quanto sei, C suporta apenas octal):
a
representa o quadrado central, 1 para um X, 0 para um Ob
é um número de nove dígitos que representa os quadrados do perímetro, circulando o tabuleiro começando em um canto e terminando no mesmo canto (com repetição apenas desse canto), 1 para um X, 0 para um O.Existem duas maneiras possíveis de ganhar:
o quadrado central é X (
a
= 1) e dois quadrados opostos também são X (b&b*4096
é diferente de zero)três quadrados de perímetro adjacentes são X (
b/8 & b & b*8
é diferente de zero). Essa é apenas uma vitória válida se o quadrado do meio for um quadrado de aresta, não um quadrado de canto; portanto, é necessário aplicar a máscaram
também, para evitar as caixas quadradas de canto.Perder é detectado usando a variável c, que é o inverso de b.
fonte
m
na detecção de "perda" -c/8&c&c*8
. Voltei a jogar seu código (sem testar seu funcionamento) da seguinte forma:int a,b;t(v){return a&&v&v<<12||v/8&v&v*8&0x208208;}main(){scanf("%o%o",a,b);printf("%s",t(b)?"win":t(b^0x1249249)?"lose":"cat");}
(130 caracteres). O teste repetido foi longo o suficiente para ser extraído em uma função de testet()
; isso remove a necessidade dec
em
; as constantes convertidas em hexadecimal para salvar um caractere cada.printf
não precisa de uma sequência de formato - apenas forneça a sequência de resultados como o formato - ouputs
ela, pois a pergunta não pede uma nova linha após a saída! (economiza mais 7 caracteres).Bater,
107103Gera e executa um script sed.
Formato de E / S:
oxo-oox-xoo
saídaslose
(use a-
para separar linhas). Entrada em stdin. Requer GNU sed para oc
comando.Eu interpretei a regra 5 como "se a vitória e a derrota forem possíveis, escolha vencer".
Código principal
Esta é a resposta real.
Nada realmente interessante. Ele define
$b
como/cwin
salvar caracteres, define a parte da condição de vitória do script e usased y/x/o/\;s$b/close/
para converterx
parao
ecwin
paraclose
(gerando, assim, as condições de perda). Em seguida, ele envia as duas coisas eccat
(que serão exibidascat
se nenhuma condição de vitória / perda for correspondida) para sed.Código Gerado
Este é o script sed gerado e executado pelo script Bash.
Nas regexes,
.
corresponde a qualquer caractere e depois delescTEXT
imprime TEXT e sai se a regex for correspondida.Isso pode ser executado como um script sed independente. Tem 125 caracteres, você pode contar como outra solução.
fonte
Python 3, 45
Entrada é entrada
i
, que é uma lista de números que representam cada linha, coluna e diagonal do tabuleiro de jogo, por exemplo:é representado por
[6, 2, 1, 4, 6, 1, 7, 4]
.Código :
('cat','lose','win')[2 if 7 in i else 0 in i]
fonte
Dardo - 119
(Veja dartlang.org ).
Versão original usando RegExp: 151 caracteres.
A entrada na linha de comando possui 11 caracteres, por exemplo, "xxx | ooo | xxx". Qualquer caractere não xo pode ser usado como delimitador.
Os espaços em branco à esquerda e as novas linhas devem ser omitidos antes da contagem de caracteres, mas cortei o espaço em branco interno sempre que possível. Eu gostaria que houvesse uma maneira menor de fazer a substring.
Versão base de bits recusiva: 119 caracteres. A entrada deve ser um número de 9 bits com 1s representando 'x' e 0s representando 'o'.
fonte
CJam,
39 3836 caracteresEste é um código convertido básico para
que tem 52 caracteres.
A entrada é simplesmente a representação de string do quadro, começando do canto superior esquerdo, indo linha por linha. Por exemplo:
o que resulta em uma
win
saída. Ouo que resulta em uma
cat
saída etc.O código simplesmente faz as seguintes três coisas:
q3/_
- Divida a corda em partes de 3, ou seja, por linha_z
- Copie a matriz por linha e transponha para a matriz por coluna.__Wf%s4%
- Inverta cada linha e vire a diagonal da esquerda para a direita. Esta é a diagonal secundária do quadro.\s4%
- Obtenha a diagonal principal do quadro]`
- Enrole tudo na matriz e especifique a matriz.Agora temos todos os grupos possíveis de 3 do quadro. Simplesmente verificamos a existência de "ooo" e "xxx" para determinar o resultado.
Experimente online aqui
fonte
GNU sed, 25 bytes
Se a entrada for uma representação redundante do tabuleiro com visualizações separadas para colunas, linhas e diagonais, como também é usado em outras respostas, o sed é muito adequado para verificar o estado final do jogo com o mínimo de bytes.
Formato de entrada:
xxx ooo xxx xox xox xox xox xox
(estado da placa retirado da pergunta do OP)Se o formato de entrada não for redundante (
xxx ooo xxx
), o código sed acima funcionará apenas se precedido pela linha abaixo, tornando o programa com 96 bytes de comprimento (com or
sinalizador necessário contado).fonte
Bash: 208 caracteres
Executar
bash tictactoe.sh 0 1 0 1 0 1 1 0 1
Inspirado por esta resposta .
fonte
VB.net
Com o exemplo, o fornecimento é codificado como o seguinte padrão de bits
Agora podemos determinar o resultado (ou vencedor) fazendo o seguinte.
fonte
J - 97 bytes
Bem, a abordagem mais simples disponível. A entrada é tomada como
111222333
, onde os números representam linhas. Leia da esquerda para a direita. Jogador éx
e inimigo éo
. Quadrados vazios podem ser qualquer coisa, excetox
ouo
.Exemplos: (NB. É um comentário)
Código ungolfed uma explicação
fonte
Python 2, 120 bytes
Ou Python, 115 bytes do shell Python (2 ou 3):
A variável board é definida no formato binário descrito na pergunta:
1
para X,0
para O, da esquerda para a direita, de cima para baixo. Nesse caso,101001110
representaO que leva à saída:
Cat
fonte
Python (
7362 caracteres)A entrada são quatro cadeias de letras minúsculas representando quatro visualizações distintas da mesma placa, todas concatenadas em uma única cadeia de caracteres: por linha, por coluna, diagonal direita, diagonal esquerda.
ATUALIZAR
Agradecemos à theRare por apontar isso com um bom contra-exemplo! Cada visualização do painel, juntamente com cada segmento (linha ou coluna) dentro de um painel, deve ser separada por um caractere que não seja um "x" ou um "o" para que a estrutura do painel seja preservada mesmo após a concatenação. As bordas em torno de cada visualização do quadro serão colchetes ("[" e "]"), e o separador entre linhas / colunas será um caractere de barra vertical | | ".
Isso simplifica o algoritmo - basta procurar "xxx" ou "ooo" para ganhar ou perder, respectivamente. Caso contrário, é um empate (gato).
Por exemplo, o quadro (leitura da esquerda para a direita, de cima para baixo) ...
X | X | X X | O | X O | X | O
... é representado como "[xxx | xox | oxo]" (por linhas) + "[xxo | xox | xxo]" (por colunas) + "[xoo]" (diag da direita) + [xoo] "(esquerda diag) = "[xxx | xox | oxo] [xxo | xox | xxo] [xoo] [xoo]".
Esta instrução Python imprime o resultado do jogo, dada a variável s como entrada:
fonte
OXX XOO XOX
(deve ser gato)?Haskell (69 caracteres)
É preciso a mesma entrada descrita nesta resposta . Mais especificamente, a entrada são 8 valores octais, descrevendo o valor binário de cada linha, coluna e diagonal. O código faz com que todas as instâncias de 7 "vença", todas as instâncias de 0 "percam" e remove todo o resto. Em seguida, ele adiciona "gato" ao final e pega os 4 primeiros caracteres do resultado.
Haverá 4 respostas possíveis: "perder", "gato", "vencer" seguido de um 'l' e "vencer" seguido de um 'c', que as regras não proíbem :)
Exemplo de uso:
fonte
J: 83
Uso: basta acrescentar uma sequência de x e o e observar o trabalho mágico. por exemplo. 'xxxoooxxx'.
O verbo interno
(+/@:(*./"1)@;@(;((<0 1)&|:&.>@(;|.)(,<)|:)))
basicamente encaixa a matriz binária original, com a transposição encaixotada e as 2 diagonais. Esses resultados são arrasados; somas de linha são tomadas para determinar vitórias e, em seguida, somadas. mais chamarei esse verboInner
.Para encontrar o vencedor, a diferença das pontuações entre as matrizes binárias normal e inversa é tomada pelo gancho
(-&Inner -.)
.O restante do código simplesmente produz as saídas e seleciona a correta.
fonte
JavaScript,
133, 114 caracteresA entrada
i
é uma string simples com delimitadores para as linhas, ou seja,100|001|100
Editar: atualizei meu método para substituir os 1s na regex por zeros para verificar o caso de perda.
fonte
=
e as aspas ao redor da regex literal. Além disso,1...
é um caractere menor que1.{3}
.r.test(i)
também é um caractere menor quei.match(r)
.J - 56 (26?) Char
A entrada recebe uma matriz 3x3 de nove caracteres, porque J pode suportar isso como um tipo de dados, LOL.
Exemplos:
Se for permitida a codificação Golfscriptish de dígitos octais representando redundantemente o estado de cada linha, coluna e diagonal, são apenas 26 caracteres:
fonte
T-SQL (2012), 110
select max(iif(@&m=0,'lose',iif(@&m=m,'win','cat')))from(VALUES(292),(146),(73),(448),(56),(7),(273),(84))z(m)
A entrada é um número hexadecimal. É praticamente uma tradução da solução ruby para o T-SQL bastante agradável e arrumada.
fonte
Javascript 1.6, 71 caracteres
Estou assumindo entrada como uma matriz
game
que contém cada linha, cada coluna e cada diag como uma seqüência de 3 caracteres. Semelhante à resposta de bob , mas vem em uma matriz, não como uma sequência concatenada.EDIT @ nyuszika7h 's comentário (67 caracteres)
fonte
~game.indexOf("xxx")
vez degame.indexOf("xxx")>=0
, o mesmo para o outro.Java 7, 260 bytes
Casos não testados e de teste:
Experimente aqui.
Resultado:
fonte
APL (NARS), 69 caracteres, 138 bytes
A entrada deve ser uma matriz 3x3 ou uma matriz linear de 9 elementos que pode ser apenas 1 (para X) e 0 (para O), o resultado será "gato" se ninguém vencer, "perder" se O vencer ", vencer "se X vencer. Não há verificação de uma placa ou entrada inválida, uma matriz possui menos de 9 elementos ou mais ou verifica cada elemento <2.
Como um comentário: ele converteria a entrada em uma matriz 3x3 e criaria uma matriz denominada "x", em que os elementos são a soma de cada coluna de linha e diagonal.
Alguns testes, veja o exemplo mostrado de outros:
fonte