É essencialmente a mesma coisa que esta pergunta, exceto mais difícil. Você deve escrever novamente um programa que vai do canto inferior esquerdo de um retângulo ao canto superior direito. No entanto, desta vez movimentos diagonais são permitidos.
O programa aceitará um par ordenado (width, height)
e os usará como as dimensões de um retângulo. Seu programa criará uma arte ASCII da solução (use .
para um quadrado vazio, #
para parte da solução e X
para iniciar o quadrado) e conte o número de movimentos necessários para alcançar o ponto final.
Exemplo
Entrada: (5, 6)
Resultado:
....#
....#
...#.
..#..
.#...
X....
Move count: 5
Menor resposta em bytes ganha!
Respostas:
MATL , 38 bytes
Experimente online!
Explicação
Seja
m
en
sejam as entradas classificadas, de modo quem
sejam maiores ou iguais an
. O código inicialmente cria uma matrizm
x dan
seguinte maneira:#
. O número dessas entradas menos 1 é a contagem de movimentos.X
..
Se necessário, a matriz agora é transposta para que ela tenha a forma desejada. Observe que a primeira dimensão de uma matriz é sua altura, não largura, portanto corresponde à segunda entrada.
A matriz é então virada de cabeça para baixo, para que
X
apareça na parte inferior da primeira coluna, e suas entradas são usadas como índices na string'.#X'
para produzir a matriz de caracteres 2D desejada.fonte
Pitão,
464544 bytesExperimente aqui.
Explicação:
fonte
JavaScript (ES6), 132
Editar 2 bytes salvos thx @Neil
Teste
fonte
w--,R=
... para omap()
.Javascript (usando biblioteca externa) (235 bytes)
Caramba, isso foi difícil! Bem ... minha biblioteca não era realmente a tarefa certa para esse haha. Mas gostei do desafio
Link para lib: https://github.com/mvegh1/Enumerable
Explicação do código: Crie uma função de 2 variáveis. Armazene x-1 e y-1 em variáveis. Armazene max e min em variáveis. Crie um intervalo vertical decrescente de números de (y-1) para uma contagem de y. Para cada elemento na faixa vertical, escreva uma linha para o elemento atual, de acordo com o predicado complexo. Esse predicado cria um intervalo crescente de números inteiros a partir de 0, para uma contagem de x. Para cada elemento nesse intervalo, concatene em 1 sequência de acordo com um predicado complexo. Esse predicado verifica se na parte inferior esquerda, caso contrário, na diagonal; caso contrário, verifica se estamos na borda X ou Y. Finalmente, tudo isso foi armazenado em uma variável. Então, para obter a contagem de movimentos, basicamente contamos os números. Em seguida, concatene-o para a variável armazenada e retorne o resultado
Isso foi um bocado haha. A captura de tela tem o número de bytes errado porque eu encontrei uma maneira de salvar 4 bytes ao postar isso
EDIT: Vejo que outras respostas não estão colocando "Move count:" em sua saída, mas a minha é. Se isso não é um requisito, isso raspa vários bytes ...
fonte
Python 3,
161156 bytesUma função que recebe a entrada por meio de argumento e imprime a arte ASCII, seguida pela contagem de movimentação, em STDOUT.
Como funciona
O programa primeiro cria uma lista de listas, onde cada lista representa uma linha da grade e cada elemento das listas de componentes
.
. Cada elemento que deveria ser#
possui a propriedade de que, se a grade de saída fosse quadrada, as ordenadas que representam sua localização seriam iguais; portanto, fazer um loop sobre algum índicei
e inserir#
no local(i, i)
daria a saída desejada. No entanto, a grade nem sempre é quadrada e, portanto, os índices são fixados na grade, assumindo o mínimo do índice e a largura / altura (decrescentes devido à indexação zero) conforme necessário. Se o índice for zero, a posição atual deve ser a entrada inferior esquerda e, portanto,X
é inserido. Em seguida, os elementos em cada linha são concatenados e cada linha é impressa em STDOUT. O número de movimentos é o máximo da largura / altura diminuída; isso também é impresso.Experimente no Ideone
fonte