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.f
é uma função recursiva. Na verdade, tenho que reverter a formatação de saídasplit()
após cada chamada interna.A,B,C,D=t;return'\n'.join(map("".join,zip(A+C,B+D)))
,t+=[...]
na segunda e última linha pode ser escrita comot+=...,
(adicionando uma tupla ao invés de uma lista) e não tenho certeza se esta funciona, masA if B else C
pode ser escrita comoB and A or C
(também no segunda-última linha), mas somente se a é nunca Falsas (que eu não acho que é)?JavaScript (ES6) 317
414Muito trabalho para o golfe, mas ainda bastante longo.
Execute o snippet para testar (melhor aparência usando caracteres de bloco Unicode - mas ainda um pouco mais)
Mostrar snippet de código
fonte
IDL 8.3+, 293 bytes
Isso é muito longo, estou tentando reduzir, mas ainda não cheguei lá.
Saídas:
E ... só por diversão ...
fonte
Rubi Rev 1, 288
Como um literal lambda anônimo. Mostrado no programa de teste (o literal lambda é
->(n,a,b){...}
)Ruby Rev 0, 330 não destruído
Atualmente, o único golfe que estou reivindicando é a eliminação de comentários, novas linhas e recuos desnecessários.
Este é o meu primeiro algoritmo adequado codificado em Ruby e tem sido um trabalho árduo. Tenho certeza de que pelo menos 50 caracteres podem ser eliminados, mas já fiz o suficiente por enquanto. Existem alguns horrores reais, por exemplo, a entrada. Provavelmente, isso pode ser corrigido por uma função ou lambda em vez de por um programa, mas a função interna
t
que desenha os trominos ainda precisa de acesso às variáveis globais. Vou ter que descobrir a sintaxe para isso.Uma característica da minha resposta que não está presente nas outras é que eu inicializo uma matriz de strings com
|
caracteres. Isso significa que eu só tenho que desenhar o+-
ou-+
, que estão próximos um do outro na mesma linha.fonte
Haskell, 170 bytes
Corra online em Ideone
Exemplo de execução:
fonte