Eu estava navegando no Stackoverflow e vi essa pergunta sobre o mosaico de um retângulo MxN, e achei que seria ótimo para jogar golfe. Aqui está a tarefa.
Dada a dimensão M e N, escreva um programa que mostre quantas maneiras exclusivas um retângulo MxN (N é o número de linhas, não colunas. Não que isso realmente importe) pode ser colocado em mosaico, dadas essas restrições.
- Todas as peças são 2x1 ou 3x1
- Todos os blocos permanecem dentro de sua linha (ou seja, todos são horizontais)
- Entre cada duas linhas adjacentes, os ladrilhos não devem estar alinhados, exceto nas duas extremidades
- M e N têm garantia de pelo menos 1
Por exemplo, um mosaico válido de uma matriz 8x3 seria
2 3 3
| | |
v v v
_______________
|___|_____|_____|
|_____|_____|___|
|___|_____|_____|
Mas o seguinte seria inválido, porque as linhas alinham
2 3 3
| | |
v v v
_______________
|___|_____|_____|
|_____|___|_____|
|_____|_____|___|
Casos de teste:
8x3: 4
3x1: 1
1x1: 0
9x4: 10
Código de golfe, a resposta mais curta ganha.
2x1
ou3x1
? Também é a saída para4x1
zero?|
não contribuísse para o comprimento da linha, usando uma representação como esta (onde, se não houver um pipe (|
), haverá um espaço).Respostas:
Gelatina , 20 bytes
Experimente online!
fonte
JavaScript (ES6),
119 110 106 9691 bytesExperimente online!
Comentado
fonte
R ,
243231 bytesExperimente online!
Versão com quebras de linha:
Observe sem recursão e lida com valores razoavelmente grandes de m e n (por exemplo, 24x20 -> 3.3e19)
Aqui está uma resposta comentada que funciona mais ou menos da mesma forma que a anterior, mas anulei todas as funções para que fique legível:
O método para pegar uma matriz e multiplicá-la repetidamente por si só é de uma pergunta no stackoverflow . Essa abordagem funciona aqui porque calcula efetivamente o número acumulado de ramificações através das diferentes linhas possíveis de tijolos.
Se pacotes externos forem permitidos, posso baixá-lo para 192:
fonte
Geléia , 26 bytes
Experimente online!
Quebrado:
Gere uma lista de paredes possíveis como somas cumulativas com o final removido:
Encontre a mesa externa de todas as paredes possíveis uma contra a outra e sem interseções:
Leve essa matriz à potência de (N-1) e depois resuma tudo:
Usa o primeiro bit da resposta de @ EriktheOutgolfer para gerar a lista de paredes possíveis e, em seguida, usa a abordagem de interseção e exponenciação de matriz da minha resposta R. Como tal, funciona bem mesmo com N. grande. Esta é a minha primeira resposta Jelly, e suspeito que possa jogar mais. Idealmente, também gostaria de alterar a primeira seção para que os requisitos de tempo e memória não sejam escalonados exponencialmente com M.
fonte
05AB1E , 42 bytes
Estou quase com vergonha de postar isso, e ele definitivamente pode ser muito jogado de golfe com uma abordagem diferente, mas, como demorou um pouco para ser concluído, decidi publicá-lo de qualquer maneira e jogá-lo daqui. O desafio parece mais fácil do que é imo, mas definitivamente estou usando uma abordagem errada aqui e tenho a sensação de que 05AB1E poderia fazer cerca de 25 bytes.
Experimente online. NOTA: Além de longo, também é ineficiente, pois o
9x4
caso de teste é executado em cerca de 40 segundos no TIO.Explicação:
fonte
Carvão , 89 bytes
Experimente online! Link é a versão detalhada do código. Funciona para retângulos de tamanho de até 12 no TIO, mas pode ser feito três vezes mais rápido, com um custo de 2 bytes, usando o giro de bits em vez da interseção de lista. Explicação:
Insira a largura.
Comece com uma linha sem tijolos.
Comece com nenhuma linha concluída.
Faça um loop pelas linhas.
Laço sobre os tijolos.
Adicione a largura do tijolo à largura da linha atual.
Se isso resultar na largura da entrada, adicione essa linha à lista de linhas concluídas.
Caso contrário, se ainda for menor que a largura de entrada, adicione a nova linha à lista de linhas, fazendo com que ela seja captada por uma iteração posterior.
Faça uma lista de paredes de uma linha.
Passe um a menos que a altura.
Salve a lista de paredes.
Limpe a lista de paredes.
Passe pela lista salva de paredes.
Passe pelas linhas concluídas.
Se a linha puder ser adicionada a essa parede, adicione-a à lista de paredes.
Saída o comprimento da lista final de paredes.
fonte