O banco foi invadido e todos os bandidos da máfia local têm um álibi incomum: eles estavam em casa jogando o Connect 4! Para ajudar na investigação, você é solicitado a escrever um programa para validar todas as placas do Connect 4 que foram confiscadas para verificar se as posições são de fato posições de um jogo válido do Connect 4 e não foram montadas às pressas assim que a polícia bateu na porta.
As regras para conectar 4: jogadores R
e Y
revezar-se para soltar peças de sua cor em colunas de uma grade 7x6. Quando um jogador coloca um ladrilho na coluna, ele cai para ocupar a posição mais baixa não preenchida nessa coluna. Se um jogador conseguir obter uma sequência horizontal, vertical ou diagonal de quatro peças de sua cor no tabuleiro, ele vence e o jogo termina imediatamente.
Por exemplo (com R
partida), a seguir é uma posição impossível do Connect 4.
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | |R| | | | |
| | |Y| | | | |
|R| |Y| | | | |
Seu programa ou função deve receber uma placa Connect 4 e retornar
- Um valor falso, indicando que a posição é impossível ou
- Uma cadeia de números de 1 a 7, o que indica uma possível sequência de movimentos que conduzem a que a posição (as colunas são numeradas
1
a7
partir da esquerda para a direita, e portanto a sequência de112
, por exemplo, indica um movimento vermelho na coluna1
, seguido por um movimento amarelo na coluna1
, seguido de um movimento vermelho na coluna2
). Você pode escolher uma numeração de coluna que não seja 1234567, se desejar, desde que você especifique em sua solução. Se você deseja retornar a lista em algum outro formato; por exemplo, como uma matriz[2, 4, 3, 1, 1, 3]
, isso também é bom, desde que seja fácil ver quais são os movimentos.
Você pode ler o quadro em qualquer formato razoável, incluindo o uso de letras que não sejam R
e Y
para os jogadores, mas você deve especificar qual jogador será o primeiro. Você pode assumir que o tabuleiro sempre será 6x7, com dois jogadores.
Você pode assumir que as posições que você recebe são pelo menos fisicamente possíveis de serem criadas em uma placa Connect 4 padrão; isto é, que não haverá peças 'flutuantes'. Você pode assumir que o quadro não ficará vazio.
Isso é código de golfe, então a resposta mais curta vence. Aplicam-se brechas padrão.
Exemplos
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | --> 1234567 (one possible answer)
| | | | | | | |
|R|Y|R|Y|R|Y|R|
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | |R| | | | | --> false
| | |Y| | | | |
|R| |Y| | | | |
| | | | | | | |
| | |Y| | | | |
| | |R| | | | |
| | |Y| | | | | --> 323333 (only possible answer)
| | |R| | | | |
| |Y|R| | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | --> false (this is the position arising after
| |Y|Y|Y|Y| | | the moves 11223344, but using those moves
| |R|R|R|R| | | the game would have ended once R made a 4)
| | | | | | | |
| | | | | | | |
|Y| | | | | | |
|R|Y| | | | | | --> 2134231211 (among other possibilities)
|R|R|Y| | | | |
|Y|R|R|Y| | | |
| | | | | | | |
| | | | | | | |
|Y| | | | | | |
|R|Y| | | | | | --> false (for example, 21342312117 does not
|R|R|Y| | | | | work, because Y has already made a diagonal 4)
|Y|R|R|Y| | |R|
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | --> 112244553 or similar
|Y|Y| |Y|Y| | |
|R|R|R|R|R| | |
fonte
Respostas:
Gelatina , 57 bytes
Toma uma matriz onde
0
não está preenchida, é1
reproduzida primeiro e2
reproduzida depois. Rende uma lista de colunas indexadas em 1, vazias se uma farsa foi identificada.Experimente online! (ineficiente demais para que mais de 7 peças sejam executadas em menos de um minuto)
Nota:
ZṠṢ€Ƒȧ
+6 bytes)fonte
JavaScript (ES6),
202 194 187183 bytesExperimente online!
Quão?
Ao fazer isso, garante que não executemos quatro valores ímpares consecutivos até que todos os valores pares tenham desaparecido (ou seja, se um lado vencer, esse deve ser o último movimento).
Comentado
fonte
f([ [0,0,0,0,0,0,0], [0,0,0,0,0,0,0], [0,0,0,0,0,0,0], [0,0,2,0,2,0,0], [0,2,2,0,2,2,0], [1,1,1,1,1,1,1] ])
termina0
ef([ [0,0,0,0,0,0,0], [0,0,0,0,0,0,0], [0,0,0,0,0,0,0], [0,0,2,0,2,0,0], [2,2,2,0,2,2,1], [1,1,1,1,1,1,1] ])
deve ser verdadePython 2 ,
295285 bytesExperimente online!
-10 thx para Jo King .
Entrada é uma lista de cadeias que representam as colunas; com '1' para vermelho e '0' para amarelo. As strings não são preenchidas com ''. Portanto, o caso (falsey):
é inserido como:
Saída é uma lista de índices de coluna, indexados em 0, que podem fazer parte do quadro; ou
None
se não for válido.Aceita o tabuleiro vazio como válido (retorna a lista vazia em
[]
vez deNone
).Essa abordagem é recursiva do último movimento para o primeiro movimento: com base na paridade do número total de movimentos realizados, removemos o último movimento Vermelho ou o último movimento Amarelo (ou falharemos se isso não for possível); verifique o tabuleiro resultante para ver se o oponente tem 4 em linha (nesse caso, falha, porque o jogo já deveria ter parado); caso contrário, recorra até que o quadro esteja vazio (o que é válido).
O código 4 em linha é a parte mais inchada. Todas as cadeias diagonais da matriz
b
são geradas por:que primeiro lista as diagonais "inclinadas para baixo" e depois as "inclinadas para cima".
fonte