Quando os alunos são ensinados pela primeira vez sobre a técnica de prova da indução matemática , um exemplo comum é o problema de agrupar uma grade 2 N × 2 N com trominoes em forma de L , deixando vazio um espaço predeterminado da grade. (N é um número inteiro não negativo).
Vou deixar para você revisar a prova, se você ainda não a conhece. Existem muitos recursos que discutem isso.
Sua tarefa aqui é escrever um programa que aceite um valor para N, bem como as coordenadas do espaço da grade para deixar em branco e imprima uma representação ASCII da grade tromino lado a lado resultante.
O personagem Opreencherá o espaço vazio e as 4 rotações do nosso tromino ficarão assim:
|
+-
|
-+
-+
|
+-
|
(Sim, pode ser ambíguo o que +combina com qual -e |para certos arranjos, mas tudo bem.)
Seu programa deve funcionar para N = 0 (para uma grade 1 × 1) até pelo menos N = 8 (para uma grade 256 × 256). Serão dados valores xey que são as coordenadas para O:
- x é o eixo horizontal. x = 1 é a aresta da grade esquerda, x = 2 N é a aresta da grade direita.
- y é o eixo vertical. y = 1 é a borda superior da grade, y = 2 N é a borda inferior da grade.
Ambos x e y estão sempre no intervalo [1, 2 N ].
Portanto, para um dado N, x e y, seu programa deve imprimir uma grade 2 N × 2 N , lado a lado com trominoes em forma de L, exceto pelas coordenadas da grade x, y que serão uma O.
Exemplos
Se N = 0, xey devem ser 1. A saída é simplesmente
O
Se N = 1, x = 1 e y = 2, a saída seria
-+
O|
N = 2, x = 3, y = 2:
+--+
||O|
|+-|
+--+
N = 2, x = 4, y = 1:
+-|O
||+-
|+-|
+--+
N = 3, x = 3, y = 6 (por exemplo, a imagem nesta página ):
+--++--+
|+-||-+|
||+--+||
+-|-+|-+
+--+||-+
||O|-+||
|+-||-+|
+--++--+
Detalhes
- Você pode escrever uma função que use os 3 números inteiros em vez de escrever um programa inteiro. Ele deve imprimir ou retornar a seqüência de grade.
- Pegue a entrada de stdin, linha de comando (ou args de função se você escrever a função).
- A saída pode opcionalmente conter uma única nova linha de treinamento.
- Você não precisa usar o método lado a lado que a prova normalmente sugere. Só importa que a grade seja preenchida com trominos em forma de L além do
O. (Os trombinos não podem ser cortados ou sair dos limites da grade.)
O código mais curto em bytes vence. O desempatador é uma publicação anterior. ( Contador de bytes acessíveis ) .
if p!=i; a lista dentro.join()não precisa[];(1-i%2)pode ser feito como~i%2; você pode usar a descompactação iterável para escrevert,l,a=[],...como*t,l,a=...;if n==0pode ser verificado comoif n<1porquennão pode ser negativo; a final"\n".joinprovavelmente pode ser feita imprimindo cada elemento, pois as regras gerais permitem a impressão no lugar do retorno;if p!=ipode serif p-iporque valores diferentes de zero são Truthy.