Introdução relacionada a crianças
Sempre que levo meus filhos a um parque de diversões, eles ficam mais nervosos quanto mais perto estamos do parque, com o pico nervoso quando estamos no estacionamento e não encontramos lugar para estacionar. Então, decidi que preciso de um método para encontrar o espaço de estacionamento gratuito mais próximo para minimizar o tempo gasto no estacionamento.
Introdução técnica
Imagine uma representação de um estacionamento como este:
*****************
* *
* ··CC··C··CC·· *
* ************* *
* ··CCCCCCCCC·· *
* *
**********E******
Nesta representação, a *
significa uma parede, um ·
espaço de estacionamento gratuito, E
o ponto de entrada e C
um carro já estacionado. Todo espaço em branco é uma posição que o carro a ser estacionado pode usar para se movimentar pelo estacionamento. Agora vamos estender esse conceito para 3D para criar um estacionamento de vários níveis:
1st floor 2nd floor 3rd floor 4th floor
***************** ***************** ***************** *****************
* 1 * 2 * 3 * *
* CCCCCCCCCCCCC * * CCCCCCCCCCCCC * * ····C··CCCCCC * * ······C······ *
* ************* * * ************* * * ************* * * ************* *
* CCCCCCCCCCCCC * * CCCCCCCCCCCCC * * ···CCCCCCCCCC * * ··C·······C·· *
* * * 1 * 2 * 3
**********E****** ***************** ***************** *****************
Os números 1
, 2
e 3
representam as ligações entre os níveis. O 1
do primeiro andar se conecta ao 1
do segundo andar, de modo que um carro entrando na 1
posição no primeiro andar apareça na 1
posição no segundo andar.
Desafio
Fornecendo um esquema de um estacionamento como o mostrado anteriormente, escreva o programa mais curto que calcula a distância até o estacionamento mais próximo, de acordo com o seguinte
Regras
- A entrada será uma matriz de caracteres 3D ou uma matriz de cadeias 2D ou equivalente, e a saída será um número inteiro único representando o número de etapas que o carro deve executar para chegar ao espaço de estacionamento gratuito mais próximo. Se você receber uma matriz de caracteres 3D, o primeiro índice poderá representar o número do andar e o segundo e o terceiro índices a posição (x, y) de cada andar, mas isso depende de você.
- Não haverá mais de 9 rampas, representadas por
[1-9]
. - O carro parte da
E
posição (haverá apenas um ponto de entrada por mapa) e se move usando os espaços em branco em uma das quatro direções de cada vez: para cima, para baixo, esquerda, direita. O carro também pode entrar em·
posições e[1-9]
posições. - Cada mudança de posição (degrau) conta como 1, e toda vez que o carro passa de um andar para outro conta como 3, pois o carro deve subir uma rampa. Nesse caso, o movimento de um espaço em branco ao lado de um
1
para o1
próprio é o que conta como 3 etapas, porque, como resultado desse movimento, o carro aparece na1
posição no outro andar. - O carro não pode ir além dos limites da matriz.
- A contagem terminará quando o carro a ser estacionado estiver na mesma posição que a
·
. Se não houver vagas de estacionamento gratuitas acessíveis, você poderá retornar zero, um número inteiro negativo, um valor nulo ou um erro.
Exemplos
No exemplo acima, o resultado seria 32, pois é mais barato ir para o quarto andar e estacionar no estacionamento mais próximo, perto do 3
. Os lugares de estacionamento gratuitos mais próximos no terceiro andar ficam a 33 e 34.
Outros exemplos:
1st floor 2nd floor 3rd floor 4th floor
***************** ***************** ***************** *****************
* 1 * 2 * 3 * *
* CCCCCCCCCCCCC * * CCCCCCCCCCCCC * * ····C··CCCCCC * * ······C······ *
* ************* * * ************* * * ************* * * ************* *
* CCCCCCCCCCCCC * * ·CCCCCCCCCCCC * * ···CCCCCCCCCC * * ··C·······C·· *
* * * 1 * 2 * 3
**********E****** ***************** ***************** *****************
Answer: 28 (now the parking space in the 2nd floor is closer)
1st floor 2nd floor 3rd floor 4th floor
***************** ***************** ***************** *****************
* 1 4 2 5 3 6 *
* CCCCCCCCCCCCC * * CCCCCCCCCCCCC * * ····C··CCCCCC * * ······C······ *
* ************* * * ************* * * ************* * * ************* *
* CCCCCCCCCCCCC * * CCCCCCCCCCCCC * * ···CCCCCCCCCC * * ··C·······C·· *
4 * 5 1 6 2 * 3
**********E****** ***************** ***************** *****************
Answer: 24 (now it's better to go to ramp 4 and then to ramp 5 to the third floor)
1st floor 2nd floor 3rd floor 4th floor
***************** ***************** ***************** *****************
* 1 * * * 3 * 2
* CCCCCCCCCCCCC * * CCCCCCCCCCCCC * * ····C··CCCCCC * * ······C······ *
* ************* * * ************* * * ************* * * ************* *
* CCCCCCCCCCCCC * * ·CCCCCCCCCCCC * * ···CCCCCCCCCC * * ··C·······C·· *
* * * 3 * 2 * 1
**********E****** ***************** ***************** *****************
Answer: 16 (now the parking space in the 4th floor is closer)
1st floor 2nd floor 3rd floor 4th floor 5th floor
************ ************ ************ ************ ************
*CCCCCCCCC 1 *CCCCCCCCC 2 *CCCCCCCCC 3 *·CCCCCCCC 4 *········C *
* * * * * * * * * *
*CCCCCCCCC E *CCCCCCCCC 1 *CCCCCCCCC 2 *··CCCCCCC 3 *·······CC 4
************ ************ ************ ************ ************
Answer: 29 (both the nearest parking spaces at the 4th and 5th floors are at the same distance)
1st floor 2nd floor 3rd floor
************ ************ ************
*CCCCCCCCC 1 *CCCCCCCCC 2 *CCCCCCCCC *
* * * * * *
*CCCCCCCCC E *CCCCCCCCC 1 *CCCCCCCCC 2
************ ************ ************
Answer: -1 (no free parking space)
1st floor
************
* *
* *
* E*
************
Answer: -1 (no parking space at all)
1st floor
************
* ····· *
*· ****
* ····· * E
*********
Answer: -1 (the parking lot designer was a genius)
Alternativas
- Você pode usar os caracteres que deseja representar no mapa do estacionamento, basta especificar na sua resposta quais são os caracteres escolhidos e o que eles significam.
Isso é código-golfe , portanto, o programa / método / lambda / o mais curto para cada idioma pode ganhar!
Se você precisar de ajuda com o algoritmo, verifique minha implementação (não-gasta) em C # .
fonte
Respostas:
JavaScript (ES6), 199 bytes
Experimente online!
Quão?
A função recursiva g () assume como entrada:
Se f é definido, nós simplesmente copiá-lo para o chão atual F . Caso contrário, precisamos procurar o novo andar e as novas coordenadas iterando sobre cada andar e sobre cada linha até encontrarmos o ponto de entrada c :
Definimos r como a linha atual no piso atual:
A próxima etapa é garantir que a célula atual c em (x, y) esteja definida:
Em caso afirmativo, marcamos como visitado configurando-o para g , um valor que não aciona nenhum dos próximos testes:
Se c é um espaço de estacionamento gratuito, paramos a recursão. E se o número total de jogadas for menor que nossa melhor pontuação anterior, atualizamos m de acordo:
Se chegamos a um novo andar ( f é indefinido ) ou c é um espaço, processamos uma chamada recursiva para cada célula circundante:
Caso contrário, se c for um marcador de rampa (ou seja, um dígito diferente de zero), processamos uma única chamada recursiva para alcançar o novo piso:
Finalmente, restauramos a célula atual ao seu valor inicial para que possa ser visitada novamente em outros caminhos de recursão:
fonte
Kotlin , 768 bytes
período usado. ao invés de ·. Gostaria de entender a resposta de Arnauld, porque perder 500 bytes seria bom.
Experimente online!
fonte
Powershell,
299292 bytesSupõe-se que o mapa seja retângulo .
Ele usa em seu
x
lugar·
. Para obter·
, você precisa salvar o script como ASCII (não UTF-8) e substituíx
-lo·
.Script não testado e de teste:
Resultado:
Saída estendida para estacionamento com 16 etapas:
Explicação
É uma espécie de algoritmo de localização de caminhos de Lee . Apenas uma coisa inteligente: 3 etapas na rampa são realizadas como estados fictícios
H->G->F->E
Powershell para um designer genial de estacionamento,
377369 bytesO design do estacionamento é um
2D string array
. Nenhuma suposição sobre o mapa: quaisquer cordas de comprimento, pisos sem paredes, estacionamento sem um ponto de entrada, rampas de piso múltiplo e de saída múltipla. O custo do gênero é de + 26%.Script não testado e de teste:
fonte