Pular para o conteúdo principal

As paredes de uma célula em um número

O enunciado manda gravar o labirinto num arquivo de texto usando um único caractere por célula. Esse caractere precisa dizer, sozinho, quais dos quatro lados da célula (Norte, Leste, Sul e Oeste) têm parede. Esta página mostra como quatro respostas "tem parede / não tem" cabem num número de 0 a 15, e esse número num único caractere.

Quatro perguntas de sim ou não​

Para descrever as paredes de uma célula, basta responder quatro perguntas:

  1. Tem parede no Norte?
  2. Tem parede no Leste?
  3. Tem parede no Sul?
  4. Tem parede no Oeste?

Cada resposta é 1 (sim, tem parede) ou 0 (não, é passagem). Um dígito que só pode ser 0 ou 1 se chama bit. Quatro bits dão 2 × 2 × 2 × 2 = 16 combinações possíveis, numeradas de 0 a 15.

Qual bit é qual lado​

O enunciado fixa a ordem: cada lado da célula ganha um número de bit, de 0 a 3, e o bit vale 1 quando aquele lado tem parede.

Lado da célulaNúmero do bitQuanto vale quando é 1
Nortebit 01
Lestebit 12
Sulbit 24
Oestebit 38

A coluna "quanto vale" vem do jeito de escrever números em binário, explicado a seguir.

Binário: as casas valem 1, 2, 4, 8, da direita para a esquerda​

Um número binário se escreve só com 0 e 1, e se lê como um número comum: a casa da direita é a de menor valor.

No número decimal 352, o 2 está na casa das unidades (a da direita), o 5 na das dezenas e o 3 na das centenas: cada casa para a esquerda vale 10 vezes mais que a anterior. No binário, cada casa para a esquerda vale 2 vezes mais: 1, 2, 4, 8.

Posição no número escritoesquerdadireita
Lado da célulaOesteSulLesteNorte
Número do bit3210
Vale8421

Então, ao escrever os 4 bits de uma célula, o Norte (bit 0) fica no fim, à direita, e o Oeste (bit 3) fica no começo, à esquerda. Uma célula com parede no Norte e no Oeste, e passagem no Leste e no Sul:

Os bits 1001: Oeste fechado, Sul aberto, Leste aberto, Norte fechado, valor 9

Somando o valor das casas que têm 1: 8 + 1 = 9. Essa célula é descrita pelo número 9.

Na última linha da figura, 0b1001 é o jeito de o Python escrever um número em binário: o 0b na frente avisa que os dígitos seguintes são binários. 0b1001 é o número 9, e o "9" entre aspas é o caractere que vai para o arquivo.

A célula 9 desenhada​

A mesma célula 9, agora com as paredes no lugar. As paredes cheias são as fechadas e as tracejadas são as passagens; cada lado mostra quanto vale:

Célula com Norte e Oeste fechados, valor 9

Um exemplo que mostra a ordem​

O 1001 lido de trás para frente continua 1001. Por isso ele não mostra se a leitura começa pela esquerda ou pela direita: as duas dão o mesmo número. O próximo exemplo não tem essa simetria. Parede no Leste e no Oeste, passagem no Norte e no Sul, dá 1010 = 8 + 2 = 10; lido de trás para frente, 0101 seria 5, outra célula:

Os bits 1010: Oeste fechado, Sul aberto, Leste fechado, Norte aberto, valor 10

Célula com Leste e Oeste fechados, valor 10

De 0 a 15 num único caractere: hexadecimal​

Os números de 0 a 9 cabem num caractere, mas 10 a 15 têm dois dígitos. O hexadecimal resolve isso usando letras depois do 9:

Número0 a 9101112131415
Hexadecimal0 a 9abcdef

Assim, toda célula vira exatamente um caractere de 0 a f. A célula de valor 10 do exemplo acima é gravada como a, e a célula com as quatro paredes fechadas (8 + 4 + 2 + 1 = 15) é gravada como f:

Célula com as quatro paredes fechadas, valor 15

Tabela de exemplos​

As colunas dos lados estão na mesma ordem em que o binário se escreve:

CaractereOeste (8)Sul (4)Leste (2)Norte (1)SomaParedes
000000nenhuma
300112 + 1Leste e Norte
501014 + 1Sul e Norte
601104 + 2Sul e Leste
910018 + 1Oeste e Norte
a10108 + 2Oeste e Leste
c11008 + 4Oeste e Sul
d11018 + 4 + 1Oeste, Sul e Norte
f11118 + 4 + 2 + 1todas

Guardar as paredes como número também deixa simples, no código, perguntar por uma parede e abrir ou fechar uma parede. A próxima página mostra como.