Criando matrizes bidimensionais em Ruby

O artigo a seguir faz parte de uma série. Para mais artigos desta série, consulte Clonando o jogo 2048 em Ruby. Para o código completo e final, consulte a essência.

Agora que sabemos como o algoritmo funcionará, é hora de pensar nos dados em que esse algoritmo funcionará. Existem duas opções principais aqui: um plano matriz de algum tipo ou uma matriz bidimensional. Cada um tem suas vantagens, mas antes de tomar uma decisão, precisamos levar algo em consideração.

DRY Puzzles

Uma técnica comum ao trabalhar com quebra-cabeças baseados em grade em que você precisa procurar padrões como esse é escrever um versão do algoritmo que funciona no quebra-cabeça da esquerda para a direita e depois gira o quebra-cabeça inteiro em torno de quatro vezes. Dessa forma, o algoritmo precisa ser escrito apenas uma vez e deve funcionar da esquerda para a direita. este reduz drasticamente a complexidade e o tamanho da parte mais difícil deste projeto.

Como trabalharemos no quebra-cabeça da esquerda para a direita, faz sentido ter as linhas representadas por matrizes. Ao fazer uma matriz bidimensional em

instagram viewer
Rubi (ou, mais precisamente, como você deseja que ele seja tratado e o que os dados realmente significam), você precisa decidir se deseja uma pilha de linhas (onde cada linha da grade é representada por uma matriz) ou uma pilha de colunas (onde cada coluna é uma matriz). Como estamos trabalhando com linhas, escolheremos as linhas.

Como essa matriz 2D é girada, veremos depois que realmente construímos essa matriz.

Construindo matrizes bidimensionais

O método Array.new pode usar um argumento que define o tamanho da matriz que você deseja. Por exemplo, Matriz.novo (5) criará uma matriz de 5 objetos nulos. O segundo argumento fornece um valor padrão, então Matriz.novo (5, 0) lhe dará a matriz [0,0,0,0,0]. Então, como você cria uma matriz bidimensional?

O caminho errado, e o modo como vejo as pessoas tentando frequentemente é dizer Array.new (4, Array.new (4, 0)). Em outras palavras, uma matriz de 4 linhas, cada linha sendo uma matriz de 4 zeros. E isso parece funcionar a princípio. No entanto, execute o seguinte código:

Parece simples. Faça uma matriz de zeros 4x4, defina o elemento superior esquerdo como 1. Mas imprima e nós temos…

Ele definiu a primeira coluna inteira como 1, o que dá? Quando criamos as matrizes, a chamada mais interna para Array.new é chamada primeiro, criando uma única linha. Uma única referência a esta linha é duplicada 4 vezes para preencher a matriz mais externa. Cada linha faz referência à mesma matriz. Mude um, mude todos eles.

Em vez disso, precisamos usar o terceiro maneira de criar uma matriz em Ruby. Em vez de passar um valor para o método Array.new, passamos um bloco. O bloco é executado toda vez que o método Array.new precisa de um novo valor. Então, se você dissesse Array.new (5) {gets.chomp}, Ruby irá parar e solicitar entrada 5 vezes. Então, tudo o que precisamos fazer é apenas criar uma nova matriz dentro desse bloco. Então, acabamos com Array.new (4) {Array.new (4,0)}. Agora vamos tentar esse caso de teste novamente.

E faz exatamente como você esperaria.

Portanto, mesmo que o Ruby não tenha suporte para matrizes bidimensionais, ainda podemos fazer o que precisamos. Lembre-se de que a matriz de nível superior contém referências às sub-matrizes e cada sub-matriz deve se referir a uma matriz diferente de valores.

O que essa matriz representa depende de você. No nosso caso, essa matriz é apresentada como linhas. O primeiro índice é a linha que estamos indexando, de cima para baixo. Para indexar a linha superior do quebra-cabeça, usamos a [0], para indexar a próxima linha abaixo, usamos a [1]. Para indexar um bloco específico na segunda linha, usamos um [1] [n]. No entanto, se tivéssemos decidido as colunas... seria a mesma coisa. Ruby não tem ideia do que estamos fazendo com esses dados e, como não suporta tecnicamente matrizes bidimensionais, o que estamos fazendo aqui é um hack. Acesse-o apenas por convenção e tudo se manterá unido. Esqueça o que os dados abaixo devem fazer e tudo pode desmoronar rapidamente.

instagram story viewer