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 O
preencherá 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==0
pode ser verificado comoif n<1
porquen
não pode ser negativo; a final"\n".join
provavelmente pode ser feita imprimindo cada elemento, pois as regras gerais permitem a impressão no lugar do retorno;if p!=i
pode serif p-i
porque valores diferentes de zero são Truthy.